From 88b1e62d1402884bd8d8e9d03ab8c4243a7aacc4 Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Sun, 1 Feb 2026 22:16:44 -0500 Subject: [PATCH 01/70] chore(web-ag-ui): add docker compose for apps --- typescript/clients/web-ag-ui/.dockerignore | 14 + typescript/clients/web-ag-ui/.gitignore | 1 - typescript/clients/web-ag-ui/Dockerfile.app | 36 + typescript/clients/web-ag-ui/compose.yaml | 86 + typescript/clients/web-ag-ui/pnpm-lock.yaml | 21386 ++++++++++++++++++ 5 files changed, 21522 insertions(+), 1 deletion(-) create mode 100644 typescript/clients/web-ag-ui/.dockerignore create mode 100644 typescript/clients/web-ag-ui/Dockerfile.app create mode 100644 typescript/clients/web-ag-ui/compose.yaml create mode 100644 typescript/clients/web-ag-ui/pnpm-lock.yaml diff --git a/typescript/clients/web-ag-ui/.dockerignore b/typescript/clients/web-ag-ui/.dockerignore new file mode 100644 index 00000000..033e780b --- /dev/null +++ b/typescript/clients/web-ag-ui/.dockerignore @@ -0,0 +1,14 @@ +**/.DS_Store +**/.git +**/.gitignore +**/.next +**/.turbo +**/dist +**/dist-test +**/node_modules +**/coverage +**/.env +**/.env.* +**/*.log +**/tmp +!apps/**/.env diff --git a/typescript/clients/web-ag-ui/.gitignore b/typescript/clients/web-ag-ui/.gitignore index 068236a3..daa690d0 100644 --- a/typescript/clients/web-ag-ui/.gitignore +++ b/typescript/clients/web-ag-ui/.gitignore @@ -47,6 +47,5 @@ next-env.d.ts # lock files package-lock.json -pnpm-lock.yaml yarn.lock bun.lockb diff --git a/typescript/clients/web-ag-ui/Dockerfile.app b/typescript/clients/web-ag-ui/Dockerfile.app new file mode 100644 index 00000000..8c00c7b2 --- /dev/null +++ b/typescript/clients/web-ag-ui/Dockerfile.app @@ -0,0 +1,36 @@ +# syntax=docker/dockerfile:1.7 +FROM node:22 + +# NOTE: We intentionally avoid `apt-get` here. +# Some environments intermittently fail `apt-get update` (GPG signature / TLS trust issues), +# which makes `docker build --no-cache` unreliable. `node:22` is based on `buildpack-deps`, +# which already includes common build tooling needed for native Node deps. + +WORKDIR /app + +# Enable PNPM via Corepack (Node 22) +ENV PNPM_HOME="/pnpm" +ENV PATH="$PNPM_HOME:$PATH" +ENV PNPM_STORE_DIR="/pnpm/store" +RUN corepack enable && corepack prepare pnpm@10.7.0 --activate + +COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ +COPY patches ./patches +COPY apps ./apps + +RUN --mount=type=cache,id=pnpm-store,target=/pnpm/store pnpm install --frozen-lockfile + +ARG APP_NAME +ENV APP_NAME="${APP_NAME}" +ARG APP_ENV_FILE +RUN if [ -z "${APP_ENV_FILE}" ]; then APP_ENV_FILE="apps/${APP_NAME}/.env"; fi; \ + if [ -f "${APP_ENV_FILE}" ]; then \ + if [ "${APP_NAME}" = "web" ]; then \ + cp "${APP_ENV_FILE}" "/app/apps/${APP_NAME}/.env.local"; \ + elif [ "${APP_ENV_FILE}" != "apps/${APP_NAME}/.env" ]; then \ + cp "${APP_ENV_FILE}" "/app/apps/${APP_NAME}/.env"; \ + fi; \ + fi +RUN pnpm --filter "${APP_NAME}" build + +CMD ["sh", "-lc", "pnpm --filter \"$APP_NAME\" start"] diff --git a/typescript/clients/web-ag-ui/compose.yaml b/typescript/clients/web-ag-ui/compose.yaml new file mode 100644 index 00000000..3ef1b262 --- /dev/null +++ b/typescript/clients/web-ag-ui/compose.yaml @@ -0,0 +1,86 @@ +services: + web: + build: + context: . + dockerfile: Dockerfile.app + args: + APP_NAME: web + APP_ENV_FILE: apps/web/.env + environment: + NODE_ENV: production + LANGGRAPH_DEPLOYMENT_URL: http://agent-clmm:8124 + LANGGRAPH_PENDLE_DEPLOYMENT_URL: http://agent-pendle:8125 + LANGGRAPH_GMX_ALLORA_DEPLOYMENT_URL: http://agent-gmx-allora:8126 + env_file: + - apps/web/.env + ports: + - "3000:3000" + restart: unless-stopped + + agent: + build: + context: . + dockerfile: Dockerfile.app + args: + APP_NAME: agent + APP_ENV_FILE: apps/agent/.env + environment: + NODE_ENV: production + AGENT_CONFIG_DIR: /app/apps/agent/config + env_file: + - apps/agent/.env + ports: + - "8123:8123" + command: ["sh", "-lc", "npx @langchain/langgraph-cli dev --host 0.0.0.0 --port 8123 --no-browser -c /app/apps/agent"] + restart: unless-stopped + + agent-clmm: + build: + context: . + dockerfile: Dockerfile.app + args: + APP_NAME: agent-clmm + APP_ENV_FILE: apps/agent-clmm/.env + environment: + NODE_ENV: production + AGENT_CONFIG_DIR: /app/apps/agent-clmm/config + env_file: + - apps/agent-clmm/.env + ports: + - "8124:8124" + command: ["sh", "-lc", "npx @langchain/langgraph-cli dev --host 0.0.0.0 --port 8124 --no-browser -c /app/apps/agent-clmm"] + restart: unless-stopped + + agent-pendle: + build: + context: . + dockerfile: Dockerfile.app + args: + APP_NAME: agent-pendle + APP_ENV_FILE: apps/agent-pendle/.env + environment: + NODE_ENV: production + AGENT_CONFIG_DIR: /app/apps/agent-pendle/config + env_file: + - apps/agent-pendle/.env + ports: + - "8125:8125" + command: ["sh", "-lc", "npx @langchain/langgraph-cli dev --host 0.0.0.0 --port 8125 --no-browser -c /app/apps/agent-pendle"] + restart: unless-stopped + + agent-gmx-allora: + build: + context: . + dockerfile: Dockerfile.app + args: + APP_NAME: agent-gmx-allora + APP_ENV_FILE: apps/agent-gmx-allora/.env + environment: + NODE_ENV: production + AGENT_CONFIG_DIR: /app/apps/agent-gmx-allora/config + env_file: + - apps/agent-gmx-allora/.env + ports: + - "8126:8126" + command: ["sh", "-lc", "npx @langchain/langgraph-cli dev --host 0.0.0.0 --port 8126 --no-browser -c /app/apps/agent-gmx-allora"] + restart: unless-stopped diff --git a/typescript/clients/web-ag-ui/pnpm-lock.yaml b/typescript/clients/web-ag-ui/pnpm-lock.yaml new file mode 100644 index 00000000..e4fe6c39 --- /dev/null +++ b/typescript/clients/web-ag-ui/pnpm-lock.yaml @@ -0,0 +1,21386 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +catalogs: + default: + prettier: + specifier: ^3.6.2 + version: 3.8.1 + tsx: + specifier: ^4.20.6 + version: 4.21.0 + viem: + specifier: ^2.26.3 + version: 2.45.1 + +patchedDependencies: + '@ag-ui/client@0.0.42': + hash: g3vb6i4qg2banxpgna3ko3w63m + path: patches/@ag-ui__client@0.0.42.patch + '@ag-ui/langgraph@0.0.20': + hash: c2o2k2psro7eonr2y3bgst37qm + path: patches/@ag-ui__langgraph@0.0.20.patch + '@copilotkit/react-core@1.50.1': + hash: 2ttosfnlnojrtz6fvhfhzzzvly + path: patches/@copilotkit__react-core@1.50.1.patch + '@copilotkit/runtime@1.50.1': + hash: r2cedgs25yliqjcfppzh7jma7e + path: patches/@copilotkit__runtime@1.50.1.patch + '@copilotkitnext/core@0.0.33': + hash: xuedn7hxakcsv22g6465qile5e + path: patches/@copilotkitnext__core@0.0.33.patch + '@copilotkitnext/runtime@0.0.33': + hash: dakc4qoohdmctvusr4pufvrn3e + path: patches/@copilotkitnext__runtime@0.0.33.patch + +importers: + + .: + devDependencies: + '@langchain/langgraph-cli': + specifier: ^1.0.4 + version: 1.1.11(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(@langchain/langgraph-checkpoint@1.0.0(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))))(@langchain/langgraph-sdk@1.0.3(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@langchain/langgraph@1.0.2(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6))(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(typescript@5.9.3) + eslint: + specifier: ^9.39.1 + version: 9.39.2(jiti@2.6.1) + eslint-config-next: + specifier: ^16.0.8 + version: 16.0.8(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + turbo: + specifier: ^2.3.3 + version: 2.8.1 + + apps/agent: + dependencies: + '@copilotkit/sdk-js': + specifier: 1.50.1 + version: 1.50.1(@langchain/community@0.0.53(lodash@4.17.23)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(@langchain/langgraph@1.0.2(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6))(langchain@0.3.37(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(axios@1.13.4)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(typescript@5.9.3)(zod@4.3.6) + '@copilotkit/shared': + specifier: 1.50.1 + version: 1.50.1 + '@emberai/agent-node': + specifier: ^1.0.0 + version: 1.2.0(@bufbuild/protobuf@2.11.0)(@cfworker/json-schema@4.1.1)(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(hono@4.11.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@langchain/core': + specifier: ^1.0.1 + version: 1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + '@langchain/langgraph': + specifier: 1.0.2 + version: 1.0.2(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6) + '@langchain/langgraph-api': + specifier: 1.1.11 + version: 1.1.11(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(@langchain/langgraph-checkpoint@1.0.0(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))))(@langchain/langgraph-sdk@1.0.3(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@langchain/langgraph@1.0.2(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6))(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(typescript@5.9.3) + '@langchain/langgraph-checkpoint': + specifier: 1.0.0 + version: 1.0.0(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))) + '@langchain/openai': + specifier: ^1.1.3 + version: 1.2.4(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@metamask/delegation-toolkit': + specifier: ^0.13.0 + version: 0.13.0(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6)) + node-cron: + specifier: ^4.2.1 + version: 4.2.1 + permissionless: + specifier: ^0.2.57 + version: 0.2.57(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6)) + uuid: + specifier: ^13.0.0 + version: 13.0.0 + viem: + specifier: 'catalog:' + version: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6) + zod: + specifier: ^4.3.5 + version: 4.3.6 + devDependencies: + '@eslint/js': + specifier: ^9.39.2 + version: 9.39.2 + '@types/html-to-text': + specifier: ^9.0.4 + version: 9.0.4 + '@types/node': + specifier: ^22.19.2 + version: 22.19.7 + '@typescript-eslint/eslint-plugin': + specifier: ^8.46.4 + version: 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': + specifier: ^8.46.4 + version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@vitest/coverage-v8': + specifier: ^4.0.8 + version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + eslint: + specifier: ^9.39.1 + version: 9.39.2(jiti@2.6.1) + eslint-config-prettier: + specifier: ^10.1.8 + version: 10.1.8(eslint@9.39.2(jiti@2.6.1)) + eslint-import-resolver-typescript: + specifier: ^4.4.4 + version: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-import: + specifier: 2.32.0 + version: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.2(jiti@2.6.1)) + prettier: + specifier: 'catalog:' + version: 3.8.1 + tsx: + specifier: 'catalog:' + version: 4.21.0 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + typescript-eslint: + specifier: ^8.51.0 + version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + vitest: + specifier: ^4.0.8 + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + + apps/agent-clmm: + dependencies: + '@copilotkit/sdk-js': + specifier: 1.50.1 + version: 1.50.1(@langchain/community@0.0.53(lodash@4.17.23)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(@langchain/langgraph@1.0.2(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6))(langchain@0.3.37(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(axios@1.13.4)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(typescript@5.9.3)(zod@4.3.6) + '@copilotkit/shared': + specifier: ^1.50.1 + version: 1.50.1 + '@emberai/agent-node': + specifier: ^1.0.0 + version: 1.2.0(@bufbuild/protobuf@2.11.0)(@cfworker/json-schema@4.1.1)(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(hono@4.11.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@langchain/core': + specifier: ^1.0.1 + version: 1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + '@langchain/langgraph': + specifier: 1.0.2 + version: 1.0.2(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6) + '@langchain/langgraph-api': + specifier: 1.1.11 + version: 1.1.11(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(@langchain/langgraph-checkpoint@1.0.0(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))))(@langchain/langgraph-sdk@1.0.3(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@langchain/langgraph@1.0.2(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6))(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(typescript@5.9.3) + '@langchain/langgraph-checkpoint': + specifier: 1.0.0 + version: 1.0.0(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))) + '@langchain/openai': + specifier: ^1.1.3 + version: 1.2.4(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@metamask/delegation-toolkit': + specifier: ^0.13.0 + version: 0.13.0(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6)) + node-cron: + specifier: ^4.2.1 + version: 4.2.1 + p-retry: + specifier: ^7.1.1 + version: 7.1.1 + permissionless: + specifier: ^0.2.57 + version: 0.2.57(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6)) + uuid: + specifier: ^13.0.0 + version: 13.0.0 + viem: + specifier: ^2.26.3 + version: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6) + zod: + specifier: ^4.3.5 + version: 4.3.6 + devDependencies: + '@eslint/js': + specifier: ^9.39.2 + version: 9.39.2 + '@types/html-to-text': + specifier: ^9.0.4 + version: 9.0.4 + '@types/node': + specifier: ^22.19.1 + version: 22.19.7 + '@typescript-eslint/eslint-plugin': + specifier: ^8.46.4 + version: 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': + specifier: ^8.46.4 + version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@vitest/coverage-v8': + specifier: ^4.0.8 + version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + eslint: + specifier: ^9.39.1 + version: 9.39.2(jiti@2.6.1) + eslint-config-prettier: + specifier: ^10.1.8 + version: 10.1.8(eslint@9.39.2(jiti@2.6.1)) + eslint-import-resolver-typescript: + specifier: ^4.4.4 + version: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-import: + specifier: 2.32.0 + version: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.2(jiti@2.6.1)) + prettier: + specifier: ^3.6.2 + version: 3.8.1 + tsx: + specifier: ^4.20.6 + version: 4.21.0 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + typescript-eslint: + specifier: ^8.51.0 + version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + vitest: + specifier: ^4.0.8 + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + + apps/agent-gmx-allora: + dependencies: + '@copilotkit/sdk-js': + specifier: 1.50.1 + version: 1.50.1(@langchain/community@0.0.53(lodash@4.17.23)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(@langchain/langgraph@1.0.2(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6))(langchain@0.3.37(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(axios@1.13.4)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(typescript@5.9.3)(zod@4.3.6) + '@copilotkit/shared': + specifier: 1.50.1 + version: 1.50.1 + '@emberai/agent-node': + specifier: ^1.0.0 + version: 1.2.0(@bufbuild/protobuf@2.11.0)(@cfworker/json-schema@4.1.1)(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(hono@4.11.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@langchain/core': + specifier: ^1.0.1 + version: 1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + '@langchain/langgraph': + specifier: 1.0.2 + version: 1.0.2(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6) + '@langchain/langgraph-api': + specifier: 1.1.11 + version: 1.1.11(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(@langchain/langgraph-checkpoint@1.0.0(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))))(@langchain/langgraph-sdk@1.0.3(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@langchain/langgraph@1.0.2(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6))(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(typescript@5.9.3) + '@langchain/langgraph-checkpoint': + specifier: 1.0.0 + version: 1.0.0(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))) + '@langchain/openai': + specifier: ^1.1.3 + version: 1.2.4(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@metamask/delegation-toolkit': + specifier: ^0.13.0 + version: 0.13.0(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6)) + node-cron: + specifier: ^4.2.1 + version: 4.2.1 + permissionless: + specifier: ^0.2.57 + version: 0.2.57(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6)) + uuid: + specifier: ^13.0.0 + version: 13.0.0 + viem: + specifier: 'catalog:' + version: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6) + zod: + specifier: ^4.3.5 + version: 4.3.6 + devDependencies: + '@eslint/js': + specifier: ^9.39.2 + version: 9.39.2 + '@types/html-to-text': + specifier: ^9.0.4 + version: 9.0.4 + '@types/node': + specifier: ^22.19.2 + version: 22.19.7 + '@typescript-eslint/eslint-plugin': + specifier: ^8.46.4 + version: 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': + specifier: ^8.46.4 + version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@vitest/coverage-v8': + specifier: ^4.0.8 + version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + eslint: + specifier: ^9.39.1 + version: 9.39.2(jiti@2.6.1) + eslint-config-prettier: + specifier: ^10.1.8 + version: 10.1.8(eslint@9.39.2(jiti@2.6.1)) + eslint-import-resolver-typescript: + specifier: ^4.4.4 + version: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-import: + specifier: 2.32.0 + version: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.2(jiti@2.6.1)) + prettier: + specifier: 'catalog:' + version: 3.8.1 + tsx: + specifier: 'catalog:' + version: 4.21.0 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + typescript-eslint: + specifier: ^8.51.0 + version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + vitest: + specifier: ^4.0.8 + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + + apps/agent-pendle: + dependencies: + '@copilotkit/sdk-js': + specifier: 1.50.1 + version: 1.50.1(@langchain/community@0.0.53(lodash@4.17.23)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(@langchain/langgraph@1.0.2(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6))(langchain@0.3.37(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(axios@1.13.4)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(typescript@5.9.3)(zod@4.3.6) + '@copilotkit/shared': + specifier: 1.50.1 + version: 1.50.1 + '@emberai/agent-node': + specifier: ^1.0.0 + version: 1.2.0(@bufbuild/protobuf@2.11.0)(@cfworker/json-schema@4.1.1)(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(hono@4.11.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@langchain/core': + specifier: ^1.0.1 + version: 1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + '@langchain/langgraph': + specifier: 1.0.2 + version: 1.0.2(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6) + '@langchain/langgraph-api': + specifier: 1.1.11 + version: 1.1.11(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(@langchain/langgraph-checkpoint@1.0.0(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))))(@langchain/langgraph-sdk@1.0.3(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@langchain/langgraph@1.0.2(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6))(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(typescript@5.9.3) + '@langchain/langgraph-checkpoint': + specifier: 1.0.0 + version: 1.0.0(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))) + '@langchain/openai': + specifier: ^1.1.3 + version: 1.2.4(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@metamask/delegation-toolkit': + specifier: ^0.13.0 + version: 0.13.0(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6)) + node-cron: + specifier: ^4.2.1 + version: 4.2.1 + permissionless: + specifier: ^0.2.57 + version: 0.2.57(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6)) + uuid: + specifier: ^13.0.0 + version: 13.0.0 + viem: + specifier: 'catalog:' + version: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6) + zod: + specifier: ^4.3.5 + version: 4.3.6 + devDependencies: + '@eslint/js': + specifier: ^9.39.2 + version: 9.39.2 + '@types/html-to-text': + specifier: ^9.0.4 + version: 9.0.4 + '@types/node': + specifier: ^22.19.2 + version: 22.19.7 + '@typescript-eslint/eslint-plugin': + specifier: ^8.46.4 + version: 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': + specifier: ^8.46.4 + version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@vitest/coverage-v8': + specifier: ^4.0.8 + version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + eslint: + specifier: ^9.39.1 + version: 9.39.2(jiti@2.6.1) + eslint-config-prettier: + specifier: ^10.1.8 + version: 10.1.8(eslint@9.39.2(jiti@2.6.1)) + eslint-import-resolver-typescript: + specifier: ^4.4.4 + version: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-import: + specifier: 2.32.0 + version: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.2(jiti@2.6.1)) + prettier: + specifier: 'catalog:' + version: 3.8.1 + tsx: + specifier: 'catalog:' + version: 4.21.0 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + typescript-eslint: + specifier: ^8.51.0 + version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + vitest: + specifier: ^4.0.8 + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + + apps/web: + dependencies: + '@copilotkit/react-core': + specifier: 1.50.1 + version: 1.50.1(patch_hash=2ttosfnlnojrtz6fvhfhzzzvly)(@types/mdast@4.0.4)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(graphql@16.12.0)(micromark-util-types@2.0.2)(micromark@4.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76) + '@copilotkit/react-ui': + specifier: 1.50.1 + version: 1.50.1(@types/mdast@4.0.4)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(graphql@16.12.0)(micromark-util-types@2.0.2)(micromark@4.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76) + '@copilotkit/runtime': + specifier: 1.50.1 + version: 1.50.1(patch_hash=r2cedgs25yliqjcfppzh7jma7e)(sldyf2ylqp4vhyz6u46tcwxeri) + '@copilotkit/shared': + specifier: 1.50.1 + version: 1.50.1 + '@metamask/delegation-toolkit': + specifier: ^0.13.0 + version: 0.13.0(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@privy-io/react-auth': + specifier: ^3.9.0 + version: 3.13.0(@solana-program/system@0.10.0(@solana/kit@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)))(@solana-program/token@0.9.0(@solana/kit@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)))(@solana/kit@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10))(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(permissionless@0.2.57(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) + '@tanstack/react-query': + specifier: ^5.90.12 + version: 5.90.20(react@19.2.4) + lucide-react: + specifier: ^0.561.0 + version: 0.561.0(react@19.2.4) + next: + specifier: 16.0.8 + version: 16.0.8(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: + specifier: ^19.2.1 + version: 19.2.4 + react-dom: + specifier: ^19.2.1 + version: 19.2.4(react@19.2.4) + shiki: + specifier: ^3.21.0 + version: 3.22.0 + uuid: + specifier: ^13.0.0 + version: 13.0.0 + viem: + specifier: 'catalog:' + version: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zod: + specifier: ^3.24.4 + version: 3.25.76 + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.3 + '@tailwindcss/postcss': + specifier: ^4 + version: 4.1.18 + '@types/node': + specifier: ^20 + version: 20.19.30 + '@types/react': + specifier: ^19 + version: 19.2.10 + '@types/react-dom': + specifier: ^19 + version: 19.2.3(@types/react@19.2.10) + eslint: + specifier: ^9 + version: 9.39.2(jiti@2.6.1) + eslint-config-next: + specifier: 16.0.8 + version: 16.0.8(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + tailwindcss: + specifier: ^4 + version: 4.1.18 + typescript: + specifier: ^5 + version: 5.9.3 + +packages: + + '@0no-co/graphql.web@1.2.0': + resolution: {integrity: sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + graphql: + optional: true + + '@a2a-js/sdk@0.3.9': + resolution: {integrity: sha512-GWOSjL/dbkNRETfmLIKqtVV/fm+chPPp0uL5DUDKJlFmVjPCxRS75I6oiIkJeGo3/AM7QjaZTMb003Ia09ibtQ==} + engines: {node: '>=18'} + peerDependencies: + '@bufbuild/protobuf': ^2.10.2 + '@grpc/grpc-js': ^1.11.0 + express: ^4.21.2 || ^5.1.0 + peerDependenciesMeta: + '@bufbuild/protobuf': + optional: true + '@grpc/grpc-js': + optional: true + express: + optional: true + + '@adraffy/ens-normalize@1.11.1': + resolution: {integrity: sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==} + + '@ag-ui/client@0.0.42': + resolution: {integrity: sha512-zAbP+sZJImR5bUpR2ni7RtuuNZMuesaxviynyIgzKlr1k2VCM49mFpbDUKU4TH4Cneu+Xe7OEnO8qCOCIzBAww==} + + '@ag-ui/core@0.0.42': + resolution: {integrity: sha512-C2hMg4Gs5oiUDgK9cA2RsTwSSmFZdIsqPklDrFw/Ue+quH6EU3vKp5YoOq7nuaQYO4pO8Em+Z+l5/M5PpcvP1g==} + + '@ag-ui/encoder@0.0.42': + resolution: {integrity: sha512-97B5MMCSs82t/y41uk2NrLBYFhbvn4kYsKQHMCfy8tjSWubyxh3zP7N9yHo8zJeSPe3WvzTvclyXNiGxSOsorg==} + + '@ag-ui/langgraph@0.0.20': + resolution: {integrity: sha512-MQ35S8IUt5xwhA+NdinVJxBq3AHgpaeDrS92undC9Y3UX09HOUUojZcG46WGgZrxxqdFZNaZcupS4Opuf02DsA==} + peerDependencies: + '@ag-ui/client': '>=0.0.42' + '@ag-ui/core': '>=0.0.42' + + '@ag-ui/proto@0.0.42': + resolution: {integrity: sha512-NDUwSgMnGEqxZGkWIJ1ge5t3Q7Kiddj360x2JAWaIfv9w+7tDJ0pmgyzf3/SXp605aY2wZiDLBtJ6jKZeg1lFg==} + + '@ai-sdk/anthropic@2.0.58': + resolution: {integrity: sha512-CkNW5L1Arv8gPtPlEmKd+yf/SG9ucJf0XQdpMG8OiYEtEMc2smuCA+tyCp8zI7IBVg/FE7nUfFHntQFaOjRwJQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/gateway@2.0.30': + resolution: {integrity: sha512-5Nrkj8B4MzkkOfjjA+Cs5pamkbkK4lI11bx80QV7TFcen/hWA8wEC+UVzwuM5H2zpekoNMjvl6GonHnR62XIZw==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/google@2.0.52': + resolution: {integrity: sha512-2XUnGi3f7TV4ujoAhA+Fg3idUoG/+Y2xjCRg70a1/m0DH1KSQqYaCboJ1C19y6ZHGdf5KNT20eJdswP6TvrY2g==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/mcp@0.0.8': + resolution: {integrity: sha512-9y9GuGcZ9/+pMIHfpOCJgZVp+AZMv6TkjX2NVT17SQZvTF2N8LXuCXyoUPyi1PxIxzxl0n463LxxaB2O6olC+Q==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/openai-compatible@1.0.32': + resolution: {integrity: sha512-YspqqyJPzHjqWrjt4y/Wgc2aJgCcQj5uIJgZpq2Ar/lH30cEVhgE+keePDbjKpetD9UwNggCj7u6kO3unS23OQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/openai@2.0.89': + resolution: {integrity: sha512-4+qWkBCbL9HPKbgrUO/F2uXZ8GqrYxHa8SWEYIzxEJ9zvWw3ISr3t1/27O1i8MGSym+PzEyHBT48EV4LAwWaEw==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider-utils@2.2.8': + resolution: {integrity: sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.23.8 + + '@ai-sdk/provider-utils@3.0.17': + resolution: {integrity: sha512-TR3Gs4I3Tym4Ll+EPdzRdvo/rc8Js6c4nVhFLuvGLX/Y4V9ZcQMa/HTiYsHEgmYrf1zVi6Q145UEZUfleOwOjw==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider-utils@3.0.20': + resolution: {integrity: sha512-iXHVe0apM2zUEzauqJwqmpC37A5rihrStAih5Ks+JE32iTe4LZ58y17UGBjpQQTCRw9YxMeo2UFLxLpBluyvLQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider@1.1.3': + resolution: {integrity: sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==} + engines: {node: '>=18'} + + '@ai-sdk/provider@2.0.0': + resolution: {integrity: sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==} + engines: {node: '>=18'} + + '@ai-sdk/provider@2.0.1': + resolution: {integrity: sha512-KCUwswvsC5VsW2PWFqF8eJgSCu5Ysj7m1TxiHTVA6g7k360bk0RNQENT8KTMAYEs+8fWPD3Uu4dEmzGHc+jGng==} + engines: {node: '>=18'} + + '@ai-sdk/react@1.2.12': + resolution: {integrity: sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.23.8 + peerDependenciesMeta: + zod: + optional: true + + '@ai-sdk/ui-utils@1.2.11': + resolution: {integrity: sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.23.8 + + '@ai-sdk/xai@2.0.56': + resolution: {integrity: sha512-FGlqwWc3tAYqDHE8r8hQGQLcMiPUwgz90oU2QygUH930OWtCLapFkSu114DgVaIN/qoM1DUX+inv0Ee74Fgp5g==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.0': + resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.0': + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.0': + resolution: {integrity: sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.6': + resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.0': + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@base-org/account@1.1.1': + resolution: {integrity: sha512-IfVJPrDPhHfqXRDb89472hXkpvJuQQR7FDI9isLPHEqSYt/45whIoBxSPgZ0ssTt379VhQo4+87PWI1DoLSfAQ==} + + '@base-org/account@2.4.0': + resolution: {integrity: sha512-A4Umpi8B9/pqR78D1Yoze4xHyQaujioVRqqO3d6xuDFw9VRtjg6tK3bPlwE0aW+nVH/ntllCpPa2PbI8Rnjcug==} + + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} + + '@braintree/sanitize-url@7.1.2': + resolution: {integrity: sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==} + + '@bufbuild/protobuf@2.11.0': + resolution: {integrity: sha512-sBXGT13cpmPR5BMgHE6UEEfEaShh5Ror6rfN3yEK5si7QVrtZg8LEPQb0VVhiLRUslD2yLnXtnRzG035J/mZXQ==} + + '@cfworker/json-schema@4.1.1': + resolution: {integrity: sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==} + + '@chevrotain/cst-dts-gen@11.0.3': + resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==} + + '@chevrotain/gast@11.0.3': + resolution: {integrity: sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==} + + '@chevrotain/regexp-to-ast@11.0.3': + resolution: {integrity: sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==} + + '@chevrotain/types@11.0.3': + resolution: {integrity: sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==} + + '@chevrotain/utils@11.0.3': + resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} + + '@clack/core@0.4.1': + resolution: {integrity: sha512-Pxhij4UXg8KSr7rPek6Zowm+5M22rbd2g1nfojHJkxp5YkFqiZ2+YLEM/XGVIzvGOcM0nqjIFxrpDwWRZYWYjA==} + + '@clack/prompts@0.9.1': + resolution: {integrity: sha512-JIpyaboYZeWYlyP0H+OoPPxd6nqueG/CmN6ixBiNFsIDHREevjIf0n0Ohh5gr5C8pEDknzgvz+pIJ8dMhzWIeg==} + + '@coinbase/cdp-sdk@1.44.0': + resolution: {integrity: sha512-0I5O1DzbchR91GAYQAU8lxx6q9DBvN0no9IBwrTKLHW8t5bABMg8dzQ/jrGRd6lr/QFJJW4L0ZSLGae5jsxGWw==} + + '@coinbase/wallet-sdk@3.9.3': + resolution: {integrity: sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw==} + + '@coinbase/wallet-sdk@4.3.2': + resolution: {integrity: sha512-hOLA2YONq8Z9n8f6oVP6N//FEEHOen7nq+adG/cReol6juFTHUelVN5GnA5zTIxiLFMDcrhDwwgCA6Tdb5jubw==} + + '@coinbase/wallet-sdk@4.3.6': + resolution: {integrity: sha512-4q8BNG1ViL4mSAAvPAtpwlOs1gpC+67eQtgIwNvT3xyeyFFd+guwkc8bcX5rTmQhXpqnhzC4f0obACbP9CqMSA==} + + '@colors/colors@1.6.0': + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + + '@commander-js/extra-typings@13.1.0': + resolution: {integrity: sha512-q5P52BYb1hwVWE6dtID7VvuJWrlfbCv4klj7BjUUOqMz4jbSZD4C9fJ9lRjL2jnBGTg+gDDlaXN51rkWcLk4fg==} + peerDependencies: + commander: ~13.1.0 + + '@copilotkit/react-core@1.50.1': + resolution: {integrity: sha512-L7WdesE1PAP+Ks5kY0NXT+/sZfmx/Vj5t7l4eMQzzLDSvwgLDqvrQCZLJq/PtSLKidrX+z8zDyLJad7YR3L6dQ==} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + react-dom: ^18 || ^19 || ^19.0.0-rc + zod: '>=3.0.0' + + '@copilotkit/react-ui@1.50.1': + resolution: {integrity: sha512-JO6Nf3GTqFWjB3WR0ClSgnf8284QUJxVh/djcUOUZ24NkjglZAYORAMzvwIBJlcOZFxMk1AkvRAU56HWNCUZ5Q==} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + + '@copilotkit/runtime-client-gql@1.50.1': + resolution: {integrity: sha512-J8TXi2wq4xqoZAPECht4AbD8kxrjn38LEulgCAXXCUm6wsT8Uyt8WVnFT6bODIYee5K4MsXTrITTeH/Y7jviMw==} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + + '@copilotkit/runtime@1.50.1': + resolution: {integrity: sha512-woIMkLzR4poGj0D+AyL6eFFCKQ5RExK+kcztVZGD1yNqQ27ZWkbI8QuL0HmuCoJuDCxplXwIU03MEdksXzNGZg==} + peerDependencies: + '@anthropic-ai/sdk': ^0.57.0 + '@langchain/aws': '>=0.1.9' + '@langchain/community': '>=0.3.58' + '@langchain/core': '>=0.3.66' + '@langchain/google-gauth': '>=0.1.0' + '@langchain/langgraph-sdk': '>=0.1.2' + '@langchain/openai': '>=0.4.2' + groq-sdk: '>=0.3.0 <1.0.0' + langchain: '>=0.3.3' + openai: ^4.85.1 + peerDependenciesMeta: + '@anthropic-ai/sdk': + optional: true + '@langchain/aws': + optional: true + '@langchain/community': + optional: true + '@langchain/google-gauth': + optional: true + '@langchain/langgraph-sdk': + optional: true + '@langchain/openai': + optional: true + groq-sdk: + optional: true + langchain: + optional: true + openai: + optional: true + + '@copilotkit/sdk-js@1.50.1': + resolution: {integrity: sha512-sFPWN4c4FczXzgzpP8A54BHOSkDOfi2cBzoTx/cjGLI9NzJkTioXxzpcR/evhQ/Qezs32Kd0jUou3Kj3RQONMw==} + peerDependencies: + '@langchain/community': ^0.0.53 + '@langchain/core': '>=0.4.0 <2.0.0' + '@langchain/langgraph': '>=0.4.0 <2.0.0' + langchain: ^0.3.3 + typescript: ^5.2.3 + zod: ^3.23.3 || ^3.24.0 || ^3.25.0 + + '@copilotkit/shared@1.50.1': + resolution: {integrity: sha512-Nk4saaXxVRq3VCTXfmE5hi46hmNkHZGCtb8H38LjZEFDR6lv0b2cnOWEhfkGzSjUwfY+XcZmwrGef7mMl/XI/w==} + + '@copilotkitnext/agent@0.0.33': + resolution: {integrity: sha512-Q9J/GnG6HtLT2RP9aCHl8u3Nzv7/AKrbo+3cO4jv25VwFtlIGiSBEDS+g1Pru+vev0hSo/moEsswZTBkoN3WwA==} + engines: {node: '>=18'} + + '@copilotkitnext/core@0.0.33': + resolution: {integrity: sha512-uD+hYatV9JeDS0BMVL1YyFuFiISYjTKfYk4Mfc9Zmb7DfN2RD9ASvpWG/zQ2WJrrdQtj/pCfjPKil07Pv7cRMg==} + engines: {node: '>=18'} + + '@copilotkitnext/react@0.0.33': + resolution: {integrity: sha512-7opH+B9SLmN6fv8b5w0OCdk3xIQmNjhPM6lcgU5kWlqCSbAwCe4HPxyT5Xhc6KzvX1zj/+ec2yQkh09A9BlsWQ==} + engines: {node: '>=18'} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@copilotkitnext/runtime@0.0.33': + resolution: {integrity: sha512-DVkaM+/ZyuVqCU86JdalLq8hQrymoOt4GfSMKLpyBLcLh3OIX9N8fU/u4ENJ85W+xgYQauFsbeGx/mjZaeSa0w==} + engines: {node: '>=18'} + peerDependencies: + openai: ^5.9.0 + + '@copilotkitnext/shared@0.0.33': + resolution: {integrity: sha512-tcWCk0izP+rr6eLKXP+z3j6A8+VcA09uGwgy+TS1yRd6eRdvR5SISqAOOQM8t4WBXGg0z+QWbJNXiVq6cPtukQ==} + engines: {node: '>=18'} + + '@copilotkitnext/web-inspector@0.0.33': + resolution: {integrity: sha512-6XkkigbkhSkcFrzWEqiW6P98y9rCv4+Q/YGlvS9KNfeYOoyt1Z9Ug1VVy7BC6qIhytbrraJizo24g8v3nCWVqQ==} + engines: {node: '>=18'} + + '@dabh/diagnostics@2.0.8': + resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==} + + '@ecies/ciphers@0.2.5': + resolution: {integrity: sha512-GalEZH4JgOMHYYcYmVqnFirFsjZHeoGMDt9IxEnM9F7GRUUyUksJ7Ou53L83WHJq3RWKD3AcBpo0iQh0oMpf8A==} + engines: {bun: '>=1', deno: '>=2', node: '>=16'} + peerDependencies: + '@noble/ciphers': ^1.0.0 + + '@emberai/agent-node@1.2.0': + resolution: {integrity: sha512-VviIQ+B1XT/z2o/LuZGJ2t12s37jLC9eIlB3/BlUmA/oUP29n7m/cD/QDQB/x1mNrphBXqmPa+ey1X4roUZgEw==} + engines: {node: '>=22.0.0'} + hasBin: true + + '@emnapi/core@1.8.1': + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} + + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@emotion/is-prop-valid@1.4.0': + resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + + '@emotion/unitless@0.10.0': + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + + '@envelop/core@5.5.0': + resolution: {integrity: sha512-nsU1EyJQAStaKHR1ZkB/ug9XBm+WPTliYtdedbJ/L1ykrp7dbbn0srqBeDnZ2mbZVp4hH3d0Fy+Og9OgPWZx+g==} + engines: {node: '>=18.0.0'} + + '@envelop/instrumentation@1.0.0': + resolution: {integrity: sha512-cxgkB66RQB95H3X27jlnxCRNTmPuSTgmBAq6/4n2Dtv4hsk4yz8FadA1ggmd0uZzvKqWD6CR+WFgTjhDqg7eyw==} + engines: {node: '>=18.0.0'} + + '@envelop/types@5.2.1': + resolution: {integrity: sha512-CsFmA3u3c2QoLDTfEpGr4t25fjMU31nyvse7IzWTvb0ZycuPjMjb0fjlheh+PbhBYb9YLugnT2uY6Mwcg1o+Zg==} + engines: {node: '>=18.0.0'} + + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.2': + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.2': + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.27.2': + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.27.2': + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.27.2': + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.27.2': + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.27.2': + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.2': + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.27.2': + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.27.2': + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.27.2': + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.27.2': + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.3': + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.39.2': + resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@ethereumjs/common@3.2.0': + resolution: {integrity: sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==} + + '@ethereumjs/rlp@4.0.1': + resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} + engines: {node: '>=14'} + hasBin: true + + '@ethereumjs/tx@4.2.0': + resolution: {integrity: sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==} + engines: {node: '>=14'} + + '@ethereumjs/util@8.1.0': + resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} + engines: {node: '>=14'} + + '@fastify/busboy@3.2.0': + resolution: {integrity: sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==} + + '@floating-ui/core@1.7.4': + resolution: {integrity: sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==} + + '@floating-ui/dom@1.7.5': + resolution: {integrity: sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==} + + '@floating-ui/react-dom@2.1.7': + resolution: {integrity: sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.26.28': + resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@gemini-wallet/core@0.3.2': + resolution: {integrity: sha512-Z4aHi3ECFf5oWYWM3F1rW83GJfB9OvhBYPTmb5q+VyK3uvzvS48lwo+jwh2eOoCRWEuT/crpb9Vwp2QaS5JqgQ==} + peerDependencies: + viem: '>=2.0.0' + + '@graphql-tools/executor@1.5.1': + resolution: {integrity: sha512-n94Qcu875Mji9GQ52n5UbgOTxlgvFJicBPYD+FRks9HKIQpdNPjkkrKZUYNG51XKa+bf03rxNflm4+wXhoHHrA==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/merge@9.1.7': + resolution: {integrity: sha512-Y5E1vTbTabvcXbkakdFUt4zUIzB1fyaEnVmIWN0l0GMed2gdD01TpZWLUm4RNAxpturvolrb24oGLQrBbPLSoQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/schema@10.0.31': + resolution: {integrity: sha512-ZewRgWhXef6weZ0WiP7/MV47HXiuFbFpiDUVLQl6mgXsWSsGELKFxQsyUCBos60Qqy1JEFAIu3Ns6GGYjGkqkQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/utils@10.11.0': + resolution: {integrity: sha512-iBFR9GXIs0gCD+yc3hoNswViL1O5josI33dUqiNStFI/MHLCEPduasceAcazRH77YONKNiviHBV8f7OgcT4o2Q==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-tools/utils@11.0.0': + resolution: {integrity: sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-typed-document-node/core@3.2.0': + resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@graphql-yoga/logger@2.0.1': + resolution: {integrity: sha512-Nv0BoDGLMg9QBKy9cIswQ3/6aKaKjlTh87x3GiBg2Z4RrjyrM48DvOOK0pJh1C1At+b0mUIM67cwZcFTDLN4sA==} + engines: {node: '>=18.0.0'} + + '@graphql-yoga/plugin-defer-stream@3.18.0': + resolution: {integrity: sha512-VbvQP6hzSNHXXtX+OlK0DrbzQxE4ifP/PQzXUiECCYFOI8manRz+lmEmI1cL+HS6YlppXbtO7Qeb41MNEWLegA==} + engines: {node: '>=18.0.0'} + peerDependencies: + graphql: ^15.2.0 || ^16.0.0 + graphql-yoga: ^5.18.0 + + '@graphql-yoga/subscription@5.0.5': + resolution: {integrity: sha512-oCMWOqFs6QV96/NZRt/ZhTQvzjkGB4YohBOpKM4jH/lDT4qb7Lex/aGCxpi/JD9njw3zBBtMqxbaC22+tFHVvw==} + engines: {node: '>=18.0.0'} + + '@graphql-yoga/typed-event-target@3.0.2': + resolution: {integrity: sha512-ZpJxMqB+Qfe3rp6uszCQoag4nSw42icURnBRfFYSOmTgEeOe4rD0vYlbA8spvCu2TlCesNTlEN9BLWtQqLxabA==} + engines: {node: '>=18.0.0'} + + '@hcaptcha/loader@2.3.0': + resolution: {integrity: sha512-i4lnNxKBe+COf3R1nFZEWaZoHIoJjvDgWqvcNrdZq8ehoSNMN6KVZ56dcQ02qKie2h3+BkbkwlJA9DOIuLlK/g==} + + '@hcaptcha/react-hcaptcha@1.17.4': + resolution: {integrity: sha512-rIvgesG1N7SS9sAYYHFoWm+nXqRrxq7RcA9z2pKkDWV+S1GdfmrTNYA1aPyVWVe3eowphTCwyDJvl97Swwy0mw==} + peerDependencies: + react: '>= 16.3.0' + react-dom: '>= 16.3.0' + + '@headlessui/react@2.2.9': + resolution: {integrity: sha512-Mb+Un58gwBn0/yWZfyrCh0TJyurtT+dETj7YHleylHk5od3dv2XqETPGWMyQ5/7sYN7oWdyM1u9MvC0OC8UmzQ==} + engines: {node: '>=10'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + react-dom: ^18 || ^19 || ^19.0.0-rc + + '@heroicons/react@2.2.0': + resolution: {integrity: sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==} + peerDependencies: + react: '>= 16 || ^19.0.0-rc' + + '@hono/node-server@1.19.9': + resolution: {integrity: sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==} + engines: {node: '>=18.14.1'} + peerDependencies: + hono: ^4 + + '@hono/zod-validator@0.7.6': + resolution: {integrity: sha512-Io1B6d011Gj1KknV4rXYz4le5+5EubcWEU/speUjuw9XMMIaP3n78yXLhjd2A3PXaXaUwEAluOiAyLqhBEJgsw==} + peerDependencies: + hono: '>=3.9.0' + zod: ^3.25.0 || ^4.0.0 + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@hyperbolic/ai-sdk-provider@0.1.3': + resolution: {integrity: sha512-BD6am54wAznDdutWTO+Yq3swStHituTcHaAhVI4UV3n4pzq2/pJOiGmhxOX2n0te6da04Xlaq5gjV5KuB+qkJw==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@3.1.0': + resolution: {integrity: sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==} + + '@img/colour@1.0.0': + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@langchain/community@0.0.53': + resolution: {integrity: sha512-iFqZPt4MRssGYsQoKSXWJQaYTZCC7WNuilp2JCCs3wKmJK3l6mR0eV+PDrnT+TaDHUVxt/b0rwgM0sOiy0j2jA==} + engines: {node: '>=18'} + peerDependencies: + '@aws-crypto/sha256-js': ^5.0.0 + '@aws-sdk/client-bedrock-agent-runtime': ^3.485.0 + '@aws-sdk/client-bedrock-runtime': ^3.422.0 + '@aws-sdk/client-dynamodb': ^3.310.0 + '@aws-sdk/client-kendra': ^3.352.0 + '@aws-sdk/client-lambda': ^3.310.0 + '@aws-sdk/client-sagemaker-runtime': ^3.310.0 + '@aws-sdk/client-sfn': ^3.310.0 + '@aws-sdk/credential-provider-node': ^3.388.0 + '@azure/search-documents': ^12.0.0 + '@clickhouse/client': ^0.2.5 + '@cloudflare/ai': '*' + '@datastax/astra-db-ts': ^1.0.0 + '@elastic/elasticsearch': ^8.4.0 + '@getmetal/metal-sdk': '*' + '@getzep/zep-js': ^0.9.0 + '@gomomento/sdk': ^1.51.1 + '@gomomento/sdk-core': ^1.51.1 + '@google-ai/generativelanguage': ^0.2.1 + '@gradientai/nodejs-sdk': ^1.2.0 + '@huggingface/inference': ^2.6.4 + '@mozilla/readability': '*' + '@neondatabase/serverless': '*' + '@opensearch-project/opensearch': '*' + '@pinecone-database/pinecone': '*' + '@planetscale/database': ^1.8.0 + '@premai/prem-sdk': ^0.3.25 + '@qdrant/js-client-rest': ^1.8.2 + '@raycast/api': ^1.55.2 + '@rockset/client': ^0.9.1 + '@smithy/eventstream-codec': ^2.0.5 + '@smithy/protocol-http': ^3.0.6 + '@smithy/signature-v4': ^2.0.10 + '@smithy/util-utf8': ^2.0.0 + '@supabase/postgrest-js': ^1.1.1 + '@supabase/supabase-js': ^2.10.0 + '@tensorflow-models/universal-sentence-encoder': '*' + '@tensorflow/tfjs-converter': '*' + '@tensorflow/tfjs-core': '*' + '@upstash/redis': ^1.20.6 + '@upstash/vector': ^1.0.7 + '@vercel/kv': ^0.2.3 + '@vercel/postgres': ^0.5.0 + '@writerai/writer-sdk': ^0.40.2 + '@xata.io/client': ^0.28.0 + '@xenova/transformers': ^2.5.4 + '@zilliz/milvus2-sdk-node': '>=2.2.7' + better-sqlite3: ^9.4.0 + cassandra-driver: ^4.7.2 + cborg: ^4.1.1 + chromadb: '*' + closevector-common: 0.1.3 + closevector-node: 0.1.6 + closevector-web: 0.1.6 + cohere-ai: '*' + convex: ^1.3.1 + couchbase: ^4.3.0 + discord.js: ^14.14.1 + dria: ^0.0.3 + duck-duck-scrape: ^2.2.5 + faiss-node: ^0.5.1 + firebase-admin: ^11.9.0 || ^12.0.0 + google-auth-library: ^8.9.0 + googleapis: ^126.0.1 + hnswlib-node: ^3.0.0 + html-to-text: ^9.0.5 + interface-datastore: ^8.2.11 + ioredis: ^5.3.2 + it-all: ^3.0.4 + jsdom: '*' + jsonwebtoken: ^9.0.2 + llmonitor: ^0.5.9 + lodash: ^4.17.21 + lunary: ^0.6.11 + mongodb: '>=5.2.0' + mysql2: ^3.3.3 + neo4j-driver: '*' + node-llama-cpp: '*' + pg: ^8.11.0 + pg-copy-streams: ^6.0.5 + pickleparser: ^0.2.1 + portkey-ai: ^0.1.11 + redis: '*' + replicate: ^0.18.0 + typeorm: ^0.3.12 + typesense: ^1.5.3 + usearch: ^1.1.1 + vectordb: ^0.1.4 + voy-search: 0.6.2 + weaviate-ts-client: '*' + web-auth-library: ^1.0.3 + ws: ^8.14.2 + peerDependenciesMeta: + '@aws-crypto/sha256-js': + optional: true + '@aws-sdk/client-bedrock-agent-runtime': + optional: true + '@aws-sdk/client-bedrock-runtime': + optional: true + '@aws-sdk/client-dynamodb': + optional: true + '@aws-sdk/client-kendra': + optional: true + '@aws-sdk/client-lambda': + optional: true + '@aws-sdk/client-sagemaker-runtime': + optional: true + '@aws-sdk/client-sfn': + optional: true + '@aws-sdk/credential-provider-node': + optional: true + '@azure/search-documents': + optional: true + '@clickhouse/client': + optional: true + '@cloudflare/ai': + optional: true + '@datastax/astra-db-ts': + optional: true + '@elastic/elasticsearch': + optional: true + '@getmetal/metal-sdk': + optional: true + '@getzep/zep-js': + optional: true + '@gomomento/sdk': + optional: true + '@gomomento/sdk-core': + optional: true + '@google-ai/generativelanguage': + optional: true + '@gradientai/nodejs-sdk': + optional: true + '@huggingface/inference': + optional: true + '@mozilla/readability': + optional: true + '@neondatabase/serverless': + optional: true + '@opensearch-project/opensearch': + optional: true + '@pinecone-database/pinecone': + optional: true + '@planetscale/database': + optional: true + '@premai/prem-sdk': + optional: true + '@qdrant/js-client-rest': + optional: true + '@raycast/api': + optional: true + '@rockset/client': + optional: true + '@smithy/eventstream-codec': + optional: true + '@smithy/protocol-http': + optional: true + '@smithy/signature-v4': + optional: true + '@smithy/util-utf8': + optional: true + '@supabase/postgrest-js': + optional: true + '@supabase/supabase-js': + optional: true + '@tensorflow-models/universal-sentence-encoder': + optional: true + '@tensorflow/tfjs-converter': + optional: true + '@tensorflow/tfjs-core': + optional: true + '@upstash/redis': + optional: true + '@upstash/vector': + optional: true + '@vercel/kv': + optional: true + '@vercel/postgres': + optional: true + '@writerai/writer-sdk': + optional: true + '@xata.io/client': + optional: true + '@xenova/transformers': + optional: true + '@zilliz/milvus2-sdk-node': + optional: true + better-sqlite3: + optional: true + cassandra-driver: + optional: true + cborg: + optional: true + chromadb: + optional: true + closevector-common: + optional: true + closevector-node: + optional: true + closevector-web: + optional: true + cohere-ai: + optional: true + convex: + optional: true + couchbase: + optional: true + discord.js: + optional: true + dria: + optional: true + duck-duck-scrape: + optional: true + faiss-node: + optional: true + firebase-admin: + optional: true + google-auth-library: + optional: true + googleapis: + optional: true + hnswlib-node: + optional: true + html-to-text: + optional: true + interface-datastore: + optional: true + ioredis: + optional: true + it-all: + optional: true + jsdom: + optional: true + jsonwebtoken: + optional: true + llmonitor: + optional: true + lodash: + optional: true + lunary: + optional: true + mongodb: + optional: true + mysql2: + optional: true + neo4j-driver: + optional: true + node-llama-cpp: + optional: true + pg: + optional: true + pg-copy-streams: + optional: true + pickleparser: + optional: true + portkey-ai: + optional: true + redis: + optional: true + replicate: + optional: true + typeorm: + optional: true + typesense: + optional: true + usearch: + optional: true + vectordb: + optional: true + voy-search: + optional: true + weaviate-ts-client: + optional: true + web-auth-library: + optional: true + ws: + optional: true + + '@langchain/core@0.1.63': + resolution: {integrity: sha512-+fjyYi8wy6x1P+Ee1RWfIIEyxd9Ee9jksEwvrggPwwI/p45kIDTdYTblXsM13y4mNWTiACyLSdbwnPaxxdoz+w==} + engines: {node: '>=18'} + + '@langchain/core@0.3.80': + resolution: {integrity: sha512-vcJDV2vk1AlCwSh3aBm/urQ1ZrlXFFBocv11bz/NBUfLWD5/UDNMzwPdaAd2dKvNmTWa9FM2lirLU3+JCf4cRA==} + engines: {node: '>=18'} + + '@langchain/core@1.1.18': + resolution: {integrity: sha512-vwzbtHUSZaJONBA1n9uQedZPfyFFZ6XzTggTpR28n8tiIg7e1NC/5dvGW/lGtR1Du1VwV9DvDHA5/bOrLe6cVg==} + engines: {node: '>=20'} + + '@langchain/langgraph-api@1.1.11': + resolution: {integrity: sha512-rV1aGvdEPhmtyllKapuMKo+Ilzu5MSqLa/P56zO7zkGK4KkchykvU5zPNz4S/t9+jlh0mbu5jNTm/RvWw8WR3A==} + engines: {node: ^18.19.0 || >=20.16.0} + peerDependencies: + '@langchain/core': ^0.3.59 || ^1.0.1 + '@langchain/langgraph': ^0.2.57 || ^0.3.0 || ^0.4.0 || ^1.0.0-alpha || ^1.0.0 + '@langchain/langgraph-checkpoint': ~0.0.16 || ^0.1.0 || ~1.0.0 + '@langchain/langgraph-sdk': ~0.0.16 || ^0.1.0 || ^1.0.0 + typescript: ^5.5.4 + peerDependenciesMeta: + '@langchain/langgraph-sdk': + optional: true + + '@langchain/langgraph-checkpoint@1.0.0': + resolution: {integrity: sha512-xrclBGvNCXDmi0Nz28t3vjpxSH6UYx6w5XAXSiiB1WEdc2xD2iY/a913I3x3a31XpInUW/GGfXXfePfaghV54A==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/core': ^1.0.1 + + '@langchain/langgraph-cli@1.1.11': + resolution: {integrity: sha512-rKDHnhx+wqV0jE5A429eX4V/tyTPWgWhNKYTQG5a8eK819Or0DIAxEOGIQD4LRTeWzuBYyff2g5zTgafSggLUA==} + engines: {node: ^18.19.0 || >=20.16.0} + hasBin: true + + '@langchain/langgraph-sdk@0.1.10': + resolution: {integrity: sha512-9srSCb2bSvcvehMgjA2sMMwX0o1VUgPN6ghwm5Fwc9JGAKsQa6n1S4eCwy1h4abuYxwajH5n3spBw+4I2WYbgw==} + peerDependencies: + '@langchain/core': '>=0.2.31 <0.4.0 || ^1.0.0-alpha' + react: ^18 || ^19 + react-dom: ^18 || ^19 + peerDependenciesMeta: + '@langchain/core': + optional: true + react: + optional: true + react-dom: + optional: true + + '@langchain/langgraph-sdk@1.0.3': + resolution: {integrity: sha512-6M4i0XsVO5Eb2vv/3OtIPHW3UqO4zYyXl6AOfS0Jf6d7JiWiSXqzLN8UoS0hpu1ItkcW1j575CRiP/6jn6XXFg==} + peerDependencies: + '@langchain/core': ^1.0.1 + react: ^18 || ^19 + react-dom: ^18 || ^19 + peerDependenciesMeta: + '@langchain/core': + optional: true + react: + optional: true + react-dom: + optional: true + + '@langchain/langgraph-ui@1.1.11': + resolution: {integrity: sha512-xg2fyq73w9RMHeJUPYyGe4c7q4aXUOfAqClyuM5GxM/tKFWXhYL5PRGaDjZZF1jQP9z8WuPcF54xQg4Ekt+PJw==} + engines: {node: ^18.19.0 || >=20.16.0} + hasBin: true + + '@langchain/langgraph@1.0.2': + resolution: {integrity: sha512-syxzzWTnmpCL+RhUEvalUeOXFoZy/KkzHa2Da2gKf18zsf9Dkbh3rfnRDrTyUGS1XSTejq07s4rg1qntdEDs2A==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/core': ^1.0.1 + zod: ^3.25.32 || ^4.1.0 + zod-to-json-schema: ^3.x + peerDependenciesMeta: + zod-to-json-schema: + optional: true + + '@langchain/openai@0.0.34': + resolution: {integrity: sha512-M+CW4oXle5fdoz2T2SwdOef8pl3/1XmUx1vjn2mXUVM/128aO0l23FMF0SNBsAbRV6P+p/TuzjodchJbi0Ht/A==} + engines: {node: '>=18'} + + '@langchain/openai@0.6.17': + resolution: {integrity: sha512-JVSzD+FL5v/2UQxKd+ikB1h4PQOtn0VlK8nqW2kPp0fshItCv4utrjBKXC/rubBnSXoRTyonBINe8QRZ6OojVQ==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/core': '>=0.3.68 <0.4.0' + + '@langchain/openai@1.2.4': + resolution: {integrity: sha512-3ThBOIXAJ6eXuqGGO41XDgr4rp/qpl/RpZmGcjv1S3+CRLS4UQBgXkZEab7mun85HfdsUWLs/v1+pDwbMFixcA==} + engines: {node: '>=20'} + peerDependencies: + '@langchain/core': ^1.0.0 + + '@langchain/textsplitters@0.1.0': + resolution: {integrity: sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/core': '>=0.2.21 <0.4.0' + + '@lit-labs/react@2.1.3': + resolution: {integrity: sha512-OD9h2JynerBQUMNzb563jiVpxfvPF0HjQkKY2mx0lpVYvD7F+rtJpOGz6ek+6ufMidV3i+MPT9SX62OKWHFrQg==} + + '@lit-labs/ssr-dom-shim@1.5.1': + resolution: {integrity: sha512-Aou5UdlSpr5whQe8AA/bZG0jMj96CoJIWbGfZ91qieWu5AWUMKw8VR/pAkQkJYvBNhmCcWnZlyyk5oze8JIqYA==} + + '@lit/react@1.0.8': + resolution: {integrity: sha512-p2+YcF+JE67SRX3mMlJ1TKCSTsgyOVdAwd/nxp3NuV1+Cb6MWALbN6nT7Ld4tpmYofcE5kcaSY1YBB9erY+6fw==} + peerDependencies: + '@types/react': 17 || 18 || 19 + + '@lit/reactive-element@2.1.2': + resolution: {integrity: sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==} + + '@lukeed/csprng@1.1.0': + resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} + engines: {node: '>=8'} + + '@lukeed/uuid@2.0.1': + resolution: {integrity: sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==} + engines: {node: '>=8'} + + '@marsidev/react-turnstile@1.4.1': + resolution: {integrity: sha512-1jE0IjvB8z+q1NFRs3149gXzXwIzXQWqQjn9fmAr13BiE3RYLWck5Me6flHYE90shW5L12Jkm6R1peS1OnA9oQ==} + peerDependencies: + react: ^17.0.2 || ^18.0.0 || ^19.0 + react-dom: ^17.0.2 || ^18.0.0 || ^19.0 + + '@mermaid-js/parser@0.6.3': + resolution: {integrity: sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==} + + '@metamask/7715-permission-types@0.3.0': + resolution: {integrity: sha512-+bqFNe6/YCe2LZapiVJO3/hn7BSJLExYT+cDJS1spJocPeVsTyURv3IjblZxRqTOv+igTwrYbh45LvdkgzxkZQ==} + engines: {node: ^18.18 || >=20} + + '@metamask/abi-utils@3.0.0': + resolution: {integrity: sha512-a/l0DiSIr7+CBYVpHygUa3ztSlYLFCQMsklLna+t6qmNY9+eIO5TedNxhyIyvaJ+4cN7TLy0NQFbp9FV3X2ktg==} + engines: {node: ^18.18 || ^20.14 || >=22} + + '@metamask/delegation-abis@0.11.0': + resolution: {integrity: sha512-tnNGFDLQ5jfgPhHJaT5JwvF759nja1iGAG00REbk1Ufir+TxjxTmF8L9MbJifZmUh4fnyqV4Ik6NAOYVNBPVBg==} + engines: {node: ^18.18 || >=20} + + '@metamask/delegation-core@0.2.0': + resolution: {integrity: sha512-leP40qoxhTmexfeY/neZ9XkhmUiq8fHh3ax4wmmTB5CG6VuXStn2LzLz875RiBtjwU3c4IqaZljxvwC1dUuWVw==} + engines: {node: ^18.18 || >=20} + + '@metamask/delegation-deployments@0.12.0': + resolution: {integrity: sha512-9SB5DhLAnbpIWbFxP3UKPXLhCt8iiRjBBjZ7hqF5dMXy9buBEDpCRg+FJYRxYRecwporrTVrv+NfKUyCbL2ncw==} + engines: {node: ^18.18 || >=20} + + '@metamask/delegation-toolkit@0.13.0': + resolution: {integrity: sha512-SVc2gcnKQ8KQodugfuXMs49pHO1x9AYw3Wmdg4yBEsgm5TF5zPpWFmAj+bOL8q+Fn+mHJAibFIrJBtS970G9Dw==} + engines: {node: ^18.18 || >=20} + deprecated: Renamed to @metamask/smart-accounts-kit + peerDependencies: + viem: ^2.31.4 + + '@metamask/eth-json-rpc-provider@1.0.1': + resolution: {integrity: sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA==} + engines: {node: '>=14.0.0'} + + '@metamask/json-rpc-engine@7.3.3': + resolution: {integrity: sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg==} + engines: {node: '>=16.0.0'} + + '@metamask/json-rpc-engine@8.0.2': + resolution: {integrity: sha512-IoQPmql8q7ABLruW7i4EYVHWUbF74yrp63bRuXV5Zf9BQwcn5H9Ww1eLtROYvI1bUXwOiHZ6qT5CWTrDc/t/AA==} + engines: {node: '>=16.0.0'} + + '@metamask/json-rpc-middleware-stream@7.0.2': + resolution: {integrity: sha512-yUdzsJK04Ev98Ck4D7lmRNQ8FPioXYhEUZOMS01LXW8qTvPGiRVXmVltj2p4wrLkh0vW7u6nv0mNl5xzC5Qmfg==} + engines: {node: '>=16.0.0'} + + '@metamask/object-multiplex@2.1.0': + resolution: {integrity: sha512-4vKIiv0DQxljcXwfpnbsXcfa5glMj5Zg9mqn4xpIWqkv6uJ2ma5/GtUfLFSxhlxnR8asRMv8dDmWya1Tc1sDFA==} + engines: {node: ^16.20 || ^18.16 || >=20} + + '@metamask/onboarding@1.0.1': + resolution: {integrity: sha512-FqHhAsCI+Vacx2qa5mAFcWNSrTcVGMNjzxVgaX8ECSny/BJ9/vgXP9V7WF/8vb9DltPeQkxr+Fnfmm6GHfmdTQ==} + + '@metamask/providers@16.1.0': + resolution: {integrity: sha512-znVCvux30+3SaUwcUGaSf+pUckzT5ukPRpcBmy+muBLC0yaWnBcvDqGfcsw6CBIenUdFrVoAFa8B6jsuCY/a+g==} + engines: {node: ^18.18 || >=20} + + '@metamask/rpc-errors@6.4.0': + resolution: {integrity: sha512-1ugFO1UoirU2esS3juZanS/Fo8C8XYocCuBpfZI5N7ECtoG+zu0wF+uWZASik6CkO6w9n/Iebt4iI4pT0vptpg==} + engines: {node: '>=16.0.0'} + + '@metamask/rpc-errors@7.0.2': + resolution: {integrity: sha512-YYYHsVYd46XwY2QZzpGeU4PSdRhHdxnzkB8piWGvJW2xbikZ3R+epAYEL4q/K8bh9JPTucsUdwRFnACor1aOYw==} + engines: {node: ^18.20 || ^20.17 || >=22} + + '@metamask/safe-event-emitter@2.0.0': + resolution: {integrity: sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==} + + '@metamask/safe-event-emitter@3.1.2': + resolution: {integrity: sha512-5yb2gMI1BDm0JybZezeoX/3XhPDOtTbcFvpTXM9kxsoZjPZFh4XciqRbpD6N86HYZqWDhEaKUDuOyR0sQHEjMA==} + engines: {node: '>=12.0.0'} + + '@metamask/sdk-analytics@0.0.5': + resolution: {integrity: sha512-fDah+keS1RjSUlC8GmYXvx6Y26s3Ax1U9hGpWb6GSY5SAdmTSIqp2CvYy6yW0WgLhnYhW+6xERuD0eVqV63QIQ==} + + '@metamask/sdk-communication-layer@0.33.1': + resolution: {integrity: sha512-0bI9hkysxcfbZ/lk0T2+aKVo1j0ynQVTuB3sJ5ssPWlz+Z3VwveCkP1O7EVu1tsVVCb0YV5WxK9zmURu2FIiaA==} + peerDependencies: + cross-fetch: ^4.0.0 + eciesjs: '*' + eventemitter2: ^6.4.9 + readable-stream: ^3.6.2 + socket.io-client: ^4.5.1 + + '@metamask/sdk-install-modal-web@0.32.1': + resolution: {integrity: sha512-MGmAo6qSjf1tuYXhCu2EZLftq+DSt5Z7fsIKr2P+lDgdTPWgLfZB1tJKzNcwKKOdf6q9Qmmxn7lJuI/gq5LrKw==} + + '@metamask/sdk@0.33.1': + resolution: {integrity: sha512-1mcOQVGr9rSrVcbKPNVzbZ8eCl1K0FATsYH3WJ/MH4WcZDWGECWrXJPNMZoEAkLxWiMe8jOQBumg2pmcDa9zpQ==} + + '@metamask/superstruct@3.2.1': + resolution: {integrity: sha512-fLgJnDOXFmuVlB38rUN5SmU7hAFQcCjrg3Vrxz67KTY7YHFnSNEKvX4avmEBdOI0yTCxZjwMCFEqsC8k2+Wd3g==} + engines: {node: '>=16.0.0'} + + '@metamask/utils@11.9.0': + resolution: {integrity: sha512-wRnoSDD9jTWOge/+reFviJQANhS+uy8Y+OEwRanp5mQeGTjBFmK1r2cTOnei2UCZRV1crXHzeJVSFEoDDcgRbA==} + engines: {node: ^18.18 || ^20.14 || >=22} + + '@metamask/utils@5.0.2': + resolution: {integrity: sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==} + engines: {node: '>=14.0.0'} + + '@metamask/utils@8.5.0': + resolution: {integrity: sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==} + engines: {node: '>=16.0.0'} + + '@metamask/utils@9.3.0': + resolution: {integrity: sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g==} + engines: {node: '>=16.0.0'} + + '@modelcontextprotocol/sdk@1.25.3': + resolution: {integrity: sha512-vsAMBMERybvYgKbg/l4L1rhS7VXV1c0CtyJg72vwxONVX0l4ZfKVAnZEWTQixJGTzKnELjQ59e4NbdFDALRiAQ==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + + '@msgpack/msgpack@3.1.2': + resolution: {integrity: sha512-JEW4DEtBzfe8HvUYecLU9e6+XJnKDlUAIve8FvPzF3Kzs6Xo/KuZkZJsDH0wJXl/qEZbeeE7edxDNY3kMs39hQ==} + engines: {node: '>= 18'} + + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + + '@next/env@16.0.8': + resolution: {integrity: sha512-xP4WrQZuj9MdmLJy3eWFHepo+R3vznsMSS8Dy3wdA7FKpjCiesQ6DxZvdGziQisj0tEtCgBKJzjcAc4yZOgLEQ==} + + '@next/eslint-plugin-next@16.0.8': + resolution: {integrity: sha512-1miV0qXDcLUaOdHridVPCh4i39ElRIAraseVIbb3BEqyZ5ol9sPyjTP/GNTPV5rBxqxjF6/vv5zQTVbhiNaLqA==} + + '@next/swc-darwin-arm64@16.0.8': + resolution: {integrity: sha512-yjVMvTQN21ZHOclQnhSFbjBTEizle+1uo4NV6L4rtS9WO3nfjaeJYw+H91G+nEf3Ef43TaEZvY5mPWfB/De7tA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@16.0.8': + resolution: {integrity: sha512-+zu2N3QQ0ZOb6RyqQKfcu/pn0UPGmg+mUDqpAAEviAcEVEYgDckemOpiMRsBP3IsEKpcoKuNzekDcPczEeEIzA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@16.0.8': + resolution: {integrity: sha512-LConttk+BeD0e6RG0jGEP9GfvdaBVMYsLJ5aDDweKiJVVCu6sGvo+Ohz9nQhvj7EQDVVRJMCGhl19DmJwGr6bQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@16.0.8': + resolution: {integrity: sha512-JaXFAlqn8fJV+GhhA9lpg6da/NCN/v9ub98n3HoayoUSPOVdoxEEt86iT58jXqQCs/R3dv5ZnxGkW8aF4obMrQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@16.0.8': + resolution: {integrity: sha512-O7M9it6HyNhsJp3HNAsJoHk5BUsfj7hRshfptpGcVsPZ1u0KQ/oVy8oxF7tlwxA5tR43VUP0yRmAGm1us514ng==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@16.0.8': + resolution: {integrity: sha512-8+KClEC/GLI2dLYcrWwHu5JyC5cZYCFnccVIvmxpo6K+XQt4qzqM5L4coofNDZYkct/VCCyJWGbZZDsg6w6LFA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@16.0.8': + resolution: {integrity: sha512-rpQ/PgTEgH68SiXmhu/cJ2hk9aZ6YgFvspzQWe2I9HufY6g7V02DXRr/xrVqOaKm2lenBFPNQ+KAaeveywqV+A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-x64-msvc@16.0.8': + resolution: {integrity: sha512-jWpWjWcMQu2iZz4pEK2IktcfR+OA9+cCG8zenyLpcW8rN4rzjfOzH4yj/b1FiEAZHKS+5Vq8+bZyHi+2yqHbFA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@noble/ciphers@1.2.1': + resolution: {integrity: sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==} + engines: {node: ^14.21.3 || >=16} + + '@noble/ciphers@1.3.0': + resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.4.2': + resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} + + '@noble/curves@1.8.0': + resolution: {integrity: sha512-j84kjAbzEnQHaSIhRPUmB3/eVXu2k3dKPl2LOrR8fSOIL+89U+7lV117EWHtq/GHM3ReGHM46iRBdZfpc4HRUQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.8.1': + resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.9.1': + resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.9.6': + resolution: {integrity: sha512-GIKz/j99FRthB8icyJQA51E8Uk5hXmdyThjgQXRKiv9h0zeRlzSCLIzFw6K1LotZ3XuB7yzlf76qk7uBmTdFqA==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.9.7': + resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + + '@noble/hashes@1.7.0': + resolution: {integrity: sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.7.1': + resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@nolyfill/is-core-module@1.0.39': + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + + '@openrouter/ai-sdk-provider@1.5.4': + resolution: {integrity: sha512-xrSQPUIH8n9zuyYZR0XK7Ba0h2KsjJcMkxnwaYfmv13pKs3sDkjPzVPPhlhzqBGddHb5cFEwJ9VFuFeDcxCDSw==} + engines: {node: '>=18'} + peerDependencies: + ai: ^5.0.0 + zod: ^3.24.1 || ^v4 + + '@openrouter/sdk@0.1.27': + resolution: {integrity: sha512-RH//L10bSmc81q25zAZudiI4kNkLgxF2E+WU42vghp3N6TEvZ6F0jK7uT3tOxkEn91gzmMw9YVmDENy7SJsajQ==} + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@paulmillr/qr@0.2.1': + resolution: {integrity: sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ==} + deprecated: 'The package is now available as "qr": npm install qr' + + '@phosphor-icons/webcomponents@2.1.5': + resolution: {integrity: sha512-JcvQkZxvcX2jK+QCclm8+e8HXqtdFW9xV4/kk2aL9Y3dJA2oQVt+pzbv1orkumz3rfx4K9mn9fDoMr1He1yr7Q==} + + '@pinojs/redact@0.4.0': + resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} + + '@pnpm/exe@10.28.2': + resolution: {integrity: sha512-6czCdcJ2AZaFrkmi9SE1YXPwGHfa9vDkqwcwUz7pzP+LFT9rI6ToYBH9/FwGbcr/lpQfShi1bbFkuHbNZjdrWw==} + hasBin: true + + '@pnpm/linux-arm64@10.28.2': + resolution: {integrity: sha512-6esZzKnnEMUJ23WMnQpQZ55YZGuA4+Pd/Xngv6TQfx0N5wnOFbmWWUJ6RbohN9GHtLK359/VaNZVdrGASyNEng==} + cpu: [arm64] + os: [linux] + hasBin: true + + '@pnpm/linux-x64@10.28.2': + resolution: {integrity: sha512-84xnJO4n9iv4HpMWbr62ye6m4uR1UbmPQj+Frr/6Ml3dG2/UUswS+iSuWQ3Hnl/CVFx1IYH+pFEZxPp9Btv0PA==} + cpu: [x64] + os: [linux] + hasBin: true + + '@pnpm/macos-arm64@10.28.2': + resolution: {integrity: sha512-QPLdXODvvSJCnZqMfQn0NeL9OItO7AUwSiGgTseEBwEhUAfUBEtc8zfWp00ZNCctK5E4SGXsirZq+86vI7R8qA==} + cpu: [arm64] + os: [darwin] + hasBin: true + + '@pnpm/macos-x64@10.28.2': + resolution: {integrity: sha512-49n3Lfh63kP93PVv7luoxRUk7FR922kv/e92z9uIkqV1Nqe3isMwkUCwdnUEICo/XHh52P4JF3Jgs9V3xUrDLg==} + cpu: [x64] + os: [darwin] + hasBin: true + + '@pnpm/win-arm64@10.28.2': + resolution: {integrity: sha512-ReKHLMk1/JxzZQE1BT1+8vCykOTIb/KFMBF5+y9QhrtbFQ04kMAV9elW1qHWO0kdnqYxFGouaLbHi7nQCpCs/Q==} + cpu: [arm64] + os: [win32] + hasBin: true + + '@pnpm/win-x64@10.28.2': + resolution: {integrity: sha512-XR3DGUkmmtOJq5I5Af/gPeuoTqxqwTJeKOWweEChtpmjnlsoSu/XT9AL6cT9Gm9QcVF3TIF5CA0GV7nRD50Lpg==} + cpu: [x64] + os: [win32] + hasBin: true + + '@privy-io/api-base@1.8.2': + resolution: {integrity: sha512-pEvZ73GnC2OB/w35MGCPhqZ8mnApXgUpXxM0t9qZmNzvDNoMKBLPgysUXouAx7E4jO8REJPuwX70Y1AqJ/51kg==} + + '@privy-io/api-types@0.4.0': + resolution: {integrity: sha512-XNA0rotkMkYhcmByNUyzmge6riESkOLtBvJWlwAy1QsflN+7eLkD51DegVjweBDSwEtB75rbWOaKmoikItaEiw==} + + '@privy-io/chains@0.0.6': + resolution: {integrity: sha512-tcDYv2r4HJBQkEzGS3hau01WmZ4zLmEgaitPUorKvW4IC6qOzxcIXJIqeX6HT6JJjoV8I6xNey0pCsF+VS59ew==} + + '@privy-io/ethereum@0.0.7': + resolution: {integrity: sha512-8eRl2Nk34r16gMft4r1WkQvB4w+TKtmo/EB/lrqVcGpD9jc5Hqq2+SPlZ+PJr2NClioiuhYHq6BItM95l86VGA==} + peerDependencies: + viem: ^2.44.2 + + '@privy-io/js-sdk-core@0.60.0': + resolution: {integrity: sha512-oqD39f1Gd2Eakjxv7tBGuFmEutfm34Zc4IvRirAnKPNcGuvwQJjAepVt4QeVIM2eLWUFiPNMHj2rH0oOTEN+3w==} + peerDependencies: + permissionless: ^0.2.47 + viem: ^2.44.2 + peerDependenciesMeta: + permissionless: + optional: true + viem: + optional: true + + '@privy-io/popup@0.0.2': + resolution: {integrity: sha512-kkxzZ5TFseqnZRDVhBR1Si9mTHc1jW+hLSbYviauK80enJOGsOGmxeeC/U0t0kLZGLpn0Jj5v5lNS2bmQ4as/Q==} + + '@privy-io/react-auth@3.13.0': + resolution: {integrity: sha512-FxMlaecDvnWWv7axEwqgUzjarG4cbZQA1tOnv43pGma0mPyxeQX8gJ1HcN4MA6ApLTyjGX2GPHY9aJt1ENKm9w==} + peerDependencies: + '@abstract-foundation/agw-client': ^1.0.0 + '@solana-program/memo': '>=0.8.0' + '@solana-program/system': '>=0.8.0' + '@solana-program/token': '>=0.6.0' + '@solana/kit': '>=3.0.3' + permissionless: ^0.2.47 + react: ^18 || ^19 + react-dom: ^18 || ^19 + peerDependenciesMeta: + '@abstract-foundation/agw-client': + optional: true + '@solana-program/memo': + optional: true + '@solana-program/system': + optional: true + '@solana-program/token': + optional: true + '@solana/kit': + optional: true + permissionless: + optional: true + + '@privy-io/routes@0.0.6': + resolution: {integrity: sha512-7km0gKxp9yCaA5r3OatICgmMSVCIlS+zomiF5FUtPynmHzrNPbxxN8QYnISCPioHlljE91fopoDIj23KbFWyvg==} + + '@privy-io/urls@0.0.3': + resolution: {integrity: sha512-cococ82ycPJc+wSCHUG0TrVJXF2PIkmDH8TLV+oGqBr14Q7ziRI63aCFIp6FpSRhdDDo9jmB0VR9NjCak4ptMA==} + + '@protobuf-ts/protoc@2.11.1': + resolution: {integrity: sha512-mUZJaV0daGO6HUX90o/atzQ6A7bbN2RSuHtdwo8SSF2Qoe3zHwa4IHyCN1evftTeHfLmdz+45qo47sL+5P8nyg==} + hasBin: true + + '@radix-ui/primitive@1.1.3': + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + + '@radix-ui/react-arrow@1.1.7': + resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.7': + resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-direction@1.1.1': + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.11': + resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dropdown-menu@2.1.16': + resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.3': + resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.7': + resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-menu@2.1.16': + resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.2.8': + resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.9': + resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.5': + resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.1.3': + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.11': + resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.2.3': + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-slot@1.2.4': + resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-tooltip@1.2.8': + resolution: {integrity: sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.1': + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.1': + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.2.3': + resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.1': + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + + '@react-aria/focus@3.21.3': + resolution: {integrity: sha512-FsquWvjSCwC2/sBk4b+OqJyONETUIXQ2vM0YdPAuC+QFQh2DT6TIBo6dOZVSezlhudDla69xFBd6JvCFq1AbUw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/interactions@3.26.0': + resolution: {integrity: sha512-AAEcHiltjfbmP1i9iaVw34Mb7kbkiHpYdqieWufldh4aplWgsF11YQZOfaCJW4QoR2ML4Zzoa9nfFwLXA52R7Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/ssr@3.9.10': + resolution: {integrity: sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==} + engines: {node: '>= 12'} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/utils@3.32.0': + resolution: {integrity: sha512-/7Rud06+HVBIlTwmwmJa2W8xVtgxgzm0+kLbuFooZRzKDON6hhozS1dOMR/YLMxyJOaYOTpImcP4vRR9gL1hEg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-stately/flags@3.1.2': + resolution: {integrity: sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==} + + '@react-stately/utils@3.11.0': + resolution: {integrity: sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-types/shared@3.32.1': + resolution: {integrity: sha512-famxyD5emrGGpFuUlgOP6fVW2h/ZaF405G5KDi3zPHzyjAWys/8W6NAVJtNbkCkhedmvL0xOhvt8feGXyXaw5w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@reown/appkit-common@1.7.8': + resolution: {integrity: sha512-ridIhc/x6JOp7KbDdwGKY4zwf8/iK8EYBl+HtWrruutSLwZyVi5P8WaZa+8iajL6LcDcDF7LoyLwMTym7SRuwQ==} + + '@reown/appkit-common@1.8.9': + resolution: {integrity: sha512-drseYLBDqcQR2WvhfAwrKRiDJdTmsmwZsRBg72sxQDvAwxfKNSmiqsqURq5c/Q9SeeTwclge58Dyq7Ijo6TeeQ==} + + '@reown/appkit-controllers@1.7.8': + resolution: {integrity: sha512-IdXlJlivrlj6m63VsGLsjtPHHsTWvKGVzWIP1fXZHVqmK+rZCBDjCi9j267Rb9/nYRGHWBtlFQhO8dK35WfeDA==} + + '@reown/appkit-controllers@1.8.9': + resolution: {integrity: sha512-/8hgFAgiYCTDG3gSxJr8hXy6GnO28UxN8JOXFUEi5gOODy7d3+3Jwm+7OEghf7hGKrShDedibsXdXKdX1PUT+g==} + + '@reown/appkit-pay@1.7.8': + resolution: {integrity: sha512-OSGQ+QJkXx0FEEjlpQqIhT8zGJKOoHzVnyy/0QFrl3WrQTjCzg0L6+i91Ad5Iy1zb6V5JjqtfIFpRVRWN4M3pw==} + + '@reown/appkit-pay@1.8.9': + resolution: {integrity: sha512-AEmaPqxnzjawSRFenyiTtq0vjKM5IPb2CTD9wa+OMXFpe6FissO+1Eg1H47sfdrycZCvUizSRmQmYqkJaI8BCw==} + + '@reown/appkit-polyfills@1.7.8': + resolution: {integrity: sha512-W/kq786dcHHAuJ3IV2prRLEgD/2iOey4ueMHf1sIFjhhCGMynMkhsOhQMUH0tzodPqUgAC494z4bpIDYjwWXaA==} + + '@reown/appkit-polyfills@1.8.9': + resolution: {integrity: sha512-33YCU8dxe4UkpNf9qCAaHx5crSoEu6tbmZxE/0eEPCYRDRXoiH9VGiN7xwTDOVduacg/U8H6/32ibmYZKnRk5Q==} + + '@reown/appkit-scaffold-ui@1.7.8': + resolution: {integrity: sha512-RCeHhAwOrIgcvHwYlNWMcIDibdI91waaoEYBGw71inE0kDB8uZbE7tE6DAXJmDkvl0qPh+DqlC4QbJLF1FVYdQ==} + + '@reown/appkit-scaffold-ui@1.8.9': + resolution: {integrity: sha512-F7PSM1nxvlvj2eu8iL355GzvCNiL8RKiCqT1zag8aB4QpxjU24l+vAF6debtkg4HY8nJOyDifZ7Z1jkKrHlIDQ==} + + '@reown/appkit-ui@1.7.8': + resolution: {integrity: sha512-1hjCKjf6FLMFzrulhl0Y9Vb9Fu4royE+SXCPSWh4VhZhWqlzUFc7kutnZKx8XZFVQH4pbBvY62SpRC93gqoHow==} + + '@reown/appkit-ui@1.8.9': + resolution: {integrity: sha512-WR17ql77KOMKfyDh7RW4oSfmj+p5gIl0u8Wmopzbx5Hd0HcPVZ5HmTDpwOM9WCSxYcin0fsSAoI+nVdvrhWNtw==} + + '@reown/appkit-utils@1.7.8': + resolution: {integrity: sha512-8X7UvmE8GiaoitCwNoB86pttHgQtzy4ryHZM9kQpvjQ0ULpiER44t1qpVLXNM4X35O0v18W0Dk60DnYRMH2WRw==} + peerDependencies: + valtio: 1.13.2 + + '@reown/appkit-utils@1.8.9': + resolution: {integrity: sha512-U9hx4h7tIE7ha/QWKjZpZc/imaLumdwe0QNdku9epjp/npXVjGuwUrW5mj8yWNSkjtQpY/BEItNdDAUKZ7rrjw==} + peerDependencies: + valtio: 2.1.7 + + '@reown/appkit-wallet@1.7.8': + resolution: {integrity: sha512-kspz32EwHIOT/eg/ZQbFPxgXq0B/olDOj3YMu7gvLEFz4xyOFd/wgzxxAXkp5LbG4Cp++s/elh79rVNmVFdB9A==} + + '@reown/appkit-wallet@1.8.9': + resolution: {integrity: sha512-rcAXvkzOVG4941eZVCGtr2dSJAMOclzZGSe+8hnOUnhK4zxa5svxiP6K9O5SMBp3MrAS3WNsRj5hqx6+JHb7iA==} + + '@reown/appkit@1.7.8': + resolution: {integrity: sha512-51kTleozhA618T1UvMghkhKfaPcc9JlKwLJ5uV+riHyvSoWPKPRIa5A6M1Wano5puNyW0s3fwywhyqTHSilkaA==} + + '@reown/appkit@1.8.9': + resolution: {integrity: sha512-e3N2DAzf3Xv3jnoD8IsUo0/Yfwuhk7npwJBe1+9rDJIRwgPsyYcCLD4gKPDFC5IUIfOLqK7YtGOh9oPEUnIWpw==} + + '@repeaterjs/repeater@3.0.6': + resolution: {integrity: sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==} + + '@rollup/rollup-android-arm-eabi@4.57.1': + resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.57.1': + resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.57.1': + resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.57.1': + resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.57.1': + resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.57.1': + resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.57.1': + resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.57.1': + resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.57.1': + resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.57.1': + resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.57.1': + resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.57.1': + resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.57.1': + resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.57.1': + resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.57.1': + resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.57.1': + resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.57.1': + resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.57.1': + resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.57.1': + resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.57.1': + resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.57.1': + resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} + cpu: [x64] + os: [win32] + + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + + '@safe-global/safe-apps-provider@0.18.6': + resolution: {integrity: sha512-4LhMmjPWlIO8TTDC2AwLk44XKXaK6hfBTWyljDm0HQ6TWlOEijVWNrt2s3OCVMSxlXAcEzYfqyu1daHZooTC2Q==} + + '@safe-global/safe-apps-sdk@9.1.0': + resolution: {integrity: sha512-N5p/ulfnnA2Pi2M3YeWjULeWbjo7ei22JwU/IXnhoHzKq3pYCN6ynL9mJBOlvDVv892EgLPCWCOwQk/uBT2v0Q==} + + '@safe-global/safe-gateway-typescript-sdk@3.23.1': + resolution: {integrity: sha512-6ORQfwtEJYpalCeVO21L4XXGSdbEMfyp2hEv6cP82afKXSwvse6d3sdelgaPWUxHIsFRkWvHDdzh8IyyKHZKxw==} + engines: {node: '>=16'} + + '@scarf/scarf@1.4.0': + resolution: {integrity: sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==} + + '@scure/base@1.1.9': + resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} + + '@scure/base@1.2.6': + resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} + + '@scure/bip32@1.4.0': + resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} + + '@scure/bip32@1.6.2': + resolution: {integrity: sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==} + + '@scure/bip32@1.7.0': + resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} + + '@scure/bip39@1.3.0': + resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} + + '@scure/bip39@1.5.4': + resolution: {integrity: sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==} + + '@scure/bip39@1.6.0': + resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} + + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@segment/analytics-core@1.8.2': + resolution: {integrity: sha512-5FDy6l8chpzUfJcNlIcyqYQq4+JTUynlVoCeCUuVz+l+6W0PXg+ljKp34R4yLVCcY5VVZohuW+HH0VLWdwYVAg==} + + '@segment/analytics-generic-utils@1.2.0': + resolution: {integrity: sha512-DfnW6mW3YQOLlDQQdR89k4EqfHb0g/3XvBXkovH1FstUN93eL1kfW9CsDcVQyH3bAC5ZsFyjA/o/1Q2j0QeoWw==} + + '@segment/analytics-node@2.3.0': + resolution: {integrity: sha512-fOXLL8uY0uAWw/sTLmezze80hj8YGgXXlAfvSS6TUmivk4D/SP0C0sxnbpFdkUzWg2zT64qWIZj26afEtSnxUA==} + engines: {node: '>=20'} + + '@shikijs/core@3.22.0': + resolution: {integrity: sha512-iAlTtSDDbJiRpvgL5ugKEATDtHdUVkqgHDm/gbD2ZS9c88mx7G1zSYjjOxp5Qa0eaW0MAQosFRmJSk354PRoQA==} + + '@shikijs/engine-javascript@3.22.0': + resolution: {integrity: sha512-jdKhfgW9CRtj3Tor0L7+yPwdG3CgP7W+ZEqSsojrMzCjD1e0IxIbwUMDDpYlVBlC08TACg4puwFGkZfLS+56Tw==} + + '@shikijs/engine-oniguruma@3.22.0': + resolution: {integrity: sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==} + + '@shikijs/langs@3.22.0': + resolution: {integrity: sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==} + + '@shikijs/themes@3.22.0': + resolution: {integrity: sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==} + + '@shikijs/types@3.22.0': + resolution: {integrity: sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@simplewebauthn/browser@13.2.2': + resolution: {integrity: sha512-FNW1oLQpTJyqG5kkDg5ZsotvWgmBaC6jCHR7Ej0qUNep36Wl9tj2eZu7J5rP+uhXgHaLk+QQ3lqcw2vS5MX1IA==} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@so-ric/colorspace@1.1.6': + resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} + + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + + '@solana-program/compute-budget@0.11.0': + resolution: {integrity: sha512-7f1ePqB/eURkTwTOO9TNIdUXZcyrZoX3Uy2hNo7cXMfNhPFWp9AVgIyRNBc2jf15sdUa9gNpW+PfP2iV8AYAaw==} + peerDependencies: + '@solana/kit': ^5.0 + + '@solana-program/compute-budget@0.8.0': + resolution: {integrity: sha512-qPKxdxaEsFxebZ4K5RPuy7VQIm/tfJLa1+Nlt3KNA8EYQkz9Xm8htdoEaXVrer9kpgzzp9R3I3Bh6omwCM06tQ==} + peerDependencies: + '@solana/kit': ^2.1.0 + + '@solana-program/system@0.10.0': + resolution: {integrity: sha512-Go+LOEZmqmNlfr+Gjy5ZWAdY5HbYzk2RBewD9QinEU/bBSzpFfzqDRT55JjFRBGJUvMgf3C2vfXEGT4i8DSI4g==} + peerDependencies: + '@solana/kit': ^5.0 + + '@solana-program/token-2022@0.4.2': + resolution: {integrity: sha512-zIpR5t4s9qEU3hZKupzIBxJ6nUV5/UVyIT400tu9vT1HMs5JHxaTTsb5GUhYjiiTvNwU0MQavbwc4Dl29L0Xvw==} + peerDependencies: + '@solana/kit': ^2.1.0 + '@solana/sysvars': ^2.1.0 + + '@solana-program/token-2022@0.6.1': + resolution: {integrity: sha512-Ex02cruDMGfBMvZZCrggVR45vdQQSI/unHVpt/7HPt/IwFYB4eTlXtO8otYZyqV/ce5GqZ8S6uwyRf0zy6fdbA==} + peerDependencies: + '@solana/kit': ^5.0 + '@solana/sysvars': ^5.0 + + '@solana-program/token@0.5.1': + resolution: {integrity: sha512-bJvynW5q9SFuVOZ5vqGVkmaPGA0MCC+m9jgJj1nk5m20I389/ms69ASnhWGoOPNcie7S9OwBX0gTj2fiyWpfag==} + peerDependencies: + '@solana/kit': ^2.1.0 + + '@solana-program/token@0.9.0': + resolution: {integrity: sha512-vnZxndd4ED4Fc56sw93cWZ2djEeeOFxtaPS8SPf5+a+JZjKA/EnKqzbE1y04FuMhIVrLERQ8uR8H2h72eZzlsA==} + peerDependencies: + '@solana/kit': ^5.0 + + '@solana/accounts@2.3.0': + resolution: {integrity: sha512-QgQTj404Z6PXNOyzaOpSzjgMOuGwG8vC66jSDB+3zHaRcEPRVRd2sVSrd1U6sHtnV3aiaS6YyDuPQMheg4K2jw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/accounts@5.5.1': + resolution: {integrity: sha512-TfOY9xixg5rizABuLVuZ9XI2x2tmWUC/OoN556xwfDlhBHBjKfszicYYOyD6nbFmwTGYarCmyGIdteXxTXIdhQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/addresses@2.3.0': + resolution: {integrity: sha512-ypTNkY2ZaRFpHLnHAgaW8a83N0/WoqdFvCqf4CQmnMdFsZSdC7qOwcbd7YzdaQn9dy+P2hybewzB+KP7LutxGA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/addresses@5.5.1': + resolution: {integrity: sha512-5xoah3Q9G30HQghu/9BiHLb5pzlPKRC3zydQDmE3O9H//WfayxTFppsUDCL6FjYUHqj/wzK6CWHySglc2RkpdA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/assertions@2.3.0': + resolution: {integrity: sha512-Ekoet3khNg3XFLN7MIz8W31wPQISpKUGDGTylLptI+JjCDWx3PIa88xjEMqFo02WJ8sBj2NLV64Xg1sBcsHjZQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/assertions@5.5.1': + resolution: {integrity: sha512-YTCSWAlGwSlVPnWtWLm3ukz81wH4j2YaCveK+TjpvUU88hTy6fmUqxi0+hvAMAe4zKXpJyj3Az7BrLJRxbIm4Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/buffer-layout@4.0.1': + resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} + engines: {node: '>=5.10'} + + '@solana/codecs-core@2.3.0': + resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-core@5.5.1': + resolution: {integrity: sha512-TgBt//bbKBct0t6/MpA8ElaOA3sa8eYVvR7LGslCZ84WiAwwjCY0lW/lOYsFHJQzwREMdUyuEyy5YWBKtdh8Rw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/codecs-data-structures@2.3.0': + resolution: {integrity: sha512-qvU5LE5DqEdYMYgELRHv+HMOx73sSoV1ZZkwIrclwUmwTbTaH8QAJURBj0RhQ/zCne7VuLLOZFFGv6jGigWhSw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-data-structures@5.5.1': + resolution: {integrity: sha512-97bJWGyUY9WvBz3mX1UV3YPWGDTez6btCfD0ip3UVEXJbItVuUiOkzcO5iFDUtQT5riKT6xC+Mzl+0nO76gd0w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/codecs-numbers@2.3.0': + resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-numbers@5.5.1': + resolution: {integrity: sha512-rllMIZAHqmtvC0HO/dc/21wDuWaD0B8Ryv8o+YtsICQBuiL/0U4AGwH7Pi5GNFySYk0/crSuwfIqQFtmxNSPFw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/codecs-strings@2.3.0': + resolution: {integrity: sha512-y5pSBYwzVziXu521hh+VxqUtp0hYGTl1eWGoc1W+8mdvBdC1kTqm/X7aYQw33J42hw03JjryvYOvmGgk3Qz/Ug==} + engines: {node: '>=20.18.0'} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: '>=5.3.3' + + '@solana/codecs-strings@5.5.1': + resolution: {integrity: sha512-7klX4AhfHYA+uKKC/nxRGP2MntbYQCR3N6+v7bk1W/rSxYuhNmt+FN8aoThSZtWIKwN6BEyR1167ka8Co1+E7A==} + engines: {node: '>=20.18.0'} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: ^5.0.0 + peerDependenciesMeta: + fastestsmallesttextencoderdecoder: + optional: true + typescript: + optional: true + + '@solana/codecs@2.3.0': + resolution: {integrity: sha512-JVqGPkzoeyU262hJGdH64kNLH0M+Oew2CIPOa/9tR3++q2pEd4jU2Rxdfye9sd0Ce3XJrR5AIa8ZfbyQXzjh+g==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs@5.5.1': + resolution: {integrity: sha512-Vea29nJub/bXjfzEV7ZZQ/PWr1pYLZo3z0qW0LQL37uKKVzVFRQlwetd7INk3YtTD3xm9WUYr7bCvYUk3uKy2g==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/errors@2.3.0': + resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: '>=5.3.3' + + '@solana/errors@5.5.1': + resolution: {integrity: sha512-vFO3p+S7HoyyrcAectnXbdsMfwUzY2zYFUc2DEe5BwpiE9J1IAxPBGjOWO6hL1bbYdBrlmjNx8DXCslqS+Kcmg==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/fast-stable-stringify@2.3.0': + resolution: {integrity: sha512-KfJPrMEieUg6D3hfQACoPy0ukrAV8Kio883llt/8chPEG3FVTX9z/Zuf4O01a15xZmBbmQ7toil2Dp0sxMJSxw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/fast-stable-stringify@5.5.1': + resolution: {integrity: sha512-Ni7s2FN33zTzhTFgRjEbOVFO+UAmK8qi3Iu0/GRFYK4jN696OjKHnboSQH/EacQ+yGqS54bfxf409wU5dsLLCw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/functional@2.3.0': + resolution: {integrity: sha512-AgsPh3W3tE+nK3eEw/W9qiSfTGwLYEvl0rWaxHht/lRcuDVwfKRzeSa5G79eioWFFqr+pTtoCr3D3OLkwKz02Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/functional@5.5.1': + resolution: {integrity: sha512-tTHoJcEQq3gQx5qsdsDJ0LEJeFzwNpXD80xApW9o/PPoCNimI3SALkZl+zNW8VnxRrV3l3yYvfHWBKe/X3WG3w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/instruction-plans@5.5.1': + resolution: {integrity: sha512-7z3CB7YMcFKuVvgcnNY8bY6IsZ8LG61Iytbz7HpNVGX2u1RthOs1tRW8luTzSG1MPL0Ox7afyAVMYeFqSPHnaQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/instructions@2.3.0': + resolution: {integrity: sha512-PLMsmaIKu7hEAzyElrk2T7JJx4D+9eRwebhFZpy2PXziNSmFF929eRHKUsKqBFM3cYR1Yy3m6roBZfA+bGE/oQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/instructions@5.5.1': + resolution: {integrity: sha512-h0G1CG6S+gUUSt0eo6rOtsaXRBwCq1+Js2a+Ps9Bzk9q7YHNFA75/X0NWugWLgC92waRp66hrjMTiYYnLBoWOQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/keys@2.3.0': + resolution: {integrity: sha512-ZVVdga79pNH+2pVcm6fr2sWz9HTwfopDVhYb0Lh3dh+WBmJjwkabXEIHey2rUES7NjFa/G7sV8lrUn/v8LDCCQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/keys@5.5.1': + resolution: {integrity: sha512-KRD61cL7CRL+b4r/eB9dEoVxIf/2EJ1Pm1DmRYhtSUAJD2dJ5Xw8QFuehobOGm9URqQ7gaQl+Fkc1qvDlsWqKg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/kit@2.3.0': + resolution: {integrity: sha512-sb6PgwoW2LjE5oTFu4lhlS/cGt/NB3YrShEyx7JgWFWysfgLdJnhwWThgwy/4HjNsmtMrQGWVls0yVBHcMvlMQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/kit@5.5.1': + resolution: {integrity: sha512-irKUGiV2yRoyf+4eGQ/ZeCRxa43yjFEL1DUI5B0DkcfZw3cr0VJtVJnrG8OtVF01vT0OUfYOcUn6zJW5TROHvQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/nominal-types@2.3.0': + resolution: {integrity: sha512-uKlMnlP4PWW5UTXlhKM8lcgIaNj8dvd8xO4Y9l+FVvh9RvW2TO0GwUO6JCo7JBzCB0PSqRJdWWaQ8pu1Ti/OkA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/nominal-types@5.5.1': + resolution: {integrity: sha512-I1ImR+kfrLFxN5z22UDiTWLdRZeKtU0J/pkWkO8qm/8WxveiwdIv4hooi8pb6JnlR4mSrWhq0pCIOxDYrL9GIQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/offchain-messages@5.5.1': + resolution: {integrity: sha512-g+xHH95prTU+KujtbOzj8wn+C7ZNoiLhf3hj6nYq3MTyxOXtBEysguc97jJveUZG0K97aIKG6xVUlMutg5yxhw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/options@2.3.0': + resolution: {integrity: sha512-PPnnZBRCWWoZQ11exPxf//DRzN2C6AoFsDI/u2AsQfYih434/7Kp4XLpfOMT/XESi+gdBMFNNfbES5zg3wAIkw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/options@5.5.1': + resolution: {integrity: sha512-eo971c9iLNLmk+yOFyo7yKIJzJ/zou6uKpy6mBuyb/thKtS/haiKIc3VLhyTXty3OH2PW8yOlORJnv4DexJB8A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/plugin-core@5.5.1': + resolution: {integrity: sha512-VUZl30lDQFJeiSyNfzU1EjYt2QZvoBFKEwjn1lilUJw7KgqD5z7mbV7diJhT+dLFs36i0OsjXvq5kSygn8YJ3A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/programs@2.3.0': + resolution: {integrity: sha512-UXKujV71VCI5uPs+cFdwxybtHZAIZyQkqDiDnmK+DawtOO9mBn4Nimdb/6RjR2CXT78mzO9ZCZ3qfyX+ydcB7w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/programs@5.5.1': + resolution: {integrity: sha512-7U9kn0Jsx1NuBLn5HRTFYh78MV4XN145Yc3WP/q5BlqAVNlMoU9coG5IUTJIG847TUqC1lRto3Dnpwm6T4YRpA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/promises@2.3.0': + resolution: {integrity: sha512-GjVgutZKXVuojd9rWy1PuLnfcRfqsaCm7InCiZc8bqmJpoghlyluweNc7ml9Y5yQn1P2IOyzh9+p/77vIyNybQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/promises@5.5.1': + resolution: {integrity: sha512-T9lfuUYkGykJmppEcssNiCf6yiYQxJkhiLPP+pyAc2z84/7r3UVIb2tNJk4A9sucS66pzJnVHZKcZVGUUp6wzA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-api@2.3.0': + resolution: {integrity: sha512-UUdiRfWoyYhJL9PPvFeJr4aJ554ob2jXcpn4vKmRVn9ire0sCbpQKYx6K8eEKHZWXKrDW8IDspgTl0gT/aJWVg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-api@5.5.1': + resolution: {integrity: sha512-XWOQQPhKl06Vj0xi3RYHAc6oEQd8B82okYJ04K7N0Vvy3J4PN2cxeK7klwkjgavdcN9EVkYCChm2ADAtnztKnA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-parsed-types@2.3.0': + resolution: {integrity: sha512-B5pHzyEIbBJf9KHej+zdr5ZNAdSvu7WLU2lOUPh81KHdHQs6dEb310LGxcpCc7HVE8IEdO20AbckewDiAN6OCg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-parsed-types@5.5.1': + resolution: {integrity: sha512-HEi3G2nZqGEsa3vX6U0FrXLaqnUCg4SKIUrOe8CezD+cSFbRTOn3rCLrUmJrhVyXlHoQVaRO9mmeovk31jWxJg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-spec-types@2.3.0': + resolution: {integrity: sha512-xQsb65lahjr8Wc9dMtP7xa0ZmDS8dOE2ncYjlvfyw/h4mpdXTUdrSMi6RtFwX33/rGuztQ7Hwaid5xLNSLvsFQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-spec-types@5.5.1': + resolution: {integrity: sha512-6OFKtRpIEJQs8Jb2C4OO8KyP2h2Hy1MFhatMAoXA+0Ik8S3H+CicIuMZvGZ91mIu/tXicuOOsNNLu3HAkrakrw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-spec@2.3.0': + resolution: {integrity: sha512-fA2LMX4BMixCrNB2n6T83AvjZ3oUQTu7qyPLyt8gHQaoEAXs8k6GZmu6iYcr+FboQCjUmRPgMaABbcr9j2J9Sw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-spec@5.5.1': + resolution: {integrity: sha512-m3LX2bChm3E3by4mQrH4YwCAFY57QBzuUSWqlUw7ChuZ+oLLOq7b2czi4i6L4Vna67j3eCmB3e+4tqy1j5wy7Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions-api@2.3.0': + resolution: {integrity: sha512-9mCjVbum2Hg9KGX3LKsrI5Xs0KX390lS+Z8qB80bxhar6MJPugqIPH8uRgLhCW9GN3JprAfjRNl7our8CPvsPQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-subscriptions-api@5.5.1': + resolution: {integrity: sha512-5Oi7k+GdeS8xR2ly1iuSFkAv6CZqwG0Z6b1QZKbEgxadE1XGSDrhM2cn59l+bqCozUWCqh4c/A2znU/qQjROlw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions-channel-websocket@2.3.0': + resolution: {integrity: sha512-2oL6ceFwejIgeWzbNiUHI2tZZnaOxNTSerszcin7wYQwijxtpVgUHiuItM/Y70DQmH9sKhmikQp+dqeGalaJxw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + ws: ^8.18.0 + + '@solana/rpc-subscriptions-channel-websocket@5.5.1': + resolution: {integrity: sha512-7tGfBBrYY8TrngOyxSHoCU5shy86iA9SRMRrPSyBhEaZRAk6dnbdpmUTez7gtdVo0BCvh9nzQtUycKWSS7PnFQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions-spec@2.3.0': + resolution: {integrity: sha512-rdmVcl4PvNKQeA2l8DorIeALCgJEMSu7U8AXJS1PICeb2lQuMeaR+6cs/iowjvIB0lMVjYN2sFf6Q3dJPu6wWg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-subscriptions-spec@5.5.1': + resolution: {integrity: sha512-iq+rGq5fMKP3/mKHPNB6MC8IbVW41KGZg83Us/+LE3AWOTWV1WT20KT2iH1F1ik9roi42COv/TpoZZvhKj45XQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions@2.3.0': + resolution: {integrity: sha512-Uyr10nZKGVzvCOqwCZgwYrzuoDyUdwtgQRefh13pXIrdo4wYjVmoLykH49Omt6abwStB0a4UL5gX9V4mFdDJZg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-subscriptions@5.5.1': + resolution: {integrity: sha512-CTMy5bt/6mDh4tc6vUJms9EcuZj3xvK0/xq8IQ90rhkpYvate91RjBP+egvjgSayUg9yucU9vNuUpEjz4spM7w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-transformers@2.3.0': + resolution: {integrity: sha512-UuHYK3XEpo9nMXdjyGKkPCOr7WsZsxs7zLYDO1A5ELH3P3JoehvrDegYRAGzBS2VKsfApZ86ZpJToP0K3PhmMA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-transformers@5.5.1': + resolution: {integrity: sha512-OsWqLCQdcrRJKvHiMmwFhp9noNZ4FARuMkHT5us3ustDLXaxOjF0gfqZLnMkulSLcKt7TGXqMhBV+HCo7z5M8Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-transport-http@2.3.0': + resolution: {integrity: sha512-HFKydmxGw8nAF5N+S0NLnPBDCe5oMDtI2RAmW8DMqP4U3Zxt2XWhvV1SNkAldT5tF0U1vP+is6fHxyhk4xqEvg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-transport-http@5.5.1': + resolution: {integrity: sha512-yv8GoVSHqEV0kUJEIhkdOVkR2SvJ6yoWC51cJn2rSV7plr6huLGe0JgujCmB7uZhhaLbcbP3zxXxu9sOjsi7Fg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-types@2.3.0': + resolution: {integrity: sha512-O09YX2hED2QUyGxrMOxQ9GzH1LlEwwZWu69QbL4oYmIf6P5dzEEHcqRY6L1LsDVqc/dzAdEs/E1FaPrcIaIIPw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-types@5.5.1': + resolution: {integrity: sha512-bibTFQ7PbHJJjGJPmfYC2I+/5CRFS4O2p9WwbFraX1Keeel+nRrt/NBXIy8veP5AEn2sVJIyJPpWBRpCx1oATA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc@2.3.0': + resolution: {integrity: sha512-ZWN76iNQAOCpYC7yKfb3UNLIMZf603JckLKOOLTHuy9MZnTN8XV6uwvDFhf42XvhglgUjGCEnbUqWtxQ9pa/pQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc@5.5.1': + resolution: {integrity: sha512-ku8zTUMrkCWci66PRIBC+1mXepEnZH/q1f3ck0kJZ95a06bOTl5KU7HeXWtskkyefzARJ5zvCs54AD5nxjQJ+A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/signers@2.3.0': + resolution: {integrity: sha512-OSv6fGr/MFRx6J+ZChQMRqKNPGGmdjkqarKkRzkwmv7v8quWsIRnJT5EV8tBy3LI4DLO/A8vKiNSPzvm1TdaiQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/signers@5.5.1': + resolution: {integrity: sha512-FY0IVaBT2kCAze55vEieR6hag4coqcuJ31Aw3hqRH7mv6sV8oqwuJmUrx+uFwOp1gwd5OEAzlv6N4hOOple4sQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/subscribable@2.3.0': + resolution: {integrity: sha512-DkgohEDbMkdTWiKAoatY02Njr56WXx9e/dKKfmne8/Ad6/2llUIrax78nCdlvZW9quXMaXPTxZvdQqo9N669Og==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/subscribable@5.5.1': + resolution: {integrity: sha512-9K0PsynFq0CsmK1CDi5Y2vUIJpCqkgSS5yfDN0eKPgHqEptLEaia09Kaxc90cSZDZU5mKY/zv1NBmB6Aro9zQQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/sysvars@2.3.0': + resolution: {integrity: sha512-LvjADZrpZ+CnhlHqfI5cmsRzX9Rpyb1Ox2dMHnbsRNzeKAMhu9w4ZBIaeTdO322zsTr509G1B+k2ABD3whvUBA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/sysvars@5.5.1': + resolution: {integrity: sha512-k3Quq87Mm+geGUu1GWv6knPk0ALsfY6EKSJGw9xUJDHzY/RkYSBnh0RiOrUhtFm2TDNjOailg8/m0VHmi3reFA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/transaction-confirmation@2.3.0': + resolution: {integrity: sha512-UiEuiHCfAAZEKdfne/XljFNJbsKAe701UQHKXEInYzIgBjRbvaeYZlBmkkqtxwcasgBTOmEaEKT44J14N9VZDw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/transaction-confirmation@5.5.1': + resolution: {integrity: sha512-j4mKlYPHEyu+OD7MBt3jRoX4ScFgkhZC6H65on4Fux6LMScgivPJlwnKoZMnsgxFgWds0pl+BYzSiALDsXlYtw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/transaction-messages@2.3.0': + resolution: {integrity: sha512-bgqvWuy3MqKS5JdNLH649q+ngiyOu5rGS3DizSnWwYUd76RxZl1kN6CoqHSrrMzFMvis6sck/yPGG3wqrMlAww==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/transaction-messages@5.5.1': + resolution: {integrity: sha512-aXyhMCEaAp3M/4fP0akwBBQkFPr4pfwoC5CLDq999r/FUwDax2RE/h4Ic7h2Xk+JdcUwsb+rLq85Y52hq84XvQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/transactions@2.3.0': + resolution: {integrity: sha512-LnTvdi8QnrQtuEZor5Msje61sDpPstTVwKg4y81tNxDhiyomjuvnSNLAq6QsB9gIxUqbNzPZgOG9IU4I4/Uaug==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/transactions@5.5.1': + resolution: {integrity: sha512-8hHtDxtqalZ157pnx6p8k10D7J/KY/biLzfgh9R09VNLLY3Fqi7kJvJCr7M2ik3oRll56pxhraAGCC9yIT6eOA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/wallet-standard-features@1.3.0': + resolution: {integrity: sha512-ZhpZtD+4VArf6RPitsVExvgkF+nGghd1rzPjd97GmBximpnt1rsUxMOEyoIEuH3XBxPyNB6Us7ha7RHWQR+abg==} + engines: {node: '>=16'} + + '@solana/web3.js@1.98.4': + resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + + '@swc/helpers@0.5.18': + resolution: {integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==} + + '@tailwindcss/node@4.1.18': + resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} + + '@tailwindcss/oxide-android-arm64@4.1.18': + resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.18': + resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.18': + resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.18': + resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': + resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': + resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.18': + resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.18': + resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.18': + resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.1.18': + resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': + resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.18': + resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.18': + resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==} + engines: {node: '>= 10'} + + '@tailwindcss/postcss@4.1.18': + resolution: {integrity: sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==} + + '@tanstack/query-core@5.90.20': + resolution: {integrity: sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==} + + '@tanstack/react-query@5.90.20': + resolution: {integrity: sha512-vXBxa+qeyveVO7OA0jX1z+DeyCA4JKnThKv411jd5SORpBKgkcVnYKCiBgECvADvniBX7tobwBmg01qq9JmMJw==} + peerDependencies: + react: ^18 || ^19 + + '@tanstack/react-virtual@3.13.18': + resolution: {integrity: sha512-dZkhyfahpvlaV0rIKnvQiVoWPyURppl6w4m9IwMDpuIjcJ1sD9YGWrt0wISvgU7ewACXx2Ct46WPgI6qAD4v6A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tanstack/virtual-core@3.13.18': + resolution: {integrity: sha512-Mx86Hqu1k39icq2Zusq+Ey2J6dDWTjDvEv43PJtRCoEYTLyfaPnxIQ6iy7YAOK0NV/qOEmZQ/uCufrppZxTgcg==} + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/d3-array@3.2.2': + resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} + + '@types/d3-axis@3.0.6': + resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} + + '@types/d3-brush@3.0.6': + resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} + + '@types/d3-chord@3.0.6': + resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-contour@3.0.6': + resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} + + '@types/d3-delaunay@6.0.4': + resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} + + '@types/d3-dispatch@3.0.7': + resolution: {integrity: sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==} + + '@types/d3-drag@3.0.7': + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + + '@types/d3-dsv@3.0.7': + resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-fetch@3.0.7': + resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} + + '@types/d3-force@3.0.10': + resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} + + '@types/d3-format@3.0.4': + resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} + + '@types/d3-geo@3.1.0': + resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + + '@types/d3-hierarchy@3.1.7': + resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.1': + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + + '@types/d3-polygon@3.0.2': + resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} + + '@types/d3-quadtree@3.0.6': + resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} + + '@types/d3-random@3.0.3': + resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} + + '@types/d3-scale-chromatic@3.1.0': + resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} + + '@types/d3-scale@4.0.9': + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + + '@types/d3-selection@3.0.11': + resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} + + '@types/d3-shape@3.1.8': + resolution: {integrity: sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==} + + '@types/d3-time-format@4.0.3': + resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/d3-transition@3.0.9': + resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} + + '@types/d3-zoom@3.0.8': + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + + '@types/d3@7.4.3': + resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/diff-match-patch@1.0.36': + resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + + '@types/hast@2.3.10': + resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/html-to-text@9.0.4': + resolution: {integrity: sha512-pUY3cKH/Nm2yYrEmDlPR1mR7yszjGx4DrwPjQ702C4/D5CwHuZTgZdIdwPkRbcuhs7BAh2L5rg3CL5cbRiGTCQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/katex@0.16.8': + resolution: {integrity: sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==} + + '@types/lodash@4.17.23': + resolution: {integrity: sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==} + + '@types/mdast@3.0.15': + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node-fetch@2.6.13': + resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/node@18.19.130': + resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} + + '@types/node@20.19.30': + resolution: {integrity: sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==} + + '@types/node@22.19.7': + resolution: {integrity: sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw==} + + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@19.2.10': + resolution: {integrity: sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==} + + '@types/retry@0.12.0': + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + + '@types/stylis@4.2.7': + resolution: {integrity: sha512-VgDNokpBoKF+wrdvhAAfS55OMQpL6QRglwTwNC3kIgBrzZxA4WsFj+2eLfEA/uMUDzBcEhYmjSbwQakn/i3ajA==} + + '@types/triple-beam@1.3.5': + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/uuid@10.0.0': + resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + + '@types/uuid@8.3.4': + resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} + + '@types/validator@13.15.10': + resolution: {integrity: sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==} + + '@types/ws@7.4.7': + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + '@typescript-eslint/eslint-plugin@8.54.0': + resolution: {integrity: sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.54.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/parser@8.54.0': + resolution: {integrity: sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.54.0': + resolution: {integrity: sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/scope-manager@8.54.0': + resolution: {integrity: sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.54.0': + resolution: {integrity: sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.54.0': + resolution: {integrity: sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/types@8.54.0': + resolution: {integrity: sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.54.0': + resolution: {integrity: sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@8.54.0': + resolution: {integrity: sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/visitor-keys@8.54.0': + resolution: {integrity: sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript/vfs@1.6.2': + resolution: {integrity: sha512-hoBwJwcbKHmvd2QVebiytN1aELvpk9B74B4L1mFm/XT1Q/VOYAWl2vQ9AWRFtQq8zmz6enTpfTV8WRc4ATjW/g==} + peerDependencies: + typescript: '*' + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} + cpu: [arm] + os: [android] + + '@unrs/resolver-binding-android-arm64@1.11.1': + resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} + cpu: [arm64] + os: [android] + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.11.1': + resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} + cpu: [ppc64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} + cpu: [s390x] + os: [linux] + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} + cpu: [x64] + os: [win32] + + '@urql/core@5.2.0': + resolution: {integrity: sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==} + + '@vercel/oidc@3.1.0': + resolution: {integrity: sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==} + engines: {node: '>= 20'} + + '@vitest/coverage-v8@4.0.18': + resolution: {integrity: sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg==} + peerDependencies: + '@vitest/browser': 4.0.18 + vitest: 4.0.18 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/expect@4.0.18': + resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} + + '@vitest/mocker@4.0.18': + resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@4.0.18': + resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} + + '@vitest/runner@4.0.18': + resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} + + '@vitest/snapshot@4.0.18': + resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} + + '@vitest/spy@4.0.18': + resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} + + '@vitest/utils@4.0.18': + resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} + + '@wagmi/connectors@6.2.0': + resolution: {integrity: sha512-2NfkbqhNWdjfibb4abRMrn7u6rPjEGolMfApXss6HCDVt9AW2oVC6k8Q5FouzpJezElxLJSagWz9FW1zaRlanA==} + peerDependencies: + '@wagmi/core': 2.22.1 + typescript: '>=5.0.4' + viem: 2.x + peerDependenciesMeta: + typescript: + optional: true + + '@wagmi/core@2.22.1': + resolution: {integrity: sha512-cG/xwQWsBEcKgRTkQVhH29cbpbs/TdcUJVFXCyri3ZknxhMyGv0YEjTcrNpRgt2SaswL1KrvslSNYKKo+5YEAg==} + peerDependencies: + '@tanstack/query-core': '>=5.0.0' + typescript: '>=5.0.4' + viem: 2.x + peerDependenciesMeta: + '@tanstack/query-core': + optional: true + typescript: + optional: true + + '@wallet-standard/app@1.1.0': + resolution: {integrity: sha512-3CijvrO9utx598kjr45hTbbeeykQrQfKmSnxeWOgU25TOEpvcipD/bYDQWIqUv1Oc6KK4YStokSMu/FBNecGUQ==} + engines: {node: '>=16'} + + '@wallet-standard/base@1.1.0': + resolution: {integrity: sha512-DJDQhjKmSNVLKWItoKThJS+CsJQjR9AOBOirBVT1F9YpRyC9oYHE+ZnSf8y8bxUphtKqdQMPVQ2mHohYdRvDVQ==} + engines: {node: '>=16'} + + '@wallet-standard/features@1.1.0': + resolution: {integrity: sha512-hiEivWNztx73s+7iLxsuD1sOJ28xtRix58W7Xnz4XzzA/pF0+aicnWgjOdA10doVDEDZdUuZCIIqG96SFNlDUg==} + engines: {node: '>=16'} + + '@wallet-standard/wallet@1.1.0': + resolution: {integrity: sha512-Gt8TnSlDZpAl+RWOOAB/kuvC7RpcdWAlFbHNoi4gsXsfaWa1QCT6LBcfIYTPdOZC9OVZUDwqGuGAcqZejDmHjg==} + engines: {node: '>=16'} + + '@walletconnect/core@2.21.0': + resolution: {integrity: sha512-o6R7Ua4myxR8aRUAJ1z3gT9nM+jd2B2mfamu6arzy1Cc6vi10fIwFWb6vg3bC8xJ6o9H3n/cN5TOW3aA9Y1XVw==} + engines: {node: '>=18'} + + '@walletconnect/core@2.21.1': + resolution: {integrity: sha512-Tp4MHJYcdWD846PH//2r+Mu4wz1/ZU/fr9av1UWFiaYQ2t2TPLDiZxjLw54AAEpMqlEHemwCgiRiAmjR1NDdTQ==} + engines: {node: '>=18'} + + '@walletconnect/core@2.21.9': + resolution: {integrity: sha512-SlSknLvbO4i9Y4y8zU0zeCuJv1klQIUX3HRSBs1BaYvQKVVkrdiWPgRj4jcrL2wEOINa9NXw6HXp6x5XCXOolA==} + engines: {node: '>=18.20.8'} + + '@walletconnect/core@2.22.4': + resolution: {integrity: sha512-ZQnyDDpqDPAk5lyLV19BRccQ3wwK3LmAwibuIv3X+44aT/dOs2kQGu9pla3iW2LgZ5qRMYvgvvfr5g3WlDGceQ==} + engines: {node: '>=18.20.8'} + + '@walletconnect/environment@1.0.1': + resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==} + + '@walletconnect/ethereum-provider@2.21.1': + resolution: {integrity: sha512-SSlIG6QEVxClgl1s0LMk4xr2wg4eT3Zn/Hb81IocyqNSGfXpjtawWxKxiC5/9Z95f1INyBD6MctJbL/R1oBwIw==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/ethereum-provider@2.22.4': + resolution: {integrity: sha512-qhBxU95nlndiKGz8lO8z9JlsA4Ai8i1via4VWut2fXsW1fkl6qXG9mYhDRFsbavuynUe3dQ+QLjBVDaaNkcKCA==} + + '@walletconnect/events@1.0.1': + resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==} + + '@walletconnect/heartbeat@1.2.2': + resolution: {integrity: sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==} + + '@walletconnect/jsonrpc-http-connection@1.0.8': + resolution: {integrity: sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw==} + + '@walletconnect/jsonrpc-provider@1.0.14': + resolution: {integrity: sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==} + + '@walletconnect/jsonrpc-types@1.0.4': + resolution: {integrity: sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==} + + '@walletconnect/jsonrpc-utils@1.0.8': + resolution: {integrity: sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==} + + '@walletconnect/jsonrpc-ws-connection@1.0.16': + resolution: {integrity: sha512-G81JmsMqh5nJheE1mPst1W0WfVv0SG3N7JggwLLGnI7iuDZJq8cRJvQwLGKHn5H1WTW7DEPCo00zz5w62AbL3Q==} + + '@walletconnect/keyvaluestorage@1.1.1': + resolution: {integrity: sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==} + peerDependencies: + '@react-native-async-storage/async-storage': 1.x + peerDependenciesMeta: + '@react-native-async-storage/async-storage': + optional: true + + '@walletconnect/logger@2.1.2': + resolution: {integrity: sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==} + + '@walletconnect/logger@3.0.0': + resolution: {integrity: sha512-DDktPBFdmt5d7U3sbp4e3fQHNS1b6amsR8FmtOnt6L2SnV7VfcZr8VmAGL12zetAR+4fndegbREmX0P8Mw6eDg==} + + '@walletconnect/relay-api@1.0.11': + resolution: {integrity: sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==} + + '@walletconnect/relay-auth@1.1.0': + resolution: {integrity: sha512-qFw+a9uRz26jRCDgL7Q5TA9qYIgcNY8jpJzI1zAWNZ8i7mQjaijRnWFKsCHAU9CyGjvt6RKrRXyFtFOpWTVmCQ==} + + '@walletconnect/safe-json@1.0.2': + resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} + + '@walletconnect/sign-client@2.21.0': + resolution: {integrity: sha512-z7h+PeLa5Au2R591d/8ZlziE0stJvdzP9jNFzFolf2RG/OiXulgFKum8PrIyXy+Rg2q95U9nRVUF9fWcn78yBA==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/sign-client@2.21.1': + resolution: {integrity: sha512-QaXzmPsMnKGV6tc4UcdnQVNOz4zyXgarvdIQibJ4L3EmLat73r5ZVl4c0cCOcoaV7rgM9Wbphgu5E/7jNcd3Zg==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/sign-client@2.21.9': + resolution: {integrity: sha512-EKLDS97o1rk/0XilD0nQdSR9SNgRsVoIK5M5HpS9sDTvHPv2EF5pIqu6Xr2vLsKcQ0KnCx+D5bnpav8Yh4NVZg==} + + '@walletconnect/sign-client@2.22.4': + resolution: {integrity: sha512-la+sol0KL33Fyx5DRlupHREIv8wA6W33bRfuLAfLm8pINRTT06j9rz0IHIqJihiALebFxVZNYzJnF65PhV0q3g==} + + '@walletconnect/time@1.0.2': + resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} + + '@walletconnect/types@2.21.0': + resolution: {integrity: sha512-ll+9upzqt95ZBWcfkOszXZkfnpbJJ2CmxMfGgE5GmhdxxxCcO5bGhXkI+x8OpiS555RJ/v/sXJYMSOLkmu4fFw==} + + '@walletconnect/types@2.21.1': + resolution: {integrity: sha512-UeefNadqP6IyfwWC1Yi7ux+ljbP2R66PLfDrDm8izmvlPmYlqRerJWJvYO4t0Vvr9wrG4Ko7E0c4M7FaPKT/sQ==} + + '@walletconnect/types@2.21.9': + resolution: {integrity: sha512-+82TRNX3lGRO96WyLISaBs/FkLts7y4hVgmOI4we84I7XdBu1xsjgiJj0JwYXnurz+X94lTqzOkzPps+wadWKw==} + + '@walletconnect/types@2.22.4': + resolution: {integrity: sha512-KJdiS9ezXzx1uASanldYaaenDwb42VOQ6Rj86H7FRwfYddhNnYnyEaDjDKOdToGRGcpt5Uzom6qYUOnrWEbp5g==} + + '@walletconnect/universal-provider@2.21.0': + resolution: {integrity: sha512-mtUQvewt+X0VBQay/xOJBvxsB3Xsm1lTwFjZ6WUwSOTR1X+FNb71hSApnV5kbsdDIpYPXeQUbGt2se1n5E5UBg==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/universal-provider@2.21.1': + resolution: {integrity: sha512-Wjx9G8gUHVMnYfxtasC9poGm8QMiPCpXpbbLFT+iPoQskDDly8BwueWnqKs4Mx2SdIAWAwuXeZ5ojk5qQOxJJg==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/universal-provider@2.21.9': + resolution: {integrity: sha512-dVA9DWSz9jYe37FW5GSRV5zlY9E7rX1kktcDGI7i1/9oG/z9Pk5UKp5r/DFys4Zjml9wZc46R/jlEgeBXTT06A==} + + '@walletconnect/universal-provider@2.22.4': + resolution: {integrity: sha512-TF2RNX13qxa0rrBAhVDs5+C2G8CHX7L0PH5hF2uyQHdGyxZ3pFbXf8rxmeW1yKlB76FSbW80XXNrUes6eK/xHg==} + + '@walletconnect/utils@2.21.0': + resolution: {integrity: sha512-zfHLiUoBrQ8rP57HTPXW7rQMnYxYI4gT9yTACxVW6LhIFROTF6/ytm5SKNoIvi4a5nX5dfXG4D9XwQUCu8Ilig==} + + '@walletconnect/utils@2.21.1': + resolution: {integrity: sha512-VPZvTcrNQCkbGOjFRbC24mm/pzbRMUq2DSQoiHlhh0X1U7ZhuIrzVtAoKsrzu6rqjz0EEtGxCr3K1TGRqDG4NA==} + + '@walletconnect/utils@2.21.9': + resolution: {integrity: sha512-FHagysDvp7yQl+74veIeuqwZZnMiTyTW3Lw0NXsbIKnlmlSQu5pma+4EnRD/CnSzbN6PV39k2t1KBaaZ4PjDgg==} + + '@walletconnect/utils@2.22.4': + resolution: {integrity: sha512-coAPrNiTiD+snpiXQyXakMVeYcddqVqII7aLU39TeILdPoXeNPc2MAja+MF7cKNM/PA3tespljvvxck/oTm4+Q==} + + '@walletconnect/window-getters@1.0.1': + resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} + + '@walletconnect/window-metadata@1.0.1': + resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} + + '@whatwg-node/disposablestack@0.0.6': + resolution: {integrity: sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/events@0.1.2': + resolution: {integrity: sha512-ApcWxkrs1WmEMS2CaLLFUEem/49erT3sxIVjpzU5f6zmVcnijtDSrhoK2zVobOIikZJdH63jdAXOrvjf6eOUNQ==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/fetch@0.10.13': + resolution: {integrity: sha512-b4PhJ+zYj4357zwk4TTuF2nEe0vVtOrwdsrNo5hL+u1ojXNhh1FgJ6pg1jzDlwlT4oBdzfSwaBwMCtFCsIWg8Q==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/node-fetch@0.8.5': + resolution: {integrity: sha512-4xzCl/zphPqlp9tASLVeUhB5+WJHbuWGYpfoC2q1qh5dw0AqZBW7L27V5roxYWijPxj4sspRAAoOH3d2ztaHUQ==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/promise-helpers@1.3.2': + resolution: {integrity: sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==} + engines: {node: '>=16.0.0'} + + '@whatwg-node/server@0.10.18': + resolution: {integrity: sha512-kMwLlxUbduttIgaPdSkmEarFpP+mSY8FEm+QWMBRJwxOHWkri+cxd8KZHO9EMrB9vgUuz+5WEaCawaL5wGVoXg==} + engines: {node: '>=18.0.0'} + + 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 + + abitype@1.0.8: + resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + abitype@1.2.3: + resolution: {integrity: sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3.22.0 || ^4.0.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + + ai@4.3.19: + resolution: {integrity: sha512-dIE2bfNpqHN3r6IINp9znguYdhIOheKW2LDigAMrgt/upT3B8eBGPSCblENvaZGoq+hxaN9fSMzjWpbqloP+7Q==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.23.8 + peerDependenciesMeta: + react: + optional: true + + ai@5.0.124: + resolution: {integrity: sha512-Li6Jw9F9qsvFJXZPBfxj38ddP2iURCnMs96f9Q3OeQzrDVcl1hvtwSEAuxA/qmfh6SDV2ERqFUOFzigvr0697g==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + + ast-v8-to-istanbul@0.3.11: + resolution: {integrity: sha512-Qya9fkoofMjCBNVdWINMjB5KZvkYfaO9/anwkWnjxibpWUxo5iHl2sOdP7/uAqaRuUYuoo8rDwnbaaKVFxoUvw==} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + async-mutex@0.2.6: + resolution: {integrity: sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + autoprefixer@10.4.24: + resolution: {integrity: sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axe-core@4.11.1: + resolution: {integrity: sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==} + engines: {node: '>=4'} + + axios-retry@4.5.0: + resolution: {integrity: sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ==} + peerDependencies: + axios: 0.x || 1.x + + axios@1.13.4: + resolution: {integrity: sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-x@3.0.11: + resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} + + base-x@5.0.1: + resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + baseline-browser-mapping@2.9.19: + resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} + hasBin: true + + big.js@6.2.2: + resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==} + + binary-search@1.3.6: + resolution: {integrity: sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==} + + blakejs@1.2.1: + resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} + + bn.js@5.2.2: + resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} + + body-parser@1.20.4: + resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + body-parser@2.2.2: + resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} + engines: {node: '>=18'} + + borsh@0.7.0: + resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} + + bowser@2.13.1: + resolution: {integrity: sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + + bs58@6.0.0: + resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bufferutil@4.1.0: + resolution: {integrity: sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==} + engines: {node: '>=6.14.2'} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + + caniuse-lite@1.0.30001766: + resolution: {integrity: sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==} + + canonicalize@2.1.0: + resolution: {integrity: sha512-F705O3xrsUtgt98j7leetNhTWPe+5S72rlL5O4jA1pKqBVQ/dT1O1D6PFxmSXvc0SUOinWS57DKx0I3CHrXJHQ==} + hasBin: true + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + + chevrotain-allstar@0.3.1: + resolution: {integrity: sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==} + peerDependencies: + chevrotain: ^11.0.0 + + chevrotain@11.0.3: + resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + class-transformer@0.5.1: + resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} + + class-validator@0.14.3: + resolution: {integrity: sha512-rXXekcjofVN1LTOSw+u4u9WXVEUvNBVjORW154q/IdmYWy1nMbOU9aNtZB0t8m+FJQ9q91jlr2f9CwwUFdFMRA==} + + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-spinners@3.4.0: + resolution: {integrity: sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==} + engines: {node: '>=18.20'} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + + clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-convert@3.1.3: + resolution: {integrity: sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==} + engines: {node: '>=14.6'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-name@2.1.0: + resolution: {integrity: sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==} + engines: {node: '>=12.20'} + + color-string@2.1.4: + resolution: {integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==} + engines: {node: '>=18'} + + color@5.0.3: + resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==} + engines: {node: '>=18'} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + colors@1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@1.0.8: + resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + + commander@14.0.2: + resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} + engines: {node: '>=20'} + + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + console-table-printer@2.15.0: + resolution: {integrity: sha512-SrhBq4hYVjLCkBVOWaTzceJalvn5K1Zq5aQA6wXC/cYjI3frKWNPEMK3sZsJfNNQApvCQmgBcc13ZKmFj8qExw==} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-disposition@1.0.1: + resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} + engines: {node: '>=18'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-es@1.2.2: + resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} + + cookie-signature@1.0.7: + resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + copy-anything@4.0.5: + resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} + engines: {node: '>=18'} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + engines: {node: '>= 0.10'} + + cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + + cose-base@2.2.0: + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + create-langgraph@1.1.5: + resolution: {integrity: sha512-BKKkSLvzeyoZCq3rM0F/YsPlG+p3EWEg9ZV1OgQpZpf4Fc7QWsdlCf/n/USS97m9hdMJTVjLiv7DMaqfKs9JgA==} + hasBin: true + + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + + cross-fetch@4.1.0: + resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==} + + cross-inspect@1.0.1: + resolution: {integrity: sha512-Pcw1JTvZLSJH83iiGWt6fRcT+BjZlCDRVwYLbUcHzv/CRpB7r0MlSrGbIyQvVSNyGnbt7G4AXuyCiDR3POvZ1A==} + engines: {node: '>=16.0.0'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + + crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + + css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + + css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + cytoscape-cose-bilkent@4.1.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape-fcose@2.2.0: + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape@3.33.1: + resolution: {integrity: sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==} + engines: {node: '>=0.10'} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@3.1.2: + resolution: {integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==} + engines: {node: '>=12'} + + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} + + dagre-d3-es@7.0.13: + resolution: {integrity: sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==} + + damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + + dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + dayjs@1.11.19: + resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + dedent@1.7.1: + resolution: {integrity: sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.4.0: + resolution: {integrity: sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==} + engines: {node: '>=18'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + + delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + + delay@5.0.0: + resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} + engines: {node: '>=10'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + derive-valtio@0.1.0: + resolution: {integrity: sha512-OCg2UsLbXK7GmmpzMXhYkdO64vhJ1ROUUGaTFyHjVwEdMEcTTRj7W1TxLbSBxdY8QLBPCcp66MTyaSy0RpO17A==} + peerDependencies: + valtio: '*' + + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-browser@5.3.0: + resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + diff-match-patch@1.0.5: + resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} + + diff@5.2.2: + resolution: {integrity: sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==} + engines: {node: '>=0.3.1'} + + dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + dompurify@3.3.1: + resolution: {integrity: sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==} + + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + + dset@3.1.4: + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} + engines: {node: '>=4'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + + eciesjs@0.4.17: + resolution: {integrity: sha512-TOOURki4G7sD1wDCjj7NfLaXZZ49dFOeEb5y39IXpb8p0hRzVvfvzZHOi5JcT+PpyAbi/Y+lxPb8eTag2WYH8w==} + engines: {bun: '>=1', deno: '>=2', node: '>=16'} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.283: + resolution: {integrity: sha512-3vifjt1HgrGW/h76UEeny+adYApveS9dH2h3p57JYzBSXJIKUJAvtmIytDKjcSCt9xHfrNCFJ7gts6vkhuq++w==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + + encode-utf8@1.0.3: + resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + engine.io-client@6.6.4: + resolution: {integrity: sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==} + + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + + enhanced-resolve@5.18.4: + resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} + engines: {node: '>=10.13.0'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + es-abstract@1.24.1: + resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.2.2: + resolution: {integrity: sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + es-toolkit@1.33.0: + resolution: {integrity: sha512-X13Q/ZSc+vsO1q600bvNK4bxgXMkHcf//RxCmYDaRY5DAcT+eoXjY5hoAPGMdRnWQjvyLEcyauG3b6hz76LNqg==} + + es-toolkit@1.39.3: + resolution: {integrity: sha512-Qb/TCFCldgOy8lZ5uC7nLGdqJwSabkQiYQShmw4jyiPk1pZzaYWTwaYKYP7EgLccWYgZocMrtItrwh683voaww==} + + es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + + es6-promisify@5.0.0: + resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + + esbuild-plugin-tailwindcss@2.1.0: + resolution: {integrity: sha512-Mqd9Dko8fHGOWVhN53wXefAZZ45i5sZVY3XvyFN5ZKhOPpxXrducAcDPE5iqFw0aJoEm6MG1V9x4Kz6TiQV9kQ==} + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-config-next@16.0.8: + resolution: {integrity: sha512-8J5cOAboXIV3f8OD6BOyj7Fik6n/as7J4MboiUSExWruf/lCu1OPR3ZVSdnta6WhzebrmAATEmNSBZsLWA6kbg==} + peerDependencies: + eslint: '>=9.0.0' + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-import-context@0.1.9: + resolution: {integrity: sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + peerDependencies: + unrs-resolver: ^1.0.0 + peerDependenciesMeta: + unrs-resolver: + optional: true + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-import-resolver-typescript@3.10.1: + resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + + eslint-import-resolver-typescript@4.4.4: + resolution: {integrity: sha512-1iM2zeBvrYmUNTj2vSC/90JTHDth+dfOfiNKkxApWRsTJYNrc8rOdxxIf5vazX+BiAXTeOT0UvWpGI/7qIWQOw==} + engines: {node: ^16.17.0 || >=18.6.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + + eslint-module-utils@2.12.1: + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jsx-a11y@6.10.2: + resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + + eslint-plugin-react-hooks@7.0.1: + resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.39.2: + resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eth-block-tracker@7.1.0: + resolution: {integrity: sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg==} + engines: {node: '>=14.0.0'} + + eth-json-rpc-filters@6.0.1: + resolution: {integrity: sha512-ITJTvqoCw6OVMLs7pI8f4gG92n/St6x80ACtHodeS+IXmO0w+t1T5OOzfSt7KLSMLRkVUoexV7tztLgDxg+iig==} + engines: {node: '>=14.0.0'} + + eth-query@2.1.2: + resolution: {integrity: sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==} + + eth-rpc-errors@4.0.3: + resolution: {integrity: sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==} + + ethereum-cryptography@2.2.1: + resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter2@6.4.9: + resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + eventsource-parser@3.0.6: + resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + + execa@9.6.1: + resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} + engines: {node: ^18.19.0 || >=20.5.0} + + exit-hook@4.0.0: + resolution: {integrity: sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==} + engines: {node: '>=18'} + + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} + + expr-eval@2.0.2: + resolution: {integrity: sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg==} + + express-rate-limit@7.5.1: + resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + + express@4.22.1: + resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} + engines: {node: '>= 0.10.0'} + + express@5.2.1: + resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} + engines: {node: '>= 18'} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extension-port-stream@3.0.0: + resolution: {integrity: sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==} + engines: {node: '>=12.0.0'} + + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + eyes@0.1.8: + resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} + engines: {node: '> 0.1.90'} + + fast-copy@3.0.2: + resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + + fast-json-patch@3.1.1: + resolution: {integrity: sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-password-entropy@1.1.1: + resolution: {integrity: sha512-dxm29/BPFrNgyEDygg/lf9c2xQR0vnQhG7+hZjAI39M/3um9fD4xiqG6F0ZjW6bya5m9CI0u6YryHGRtxCGCiw==} + + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fast-stable-stringify@1.0.0: + resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fastestsmallesttextencoderdecoder@1.0.22: + resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fault@1.0.4: + resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + + fetch-retry@6.0.0: + resolution: {integrity: sha512-BUFj1aMubgib37I3v4q78fYo63Po7t4HUPTpQ6/QE6yK6cIQrP+W43FYToeTEyg5m2Y7eFUtijUuAv/PDlWuag==} + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + filter-obj@1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} + + finalhandler@1.3.2: + resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} + engines: {node: '>= 0.8'} + + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + form-data-encoder@1.7.2: + resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + + formdata-node@4.4.1: + resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} + engines: {node: '>= 12.20'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fraction.js@5.3.4: + resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + generic-names@4.0.0: + resolution: {integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.13.1: + resolution: {integrity: sha512-EoY1N2xCn44xU6750Sx7OjOIT59FkmstNc3X6y5xpz7D5cBtZRe/3pSlTkDJgqsOk3WwZPkWfonhhUJfttQo3w==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@16.4.0: + resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphql-query-complexity@0.12.0: + resolution: {integrity: sha512-fWEyuSL6g/+nSiIRgIipfI6UXTI7bAxrpPlCY1c0+V3pAEUo1ybaKmSBgNr1ed2r+agm1plJww8Loig9y6s2dw==} + peerDependencies: + graphql: ^14.6.0 || ^15.0.0 || ^16.0.0 + + graphql-scalars@1.25.0: + resolution: {integrity: sha512-b0xyXZeRFkne4Eq7NAnL400gStGqG/Sx9VqX0A05nHyEbv57UJnWKsjNnrpVqv5e/8N1MUxkt0wwcRXbiyKcFg==} + engines: {node: '>=10'} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + + graphql-yoga@5.18.0: + resolution: {integrity: sha512-xFt1DVXS1BZ3AvjnawAGc5OYieSe56WuQuyk3iEpBwJ3QDZJWQGLmU9z/L5NUZ+pUcyprsz/bOwkYIV96fXt/g==} + engines: {node: '>=18.0.0'} + peerDependencies: + graphql: ^15.2.0 || ^16.0.0 + + graphql@16.12.0: + resolution: {integrity: sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + + h3@1.15.5: + resolution: {integrity: sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==} + + hachure-fill@0.5.2: + resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-from-dom@5.0.1: + resolution: {integrity: sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==} + + hast-util-from-html-isomorphic@2.0.0: + resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} + + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-parse-selector@2.2.5: + resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-sanitize@5.0.2: + resolution: {integrity: sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-to-parse5@8.0.1: + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} + + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + + hast-util-whitespace@2.0.1: + resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hast@1.0.0: + resolution: {integrity: sha512-vFUqlRV5C+xqP76Wwq2SrM0kipnmpxJm7OfvVXpB35Fp+Fn4MV+ozr+JZr5qFvyR1q/U+Foim2x+3P+x9S1PLA==} + deprecated: Renamed to rehype + + hastscript@6.0.0: + resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + + help-me@5.0.0: + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + + hermes-estree@0.25.1: + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + + hermes-parser@0.25.1: + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + + highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + + highlightjs-vue@1.0.0: + resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} + + hono@4.11.7: + resolution: {integrity: sha512-l7qMiNee7t82bH3SeyUCt9UF15EVmaBvsppY2zQtrbIhl/yzBTny+YUxsVjSjQ6gaqaeVtZmGocom8TzBlA4Yw==} + engines: {node: '>=16.9.0'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + html-url-attributes@3.0.1: + resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} + engines: {node: '>=0.10.0'} + + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + idb-keyval@6.2.1: + resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} + + idb-keyval@6.2.2: + resolution: {integrity: sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg==} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + + inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + + is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-any-array@2.0.1: + resolution: {integrity: sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ==} + + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + is-bun-module@2.0.0: + resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-network-error@1.3.0: + resolution: {integrity: sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==} + engines: {node: '>=16'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-retry-allowed@2.2.0: + resolution: {integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==} + engines: {node: '>=10'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + is-what@5.5.0: + resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} + engines: {node: '>=18'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isomorphic-ws@4.0.1: + resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} + peerDependencies: + ws: '*' + + isows@1.0.6: + resolution: {integrity: sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==} + peerDependencies: + ws: '*' + + isows@1.0.7: + resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} + peerDependencies: + ws: '*' + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + + jayson@4.3.0: + resolution: {integrity: sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==} + engines: {node: '>=8'} + hasBin: true + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + jose@4.15.9: + resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} + + jose@5.10.0: + resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} + + jose@6.1.3: + resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + js-tiktoken@1.0.21: + resolution: {integrity: sha512-biOj/6M5qdgx5TKjDnFT1ymSpM5tbd3ylwDtrQvFQSu0Z7bBYko2dF+W/aUkXUPuk6IVpRxk/3Q2sHOzGlS36g==} + + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + hasBin: true + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-rpc-engine@6.1.0: + resolution: {integrity: sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==} + engines: {node: '>=10.0.0'} + + json-rpc-random-id@1.0.1: + resolution: {integrity: sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==} + + json-schema-to-zod@2.7.0: + resolution: {integrity: sha512-eW59l3NQ6sa3HcB+Ahf7pP6iGU7MY4we5JsPqXQ2ZcIPF8QxSg/lkY8lN0Js/AG0NjMbk+nZGUfHlceiHF+bwQ==} + hasBin: true + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsondiffpatch@0.6.0: + resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + katex@0.16.28: + resolution: {integrity: sha512-YHzO7721WbmAL6Ov1uzN/l5mY5WWWhJBSW+jq4tkfZfsxmo1hu6frS0EOswvjBUnWE6NtjEs48SFn5CQESRLZg==} + hasBin: true + + keccak@3.0.4: + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} + engines: {node: '>=10.0.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + keyvaluestorage-interface@1.0.0: + resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} + + khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + + langchain@0.3.37: + resolution: {integrity: sha512-1jPsZ6xsxkcQPUvqRjvfuOLwZLLyt49hzcOK7OYAJovIkkOxd5gzK4Yw6giPUQ8g4XHyvULNlWBz+subdkcokw==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/anthropic': '*' + '@langchain/aws': '*' + '@langchain/cerebras': '*' + '@langchain/cohere': '*' + '@langchain/core': '>=0.3.58 <0.4.0' + '@langchain/deepseek': '*' + '@langchain/google-genai': '*' + '@langchain/google-vertexai': '*' + '@langchain/google-vertexai-web': '*' + '@langchain/groq': '*' + '@langchain/mistralai': '*' + '@langchain/ollama': '*' + '@langchain/xai': '*' + axios: '*' + cheerio: '*' + handlebars: ^4.7.8 + peggy: ^3.0.2 + typeorm: '*' + peerDependenciesMeta: + '@langchain/anthropic': + optional: true + '@langchain/aws': + optional: true + '@langchain/cerebras': + optional: true + '@langchain/cohere': + optional: true + '@langchain/deepseek': + optional: true + '@langchain/google-genai': + optional: true + '@langchain/google-vertexai': + optional: true + '@langchain/google-vertexai-web': + optional: true + '@langchain/groq': + optional: true + '@langchain/mistralai': + optional: true + '@langchain/ollama': + optional: true + '@langchain/xai': + optional: true + axios: + optional: true + cheerio: + optional: true + handlebars: + optional: true + peggy: + optional: true + typeorm: + optional: true + + langium@3.3.1: + resolution: {integrity: sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==} + engines: {node: '>=16.0.0'} + + langsmith@0.1.68: + resolution: {integrity: sha512-otmiysWtVAqzMx3CJ4PrtUBhWRG5Co8Z4o7hSZENPjlit9/j3/vm3TSvbaxpDYakZxtMjhkcJTqrdYFipISEiQ==} + peerDependencies: + openai: '*' + peerDependenciesMeta: + openai: + optional: true + + langsmith@0.3.87: + resolution: {integrity: sha512-XXR1+9INH8YX96FKWc5tie0QixWz6tOqAsAKfcJyPkE0xPep+NDz0IQLR32q4bn10QK3LqD2HN6T3n6z1YLW7Q==} + peerDependencies: + '@opentelemetry/api': '*' + '@opentelemetry/exporter-trace-otlp-proto': '*' + '@opentelemetry/sdk-trace-base': '*' + openai: '*' + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@opentelemetry/exporter-trace-otlp-proto': + optional: true + '@opentelemetry/sdk-trace-base': + optional: true + openai: + optional: true + + langsmith@0.4.12: + resolution: {integrity: sha512-YWt0jcGvKqjUgIvd78rd4QcdMss0lUkeUaqp0UpVRq7H2yNDx8H5jOUO/laWUmaPtWGgcip0qturykXe1g9Gqw==} + peerDependencies: + '@opentelemetry/api': '*' + '@opentelemetry/exporter-trace-otlp-proto': '*' + '@opentelemetry/sdk-trace-base': '*' + openai: '*' + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@opentelemetry/exporter-trace-otlp-proto': + optional: true + '@opentelemetry/sdk-trace-base': + optional: true + openai: + optional: true + + language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + layout-base@2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + libphonenumber-js@1.12.36: + resolution: {integrity: sha512-woWhKMAVx1fzzUnMCyOzglgSgf6/AFHLASdOBcchYCyvWSGWt12imw3iu2hdI5d4dGZRsNWAmWiz37sDKUPaRQ==} + + lightningcss-android-arm64@1.30.2: + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.30.2: + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.2: + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.2: + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.2: + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.2: + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.2: + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.2: + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.2: + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.2: + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.2: + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.2: + resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + engines: {node: '>= 12.0.0'} + + lit-element@4.2.2: + resolution: {integrity: sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==} + + lit-html@3.3.2: + resolution: {integrity: sha512-Qy9hU88zcmaxBXcc10ZpdK7cOLXvXpRoBxERdtqV9QOrfpMZZ6pSYP91LhpPtap3sFMUiL7Tw2RImbe0Al2/kw==} + + lit@3.3.0: + resolution: {integrity: sha512-DGVsqsOIHBww2DqnuZzW7QsuCdahp50ojuDaBPC7jUDRpYoH0z7kHBBYZewRzer75FwtrkmkKk7iOAwSaWdBmw==} + + lit@3.3.2: + resolution: {integrity: sha512-NF9zbsP79l4ao2SNrH3NkfmFgN/hBYSQo90saIVI1o5GpjAdCPVstVzO1MrLOakHoEhYkrtRjPK6Ob521aoYWQ==} + + loader-utils@3.3.1: + resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} + engines: {node: '>= 12.13.0'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash-es@4.17.23: + resolution: {integrity: sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.23: + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + + log-symbols@7.0.1: + resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} + engines: {node: '>=18'} + + logform@2.7.0: + resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} + engines: {node: '>= 12.0.0'} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lowlight@1.20.0: + resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.2.5: + resolution: {integrity: sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lucide-react@0.525.0: + resolution: {integrity: sha512-Tm1txJ2OkymCGkvwoHt33Y2JpN5xucVq1slHcgE6Lk0WjDfjgKWor5CdVER8U6DvcfMwh4M8XxmpTiyzfmfDYQ==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + lucide-react@0.542.0: + resolution: {integrity: sha512-w3hD8/SQB7+lzU2r4VdFyzzOzKnUjTZIF/MQJGSSvni7Llewni4vuViRppfRAa2guOsY5k4jZyxw/i9DQHv+dw==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + lucide-react@0.554.0: + resolution: {integrity: sha512-St+z29uthEJVx0Is7ellNkgTEhaeSoA42I7JjOCBCrc5X6LYMGSv0P/2uS5HDLTExP5tpiqRD2PyUEOS6s9UXA==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + lucide-react@0.561.0: + resolution: {integrity: sha512-Y59gMY38tl4/i0qewcqohPdEbieBy7SovpBL9IFebhc2mDd8x4PZSOsiFRkpPcOq6bj1r/mjH/Rk73gSlIJP2A==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + lucide@0.525.0: + resolution: {integrity: sha512-sfehWlaE/7NVkcEQ4T9JD3eID8RNMIGJBBUq9wF3UFiJIrcMKRbU3g1KGfDk4svcW7yw8BtDLXaXo02scDtUYQ==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magicast@0.5.1: + resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + marked@12.0.2: + resolution: {integrity: sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==} + engines: {node: '>= 18'} + hasBin: true + + marked@16.4.2: + resolution: {integrity: sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==} + engines: {node: '>= 20'} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + + mdast-util-definitions@5.1.2: + resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-math@3.0.0: + resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@12.3.0: + resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + mermaid@11.12.2: + resolution: {integrity: sha512-n34QPDPEKmaeCG4WDMGy0OT6PSyxKCfy2pJgShP+Qow2KLrvWjclwbc3yXfSIf4BanqWEhQEpngWwNp/XhZt6w==} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micro-ftch@0.3.1: + resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + + micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-cjk-friendly-gfm-strikethrough@1.2.3: + resolution: {integrity: sha512-gSPnxgHDDqXYOBvQRq6lerrq9mjDhdtKn+7XETuXjxWcL62yZEfUdA28Ml1I2vDIPfAOIKLa0h2XDSGkInGHFQ==} + engines: {node: '>=16'} + peerDependencies: + micromark: ^4.0.0 + micromark-util-types: ^2.0.0 + peerDependenciesMeta: + micromark-util-types: + optional: true + + micromark-extension-cjk-friendly-util@2.1.1: + resolution: {integrity: sha512-egs6+12JU2yutskHY55FyR48ZiEcFOJFyk9rsiyIhcJ6IvWB6ABBqVrBw8IobqJTDZ/wdSr9eoXDPb5S2nW1bg==} + engines: {node: '>=16'} + peerDependencies: + micromark-util-types: '*' + peerDependenciesMeta: + micromark-util-types: + optional: true + + micromark-extension-cjk-friendly@1.2.3: + resolution: {integrity: sha512-gRzVLUdjXBLX6zNPSnHGDoo+ZTp5zy+MZm0g3sv+3chPXY7l9gW+DnrcHcZh/jiPR6MjPKO4AEJNp4Aw6V9z5Q==} + engines: {node: '>=16'} + peerDependencies: + micromark: ^4.0.0 + micromark-util-types: ^2.0.0 + peerDependenciesMeta: + micromark-util-types: + optional: true + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-math@3.1.0: + resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} + + micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + mipd@0.0.7: + resolution: {integrity: sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + ml-array-mean@1.1.6: + resolution: {integrity: sha512-MIdf7Zc8HznwIisyiJGRH9tRigg3Yf4FldW8DxKxpCCv/g5CafTw0RRu51nojVEOXuCQC7DRVVu5c7XXO/5joQ==} + + ml-array-sum@1.1.6: + resolution: {integrity: sha512-29mAh2GwH7ZmiRnup4UyibQZB9+ZLyMShvt4cH4eTK+cL2oEMIZFnSyB3SS8MlsTh6q/w/yh48KmqLxmovN4Dw==} + + ml-distance-euclidean@2.0.0: + resolution: {integrity: sha512-yC9/2o8QF0A3m/0IXqCTXCzz2pNEzvmcE/9HFKOZGnTjatvBbsn4lWYJkxENkA4Ug2fnYl7PXQxnPi21sgMy/Q==} + + ml-distance@4.0.1: + resolution: {integrity: sha512-feZ5ziXs01zhyFUUUeZV5hwc0f5JW0Sh0ckU1koZe/wdVkJdGxcP06KNQuF0WBTj8FttQUzcvQcpcrOp/XrlEw==} + + ml-tree-similarity@1.0.0: + resolution: {integrity: sha512-XJUyYqjSuUQkNQHMscr6tcjldsOoAekxADTplt40QKfwW6nd++1wHWV9AArl0Zvw/TIHgNaZZNvr8QGvE8wLRg==} + + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multiformats@9.9.0: + resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + + mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + napi-postinstall@0.3.4: + resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + next@16.0.8: + resolution: {integrity: sha512-LmcZzG04JuzNXi48s5P+TnJBsTGPJunViNKV/iE4uM6kstjTQsQhvsAv+xF6MJxU2Pr26tl15eVbp0jQnsv6/g==} + engines: {node: '>=20.9.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.51.1 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + + node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + + node-cron@4.2.1: + resolution: {integrity: sha512-lgimEHPE/QDgFlywTd8yTR61ptugX3Qer29efeyWw2rv259HtGBNn1vZVmp8lB9uo9wC0t/AT4iGqXxia+CJFg==} + engines: {node: '>=6.0.0'} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + node-mock-http@1.0.4: + resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} + + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + + num-sort@2.1.0: + resolution: {integrity: sha512-1MQz1Ed8z2yckoBeSfkQHHO9K1yDRxxtotKSJ9yvcTUUxSvfvzEq5GwBrjjHEpMlq/k5gvXdmJ1SbYxWtpNoVg==} + engines: {node: '>=8'} + + obj-multiplex@1.0.0: + resolution: {integrity: sha512-0GNJAOsHoBHeNTvl5Vt6IWnpUEcc3uSRxzBri7EDyIcMgYvnY2JL2qdeV5zTMjWQX5OHcD5amcW2HFfDh0gjIA==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + + ofetch@1.5.1: + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + + on-exit-leak-free@0.2.0: + resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} + + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + oniguruma-parser@0.12.1: + resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + + oniguruma-to-es@4.3.4: + resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==} + + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} + + openai@4.104.0: + resolution: {integrity: sha512-p99EFNsA/yX6UhVO93f5kJsDRLAg+CTA2RBqdHK4RtK8u5IJw32Hyb2dTGKbnnFmnuoBv5r7Z2CURI9sGZpSuA==} + hasBin: true + peerDependencies: + ws: ^8.18.0 + zod: ^3.23.8 + peerDependenciesMeta: + ws: + optional: true + zod: + optional: true + + openai@5.12.2: + resolution: {integrity: sha512-xqzHHQch5Tws5PcKR2xsZGX9xtch+JQFz5zb14dGqlshmmDAFBFEWmeIpf7wVqWV+w7Emj7jRgkNJakyKE0tYQ==} + hasBin: true + peerDependencies: + ws: ^8.18.0 + zod: ^3.23.8 + peerDependenciesMeta: + ws: + optional: true + zod: + optional: true + + openai@6.17.0: + resolution: {integrity: sha512-NHRpPEUPzAvFOAFs9+9pC6+HCw/iWsYsKCMPXH5Kw7BpMxqd8g/A07/1o7Gx2TWtCnzevVRyKMRFqyiHyAlqcA==} + hasBin: true + peerDependencies: + ws: ^8.18.0 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + ws: + optional: true + zod: + optional: true + + openapi-fetch@0.13.8: + resolution: {integrity: sha512-yJ4QKRyNxE44baQ9mY5+r/kAzZ8yXMemtNAOFwOzRXJscdjSxxzWSNlyBAr+o5JjkUw9Lc3W7OIoca0cY3PYnQ==} + + openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + + openapi-typescript-helpers@0.0.15: + resolution: {integrity: sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + ora@9.1.0: + resolution: {integrity: sha512-53uuLsXHOAJl5zLrUrzY9/kE+uIFEx7iaH4g2BIJQK4LZjY4LpCCYZVKDWIkL+F01wAaCg93duQ1whnK/AmY1A==} + engines: {node: '>=20'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + ox@0.11.3: + resolution: {integrity: sha512-1bWYGk/xZel3xro3l8WGg6eq4YEKlaqvyMtVhfMFpbJzK2F6rj4EDRtqDCWVEJMkzcmEi9uW2QxsqELokOlarw==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + ox@0.6.7: + resolution: {integrity: sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + ox@0.6.9: + resolution: {integrity: sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + ox@0.9.1: + resolution: {integrity: sha512-NVI0cajROntJWtFnxZQ1aXDVy+c6DLEXJ3wwON48CgbPhmMJrpRTfVbuppR+47RmXm3lZ/uMaKiFSkLdAO1now==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + ox@0.9.17: + resolution: {integrity: sha512-rKAnhzhRU3Xh3hiko+i1ZxywZ55eWQzeS/Q4HRKLx2PqfHOolisZHErSsJVipGlmQKHW5qwOED/GighEw9dbLg==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + ox@0.9.3: + resolution: {integrity: sha512-KzyJP+fPV4uhuuqrTZyok4DC7vFzi7HLUFiUNEmpbyh59htKWkOC98IONC1zgXJPbHAhQgqs6B0Z6StCGhmQvg==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + + p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + + p-retry@7.1.1: + resolution: {integrity: sha512-J5ApzjyRkkf601HpEeykoiCvzHQjWxPAHhyjFcEUP2SWq0+35NKh8TLhpLw+Dkq5TZBFvUM6UigdE9hIVYTl5w==} + engines: {node: '>=20'} + + p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-manager-detector@1.6.0: + resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + partial-json@0.1.7: + resolution: {integrity: sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==} + + path-data-parser@0.1.0: + resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + path-to-regexp@8.3.0: + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + permissionless@0.2.57: + resolution: {integrity: sha512-QrzAoQGYPV/NJ2x5Sj18h7qed6f+kCyQAojrncN091UPiGqHjFNjgdsgreiv8pxlQgF4UcpuJUvsHLpOEBd6cQ==} + peerDependencies: + ox: ^0.8.0 + viem: ^2.28.1 + peerDependenciesMeta: + ox: + optional: true + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + pify@5.0.0: + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} + + pinata@2.5.3: + resolution: {integrity: sha512-O3bxvgaznxt8iYCMVJvKl+rMUOZqMl7rNBwY+P4fgOSIQled6PXRIskL+MDxUCS3g9Hnpt4ToKzyqd6KuSMmww==} + engines: {node: '>=20'} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + pino-abstract-transport@0.5.0: + resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} + + pino-abstract-transport@1.2.0: + resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} + + pino-abstract-transport@2.0.0: + resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} + + pino-pretty@10.3.1: + resolution: {integrity: sha512-az8JbIYeN/1iLj2t0jR9DV48/LQ3RC6hZPpapKPkb84Q+yTidMCpgWxIT3N0flnBDilyBQ1luWNpOeJptjdp/g==} + hasBin: true + + pino-pretty@11.3.0: + resolution: {integrity: sha512-oXwn7ICywaZPHmu3epHGU2oJX4nPmKvHvB/bwrJHlGcbEWaVcotkpyVHMKLKmiVryWYByNp0jpgAcXpFJDXJzA==} + hasBin: true + + pino-std-serializers@4.0.0: + resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} + + pino-std-serializers@7.1.0: + resolution: {integrity: sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==} + + pino@10.0.0: + resolution: {integrity: sha512-eI9pKwWEix40kfvSzqEP6ldqOoBIN7dwD/o91TY5z8vQI12sAffpR/pOqAD1IVVwIVHDpHjkq0joBPdJD0rafA==} + hasBin: true + + pino@7.11.0: + resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} + hasBin: true + + pino@9.14.0: + resolution: {integrity: sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w==} + hasBin: true + + pkce-challenge@5.0.1: + resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} + engines: {node: '>=16.20.0'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + + points-on-curve@0.2.0: + resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} + + points-on-path@0.2.1: + resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + + pony-cause@2.1.11: + resolution: {integrity: sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==} + engines: {node: '>=12.0.0'} + + porto@0.2.35: + resolution: {integrity: sha512-gu9FfjjvvYBgQXUHWTp6n3wkTxVtEcqFotM7i3GEZeoQbvLGbssAicCz6hFZ8+xggrJWwi/RLmbwNra50SMmUQ==} + hasBin: true + peerDependencies: + '@tanstack/react-query': '>=5.59.0' + '@wagmi/core': '>=2.16.3' + expo-auth-session: '>=7.0.8' + expo-crypto: '>=15.0.7' + expo-web-browser: '>=15.0.8' + react: '>=18' + react-native: '>=0.81.4' + typescript: '>=5.4.0' + viem: '>=2.37.0' + wagmi: '>=2.0.0' + peerDependenciesMeta: + '@tanstack/react-query': + optional: true + expo-auth-session: + optional: true + expo-crypto: + optional: true + expo-web-browser: + optional: true + react: + optional: true + react-native: + optional: true + typescript: + optional: true + wagmi: + optional: true + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + 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 + + postcss-modules-scope@3.2.1: + resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules@6.0.1: + resolution: {integrity: sha512-zyo2sAkVvuZFFy0gc2+4O+xar5dYlaVy/ebO24KT0ftk/iJevSNyPyQellsBLlnccwh7f6V6Y4GvuKRYToNgpQ==} + peerDependencies: + postcss: ^8.0.0 + + postcss-selector-parser@7.1.1: + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + preact@10.24.2: + resolution: {integrity: sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==} + + preact@10.28.3: + resolution: {integrity: sha512-tCmoRkPQLpBeWzpmbhryairGnhW9tKV6c6gr/w+RhoRoKEJwsjzipwp//1oCpGPOchvSLaAPlpcJi9MwMmoPyA==} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@3.8.1: + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + engines: {node: '>=14'} + hasBin: true + + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + + prismjs@1.27.0: + resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==} + engines: {node: '>=6'} + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process-warning@1.0.0: + resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} + + process-warning@5.0.0: + resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + property-information@5.6.0: + resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} + + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-compare@2.6.0: + resolution: {integrity: sha512-8xuCeM3l8yqdmbPoYeLbrAXCBWu19XEYc5/F28f5qOaoAIMyfmBUkl5axiK+x9olUvRlcekvnm98AP9RDngOIw==} + + proxy-compare@3.0.1: + resolution: {integrity: sha512-V9plBAt3qjMlS1+nC8771KNf6oJ12gExvaxnNzN/9yVRLdTv/lc+oJlnSzrdYDAvBfTStPCoiaCOTmTs0adv7Q==} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qrcode@1.5.3: + resolution: {integrity: sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==} + engines: {node: '>=10.13.0'} + hasBin: true + + qrcode@1.5.4: + resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} + engines: {node: '>=10.13.0'} + hasBin: true + + qs@6.14.1: + resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} + engines: {node: '>=0.6'} + + query-string@7.1.3: + resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.3: + resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} + engines: {node: '>= 0.8'} + + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + + react-device-detect@2.2.3: + resolution: {integrity: sha512-buYY3qrCnQVlIFHrC5UcUoAj7iANs/+srdkwsnNjI7anr3Tt7UY6MqNxtMLlr0tMBied0O49UZVK8XKs3ZIiPw==} + peerDependencies: + react: '>= 0.14.0' + react-dom: '>= 0.14.0' + + react-dom@19.2.4: + resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} + peerDependencies: + react: ^19.2.4 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-markdown@10.1.0: + resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} + peerDependencies: + '@types/react': '>=18' + react: '>=18' + + react-markdown@8.0.7: + resolution: {integrity: sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.7.2: + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-syntax-highlighter@15.6.6: + resolution: {integrity: sha512-DgXrc+AZF47+HvAPEmn7Ua/1p10jNoVZVI/LoPiYdtY+OM+/nG5yefLHKJwdKqY1adMuHFbeyBaG9j64ML7vTw==} + peerDependencies: + react: '>= 0.14.0' + + react@19.2.4: + resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} + engines: {node: '>=0.10.0'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + + real-require@0.1.0: + resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} + engines: {node: '>= 12.13.0'} + + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + refractor@3.6.0: + resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + rehype-harden@1.1.7: + resolution: {integrity: sha512-j5DY0YSK2YavvNGV+qBHma15J9m0WZmRe8posT5AtKDS6TNWtMVTo6RiqF8SidfcASYz8f3k2J/1RWmq5zTXUw==} + + rehype-katex@7.0.1: + resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-sanitize@6.0.0: + resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} + + remark-cjk-friendly-gfm-strikethrough@1.2.3: + resolution: {integrity: sha512-bXfMZtsaomK6ysNN/UGRIcasQAYkC10NtPmP0oOHOV8YOhA2TXmwRXCku4qOzjIFxAPfish5+XS0eIug2PzNZA==} + engines: {node: '>=16'} + peerDependencies: + '@types/mdast': ^4.0.0 + unified: ^11.0.0 + peerDependenciesMeta: + '@types/mdast': + optional: true + + remark-cjk-friendly@1.2.3: + resolution: {integrity: sha512-UvAgxwlNk+l9Oqgl/9MWK2eWRS7zgBW/nXX9AthV7nd/3lNejF138E7Xbmk9Zs4WjTJGs721r7fAEc7tNFoH7g==} + engines: {node: '>=16'} + peerDependencies: + '@types/mdast': ^4.0.0 + unified: ^11.0.0 + peerDependenciesMeta: + '@types/mdast': + optional: true + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-math@6.0.0: + resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==} + + remark-parse@10.0.2: + resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@10.1.0: + resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + remend@1.0.1: + resolution: {integrity: sha512-152puVH0qMoRJQFnaMG+rVDdf01Jq/CaED+MBuXExurJgdbkLp0c3TIe4R12o28Klx8uyGsjvFNG05aFG69G9w==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + + rollup@4.57.1: + resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + roughjs@4.6.6: + resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} + + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + + rpc-websockets@9.3.3: + resolution: {integrity: sha512-OkCsBBzrwxX4DoSv4Zlf9DgXKRB0MzVfCFg5MC+fNnf9ktr4SMWjsri0VNZQlDbCnGcImT6KNEv4ZoxktQhdpA==} + + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + + secure-password-utilities@0.2.1: + resolution: {integrity: sha512-znUg8ae3cpuAaogiFBhP82gD2daVkSz4Qv/L7OWjB7wWvfbCdeqqQuJkm2/IvhKQPOV0T739YPR6rb7vs0uWaw==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.2: + resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} + engines: {node: '>= 0.8.0'} + + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} + + serve-static@1.16.3: + resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} + engines: {node: '>= 0.8.0'} + + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + sha.js@2.4.12: + resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} + engines: {node: '>= 0.10'} + hasBin: true + + shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + 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'} + + shiki@3.22.0: + resolution: {integrity: sha512-LBnhsoYEe0Eou4e1VgJACes+O6S6QC0w71fCSp5Oya79inkwkm15gQ1UF6VtQ8j/taMDh79hAB49WUk8ALQW3g==} + + 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: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-wcswidth@1.1.2: + resolution: {integrity: sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slow-redact@0.3.2: + resolution: {integrity: sha512-MseHyi2+E/hBRqdOi5COy6wZ7j7DxXRz9NkseavNYSvvWC06D8a5cidVZX3tcG5eCW3NIyVU4zT63hw0Q486jw==} + + socket.io-client@4.8.3: + resolution: {integrity: sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==} + engines: {node: '>=10.0.0'} + + socket.io-parser@4.2.5: + resolution: {integrity: sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ==} + engines: {node: '>=10.0.0'} + + sonic-boom@2.8.0: + resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} + + sonic-boom@3.8.1: + resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} + + sonic-boom@4.2.0: + resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@1.1.5: + resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + split-on-first@1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} + engines: {node: '>=6'} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stable-hash-x@0.2.0: + resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} + engines: {node: '>=12.0.0'} + + stable-hash@0.0.5: + resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + + stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + stacktrace-parser@0.1.11: + resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} + engines: {node: '>=6'} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + stream-chain@2.2.5: + resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} + + stream-json@1.9.1: + resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + streamdown@1.6.11: + resolution: {integrity: sha512-Y38fwRx5kCKTluwM+Gf27jbbi9q6Qy+WC9YrC1YbCpMkktT3PsRBJHMWiqYeF8y/JzLpB1IzDoeaB6qkQEDnAA==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + + strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + + string-hash@1.1.3: + resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@8.1.1: + resolution: {integrity: sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==} + engines: {node: '>=20'} + + string.prototype.includes@2.0.1: + resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} + engines: {node: '>= 0.4'} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + style-to-js@1.1.21: + resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} + + style-to-object@0.4.4: + resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + + style-to-object@1.0.14: + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + + styled-components@6.3.8: + resolution: {integrity: sha512-Kq/W41AKQloOqKM39zfaMdJ4BcYDw/N5CIq4/GTI0YjU6pKcZ1KKhk6b4du0a+6RA9pIfOP/eu94Ge7cu+PDCA==} + engines: {node: '>= 16'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + peerDependenciesMeta: + react-dom: + optional: true + + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + + superjson@2.2.6: + resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} + engines: {node: '>=16'} + + superstruct@1.0.4: + resolution: {integrity: sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==} + engines: {node: '>=14.0.0'} + + superstruct@2.0.2: + resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} + engines: {node: '>=14.0.0'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + swr@2.4.0: + resolution: {integrity: sha512-sUlC20T8EOt1pHmDiqueUWMmRRX03W7w5YxovWX7VR2KHEPCTMly85x05vpkP5i6Bu4h44ePSMD9Tc+G2MItFw==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + tabbable@6.4.0: + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} + + tailwind-merge@3.4.0: + resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} + + tailwindcss@4.1.18: + resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + + tar@7.5.7: + resolution: {integrity: sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==} + engines: {node: '>=18'} + + text-encoding-utf-8@1.0.2: + resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} + + text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + + thread-stream@0.15.2: + resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} + + thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + + throttleit@2.1.0: + resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} + engines: {node: '>=18'} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinycolor2@1.6.0: + resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + engines: {node: '>=14.0.0'} + + to-buffer@1.2.2: + resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} + engines: {node: '>= 0.4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + ts-api-utils@2.4.0: + resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + ts-deepmerge@7.0.3: + resolution: {integrity: sha512-Du/ZW2RfwV/D4cmA5rXafYjBQVuvu4qGiEEla4EmEHVHgRdx68Gftx7i66jn2bzHPwSVZY36Ae6OuDn9el4ZKA==} + engines: {node: '>=14.13.1'} + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + + turbo-darwin-64@2.8.1: + resolution: {integrity: sha512-FQ6Uqxty/H1Nvn1dpBe8KUlMRclTuiyNSc1PCeDL/ad7M9ykpWutB51YpMpf9ibTA32M6wLdIRf+D96W6hDAtQ==} + cpu: [x64] + os: [darwin] + + turbo-darwin-arm64@2.8.1: + resolution: {integrity: sha512-4bCcEpGP2/aSXmeN2gl5SuAmS1q5ykjubnFvSoXjQoCKtDOV+vc4CTl/DduZzUUutCVUWXjl8OyfIQ+DGCaV4A==} + cpu: [arm64] + os: [darwin] + + turbo-linux-64@2.8.1: + resolution: {integrity: sha512-m99JRlWlEgXPR7mkThAbKh6jbTmWSOXM/c6rt8yd4Uxh0+wjq7+DYcQbead6aoOqmCP9akswZ8EXIv1ogKBblg==} + cpu: [x64] + os: [linux] + + turbo-linux-arm64@2.8.1: + resolution: {integrity: sha512-AsPlza3AsavJdl2o7FE67qyv0aLfmT1XwFQGzvwpoAO6Bj7S4a03tpUchZKNuGjNAkKVProQRFnB7PgUAScFXA==} + cpu: [arm64] + os: [linux] + + turbo-windows-64@2.8.1: + resolution: {integrity: sha512-GdqNO6bYShRsr79B+2G/2ssjLEp9uBTvLBJSWRtRCiac/SEmv8T6RYv9hu+h5oGbFALtnKNp6BQBw78RJURsPw==} + cpu: [x64] + os: [win32] + + turbo-windows-arm64@2.8.1: + resolution: {integrity: sha512-n40E6IpkzrShRo3yMdRpgnn1/sAbGC6tZXwyNu8fe9RsufeD7KBiaoRSvw8xLyqV3pd2yoTL2rdCXq24MnTCWA==} + cpu: [arm64] + os: [win32] + + turbo@2.8.1: + resolution: {integrity: sha512-pbSMlRflA0RAuk/0jnAt8pzOYh1+sKaT8nVtcs75OFGVWD0evleQRmKtHJJV42QOhaC3Hx9mUUSOom/irasbjA==} + hasBin: true + + tw-animate-css@1.4.0: + resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + + type-graphql@2.0.0-rc.1: + resolution: {integrity: sha512-HCu4j3jR0tZvAAoO7DMBT3MRmah0DFRe5APymm9lXUghXA0sbhiMf6SLRafRYfk0R0KiUQYRduuGP3ap1RnF1Q==} + engines: {node: '>= 18.12.0'} + peerDependencies: + class-validator: '>=0.14.0' + graphql: ^16.8.1 + graphql-scalars: ^1.22.4 + peerDependenciesMeta: + class-validator: + optional: true + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typescript-eslint@8.54.0: + resolution: {integrity: sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + ua-parser-js@1.0.41: + resolution: {integrity: sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==} + hasBin: true + + ufo@1.6.3: + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + + uint8arrays@3.1.0: + resolution: {integrity: sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==} + + uint8arrays@3.1.1: + resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + undici-types@7.20.0: + resolution: {integrity: sha512-PZDAAlMkNw5ZzN/ebfyrwzrMWfIf7Jbn9iM/I6SF456OKrb2wnfqVowaxEY/cMAM8MjFu1zhdpJyA0L+rTYwNw==} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + + unist-util-generated@2.0.1: + resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} + + unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-position@4.0.4: + resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unrs-resolver@1.11.1: + resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} + + unstorage@1.17.4: + resolution: {integrity: sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6 || ^7 || ^8 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 + '@vercel/kv': ^1 || ^2 || ^3 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/functions': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + + untruncate-json@0.0.1: + resolution: {integrity: sha512-4W9enDK4X1y1s2S/Rz7ysw6kDuMS3VmRjMFg7GZrNO+98OSe+x5Lh7PKYoVjy3lW/1wmhs6HW0lusnQRHgMarA==} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + urlpattern-polyfill@10.1.0: + resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} + + urql@4.2.2: + resolution: {integrity: sha512-3GgqNa6iF7bC4hY/ImJKN4REQILcSU9VKcKL8gfELZM8mM5BnLH1BsCc8kBdnVGD1LIFOs4W3O2idNHhON1r0w==} + peerDependencies: + '@urql/core': ^5.0.0 + react: '>= 16.8.0' + + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-stick-to-bottom@1.1.2: + resolution: {integrity: sha512-ssUfMNvfH8a8hGLoAt5kcOsjbsVORknon2tbkECuf3EsVucFFBbyXl+Xnv3b58P8ZRuZelzO81fgb6M0eRo8cg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + use-sync-external-store@1.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + use-sync-external-store@1.4.0: + resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + hasBin: true + + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + + uuid@13.0.0: + resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + + validator@13.15.26: + resolution: {integrity: sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA==} + engines: {node: '>= 0.10'} + + valtio@1.13.2: + resolution: {integrity: sha512-Qik0o+DSy741TmkqmRfjq+0xpZBXi/Y6+fXZLn0xNF1z/waFMbE3rkivv5Zcf9RrMUp6zswf2J7sbh2KBlba5A==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=16.8' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + + valtio@2.1.7: + resolution: {integrity: sha512-DwJhCDpujuQuKdJ2H84VbTjEJJteaSmqsuUltsfbfdbotVfNeTE4K/qc/Wi57I9x8/2ed4JNdjEna7O6PfavRg==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + react: '>=18.0.0' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + viem@2.23.2: + resolution: {integrity: sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + viem@2.36.0: + resolution: {integrity: sha512-Xz7AkGtR43K+NY74X2lBevwfRrsXuifGUzt8QiULO47NXIcT7g3jcA4nIvl5m2OTE5v8SlzishwXmg64xOIVmQ==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + viem@2.45.1: + resolution: {integrity: sha512-LN6Pp7vSfv50LgwhkfSbIXftAM5J89lP9x8TeDa8QM7o41IxlHrDh0F9X+FfnCWtsz11pEVV5sn+yBUoOHNqYA==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + vite@7.3.1: + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@4.0.18: + resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.18 + '@vitest/browser-preview': 4.0.18 + '@vitest/browser-webdriverio': 4.0.18 + '@vitest/ui': 4.0.18 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + + wagmi@2.19.5: + resolution: {integrity: sha512-RQUfKMv6U+EcSNNGiPbdkDtJwtuFxZWLmvDiQmjjBgkuPulUwDJsKhi7gjynzJdsx2yDqhHCXkKsbbfbIsHfcQ==} + peerDependencies: + '@tanstack/react-query': '>=5.0.0' + react: '>=18' + typescript: '>=5.0.4' + viem: 2.x + peerDependenciesMeta: + typescript: + optional: true + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + web-streams-polyfill@4.0.0-beta.3: + resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} + engines: {node: '>= 14'} + + webauthn-p256@0.0.10: + resolution: {integrity: sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA==} + + webextension-polyfill@0.10.0: + resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + winston-console-format@1.0.8: + resolution: {integrity: sha512-dq7t/E0D0QRi4XIOwu6HM1+5e//WPqylH88GVjKEhQVrzGFg34MCz+G7pMJcXFBen9C0kBsu5GYgbYsE2LDwKw==} + + winston-transport@4.9.0: + resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} + engines: {node: '>= 12.0.0'} + + winston@3.19.0: + resolution: {integrity: sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==} + engines: {node: '>= 12.0.0'} + + wonka@6.3.5: + resolution: {integrity: sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.19.0: + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + 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 + + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + + x402@0.6.6: + resolution: {integrity: sha512-gKkxqKBT0mH7fSLld6Mz9ML52dmu1XeOPhVtiUCA3EzkfY6p0EJ3ijKhIKN0Jh8Q6kVXrFlJ/4iAUS1dNDA2lA==} + + x402@0.7.3: + resolution: {integrity: sha512-8CIZsdMTOn52PjMH/ErVke9ebeZ7ErwiZ5FL3tN3Wny7Ynxs3LkuB/0q7IoccRLdVXA7f2lueYBJ2iDrElhXnA==} + + xmlhttprequest-ssl@2.1.2: + resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} + engines: {node: '>=0.4.0'} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + + zod-to-json-schema@3.25.1: + resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} + peerDependencies: + zod: ^3.25 || ^4 + + zod-validation-error@4.0.2: + resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + + zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + + zod@4.3.6: + resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + + zustand@5.0.0: + resolution: {integrity: sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + + zustand@5.0.11: + resolution: {integrity: sha512-fdZY+dk7zn/vbWNCYmzZULHRrss0jx5pPFiOuMZ/5HJN6Yv3u+1Wswy/4MpZEkEGhtNH+pwxZB8OKgUBPzYAGg==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + + zustand@5.0.3: + resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@0no-co/graphql.web@1.2.0(graphql@16.12.0)': + optionalDependencies: + graphql: 16.12.0 + + '@a2a-js/sdk@0.3.9(@bufbuild/protobuf@2.11.0)(express@5.2.1)': + dependencies: + uuid: 11.1.0 + optionalDependencies: + '@bufbuild/protobuf': 2.11.0 + express: 5.2.1 + + '@adraffy/ens-normalize@1.11.1': {} + + '@ag-ui/client@0.0.42(patch_hash=g3vb6i4qg2banxpgna3ko3w63m)': + dependencies: + '@ag-ui/core': 0.0.42 + '@ag-ui/encoder': 0.0.42 + '@ag-ui/proto': 0.0.42 + '@types/uuid': 10.0.0 + compare-versions: 6.1.1 + fast-json-patch: 3.1.1 + rxjs: 7.8.1 + untruncate-json: 0.0.1 + uuid: 11.1.0 + zod: 3.25.76 + + '@ag-ui/core@0.0.42': + dependencies: + rxjs: 7.8.1 + zod: 3.25.76 + + '@ag-ui/encoder@0.0.42': + dependencies: + '@ag-ui/core': 0.0.42 + '@ag-ui/proto': 0.0.42 + + '@ag-ui/langgraph@0.0.20(patch_hash=c2o2k2psro7eonr2y3bgst37qm)(@ag-ui/client@0.0.42(patch_hash=g3vb6i4qg2banxpgna3ko3w63m))(@ag-ui/core@0.0.42)(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@ag-ui/client': 0.0.42(patch_hash=g3vb6i4qg2banxpgna3ko3w63m) + '@ag-ui/core': 0.0.42 + '@langchain/core': 0.3.80(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) + '@langchain/langgraph-sdk': 0.1.10(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + partial-json: 0.1.7 + rxjs: 7.8.1 + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - openai + - react + - react-dom + + '@ag-ui/proto@0.0.42': + dependencies: + '@ag-ui/core': 0.0.42 + '@bufbuild/protobuf': 2.11.0 + '@protobuf-ts/protoc': 2.11.1 + + '@ai-sdk/anthropic@2.0.58(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.1 + '@ai-sdk/provider-utils': 3.0.20(zod@3.25.76) + zod: 3.25.76 + + '@ai-sdk/gateway@2.0.30(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.1 + '@ai-sdk/provider-utils': 3.0.20(zod@3.25.76) + '@vercel/oidc': 3.1.0 + zod: 3.25.76 + + '@ai-sdk/gateway@2.0.30(zod@4.3.6)': + dependencies: + '@ai-sdk/provider': 2.0.1 + '@ai-sdk/provider-utils': 3.0.20(zod@4.3.6) + '@vercel/oidc': 3.1.0 + zod: 4.3.6 + + '@ai-sdk/google@2.0.52(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.1 + '@ai-sdk/provider-utils': 3.0.20(zod@3.25.76) + zod: 3.25.76 + + '@ai-sdk/mcp@0.0.8(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.17(zod@3.25.76) + pkce-challenge: 5.0.1 + zod: 3.25.76 + + '@ai-sdk/openai-compatible@1.0.32(zod@4.3.6)': + dependencies: + '@ai-sdk/provider': 2.0.1 + '@ai-sdk/provider-utils': 3.0.20(zod@4.3.6) + zod: 4.3.6 + + '@ai-sdk/openai@2.0.89(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.1 + '@ai-sdk/provider-utils': 3.0.20(zod@3.25.76) + zod: 3.25.76 + + '@ai-sdk/openai@2.0.89(zod@4.3.6)': + dependencies: + '@ai-sdk/provider': 2.0.1 + '@ai-sdk/provider-utils': 3.0.20(zod@4.3.6) + zod: 4.3.6 + + '@ai-sdk/provider-utils@2.2.8(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 1.1.3 + nanoid: 3.3.11 + secure-json-parse: 2.7.0 + zod: 3.25.76 + + '@ai-sdk/provider-utils@3.0.17(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@standard-schema/spec': 1.1.0 + eventsource-parser: 3.0.6 + zod: 3.25.76 + + '@ai-sdk/provider-utils@3.0.20(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.1 + '@standard-schema/spec': 1.1.0 + eventsource-parser: 3.0.6 + zod: 3.25.76 + + '@ai-sdk/provider-utils@3.0.20(zod@4.3.6)': + dependencies: + '@ai-sdk/provider': 2.0.1 + '@standard-schema/spec': 1.1.0 + eventsource-parser: 3.0.6 + zod: 4.3.6 + + '@ai-sdk/provider@1.1.3': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/provider@2.0.0': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/provider@2.0.1': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/react@1.2.12(react@19.2.4)(zod@3.25.76)': + dependencies: + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) + react: 19.2.4 + swr: 2.4.0(react@19.2.4) + throttleit: 2.1.0 + optionalDependencies: + zod: 3.25.76 + + '@ai-sdk/ui-utils@1.2.11(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + + '@ai-sdk/xai@2.0.56(zod@4.3.6)': + dependencies: + '@ai-sdk/openai-compatible': 1.0.32(zod@4.3.6) + '@ai-sdk/provider': 2.0.1 + '@ai-sdk/provider-utils': 3.0.20(zod@4.3.6) + zod: 4.3.6 + + '@alloc/quick-lru@5.2.0': {} + + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.6.0 + tinyexec: 1.0.2 + + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.0': {} + + '@babel/core@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.0 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helpers': 7.28.6 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.0': + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.28.6': + dependencies: + '@babel/compat-data': 7.29.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.28.6': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.6': + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + + '@babel/parser@7.29.0': + dependencies: + '@babel/types': 7.29.0 + + '@babel/runtime@7.28.6': {} + + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + + '@babel/traverse@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.0 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@base-org/account@1.1.1(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@noble/hashes': 1.4.0 + clsx: 1.2.1 + eventemitter3: 5.0.1 + idb-keyval: 6.2.1 + ox: 0.6.9(typescript@5.9.3)(zod@3.25.76) + preact: 10.24.2 + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zustand: 5.0.3(@types/react@19.2.10)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) + transitivePeerDependencies: + - '@types/react' + - bufferutil + - immer + - react + - typescript + - use-sync-external-store + - utf-8-validate + - zod + + '@base-org/account@2.4.0(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@coinbase/cdp-sdk': 1.44.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@noble/hashes': 1.4.0 + clsx: 1.2.1 + eventemitter3: 5.0.1 + idb-keyval: 6.2.1 + ox: 0.6.9(typescript@5.9.3)(zod@3.25.76) + preact: 10.24.2 + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6) + zustand: 5.0.3(@types/react@19.2.10)(react@19.2.4)(use-sync-external-store@1.4.0(react@19.2.4)) + transitivePeerDependencies: + - '@types/react' + - bufferutil + - debug + - encoding + - fastestsmallesttextencoderdecoder + - immer + - react + - typescript + - use-sync-external-store + - utf-8-validate + - zod + + '@bcoe/v8-coverage@1.0.2': {} + + '@braintree/sanitize-url@7.1.2': {} + + '@bufbuild/protobuf@2.11.0': {} + + '@cfworker/json-schema@4.1.1': {} + + '@chevrotain/cst-dts-gen@11.0.3': + dependencies: + '@chevrotain/gast': 11.0.3 + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + + '@chevrotain/gast@11.0.3': + dependencies: + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + + '@chevrotain/regexp-to-ast@11.0.3': {} + + '@chevrotain/types@11.0.3': {} + + '@chevrotain/utils@11.0.3': {} + + '@clack/core@0.4.1': + dependencies: + picocolors: 1.1.1 + sisteransi: 1.0.5 + + '@clack/prompts@0.9.1': + dependencies: + '@clack/core': 0.4.1 + picocolors: 1.1.1 + sisteransi: 1.0.5 + + '@coinbase/cdp-sdk@1.44.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana-program/system': 0.10.0(@solana/kit@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@solana-program/token': 0.9.0(@solana/kit@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@solana/kit': 5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + abitype: 1.0.6(typescript@5.9.3)(zod@3.25.76) + axios: 1.13.4 + axios-retry: 4.5.0(axios@1.13.4) + jose: 6.1.3 + md5: 2.3.0 + uncrypto: 0.1.3 + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zod: 3.25.76 + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + + '@coinbase/wallet-sdk@3.9.3': + dependencies: + bn.js: 5.2.2 + buffer: 6.0.3 + clsx: 1.2.1 + eth-block-tracker: 7.1.0 + eth-json-rpc-filters: 6.0.1 + eventemitter3: 5.0.4 + keccak: 3.0.4 + preact: 10.28.3 + sha.js: 2.4.12 + transitivePeerDependencies: + - supports-color + + '@coinbase/wallet-sdk@4.3.2': + dependencies: + '@noble/hashes': 1.8.0 + clsx: 1.2.1 + eventemitter3: 5.0.4 + preact: 10.28.3 + + '@coinbase/wallet-sdk@4.3.6(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@noble/hashes': 1.4.0 + clsx: 1.2.1 + eventemitter3: 5.0.1 + idb-keyval: 6.2.1 + ox: 0.6.9(typescript@5.9.3)(zod@3.25.76) + preact: 10.24.2 + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6) + zustand: 5.0.3(@types/react@19.2.10)(react@19.2.4)(use-sync-external-store@1.4.0(react@19.2.4)) + transitivePeerDependencies: + - '@types/react' + - bufferutil + - immer + - react + - typescript + - use-sync-external-store + - utf-8-validate + - zod + + '@colors/colors@1.6.0': {} + + '@commander-js/extra-typings@13.1.0(commander@13.1.0)': + dependencies: + commander: 13.1.0 + + '@copilotkit/react-core@1.50.1(patch_hash=2ttosfnlnojrtz6fvhfhzzzvly)(@types/mdast@4.0.4)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(graphql@16.12.0)(micromark-util-types@2.0.2)(micromark@4.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76)': + dependencies: + '@ag-ui/client': 0.0.42(patch_hash=g3vb6i4qg2banxpgna3ko3w63m) + '@copilotkit/runtime-client-gql': 1.50.1(graphql@16.12.0)(react@19.2.4) + '@copilotkit/shared': 1.50.1 + '@copilotkitnext/core': 0.0.33(patch_hash=xuedn7hxakcsv22g6465qile5e) + '@copilotkitnext/react': 0.0.33(@types/mdast@4.0.4)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(micromark-util-types@2.0.2)(micromark@4.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@scarf/scarf': 1.4.0 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-markdown: 8.0.7(@types/react@19.2.10)(react@19.2.4) + untruncate-json: 0.0.1 + zod: 3.25.76 + transitivePeerDependencies: + - '@types/mdast' + - '@types/react' + - '@types/react-dom' + - encoding + - graphql + - micromark + - micromark-util-types + - supports-color + + '@copilotkit/react-ui@1.50.1(@types/mdast@4.0.4)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(graphql@16.12.0)(micromark-util-types@2.0.2)(micromark@4.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76)': + dependencies: + '@copilotkit/react-core': 1.50.1(patch_hash=2ttosfnlnojrtz6fvhfhzzzvly)(@types/mdast@4.0.4)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(graphql@16.12.0)(micromark-util-types@2.0.2)(micromark@4.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76) + '@copilotkit/runtime-client-gql': 1.50.1(graphql@16.12.0)(react@19.2.4) + '@copilotkit/shared': 1.50.1 + '@headlessui/react': 2.2.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-markdown: 10.1.0(@types/react@19.2.10)(react@19.2.4) + react-syntax-highlighter: 15.6.6(react@19.2.4) + rehype-raw: 7.0.0 + remark-gfm: 4.0.1 + remark-math: 6.0.0 + transitivePeerDependencies: + - '@types/mdast' + - '@types/react' + - '@types/react-dom' + - encoding + - graphql + - micromark + - micromark-util-types + - react-dom + - supports-color + - zod + + '@copilotkit/runtime-client-gql@1.50.1(graphql@16.12.0)(react@19.2.4)': + dependencies: + '@copilotkit/shared': 1.50.1 + '@urql/core': 5.2.0(graphql@16.12.0) + react: 19.2.4 + untruncate-json: 0.0.1 + urql: 4.2.2(@urql/core@5.2.0(graphql@16.12.0))(react@19.2.4) + transitivePeerDependencies: + - encoding + - graphql + + '@copilotkit/runtime@1.50.1(patch_hash=r2cedgs25yliqjcfppzh7jma7e)(sldyf2ylqp4vhyz6u46tcwxeri)': + dependencies: + '@ag-ui/client': 0.0.42(patch_hash=g3vb6i4qg2banxpgna3ko3w63m) + '@ag-ui/core': 0.0.42 + '@ag-ui/langgraph': 0.0.20(patch_hash=c2o2k2psro7eonr2y3bgst37qm)(@ag-ui/client@0.0.42(patch_hash=g3vb6i4qg2banxpgna3ko3w63m))(@ag-ui/core@0.0.42)(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@copilotkit/shared': 1.50.1 + '@copilotkitnext/agent': 0.0.33(@cfworker/json-schema@4.1.1)(hono@4.11.7) + '@copilotkitnext/runtime': 0.0.33(patch_hash=dakc4qoohdmctvusr4pufvrn3e)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) + '@graphql-yoga/plugin-defer-stream': 3.18.0(graphql-yoga@5.18.0(graphql@16.12.0))(graphql@16.12.0) + '@hono/node-server': 1.19.9(hono@4.11.7) + '@langchain/core': 0.3.80(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) + '@scarf/scarf': 1.4.0 + class-transformer: 0.5.1 + class-validator: 0.14.3 + graphql: 16.12.0 + graphql-scalars: 1.25.0(graphql@16.12.0) + graphql-yoga: 5.18.0(graphql@16.12.0) + hono: 4.11.7 + partial-json: 0.1.7 + pino: 9.14.0 + pino-pretty: 11.3.0 + reflect-metadata: 0.2.2 + rxjs: 7.8.1 + type-graphql: 2.0.0-rc.1(class-validator@0.14.3)(graphql-scalars@1.25.0(graphql@16.12.0))(graphql@16.12.0) + zod: 3.25.76 + optionalDependencies: + '@langchain/langgraph-sdk': 1.0.3(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@langchain/openai': 1.2.4(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + langchain: 0.3.37(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(@opentelemetry/api@1.9.0)(axios@1.13.4)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + openai: 6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) + transitivePeerDependencies: + - '@cfworker/json-schema' + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - encoding + - react + - react-dom + - supports-color + + '@copilotkit/sdk-js@1.50.1(@langchain/community@0.0.53(lodash@4.17.23)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(@langchain/langgraph@1.0.2(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6))(langchain@0.3.37(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(axios@1.13.4)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(typescript@5.9.3)(zod@4.3.6)': + dependencies: + '@copilotkit/shared': 1.50.1 + '@langchain/community': 0.0.53(lodash@4.17.23)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/core': 1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + '@langchain/langgraph': 1.0.2(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6) + langchain: 0.3.37(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(axios@1.13.4)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + typescript: 5.9.3 + zod: 4.3.6 + transitivePeerDependencies: + - encoding + + '@copilotkit/sdk-js@1.50.1(@langchain/community@0.0.53(lodash@4.17.23)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(@langchain/langgraph@1.0.2(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6))(langchain@0.3.37(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(axios@1.13.4)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(typescript@5.9.3)(zod@4.3.6)': + dependencies: + '@copilotkit/shared': 1.50.1 + '@langchain/community': 0.0.53(lodash@4.17.23)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/core': 1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + '@langchain/langgraph': 1.0.2(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6) + langchain: 0.3.37(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(axios@1.13.4)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + typescript: 5.9.3 + zod: 4.3.6 + transitivePeerDependencies: + - encoding + + '@copilotkit/shared@1.50.1': + dependencies: + '@ag-ui/core': 0.0.42 + '@segment/analytics-node': 2.3.0 + chalk: 4.1.2 + graphql: 16.12.0 + uuid: 10.0.0 + zod: 3.25.76 + transitivePeerDependencies: + - encoding + + '@copilotkitnext/agent@0.0.33(@cfworker/json-schema@4.1.1)(hono@4.11.7)': + dependencies: + '@ag-ui/client': 0.0.42(patch_hash=g3vb6i4qg2banxpgna3ko3w63m) + '@ai-sdk/anthropic': 2.0.58(zod@3.25.76) + '@ai-sdk/google': 2.0.52(zod@3.25.76) + '@ai-sdk/mcp': 0.0.8(zod@3.25.76) + '@ai-sdk/openai': 2.0.89(zod@3.25.76) + '@modelcontextprotocol/sdk': 1.25.3(@cfworker/json-schema@4.1.1)(hono@4.11.7)(zod@3.25.76) + ai: 5.0.124(zod@3.25.76) + rxjs: 7.8.1 + zod: 3.25.76 + transitivePeerDependencies: + - '@cfworker/json-schema' + - hono + - supports-color + + '@copilotkitnext/core@0.0.33(patch_hash=xuedn7hxakcsv22g6465qile5e)': + dependencies: + '@ag-ui/client': 0.0.42(patch_hash=g3vb6i4qg2banxpgna3ko3w63m) + '@copilotkitnext/shared': 0.0.33 + rxjs: 7.8.1 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + + '@copilotkitnext/react@0.0.33(@types/mdast@4.0.4)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(micromark-util-types@2.0.2)(micromark@4.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@ag-ui/client': 0.0.42(patch_hash=g3vb6i4qg2banxpgna3ko3w63m) + '@ag-ui/core': 0.0.42 + '@copilotkitnext/core': 0.0.33(patch_hash=xuedn7hxakcsv22g6465qile5e) + '@copilotkitnext/shared': 0.0.33 + '@copilotkitnext/web-inspector': 0.0.33 + '@lit-labs/react': 2.1.3(@types/react@19.2.10) + '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + class-variance-authority: 0.7.1 + clsx: 2.1.1 + katex: 0.16.28 + lucide-react: 0.525.0(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + streamdown: 1.6.11(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(react@19.2.4) + tailwind-merge: 3.4.0 + ts-deepmerge: 7.0.3 + tw-animate-css: 1.4.0 + use-stick-to-bottom: 1.1.2(react@19.2.4) + zod: 3.25.76 + transitivePeerDependencies: + - '@types/mdast' + - '@types/react' + - '@types/react-dom' + - micromark + - micromark-util-types + - supports-color + + '@copilotkitnext/runtime@0.0.33(patch_hash=dakc4qoohdmctvusr4pufvrn3e)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))': + dependencies: + '@ag-ui/client': 0.0.42(patch_hash=g3vb6i4qg2banxpgna3ko3w63m) + '@ag-ui/core': 0.0.42 + '@ag-ui/encoder': 0.0.42 + '@copilotkitnext/shared': 0.0.33 + cors: 2.8.6 + express: 4.22.1 + hono: 4.11.7 + openai: 6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) + rxjs: 7.8.1 + transitivePeerDependencies: + - supports-color + + '@copilotkitnext/shared@0.0.33': + dependencies: + '@ag-ui/client': 0.0.42(patch_hash=g3vb6i4qg2banxpgna3ko3w63m) + partial-json: 0.1.7 + uuid: 11.1.0 + + '@copilotkitnext/web-inspector@0.0.33': + dependencies: + '@ag-ui/client': 0.0.42(patch_hash=g3vb6i4qg2banxpgna3ko3w63m) + '@copilotkitnext/core': 0.0.33(patch_hash=xuedn7hxakcsv22g6465qile5e) + lit: 3.3.2 + lucide: 0.525.0 + marked: 12.0.2 + + '@dabh/diagnostics@2.0.8': + dependencies: + '@so-ric/colorspace': 1.1.6 + enabled: 2.0.0 + kuler: 2.0.0 + + '@ecies/ciphers@0.2.5(@noble/ciphers@1.3.0)': + dependencies: + '@noble/ciphers': 1.3.0 + + '@emberai/agent-node@1.2.0(@bufbuild/protobuf@2.11.0)(@cfworker/json-schema@4.1.1)(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(hono@4.11.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@a2a-js/sdk': 0.3.9(@bufbuild/protobuf@2.11.0)(express@5.2.1) + '@ai-sdk/openai': 2.0.89(zod@4.3.6) + '@ai-sdk/provider-utils': 3.0.20(zod@4.3.6) + '@ai-sdk/xai': 2.0.56(zod@4.3.6) + '@hyperbolic/ai-sdk-provider': 0.1.3(react@19.2.4) + '@metamask/delegation-toolkit': 0.13.0(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6)) + '@modelcontextprotocol/sdk': 1.25.3(@cfworker/json-schema@4.1.1)(hono@4.11.7)(zod@4.3.6) + '@openrouter/ai-sdk-provider': 1.5.4(ai@5.0.124(zod@4.3.6))(zod@4.3.6) + '@pnpm/exe': 10.28.2 + ai: 5.0.124(zod@4.3.6) + ajv: 8.17.1 + cors: 2.8.6 + express: 5.2.1 + gray-matter: 4.0.3 + jiti: 2.6.1 + json-schema-to-zod: 2.7.0 + ora: 9.1.0 + permissionless: 0.2.57(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6)) + picocolors: 1.1.1 + pinata: 2.5.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + prompts: 2.4.2 + uuid: 13.0.0 + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6) + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + x402: 0.6.6(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + zod: 4.3.6 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@bufbuild/protobuf' + - '@capacitor/preferences' + - '@cfworker/json-schema' + - '@deno/kv' + - '@grpc/grpc-js' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@solana/sysvars' + - '@tanstack/query-core' + - '@tanstack/react-query' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - debug + - encoding + - expo-auth-session + - expo-crypto + - expo-web-browser + - fastestsmallesttextencoderdecoder + - hono + - immer + - ioredis + - ox + - react + - react-dom + - react-native + - supports-color + - typescript + - uploadthing + - utf-8-validate + + '@emnapi/core@1.8.1': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.8.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emotion/is-prop-valid@1.4.0': + dependencies: + '@emotion/memoize': 0.9.0 + + '@emotion/memoize@0.9.0': {} + + '@emotion/unitless@0.10.0': {} + + '@envelop/core@5.5.0': + dependencies: + '@envelop/instrumentation': 1.0.0 + '@envelop/types': 5.2.1 + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@envelop/instrumentation@1.0.0': + dependencies: + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@envelop/types@5.2.1': + dependencies: + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/aix-ppc64@0.27.2': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.27.2': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-arm@0.27.2': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/android-x64@0.27.2': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.27.2': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.27.2': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.27.2': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.27.2': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.27.2': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-arm@0.27.2': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.27.2': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.27.2': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.27.2': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.27.2': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.27.2': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.27.2': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/linux-x64@0.27.2': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.27.2': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.27.2': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.27.2': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.27.2': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.27.2': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.27.2': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.27.2': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.27.2': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@esbuild/win32-x64@0.27.2': + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))': + dependencies: + eslint: 9.39.2(jiti@2.6.1) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.21.1': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.3': + dependencies: + ajv: 6.12.6 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.39.2': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 + + '@ethereumjs/common@3.2.0': + dependencies: + '@ethereumjs/util': 8.1.0 + crc-32: 1.2.2 + + '@ethereumjs/rlp@4.0.1': {} + + '@ethereumjs/tx@4.2.0': + dependencies: + '@ethereumjs/common': 3.2.0 + '@ethereumjs/rlp': 4.0.1 + '@ethereumjs/util': 8.1.0 + ethereum-cryptography: 2.2.1 + + '@ethereumjs/util@8.1.0': + dependencies: + '@ethereumjs/rlp': 4.0.1 + ethereum-cryptography: 2.2.1 + micro-ftch: 0.3.1 + + '@fastify/busboy@3.2.0': {} + + '@floating-ui/core@1.7.4': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.5': + dependencies: + '@floating-ui/core': 1.7.4 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/react-dom@2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@floating-ui/dom': 1.7.5 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@floating-ui/react@0.26.28(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@floating-ui/react-dom': 2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@floating-ui/utils': 0.2.10 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + tabbable: 6.4.0 + + '@floating-ui/utils@0.2.10': {} + + '@gemini-wallet/core@0.3.2(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + dependencies: + '@metamask/rpc-errors': 7.0.2 + eventemitter3: 5.0.1 + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - supports-color + + '@gemini-wallet/core@0.3.2(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6))': + dependencies: + '@metamask/rpc-errors': 7.0.2 + eventemitter3: 5.0.1 + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6) + transitivePeerDependencies: + - supports-color + + '@graphql-tools/executor@1.5.1(graphql@16.12.0)': + dependencies: + '@graphql-tools/utils': 11.0.0(graphql@16.12.0) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.12.0) + '@repeaterjs/repeater': 3.0.6 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/promise-helpers': 1.3.2 + graphql: 16.12.0 + tslib: 2.8.1 + + '@graphql-tools/merge@9.1.7(graphql@16.12.0)': + dependencies: + '@graphql-tools/utils': 11.0.0(graphql@16.12.0) + graphql: 16.12.0 + tslib: 2.8.1 + + '@graphql-tools/schema@10.0.31(graphql@16.12.0)': + dependencies: + '@graphql-tools/merge': 9.1.7(graphql@16.12.0) + '@graphql-tools/utils': 11.0.0(graphql@16.12.0) + graphql: 16.12.0 + tslib: 2.8.1 + + '@graphql-tools/utils@10.11.0(graphql@16.12.0)': + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.12.0) + '@whatwg-node/promise-helpers': 1.3.2 + cross-inspect: 1.0.1 + graphql: 16.12.0 + tslib: 2.8.1 + + '@graphql-tools/utils@11.0.0(graphql@16.12.0)': + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.12.0) + '@whatwg-node/promise-helpers': 1.3.2 + cross-inspect: 1.0.1 + graphql: 16.12.0 + tslib: 2.8.1 + + '@graphql-typed-document-node/core@3.2.0(graphql@16.12.0)': + dependencies: + graphql: 16.12.0 + + '@graphql-yoga/logger@2.0.1': + dependencies: + tslib: 2.8.1 + + '@graphql-yoga/plugin-defer-stream@3.18.0(graphql-yoga@5.18.0(graphql@16.12.0))(graphql@16.12.0)': + dependencies: + '@graphql-tools/utils': 10.11.0(graphql@16.12.0) + graphql: 16.12.0 + graphql-yoga: 5.18.0(graphql@16.12.0) + + '@graphql-yoga/subscription@5.0.5': + dependencies: + '@graphql-yoga/typed-event-target': 3.0.2 + '@repeaterjs/repeater': 3.0.6 + '@whatwg-node/events': 0.1.2 + tslib: 2.8.1 + + '@graphql-yoga/typed-event-target@3.0.2': + dependencies: + '@repeaterjs/repeater': 3.0.6 + tslib: 2.8.1 + + '@hcaptcha/loader@2.3.0': {} + + '@hcaptcha/react-hcaptcha@1.17.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@babel/runtime': 7.28.6 + '@hcaptcha/loader': 2.3.0 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@headlessui/react@2.2.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@floating-ui/react': 0.26.28(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@react-aria/focus': 3.21.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@react-aria/interactions': 3.26.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@tanstack/react-virtual': 3.13.18(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + use-sync-external-store: 1.6.0(react@19.2.4) + + '@heroicons/react@2.2.0(react@19.2.4)': + dependencies: + react: 19.2.4 + + '@hono/node-server@1.19.9(hono@4.11.7)': + dependencies: + hono: 4.11.7 + + '@hono/zod-validator@0.7.6(hono@4.11.7)(zod@4.3.6)': + dependencies: + hono: 4.11.7 + zod: 4.3.6 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@hyperbolic/ai-sdk-provider@0.1.3(react@19.2.4)': + dependencies: + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + ai: 4.3.19(react@19.2.4)(zod@3.25.76) + zod: 3.25.76 + transitivePeerDependencies: + - react + + '@iconify/types@2.0.0': {} + + '@iconify/utils@3.1.0': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@iconify/types': 2.0.0 + mlly: 1.8.0 + + '@img/colour@1.0.0': + optional: true + + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true + + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true + + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true + + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.8.1 + optional: true + + '@img/sharp-win32-arm64@0.34.5': + optional: true + + '@img/sharp-win32-ia32@0.34.5': + optional: true + + '@img/sharp-win32-x64@0.34.5': + optional: true + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@langchain/community@0.0.53(lodash@4.17.23)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@langchain/core': 0.1.63(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + '@langchain/openai': 0.0.34(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + expr-eval: 2.0.2 + flat: 5.0.2 + langsmith: 0.1.68(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + uuid: 9.0.1 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + optionalDependencies: + lodash: 4.17.23 + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - encoding + - openai + + '@langchain/community@0.0.53(lodash@4.17.23)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@langchain/core': 0.1.63(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + '@langchain/openai': 0.0.34(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + expr-eval: 2.0.2 + flat: 5.0.2 + langsmith: 0.1.68(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + uuid: 9.0.1 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + optionalDependencies: + lodash: 4.17.23 + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - encoding + - openai + + '@langchain/core@0.1.63(openai@4.104.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))': + dependencies: + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.21 + langsmith: 0.1.68(openai@4.104.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) + ml-distance: 4.0.1 + mustache: 4.2.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 9.0.1 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + transitivePeerDependencies: + - openai + + '@langchain/core@0.1.63(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))': + dependencies: + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.21 + langsmith: 0.1.68(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) + ml-distance: 4.0.1 + mustache: 4.2.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 9.0.1 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + transitivePeerDependencies: + - openai + + '@langchain/core@0.1.63(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))': + dependencies: + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.21 + langsmith: 0.1.68(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + ml-distance: 4.0.1 + mustache: 4.2.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 9.0.1 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + transitivePeerDependencies: + - openai + + '@langchain/core@0.1.63(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))': + dependencies: + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.21 + langsmith: 0.1.68(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + ml-distance: 4.0.1 + mustache: 4.2.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 9.0.1 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + transitivePeerDependencies: + - openai + + '@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))': + dependencies: + '@cfworker/json-schema': 4.1.1 + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.21 + langsmith: 0.3.87(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) + mustache: 4.2.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 10.0.0 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - openai + + '@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))': + dependencies: + '@cfworker/json-schema': 4.1.1 + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.21 + langsmith: 0.4.12(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + mustache: 4.2.0 + p-queue: 6.6.2 + uuid: 10.0.0 + zod: 4.3.6 + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - openai + + '@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))': + dependencies: + '@cfworker/json-schema': 4.1.1 + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.21 + langsmith: 0.4.12(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + mustache: 4.2.0 + p-queue: 6.6.2 + uuid: 10.0.0 + zod: 4.3.6 + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - openai + + '@langchain/langgraph-api@1.1.11(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(@langchain/langgraph-checkpoint@1.0.0(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))))(@langchain/langgraph-sdk@1.0.3(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@langchain/langgraph@1.0.2(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6))(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(typescript@5.9.3)': + dependencies: + '@babel/code-frame': 7.29.0 + '@hono/node-server': 1.19.9(hono@4.11.7) + '@hono/zod-validator': 0.7.6(hono@4.11.7)(zod@4.3.6) + '@langchain/core': 1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + '@langchain/langgraph': 1.0.2(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6) + '@langchain/langgraph-checkpoint': 1.0.0(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))) + '@langchain/langgraph-ui': 1.1.11 + '@types/json-schema': 7.0.15 + '@typescript/vfs': 1.6.2(typescript@5.9.3) + dedent: 1.7.1 + dotenv: 16.6.1 + exit-hook: 4.0.0 + hono: 4.11.7 + langsmith: 0.3.87(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + open: 10.2.0 + semver: 7.7.3 + stacktrace-parser: 0.1.11 + superjson: 2.2.6 + tsx: 4.21.0 + typescript: 5.9.3 + uuid: 10.0.0 + winston: 3.19.0 + winston-console-format: 1.0.8 + zod: 4.3.6 + optionalDependencies: + '@langchain/langgraph-sdk': 1.0.3(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - babel-plugin-macros + - openai + - supports-color + + '@langchain/langgraph-api@1.1.11(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(@langchain/langgraph-checkpoint@1.0.0(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))))(@langchain/langgraph-sdk@1.0.3(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@langchain/langgraph@1.0.2(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6))(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(typescript@5.9.3)': + dependencies: + '@babel/code-frame': 7.29.0 + '@hono/node-server': 1.19.9(hono@4.11.7) + '@hono/zod-validator': 0.7.6(hono@4.11.7)(zod@4.3.6) + '@langchain/core': 1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + '@langchain/langgraph': 1.0.2(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6) + '@langchain/langgraph-checkpoint': 1.0.0(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))) + '@langchain/langgraph-ui': 1.1.11 + '@types/json-schema': 7.0.15 + '@typescript/vfs': 1.6.2(typescript@5.9.3) + dedent: 1.7.1 + dotenv: 16.6.1 + exit-hook: 4.0.0 + hono: 4.11.7 + langsmith: 0.3.87(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + open: 10.2.0 + semver: 7.7.3 + stacktrace-parser: 0.1.11 + superjson: 2.2.6 + tsx: 4.21.0 + typescript: 5.9.3 + uuid: 10.0.0 + winston: 3.19.0 + winston-console-format: 1.0.8 + zod: 4.3.6 + optionalDependencies: + '@langchain/langgraph-sdk': 1.0.3(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - babel-plugin-macros + - openai + - supports-color + + '@langchain/langgraph-checkpoint@1.0.0(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))': + dependencies: + '@langchain/core': 1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + uuid: 10.0.0 + + '@langchain/langgraph-checkpoint@1.0.0(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))': + dependencies: + '@langchain/core': 1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + uuid: 10.0.0 + + '@langchain/langgraph-cli@1.1.11(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(@langchain/langgraph-checkpoint@1.0.0(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))))(@langchain/langgraph-sdk@1.0.3(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@langchain/langgraph@1.0.2(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6))(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(typescript@5.9.3)': + dependencies: + '@babel/code-frame': 7.29.0 + '@commander-js/extra-typings': 13.1.0(commander@13.1.0) + '@langchain/langgraph-api': 1.1.11(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(@langchain/langgraph-checkpoint@1.0.0(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))))(@langchain/langgraph-sdk@1.0.3(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@langchain/langgraph@1.0.2(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6))(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(typescript@5.9.3) + chokidar: 4.0.3 + commander: 13.1.0 + create-langgraph: 1.1.5 + dedent: 1.7.1 + dotenv: 16.6.1 + execa: 9.6.1 + exit-hook: 4.0.0 + extract-zip: 2.0.1 + langsmith: 0.3.87(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + open: 10.2.0 + package-manager-detector: 1.6.0 + stacktrace-parser: 0.1.11 + tar: 7.5.7 + winston: 3.19.0 + winston-console-format: 1.0.8 + yaml: 2.8.2 + zod: 4.3.6 + transitivePeerDependencies: + - '@langchain/core' + - '@langchain/langgraph' + - '@langchain/langgraph-checkpoint' + - '@langchain/langgraph-sdk' + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - babel-plugin-macros + - openai + - supports-color + - typescript + + '@langchain/langgraph-sdk@0.1.10(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@types/json-schema': 7.0.15 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 9.0.1 + optionalDependencies: + '@langchain/core': 0.3.80(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@langchain/langgraph-sdk@1.0.3(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 9.0.1 + optionalDependencies: + '@langchain/core': 0.3.80(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optional: true + + '@langchain/langgraph-sdk@1.0.3(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 9.0.1 + optionalDependencies: + '@langchain/core': 1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@langchain/langgraph-sdk@1.0.3(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 9.0.1 + optionalDependencies: + '@langchain/core': 1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@langchain/langgraph-ui@1.1.11': + dependencies: + '@commander-js/extra-typings': 13.1.0(commander@13.1.0) + commander: 13.1.0 + esbuild: 0.25.12 + esbuild-plugin-tailwindcss: 2.1.0 + zod: 4.3.6 + + '@langchain/langgraph@1.0.2(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6)': + dependencies: + '@langchain/core': 1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + '@langchain/langgraph-checkpoint': 1.0.0(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))) + '@langchain/langgraph-sdk': 1.0.3(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + uuid: 10.0.0 + zod: 4.3.6 + optionalDependencies: + zod-to-json-schema: 3.25.1(zod@4.3.6) + transitivePeerDependencies: + - react + - react-dom + + '@langchain/langgraph@1.0.2(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6)': + dependencies: + '@langchain/core': 1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + '@langchain/langgraph-checkpoint': 1.0.0(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))) + '@langchain/langgraph-sdk': 1.0.3(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + uuid: 10.0.0 + zod: 4.3.6 + optionalDependencies: + zod-to-json-schema: 3.25.1(zod@4.3.6) + transitivePeerDependencies: + - react + - react-dom + + '@langchain/openai@0.0.34(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@langchain/core': 0.1.63(openai@4.104.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) + js-tiktoken: 1.0.21 + openai: 4.104.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + transitivePeerDependencies: + - encoding + - ws + + '@langchain/openai@0.0.34(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@langchain/core': 0.1.63(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) + js-tiktoken: 1.0.21 + openai: 4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + transitivePeerDependencies: + - encoding + - ws + + '@langchain/openai@0.6.17(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@langchain/core': 0.3.80(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) + js-tiktoken: 1.0.21 + openai: 5.12.2(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) + zod: 3.25.76 + transitivePeerDependencies: + - ws + optional: true + + '@langchain/openai@0.6.17(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@langchain/core': 1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + js-tiktoken: 1.0.21 + openai: 5.12.2(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) + zod: 3.25.76 + transitivePeerDependencies: + - ws + + '@langchain/openai@0.6.17(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@langchain/core': 1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + js-tiktoken: 1.0.21 + openai: 5.12.2(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) + zod: 3.25.76 + transitivePeerDependencies: + - ws + + '@langchain/openai@1.2.4(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@langchain/core': 0.3.80(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) + js-tiktoken: 1.0.21 + openai: 6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6) + zod: 4.3.6 + transitivePeerDependencies: + - ws + optional: true + + '@langchain/openai@1.2.4(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@langchain/core': 1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + js-tiktoken: 1.0.21 + openai: 6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6) + zod: 4.3.6 + transitivePeerDependencies: + - ws + + '@langchain/openai@1.2.4(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@langchain/core': 1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + js-tiktoken: 1.0.21 + openai: 6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6) + zod: 4.3.6 + transitivePeerDependencies: + - ws + + '@langchain/textsplitters@0.1.0(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))': + dependencies: + '@langchain/core': 0.3.80(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) + js-tiktoken: 1.0.21 + optional: true + + '@langchain/textsplitters@0.1.0(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))': + dependencies: + '@langchain/core': 1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + js-tiktoken: 1.0.21 + + '@langchain/textsplitters@0.1.0(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))': + dependencies: + '@langchain/core': 1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + js-tiktoken: 1.0.21 + + '@lit-labs/react@2.1.3(@types/react@19.2.10)': + dependencies: + '@lit/react': 1.0.8(@types/react@19.2.10) + transitivePeerDependencies: + - '@types/react' + + '@lit-labs/ssr-dom-shim@1.5.1': {} + + '@lit/react@1.0.8(@types/react@19.2.10)': + dependencies: + '@types/react': 19.2.10 + + '@lit/reactive-element@2.1.2': + dependencies: + '@lit-labs/ssr-dom-shim': 1.5.1 + + '@lukeed/csprng@1.1.0': {} + + '@lukeed/uuid@2.0.1': + dependencies: + '@lukeed/csprng': 1.1.0 + + '@marsidev/react-turnstile@1.4.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@mermaid-js/parser@0.6.3': + dependencies: + langium: 3.3.1 + + '@metamask/7715-permission-types@0.3.0': {} + + '@metamask/abi-utils@3.0.0': + dependencies: + '@metamask/superstruct': 3.2.1 + '@metamask/utils': 11.9.0 + transitivePeerDependencies: + - supports-color + + '@metamask/delegation-abis@0.11.0': {} + + '@metamask/delegation-core@0.2.0': + dependencies: + '@metamask/abi-utils': 3.0.0 + '@metamask/utils': 11.9.0 + '@noble/hashes': 1.8.0 + transitivePeerDependencies: + - supports-color + + '@metamask/delegation-deployments@0.12.0': {} + + '@metamask/delegation-toolkit@0.13.0(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + dependencies: + '@metamask/7715-permission-types': 0.3.0 + '@metamask/delegation-abis': 0.11.0 + '@metamask/delegation-core': 0.2.0 + '@metamask/delegation-deployments': 0.12.0 + buffer: 6.0.3 + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + webauthn-p256: 0.0.10 + transitivePeerDependencies: + - supports-color + + '@metamask/delegation-toolkit@0.13.0(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6))': + dependencies: + '@metamask/7715-permission-types': 0.3.0 + '@metamask/delegation-abis': 0.11.0 + '@metamask/delegation-core': 0.2.0 + '@metamask/delegation-deployments': 0.12.0 + buffer: 6.0.3 + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6) + webauthn-p256: 0.0.10 + transitivePeerDependencies: + - supports-color + + '@metamask/eth-json-rpc-provider@1.0.1': + dependencies: + '@metamask/json-rpc-engine': 7.3.3 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 5.0.2 + transitivePeerDependencies: + - supports-color + + '@metamask/json-rpc-engine@7.3.3': + dependencies: + '@metamask/rpc-errors': 6.4.0 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 8.5.0 + transitivePeerDependencies: + - supports-color + + '@metamask/json-rpc-engine@8.0.2': + dependencies: + '@metamask/rpc-errors': 6.4.0 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 8.5.0 + transitivePeerDependencies: + - supports-color + + '@metamask/json-rpc-middleware-stream@7.0.2': + dependencies: + '@metamask/json-rpc-engine': 8.0.2 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 8.5.0 + readable-stream: 3.6.2 + transitivePeerDependencies: + - supports-color + + '@metamask/object-multiplex@2.1.0': + dependencies: + once: 1.4.0 + readable-stream: 3.6.2 + + '@metamask/onboarding@1.0.1': + dependencies: + bowser: 2.13.1 + + '@metamask/providers@16.1.0': + dependencies: + '@metamask/json-rpc-engine': 8.0.2 + '@metamask/json-rpc-middleware-stream': 7.0.2 + '@metamask/object-multiplex': 2.1.0 + '@metamask/rpc-errors': 6.4.0 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 8.5.0 + detect-browser: 5.3.0 + extension-port-stream: 3.0.0 + fast-deep-equal: 3.1.3 + is-stream: 2.0.1 + readable-stream: 3.6.2 + webextension-polyfill: 0.10.0 + transitivePeerDependencies: + - supports-color + + '@metamask/rpc-errors@6.4.0': + dependencies: + '@metamask/utils': 9.3.0 + fast-safe-stringify: 2.1.1 + transitivePeerDependencies: + - supports-color + + '@metamask/rpc-errors@7.0.2': + dependencies: + '@metamask/utils': 11.9.0 + fast-safe-stringify: 2.1.1 + transitivePeerDependencies: + - supports-color + + '@metamask/safe-event-emitter@2.0.0': {} + + '@metamask/safe-event-emitter@3.1.2': {} + + '@metamask/sdk-analytics@0.0.5': + dependencies: + openapi-fetch: 0.13.8 + + '@metamask/sdk-communication-layer@0.33.1(cross-fetch@4.1.0)(eciesjs@0.4.17)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@metamask/sdk-analytics': 0.0.5 + bufferutil: 4.1.0 + cross-fetch: 4.1.0 + date-fns: 2.30.0 + debug: 4.3.4 + eciesjs: 0.4.17 + eventemitter2: 6.4.9 + readable-stream: 3.6.2 + socket.io-client: 4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + utf-8-validate: 5.0.10 + uuid: 8.3.2 + transitivePeerDependencies: + - supports-color + + '@metamask/sdk-install-modal-web@0.32.1': + dependencies: + '@paulmillr/qr': 0.2.1 + + '@metamask/sdk@0.33.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@babel/runtime': 7.28.6 + '@metamask/onboarding': 1.0.1 + '@metamask/providers': 16.1.0 + '@metamask/sdk-analytics': 0.0.5 + '@metamask/sdk-communication-layer': 0.33.1(cross-fetch@4.1.0)(eciesjs@0.4.17)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@metamask/sdk-install-modal-web': 0.32.1 + '@paulmillr/qr': 0.2.1 + bowser: 2.13.1 + cross-fetch: 4.1.0 + debug: 4.3.4 + eciesjs: 0.4.17 + eth-rpc-errors: 4.0.3 + eventemitter2: 6.4.9 + obj-multiplex: 1.0.0 + pump: 3.0.3 + readable-stream: 3.6.2 + socket.io-client: 4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + tslib: 2.8.1 + util: 0.12.5 + uuid: 8.3.2 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@metamask/superstruct@3.2.1': {} + + '@metamask/utils@11.9.0': + dependencies: + '@ethereumjs/tx': 4.2.0 + '@metamask/superstruct': 3.2.1 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + '@types/debug': 4.1.12 + '@types/lodash': 4.17.23 + debug: 4.4.3 + lodash: 4.17.23 + pony-cause: 2.1.11 + semver: 7.7.3 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + + '@metamask/utils@5.0.2': + dependencies: + '@ethereumjs/tx': 4.2.0 + '@types/debug': 4.1.12 + debug: 4.4.3 + semver: 7.7.3 + superstruct: 1.0.4 + transitivePeerDependencies: + - supports-color + + '@metamask/utils@8.5.0': + dependencies: + '@ethereumjs/tx': 4.2.0 + '@metamask/superstruct': 3.2.1 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + '@types/debug': 4.1.12 + debug: 4.3.4 + pony-cause: 2.1.11 + semver: 7.7.3 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + + '@metamask/utils@9.3.0': + dependencies: + '@ethereumjs/tx': 4.2.0 + '@metamask/superstruct': 3.2.1 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + '@types/debug': 4.1.12 + debug: 4.3.4 + pony-cause: 2.1.11 + semver: 7.7.3 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + + '@modelcontextprotocol/sdk@1.25.3(@cfworker/json-schema@4.1.1)(hono@4.11.7)(zod@3.25.76)': + dependencies: + '@hono/node-server': 1.19.9(hono@4.11.7) + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.6 + express: 5.2.1 + express-rate-limit: 7.5.1(express@5.2.1) + jose: 6.1.3 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + optionalDependencies: + '@cfworker/json-schema': 4.1.1 + transitivePeerDependencies: + - hono + - supports-color + + '@modelcontextprotocol/sdk@1.25.3(@cfworker/json-schema@4.1.1)(hono@4.11.7)(zod@4.3.6)': + dependencies: + '@hono/node-server': 1.19.9(hono@4.11.7) + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.6 + express: 5.2.1 + express-rate-limit: 7.5.1(express@5.2.1) + jose: 6.1.3 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 4.3.6 + zod-to-json-schema: 3.25.1(zod@4.3.6) + optionalDependencies: + '@cfworker/json-schema': 4.1.1 + transitivePeerDependencies: + - hono + - supports-color + + '@msgpack/msgpack@3.1.2': {} + + '@napi-rs/wasm-runtime@0.2.12': + dependencies: + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@next/env@16.0.8': {} + + '@next/eslint-plugin-next@16.0.8': + dependencies: + fast-glob: 3.3.1 + + '@next/swc-darwin-arm64@16.0.8': + optional: true + + '@next/swc-darwin-x64@16.0.8': + optional: true + + '@next/swc-linux-arm64-gnu@16.0.8': + optional: true + + '@next/swc-linux-arm64-musl@16.0.8': + optional: true + + '@next/swc-linux-x64-gnu@16.0.8': + optional: true + + '@next/swc-linux-x64-musl@16.0.8': + optional: true + + '@next/swc-win32-arm64-msvc@16.0.8': + optional: true + + '@next/swc-win32-x64-msvc@16.0.8': + optional: true + + '@noble/ciphers@1.2.1': {} + + '@noble/ciphers@1.3.0': {} + + '@noble/curves@1.4.2': + dependencies: + '@noble/hashes': 1.4.0 + + '@noble/curves@1.8.0': + dependencies: + '@noble/hashes': 1.7.0 + + '@noble/curves@1.8.1': + dependencies: + '@noble/hashes': 1.7.1 + + '@noble/curves@1.9.1': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/curves@1.9.6': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/curves@1.9.7': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/hashes@1.4.0': {} + + '@noble/hashes@1.7.0': {} + + '@noble/hashes@1.7.1': {} + + '@noble/hashes@1.8.0': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@nolyfill/is-core-module@1.0.39': {} + + '@openrouter/ai-sdk-provider@1.5.4(ai@5.0.124(zod@4.3.6))(zod@4.3.6)': + dependencies: + '@openrouter/sdk': 0.1.27 + ai: 5.0.124(zod@4.3.6) + zod: 4.3.6 + + '@openrouter/sdk@0.1.27': + dependencies: + zod: 4.3.6 + + '@opentelemetry/api@1.9.0': {} + + '@paulmillr/qr@0.2.1': {} + + '@phosphor-icons/webcomponents@2.1.5': + dependencies: + lit: 3.3.0 + + '@pinojs/redact@0.4.0': {} + + '@pnpm/exe@10.28.2': + optionalDependencies: + '@pnpm/linux-arm64': 10.28.2 + '@pnpm/linux-x64': 10.28.2 + '@pnpm/macos-arm64': 10.28.2 + '@pnpm/macos-x64': 10.28.2 + '@pnpm/win-arm64': 10.28.2 + '@pnpm/win-x64': 10.28.2 + + '@pnpm/linux-arm64@10.28.2': + optional: true + + '@pnpm/linux-x64@10.28.2': + optional: true + + '@pnpm/macos-arm64@10.28.2': + optional: true + + '@pnpm/macos-x64@10.28.2': + optional: true + + '@pnpm/win-arm64@10.28.2': + optional: true + + '@pnpm/win-x64@10.28.2': + optional: true + + '@privy-io/api-base@1.8.2': + dependencies: + zod: 3.25.76 + + '@privy-io/api-types@0.4.0': {} + + '@privy-io/chains@0.0.6': {} + + '@privy-io/ethereum@0.0.7(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + dependencies: + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + + '@privy-io/js-sdk-core@0.60.0(permissionless@0.2.57(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + dependencies: + '@privy-io/api-base': 1.8.2 + '@privy-io/api-types': 0.4.0 + '@privy-io/chains': 0.0.6 + '@privy-io/ethereum': 0.0.7(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@privy-io/routes': 0.0.6 + canonicalize: 2.1.0 + eventemitter3: 5.0.4 + fetch-retry: 6.0.0 + jose: 4.15.9 + js-cookie: 3.0.5 + libphonenumber-js: 1.12.36 + set-cookie-parser: 2.7.2 + uuid: 9.0.1 + optionalDependencies: + permissionless: 0.2.57(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + + '@privy-io/popup@0.0.2': {} + + '@privy-io/react-auth@3.13.0(@solana-program/system@0.10.0(@solana/kit@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)))(@solana-program/token@0.9.0(@solana/kit@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)))(@solana/kit@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10))(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(permissionless@0.2.57(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@base-org/account': 1.1.1(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) + '@coinbase/wallet-sdk': 4.3.2 + '@floating-ui/react': 0.26.28(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@hcaptcha/react-hcaptcha': 1.17.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@headlessui/react': 2.2.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@heroicons/react': 2.2.0(react@19.2.4) + '@marsidev/react-turnstile': 1.4.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@privy-io/api-base': 1.8.2 + '@privy-io/api-types': 0.4.0 + '@privy-io/chains': 0.0.6 + '@privy-io/ethereum': 0.0.7(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@privy-io/js-sdk-core': 0.60.0(permissionless@0.2.57(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@privy-io/popup': 0.0.2 + '@privy-io/routes': 0.0.6 + '@privy-io/urls': 0.0.3 + '@scure/base': 1.2.6 + '@simplewebauthn/browser': 13.2.2 + '@tanstack/react-virtual': 3.13.18(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@wallet-standard/app': 1.1.0 + '@walletconnect/ethereum-provider': 2.22.4(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/universal-provider': 2.22.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + eventemitter3: 5.0.4 + fast-password-entropy: 1.1.1 + jose: 4.15.9 + js-cookie: 3.0.5 + lucide-react: 0.554.0(react@19.2.4) + mipd: 0.0.7(typescript@5.9.3) + ofetch: 1.5.1 + pino-pretty: 10.3.1 + qrcode: 1.5.4 + react: 19.2.4 + react-device-detect: 2.2.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react-dom: 19.2.4(react@19.2.4) + secure-password-utilities: 0.2.1 + styled-components: 6.3.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + stylis: 4.3.6 + tinycolor2: 1.6.0 + uuid: 9.0.1 + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + x402: 0.7.3(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10) + zustand: 5.0.11(@types/react@19.2.10)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) + optionalDependencies: + '@solana-program/system': 0.10.0(@solana/kit@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@solana-program/token': 0.9.0(@solana/kit@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@solana/kit': 5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + permissionless: 0.2.57(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@solana/sysvars' + - '@tanstack/query-core' + - '@tanstack/react-query' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - debug + - encoding + - expo-auth-session + - expo-crypto + - expo-web-browser + - fastestsmallesttextencoderdecoder + - immer + - ioredis + - react-native + - supports-color + - typescript + - uploadthing + - use-sync-external-store + - utf-8-validate + - zod + + '@privy-io/routes@0.0.6': + dependencies: + '@privy-io/api-types': 0.4.0 + + '@privy-io/urls@0.0.3': {} + + '@protobuf-ts/protoc@2.11.1': {} + + '@radix-ui/primitive@1.1.3': {} + + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.10)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 + + '@radix-ui/react-context@1.1.2(@types/react@19.2.10)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 + + '@radix-ui/react-direction@1.1.1(@types/react@19.2.10)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 + + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + + '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.10)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 + + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + + '@radix-ui/react-id@1.1.1(@types/react@19.2.10)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 + + '@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) + aria-hidden: 1.2.6 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-remove-scroll: 2.7.2(@types/react@19.2.10)(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@floating-ui/react-dom': 2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/rect': 1.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + + '@radix-ui/react-slot@1.2.3(@types/react@19.2.10)(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 + + '@radix-ui/react-slot@1.2.4(@types/react@19.2.10)(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 + + '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.10)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 + + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.10)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 + + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.10)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 + + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.10)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 + + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.10)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 + + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.10)(react@19.2.4)': + dependencies: + '@radix-ui/rect': 1.1.1 + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 + + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.10)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 + + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + + '@radix-ui/rect@1.1.1': {} + + '@react-aria/focus@3.21.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@react-aria/interactions': 3.26.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@react-aria/utils': 3.32.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@react-types/shared': 3.32.1(react@19.2.4) + '@swc/helpers': 0.5.18 + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@react-aria/interactions@3.26.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@react-aria/ssr': 3.9.10(react@19.2.4) + '@react-aria/utils': 3.32.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@react-stately/flags': 3.1.2 + '@react-types/shared': 3.32.1(react@19.2.4) + '@swc/helpers': 0.5.18 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@react-aria/ssr@3.9.10(react@19.2.4)': + dependencies: + '@swc/helpers': 0.5.18 + react: 19.2.4 + + '@react-aria/utils@3.32.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@react-aria/ssr': 3.9.10(react@19.2.4) + '@react-stately/flags': 3.1.2 + '@react-stately/utils': 3.11.0(react@19.2.4) + '@react-types/shared': 3.32.1(react@19.2.4) + '@swc/helpers': 0.5.18 + clsx: 2.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@react-stately/flags@3.1.2': + dependencies: + '@swc/helpers': 0.5.18 + + '@react-stately/utils@3.11.0(react@19.2.4)': + dependencies: + '@swc/helpers': 0.5.18 + react: 19.2.4 + + '@react-types/shared@3.32.1(react@19.2.4)': + dependencies: + react: 19.2.4 + + '@reown/appkit-common@1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4)': + dependencies: + big.js: 6.2.2 + dayjs: 1.11.13 + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@reown/appkit-common@1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + big.js: 6.2.2 + dayjs: 1.11.13 + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@reown/appkit-common@1.8.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4)': + dependencies: + big.js: 6.2.2 + dayjs: 1.11.13 + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@reown/appkit-common@1.8.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + big.js: 6.2.2 + dayjs: 1.11.13 + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@reown/appkit-controllers@1.7.8(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + valtio: 1.13.2(@types/react@19.2.10)(react@19.2.4) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-controllers@1.8.9(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.8.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-wallet': 1.8.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@walletconnect/universal-provider': 2.21.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + valtio: 2.1.7(@types/react@19.2.10)(react@19.2.4) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-pay@1.7.8(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.10)(react@19.2.4))(zod@3.25.76) + lit: 3.3.0 + valtio: 1.13.2(@types/react@19.2.10)(react@19.2.4) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-pay@1.8.9(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.8.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.9(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.8.9(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.8.9(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.10)(react@19.2.4))(zod@3.25.76) + lit: 3.3.0 + valtio: 2.1.7(@types/react@19.2.10)(react@19.2.4) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-polyfills@1.7.8': + dependencies: + buffer: 6.0.3 + + '@reown/appkit-polyfills@1.8.9': + dependencies: + buffer: 6.0.3 + + '@reown/appkit-scaffold-ui@1.7.8(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.10)(react@19.2.4))(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.10)(react@19.2.4))(zod@3.25.76) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + lit: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - valtio + - zod + + '@reown/appkit-scaffold-ui@1.8.9(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.10)(react@19.2.4))(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.8.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.9(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.8.9(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.8.9(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.10)(react@19.2.4))(zod@3.25.76) + '@reown/appkit-wallet': 1.8.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + lit: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - valtio + - zod + + '@reown/appkit-ui@1.7.8(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + lit: 3.3.0 + qrcode: 1.5.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-ui@1.8.9(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@phosphor-icons/webcomponents': 2.1.5 + '@reown/appkit-common': 1.8.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.9(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-wallet': 1.8.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + lit: 3.3.0 + qrcode: 1.5.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-utils@1.7.8(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.10)(react@19.2.4))(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-polyfills': 1.7.8 + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@walletconnect/logger': 2.1.2 + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + valtio: 1.13.2(@types/react@19.2.10)(react@19.2.4) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-utils@1.8.9(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.10)(react@19.2.4))(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.8.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.9(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-polyfills': 1.8.9 + '@reown/appkit-wallet': 1.8.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@wallet-standard/wallet': 1.1.0 + '@walletconnect/logger': 2.1.2 + '@walletconnect/universal-provider': 2.21.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + valtio: 2.1.7(@types/react@19.2.10)(react@19.2.4) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-wallet@1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4) + '@reown/appkit-polyfills': 1.7.8 + '@walletconnect/logger': 2.1.2 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + + '@reown/appkit-wallet@1.8.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@reown/appkit-common': 1.8.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4) + '@reown/appkit-polyfills': 1.8.9 + '@walletconnect/logger': 2.1.2 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + + '@reown/appkit@1.7.8(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-pay': 1.7.8(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-polyfills': 1.7.8 + '@reown/appkit-scaffold-ui': 1.7.8(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.10)(react@19.2.4))(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.10)(react@19.2.4))(zod@3.25.76) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.21.0 + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + bs58: 6.0.0 + valtio: 1.13.2(@types/react@19.2.10)(react@19.2.4) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit@1.8.9(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.8.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.9(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-pay': 1.8.9(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-polyfills': 1.8.9 + '@reown/appkit-scaffold-ui': 1.8.9(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.10)(react@19.2.4))(zod@3.25.76) + '@reown/appkit-ui': 1.8.9(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.8.9(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.10)(react@19.2.4))(zod@3.25.76) + '@reown/appkit-wallet': 1.8.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@walletconnect/universal-provider': 2.21.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + bs58: 6.0.0 + semver: 7.7.2 + valtio: 2.1.7(@types/react@19.2.10)(react@19.2.4) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + optionalDependencies: + '@lit/react': 1.0.8(@types/react@19.2.10) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@repeaterjs/repeater@3.0.6': {} + + '@rollup/rollup-android-arm-eabi@4.57.1': + optional: true + + '@rollup/rollup-android-arm64@4.57.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.57.1': + optional: true + + '@rollup/rollup-darwin-x64@4.57.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.57.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.57.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.57.1': + optional: true + + '@rollup/rollup-openbsd-x64@4.57.1': + optional: true + + '@rollup/rollup-openharmony-arm64@4.57.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.57.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.57.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.57.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.57.1': + optional: true + + '@rtsao/scc@1.1.0': {} + + '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@safe-global/safe-gateway-typescript-sdk': 3.23.1 + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-gateway-typescript-sdk@3.23.1': {} + + '@scarf/scarf@1.4.0': {} + + '@scure/base@1.1.9': {} + + '@scure/base@1.2.6': {} + + '@scure/bip32@1.4.0': + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 + + '@scure/bip32@1.6.2': + dependencies: + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/base': 1.2.6 + + '@scure/bip32@1.7.0': + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + + '@scure/bip39@1.3.0': + dependencies: + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 + + '@scure/bip39@1.5.4': + dependencies: + '@noble/hashes': 1.7.1 + '@scure/base': 1.2.6 + + '@scure/bip39@1.6.0': + dependencies: + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + + '@sec-ant/readable-stream@0.4.1': {} + + '@segment/analytics-core@1.8.2': + dependencies: + '@lukeed/uuid': 2.0.1 + '@segment/analytics-generic-utils': 1.2.0 + dset: 3.1.4 + tslib: 2.8.1 + + '@segment/analytics-generic-utils@1.2.0': + dependencies: + tslib: 2.8.1 + + '@segment/analytics-node@2.3.0': + dependencies: + '@lukeed/uuid': 2.0.1 + '@segment/analytics-core': 1.8.2 + '@segment/analytics-generic-utils': 1.2.0 + buffer: 6.0.3 + jose: 5.10.0 + node-fetch: 2.7.0 + tslib: 2.8.1 + transitivePeerDependencies: + - encoding + + '@shikijs/core@3.22.0': + dependencies: + '@shikijs/types': 3.22.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@3.22.0': + dependencies: + '@shikijs/types': 3.22.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.4 + + '@shikijs/engine-oniguruma@3.22.0': + dependencies: + '@shikijs/types': 3.22.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.22.0': + dependencies: + '@shikijs/types': 3.22.0 + + '@shikijs/themes@3.22.0': + dependencies: + '@shikijs/types': 3.22.0 + + '@shikijs/types@3.22.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@simplewebauthn/browser@13.2.2': {} + + '@sindresorhus/merge-streams@4.0.0': {} + + '@so-ric/colorspace@1.1.6': + dependencies: + color: 5.0.3 + text-hex: 1.0.0 + + '@socket.io/component-emitter@3.1.2': {} + + '@solana-program/compute-budget@0.11.0(@solana/kit@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10))': + dependencies: + '@solana/kit': 5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + + '@solana-program/compute-budget@0.8.0(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))': + dependencies: + '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + + '@solana-program/system@0.10.0(@solana/kit@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10))': + dependencies: + '@solana/kit': 5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + + '@solana-program/token-2022@0.4.2(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))': + dependencies: + '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@solana/sysvars': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + + '@solana-program/token-2022@0.6.1(@solana/kit@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10))(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))': + dependencies: + '@solana/kit': 5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/sysvars': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + + '@solana-program/token@0.5.1(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))': + dependencies: + '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + + '@solana-program/token@0.9.0(@solana/kit@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10))': + dependencies: + '@solana/kit': 5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + + '@solana/accounts@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/codecs-strings': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/rpc-spec': 2.3.0(typescript@5.9.3) + '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/accounts@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-strings': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/rpc-spec': 5.5.1(typescript@5.9.3) + '@solana/rpc-types': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/addresses@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/assertions': 2.3.0(typescript@5.9.3) + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/codecs-strings': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/nominal-types': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/addresses@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/assertions': 5.5.1(typescript@5.9.3) + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-strings': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/nominal-types': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/assertions@2.3.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/assertions@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/buffer-layout@4.0.1': + dependencies: + buffer: 6.0.3 + + '@solana/codecs-core@2.3.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/codecs-core@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/codecs-data-structures@2.3.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/codecs-data-structures@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/codecs-numbers@2.3.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/codecs-numbers@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/codecs-strings@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + fastestsmallesttextencoderdecoder: 1.0.22 + typescript: 5.9.3 + + '@solana/codecs-strings@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + optionalDependencies: + fastestsmallesttextencoderdecoder: 1.0.22 + typescript: 5.9.3 + + '@solana/codecs@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/codecs-data-structures': 2.3.0(typescript@5.9.3) + '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) + '@solana/codecs-strings': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/options': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/codecs@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-data-structures': 5.5.1(typescript@5.9.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) + '@solana/codecs-strings': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/options': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/errors@2.3.0(typescript@5.9.3)': + dependencies: + chalk: 5.6.2 + commander: 14.0.3 + typescript: 5.9.3 + + '@solana/errors@5.5.1(typescript@5.9.3)': + dependencies: + chalk: 5.6.2 + commander: 14.0.2 + optionalDependencies: + typescript: 5.9.3 + + '@solana/fast-stable-stringify@2.3.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@solana/fast-stable-stringify@5.5.1(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/functional@2.3.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@solana/functional@5.5.1(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/instruction-plans@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/instructions': 5.5.1(typescript@5.9.3) + '@solana/keys': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/promises': 5.5.1(typescript@5.9.3) + '@solana/transaction-messages': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/instructions@2.3.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/instructions@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/keys@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/assertions': 2.3.0(typescript@5.9.3) + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/codecs-strings': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/nominal-types': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/keys@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/assertions': 5.5.1(typescript@5.9.3) + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-strings': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/nominal-types': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@solana/accounts': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/functional': 2.3.0(typescript@5.9.3) + '@solana/instructions': 2.3.0(typescript@5.9.3) + '@solana/keys': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/programs': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-parsed-types': 2.3.0(typescript@5.9.3) + '@solana/rpc-spec-types': 2.3.0(typescript@5.9.3) + '@solana/rpc-subscriptions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/signers': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/sysvars': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-confirmation': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@solana/transaction-messages': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - ws + + '@solana/kit@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/accounts': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/addresses': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/functional': 5.5.1(typescript@5.9.3) + '@solana/instruction-plans': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/instructions': 5.5.1(typescript@5.9.3) + '@solana/keys': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/offchain-messages': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/plugin-core': 5.5.1(typescript@5.9.3) + '@solana/programs': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-api': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-parsed-types': 5.5.1(typescript@5.9.3) + '@solana/rpc-spec-types': 5.5.1(typescript@5.9.3) + '@solana/rpc-subscriptions': 5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/rpc-types': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/signers': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/sysvars': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-confirmation': 5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/transaction-messages': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + + '@solana/nominal-types@2.3.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@solana/nominal-types@5.5.1(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/offchain-messages@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-data-structures': 5.5.1(typescript@5.9.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) + '@solana/codecs-strings': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/keys': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/nominal-types': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/options@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/codecs-data-structures': 2.3.0(typescript@5.9.3) + '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) + '@solana/codecs-strings': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/options@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-data-structures': 5.5.1(typescript@5.9.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) + '@solana/codecs-strings': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/plugin-core@5.5.1(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/programs@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/programs@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/promises@2.3.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@solana/promises@5.5.1(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-api@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/codecs-strings': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/keys': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-parsed-types': 2.3.0(typescript@5.9.3) + '@solana/rpc-spec': 2.3.0(typescript@5.9.3) + '@solana/rpc-transformers': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-messages': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-api@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-strings': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/keys': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-parsed-types': 5.5.1(typescript@5.9.3) + '@solana/rpc-spec': 5.5.1(typescript@5.9.3) + '@solana/rpc-transformers': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-types': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-messages': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-parsed-types@2.3.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@solana/rpc-parsed-types@5.5.1(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-spec-types@2.3.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@solana/rpc-spec-types@5.5.1(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-spec@2.3.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/rpc-spec-types': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/rpc-spec@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/rpc-spec-types': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-subscriptions-api@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/keys': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 2.3.0(typescript@5.9.3) + '@solana/rpc-transformers': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-messages': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-subscriptions-api@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/keys': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 5.5.1(typescript@5.9.3) + '@solana/rpc-transformers': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-types': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-messages': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-subscriptions-channel-websocket@2.3.0(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/functional': 2.3.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 2.3.0(typescript@5.9.3) + '@solana/subscribable': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + + '@solana/rpc-subscriptions-channel-websocket@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/functional': 5.5.1(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 5.5.1(typescript@5.9.3) + '@solana/subscribable': 5.5.1(typescript@5.9.3) + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@solana/rpc-subscriptions-spec@2.3.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/promises': 2.3.0(typescript@5.9.3) + '@solana/rpc-spec-types': 2.3.0(typescript@5.9.3) + '@solana/subscribable': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/rpc-subscriptions-spec@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/promises': 5.5.1(typescript@5.9.3) + '@solana/rpc-spec-types': 5.5.1(typescript@5.9.3) + '@solana/subscribable': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-subscriptions@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/fast-stable-stringify': 2.3.0(typescript@5.9.3) + '@solana/functional': 2.3.0(typescript@5.9.3) + '@solana/promises': 2.3.0(typescript@5.9.3) + '@solana/rpc-spec-types': 2.3.0(typescript@5.9.3) + '@solana/rpc-subscriptions-api': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-subscriptions-channel-websocket': 2.3.0(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@solana/rpc-subscriptions-spec': 2.3.0(typescript@5.9.3) + '@solana/rpc-transformers': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/subscribable': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - ws + + '@solana/rpc-subscriptions@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/fast-stable-stringify': 5.5.1(typescript@5.9.3) + '@solana/functional': 5.5.1(typescript@5.9.3) + '@solana/promises': 5.5.1(typescript@5.9.3) + '@solana/rpc-spec-types': 5.5.1(typescript@5.9.3) + '@solana/rpc-subscriptions-api': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-subscriptions-channel-websocket': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/rpc-subscriptions-spec': 5.5.1(typescript@5.9.3) + '@solana/rpc-transformers': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-types': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/subscribable': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + + '@solana/rpc-transformers@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/functional': 2.3.0(typescript@5.9.3) + '@solana/nominal-types': 2.3.0(typescript@5.9.3) + '@solana/rpc-spec-types': 2.3.0(typescript@5.9.3) + '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-transformers@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/functional': 5.5.1(typescript@5.9.3) + '@solana/nominal-types': 5.5.1(typescript@5.9.3) + '@solana/rpc-spec-types': 5.5.1(typescript@5.9.3) + '@solana/rpc-types': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-transport-http@2.3.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/rpc-spec': 2.3.0(typescript@5.9.3) + '@solana/rpc-spec-types': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + undici-types: 7.20.0 + + '@solana/rpc-transport-http@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/rpc-spec': 5.5.1(typescript@5.9.3) + '@solana/rpc-spec-types': 5.5.1(typescript@5.9.3) + undici-types: 7.20.0 + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-types@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) + '@solana/codecs-strings': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/nominal-types': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-types@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) + '@solana/codecs-strings': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/nominal-types': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/fast-stable-stringify': 2.3.0(typescript@5.9.3) + '@solana/functional': 2.3.0(typescript@5.9.3) + '@solana/rpc-api': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-spec': 2.3.0(typescript@5.9.3) + '@solana/rpc-spec-types': 2.3.0(typescript@5.9.3) + '@solana/rpc-transformers': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-transport-http': 2.3.0(typescript@5.9.3) + '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/fast-stable-stringify': 5.5.1(typescript@5.9.3) + '@solana/functional': 5.5.1(typescript@5.9.3) + '@solana/rpc-api': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-spec': 5.5.1(typescript@5.9.3) + '@solana/rpc-spec-types': 5.5.1(typescript@5.9.3) + '@solana/rpc-transformers': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-transport-http': 5.5.1(typescript@5.9.3) + '@solana/rpc-types': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/signers@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/instructions': 2.3.0(typescript@5.9.3) + '@solana/keys': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/nominal-types': 2.3.0(typescript@5.9.3) + '@solana/transaction-messages': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/signers@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/instructions': 5.5.1(typescript@5.9.3) + '@solana/keys': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/nominal-types': 5.5.1(typescript@5.9.3) + '@solana/offchain-messages': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-messages': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/subscribable@2.3.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/subscribable@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/sysvars@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/accounts': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/accounts': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/rpc-types': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transaction-confirmation@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-strings': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/keys': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/promises': 2.3.0(typescript@5.9.3) + '@solana/rpc': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-subscriptions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-messages': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - ws + + '@solana/transaction-confirmation@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/addresses': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-strings': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/keys': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/promises': 5.5.1(typescript@5.9.3) + '@solana/rpc': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-subscriptions': 5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/rpc-types': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-messages': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + + '@solana/transaction-messages@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/codecs-data-structures': 2.3.0(typescript@5.9.3) + '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/functional': 2.3.0(typescript@5.9.3) + '@solana/instructions': 2.3.0(typescript@5.9.3) + '@solana/nominal-types': 2.3.0(typescript@5.9.3) + '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transaction-messages@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-data-structures': 5.5.1(typescript@5.9.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/functional': 5.5.1(typescript@5.9.3) + '@solana/instructions': 5.5.1(typescript@5.9.3) + '@solana/nominal-types': 5.5.1(typescript@5.9.3) + '@solana/rpc-types': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transactions@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/codecs-data-structures': 2.3.0(typescript@5.9.3) + '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) + '@solana/codecs-strings': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/functional': 2.3.0(typescript@5.9.3) + '@solana/instructions': 2.3.0(typescript@5.9.3) + '@solana/keys': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/nominal-types': 2.3.0(typescript@5.9.3) + '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-messages': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transactions@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-data-structures': 5.5.1(typescript@5.9.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) + '@solana/codecs-strings': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/functional': 5.5.1(typescript@5.9.3) + '@solana/instructions': 5.5.1(typescript@5.9.3) + '@solana/keys': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/nominal-types': 5.5.1(typescript@5.9.3) + '@solana/rpc-types': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-messages': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/wallet-standard-features@1.3.0': + dependencies: + '@wallet-standard/base': 1.1.0 + '@wallet-standard/features': 1.1.0 + + '@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@babel/runtime': 7.28.6 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.4.0 + '@solana/buffer-layout': 4.0.1 + '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) + agentkeepalive: 4.6.0 + bn.js: 5.2.2 + borsh: 0.7.0 + bs58: 4.0.1 + buffer: 6.0.3 + fast-stable-stringify: 1.0.0 + jayson: 4.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + node-fetch: 2.7.0 + rpc-websockets: 9.3.3 + superstruct: 2.0.2 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + + '@standard-schema/spec@1.1.0': {} + + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + + '@swc/helpers@0.5.18': + dependencies: + tslib: 2.8.1 + + '@tailwindcss/node@4.1.18': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.4 + jiti: 2.6.1 + lightningcss: 1.30.2 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.1.18 + + '@tailwindcss/oxide-android-arm64@4.1.18': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.18': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.18': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.18': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.18': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.18': + optional: true + + '@tailwindcss/oxide@4.1.18': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.18 + '@tailwindcss/oxide-darwin-arm64': 4.1.18 + '@tailwindcss/oxide-darwin-x64': 4.1.18 + '@tailwindcss/oxide-freebsd-x64': 4.1.18 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.18 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.18 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.18 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.18 + '@tailwindcss/oxide-linux-x64-musl': 4.1.18 + '@tailwindcss/oxide-wasm32-wasi': 4.1.18 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 + + '@tailwindcss/postcss@4.1.18': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.1.18 + '@tailwindcss/oxide': 4.1.18 + postcss: 8.5.6 + tailwindcss: 4.1.18 + + '@tanstack/query-core@5.90.20': {} + + '@tanstack/react-query@5.90.20(react@19.2.4)': + dependencies: + '@tanstack/query-core': 5.90.20 + react: 19.2.4 + + '@tanstack/react-virtual@3.13.18(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@tanstack/virtual-core': 3.13.18 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@tanstack/virtual-core@3.13.18': {} + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.19.7 + + '@types/d3-array@3.2.2': {} + + '@types/d3-axis@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-brush@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-chord@3.0.6': {} + + '@types/d3-color@3.1.3': {} + + '@types/d3-contour@3.0.6': + dependencies: + '@types/d3-array': 3.2.2 + '@types/geojson': 7946.0.16 + + '@types/d3-delaunay@6.0.4': {} + + '@types/d3-dispatch@3.0.7': {} + + '@types/d3-drag@3.0.7': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-dsv@3.0.7': {} + + '@types/d3-ease@3.0.2': {} + + '@types/d3-fetch@3.0.7': + dependencies: + '@types/d3-dsv': 3.0.7 + + '@types/d3-force@3.0.10': {} + + '@types/d3-format@3.0.4': {} + + '@types/d3-geo@3.1.0': + dependencies: + '@types/geojson': 7946.0.16 + + '@types/d3-hierarchy@3.1.7': {} + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-path@3.1.1': {} + + '@types/d3-polygon@3.0.2': {} + + '@types/d3-quadtree@3.0.6': {} + + '@types/d3-random@3.0.3': {} + + '@types/d3-scale-chromatic@3.1.0': {} + + '@types/d3-scale@4.0.9': + dependencies: + '@types/d3-time': 3.0.4 + + '@types/d3-selection@3.0.11': {} + + '@types/d3-shape@3.1.8': + dependencies: + '@types/d3-path': 3.1.1 + + '@types/d3-time-format@4.0.3': {} + + '@types/d3-time@3.0.4': {} + + '@types/d3-timer@3.0.2': {} + + '@types/d3-transition@3.0.9': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-zoom@3.0.8': + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.11 + + '@types/d3@7.4.3': + dependencies: + '@types/d3-array': 3.2.2 + '@types/d3-axis': 3.0.6 + '@types/d3-brush': 3.0.6 + '@types/d3-chord': 3.0.6 + '@types/d3-color': 3.1.3 + '@types/d3-contour': 3.0.6 + '@types/d3-delaunay': 6.0.4 + '@types/d3-dispatch': 3.0.7 + '@types/d3-drag': 3.0.7 + '@types/d3-dsv': 3.0.7 + '@types/d3-ease': 3.0.2 + '@types/d3-fetch': 3.0.7 + '@types/d3-force': 3.0.10 + '@types/d3-format': 3.0.4 + '@types/d3-geo': 3.1.0 + '@types/d3-hierarchy': 3.1.7 + '@types/d3-interpolate': 3.0.4 + '@types/d3-path': 3.1.1 + '@types/d3-polygon': 3.0.2 + '@types/d3-quadtree': 3.0.6 + '@types/d3-random': 3.0.3 + '@types/d3-scale': 4.0.9 + '@types/d3-scale-chromatic': 3.1.0 + '@types/d3-selection': 3.0.11 + '@types/d3-shape': 3.1.8 + '@types/d3-time': 3.0.4 + '@types/d3-time-format': 4.0.3 + '@types/d3-timer': 3.0.2 + '@types/d3-transition': 3.0.9 + '@types/d3-zoom': 3.0.8 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/deep-eql@4.0.2': {} + + '@types/diff-match-patch@1.0.36': {} + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.8 + + '@types/estree@1.0.8': {} + + '@types/geojson@7946.0.16': {} + + '@types/hast@2.3.10': + dependencies: + '@types/unist': 2.0.11 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/html-to-text@9.0.4': {} + + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': {} + + '@types/katex@0.16.8': {} + + '@types/lodash@4.17.23': {} + + '@types/mdast@3.0.15': + dependencies: + '@types/unist': 2.0.11 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/ms@2.1.0': {} + + '@types/node-fetch@2.6.13': + dependencies: + '@types/node': 22.19.7 + form-data: 4.0.5 + + '@types/node@12.20.55': {} + + '@types/node@18.19.130': + dependencies: + undici-types: 5.26.5 + + '@types/node@20.19.30': + dependencies: + undici-types: 6.21.0 + + '@types/node@22.19.7': + dependencies: + undici-types: 6.21.0 + + '@types/prop-types@15.7.15': {} + + '@types/react-dom@19.2.3(@types/react@19.2.10)': + dependencies: + '@types/react': 19.2.10 + + '@types/react@19.2.10': + dependencies: + csstype: 3.2.3 + + '@types/retry@0.12.0': {} + + '@types/semver@7.7.1': {} + + '@types/stylis@4.2.7': {} + + '@types/triple-beam@1.3.5': {} + + '@types/trusted-types@2.0.7': {} + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@types/uuid@10.0.0': {} + + '@types/uuid@8.3.4': {} + + '@types/validator@13.15.10': {} + + '@types/ws@7.4.7': + dependencies: + '@types/node': 22.19.7 + + '@types/ws@8.18.1': + dependencies: + '@types/node': 22.19.7 + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 22.19.7 + optional: true + + '@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/type-utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.54.0 + eslint: 9.39.2(jiti@2.6.1) + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.54.0 + debug: 4.4.3 + eslint: 9.39.2(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.54.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) + '@typescript-eslint/types': 8.54.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.54.0': + dependencies: + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/visitor-keys': 8.54.0 + + '@typescript-eslint/tsconfig-utils@8.54.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + debug: 4.4.3 + eslint: 9.39.2(jiti@2.6.1) + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.54.0': {} + + '@typescript-eslint/typescript-estree@8.54.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.54.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/visitor-keys': 8.54.0 + debug: 4.4.3 + minimatch: 9.0.5 + semver: 7.7.3 + tinyglobby: 0.2.15 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.54.0': + dependencies: + '@typescript-eslint/types': 8.54.0 + eslint-visitor-keys: 4.2.1 + + '@typescript/vfs@1.6.2(typescript@5.9.3)': + dependencies: + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@ungap/structured-clone@1.3.0': {} + + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + optional: true + + '@unrs/resolver-binding-android-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + optional: true + + '@urql/core@5.2.0(graphql@16.12.0)': + dependencies: + '@0no-co/graphql.web': 1.2.0(graphql@16.12.0) + wonka: 6.3.5 + transitivePeerDependencies: + - graphql + + '@vercel/oidc@3.1.0': {} + + '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': + dependencies: + '@bcoe/v8-coverage': 1.0.2 + '@vitest/utils': 4.0.18 + ast-v8-to-istanbul: 0.3.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.2.0 + magicast: 0.5.1 + obug: 2.1.1 + std-env: 3.10.0 + tinyrainbow: 3.0.3 + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + + '@vitest/expect@4.0.18': + dependencies: + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 + chai: 6.2.2 + tinyrainbow: 3.0.3 + + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': + dependencies: + '@vitest/spy': 4.0.18 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.3.1(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + + '@vitest/pretty-format@4.0.18': + dependencies: + tinyrainbow: 3.0.3 + + '@vitest/runner@4.0.18': + dependencies: + '@vitest/utils': 4.0.18 + pathe: 2.0.3 + + '@vitest/snapshot@4.0.18': + dependencies: + '@vitest/pretty-format': 4.0.18 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@4.0.18': {} + + '@vitest/utils@4.0.18': + dependencies: + '@vitest/pretty-format': 4.0.18 + tinyrainbow: 3.0.3 + + '@wagmi/connectors@6.2.0(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(@wagmi/core@2.22.1(@tanstack/query-core@5.90.20)(@types/react@19.2.10)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))(zod@3.25.76)': + dependencies: + '@base-org/account': 2.4.0(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) + '@coinbase/wallet-sdk': 4.3.6(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) + '@gemini-wallet/core': 0.3.2(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@metamask/sdk': 0.33.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@wagmi/core': 2.22.1(@tanstack/query-core@5.90.20)(@types/react@19.2.10)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@walletconnect/ethereum-provider': 2.21.1(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + cbw-sdk: '@coinbase/wallet-sdk@3.9.3' + porto: 0.2.35(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(@wagmi/core@2.22.1(@tanstack/query-core@5.90.20)(@types/react@19.2.10)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@tanstack/react-query' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - debug + - encoding + - expo-auth-session + - expo-crypto + - expo-web-browser + - fastestsmallesttextencoderdecoder + - immer + - ioredis + - react + - react-native + - supports-color + - uploadthing + - use-sync-external-store + - utf-8-validate + - wagmi + - zod + + '@wagmi/connectors@6.2.0(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(@wagmi/core@2.22.1(@tanstack/query-core@5.90.20)(@types/react@19.2.10)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6)))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6))(wagmi@2.19.5(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6))(zod@3.25.76))(zod@4.3.6)': + dependencies: + '@base-org/account': 2.4.0(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) + '@coinbase/wallet-sdk': 4.3.6(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) + '@gemini-wallet/core': 0.3.2(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6)) + '@metamask/sdk': 0.33.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@wagmi/core': 2.22.1(@tanstack/query-core@5.90.20)(@types/react@19.2.10)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6)) + '@walletconnect/ethereum-provider': 2.21.1(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + cbw-sdk: '@coinbase/wallet-sdk@3.9.3' + porto: 0.2.35(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(@wagmi/core@2.22.1(@tanstack/query-core@5.90.20)(@types/react@19.2.10)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6)))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6))(wagmi@2.19.5(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6))(zod@3.25.76)) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@tanstack/react-query' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - debug + - encoding + - expo-auth-session + - expo-crypto + - expo-web-browser + - fastestsmallesttextencoderdecoder + - immer + - ioredis + - react + - react-native + - supports-color + - uploadthing + - use-sync-external-store + - utf-8-validate + - wagmi + - zod + + '@wagmi/core@2.22.1(@tanstack/query-core@5.90.20)(@types/react@19.2.10)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + dependencies: + eventemitter3: 5.0.1 + mipd: 0.0.7(typescript@5.9.3) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zustand: 5.0.0(@types/react@19.2.10)(react@19.2.4)(use-sync-external-store@1.4.0(react@19.2.4)) + optionalDependencies: + '@tanstack/query-core': 5.90.20 + typescript: 5.9.3 + transitivePeerDependencies: + - '@types/react' + - immer + - react + - use-sync-external-store + + '@wagmi/core@2.22.1(@tanstack/query-core@5.90.20)(@types/react@19.2.10)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6))': + dependencies: + eventemitter3: 5.0.1 + mipd: 0.0.7(typescript@5.9.3) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6) + zustand: 5.0.0(@types/react@19.2.10)(react@19.2.4)(use-sync-external-store@1.4.0(react@19.2.4)) + optionalDependencies: + '@tanstack/query-core': 5.90.20 + typescript: 5.9.3 + transitivePeerDependencies: + - '@types/react' + - immer + - react + - use-sync-external-store + + '@wallet-standard/app@1.1.0': + dependencies: + '@wallet-standard/base': 1.1.0 + + '@wallet-standard/base@1.1.0': {} + + '@wallet-standard/features@1.1.0': + dependencies: + '@wallet-standard/base': 1.1.0 + + '@wallet-standard/wallet@1.1.0': + dependencies: + '@wallet-standard/base': 1.1.0 + + '@walletconnect/core@2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.33.0 + events: 3.3.0 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/core@2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.1 + '@walletconnect/utils': 2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.33.0 + events: 3.3.0 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/core@2.21.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.9 + '@walletconnect/utils': 2.21.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.39.3 + events: 3.3.0 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/core@2.22.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 3.0.0 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.22.4 + '@walletconnect/utils': 2.22.4(typescript@5.9.3)(zod@3.25.76) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.39.3 + events: 3.3.0 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/environment@1.0.1': + dependencies: + tslib: 1.14.1 + + '@walletconnect/ethereum-provider@2.21.1(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit': 1.7.8(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/sign-client': 2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.21.1 + '@walletconnect/universal-provider': 2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/utils': 2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/ethereum-provider@2.22.4(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit': 1.8.9(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 3.0.0 + '@walletconnect/sign-client': 2.22.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.22.4 + '@walletconnect/universal-provider': 2.22.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/utils': 2.22.4(typescript@5.9.3)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/events@1.0.1': + dependencies: + keyvaluestorage-interface: 1.0.0 + tslib: 1.14.1 + + '@walletconnect/heartbeat@1.2.2': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/time': 1.0.2 + events: 3.3.0 + + '@walletconnect/jsonrpc-http-connection@1.0.8': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + cross-fetch: 3.2.0 + events: 3.3.0 + transitivePeerDependencies: + - encoding + + '@walletconnect/jsonrpc-provider@1.0.14': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + + '@walletconnect/jsonrpc-types@1.0.4': + dependencies: + events: 3.3.0 + keyvaluestorage-interface: 1.0.0 + + '@walletconnect/jsonrpc-utils@1.0.8': + dependencies: + '@walletconnect/environment': 1.0.1 + '@walletconnect/jsonrpc-types': 1.0.4 + tslib: 1.14.1 + + '@walletconnect/jsonrpc-ws-connection@1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@walletconnect/keyvaluestorage@1.1.1': + dependencies: + '@walletconnect/safe-json': 1.0.2 + idb-keyval: 6.2.2 + unstorage: 1.17.4(idb-keyval@6.2.2) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/logger@2.1.2': + dependencies: + '@walletconnect/safe-json': 1.0.2 + pino: 7.11.0 + + '@walletconnect/logger@3.0.0': + dependencies: + '@walletconnect/safe-json': 1.0.2 + pino: 10.0.0 + + '@walletconnect/relay-api@1.0.11': + dependencies: + '@walletconnect/jsonrpc-types': 1.0.4 + + '@walletconnect/relay-auth@1.1.0': + dependencies: + '@noble/curves': 1.8.0 + '@noble/hashes': 1.7.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + uint8arrays: 3.1.1 + + '@walletconnect/safe-json@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/sign-client@2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/core': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/sign-client@2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/core': 2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.1 + '@walletconnect/utils': 2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/sign-client@2.21.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/core': 2.21.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.9 + '@walletconnect/utils': 2.21.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/sign-client@2.22.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/core': 2.22.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 3.0.0 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.22.4 + '@walletconnect/utils': 2.22.4(typescript@5.9.3)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/time@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/types@2.21.0': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/types@2.21.1': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/types@2.21.9': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/types@2.22.4': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 3.0.0 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/universal-provider@2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.21.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + es-toolkit: 1.33.0 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/universal-provider@2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.21.1 + '@walletconnect/utils': 2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + es-toolkit: 1.33.0 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/universal-provider@2.21.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.21.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.21.9 + '@walletconnect/utils': 2.21.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + es-toolkit: 1.39.3 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/universal-provider@2.22.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 3.0.0 + '@walletconnect/sign-client': 2.22.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.22.4 + '@walletconnect/utils': 2.22.4(typescript@5.9.3)(zod@3.25.76) + es-toolkit: 1.39.3 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/utils@2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@noble/ciphers': 1.2.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.0 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + bs58: 6.0.0 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.0 + viem: 2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/utils@2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@noble/ciphers': 1.2.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.1 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + bs58: 6.0.0 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.0 + viem: 2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/utils@2.21.9(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@msgpack/msgpack': 3.1.2 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.9 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + blakejs: 1.2.1 + bs58: 6.0.0 + detect-browser: 5.3.0 + uint8arrays: 3.1.1 + viem: 2.36.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/utils@2.22.4(typescript@5.9.3)(zod@3.25.76)': + dependencies: + '@msgpack/msgpack': 3.1.2 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 3.0.0 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.22.4 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + blakejs: 1.2.1 + bs58: 6.0.0 + detect-browser: 5.3.0 + ox: 0.9.3(typescript@5.9.3)(zod@3.25.76) + uint8arrays: 3.1.1 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - typescript + - uploadthing + - zod + + '@walletconnect/window-getters@1.0.1': + dependencies: + tslib: 1.14.1 + + '@walletconnect/window-metadata@1.0.1': + dependencies: + '@walletconnect/window-getters': 1.0.1 + tslib: 1.14.1 + + '@whatwg-node/disposablestack@0.0.6': + dependencies: + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@whatwg-node/events@0.1.2': + dependencies: + tslib: 2.8.1 + + '@whatwg-node/fetch@0.10.13': + dependencies: + '@whatwg-node/node-fetch': 0.8.5 + urlpattern-polyfill: 10.1.0 + + '@whatwg-node/node-fetch@0.8.5': + dependencies: + '@fastify/busboy': 3.2.0 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@whatwg-node/promise-helpers@1.3.2': + dependencies: + tslib: 2.8.1 + + '@whatwg-node/server@0.10.18': + dependencies: + '@envelop/instrumentation': 1.0.0 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/fetch': 0.10.13 + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + abitype@1.0.6(typescript@5.9.3)(zod@3.25.76): + optionalDependencies: + typescript: 5.9.3 + zod: 3.25.76 + + abitype@1.0.8(typescript@5.9.3)(zod@3.25.76): + optionalDependencies: + typescript: 5.9.3 + zod: 3.25.76 + + abitype@1.2.3(typescript@5.9.3)(zod@3.22.4): + optionalDependencies: + typescript: 5.9.3 + zod: 3.22.4 + + abitype@1.2.3(typescript@5.9.3)(zod@3.25.76): + optionalDependencies: + typescript: 5.9.3 + zod: 3.25.76 + + abitype@1.2.3(typescript@5.9.3)(zod@4.3.6): + optionalDependencies: + typescript: 5.9.3 + zod: 4.3.6 + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.0.0 + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 + + ai@4.3.19(react@19.2.4)(zod@3.25.76): + dependencies: + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + '@ai-sdk/react': 1.2.12(react@19.2.4)(zod@3.25.76) + '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) + '@opentelemetry/api': 1.9.0 + jsondiffpatch: 0.6.0 + zod: 3.25.76 + optionalDependencies: + react: 19.2.4 + + ai@5.0.124(zod@3.25.76): + dependencies: + '@ai-sdk/gateway': 2.0.30(zod@3.25.76) + '@ai-sdk/provider': 2.0.1 + '@ai-sdk/provider-utils': 3.0.20(zod@3.25.76) + '@opentelemetry/api': 1.9.0 + zod: 3.25.76 + + ai@5.0.124(zod@4.3.6): + dependencies: + '@ai-sdk/gateway': 2.0.30(zod@4.3.6) + '@ai-sdk/provider': 2.0.1 + '@ai-sdk/provider-utils': 3.0.20(zod@4.3.6) + '@opentelemetry/api': 1.9.0 + zod: 4.3.6 + + ajv-formats@3.0.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + + aria-query@5.3.2: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-flatten@1.1.1: {} + + array-includes@3.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.findlastindex@1.2.6: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-shim-unscopables: 1.1.0 + + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + assertion-error@2.0.1: {} + + ast-types-flow@0.0.8: {} + + ast-v8-to-istanbul@0.3.11: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + estree-walker: 3.0.3 + js-tokens: 10.0.0 + + async-function@1.0.0: {} + + async-mutex@0.2.6: + dependencies: + tslib: 2.8.1 + + async@3.2.6: {} + + asynckit@0.4.0: {} + + atomic-sleep@1.0.0: {} + + autoprefixer@10.4.24(postcss@8.5.6): + dependencies: + browserslist: 4.28.1 + caniuse-lite: 1.0.30001766 + fraction.js: 5.3.4 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axe-core@4.11.1: {} + + axios-retry@4.5.0(axios@1.13.4): + dependencies: + axios: 1.13.4 + is-retry-allowed: 2.2.0 + + axios@1.13.4: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.5 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + axobject-query@4.1.0: {} + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + base-x@3.0.11: + dependencies: + safe-buffer: 5.2.1 + + base-x@5.0.1: {} + + base64-js@1.5.1: {} + + baseline-browser-mapping@2.9.19: {} + + big.js@6.2.2: {} + + binary-search@1.3.6: {} + + blakejs@1.2.1: {} + + bn.js@5.2.2: {} + + body-parser@1.20.4: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.1 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.14.1 + raw-body: 2.5.3 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + body-parser@2.2.2: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.3 + http-errors: 2.0.1 + iconv-lite: 0.7.2 + on-finished: 2.4.1 + qs: 6.14.1 + raw-body: 3.0.2 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + + borsh@0.7.0: + dependencies: + bn.js: 5.2.2 + bs58: 4.0.1 + text-encoding-utf-8: 1.0.2 + + bowser@2.13.1: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.9.19 + caniuse-lite: 1.0.30001766 + electron-to-chromium: 1.5.283 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) + + bs58@4.0.1: + dependencies: + base-x: 3.0.11 + + bs58@6.0.0: + dependencies: + base-x: 5.0.1 + + buffer-crc32@0.2.13: {} + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bufferutil@4.1.0: + dependencies: + node-gyp-build: 4.8.4 + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + camelize@1.0.1: {} + + caniuse-lite@1.0.30001766: {} + + canonicalize@2.1.0: {} + + ccount@2.0.1: {} + + chai@6.2.2: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.6.2: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@1.1.4: {} + + character-entities-legacy@3.0.0: {} + + character-entities@1.2.4: {} + + character-entities@2.0.2: {} + + character-reference-invalid@1.1.4: {} + + character-reference-invalid@2.0.1: {} + + charenc@0.0.2: {} + + chevrotain-allstar@0.3.1(chevrotain@11.0.3): + dependencies: + chevrotain: 11.0.3 + lodash-es: 4.17.23 + + chevrotain@11.0.3: + dependencies: + '@chevrotain/cst-dts-gen': 11.0.3 + '@chevrotain/gast': 11.0.3 + '@chevrotain/regexp-to-ast': 11.0.3 + '@chevrotain/types': 11.0.3 + '@chevrotain/utils': 11.0.3 + lodash-es: 4.17.21 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + + chownr@3.0.0: {} + + class-transformer@0.5.1: {} + + class-validator@0.14.3: + dependencies: + '@types/validator': 13.15.10 + libphonenumber-js: 1.12.36 + validator: 13.15.26 + + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-spinners@3.4.0: {} + + client-only@0.0.1: {} + + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + clsx@1.2.1: {} + + clsx@2.1.1: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-convert@3.1.3: + dependencies: + color-name: 2.1.0 + + color-name@1.1.4: {} + + color-name@2.1.0: {} + + color-string@2.1.4: + dependencies: + color-name: 2.1.0 + + color@5.0.3: + dependencies: + color-convert: 3.1.3 + color-string: 2.1.4 + + colorette@2.0.20: {} + + colors@1.4.0: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@1.0.8: {} + + comma-separated-tokens@2.0.3: {} + + commander@10.0.1: {} + + commander@13.1.0: {} + + commander@14.0.2: {} + + commander@14.0.3: {} + + commander@2.20.3: {} + + commander@7.2.0: {} + + commander@8.3.0: {} + + compare-versions@6.1.1: {} + + concat-map@0.0.1: {} + + confbox@0.1.8: {} + + console-table-printer@2.15.0: + dependencies: + simple-wcswidth: 1.1.2 + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-disposition@1.0.1: {} + + content-type@1.0.5: {} + + convert-source-map@2.0.0: {} + + cookie-es@1.2.2: {} + + cookie-signature@1.0.7: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + + copy-anything@4.0.5: + dependencies: + is-what: 5.5.0 + + core-util-is@1.0.3: {} + + cors@2.8.6: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cose-base@1.0.3: + dependencies: + layout-base: 1.0.2 + + cose-base@2.2.0: + dependencies: + layout-base: 2.0.1 + + crc-32@1.2.2: {} + + create-langgraph@1.1.5: + dependencies: + '@clack/prompts': 0.9.1 + '@commander-js/extra-typings': 13.1.0(commander@13.1.0) + commander: 13.1.0 + dedent: 1.7.1 + extract-zip: 2.0.1 + picocolors: 1.1.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + cross-fetch@3.2.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + cross-fetch@4.1.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + cross-inspect@1.0.1: + dependencies: + tslib: 2.8.1 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 + + crypt@0.0.2: {} + + css-color-keywords@1.0.0: {} + + css-to-react-native@3.2.0: + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + + cssesc@3.0.0: {} + + csstype@3.2.3: {} + + cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.1): + dependencies: + cose-base: 1.0.3 + cytoscape: 3.33.1 + + cytoscape-fcose@2.2.0(cytoscape@3.33.1): + dependencies: + cose-base: 2.2.0 + cytoscape: 3.33.1 + + cytoscape@3.33.1: {} + + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-axis@3.0.0: {} + + d3-brush@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3-chord@3.0.1: + dependencies: + d3-path: 3.1.0 + + d3-color@3.1.0: {} + + d3-contour@4.0.2: + dependencies: + d3-array: 3.2.4 + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.0.1 + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + + d3-ease@3.0.1: {} + + d3-fetch@3.0.1: + dependencies: + d3-dsv: 3.0.1 + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + d3-format@3.1.2: {} + + d3-geo@3.1.1: + dependencies: + d3-array: 3.2.4 + + d3-hierarchy@3.1.2: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@1.0.9: {} + + d3-path@3.1.0: {} + + d3-polygon@3.0.1: {} + + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-sankey@0.12.3: + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.2 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-selection@3.0.0: {} + + d3-shape@1.3.7: + dependencies: + d3-path: 1.0.9 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3@7.9.0: + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.2 + d3-geo: 3.1.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + + dagre-d3-es@7.0.13: + dependencies: + d3: 7.9.0 + lodash-es: 4.17.23 + + damerau-levenshtein@1.0.8: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + date-fns@2.30.0: + dependencies: + '@babel/runtime': 7.28.6 + + dateformat@4.6.3: {} + + dayjs@1.11.13: {} + + dayjs@1.11.19: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.3.4: + dependencies: + ms: 2.1.2 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decamelize@1.2.0: {} + + decode-named-character-reference@1.3.0: + dependencies: + character-entities: 2.0.2 + + decode-uri-component@0.2.2: {} + + dedent@1.7.1: {} + + deep-is@0.1.4: {} + + default-browser-id@5.0.1: {} + + default-browser@5.4.0: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.1 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-lazy-prop@3.0.0: {} + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + defu@6.1.4: {} + + delaunator@5.0.1: + dependencies: + robust-predicates: 3.0.2 + + delay@5.0.0: {} + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + dequal@2.0.3: {} + + derive-valtio@0.1.0(valtio@1.13.2(@types/react@19.2.10)(react@19.2.4)): + dependencies: + valtio: 1.13.2(@types/react@19.2.10)(react@19.2.4) + + destr@2.0.5: {} + + destroy@1.2.0: {} + + detect-browser@5.3.0: {} + + detect-libc@2.1.2: {} + + detect-node-es@1.1.0: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + diff-match-patch@1.0.5: {} + + diff@5.2.2: {} + + dijkstrajs@1.0.3: {} + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + dompurify@3.3.1: + optionalDependencies: + '@types/trusted-types': 2.0.7 + + dotenv@16.6.1: {} + + dset@3.1.4: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexify@4.1.3: + dependencies: + end-of-stream: 1.4.5 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + + eciesjs@0.4.17: + dependencies: + '@ecies/ciphers': 0.2.5(@noble/ciphers@1.3.0) + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.283: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + enabled@2.0.0: {} + + encode-utf8@1.0.3: {} + + encodeurl@2.0.0: {} + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + engine.io-client@6.6.4(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3 + engine.io-parser: 5.2.3 + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + xmlhttprequest-ssl: 2.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + engine.io-parser@5.2.3: {} + + enhanced-resolve@5.18.4: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + + entities@6.0.1: {} + + es-abstract@1.24.1: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.20 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-iterator-helpers@1.2.2: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + es-toolkit@1.33.0: {} + + es-toolkit@1.39.3: {} + + es6-promise@4.2.8: {} + + es6-promisify@5.0.0: + dependencies: + es6-promise: 4.2.8 + + esbuild-plugin-tailwindcss@2.1.0: + dependencies: + '@tailwindcss/postcss': 4.1.18 + autoprefixer: 10.4.24(postcss@8.5.6) + postcss: 8.5.6 + postcss-modules: 6.0.1(postcss@8.5.6) + + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + esbuild@0.27.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.2 + '@esbuild/android-arm': 0.27.2 + '@esbuild/android-arm64': 0.27.2 + '@esbuild/android-x64': 0.27.2 + '@esbuild/darwin-arm64': 0.27.2 + '@esbuild/darwin-x64': 0.27.2 + '@esbuild/freebsd-arm64': 0.27.2 + '@esbuild/freebsd-x64': 0.27.2 + '@esbuild/linux-arm': 0.27.2 + '@esbuild/linux-arm64': 0.27.2 + '@esbuild/linux-ia32': 0.27.2 + '@esbuild/linux-loong64': 0.27.2 + '@esbuild/linux-mips64el': 0.27.2 + '@esbuild/linux-ppc64': 0.27.2 + '@esbuild/linux-riscv64': 0.27.2 + '@esbuild/linux-s390x': 0.27.2 + '@esbuild/linux-x64': 0.27.2 + '@esbuild/netbsd-arm64': 0.27.2 + '@esbuild/netbsd-x64': 0.27.2 + '@esbuild/openbsd-arm64': 0.27.2 + '@esbuild/openbsd-x64': 0.27.2 + '@esbuild/openharmony-arm64': 0.27.2 + '@esbuild/sunos-x64': 0.27.2 + '@esbuild/win32-arm64': 0.27.2 + '@esbuild/win32-ia32': 0.27.2 + '@esbuild/win32-x64': 0.27.2 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-config-next@16.0.8(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@next/eslint-plugin-next': 16.0.8 + eslint: 9.39.2(jiti@2.6.1) + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-react: 7.37.5(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-react-hooks: 7.0.1(eslint@9.39.2(jiti@2.6.1)) + globals: 16.4.0 + typescript-eslint: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color + + eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)): + dependencies: + eslint: 9.39.2(jiti@2.6.1) + + eslint-import-context@0.1.9(unrs-resolver@1.11.1): + dependencies: + get-tsconfig: 4.13.1 + stable-hash-x: 0.2.0 + optionalDependencies: + unrs-resolver: 1.11.1 + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.11 + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.3 + eslint: 9.39.2(jiti@2.6.1) + get-tsconfig: 4.13.1 + is-bun-module: 2.0.0 + stable-hash: 0.0.5 + tinyglobby: 0.2.15 + unrs-resolver: 1.11.1 + optionalDependencies: + eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)) + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-typescript@4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)): + dependencies: + debug: 4.4.3 + eslint: 9.39.2(jiti@2.6.1) + eslint-import-context: 0.1.9(unrs-resolver@1.11.1) + get-tsconfig: 4.13.1 + is-bun-module: 2.0.0 + stable-hash-x: 0.2.0 + tinyglobby: 0.2.15 + unrs-resolver: 1.11.1 + optionalDependencies: + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.2(jiti@2.6.1)) + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.2(jiti@2.6.1)): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)) + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)): + dependencies: + debug: 3.2.7 + optionalDependencies: + eslint: 9.39.2(jiti@2.6.1) + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)) + transitivePeerDependencies: + - supports-color + + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.2(jiti@2.6.1)): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.39.2(jiti@2.6.1) + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.2(jiti@2.6.1)) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-import@2.32.0(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.39.2(jiti@2.6.1) + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.2(jiti@2.6.1)): + dependencies: + aria-query: 5.3.2 + array-includes: 3.1.9 + array.prototype.flatmap: 1.3.3 + ast-types-flow: 0.0.8 + axe-core: 4.11.1 + axobject-query: 4.1.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 9.39.2(jiti@2.6.1) + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + safe-regex-test: 1.1.0 + string.prototype.includes: 2.0.1 + + eslint-plugin-react-hooks@7.0.1(eslint@9.39.2(jiti@2.6.1)): + dependencies: + '@babel/core': 7.29.0 + '@babel/parser': 7.29.0 + eslint: 9.39.2(jiti@2.6.1) + hermes-parser: 0.25.1 + zod: 4.3.6 + zod-validation-error: 4.0.2(zod@4.3.6) + transitivePeerDependencies: + - supports-color + + eslint-plugin-react@7.37.5(eslint@9.39.2(jiti@2.6.1)): + dependencies: + array-includes: 3.1.9 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.2.2 + eslint: 9.39.2(jiti@2.6.1) + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.9 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint@9.39.2(jiti@2.6.1): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.39.2 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.6.1 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + + esprima@4.0.1: {} + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-util-is-identifier-name@3.0.0: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + esutils@2.0.3: {} + + etag@1.8.1: {} + + eth-block-tracker@7.1.0: + dependencies: + '@metamask/eth-json-rpc-provider': 1.0.1 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 5.0.2 + json-rpc-random-id: 1.0.1 + pify: 3.0.0 + transitivePeerDependencies: + - supports-color + + eth-json-rpc-filters@6.0.1: + dependencies: + '@metamask/safe-event-emitter': 3.1.2 + async-mutex: 0.2.6 + eth-query: 2.1.2 + json-rpc-engine: 6.1.0 + pify: 5.0.0 + + eth-query@2.1.2: + dependencies: + json-rpc-random-id: 1.0.1 + xtend: 4.0.2 + + eth-rpc-errors@4.0.3: + dependencies: + fast-safe-stringify: 2.1.1 + + ethereum-cryptography@2.2.1: + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.3.0 + + event-target-shim@5.0.1: {} + + eventemitter2@6.4.9: {} + + eventemitter3@4.0.7: {} + + eventemitter3@5.0.1: {} + + eventemitter3@5.0.4: {} + + events@3.3.0: {} + + eventsource-parser@3.0.6: {} + + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.0.6 + + execa@9.6.1: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.2 + + exit-hook@4.0.0: {} + + expect-type@1.3.0: {} + + expr-eval@2.0.2: {} + + express-rate-limit@7.5.1(express@5.2.1): + dependencies: + express: 5.2.1 + + express@4.22.1: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.4 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.0.7 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.2 + fresh: 0.5.2 + http-errors: 2.0.1 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.12 + proxy-addr: 2.0.7 + qs: 6.14.1 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.2 + serve-static: 1.16.3 + setprototypeof: 1.2.0 + statuses: 2.0.2 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + express@5.2.1: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.2 + content-disposition: 1.0.1 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.1 + fresh: 2.0.0 + http-errors: 2.0.1 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.1 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 + statuses: 2.0.2 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend@3.0.2: {} + + extension-port-stream@3.0.0: + dependencies: + readable-stream: 3.6.2 + webextension-polyfill: 0.10.0 + + extract-zip@2.0.1: + dependencies: + debug: 4.4.3 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + eyes@0.1.8: {} + + fast-copy@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.1: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-patch@3.1.1: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-password-entropy@1.1.1: {} + + fast-redact@3.5.0: {} + + fast-safe-stringify@2.1.1: {} + + fast-stable-stringify@1.0.0: {} + + fast-uri@3.1.0: {} + + fastestsmallesttextencoderdecoder@1.0.22: {} + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fault@1.0.4: + dependencies: + format: 0.2.2 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fecha@4.2.3: {} + + fetch-retry@6.0.0: {} + + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + filter-obj@1.1.0: {} + + finalhandler@1.3.2: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + finalhandler@2.1.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flat@5.0.2: {} + + flatted@3.3.3: {} + + fn.name@1.1.0: {} + + follow-redirects@1.15.11: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + form-data-encoder@1.7.2: {} + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + format@0.2.2: {} + + formdata-node@4.4.1: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + + forwarded@0.2.0: {} + + fraction.js@5.3.4: {} + + fresh@0.5.2: {} + + fresh@2.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + generator-function@2.0.1: {} + + generic-names@4.0.0: + dependencies: + loader-utils: 3.3.1 + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.4.0: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-nonce@1.0.1: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@5.2.0: + dependencies: + pump: 3.0.3 + + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + get-tsconfig@4.13.1: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + globals@14.0.0: {} + + globals@16.4.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphql-query-complexity@0.12.0(graphql@16.12.0): + dependencies: + graphql: 16.12.0 + lodash.get: 4.4.2 + + graphql-scalars@1.25.0(graphql@16.12.0): + dependencies: + graphql: 16.12.0 + tslib: 2.8.1 + + graphql-yoga@5.18.0(graphql@16.12.0): + dependencies: + '@envelop/core': 5.5.0 + '@envelop/instrumentation': 1.0.0 + '@graphql-tools/executor': 1.5.1(graphql@16.12.0) + '@graphql-tools/schema': 10.0.31(graphql@16.12.0) + '@graphql-tools/utils': 10.11.0(graphql@16.12.0) + '@graphql-yoga/logger': 2.0.1 + '@graphql-yoga/subscription': 5.0.5 + '@whatwg-node/fetch': 0.10.13 + '@whatwg-node/promise-helpers': 1.3.2 + '@whatwg-node/server': 0.10.18 + graphql: 16.12.0 + lru-cache: 10.4.3 + tslib: 2.8.1 + + graphql@16.12.0: {} + + gray-matter@4.0.3: + dependencies: + js-yaml: 3.14.2 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + + h3@1.15.5: + dependencies: + cookie-es: 1.2.2 + crossws: 0.3.5 + defu: 6.1.4 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.4 + radix3: 1.1.2 + ufo: 1.6.3 + uncrypto: 0.1.3 + + hachure-fill@0.5.2: {} + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-from-dom@5.0.1: + dependencies: + '@types/hast': 3.0.4 + hastscript: 9.0.1 + web-namespaces: 2.0.1 + + hast-util-from-html-isomorphic@2.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-dom: 5.0.1 + hast-util-from-html: 2.0.3 + unist-util-remove-position: 5.0.0 + + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.3 + parse5: 7.3.0 + vfile: 6.0.3 + vfile-message: 4.0.3 + + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.1.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-parse-selector@2.2.5: {} + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.1 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-sanitize@5.0.2: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.3.0 + unist-util-position: 5.0.0 + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + + hast-util-whitespace@2.0.1: {} + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast@1.0.0: {} + + hastscript@6.0.0: + dependencies: + '@types/hast': 2.3.10 + comma-separated-tokens: 1.0.8 + hast-util-parse-selector: 2.2.5 + property-information: 5.6.0 + space-separated-tokens: 1.1.5 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + + help-me@5.0.0: {} + + hermes-estree@0.25.1: {} + + hermes-parser@0.25.1: + dependencies: + hermes-estree: 0.25.1 + + highlight.js@10.7.3: {} + + highlightjs-vue@1.0.0: {} + + hono@4.11.7: {} + + html-escaper@2.0.2: {} + + html-url-attributes@3.0.1: {} + + html-void-elements@3.0.0: {} + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + human-signals@8.0.1: {} + + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.7.2: + dependencies: + safer-buffer: 2.1.2 + + icss-utils@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + idb-keyval@6.2.1: {} + + idb-keyval@6.2.2: {} + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inherits@2.0.4: {} + + inline-style-parser@0.1.1: {} + + inline-style-parser@0.2.7: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + internmap@1.0.1: {} + + internmap@2.0.3: {} + + ipaddr.js@1.9.1: {} + + iron-webcrypto@1.2.1: {} + + is-alphabetical@1.0.4: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@1.0.4: + dependencies: + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-any-array@2.0.1: {} + + is-arguments@1.2.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-buffer@1.1.6: {} + + is-buffer@2.0.5: {} + + is-bun-module@2.0.0: + dependencies: + semver: 7.7.3 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-decimal@1.0.4: {} + + is-decimal@2.0.1: {} + + is-docker@3.0.0: {} + + is-extendable@0.1.1: {} + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@1.0.4: {} + + is-hexadecimal@2.0.1: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-interactive@2.0.0: {} + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-network-error@1.3.0: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-plain-obj@4.1.0: {} + + is-promise@4.0.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-retry-allowed@2.2.0: {} + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-stream@2.0.1: {} + + is-stream@4.0.1: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.20 + + is-unicode-supported@2.1.0: {} + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-what@5.5.0: {} + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10)): + dependencies: + ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + + isows@1.0.6(ws@8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)): + dependencies: + ws: 8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + + isows@1.0.7(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)): + dependencies: + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + iterator.prototype@1.1.5: + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + + jayson@4.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + '@types/connect': 3.4.38 + '@types/node': 12.20.55 + '@types/ws': 7.4.7 + commander: 2.20.3 + delay: 5.0.0 + es6-promisify: 5.0.0 + eyes: 0.1.8 + isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + json-stringify-safe: 5.0.1 + stream-json: 1.9.1 + uuid: 8.3.2 + ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + jiti@2.6.1: {} + + jose@4.15.9: {} + + jose@5.10.0: {} + + jose@6.1.3: {} + + joycon@3.1.1: {} + + js-cookie@3.0.5: {} + + js-tiktoken@1.0.21: + dependencies: + base64-js: 1.5.1 + + js-tokens@10.0.0: {} + + js-tokens@4.0.0: {} + + js-yaml@3.14.2: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-rpc-engine@6.1.0: + dependencies: + '@metamask/safe-event-emitter': 2.0.0 + eth-rpc-errors: 4.0.3 + + json-rpc-random-id@1.0.1: {} + + json-schema-to-zod@2.7.0: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-schema-typed@8.0.2: {} + + json-schema@0.4.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json-stringify-safe@5.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + json5@2.2.3: {} + + jsondiffpatch@0.6.0: + dependencies: + '@types/diff-match-patch': 1.0.36 + chalk: 5.6.2 + diff-match-patch: 1.0.5 + + jsonpointer@5.0.1: {} + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.9 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + + katex@0.16.28: + dependencies: + commander: 8.3.0 + + keccak@3.0.4: + dependencies: + node-addon-api: 2.0.2 + node-gyp-build: 4.8.4 + readable-stream: 3.6.2 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + keyvaluestorage-interface@1.0.0: {} + + khroma@2.1.0: {} + + kind-of@6.0.3: {} + + kleur@3.0.3: {} + + kleur@4.1.5: {} + + kuler@2.0.0: {} + + langchain@0.3.37(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(@opentelemetry/api@1.9.0)(axios@1.13.4)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)): + dependencies: + '@langchain/core': 0.3.80(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) + '@langchain/openai': 0.6.17(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))) + js-tiktoken: 1.0.21 + js-yaml: 4.1.1 + jsonpointer: 5.0.1 + langsmith: 0.3.87(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) + openapi-types: 12.1.3 + p-retry: 4.6.2 + uuid: 10.0.0 + yaml: 2.8.2 + zod: 3.25.76 + optionalDependencies: + axios: 1.13.4 + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - openai + - ws + optional: true + + langchain@0.3.37(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(axios@1.13.4)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)): + dependencies: + '@langchain/core': 1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + '@langchain/openai': 0.6.17(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/textsplitters': 0.1.0(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))) + js-tiktoken: 1.0.21 + js-yaml: 4.1.1 + jsonpointer: 5.0.1 + langsmith: 0.3.87(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + openapi-types: 12.1.3 + p-retry: 4.6.2 + uuid: 10.0.0 + yaml: 2.8.2 + zod: 3.25.76 + optionalDependencies: + axios: 1.13.4 + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - openai + - ws + + langchain@0.3.37(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(axios@1.13.4)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)): + dependencies: + '@langchain/core': 1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + '@langchain/openai': 0.6.17(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/textsplitters': 0.1.0(@langchain/core@1.1.18(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6))) + js-tiktoken: 1.0.21 + js-yaml: 4.1.1 + jsonpointer: 5.0.1 + langsmith: 0.3.87(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)) + openapi-types: 12.1.3 + p-retry: 4.6.2 + uuid: 10.0.0 + yaml: 2.8.2 + zod: 3.25.76 + optionalDependencies: + axios: 1.13.4 + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - openai + - ws + + langium@3.3.1: + dependencies: + chevrotain: 11.0.3 + chevrotain-allstar: 0.3.1(chevrotain@11.0.3) + vscode-languageserver: 9.0.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.0.8 + + langsmith@0.1.68(openai@4.104.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)): + dependencies: + '@types/uuid': 10.0.0 + commander: 10.0.1 + p-queue: 6.6.2 + p-retry: 4.6.2 + semver: 7.7.3 + uuid: 10.0.0 + optionalDependencies: + openai: 4.104.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) + + langsmith@0.1.68(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)): + dependencies: + '@types/uuid': 10.0.0 + commander: 10.0.1 + p-queue: 6.6.2 + p-retry: 4.6.2 + semver: 7.7.3 + uuid: 10.0.0 + optionalDependencies: + openai: 4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) + + langsmith@0.1.68(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)): + dependencies: + '@types/uuid': 10.0.0 + commander: 10.0.1 + p-queue: 6.6.2 + p-retry: 4.6.2 + semver: 7.7.3 + uuid: 10.0.0 + optionalDependencies: + openai: 6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6) + + langsmith@0.1.68(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)): + dependencies: + '@types/uuid': 10.0.0 + commander: 10.0.1 + p-queue: 6.6.2 + p-retry: 4.6.2 + semver: 7.7.3 + uuid: 10.0.0 + optionalDependencies: + openai: 6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6) + + langsmith@0.3.87(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)): + dependencies: + '@types/uuid': 10.0.0 + chalk: 4.1.2 + console-table-printer: 2.15.0 + p-queue: 6.6.2 + semver: 7.7.3 + uuid: 10.0.0 + optionalDependencies: + '@opentelemetry/api': 1.9.0 + openai: 6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) + + langsmith@0.3.87(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)): + dependencies: + '@types/uuid': 10.0.0 + chalk: 4.1.2 + console-table-printer: 2.15.0 + p-queue: 6.6.2 + semver: 7.7.3 + uuid: 10.0.0 + optionalDependencies: + '@opentelemetry/api': 1.9.0 + openai: 6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6) + + langsmith@0.3.87(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)): + dependencies: + '@types/uuid': 10.0.0 + chalk: 4.1.2 + console-table-printer: 2.15.0 + p-queue: 6.6.2 + semver: 7.7.3 + uuid: 10.0.0 + optionalDependencies: + '@opentelemetry/api': 1.9.0 + openai: 6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6) + + langsmith@0.4.12(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)): + dependencies: + '@types/uuid': 10.0.0 + chalk: 4.1.2 + console-table-printer: 2.15.0 + p-queue: 6.6.2 + semver: 7.7.3 + uuid: 10.0.0 + optionalDependencies: + '@opentelemetry/api': 1.9.0 + openai: 6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6) + + langsmith@0.4.12(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)): + dependencies: + '@types/uuid': 10.0.0 + chalk: 4.1.2 + console-table-printer: 2.15.0 + p-queue: 6.6.2 + semver: 7.7.3 + uuid: 10.0.0 + optionalDependencies: + '@opentelemetry/api': 1.9.0 + openai: 6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6) + + language-subtag-registry@0.3.23: {} + + language-tags@1.0.9: + dependencies: + language-subtag-registry: 0.3.23 + + layout-base@1.0.2: {} + + layout-base@2.0.1: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + libphonenumber-js@1.12.36: {} + + lightningcss-android-arm64@1.30.2: + optional: true + + lightningcss-darwin-arm64@1.30.2: + optional: true + + lightningcss-darwin-x64@1.30.2: + optional: true + + lightningcss-freebsd-x64@1.30.2: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.2: + optional: true + + lightningcss-linux-arm64-gnu@1.30.2: + optional: true + + lightningcss-linux-arm64-musl@1.30.2: + optional: true + + lightningcss-linux-x64-gnu@1.30.2: + optional: true + + lightningcss-linux-x64-musl@1.30.2: + optional: true + + lightningcss-win32-arm64-msvc@1.30.2: + optional: true + + lightningcss-win32-x64-msvc@1.30.2: + optional: true + + lightningcss@1.30.2: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.30.2 + lightningcss-darwin-arm64: 1.30.2 + lightningcss-darwin-x64: 1.30.2 + lightningcss-freebsd-x64: 1.30.2 + lightningcss-linux-arm-gnueabihf: 1.30.2 + lightningcss-linux-arm64-gnu: 1.30.2 + lightningcss-linux-arm64-musl: 1.30.2 + lightningcss-linux-x64-gnu: 1.30.2 + lightningcss-linux-x64-musl: 1.30.2 + lightningcss-win32-arm64-msvc: 1.30.2 + lightningcss-win32-x64-msvc: 1.30.2 + + lit-element@4.2.2: + dependencies: + '@lit-labs/ssr-dom-shim': 1.5.1 + '@lit/reactive-element': 2.1.2 + lit-html: 3.3.2 + + lit-html@3.3.2: + dependencies: + '@types/trusted-types': 2.0.7 + + lit@3.3.0: + dependencies: + '@lit/reactive-element': 2.1.2 + lit-element: 4.2.2 + lit-html: 3.3.2 + + lit@3.3.2: + dependencies: + '@lit/reactive-element': 2.1.2 + lit-element: 4.2.2 + lit-html: 3.3.2 + + loader-utils@3.3.1: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash-es@4.17.21: {} + + lodash-es@4.17.23: {} + + lodash.camelcase@4.3.0: {} + + lodash.get@4.4.2: {} + + lodash.merge@4.6.2: {} + + lodash@4.17.23: {} + + log-symbols@7.0.1: + dependencies: + is-unicode-supported: 2.1.0 + yoctocolors: 2.1.2 + + logform@2.7.0: + dependencies: + '@colors/colors': 1.6.0 + '@types/triple-beam': 1.3.5 + fecha: 4.2.3 + ms: 2.1.3 + safe-stable-stringify: 2.5.0 + triple-beam: 1.4.1 + + longest-streak@3.1.0: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lowlight@1.20.0: + dependencies: + fault: 1.0.4 + highlight.js: 10.7.3 + + lru-cache@10.4.3: {} + + lru-cache@11.2.5: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lucide-react@0.525.0(react@19.2.4): + dependencies: + react: 19.2.4 + + lucide-react@0.542.0(react@19.2.4): + dependencies: + react: 19.2.4 + + lucide-react@0.554.0(react@19.2.4): + dependencies: + react: 19.2.4 + + lucide-react@0.561.0(react@19.2.4): + dependencies: + react: 19.2.4 + + lucide@0.525.0: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.5.1: + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + source-map-js: 1.2.1 + + make-dir@4.0.0: + dependencies: + semver: 7.7.3 + + markdown-table@3.0.4: {} + + marked@12.0.2: {} + + marked@16.4.2: {} + + math-intrinsics@1.1.0: {} + + md5@2.3.0: + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + + mdast-util-definitions@5.1.2: + dependencies: + '@types/mdast': 3.0.15 + '@types/unist': 2.0.11 + unist-util-visit: 4.1.2 + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + mdast-util-from-markdown@1.3.1: + dependencies: + '@types/mdast': 3.0.15 + '@types/unist': 2.0.11 + decode-named-character-reference: 1.3.0 + mdast-util-to-string: 3.2.0 + micromark: 3.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-decode-string: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-stringify-position: 3.0.3 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-math@3.0.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + longest-streak: 3.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + unist-util-remove-position: 5.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + + mdast-util-to-hast@12.3.0: + dependencies: + '@types/hast': 2.3.10 + '@types/mdast': 3.0.15 + mdast-util-definitions: 5.1.2 + micromark-util-sanitize-uri: 1.2.0 + trim-lines: 3.0.1 + unist-util-generated: 2.0.1 + unist-util-position: 4.0.4 + unist-util-visit: 4.1.2 + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 + + mdast-util-to-string@3.2.0: + dependencies: + '@types/mdast': 3.0.15 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + media-typer@0.3.0: {} + + media-typer@1.1.0: {} + + merge-descriptors@1.0.3: {} + + merge-descriptors@2.0.0: {} + + merge2@1.4.1: {} + + mermaid@11.12.2: + dependencies: + '@braintree/sanitize-url': 7.1.2 + '@iconify/utils': 3.1.0 + '@mermaid-js/parser': 0.6.3 + '@types/d3': 7.4.3 + cytoscape: 3.33.1 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.33.1) + cytoscape-fcose: 2.2.0(cytoscape@3.33.1) + d3: 7.9.0 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.13 + dayjs: 1.11.19 + dompurify: 3.3.1 + katex: 0.16.28 + khroma: 2.1.0 + lodash-es: 4.17.23 + marked: 16.4.2 + roughjs: 4.6.6 + stylis: 4.3.6 + ts-dedent: 2.2.0 + uuid: 11.1.0 + + methods@1.1.2: {} + + micro-ftch@0.3.1: {} + + micromark-core-commonmark@1.1.0: + dependencies: + decode-named-character-reference: 1.3.0 + micromark-factory-destination: 1.1.0 + micromark-factory-label: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-factory-title: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-html-tag-name: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-cjk-friendly-gfm-strikethrough@1.2.3(micromark-util-types@2.0.2)(micromark@4.0.2): + dependencies: + devlop: 1.1.0 + get-east-asian-width: 1.4.0 + micromark: 4.0.2 + micromark-extension-cjk-friendly-util: 2.1.1(micromark-util-types@2.0.2) + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + optionalDependencies: + micromark-util-types: 2.0.2 + + micromark-extension-cjk-friendly-util@2.1.1(micromark-util-types@2.0.2): + dependencies: + get-east-asian-width: 1.4.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + optionalDependencies: + micromark-util-types: 2.0.2 + + micromark-extension-cjk-friendly@1.2.3(micromark-util-types@2.0.2)(micromark@4.0.2): + dependencies: + devlop: 1.1.0 + micromark: 4.0.2 + micromark-extension-cjk-friendly-util: 2.1.1(micromark-util-types@2.0.2) + micromark-util-chunked: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + optionalDependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-math@3.1.0: + dependencies: + '@types/katex': 0.16.8 + devlop: 1.1.0 + katex: 0.16.28 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@1.1.0: + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@1.1.0: + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@1.2.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@1.1.0: + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@1.1.0: + dependencies: + decode-named-character-reference: 1.3.0 + micromark-util-character: 1.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-symbol: 1.1.0 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.3.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@1.1.0: {} + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@1.2.0: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@1.1.0: + dependencies: + micromark-util-types: 1.1.0 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@1.2.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-encode: 1.1.0 + micromark-util-symbol: 1.1.0 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@1.1.0: + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@1.1.0: {} + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@1.1.0: {} + + micromark-util-types@2.0.2: {} + + micromark@3.2.0: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.3 + decode-named-character-reference: 1.3.0 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-combine-extensions: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-encode: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + + mime@1.6.0: {} + + mimic-function@5.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + minizlib@3.1.0: + dependencies: + minipass: 7.1.2 + + mipd@0.0.7(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + + ml-array-mean@1.1.6: + dependencies: + ml-array-sum: 1.1.6 + + ml-array-sum@1.1.6: + dependencies: + is-any-array: 2.0.1 + + ml-distance-euclidean@2.0.0: {} + + ml-distance@4.0.1: + dependencies: + ml-array-mean: 1.1.6 + ml-distance-euclidean: 2.0.0 + ml-tree-similarity: 1.0.0 + + ml-tree-similarity@1.0.0: + dependencies: + binary-search: 1.3.6 + num-sort: 2.1.0 + + mlly@1.8.0: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.3 + + mri@1.2.0: {} + + ms@2.0.0: {} + + ms@2.1.2: {} + + ms@2.1.3: {} + + multiformats@9.9.0: {} + + mustache@4.2.0: {} + + nanoid@3.3.11: {} + + napi-postinstall@0.3.4: {} + + natural-compare@1.4.0: {} + + negotiator@0.6.3: {} + + negotiator@1.0.0: {} + + next@16.0.8(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + '@next/env': 16.0.8 + '@swc/helpers': 0.5.15 + caniuse-lite: 1.0.30001766 + postcss: 8.4.31 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + styled-jsx: 5.1.6(@babel/core@7.29.0)(react@19.2.4) + optionalDependencies: + '@next/swc-darwin-arm64': 16.0.8 + '@next/swc-darwin-x64': 16.0.8 + '@next/swc-linux-arm64-gnu': 16.0.8 + '@next/swc-linux-arm64-musl': 16.0.8 + '@next/swc-linux-x64-gnu': 16.0.8 + '@next/swc-linux-x64-musl': 16.0.8 + '@next/swc-win32-arm64-msvc': 16.0.8 + '@next/swc-win32-x64-msvc': 16.0.8 + '@opentelemetry/api': 1.9.0 + sharp: 0.34.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + node-addon-api@2.0.2: {} + + node-cron@4.2.1: {} + + node-domexception@1.0.0: {} + + node-fetch-native@1.6.7: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-gyp-build@4.8.4: {} + + node-mock-http@1.0.4: {} + + node-releases@2.0.27: {} + + normalize-path@3.0.0: {} + + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + + num-sort@2.1.0: {} + + obj-multiplex@1.0.0: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + readable-stream: 2.3.8 + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.entries@1.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + obug@2.1.1: {} + + ofetch@1.5.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.3 + + on-exit-leak-free@0.2.0: {} + + on-exit-leak-free@2.1.2: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + one-time@1.0.0: + dependencies: + fn.name: 1.1.0 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + oniguruma-parser@0.12.1: {} + + oniguruma-to-es@4.3.4: + dependencies: + oniguruma-parser: 0.12.1 + regex: 6.1.0 + regex-recursion: 6.0.2 + + open@10.2.0: + dependencies: + default-browser: 5.4.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 + + openai@4.104.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76): + dependencies: + '@types/node': 18.19.130 + '@types/node-fetch': 2.6.13 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + optionalDependencies: + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + zod: 3.25.76 + transitivePeerDependencies: + - encoding + + openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76): + dependencies: + '@types/node': 18.19.130 + '@types/node-fetch': 2.6.13 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + optionalDependencies: + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + zod: 3.25.76 + transitivePeerDependencies: + - encoding + + openai@5.12.2(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76): + optionalDependencies: + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + zod: 3.25.76 + + openai@5.12.2(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76): + optionalDependencies: + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + zod: 3.25.76 + + openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76): + optionalDependencies: + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + zod: 3.25.76 + + openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6): + optionalDependencies: + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + zod: 4.3.6 + + openai@6.17.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6): + optionalDependencies: + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + zod: 4.3.6 + + openapi-fetch@0.13.8: + dependencies: + openapi-typescript-helpers: 0.0.15 + + openapi-types@12.1.3: {} + + openapi-typescript-helpers@0.0.15: {} + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + ora@9.1.0: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 3.4.0 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 7.0.1 + stdin-discarder: 0.2.2 + string-width: 8.1.1 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + ox@0.11.3(typescript@5.9.3)(zod@3.22.4): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.9.3)(zod@3.22.4) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - zod + + ox@0.11.3(typescript@5.9.3)(zod@3.25.76): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - zod + + ox@0.11.3(typescript@5.9.3)(zod@4.3.6): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.9.3)(zod@4.3.6) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - zod + + ox@0.6.7(typescript@5.9.3)(zod@3.25.76): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.9.3)(zod@3.25.76) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - zod + + ox@0.6.9(typescript@5.9.3)(zod@3.25.76): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - zod + + ox@0.9.1(typescript@5.9.3)(zod@3.25.76): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.0.8(typescript@5.9.3)(zod@3.25.76) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - zod + + ox@0.9.17(typescript@5.9.3)(zod@4.3.6): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.9.3)(zod@4.3.6) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - zod + + ox@0.9.3(typescript@5.9.3)(zod@3.25.76): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - zod + + p-finally@1.0.0: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-queue@6.6.2: + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + + p-retry@4.6.2: + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + + p-retry@7.1.1: + dependencies: + is-network-error: 1.3.0 + + p-timeout@3.2.0: + dependencies: + p-finally: 1.0.0 + + p-try@2.2.0: {} + + package-manager-detector@1.6.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-entities@2.0.0: + dependencies: + character-entities: 1.2.4 + character-entities-legacy: 1.1.4 + character-reference-invalid: 1.1.4 + is-alphanumerical: 1.0.4 + is-decimal: 1.0.4 + is-hexadecimal: 1.0.4 + + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.3.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-ms@4.0.0: {} + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + parseurl@1.3.3: {} + + partial-json@0.1.7: {} + + path-data-parser@0.1.0: {} + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-to-regexp@0.1.12: {} + + path-to-regexp@8.3.0: {} + + pathe@2.0.3: {} + + pend@1.2.0: {} + + permissionless@0.2.57(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)): + dependencies: + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + optional: true + + permissionless@0.2.57(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6)): + dependencies: + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6) + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + pify@3.0.0: {} + + pify@5.0.0: {} + + pinata@2.5.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + optionalDependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + pino-abstract-transport@0.5.0: + dependencies: + duplexify: 4.1.3 + split2: 4.2.0 + + pino-abstract-transport@1.2.0: + dependencies: + readable-stream: 4.7.0 + split2: 4.2.0 + + pino-abstract-transport@2.0.0: + dependencies: + split2: 4.2.0 + + pino-pretty@10.3.1: + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 3.0.2 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.2.0 + pump: 3.0.3 + readable-stream: 4.7.0 + secure-json-parse: 2.7.0 + sonic-boom: 3.8.1 + strip-json-comments: 3.1.1 + + pino-pretty@11.3.0: + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 3.0.2 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pump: 3.0.3 + readable-stream: 4.7.0 + secure-json-parse: 2.7.0 + sonic-boom: 4.2.0 + strip-json-comments: 3.1.1 + + pino-std-serializers@4.0.0: {} + + pino-std-serializers@7.1.0: {} + + pino@10.0.0: + dependencies: + atomic-sleep: 1.0.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pino-std-serializers: 7.1.0 + process-warning: 5.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + slow-redact: 0.3.2 + sonic-boom: 4.2.0 + thread-stream: 3.1.0 + + pino@7.11.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 0.2.0 + pino-abstract-transport: 0.5.0 + pino-std-serializers: 4.0.0 + process-warning: 1.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.1.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 2.8.0 + thread-stream: 0.15.2 + + pino@9.14.0: + dependencies: + '@pinojs/redact': 0.4.0 + atomic-sleep: 1.0.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pino-std-serializers: 7.1.0 + process-warning: 5.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.0 + thread-stream: 3.1.0 + + pkce-challenge@5.0.1: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 + + pngjs@5.0.0: {} + + points-on-curve@0.2.0: {} + + points-on-path@0.2.1: + dependencies: + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + + pony-cause@2.1.11: {} + + porto@0.2.35(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(@wagmi/core@2.22.1(@tanstack/query-core@5.90.20)(@types/react@19.2.10)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)): + dependencies: + '@wagmi/core': 2.22.1(@tanstack/query-core@5.90.20)(@types/react@19.2.10)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + hono: 4.11.7 + idb-keyval: 6.2.2 + mipd: 0.0.7(typescript@5.9.3) + ox: 0.9.17(typescript@5.9.3)(zod@4.3.6) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zod: 4.3.6 + zustand: 5.0.11(@types/react@19.2.10)(react@19.2.4)(use-sync-external-store@1.4.0(react@19.2.4)) + optionalDependencies: + '@tanstack/react-query': 5.90.20(react@19.2.4) + react: 19.2.4 + typescript: 5.9.3 + wagmi: 2.19.5(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + transitivePeerDependencies: + - '@types/react' + - immer + - use-sync-external-store + + porto@0.2.35(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(@wagmi/core@2.22.1(@tanstack/query-core@5.90.20)(@types/react@19.2.10)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6)))(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6))(wagmi@2.19.5(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6))(zod@3.25.76)): + dependencies: + '@wagmi/core': 2.22.1(@tanstack/query-core@5.90.20)(@types/react@19.2.10)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6)) + hono: 4.11.7 + idb-keyval: 6.2.2 + mipd: 0.0.7(typescript@5.9.3) + ox: 0.9.17(typescript@5.9.3)(zod@4.3.6) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6) + zod: 4.3.6 + zustand: 5.0.11(@types/react@19.2.10)(react@19.2.4)(use-sync-external-store@1.4.0(react@19.2.4)) + optionalDependencies: + '@tanstack/react-query': 5.90.20(react@19.2.4) + react: 19.2.4 + typescript: 5.9.3 + wagmi: 2.19.5(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6))(zod@3.25.76) + transitivePeerDependencies: + - '@types/react' + - immer + - use-sync-external-store + + possible-typed-array-names@1.1.0: {} + + postcss-modules-extract-imports@3.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-modules-local-by-default@4.2.0(postcss@8.5.6): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 + postcss-value-parser: 4.2.0 + + postcss-modules-scope@3.2.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 + + postcss-modules-values@4.0.0(postcss@8.5.6): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + + postcss-modules@6.0.1(postcss@8.5.6): + dependencies: + generic-names: 4.0.0 + icss-utils: 5.1.0(postcss@8.5.6) + lodash.camelcase: 4.3.0 + postcss: 8.5.6 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) + postcss-modules-scope: 3.2.1(postcss@8.5.6) + postcss-modules-values: 4.0.0(postcss@8.5.6) + string-hash: 1.1.3 + + postcss-selector-parser@7.1.1: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.31: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postcss@8.4.49: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + preact@10.24.2: {} + + preact@10.28.3: {} + + prelude-ls@1.2.1: {} + + prettier@3.8.1: {} + + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 + + prismjs@1.27.0: {} + + prismjs@1.30.0: {} + + process-nextick-args@2.0.1: {} + + process-warning@1.0.0: {} + + process-warning@5.0.0: {} + + process@0.11.10: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + property-information@5.6.0: + dependencies: + xtend: 4.0.2 + + property-information@6.5.0: {} + + property-information@7.1.0: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + proxy-compare@2.6.0: {} + + proxy-compare@3.0.1: {} + + proxy-from-env@1.1.0: {} + + pump@3.0.3: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + punycode@2.3.1: {} + + qrcode@1.5.3: + dependencies: + dijkstrajs: 1.0.3 + encode-utf8: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + + qrcode@1.5.4: + dependencies: + dijkstrajs: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + + qs@6.14.1: + dependencies: + side-channel: 1.1.0 + + query-string@7.1.3: + dependencies: + decode-uri-component: 0.2.2 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 + + queue-microtask@1.2.3: {} + + quick-format-unescaped@4.0.4: {} + + radix3@1.1.2: {} + + range-parser@1.2.1: {} + + raw-body@2.5.3: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.2 + unpipe: 1.0.0 + + react-device-detect@2.2.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + ua-parser-js: 1.0.41 + + react-dom@19.2.4(react@19.2.4): + dependencies: + react: 19.2.4 + scheduler: 0.27.0 + + react-is@16.13.1: {} + + react-is@18.3.1: {} + + react-markdown@10.1.0(@types/react@19.2.10)(react@19.2.4): + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/react': 19.2.10 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.6 + html-url-attributes: 3.0.1 + mdast-util-to-hast: 13.2.1 + react: 19.2.4 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + unified: 11.0.5 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + react-markdown@8.0.7(@types/react@19.2.10)(react@19.2.4): + dependencies: + '@types/hast': 2.3.10 + '@types/prop-types': 15.7.15 + '@types/react': 19.2.10 + '@types/unist': 2.0.11 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 2.0.1 + prop-types: 15.8.1 + property-information: 6.5.0 + react: 19.2.4 + react-is: 18.3.1 + remark-parse: 10.0.2 + remark-rehype: 10.1.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.4 + unified: 10.1.2 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + transitivePeerDependencies: + - supports-color + + react-remove-scroll-bar@2.3.8(@types/react@19.2.10)(react@19.2.4): + dependencies: + react: 19.2.4 + react-style-singleton: 2.2.3(@types/react@19.2.10)(react@19.2.4) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.10 + + react-remove-scroll@2.7.2(@types/react@19.2.10)(react@19.2.4): + dependencies: + react: 19.2.4 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.10)(react@19.2.4) + react-style-singleton: 2.2.3(@types/react@19.2.10)(react@19.2.4) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.2.10)(react@19.2.4) + use-sidecar: 1.1.3(@types/react@19.2.10)(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + + react-style-singleton@2.2.3(@types/react@19.2.10)(react@19.2.4): + dependencies: + get-nonce: 1.0.1 + react: 19.2.4 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.10 + + react-syntax-highlighter@15.6.6(react@19.2.4): + dependencies: + '@babel/runtime': 7.28.6 + highlight.js: 10.7.3 + highlightjs-vue: 1.0.0 + lowlight: 1.20.0 + prismjs: 1.30.0 + react: 19.2.4 + refractor: 3.6.0 + + react@19.2.4: {} + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readdirp@4.1.2: {} + + readdirp@5.0.0: {} + + real-require@0.1.0: {} + + real-require@0.2.0: {} + + reflect-metadata@0.2.2: {} + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + refractor@3.6.0: + dependencies: + hastscript: 6.0.0 + parse-entities: 2.0.0 + prismjs: 1.27.0 + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + rehype-harden@1.1.7: + dependencies: + unist-util-visit: 5.1.0 + + rehype-katex@7.0.1: + dependencies: + '@types/hast': 3.0.4 + '@types/katex': 0.16.8 + hast-util-from-html-isomorphic: 2.0.0 + hast-util-to-text: 4.0.2 + katex: 0.16.28 + unist-util-visit-parents: 6.0.2 + vfile: 6.0.3 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-sanitize@6.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-sanitize: 5.0.2 + + remark-cjk-friendly-gfm-strikethrough@1.2.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5): + dependencies: + micromark-extension-cjk-friendly-gfm-strikethrough: 1.2.3(micromark-util-types@2.0.2)(micromark@4.0.2) + unified: 11.0.5 + optionalDependencies: + '@types/mdast': 4.0.4 + transitivePeerDependencies: + - micromark + - micromark-util-types + + remark-cjk-friendly@1.2.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5): + dependencies: + micromark-extension-cjk-friendly: 1.2.3(micromark-util-types@2.0.2)(micromark@4.0.2) + unified: 11.0.5 + optionalDependencies: + '@types/mdast': 4.0.4 + transitivePeerDependencies: + - micromark + - micromark-util-types + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-math@6.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-math: 3.0.0 + micromark-extension-math: 3.1.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-parse@10.0.2: + dependencies: + '@types/mdast': 3.0.15 + mdast-util-from-markdown: 1.3.1 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@10.1.0: + dependencies: + '@types/hast': 2.3.10 + '@types/mdast': 3.0.15 + mdast-util-to-hast: 12.3.0 + unified: 10.1.2 + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.1 + unified: 11.0.5 + vfile: 6.0.3 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + remend@1.0.1: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + require-main-filename@2.0.0: {} + + resolve-from@4.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.11: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + resolve@2.0.0-next.5: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + retry@0.13.1: {} + + reusify@1.1.0: {} + + robust-predicates@3.0.2: {} + + rollup@4.57.1: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.57.1 + '@rollup/rollup-android-arm64': 4.57.1 + '@rollup/rollup-darwin-arm64': 4.57.1 + '@rollup/rollup-darwin-x64': 4.57.1 + '@rollup/rollup-freebsd-arm64': 4.57.1 + '@rollup/rollup-freebsd-x64': 4.57.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 + '@rollup/rollup-linux-arm-musleabihf': 4.57.1 + '@rollup/rollup-linux-arm64-gnu': 4.57.1 + '@rollup/rollup-linux-arm64-musl': 4.57.1 + '@rollup/rollup-linux-loong64-gnu': 4.57.1 + '@rollup/rollup-linux-loong64-musl': 4.57.1 + '@rollup/rollup-linux-ppc64-gnu': 4.57.1 + '@rollup/rollup-linux-ppc64-musl': 4.57.1 + '@rollup/rollup-linux-riscv64-gnu': 4.57.1 + '@rollup/rollup-linux-riscv64-musl': 4.57.1 + '@rollup/rollup-linux-s390x-gnu': 4.57.1 + '@rollup/rollup-linux-x64-gnu': 4.57.1 + '@rollup/rollup-linux-x64-musl': 4.57.1 + '@rollup/rollup-openbsd-x64': 4.57.1 + '@rollup/rollup-openharmony-arm64': 4.57.1 + '@rollup/rollup-win32-arm64-msvc': 4.57.1 + '@rollup/rollup-win32-ia32-msvc': 4.57.1 + '@rollup/rollup-win32-x64-gnu': 4.57.1 + '@rollup/rollup-win32-x64-msvc': 4.57.1 + fsevents: 2.3.3 + + roughjs@4.6.6: + dependencies: + hachure-fill: 0.5.2 + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + points-on-path: 0.2.1 + + router@2.2.0: + dependencies: + debug: 4.4.3 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.3.0 + transitivePeerDependencies: + - supports-color + + rpc-websockets@9.3.3: + dependencies: + '@swc/helpers': 0.5.18 + '@types/uuid': 8.3.4 + '@types/ws': 8.18.1 + buffer: 6.0.3 + eventemitter3: 5.0.1 + uuid: 8.3.2 + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 + + run-applescript@7.1.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rw@1.3.3: {} + + rxjs@7.8.1: + dependencies: + tslib: 2.8.1 + + sade@1.8.1: + dependencies: + mri: 1.2.0 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safe-stable-stringify@2.5.0: {} + + safer-buffer@2.1.2: {} + + scheduler@0.27.0: {} + + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + + secure-json-parse@2.7.0: {} + + secure-password-utilities@0.2.1: {} + + semver@6.3.1: {} + + semver@7.7.2: {} + + semver@7.7.3: {} + + send@0.19.2: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.1 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + send@1.2.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@1.16.3: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.2 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.1: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.1 + transitivePeerDependencies: + - supports-color + + set-blocking@2.0.0: {} + + set-cookie-parser@2.7.2: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + setprototypeof@1.2.0: {} + + sha.js@2.4.12: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + to-buffer: 1.2.2 + + shallowequal@1.1.0: {} + + sharp@0.34.5: + dependencies: + '@img/colour': 1.0.0 + detect-libc: 2.1.2 + semver: 7.7.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 + optional: true + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shiki@3.22.0: + dependencies: + '@shikijs/core': 3.22.0 + '@shikijs/engine-javascript': 3.22.0 + '@shikijs/engine-oniguruma': 3.22.0 + '@shikijs/langs': 3.22.0 + '@shikijs/themes': 3.22.0 + '@shikijs/types': 3.22.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + siginfo@2.0.0: {} + + signal-exit@4.1.0: {} + + simple-wcswidth@1.1.2: {} + + sisteransi@1.0.5: {} + + slow-redact@0.3.2: {} + + socket.io-client@4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3 + engine.io-client: 6.6.4(bufferutil@4.1.0)(utf-8-validate@5.0.10) + socket.io-parser: 4.2.5 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.5: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + sonic-boom@2.8.0: + dependencies: + atomic-sleep: 1.0.0 + + sonic-boom@3.8.1: + dependencies: + atomic-sleep: 1.0.0 + + sonic-boom@4.2.0: + dependencies: + atomic-sleep: 1.0.0 + + source-map-js@1.2.1: {} + + space-separated-tokens@1.1.5: {} + + space-separated-tokens@2.0.2: {} + + split-on-first@1.1.0: {} + + split2@4.2.0: {} + + sprintf-js@1.0.3: {} + + stable-hash-x@0.2.0: {} + + stable-hash@0.0.5: {} + + stack-trace@0.0.10: {} + + stackback@0.0.2: {} + + stacktrace-parser@0.1.11: + dependencies: + type-fest: 0.7.1 + + statuses@2.0.2: {} + + std-env@3.10.0: {} + + stdin-discarder@0.2.2: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + stream-chain@2.2.5: {} + + stream-json@1.9.1: + dependencies: + stream-chain: 2.2.5 + + stream-shift@1.0.3: {} + + streamdown@1.6.11(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(react@19.2.4): + dependencies: + clsx: 2.1.1 + hast: 1.0.0 + hast-util-to-jsx-runtime: 2.3.6 + html-url-attributes: 3.0.1 + katex: 0.16.28 + lucide-react: 0.542.0(react@19.2.4) + marked: 16.4.2 + mermaid: 11.12.2 + react: 19.2.4 + rehype-harden: 1.1.7 + rehype-katex: 7.0.1 + rehype-raw: 7.0.0 + rehype-sanitize: 6.0.0 + remark-cjk-friendly: 1.2.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5) + remark-cjk-friendly-gfm-strikethrough: 1.2.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5) + remark-gfm: 4.0.1 + remark-math: 6.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + remend: 1.0.1 + shiki: 3.22.0 + tailwind-merge: 3.4.0 + unified: 11.0.5 + unist-util-visit: 5.1.0 + transitivePeerDependencies: + - '@types/mdast' + - micromark + - micromark-util-types + - supports-color + + strict-uri-encode@2.0.0: {} + + string-hash@1.1.3: {} + + 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@8.1.1: + dependencies: + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + + string.prototype.includes@2.0.1: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.24.1 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strip-bom-string@1.0.0: {} + + strip-bom@3.0.0: {} + + strip-final-newline@4.0.0: {} + + strip-json-comments@3.1.1: {} + + style-to-js@1.1.21: + dependencies: + style-to-object: 1.0.14 + + style-to-object@0.4.4: + dependencies: + inline-style-parser: 0.1.1 + + style-to-object@1.0.14: + dependencies: + inline-style-parser: 0.2.7 + + styled-components@6.3.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + '@emotion/is-prop-valid': 1.4.0 + '@emotion/unitless': 0.10.0 + '@types/stylis': 4.2.7 + css-to-react-native: 3.2.0 + csstype: 3.2.3 + postcss: 8.4.49 + react: 19.2.4 + shallowequal: 1.1.0 + stylis: 4.3.6 + tslib: 2.8.1 + optionalDependencies: + react-dom: 19.2.4(react@19.2.4) + + styled-jsx@5.1.6(@babel/core@7.29.0)(react@19.2.4): + dependencies: + client-only: 0.0.1 + react: 19.2.4 + optionalDependencies: + '@babel/core': 7.29.0 + + stylis@4.3.6: {} + + superjson@2.2.6: + dependencies: + copy-anything: 4.0.5 + + superstruct@1.0.4: {} + + superstruct@2.0.2: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + swr@2.4.0(react@19.2.4): + dependencies: + dequal: 2.0.3 + react: 19.2.4 + use-sync-external-store: 1.6.0(react@19.2.4) + + tabbable@6.4.0: {} + + tailwind-merge@3.4.0: {} + + tailwindcss@4.1.18: {} + + tapable@2.3.0: {} + + tar@7.5.7: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + + text-encoding-utf-8@1.0.2: {} + + text-hex@1.0.0: {} + + thread-stream@0.15.2: + dependencies: + real-require: 0.1.0 + + thread-stream@3.1.0: + dependencies: + real-require: 0.2.0 + + throttleit@2.1.0: {} + + tinybench@2.9.0: {} + + tinycolor2@1.6.0: {} + + tinyexec@1.0.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinyrainbow@3.0.3: {} + + to-buffer@1.2.2: + dependencies: + isarray: 2.0.5 + safe-buffer: 5.2.1 + typed-array-buffer: 1.0.3 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + tr46@0.0.3: {} + + trim-lines@3.0.1: {} + + triple-beam@1.4.1: {} + + trough@2.2.0: {} + + ts-api-utils@2.4.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + ts-dedent@2.2.0: {} + + ts-deepmerge@7.0.3: {} + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@1.14.1: {} + + tslib@2.8.1: {} + + tsx@4.21.0: + dependencies: + esbuild: 0.27.2 + get-tsconfig: 4.13.1 + optionalDependencies: + fsevents: 2.3.3 + + turbo-darwin-64@2.8.1: + optional: true + + turbo-darwin-arm64@2.8.1: + optional: true + + turbo-linux-64@2.8.1: + optional: true + + turbo-linux-arm64@2.8.1: + optional: true + + turbo-windows-64@2.8.1: + optional: true + + turbo-windows-arm64@2.8.1: + optional: true + + turbo@2.8.1: + optionalDependencies: + turbo-darwin-64: 2.8.1 + turbo-darwin-arm64: 2.8.1 + turbo-linux-64: 2.8.1 + turbo-linux-arm64: 2.8.1 + turbo-windows-64: 2.8.1 + turbo-windows-arm64: 2.8.1 + + tw-animate-css@1.4.0: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.7.1: {} + + type-graphql@2.0.0-rc.1(class-validator@0.14.3)(graphql-scalars@1.25.0(graphql@16.12.0))(graphql@16.12.0): + dependencies: + '@graphql-yoga/subscription': 5.0.5 + '@types/node': 22.19.7 + '@types/semver': 7.7.1 + graphql: 16.12.0 + graphql-query-complexity: 0.12.0(graphql@16.12.0) + graphql-scalars: 1.25.0(graphql@16.12.0) + semver: 7.7.3 + tslib: 2.8.1 + optionalDependencies: + class-validator: 0.14.3 + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.2 + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typescript-eslint@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + typescript@5.9.3: {} + + ua-parser-js@1.0.41: {} + + ufo@1.6.3: {} + + uint8arrays@3.1.0: + dependencies: + multiformats: 9.9.0 + + uint8arrays@3.1.1: + dependencies: + multiformats: 9.9.0 + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + uncrypto@0.1.3: {} + + undici-types@5.26.5: {} + + undici-types@6.21.0: {} + + undici-types@7.20.0: {} + + unicorn-magic@0.3.0: {} + + unified@10.1.2: + dependencies: + '@types/unist': 2.0.11 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 5.3.7 + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-generated@2.0.1: {} + + unist-util-is@5.2.1: + dependencies: + '@types/unist': 2.0.11 + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@4.0.4: + dependencies: + '@types/unist': 2.0.11 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.1.0 + + unist-util-stringify-position@3.0.3: + dependencies: + '@types/unist': 2.0.11 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@5.1.3: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 5.2.1 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@4.1.2: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + unpipe@1.0.0: {} + + unrs-resolver@1.11.1: + dependencies: + napi-postinstall: 0.3.4 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.11.1 + '@unrs/resolver-binding-android-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-x64': 1.11.1 + '@unrs/resolver-binding-freebsd-x64': 1.11.1 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 + '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-musl': 1.11.1 + '@unrs/resolver-binding-wasm32-wasi': 1.11.1 + '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 + '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 + '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 + + unstorage@1.17.4(idb-keyval@6.2.2): + dependencies: + anymatch: 3.1.3 + chokidar: 5.0.0 + destr: 2.0.5 + h3: 1.15.5 + lru-cache: 11.2.5 + node-fetch-native: 1.6.7 + ofetch: 1.5.1 + ufo: 1.6.3 + optionalDependencies: + idb-keyval: 6.2.2 + + untruncate-json@0.0.1: {} + + update-browserslist-db@1.2.3(browserslist@4.28.1): + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + urlpattern-polyfill@10.1.0: {} + + urql@4.2.2(@urql/core@5.2.0(graphql@16.12.0))(react@19.2.4): + dependencies: + '@urql/core': 5.2.0(graphql@16.12.0) + react: 19.2.4 + wonka: 6.3.5 + + use-callback-ref@1.3.3(@types/react@19.2.10)(react@19.2.4): + dependencies: + react: 19.2.4 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.10 + + use-sidecar@1.1.3(@types/react@19.2.10)(react@19.2.4): + dependencies: + detect-node-es: 1.1.0 + react: 19.2.4 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.10 + + use-stick-to-bottom@1.1.2(react@19.2.4): + dependencies: + react: 19.2.4 + + use-sync-external-store@1.2.0(react@19.2.4): + dependencies: + react: 19.2.4 + + use-sync-external-store@1.4.0(react@19.2.4): + dependencies: + react: 19.2.4 + + use-sync-external-store@1.6.0(react@19.2.4): + dependencies: + react: 19.2.4 + + utf-8-validate@5.0.10: + dependencies: + node-gyp-build: 4.8.4 + + util-deprecate@1.0.2: {} + + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.1.2 + is-typed-array: 1.1.15 + which-typed-array: 1.1.20 + + utils-merge@1.0.1: {} + + uuid@10.0.0: {} + + uuid@11.1.0: {} + + uuid@13.0.0: {} + + uuid@8.3.2: {} + + uuid@9.0.1: {} + + uvu@0.5.6: + dependencies: + dequal: 2.0.3 + diff: 5.2.2 + kleur: 4.1.5 + sade: 1.8.1 + + validator@13.15.26: {} + + valtio@1.13.2(@types/react@19.2.10)(react@19.2.4): + dependencies: + derive-valtio: 0.1.0(valtio@1.13.2(@types/react@19.2.10)(react@19.2.4)) + proxy-compare: 2.6.0 + use-sync-external-store: 1.2.0(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + react: 19.2.4 + + valtio@2.1.7(@types/react@19.2.10)(react@19.2.4): + dependencies: + proxy-compare: 3.0.1 + optionalDependencies: + '@types/react': 19.2.10 + react: 19.2.4 + + vary@1.1.2: {} + + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@3.1.4: + dependencies: + '@types/unist': 2.0.11 + unist-util-stringify-position: 3.0.3 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@5.3.7: + dependencies: + '@types/unist': 2.0.11 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + viem@2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76): + dependencies: + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.9.3)(zod@3.25.76) + isows: 1.0.6(ws@8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ox: 0.6.7(typescript@5.9.3)(zod@3.25.76) + ws: 8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@2.36.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76): + dependencies: + '@noble/curves': 1.9.6 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.0.8(typescript@5.9.3)(zod@3.25.76) + isows: 1.0.7(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ox: 0.9.1(typescript@5.9.3)(zod@3.25.76) + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4): + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.9.3)(zod@3.22.4) + isows: 1.0.7(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ox: 0.11.3(typescript@5.9.3)(zod@3.22.4) + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76): + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) + isows: 1.0.7(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ox: 0.11.3(typescript@5.9.3)(zod@3.25.76) + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6): + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.9.3)(zod@4.3.6) + isows: 1.0.7(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ox: 0.11.3(typescript@5.9.3)(zod@4.3.6) + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + vite@7.3.1(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): + dependencies: + esbuild: 0.27.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.57.1 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 22.19.7 + fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.30.2 + tsx: 4.21.0 + yaml: 2.8.2 + + vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): + dependencies: + '@vitest/expect': 4.0.18 + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/pretty-format': 4.0.18 + '@vitest/runner': 4.0.18 + '@vitest/snapshot': 4.0.18 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 + es-module-lexer: 1.7.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 7.3.1(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + why-is-node-running: 2.3.0 + optionalDependencies: + '@opentelemetry/api': 1.9.0 + '@types/node': 22.19.7 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + + vscode-jsonrpc@8.2.0: {} + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-uri@3.0.8: {} + + wagmi@2.19.5(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76): + dependencies: + '@tanstack/react-query': 5.90.20(react@19.2.4) + '@wagmi/connectors': 6.2.0(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(@wagmi/core@2.22.1(@tanstack/query-core@5.90.20)(@types/react@19.2.10)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))(zod@3.25.76) + '@wagmi/core': 2.22.1(@tanstack/query-core@5.90.20)(@types/react@19.2.10)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + react: 19.2.4 + use-sync-external-store: 1.4.0(react@19.2.4) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@tanstack/query-core' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - debug + - encoding + - expo-auth-session + - expo-crypto + - expo-web-browser + - fastestsmallesttextencoderdecoder + - immer + - ioredis + - react-native + - supports-color + - uploadthing + - utf-8-validate + - zod + + wagmi@2.19.5(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6))(zod@3.25.76): + dependencies: + '@tanstack/react-query': 5.90.20(react@19.2.4) + '@wagmi/connectors': 6.2.0(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(@wagmi/core@2.22.1(@tanstack/query-core@5.90.20)(@types/react@19.2.10)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6)))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6))(wagmi@2.19.5(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6))(zod@3.25.76))(zod@4.3.6) + '@wagmi/core': 2.22.1(@tanstack/query-core@5.90.20)(@types/react@19.2.10)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6)) + react: 19.2.4 + use-sync-external-store: 1.4.0(react@19.2.4) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@tanstack/query-core' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - debug + - encoding + - expo-auth-session + - expo-crypto + - expo-web-browser + - fastestsmallesttextencoderdecoder + - immer + - ioredis + - react-native + - supports-color + - uploadthing + - utf-8-validate + - zod + + web-namespaces@2.0.1: {} + + web-streams-polyfill@4.0.0-beta.3: {} + + webauthn-p256@0.0.10: + dependencies: + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + + webextension-polyfill@0.10.0: {} + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.20 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-module@2.0.1: {} + + which-typed-array@1.1.20: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + winston-console-format@1.0.8: + dependencies: + colors: 1.4.0 + logform: 2.7.0 + triple-beam: 1.4.1 + + winston-transport@4.9.0: + dependencies: + logform: 2.7.0 + readable-stream: 3.6.2 + triple-beam: 1.4.1 + + winston@3.19.0: + dependencies: + '@colors/colors': 1.6.0 + '@dabh/diagnostics': 2.0.8 + async: 3.2.6 + is-stream: 2.0.1 + logform: 2.7.0 + one-time: 1.0.0 + readable-stream: 3.6.2 + safe-stable-stringify: 2.5.0 + stack-trace: 0.0.10 + triple-beam: 1.4.1 + winston-transport: 4.9.0 + + wonka@6.3.5: {} + + word-wrap@1.2.5: {} + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 + + ws@8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 + + ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 + + ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 + + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.0 + + x402@0.6.6(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)): + dependencies: + '@scure/base': 1.2.6 + '@solana-program/compute-budget': 0.8.0(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))) + '@solana-program/token': 0.5.1(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))) + '@solana-program/token-2022': 0.4.2(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)) + '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@solana/transaction-confirmation': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 2.19.5(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6))(zod@3.25.76) + zod: 3.25.76 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@solana/sysvars' + - '@tanstack/query-core' + - '@tanstack/react-query' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - debug + - encoding + - expo-auth-session + - expo-crypto + - expo-web-browser + - fastestsmallesttextencoderdecoder + - immer + - ioredis + - react + - react-native + - supports-color + - typescript + - uploadthing + - utf-8-validate + - ws + + x402@0.7.3(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10): + dependencies: + '@scure/base': 1.2.6 + '@solana-program/compute-budget': 0.11.0(@solana/kit@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@solana-program/token': 0.9.0(@solana/kit@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@solana-program/token-2022': 0.6.1(@solana/kit@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10))(@solana/sysvars@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)) + '@solana/kit': 5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/transaction-confirmation': 5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/wallet-standard-features': 1.3.0 + '@wallet-standard/app': 1.1.0 + '@wallet-standard/base': 1.1.0 + '@wallet-standard/features': 1.1.0 + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 2.19.5(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + zod: 3.25.76 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@solana/sysvars' + - '@tanstack/query-core' + - '@tanstack/react-query' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - debug + - encoding + - expo-auth-session + - expo-crypto + - expo-web-browser + - fastestsmallesttextencoderdecoder + - immer + - ioredis + - react + - react-native + - supports-color + - typescript + - uploadthing + - utf-8-validate + + xmlhttprequest-ssl@2.1.2: {} + + xtend@4.0.2: {} + + y18n@4.0.3: {} + + yallist@3.1.1: {} + + yallist@5.0.0: {} + + yaml@2.8.2: {} + + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yocto-queue@0.1.0: {} + + yoctocolors@2.1.2: {} + + zod-to-json-schema@3.25.1(zod@3.25.76): + dependencies: + zod: 3.25.76 + + zod-to-json-schema@3.25.1(zod@4.3.6): + dependencies: + zod: 4.3.6 + + zod-validation-error@4.0.2(zod@4.3.6): + dependencies: + zod: 4.3.6 + + zod@3.22.4: {} + + zod@3.25.76: {} + + zod@4.3.6: {} + + zustand@5.0.0(@types/react@19.2.10)(react@19.2.4)(use-sync-external-store@1.4.0(react@19.2.4)): + optionalDependencies: + '@types/react': 19.2.10 + react: 19.2.4 + use-sync-external-store: 1.4.0(react@19.2.4) + + zustand@5.0.11(@types/react@19.2.10)(react@19.2.4)(use-sync-external-store@1.4.0(react@19.2.4)): + optionalDependencies: + '@types/react': 19.2.10 + react: 19.2.4 + use-sync-external-store: 1.4.0(react@19.2.4) + + zustand@5.0.11(@types/react@19.2.10)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)): + optionalDependencies: + '@types/react': 19.2.10 + react: 19.2.4 + use-sync-external-store: 1.6.0(react@19.2.4) + + zustand@5.0.3(@types/react@19.2.10)(react@19.2.4)(use-sync-external-store@1.4.0(react@19.2.4)): + optionalDependencies: + '@types/react': 19.2.10 + react: 19.2.4 + use-sync-external-store: 1.4.0(react@19.2.4) + + zustand@5.0.3(@types/react@19.2.10)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)): + optionalDependencies: + '@types/react': 19.2.10 + react: 19.2.4 + use-sync-external-store: 1.6.0(react@19.2.4) + + zwitch@2.0.4: {} From 8e2cce71be6773fb6f24d44e4152d9ef6da525e7 Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Sun, 1 Feb 2026 22:50:28 -0500 Subject: [PATCH 02/70] chore(web-ag-ui): add traefik auth proxy --- typescript/clients/web-ag-ui/.gitignore | 3 ++ typescript/clients/web-ag-ui/auth/.gitkeep | 1 + typescript/clients/web-ag-ui/compose.yaml | 39 +++++++++++++++++++ typescript/clients/web-ag-ui/traefik/.gitkeep | 1 + 4 files changed, 44 insertions(+) create mode 100644 typescript/clients/web-ag-ui/auth/.gitkeep create mode 100644 typescript/clients/web-ag-ui/traefik/.gitkeep diff --git a/typescript/clients/web-ag-ui/.gitignore b/typescript/clients/web-ag-ui/.gitignore index daa690d0..af15ffd2 100644 --- a/typescript/clients/web-ag-ui/.gitignore +++ b/typescript/clients/web-ag-ui/.gitignore @@ -26,6 +26,8 @@ node_modules # misc .DS_Store *.pem +auth/users.htpasswd +traefik/acme.json # debug npm-debug.log* @@ -37,6 +39,7 @@ yarn-error.log* .env* !.env.example !.env.test.example +traefik.env # vercel .vercel diff --git a/typescript/clients/web-ag-ui/auth/.gitkeep b/typescript/clients/web-ag-ui/auth/.gitkeep new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/typescript/clients/web-ag-ui/auth/.gitkeep @@ -0,0 +1 @@ + diff --git a/typescript/clients/web-ag-ui/compose.yaml b/typescript/clients/web-ag-ui/compose.yaml index 3ef1b262..39391d54 100644 --- a/typescript/clients/web-ag-ui/compose.yaml +++ b/typescript/clients/web-ag-ui/compose.yaml @@ -1,4 +1,29 @@ services: + traefik: + image: traefik:v3.0 + command: + - --providers.docker=true + - --providers.docker.exposedbydefault=false + - --entrypoints.web.address=:80 + - --entrypoints.web.http.redirections.entrypoint.to=websecure + - --entrypoints.web.http.redirections.entrypoint.scheme=https + - --entrypoints.websecure.address=:443 + - --certificatesresolvers.cloudflare.acme.email=${ACME_EMAIL} + - --certificatesresolvers.cloudflare.acme.storage=/acme/acme.json + - --certificatesresolvers.cloudflare.acme.dnschallenge.provider=cloudflare + - --experimental.plugins.trauth.moduleName=github.com/leonjza/trauth + - --experimental.plugins.trauth.version=v1.6.7 + ports: + - "80:80" + - "443:443" + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./auth/users.htpasswd:/etc/traefik/users.htpasswd:ro + - ./traefik/acme.json:/acme/acme.json + env_file: + - traefik.env + restart: unless-stopped + web: build: context: . @@ -13,6 +38,20 @@ services: LANGGRAPH_GMX_ALLORA_DEPLOYMENT_URL: http://agent-gmx-allora:8126 env_file: - apps/web/.env + labels: + - traefik.enable=true + - traefik.http.routers.demo.rule=Host(`demo.emberai.xyz`) + - traefik.http.routers.demo.entrypoints=websecure + - traefik.http.routers.demo.tls=true + - traefik.http.routers.demo.tls.certresolver=cloudflare + - traefik.http.routers.demo.middlewares=site-auth@docker + - traefik.http.services.demo.loadbalancer.server.port=3000 + - traefik.http.middlewares.site-auth.plugin.trauth.domain=demo.emberai.xyz + - traefik.http.middlewares.site-auth.plugin.trauth.usersfile=/etc/traefik/users.htpasswd + - traefik.http.middlewares.site-auth.plugin.trauth.cookiekey=LrHdvWlGPwCrzgB6fXpLBH3u1uwb9b3x + - traefik.http.middlewares.site-auth.plugin.trauth.cookiename=trauth + - traefik.http.middlewares.site-auth.plugin.trauth.cookiesecure=true + - traefik.http.middlewares.site-auth.plugin.trauth.cookiehttponly=true ports: - "3000:3000" restart: unless-stopped diff --git a/typescript/clients/web-ag-ui/traefik/.gitkeep b/typescript/clients/web-ag-ui/traefik/.gitkeep new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/typescript/clients/web-ag-ui/traefik/.gitkeep @@ -0,0 +1 @@ + From d0aad079497c978082fba863688dc3564268ffad Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Sun, 1 Feb 2026 22:53:19 -0500 Subject: [PATCH 03/70] chore(web-ag-ui): move trauth key to env --- typescript/clients/web-ag-ui/compose.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typescript/clients/web-ag-ui/compose.yaml b/typescript/clients/web-ag-ui/compose.yaml index 39391d54..e83e080a 100644 --- a/typescript/clients/web-ag-ui/compose.yaml +++ b/typescript/clients/web-ag-ui/compose.yaml @@ -48,7 +48,7 @@ services: - traefik.http.services.demo.loadbalancer.server.port=3000 - traefik.http.middlewares.site-auth.plugin.trauth.domain=demo.emberai.xyz - traefik.http.middlewares.site-auth.plugin.trauth.usersfile=/etc/traefik/users.htpasswd - - traefik.http.middlewares.site-auth.plugin.trauth.cookiekey=LrHdvWlGPwCrzgB6fXpLBH3u1uwb9b3x + - traefik.http.middlewares.site-auth.plugin.trauth.cookiekey=${TRAUTH_COOKIE_KEY} - traefik.http.middlewares.site-auth.plugin.trauth.cookiename=trauth - traefik.http.middlewares.site-auth.plugin.trauth.cookiesecure=true - traefik.http.middlewares.site-auth.plugin.trauth.cookiehttponly=true From 9a0a0a6b295c14a128d55adc1d5511641af0e44e Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Sun, 1 Feb 2026 23:01:48 -0500 Subject: [PATCH 04/70] chore(web-ag-ui): add traefik env example --- typescript/clients/web-ag-ui/traefik.env.example | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 typescript/clients/web-ag-ui/traefik.env.example diff --git a/typescript/clients/web-ag-ui/traefik.env.example b/typescript/clients/web-ag-ui/traefik.env.example new file mode 100644 index 00000000..b5ad8170 --- /dev/null +++ b/typescript/clients/web-ag-ui/traefik.env.example @@ -0,0 +1,3 @@ +ACME_EMAIL=hello@emberai.xyz +CF_DNS_API_TOKEN=replace-with-cloudflare-api-token +TRAUTH_COOKIE_KEY=replace-with-32-char-cookie-key From a39a340856fa0a529bf2a9de6bc60a3c56812c8c Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Sun, 1 Feb 2026 23:41:21 -0500 Subject: [PATCH 05/70] feat(web): gate threads by privy wallet --- .../apps/web/src/app/api/agents/sync/route.ts | 6 ++-- .../web-ag-ui/apps/web/src/app/layout.tsx | 2 ++ .../src/components/AgentRuntimeProvider.tsx | 10 +++++-- .../apps/web/src/components/AppSidebar.tsx | 4 +-- .../web/src/components/PrivyGateBanner.tsx | 30 +++++++++++++++++++ .../web/src/contexts/AgentListContext.tsx | 28 +++++++++++++++-- .../apps/web/src/utils/agentThread.ts | 11 +++++-- 7 files changed, 78 insertions(+), 13 deletions(-) create mode 100644 typescript/clients/web-ag-ui/apps/web/src/components/PrivyGateBanner.tsx diff --git a/typescript/clients/web-ag-ui/apps/web/src/app/api/agents/sync/route.ts b/typescript/clients/web-ag-ui/apps/web/src/app/api/agents/sync/route.ts index 08f00eda..d77ef574 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/app/api/agents/sync/route.ts +++ b/typescript/clients/web-ag-ui/apps/web/src/app/api/agents/sync/route.ts @@ -2,11 +2,9 @@ import { NextRequest, NextResponse } from 'next/server'; import { v7 as uuidv7 } from 'uuid'; import { z } from 'zod'; -import { getAgentThreadId } from '@/utils/agentThread'; - const BodySchema = z.object({ agentId: z.string().min(1), - threadId: z.string().optional(), + threadId: z.string().min(1), }); const RunResponseSchema = z @@ -224,7 +222,7 @@ export async function POST(request: NextRequest): Promise { } const baseUrl = normalizeBaseUrl(runtime.deploymentUrl); - const threadId = parsed.data.threadId ?? getAgentThreadId(parsed.data.agentId); + const threadId = parsed.data.threadId; try { await ensureThread(baseUrl, threadId, runtime.graphId); diff --git a/typescript/clients/web-ag-ui/apps/web/src/app/layout.tsx b/typescript/clients/web-ag-ui/apps/web/src/app/layout.tsx index 43c3c898..6dab5c56 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/app/layout.tsx +++ b/typescript/clients/web-ag-ui/apps/web/src/app/layout.tsx @@ -4,6 +4,7 @@ import type { CopilotKitCSSProperties } from '@copilotkit/react-ui'; import { ProvidersNoSSR } from '../components/ProvidersNoSSR'; import { AppSidebarNoSSR } from '../components/AppSidebarNoSSR'; import { AgentRuntimeProvider } from '../components/AgentRuntimeProvider'; +import { PrivyGateBanner } from '../components/PrivyGateBanner'; import './globals.css'; import '@copilotkit/react-ui/styles.css'; @@ -31,6 +32,7 @@ export default function RootLayout({ +
{ const pathAgentId = resolveAgentIdFromPath(pathname); @@ -110,10 +112,14 @@ export function AgentRuntimeProvider({ children }: { children: ReactNode }) { return {children}; } - const threadId = getAgentThreadId(agentId); + const threadId = getAgentThreadId(agentId, privyWallet?.address); + + if (!threadId) { + return {children}; + } return ( - + {children} diff --git a/typescript/clients/web-ag-ui/apps/web/src/components/AppSidebar.tsx b/typescript/clients/web-ag-ui/apps/web/src/components/AppSidebar.tsx index 9aa78042..2523bc04 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/components/AppSidebar.tsx +++ b/typescript/clients/web-ag-ui/apps/web/src/components/AppSidebar.tsx @@ -398,7 +398,7 @@ export function AppSidebar() {
{/* Build Agent Button */} - @@ -520,7 +520,7 @@ export function AppSidebar() { type="button" onClick={() => login()} disabled={!ready || (ready && authenticated)} - className="w-full flex items-center justify-center px-4 py-2.5 rounded-lg bg-[#252525] hover:bg-[#2a2a2a] text-white font-medium transition-colors disabled:opacity-60 disabled:hover:bg-[#252525]" + className="w-full flex items-center justify-center px-4 py-2.5 rounded-lg bg-[#fd6731] hover:bg-[#e55a28] text-white font-medium transition-colors disabled:opacity-60 disabled:hover:bg-[#fd6731]" > {ready ? 'Login / Connect' : 'Loading...'} diff --git a/typescript/clients/web-ag-ui/apps/web/src/components/PrivyGateBanner.tsx b/typescript/clients/web-ag-ui/apps/web/src/components/PrivyGateBanner.tsx new file mode 100644 index 00000000..d4c5c76f --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/web/src/components/PrivyGateBanner.tsx @@ -0,0 +1,30 @@ +'use client'; + +import { AlertCircle } from 'lucide-react'; +import { usePrivy } from '@privy-io/react-auth'; +import { useLogin } from '@privy-io/react-auth'; +import { usePrivyWalletClient } from '@/hooks/usePrivyWalletClient'; + +export function PrivyGateBanner() { + const { authenticated } = usePrivy(); + const { login } = useLogin(); + const { privyWallet } = usePrivyWalletClient(); + const needsSignIn = !authenticated || !privyWallet?.address; + + if (!needsSignIn) { + return null; + } + + return ( +
+ +
+ ); +} diff --git a/typescript/clients/web-ag-ui/apps/web/src/contexts/AgentListContext.tsx b/typescript/clients/web-ag-ui/apps/web/src/contexts/AgentListContext.tsx index f020fa30..f76df1b8 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/contexts/AgentListContext.tsx +++ b/typescript/clients/web-ag-ui/apps/web/src/contexts/AgentListContext.tsx @@ -6,6 +6,7 @@ import { usePathname } from 'next/navigation'; import { z } from 'zod'; import { getAllAgents, isRegisteredAgentId } from '../config/agents'; +import { usePrivyWalletClient } from '../hooks/usePrivyWalletClient'; import { getAgentThreadId } from '../utils/agentThread'; import type { AgentViewMetrics, AgentViewProfile, TaskState } from '../types/agent'; @@ -65,11 +66,14 @@ export function AgentListProvider({ children }: { children: ReactNode }) { const agentIds = useMemo(() => getAllAgents().map((agent) => agent.id), []); const pathname = usePathname(); const activeAgentId = useMemo(() => resolveAgentIdFromPath(pathname), [pathname]); + const { privyWallet } = usePrivyWalletClient(); + const privyAddress = privyWallet?.address ?? null; const [agents, setAgents] = useState>(() => buildInitialState(agentIds), ); const startedRef = useRef(false); const inFlightRef = useRef>(new Set()); + const lastPrivyAddressRef = useRef(null); const agentsRef = useRef>(agents); const upsertAgent = useCallback((agentId: string, update: Partial) => { @@ -86,6 +90,17 @@ export function AgentListProvider({ children }: { children: ReactNode }) { agentsRef.current = agents; }, [agents]); + useEffect(() => { + const normalized = privyAddress?.toLowerCase() ?? null; + if (normalized === lastPrivyAddressRef.current) { + return; + } + lastPrivyAddressRef.current = normalized; + startedRef.current = false; + inFlightRef.current = new Set(); + setAgents(buildInitialState(agentIds)); + }, [agentIds, privyAddress]); + const syncAgent = useCallback( async (agentId: string, options?: { force?: boolean }) => { const force = options?.force ?? false; @@ -97,7 +112,11 @@ export function AgentListProvider({ children }: { children: ReactNode }) { } inFlightRef.current.add(agentId); - const threadId = getAgentThreadId(agentId); + const threadId = getAgentThreadId(agentId, privyAddress); + if (!threadId) { + inFlightRef.current.delete(agentId); + return; + } try { const response = await fetch('/api/agents/sync', { @@ -137,18 +156,21 @@ export function AgentListProvider({ children }: { children: ReactNode }) { inFlightRef.current.delete(agentId); } }, - [upsertAgent], + [privyAddress, upsertAgent], ); useEffect(() => { if (startedRef.current) { return; } + if (!privyAddress) { + return; + } startedRef.current = true; agentIds.forEach((agentId) => { void syncAgent(agentId); }); - }, [agentIds, syncAgent]); + }, [agentIds, privyAddress, syncAgent]); useEffect(() => { const rawInterval = Number(process.env.NEXT_PUBLIC_AGENT_LIST_SYNC_POLL_MS ?? 15000); diff --git a/typescript/clients/web-ag-ui/apps/web/src/utils/agentThread.ts b/typescript/clients/web-ag-ui/apps/web/src/utils/agentThread.ts index 5ff14ca9..7c09d54d 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/utils/agentThread.ts +++ b/typescript/clients/web-ag-ui/apps/web/src/utils/agentThread.ts @@ -1,5 +1,12 @@ import { v5 as uuidv5 } from 'uuid'; -export function getAgentThreadId(agentId: string): string { - return uuidv5(`copilotkit:${agentId}`, uuidv5.URL); +export function getAgentThreadId(agentId: string, privyAddress?: string | null): string | null { + if (!privyAddress) { + return null; + } + const normalized = privyAddress.trim().toLowerCase(); + if (!normalized) { + return null; + } + return uuidv5(`copilotkit:${agentId}:${normalized}`, uuidv5.URL); } From e3c3796f881e8bd02d88b40af2eb175f6b8ba74c Mon Sep 17 00:00:00 2001 From: Sebas Date: Wed, 4 Feb 2026 20:16:18 -0800 Subject: [PATCH 06/70] fix(agent-gmx-allora): wire allora and onchain-actions clients --- .../agent-gmx-allora/src/clients/allora.ts | 116 ++++++++ .../src/clients/allora.unit.test.ts | 53 ++++ .../src/clients/onchainActions.ts | 274 ++++++++++++++++++ .../src/clients/onchainActions.unit.test.ts | 166 +++++++++++ .../agent-gmx-allora/src/config/constants.ts | 69 +++++ 5 files changed, 678 insertions(+) create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/allora.ts create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/allora.unit.test.ts create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.ts create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.unit.test.ts diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/allora.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/allora.ts new file mode 100644 index 00000000..389e7dba --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/allora.ts @@ -0,0 +1,116 @@ +import { z } from 'zod'; + +type RawInference = { + network_inferences: { + topic_id: string | number; + combined_value: string; + }; + confidence_interval_values: string[]; +}; + +const RawInferenceSchema = z.object({ + network_inferences: z.object({ + topic_id: z.union([z.string(), z.number()]), + combined_value: z.string(), + }), + confidence_interval_values: z.array(z.string()), +}); + +type ConsumerInferencePayload = { + request_id?: string; + status?: boolean; + data?: { + inference_data?: { + network_inference_normalized?: string; + network_inference?: string; + topic_id?: string | number; + }; + }; +}; + +const ConsumerInferenceSchema = z.object({ + request_id: z.string().optional(), + status: z.boolean().optional(), + data: z + .object({ + inference_data: z + .object({ + network_inference_normalized: z.string().optional(), + network_inference: z.string().optional(), + topic_id: z.union([z.string(), z.number()]).optional(), + }) + .optional(), + }) + .optional(), +}); + +export type AlloraInference = { + topicId: number; + combinedValue: number; + confidenceIntervalValues: number[]; +}; + +function parseFiniteNumber(value: string | number, label: string): number { + const parsed = typeof value === 'number' ? value : Number(value); + if (!Number.isFinite(parsed)) { + throw new Error(`Invalid ${label}: ${value}`); + } + return parsed; +} + +export function parseAlloraInferenceResponse(payload: unknown): AlloraInference { + const rawParse = RawInferenceSchema.safeParse(payload); + if (rawParse.success) { + const parsed: RawInference = rawParse.data; + const topicId = parseFiniteNumber(parsed.network_inferences.topic_id, 'topic_id'); + const combinedValue = parseFiniteNumber(parsed.network_inferences.combined_value, 'combined_value'); + const confidenceIntervalValues = parsed.confidence_interval_values.map((value) => + parseFiniteNumber(value, 'confidence_interval_values'), + ); + + return { + topicId, + combinedValue, + confidenceIntervalValues, + }; + } + + const consumerParsed: ConsumerInferencePayload = ConsumerInferenceSchema.parse(payload); + const inference = consumerParsed.data?.inference_data; + if (!inference?.network_inference_normalized && !inference?.network_inference) { + throw new Error('Allora inference payload missing network_inference'); + } + + const combinedValue = parseFiniteNumber( + inference.network_inference_normalized ?? inference.network_inference ?? '', + 'combined_value', + ); + const topicId = parseFiniteNumber(inference.topic_id ?? '', 'topic_id'); + return { + topicId, + combinedValue, + confidenceIntervalValues: [combinedValue], + }; +} + +export async function fetchAlloraInference(params: { + baseUrl: string; + chainId: string; + topicId: number; + apiKey?: string; +}): Promise { + const base = params.baseUrl.replace(/\/$/u, ''); + const query = new URLSearchParams({ allora_topic_id: params.topicId.toString() }); + const url = `${base}/v2/allora/consumer/${params.chainId}?${query.toString()}`; + const response = await fetch(url, { + headers: params.apiKey ? { 'x-api-key': params.apiKey } : undefined, + }); + + const bodyText = await response.text(); + if (!response.ok) { + throw new Error(`Allora API request failed (${response.status}): ${bodyText}`); + } + + const payload = bodyText.trim().length > 0 ? (JSON.parse(bodyText) as unknown) : {}; + return parseAlloraInferenceResponse(payload); +} diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/allora.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/allora.unit.test.ts new file mode 100644 index 00000000..010a9b19 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/allora.unit.test.ts @@ -0,0 +1,53 @@ +import { describe, expect, it } from 'vitest'; + +import { parseAlloraInferenceResponse } from './allora.js'; + +describe('parseAlloraInferenceResponse', () => { + it('parses combined value and confidence intervals into numbers', () => { + const payload = { + network_inferences: { + topic_id: '14', + combined_value: '2605.5338791850806', + }, + confidence_interval_values: [ + '2492.1675618299669', + '2543.9249467952655', + '2611.0331303511152', + '2662.2952339563844', + '2682.827040221238', + ], + }; + + expect(parseAlloraInferenceResponse(payload)).toEqual({ + topicId: 14, + combinedValue: Number('2605.5338791850806'), + confidenceIntervalValues: [ + Number('2492.1675618299669'), + Number('2543.9249467952655'), + Number('2611.0331303511152'), + Number('2662.2952339563844'), + Number('2682.827040221238'), + ], + }); + }); + + it('parses consumer inference payloads', () => { + const payload = { + request_id: 'abc', + status: true, + data: { + inference_data: { + network_inference: '71380522596524715399145', + network_inference_normalized: '71380.522596524715399145', + topic_id: '14', + }, + }, + }; + + expect(parseAlloraInferenceResponse(payload)).toEqual({ + topicId: 14, + combinedValue: Number('71380.522596524715399145'), + confidenceIntervalValues: [Number('71380.522596524715399145')], + }); + }); +}); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.ts new file mode 100644 index 00000000..f31d0423 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.ts @@ -0,0 +1,274 @@ +import { z } from 'zod'; + +const HTTP_TIMEOUT_MS = 60_000; + +const PaginationSchema = z.object({ + cursor: z.string().nullable(), + currentPage: z.number().int(), + totalPages: z.number().int(), + totalItems: z.number().int(), +}); + +type TokenIdentifier = { + chainId: string; + address: string; +}; + +const TokenIdentifierSchema = z.object({ + chainId: z.string(), + address: z.string(), +}); + +const TokenSchema = z.object({ + tokenUid: TokenIdentifierSchema, + name: z.string(), + symbol: z.string(), + isNative: z.boolean(), + decimals: z.number().int(), + iconUri: z.string().nullish(), + isVetted: z.boolean(), +}); + +const normalizeTokenInput = (value: unknown): unknown => { + if (!value || typeof value !== 'object') { + return value; + } + const record = value as Record; + if (record['iconUri'] === null) { + return { ...record, iconUri: undefined }; + } + return record; +}; + +const TokenSchemaBridge: z.ZodType> = z + .unknown() + .transform((value) => normalizeTokenInput(value)) + .superRefine((value, ctx) => { + const result = TokenSchema.safeParse(value); + if (!result.success) { + ctx.addIssue({ code: z.ZodIssueCode.custom, message: result.error.message }); + } + }) + .transform((value) => TokenSchema.parse(value)); + +const PerpetualMarketSchema = z.object({ + marketToken: TokenIdentifierSchema, + longFundingFee: z.string(), + shortFundingFee: z.string(), + longBorrowingFee: z.string(), + shortBorrowingFee: z.string(), + chainId: z.string(), + name: z.string(), + indexToken: TokenSchemaBridge, + longToken: TokenSchemaBridge, + shortToken: TokenSchemaBridge, +}); +export type PerpetualMarket = z.infer; + +const PerpetualMarketsResponseSchema = PaginationSchema.extend({ + markets: z.array(PerpetualMarketSchema), +}); + +const PerpetualPositionSchema = z.object({ + chainId: z.string(), + key: z.string(), + contractKey: z.string(), + account: z.string(), + marketAddress: z.string(), + sizeInUsd: z.string(), + sizeInTokens: z.string(), + collateralAmount: z.string(), + pendingBorrowingFeesUsd: z.string(), + increasedAtTime: z.string(), + decreasedAtTime: z.string(), + positionSide: z.enum(['long', 'short']), + isLong: z.boolean(), + fundingFeeAmount: z.string(), + claimableLongTokenAmount: z.string(), + claimableShortTokenAmount: z.string(), + isOpening: z.boolean().optional(), + pnl: z.string(), + positionFeeAmount: z.string(), + traderDiscountAmount: z.string(), + uiFeeAmount: z.string(), + data: z.string().optional(), + collateralToken: TokenSchemaBridge, +}); +export type PerpetualPosition = z.infer; + +const PerpetualPositionsResponseSchema = PaginationSchema.extend({ + positions: z.array(PerpetualPositionSchema), +}); + +const PerpetualActionResponseSchema = z.object({}).catchall(z.unknown()); +export type PerpetualActionResponse = z.infer; + +export class OnchainActionsRequestError extends Error { + readonly status: number; + readonly url: string; + readonly bodyText: string; + + constructor(params: { message: string; status: number; url: string; bodyText: string }) { + super(params.message); + this.name = 'OnchainActionsRequestError'; + this.status = params.status; + this.url = params.url; + this.bodyText = params.bodyText; + } +} + +export type PerpetualLongRequest = { + amount: bigint; + walletAddress: `0x${string}`; + chainId: string; + marketAddress: string; + payTokenAddress: string; + collateralTokenAddress: string; + leverage: string; + referralCode?: string; + limitPrice?: string; +}; + +export type PerpetualShortRequest = PerpetualLongRequest; + +export type PerpetualCloseRequest = { + walletAddress: `0x${string}`; + marketAddress: string; + positionSide?: 'long' | 'short'; + isLimit?: boolean; +}; + +export class OnchainActionsClient { + constructor(private readonly baseUrl: string) {} + + private buildQuery(params: Record): URLSearchParams { + const query = new URLSearchParams(); + for (const [key, value] of Object.entries(params)) { + if (!value) { + continue; + } + if (Array.isArray(value)) { + for (const item of value) { + query.append(key, item); + } + continue; + } + query.set(key, value); + } + return query; + } + + private async fetchEndpoint( + endpoint: string, + schema: z.ZodType, + init?: RequestInit, + ): Promise { + const url = `${this.baseUrl}${endpoint}`; + const response = await fetch(url, { + ...init, + signal: init?.signal ?? AbortSignal.timeout(HTTP_TIMEOUT_MS), + headers: { + 'Content-Type': 'application/json', + ...(init?.headers ?? {}), + }, + }); + + if (!response.ok) { + const text = await response.text().catch(() => 'No error body'); + throw new OnchainActionsRequestError({ + message: `Onchain actions request failed (${response.status}): ${text}`, + status: response.status, + url, + bodyText: text, + }); + } + + return schema.parse(await response.json()); + } + + async listPerpetualMarkets(params?: { chainIds?: string[] }): Promise { + const baseQuery = this.buildQuery({ + chainIds: params?.chainIds, + }); + const endpoint = baseQuery.toString() + ? `/perpetuals/markets?${baseQuery.toString()}` + : '/perpetuals/markets'; + const firstPage = await this.fetchEndpoint(endpoint, PerpetualMarketsResponseSchema); + const markets = [...firstPage.markets]; + const cursor = firstPage.cursor ?? undefined; + if (!cursor || firstPage.totalPages <= 1) { + return markets; + } + + for (let page = 2; page <= firstPage.totalPages; page += 1) { + const query = this.buildQuery({ + chainIds: params?.chainIds, + cursor, + page: page.toString(), + }); + const pageEndpoint = `/perpetuals/markets?${query.toString()}`; + const data = await this.fetchEndpoint(pageEndpoint, PerpetualMarketsResponseSchema); + markets.push(...data.markets); + } + return markets; + } + + async listPerpetualPositions(params: { + walletAddress: `0x${string}`; + chainIds?: string[]; + }): Promise { + const baseQuery = this.buildQuery({ + chainIds: params.chainIds, + }); + const endpoint = baseQuery.toString() + ? `/perpetuals/positions/${params.walletAddress}?${baseQuery.toString()}` + : `/perpetuals/positions/${params.walletAddress}`; + const firstPage = await this.fetchEndpoint(endpoint, PerpetualPositionsResponseSchema); + const positions = [...firstPage.positions]; + const cursor = firstPage.cursor ?? undefined; + if (!cursor || firstPage.totalPages <= 1) { + return positions; + } + + for (let page = 2; page <= firstPage.totalPages; page += 1) { + const query = this.buildQuery({ + chainIds: params.chainIds, + cursor, + page: page.toString(), + }); + const pageEndpoint = `/perpetuals/positions/${params.walletAddress}?${query.toString()}`; + const data = await this.fetchEndpoint(pageEndpoint, PerpetualPositionsResponseSchema); + positions.push(...data.positions); + } + return positions; + } + + private stringifyPayload(value: unknown): string { + return JSON.stringify(value, (_key: string, item: unknown): unknown => + typeof item === 'bigint' ? item.toString() : item, + ); + } + + async createPerpetualLong(request: PerpetualLongRequest): Promise { + return this.fetchEndpoint('/perpetuals/long', PerpetualActionResponseSchema, { + method: 'POST', + body: this.stringifyPayload(request), + }); + } + + async createPerpetualShort(request: PerpetualShortRequest): Promise { + return this.fetchEndpoint('/perpetuals/short', PerpetualActionResponseSchema, { + method: 'POST', + body: this.stringifyPayload(request), + }); + } + + async createPerpetualClose(request: PerpetualCloseRequest): Promise { + return this.fetchEndpoint('/perpetuals/close', PerpetualActionResponseSchema, { + method: 'POST', + body: this.stringifyPayload(request), + }); + } +} + +export type { TokenIdentifier }; diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.unit.test.ts new file mode 100644 index 00000000..ded8ac9e --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.unit.test.ts @@ -0,0 +1,166 @@ +import { afterEach, describe, expect, it, vi } from 'vitest'; + +import { OnchainActionsClient } from './onchainActions.js'; + +describe('OnchainActionsClient', () => { + afterEach(() => { + vi.unstubAllGlobals(); + }); + + it('lists perpetual markets across paginated responses', async () => { + const fetchMock = vi + .fn() + .mockResolvedValueOnce( + new Response( + JSON.stringify({ + markets: [ + { + marketToken: { chainId: '42161', address: '0xmarket1' }, + longFundingFee: '0.01', + shortFundingFee: '0.02', + longBorrowingFee: '0.03', + shortBorrowingFee: '0.04', + chainId: '42161', + name: 'GMX BTC/USD', + indexToken: { + tokenUid: { chainId: '42161', address: '0xbtc' }, + name: 'Bitcoin', + symbol: 'BTC', + isNative: false, + decimals: 8, + iconUri: null, + isVetted: true, + }, + longToken: { + tokenUid: { chainId: '42161', address: '0xusdc' }, + name: 'USD Coin', + symbol: 'USDC', + isNative: false, + decimals: 6, + iconUri: null, + isVetted: true, + }, + shortToken: { + tokenUid: { chainId: '42161', address: '0xusdc' }, + name: 'USD Coin', + symbol: 'USDC', + isNative: false, + decimals: 6, + iconUri: null, + isVetted: true, + }, + }, + ], + cursor: 'next', + currentPage: 1, + totalPages: 2, + totalItems: 2, + }), + { status: 200, headers: { 'Content-Type': 'application/json' } }, + ), + ) + .mockResolvedValueOnce( + new Response( + JSON.stringify({ + markets: [ + { + marketToken: { chainId: '42161', address: '0xmarket2' }, + longFundingFee: '0.01', + shortFundingFee: '0.02', + longBorrowingFee: '0.03', + shortBorrowingFee: '0.04', + chainId: '42161', + name: 'GMX ETH/USD', + indexToken: { + tokenUid: { chainId: '42161', address: '0xeth' }, + name: 'Ether', + symbol: 'ETH', + isNative: false, + decimals: 18, + iconUri: null, + isVetted: true, + }, + longToken: { + tokenUid: { chainId: '42161', address: '0xusdc' }, + name: 'USD Coin', + symbol: 'USDC', + isNative: false, + decimals: 6, + iconUri: null, + isVetted: true, + }, + shortToken: { + tokenUid: { chainId: '42161', address: '0xusdc' }, + name: 'USD Coin', + symbol: 'USDC', + isNative: false, + decimals: 6, + iconUri: null, + isVetted: true, + }, + }, + ], + cursor: 'next', + currentPage: 2, + totalPages: 2, + totalItems: 2, + }), + { status: 200, headers: { 'Content-Type': 'application/json' } }, + ), + ); + + vi.stubGlobal('fetch', fetchMock); + + const client = new OnchainActionsClient('https://api.example.test'); + const markets = await client.listPerpetualMarkets({ chainIds: ['42161'] }); + + expect(markets).toHaveLength(2); + expect(markets[0]?.name).toBe('GMX BTC/USD'); + expect(markets[1]?.name).toBe('GMX ETH/USD'); + }); + + it('posts perpetual long requests', async () => { + const fetchMock = vi.fn(() => + new Response(JSON.stringify({ ok: true }), { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }), + ); + vi.stubGlobal('fetch', fetchMock); + + const client = new OnchainActionsClient('https://api.example.test'); + await client.createPerpetualLong({ + amount: 100n, + walletAddress: '0x0000000000000000000000000000000000000001', + chainId: '42161', + marketAddress: '0xmarket', + payTokenAddress: '0xusdc', + collateralTokenAddress: '0xusdc', + leverage: '2', + }); + + const requestInit = fetchMock.mock.calls[0]?.[1] as RequestInit | undefined; + expect(requestInit?.method).toBe('POST'); + }); + + it('posts perpetual close requests', async () => { + const fetchMock = vi.fn(() => + new Response(JSON.stringify({ ok: true }), { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }), + ); + vi.stubGlobal('fetch', fetchMock); + + const client = new OnchainActionsClient('https://api.example.test'); + await client.createPerpetualClose({ + walletAddress: '0x0000000000000000000000000000000000000001', + marketAddress: '0xmarket', + positionSide: 'long', + isLimit: false, + }); + + const requestInit = fetchMock.mock.calls[0]?.[1] as RequestInit | undefined; + expect(requestInit?.method).toBe('POST'); + }); +}); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts index 6ed826d1..a98d6a83 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts @@ -1,5 +1,74 @@ export const ARBITRUM_CHAIN_ID = 42161; +const DEFAULT_ONCHAIN_ACTIONS_BASE_URL = 'https://api.emberai.xyz'; +const DEFAULT_ALLORA_API_BASE_URL = 'https://api.allora.network'; +const DEFAULT_ALLORA_CHAIN_ID = 'allora-mainnet-1'; + +type OnchainActionsBaseUrlLogger = (message: string, metadata?: Record) => void; + +type OnchainActionsBaseUrlOptions = { + endpoint?: string; + logger?: OnchainActionsBaseUrlLogger; +}; + +export function resolveOnchainActionsBaseUrl(options?: OnchainActionsBaseUrlOptions): string { + const envBaseUrl = process.env['ONCHAIN_ACTIONS_BASE_URL']; + const envOpenApiUrl = process.env['ONCHAIN_ACTIONS_OPENAPI_URL']; + const rawEndpoint = + options?.endpoint ?? envBaseUrl ?? envOpenApiUrl ?? DEFAULT_ONCHAIN_ACTIONS_BASE_URL; + + const source = options?.endpoint + ? 'override' + : envBaseUrl + ? 'ONCHAIN_ACTIONS_BASE_URL' + : envOpenApiUrl + ? 'ONCHAIN_ACTIONS_OPENAPI_URL' + : 'default'; + + const endpoint = rawEndpoint.replace(/\/$/u, ''); + const isOpenApi = endpoint.endsWith('/openapi.json'); + const baseUrl = isOpenApi ? endpoint.replace(/\/openapi\.json$/u, '') : endpoint; + + if (options?.logger && source !== 'default') { + if (isOpenApi) { + options.logger('Normalized onchain-actions endpoint from OpenAPI spec URL', { + endpoint, + baseUrl, + source, + }); + } else if (baseUrl !== DEFAULT_ONCHAIN_ACTIONS_BASE_URL) { + options.logger('Using custom onchain-actions base URL', { baseUrl, source }); + } + } + + return baseUrl; +} + +export const ONCHAIN_ACTIONS_BASE_URL = resolveOnchainActionsBaseUrl(); + +export function resolveAlloraApiBaseUrl(): string { + return process.env['ALLORA_API_BASE_URL']?.replace(/\/$/u, '') ?? DEFAULT_ALLORA_API_BASE_URL; +} + +export function resolveAlloraApiKey(): string | undefined { + return process.env['ALLORA_API_KEY']; +} + +export function resolveAlloraChainId(): string { + return process.env['ALLORA_CHAIN_ID']?.trim() || DEFAULT_ALLORA_CHAIN_ID; +} + +export const ALLORA_HORIZON_HOURS = 8; +export const ALLORA_TOPIC_IDS = { + BTC: 14, + ETH: 9, +} as const; + +export const ALLORA_TOPIC_LABELS = { + BTC: 'BTC/USD - Price Prediction - 8h', + ETH: 'ETH/USD - Price Prediction - 8h', +} as const; + const DEFAULT_POLL_INTERVAL_MS = 5_000; const DEFAULT_STREAM_LIMIT = -1; const DEFAULT_STATE_HISTORY_LIMIT = 100; From 46a1ec54068f1544a21dc292397d9bec3b5a4af7 Mon Sep 17 00:00:00 2001 From: Sebas Date: Wed, 4 Feb 2026 20:16:29 -0800 Subject: [PATCH 07/70] fix(agent-gmx-allora): stabilize core cycle decisions and exposure checks --- .../apps/agent-gmx-allora/rationales.md | 26 ++++++ .../src/core/alloraPrediction.ts | 36 ++++++++ .../src/core/alloraPrediction.unit.test.ts | 32 +++++++ .../apps/agent-gmx-allora/src/core/cycle.ts | 79 ++++++++++++++++ .../src/core/cycle.unit.test.ts | 92 +++++++++++++++++++ .../agent-gmx-allora/src/core/decision.ts | 76 +++++++++++++++ .../src/core/decision.unit.test.ts | 36 ++++++++ .../src/core/executionPlan.ts | 83 +++++++++++++++++ .../src/core/executionPlan.unit.test.ts | 70 ++++++++++++++ .../agent-gmx-allora/src/core/exposure.ts | 66 +++++++++++++ .../src/core/exposure.unit.test.ts | 81 ++++++++++++++++ .../src/core/marketSelection.ts | 22 +++++ .../src/core/marketSelection.unit.test.ts | 56 +++++++++++ .../apps/agent-gmx-allora/src/domain/types.ts | 2 +- 14 files changed, 756 insertions(+), 1 deletion(-) create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/rationales.md create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/alloraPrediction.ts create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/alloraPrediction.unit.test.ts create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/cycle.ts create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/cycle.unit.test.ts create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/decision.ts create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/decision.unit.test.ts create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.ts create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.unit.test.ts create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/exposure.ts create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/exposure.unit.test.ts create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/marketSelection.ts create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/marketSelection.unit.test.ts diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/rationales.md b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/rationales.md new file mode 100644 index 00000000..cfda0790 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/rationales.md @@ -0,0 +1,26 @@ +# GMX Allora Agent Rationales + +## Strategy Rule Format + +We derive a normalized confidence score from Allora's confidence interval band to keep signal selection deterministic and auditable. + +**Rule** +- Use the inner band of `confidence_interval_values` (P15.87, P84.13 when available) to estimate spread. +- Compute `confidence = 1 - (upper - lower) / max(|combined_value|, 1)`. +- Clamp to `[0, 1]` and round to 2 decimals. + +**Why** +- Allora's API provides an inference band but not a single confidence scalar. The spread-to-price ratio yields a consistent, explainable score without introducing probabilistic modeling. + +**Trade-offs** +- This is a heuristic and may under/over-estimate confidence in volatile regimes; it is deterministic and easy to audit, which matches the PRD requirement. + +## Position Sizing Safety Buffer + +We allocate `baseContributionUsd * 0.8` (20% buffer) for position sizing. + +**Why** +- The PRD requires a safety buffer that tolerates roughly 20% adverse movement. Using 80% of the allocation keeps exposure below the full balance while preserving deterministic sizing. + +**Trade-offs** +- This may underutilize capital during strong signals, but it keeps the strategy conservative by design. diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/alloraPrediction.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/alloraPrediction.ts new file mode 100644 index 00000000..f4d09b8c --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/alloraPrediction.ts @@ -0,0 +1,36 @@ +import type { AlloraInference } from '../clients/allora.js'; +import type { AlloraPrediction } from '../domain/types.js'; + +type BuildAlloraPredictionParams = { + inference: AlloraInference; + currentPrice: number; + topic: string; + horizonHours: number; + now?: Date; +}; + +const clamp = (value: number, min: number, max: number) => Math.min(max, Math.max(min, value)); + +function deriveConfidence(inference: AlloraInference): number { + const values = inference.confidenceIntervalValues; + const lower = values[1] ?? values[0] ?? inference.combinedValue; + const upper = values[3] ?? values[values.length - 1] ?? inference.combinedValue; + const spread = Math.abs(upper - lower); + const normalizedSpread = spread / Math.max(Math.abs(inference.combinedValue), 1); + const confidence = clamp(1 - normalizedSpread, 0, 1); + return Number(confidence.toFixed(2)); +} + +export function buildAlloraPrediction(params: BuildAlloraPredictionParams): AlloraPrediction { + const direction = params.inference.combinedValue >= params.currentPrice ? 'up' : 'down'; + const confidence = deriveConfidence(params.inference); + + return { + topic: params.topic, + horizonHours: params.horizonHours, + confidence, + direction, + predictedPrice: params.inference.combinedValue, + timestamp: (params.now ?? new Date()).toISOString(), + }; +} diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/alloraPrediction.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/alloraPrediction.unit.test.ts new file mode 100644 index 00000000..2cf3667d --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/alloraPrediction.unit.test.ts @@ -0,0 +1,32 @@ +import { describe, expect, it } from 'vitest'; + +import type { AlloraInference } from '../clients/allora.js'; + +import { buildAlloraPrediction } from './alloraPrediction.js'; + +describe('buildAlloraPrediction', () => { + it('derives direction and confidence from inference vs current price', () => { + const inference: AlloraInference = { + topicId: 14, + combinedValue: 110, + confidenceIntervalValues: [100, 105, 110, 115, 120], + }; + + const prediction = buildAlloraPrediction({ + inference, + currentPrice: 100, + topic: 'BTC/USD - Price Prediction - 8h', + horizonHours: 8, + now: new Date('2026-02-05T12:00:00.000Z'), + }); + + expect(prediction).toEqual({ + topic: 'BTC/USD - Price Prediction - 8h', + horizonHours: 8, + confidence: 0.91, + direction: 'up', + predictedPrice: 110, + timestamp: '2026-02-05T12:00:00.000Z', + }); + }); +}); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/cycle.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/cycle.ts new file mode 100644 index 00000000..2ac660fd --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/cycle.ts @@ -0,0 +1,79 @@ +import type { AlloraPrediction, GmxAlloraActionKind, GmxAlloraTelemetry } from '../domain/types.js'; + +import { decideTradeAction } from './decision.js'; + +type BuildCycleTelemetryParams = { + prediction: AlloraPrediction; + decisionThreshold: number; + cooldownCycles: number; + maxLeverage: number; + baseContributionUsd: number; + previousAction?: GmxAlloraActionKind; + previousSide?: 'long' | 'short'; + cyclesSinceTrade: number; + isFirstCycle: boolean; + iteration: number; + marketSymbol: string; + now?: Date; +}; + +function resolveCooldownRemaining(params: { + cooldownCycles: number; + cyclesSinceTrade: number; + isFirstCycle: boolean; +}): number { + if (params.isFirstCycle) { + return 0; + } + return Math.max(0, params.cooldownCycles - params.cyclesSinceTrade); +} + +function isTradeAction(action: GmxAlloraActionKind): action is 'open' | 'reduce' | 'close' { + return action === 'open' || action === 'reduce' || action === 'close'; +} + +export function buildCycleTelemetry(params: BuildCycleTelemetryParams): { + telemetry: GmxAlloraTelemetry; + nextCyclesSinceTrade: number; +} { + const cooldownRemaining = resolveCooldownRemaining({ + cooldownCycles: params.cooldownCycles, + cyclesSinceTrade: params.cyclesSinceTrade, + isFirstCycle: params.isFirstCycle, + }); + + const decision = decideTradeAction({ + prediction: params.prediction, + decisionThreshold: params.decisionThreshold, + cooldownRemaining, + maxLeverage: params.maxLeverage, + baseContributionUsd: params.baseContributionUsd, + previousAction: params.previousAction, + previousSide: params.previousSide, + }); + + const timestamp = (params.now ?? new Date()).toISOString(); + const telemetry: GmxAlloraTelemetry = { + cycle: params.iteration, + action: decision.action, + reason: decision.reason, + marketSymbol: params.marketSymbol, + side: isTradeAction(decision.action) ? decision.side : undefined, + leverage: isTradeAction(decision.action) ? decision.leverage : undefined, + sizeUsd: isTradeAction(decision.action) ? decision.sizeUsd : undefined, + prediction: params.prediction, + timestamp, + metrics: { + confidence: params.prediction.confidence, + decisionThreshold: params.decisionThreshold, + cooldownRemaining, + }, + }; + + return { + telemetry, + nextCyclesSinceTrade: isTradeAction(decision.action) + ? 0 + : params.cyclesSinceTrade + 1, + }; +} diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/cycle.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/cycle.unit.test.ts new file mode 100644 index 00000000..d6e82e6c --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/cycle.unit.test.ts @@ -0,0 +1,92 @@ +import { describe, expect, it } from 'vitest'; + +import type { AlloraPrediction } from '../domain/types.js'; + +import { buildCycleTelemetry } from './cycle.js'; + +describe('buildCycleTelemetry', () => { + it('returns cooldown telemetry and increments cycles since trade', () => { + const prediction: AlloraPrediction = { + topic: 'ETH/USD - Price Prediction - 8h', + horizonHours: 8, + confidence: 0.75, + direction: 'down', + predictedPrice: 2400, + timestamp: '2026-02-05T12:00:00.000Z', + }; + + const result = buildCycleTelemetry({ + prediction, + decisionThreshold: 0.62, + cooldownCycles: 2, + baseContributionUsd: 100, + maxLeverage: 2, + previousAction: 'open', + previousSide: 'long', + cyclesSinceTrade: 1, + isFirstCycle: false, + iteration: 4, + marketSymbol: 'ETH/USDC', + now: new Date('2026-02-05T12:01:00.000Z'), + }); + + expect(result.telemetry).toEqual({ + cycle: 4, + action: 'cooldown', + reason: 'Cooldown active for 1 more cycle(s).', + marketSymbol: 'ETH/USDC', + prediction, + timestamp: '2026-02-05T12:01:00.000Z', + metrics: { + confidence: 0.75, + decisionThreshold: 0.62, + cooldownRemaining: 1, + }, + }); + expect(result.nextCyclesSinceTrade).toBe(2); + }); + + it('opens with capped leverage and safety buffer sizing when signal is strong', () => { + const prediction: AlloraPrediction = { + topic: 'BTC/USD - Price Prediction - 8h', + horizonHours: 8, + confidence: 0.81, + direction: 'up', + predictedPrice: 47000, + timestamp: '2026-02-05T12:00:00.000Z', + }; + + const result = buildCycleTelemetry({ + prediction, + decisionThreshold: 0.62, + cooldownCycles: 2, + baseContributionUsd: 200, + maxLeverage: 4, + previousAction: undefined, + previousSide: undefined, + cyclesSinceTrade: 3, + isFirstCycle: false, + iteration: 2, + marketSymbol: 'BTC/USDC', + now: new Date('2026-02-05T12:02:00.000Z'), + }); + + expect(result.telemetry).toEqual({ + cycle: 2, + action: 'open', + reason: 'Signal confidence 0.81 >= 0.62; opening long position.', + marketSymbol: 'BTC/USDC', + side: 'long', + leverage: 2, + sizeUsd: 160, + prediction, + timestamp: '2026-02-05T12:02:00.000Z', + metrics: { + confidence: 0.81, + decisionThreshold: 0.62, + cooldownRemaining: 0, + }, + }); + expect(result.nextCyclesSinceTrade).toBe(0); + }); +}); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/decision.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/decision.ts new file mode 100644 index 00000000..6afc3e39 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/decision.ts @@ -0,0 +1,76 @@ +import type { AlloraPrediction, GmxAlloraActionKind } from '../domain/types.js'; + +type DecideTradeActionParams = { + prediction: AlloraPrediction; + decisionThreshold: number; + cooldownRemaining: number; + maxLeverage: number; + baseContributionUsd: number; + previousAction?: GmxAlloraActionKind; + previousSide?: 'long' | 'short'; +}; + +type TradeDecision = { + action: GmxAlloraActionKind; + reason: string; + side?: 'long' | 'short'; + leverage?: number; + sizeUsd?: number; +}; + +const MAX_LEVERAGE_CAP = 2; +const SAFETY_BUFFER = 0.2; + +const formatNumber = (value: number) => String(value); + +export function decideTradeAction(params: DecideTradeActionParams): TradeDecision { + if (params.cooldownRemaining > 0) { + return { + action: 'cooldown', + reason: `Cooldown active for ${params.cooldownRemaining} more cycle(s).`, + }; + } + + if (params.prediction.confidence < params.decisionThreshold) { + return { + action: 'hold', + reason: `Signal confidence ${formatNumber(params.prediction.confidence)} below threshold ${formatNumber( + params.decisionThreshold, + )}; holding position.`, + }; + } + + const side: 'long' | 'short' = params.prediction.direction === 'up' ? 'long' : 'short'; + const leverage = Math.min(params.maxLeverage, MAX_LEVERAGE_CAP); + const sizeUsd = Number((params.baseContributionUsd * (1 - SAFETY_BUFFER)).toFixed(2)); + + if (params.previousAction === 'open' && params.previousSide && params.previousSide !== side) { + return { + action: 'close', + side, + leverage, + sizeUsd, + reason: `Signal direction flipped to ${side}; closing open position.`, + }; + } + + if (params.previousAction === 'open' && params.previousSide === side) { + return { + action: 'reduce', + side, + leverage, + sizeUsd, + reason: `Signal persists in ${side}; reducing exposure.`, + }; + } + + return { + action: 'open', + side, + leverage, + sizeUsd, + reason: `Signal confidence ${formatNumber(params.prediction.confidence)} >= ${formatNumber( + params.decisionThreshold, + )}; opening ${side} position.`, + }; +} diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/decision.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/decision.unit.test.ts new file mode 100644 index 00000000..edcc3ad7 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/decision.unit.test.ts @@ -0,0 +1,36 @@ +import { describe, expect, it } from 'vitest'; + +import type { AlloraPrediction } from '../domain/types.js'; + +import { decideTradeAction } from './decision.js'; + +describe('decideTradeAction', () => { + it('opens a position when confidence meets threshold and no cooldown is active', () => { + const prediction: AlloraPrediction = { + topic: 'BTC/USD - Price Prediction - 8h', + horizonHours: 8, + confidence: 0.8, + direction: 'up', + predictedPrice: 110, + timestamp: '2026-02-05T12:00:00.000Z', + }; + + const decision = decideTradeAction({ + prediction, + decisionThreshold: 0.62, + cooldownRemaining: 0, + maxLeverage: 2, + baseContributionUsd: 100, + previousAction: undefined, + previousSide: undefined, + }); + + expect(decision).toEqual({ + action: 'open', + side: 'long', + leverage: 2, + sizeUsd: 80, + reason: 'Signal confidence 0.8 >= 0.62; opening long position.', + }); + }); +}); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.ts new file mode 100644 index 00000000..b077ec9e --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.ts @@ -0,0 +1,83 @@ +import type { GmxAlloraTelemetry } from '../domain/types.js'; + +export type ExecutionPlan = { + action: 'none' | 'long' | 'short' | 'close'; + request?: { + amount?: bigint; + walletAddress?: `0x${string}`; + chainId?: string; + marketAddress?: string; + payTokenAddress?: string; + collateralTokenAddress?: string; + leverage?: string; + positionSide?: 'long' | 'short'; + isLimit?: boolean; + }; +}; + +type BuildPlanParams = { + telemetry: GmxAlloraTelemetry; + chainId: string; + marketAddress: `0x${string}`; + walletAddress: `0x${string}`; + payTokenAddress: `0x${string}`; + collateralTokenAddress: `0x${string}`; +}; + +function formatNumber(value: number | undefined): string | undefined { + if (value === undefined) { + return undefined; + } + return String(value); +} + +function toBigIntAmount(value: number | undefined): bigint | undefined { + if (value === undefined) { + return undefined; + } + if (!Number.isFinite(value) || value <= 0) { + return undefined; + } + return BigInt(Math.round(value)); +} + +export function buildPerpetualExecutionPlan(params: BuildPlanParams): ExecutionPlan { + const { telemetry } = params; + + if (telemetry.action === 'open') { + if (!telemetry.side || telemetry.sizeUsd === undefined || telemetry.leverage === undefined) { + return { action: 'none' }; + } + + return { + action: telemetry.side === 'long' ? 'long' : 'short', + request: { + amount: toBigIntAmount(telemetry.sizeUsd), + walletAddress: params.walletAddress, + chainId: params.chainId, + marketAddress: params.marketAddress, + payTokenAddress: params.payTokenAddress, + collateralTokenAddress: params.collateralTokenAddress, + leverage: formatNumber(telemetry.leverage), + }, + }; + } + + if (telemetry.action === 'reduce' || telemetry.action === 'close') { + if (!telemetry.side) { + return { action: 'none' }; + } + + return { + action: 'close', + request: { + walletAddress: params.walletAddress, + marketAddress: params.marketAddress, + positionSide: telemetry.side, + isLimit: false, + }, + }; + } + + return { action: 'none' }; +} diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.unit.test.ts new file mode 100644 index 00000000..d28ee0f1 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.unit.test.ts @@ -0,0 +1,70 @@ +import { describe, expect, it } from 'vitest'; + +import type { GmxAlloraTelemetry } from '../domain/types.js'; + +import { buildPerpetualExecutionPlan } from './executionPlan.js'; + +describe('buildPerpetualExecutionPlan', () => { + it('builds a long request for open long actions', () => { + const telemetry: GmxAlloraTelemetry = { + cycle: 1, + action: 'open', + reason: 'Signal strong', + marketSymbol: 'BTC/USDC', + side: 'long', + leverage: 2, + sizeUsd: 160, + timestamp: '2026-02-05T12:00:00.000Z', + }; + + const plan = buildPerpetualExecutionPlan({ + telemetry, + chainId: '42161', + marketAddress: '0xmarket', + walletAddress: '0xwallet', + payTokenAddress: '0xusdc', + collateralTokenAddress: '0xusdc', + }); + + expect(plan.action).toBe('long'); + expect(plan.request).toEqual({ + amount: 160n, + walletAddress: '0xwallet', + chainId: '42161', + marketAddress: '0xmarket', + payTokenAddress: '0xusdc', + collateralTokenAddress: '0xusdc', + leverage: '2', + }); + }); + + it('builds a close request for reduce actions', () => { + const telemetry: GmxAlloraTelemetry = { + cycle: 2, + action: 'reduce', + reason: 'Reduce exposure', + marketSymbol: 'ETH/USDC', + side: 'short', + leverage: 2, + sizeUsd: 120, + timestamp: '2026-02-05T12:05:00.000Z', + }; + + const plan = buildPerpetualExecutionPlan({ + telemetry, + chainId: '42161', + marketAddress: '0xmarket', + walletAddress: '0xwallet', + payTokenAddress: '0xusdc', + collateralTokenAddress: '0xusdc', + }); + + expect(plan.action).toBe('close'); + expect(plan.request).toEqual({ + walletAddress: '0xwallet', + marketAddress: '0xmarket', + positionSide: 'short', + isLimit: false, + }); + }); +}); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/exposure.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/exposure.ts new file mode 100644 index 00000000..678de98b --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/exposure.ts @@ -0,0 +1,66 @@ +import type { PerpetualPosition } from '../clients/onchainActions.js'; +import type { GmxAlloraTelemetry } from '../domain/types.js'; + +function parseUsd(value: string | undefined): number { + if (!value) { + return 0; + } + const parsed = Number(value); + return Number.isFinite(parsed) ? parsed : 0; +} + +function isTradeAction(action: GmxAlloraTelemetry['action']): action is 'open' | 'reduce' | 'close' { + return action === 'open' || action === 'reduce' || action === 'close'; +} + +export function applyExposureLimits(params: { + telemetry: GmxAlloraTelemetry; + positions: PerpetualPosition[]; + targetMarketAddress: string; + maxMarketExposureUsd: number; + maxTotalExposureUsd: number; +}): GmxAlloraTelemetry { + const { telemetry, positions } = params; + + if (telemetry.action !== 'open' || !isTradeAction(telemetry.action)) { + return telemetry; + } + + const sizeUsd = telemetry.sizeUsd ?? 0; + if (sizeUsd <= 0) { + return telemetry; + } + + const normalizedTarget = params.targetMarketAddress.toLowerCase(); + let marketExposure = 0; + let totalExposure = 0; + + for (const position of positions) { + const exposure = parseUsd(position.sizeInUsd); + totalExposure += exposure; + if (position.marketAddress.toLowerCase() === normalizedTarget) { + marketExposure += exposure; + } + } + + const nextMarketExposure = marketExposure + sizeUsd; + const nextTotalExposure = totalExposure + sizeUsd; + + if ( + nextMarketExposure > params.maxMarketExposureUsd || + nextTotalExposure > params.maxTotalExposureUsd + ) { + const reason = `Exposure limit reached (market ${nextMarketExposure.toFixed(2)} / total ${nextTotalExposure.toFixed(2)}).`; + return { + ...telemetry, + action: 'hold', + reason, + side: undefined, + leverage: undefined, + sizeUsd: undefined, + txHash: undefined, + }; + } + + return telemetry; +} diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/exposure.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/exposure.unit.test.ts new file mode 100644 index 00000000..58e252a6 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/exposure.unit.test.ts @@ -0,0 +1,81 @@ +import { describe, expect, it } from 'vitest'; + +import type { PerpetualPosition } from '../clients/onchainActions.js'; +import type { GmxAlloraTelemetry } from '../domain/types.js'; + +import { applyExposureLimits } from './exposure.js'; + +describe('applyExposureLimits', () => { + it('blocks opening trades that exceed per-market exposure', () => { + const telemetry: GmxAlloraTelemetry = { + cycle: 2, + action: 'open', + reason: 'Signal strong', + marketSymbol: 'BTC/USDC', + side: 'long', + leverage: 2, + sizeUsd: 160, + prediction: { + topic: 'BTC/USD - Price Prediction - 8h', + horizonHours: 8, + confidence: 0.8, + direction: 'up', + predictedPrice: 47000, + timestamp: '2026-02-05T12:00:00.000Z', + }, + timestamp: '2026-02-05T12:01:00.000Z', + metrics: { + confidence: 0.8, + decisionThreshold: 0.62, + cooldownRemaining: 0, + }, + }; + + const positions: PerpetualPosition[] = [ + { + chainId: '42161', + key: '0xpos', + contractKey: '0xcontract', + account: '0xwallet', + marketAddress: '0xmarket', + sizeInUsd: '200', + sizeInTokens: '0.01', + collateralAmount: '100', + pendingBorrowingFeesUsd: '0', + increasedAtTime: '0', + decreasedAtTime: '0', + positionSide: 'long', + isLong: true, + fundingFeeAmount: '0', + claimableLongTokenAmount: '0', + claimableShortTokenAmount: '0', + isOpening: false, + pnl: '0', + positionFeeAmount: '0', + traderDiscountAmount: '0', + uiFeeAmount: '0', + collateralToken: { + tokenUid: { chainId: '42161', address: '0xusdc' }, + name: 'USD Coin', + symbol: 'USDC', + isNative: false, + decimals: 6, + iconUri: null, + isVetted: true, + }, + }, + ]; + + const result = applyExposureLimits({ + telemetry, + positions, + targetMarketAddress: '0xmarket', + maxMarketExposureUsd: 300, + maxTotalExposureUsd: 500, + }); + + expect(result.action).toBe('hold'); + expect(result.reason).toContain('Exposure limit'); + expect(result.sizeUsd).toBeUndefined(); + }); +}); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/marketSelection.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/marketSelection.ts new file mode 100644 index 00000000..5f84856b --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/marketSelection.ts @@ -0,0 +1,22 @@ +import type { PerpetualMarket } from '../clients/onchainActions.js'; + +type MarketSelectionParams = { + markets: PerpetualMarket[]; + baseSymbol: string; + quoteSymbol: string; +}; + +export function selectGmxPerpetualMarket(params: MarketSelectionParams): PerpetualMarket | undefined { + const base = params.baseSymbol.toUpperCase(); + const quote = params.quoteSymbol.toUpperCase(); + + return params.markets.find((market) => { + const name = market.name.toUpperCase(); + const index = market.indexToken.symbol.toUpperCase(); + const longToken = market.longToken.symbol.toUpperCase(); + const shortToken = market.shortToken.symbol.toUpperCase(); + const matchesSymbols = index === base && (longToken === quote || shortToken === quote); + const isGmx = name.includes('GMX'); + return matchesSymbols && isGmx; + }); +} diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/marketSelection.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/marketSelection.unit.test.ts new file mode 100644 index 00000000..a3517f6f --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/marketSelection.unit.test.ts @@ -0,0 +1,56 @@ +import { describe, expect, it } from 'vitest'; + +import type { PerpetualMarket } from '../clients/onchainActions.js'; + +import { selectGmxPerpetualMarket } from './marketSelection.js'; + +describe('selectGmxPerpetualMarket', () => { + it('matches GMX market by index + collateral symbols', () => { + const markets: PerpetualMarket[] = [ + { + marketToken: { chainId: '42161', address: '0x1' }, + longFundingFee: '0.01', + shortFundingFee: '0.02', + longBorrowingFee: '0.03', + shortBorrowingFee: '0.04', + chainId: '42161', + name: 'GMX BTC/USD', + indexToken: { + tokenUid: { chainId: '42161', address: '0xbtc' }, + name: 'Bitcoin', + symbol: 'BTC', + isNative: false, + decimals: 8, + iconUri: null, + isVetted: true, + }, + longToken: { + tokenUid: { chainId: '42161', address: '0xusdc' }, + name: 'USD Coin', + symbol: 'USDC', + isNative: false, + decimals: 6, + iconUri: null, + isVetted: true, + }, + shortToken: { + tokenUid: { chainId: '42161', address: '0xusdc' }, + name: 'USD Coin', + symbol: 'USDC', + isNative: false, + decimals: 6, + iconUri: null, + isVetted: true, + }, + }, + ]; + + const result = selectGmxPerpetualMarket({ + markets, + baseSymbol: 'BTC', + quoteSymbol: 'USDC', + }); + + expect(result?.marketToken.address).toBe('0x1'); + }); +}); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/domain/types.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/domain/types.ts index 07a8cc4c..b9e4dddf 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/domain/types.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/domain/types.ts @@ -30,7 +30,7 @@ export type AlloraPrediction = z.infer; export const GmxSetupInputSchema = z.object({ walletAddress: z.templateLiteral(['0x', z.string()]), - baseContributionUsd: z.number().positive().optional(), + usdcAllocation: z.number().positive(), targetMarket: z.enum(['BTC', 'ETH']), }); From 489ab0b43cf4a52a46e7c393a59254370d668fff Mon Sep 17 00:00:00 2001 From: Sebas Date: Wed, 4 Feb 2026 20:16:39 -0800 Subject: [PATCH 08/70] fix(agent-gmx-allora): align workflow nodes and artifacts for polling and execution --- .../src/workflow/artifacts.ts | 33 +++ .../src/workflow/clientFactory.ts | 15 + .../src/workflow/execution.ts | 36 +++ .../src/workflow/nodes/bootstrap.ts | 10 +- .../nodes/collectFundingTokenInput.ts | 57 +--- .../src/workflow/nodes/collectSetupInput.ts | 2 +- .../src/workflow/nodes/pollCycle.ts | 278 +++++++++++++----- .../src/workflow/nodes/prepareOperator.ts | 6 +- 8 files changed, 305 insertions(+), 132 deletions(-) create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.ts create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.ts diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.ts index b7cb054a..86e404ab 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.ts @@ -1,5 +1,6 @@ import { type Artifact } from '@emberai/agent-node/workflow'; +import type { ExecutionPlan } from '../core/executionPlan.js'; import { type GmxAlloraTelemetry } from '../domain/types.js'; export function buildTelemetryArtifact(entry: GmxAlloraTelemetry): Artifact { @@ -16,6 +17,38 @@ export function buildTelemetryArtifact(entry: GmxAlloraTelemetry): Artifact { }; } +export function buildExecutionPlanArtifact(plan: ExecutionPlan): Artifact { + return { + artifactId: 'gmx-allora-execution-plan', + name: 'gmx-allora-execution-plan.json', + description: 'GMX Allora execution plan', + parts: [ + { + kind: 'data', + data: plan, + }, + ], + }; +} + +export function buildExecutionResultArtifact(result: { + action: ExecutionPlan['action']; + ok: boolean; + error?: string; +}): Artifact { + return { + artifactId: 'gmx-allora-execution-result', + name: 'gmx-allora-execution-result.json', + description: 'GMX Allora execution result', + parts: [ + { + kind: 'data', + data: result, + }, + ], + }; +} + export function buildSummaryArtifact(telemetry: GmxAlloraTelemetry[]): Artifact { const actions: Record = {}; let firstTimestamp: string | undefined; diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.ts new file mode 100644 index 00000000..5b074f59 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.ts @@ -0,0 +1,15 @@ +import { OnchainActionsClient } from '../clients/onchainActions.js'; +import { ONCHAIN_ACTIONS_BASE_URL } from '../config/constants.js'; + +let cachedOnchainActionsClient: OnchainActionsClient | null = null; + +export function getOnchainActionsClient(): OnchainActionsClient { + if (!cachedOnchainActionsClient) { + cachedOnchainActionsClient = new OnchainActionsClient(ONCHAIN_ACTIONS_BASE_URL); + } + return cachedOnchainActionsClient; +} + +export function clearClientCache(): void { + cachedOnchainActionsClient = null; +} diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.ts new file mode 100644 index 00000000..9ae71445 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.ts @@ -0,0 +1,36 @@ +import type { OnchainActionsClient } from '../clients/onchainActions.js'; +import type { ExecutionPlan } from '../core/executionPlan.js'; + + +export type ExecutionResult = { + action: ExecutionPlan['action']; + ok: boolean; + error?: string; +}; + +export async function executePerpetualPlan(params: { + client: Pick; + plan: ExecutionPlan; +}): Promise { + const { plan } = params; + + if (plan.action === 'none' || !plan.request) { + return { action: plan.action, ok: true }; + } + + try { + if (plan.action === 'long') { + await params.client.createPerpetualLong(plan.request as Parameters[0]); + return { action: plan.action, ok: true }; + } + if (plan.action === 'short') { + await params.client.createPerpetualShort(plan.request as Parameters[0]); + return { action: plan.action, ok: true }; + } + await params.client.createPerpetualClose(plan.request as Parameters[0]); + return { action: plan.action, ok: true }; + } catch (error: unknown) { + const message = error instanceof Error ? error.message : String(error); + return { action: plan.action, ok: false, error: message }; + } +} diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/bootstrap.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/bootstrap.ts index e41d144f..5c926acd 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/bootstrap.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/bootstrap.ts @@ -1,7 +1,12 @@ import { copilotkitEmitState } from '@copilotkit/sdk-js/langgraph'; import { Command } from '@langchain/langgraph'; -import { resolvePollIntervalMs, resolveStreamLimit } from '../../config/constants.js'; +import { + resolveAlloraApiBaseUrl, + resolveOnchainActionsBaseUrl, + resolvePollIntervalMs, + resolveStreamLimit, +} from '../../config/constants.js'; import { logInfo, type ClmmEvent, type ClmmState, type ClmmUpdate } from '../context.js'; import { ALLOWED_TOKENS, MARKETS } from '../seedData.js'; @@ -26,12 +31,15 @@ export const bootstrapNode = async ( const pollIntervalMs = resolvePollIntervalMs(); const streamLimit = resolveStreamLimit(); const delegationsBypassActive = process.env['DELEGATIONS_BYPASS'] === 'true'; + const onchainActionsBaseUrl = resolveOnchainActionsBaseUrl({ logger: logInfo }); logInfo('Initialized GMX Allora workflow context', { mode, pollIntervalMs, streamLimit, delegationsBypassActive, + onchainActionsBaseUrl, + alloraApiBaseUrl: resolveAlloraApiBaseUrl(), }); const dispatch: ClmmEvent = { diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectFundingTokenInput.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectFundingTokenInput.ts index e9074e62..650a4194 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectFundingTokenInput.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectFundingTokenInput.ts @@ -1,15 +1,13 @@ import { copilotkitEmitState } from '@copilotkit/sdk-js/langgraph'; -import { Command, interrupt } from '@langchain/langgraph'; -import { z } from 'zod'; +import { Command } from '@langchain/langgraph'; -import { FundingTokenInputSchema, type FundingTokenInput } from '../../domain/types.js'; +import { type FundingTokenInput } from '../../domain/types.js'; import { buildTaskStatus, logInfo, normalizeHexAddress, type ClmmState, type ClmmUpdate, - type FundingTokenInterrupt, type OnboardingState, } from '../context.js'; import { FUNDING_TOKENS } from '../seedData.js'; @@ -51,17 +49,10 @@ export const collectFundingTokenInputNode = async ( }); } - const request: FundingTokenInterrupt = { - type: 'gmx-funding-token-request', - message: 'Select the token to swap into USDC collateral for GMX perps.', - payloadSchema: z.toJSONSchema(FundingTokenInputSchema), - options: FUNDING_TOKENS, - }; - const awaitingInput = buildTaskStatus( state.view.task, - 'input-required', - 'Awaiting funding-token selection to continue onboarding.', + 'working', + 'Using USDC as collateral for GMX perps.', ); await copilotkitEmitState(config, { view: { @@ -71,21 +62,9 @@ export const collectFundingTokenInputNode = async ( }, }); - const incoming: unknown = await interrupt(request); - - let inputToParse: unknown = incoming; - if (typeof incoming === 'string') { - try { - inputToParse = JSON.parse(incoming); - } catch { - // ignore - } - } - - const parsed = FundingTokenInputSchema.safeParse(inputToParse); - if (!parsed.success) { - const issues = parsed.error.issues.map((issue) => issue.message).join('; '); - const failureMessage = `Invalid funding-token input: ${issues}`; + const usdcOption = FUNDING_TOKENS.find((option) => option.symbol.toUpperCase() === 'USDC'); + if (!usdcOption) { + const failureMessage = 'ERROR: USDC funding option unavailable for GMX onboarding.'; const { task, statusEvent } = buildTaskStatus(awaitingInput.task, 'failed', failureMessage); await copilotkitEmitState(config, { view: { task, activity: { events: [statusEvent], telemetry: state.view.activity.telemetry } }, @@ -100,31 +79,13 @@ export const collectFundingTokenInputNode = async ( } const normalizedFundingToken = normalizeHexAddress( - parsed.data.fundingTokenAddress, + usdcOption.address, 'funding token address', ); - const isAllowed = FUNDING_TOKENS.some( - (option) => option.address.toLowerCase() === normalizedFundingToken.toLowerCase(), - ); - if (!isAllowed) { - const failureMessage = `Invalid funding-token input: address ${normalizedFundingToken} not in allowed options`; - const { task, statusEvent } = buildTaskStatus(awaitingInput.task, 'failed', failureMessage); - await copilotkitEmitState(config, { - view: { task, activity: { events: [statusEvent], telemetry: state.view.activity.telemetry } }, - }); - return { - view: { - haltReason: failureMessage, - task, - activity: { events: [statusEvent], telemetry: state.view.activity.telemetry }, - }, - }; - } - const { task, statusEvent } = buildTaskStatus( awaitingInput.task, 'working', - 'Funding token selected. Preparing delegation request.', + 'USDC collateral selected. Preparing delegation request.', ); await copilotkitEmitState(config, { view: { task, activity: { events: [statusEvent], telemetry: state.view.activity.telemetry } }, diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectSetupInput.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectSetupInput.ts index 8bf89515..a7ef9984 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectSetupInput.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectSetupInput.ts @@ -78,7 +78,7 @@ export const collectSetupInputNode = async ( const { task, statusEvent } = buildTaskStatus( awaitingInput.task, 'working', - 'Market and allocation received. Preparing funding token options.', + 'Market and USDC allocation received. Preparing funding token options.', ); await copilotkitEmitState(config, { view: { task, activity: { events: [statusEvent], telemetry: [] } }, diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts index 680f8618..6368f49a 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts @@ -1,9 +1,29 @@ import { copilotkitEmitState } from '@copilotkit/sdk-js/langgraph'; import { Command } from '@langchain/langgraph'; -import { resolvePollIntervalMs } from '../../config/constants.js'; -import { type AlloraPrediction, type GmxAlloraTelemetry } from '../../domain/types.js'; -import { buildTelemetryArtifact } from '../artifacts.js'; +import { fetchAlloraInference } from '../../clients/allora.js'; +import { + ALLORA_HORIZON_HOURS, + ALLORA_TOPIC_IDS, + ALLORA_TOPIC_LABELS, + ARBITRUM_CHAIN_ID, + resolveAlloraApiBaseUrl, + resolveAlloraApiKey, + resolveAlloraChainId, + resolvePollIntervalMs, +} from '../../config/constants.js'; +import { buildAlloraPrediction } from '../../core/alloraPrediction.js'; +import { buildCycleTelemetry } from '../../core/cycle.js'; +import { buildPerpetualExecutionPlan } from '../../core/executionPlan.js'; +import { applyExposureLimits } from '../../core/exposure.js'; +import { selectGmxPerpetualMarket } from '../../core/marketSelection.js'; +import type { AlloraPrediction } from '../../domain/types.js'; +import { + buildExecutionPlanArtifact, + buildExecutionResultArtifact, + buildTelemetryArtifact, +} from '../artifacts.js'; +import { getOnchainActionsClient } from '../clientFactory.js'; import { buildTaskStatus, logInfo, @@ -12,7 +32,7 @@ import { type ClmmUpdate, } from '../context.js'; import { ensureCronForThread } from '../cronScheduler.js'; -import { ALLORA_PREDICTIONS } from '../seedData.js'; +import { executePerpetualPlan } from '../execution.js'; type CopilotKitConfig = Parameters[0]; type Configurable = { configurable?: { thread_id?: string } }; @@ -22,10 +42,6 @@ const COOLDOWN_CYCLES = 2; const CONNECT_DELAY_MS = 2500; const CONNECT_DELAY_STEPS = 3; -function buildTxHash(iteration: number): string { - return `0x${iteration.toString(16).padStart(64, '0')}`; -} - function shouldDelayIteration(iteration: number): boolean { return iteration % 3 === 0; } @@ -34,20 +50,8 @@ function delay(ms: number): Promise { return new Promise((resolve) => setTimeout(resolve, ms)); } -function adjustPrediction(prediction: AlloraPrediction, iteration: number): AlloraPrediction { - const confidenceDelta = ((iteration % 3) - 1) * 0.05; - const confidence = Math.min(0.9, Math.max(0.45, prediction.confidence + confidenceDelta)); - const flipDirection = iteration % 5 === 0; - const direction = flipDirection ? (prediction.direction === 'up' ? 'down' : 'up') : prediction.direction; - const priceDrift = (iteration % 4) * (direction === 'up' ? 45 : -35); - - return { - ...prediction, - confidence: Number(confidence.toFixed(2)), - direction, - predictedPrice: Number((prediction.predictedPrice + priceDrift).toFixed(2)), - timestamp: new Date().toISOString(), - }; +function resolveTopicKey(symbol: string): 'BTC' | 'ETH' { + return symbol === 'BTC' ? 'BTC' : 'ETH'; } export const pollCycleNode = async ( @@ -78,60 +82,142 @@ export const pollCycleNode = async ( } const iteration = (state.view.metrics.iteration ?? 0) + 1; - const basePrediction = ALLORA_PREDICTIONS[selectedPool.baseSymbol === 'BTC' ? 'BTC' : 'ETH']; - const prediction = adjustPrediction(basePrediction, iteration); - const strongSignal = prediction.confidence >= DECISION_THRESHOLD; - - const cyclesSinceTrade = state.view.metrics.cyclesSinceRebalance ?? 0; - const cooldownRemaining = - iteration === 1 ? 0 : Math.max(0, COOLDOWN_CYCLES - cyclesSinceTrade); - const inCooldown = cooldownRemaining > 0; - - let action: GmxAlloraTelemetry['action'] = 'hold'; - let reason = 'Signal below confidence threshold; holding position.'; - - if (inCooldown) { - action = 'cooldown'; - reason = `Cooldown active for ${cooldownRemaining} more cycle(s).`; - } else if (strongSignal) { - if (iteration % 7 === 0) { - action = 'close'; - reason = 'Strong signal reversal detected; closing position.'; - } else if (iteration % 5 === 0) { - action = 'reduce'; - reason = 'Reducing exposure after consecutive signals.'; - } else { - action = 'open'; - reason = `Opening ${prediction.direction} position based on Allora signal.`; - } + const topicKey = resolveTopicKey(selectedPool.baseSymbol); + const topicId = ALLORA_TOPIC_IDS[topicKey]; + const topicLabel = ALLORA_TOPIC_LABELS[topicKey]; + + let prediction: AlloraPrediction; + try { + const inference = await fetchAlloraInference({ + baseUrl: resolveAlloraApiBaseUrl(), + chainId: resolveAlloraChainId(), + topicId, + apiKey: resolveAlloraApiKey(), + }); + const currentPrice = state.view.metrics.previousPrice ?? inference.combinedValue; + prediction = buildAlloraPrediction({ + inference, + currentPrice, + topic: topicLabel, + horizonHours: ALLORA_HORIZON_HOURS, + }); + } catch (error: unknown) { + const message = error instanceof Error ? error.message : 'Unknown error'; + const failureMessage = `ERROR: Failed to fetch Allora prediction: ${message}`; + const { task, statusEvent } = buildTaskStatus(state.view.task, 'failed', failureMessage); + await copilotkitEmitState(config, { + view: { task, activity: { events: [statusEvent], telemetry: state.view.activity.telemetry } }, + }); + return new Command({ + update: { + view: { + haltReason: failureMessage, + activity: { events: [statusEvent], telemetry: state.view.activity.telemetry }, + metrics: state.view.metrics, + task, + profile: state.view.profile, + transactionHistory: state.view.transactionHistory, + }, + }, + goto: 'summarize', + }); } - const side = prediction.direction === 'up' ? 'long' : 'short'; - const leverage = Math.min(operatorConfig.maxLeverage, 2); - const sizeUsd = Number((operatorConfig.baseContributionUsd * 0.9).toFixed(2)); - const txHash = ['open', 'reduce', 'close'].includes(action) ? buildTxHash(iteration) : undefined; - const timestamp = new Date().toISOString(); + let gmxMarketAddress: string; + let positions = []; + try { + const onchainActionsClient = getOnchainActionsClient(); + const chainIds = [ARBITRUM_CHAIN_ID.toString()]; + const [markets, walletPositions] = await Promise.all([ + onchainActionsClient.listPerpetualMarkets({ chainIds }), + onchainActionsClient.listPerpetualPositions({ + walletAddress: operatorConfig.walletAddress, + chainIds, + }), + ]); - const telemetry: GmxAlloraTelemetry = { - cycle: iteration, - action, - reason, - marketSymbol: `${selectedPool.baseSymbol}/${selectedPool.quoteSymbol}`, - side: ['open', 'reduce', 'close'].includes(action) ? side : undefined, - leverage: ['open', 'reduce', 'close'].includes(action) ? leverage : undefined, - sizeUsd: ['open', 'reduce', 'close'].includes(action) ? sizeUsd : undefined, + const selectedMarket = selectGmxPerpetualMarket({ + markets, + baseSymbol: selectedPool.baseSymbol, + quoteSymbol: selectedPool.quoteSymbol, + }); + + if (!selectedMarket) { + const failureMessage = `ERROR: No GMX ${selectedPool.baseSymbol}/${selectedPool.quoteSymbol} market available`; + const { task, statusEvent } = buildTaskStatus(state.view.task, 'failed', failureMessage); + await copilotkitEmitState(config, { + view: { task, activity: { events: [statusEvent], telemetry: state.view.activity.telemetry } }, + }); + return new Command({ + update: { + view: { + haltReason: failureMessage, + activity: { events: [statusEvent], telemetry: state.view.activity.telemetry }, + metrics: state.view.metrics, + task, + profile: state.view.profile, + transactionHistory: state.view.transactionHistory, + }, + }, + goto: 'summarize', + }); + } + + gmxMarketAddress = selectedMarket.marketToken.address; + positions = walletPositions; + } catch (error: unknown) { + const message = error instanceof Error ? error.message : 'Unknown error'; + const failureMessage = `ERROR: Failed to fetch GMX markets/positions: ${message}`; + const { task, statusEvent } = buildTaskStatus(state.view.task, 'failed', failureMessage); + await copilotkitEmitState(config, { + view: { task, activity: { events: [statusEvent], telemetry: state.view.activity.telemetry } }, + }); + return new Command({ + update: { + view: { + haltReason: failureMessage, + activity: { events: [statusEvent], telemetry: state.view.activity.telemetry }, + metrics: state.view.metrics, + task, + profile: state.view.profile, + transactionHistory: state.view.transactionHistory, + }, + }, + goto: 'summarize', + }); + } + + const previousCycle = state.view.metrics.latestCycle; + const { telemetry, nextCyclesSinceTrade: initialCyclesSinceTrade } = buildCycleTelemetry({ prediction, - txHash, - timestamp, - metrics: { - confidence: prediction.confidence, - decisionThreshold: DECISION_THRESHOLD, - cooldownRemaining, - }, - }; + decisionThreshold: DECISION_THRESHOLD, + cooldownCycles: COOLDOWN_CYCLES, + maxLeverage: operatorConfig.maxLeverage, + baseContributionUsd: operatorConfig.baseContributionUsd, + previousAction: previousCycle?.action, + previousSide: previousCycle?.side, + cyclesSinceTrade: state.view.metrics.cyclesSinceRebalance ?? 0, + isFirstCycle: iteration === 1, + iteration, + marketSymbol: `${selectedPool.baseSymbol}/${selectedPool.quoteSymbol}`, + }); + + const exposureAdjusted = applyExposureLimits({ + telemetry, + positions, + targetMarketAddress: gmxMarketAddress, + maxMarketExposureUsd: operatorConfig.baseContributionUsd * operatorConfig.maxLeverage, + maxTotalExposureUsd: operatorConfig.baseContributionUsd * operatorConfig.maxLeverage, + }); const nextCyclesSinceTrade = - ['open', 'reduce', 'close'].includes(action) ? 0 : cyclesSinceTrade + 1; + exposureAdjusted.action === 'hold' && telemetry.action === 'open' + ? (state.view.metrics.cyclesSinceRebalance ?? 0) + 1 + : initialCyclesSinceTrade; + + const action = exposureAdjusted.action; + const reason = exposureAdjusted.reason; + const txHash = exposureAdjusted.txHash; const cycleStatusMessage = `[Cycle ${iteration}] ${action}: ${reason}${txHash ? ` (tx: ${txHash.slice(0, 10)}...)` : ''}`; let { task, statusEvent } = buildTaskStatus(state.view.task, 'working', cycleStatusMessage); @@ -139,14 +225,14 @@ export const pollCycleNode = async ( view: { task, activity: { events: [statusEvent], telemetry: state.view.activity.telemetry }, - metrics: { latestCycle: telemetry }, + metrics: { latestCycle: exposureAdjusted }, }, }); if (shouldDelayIteration(iteration)) { const stepDelayMs = Math.max(1, Math.floor(CONNECT_DELAY_MS / CONNECT_DELAY_STEPS)); for (let step = 1; step <= CONNECT_DELAY_STEPS; step += 1) { - const waitMessage = `[Cycle ${iteration}] streaming… (${step}/${CONNECT_DELAY_STEPS})`; + const waitMessage = `[Cycle ${iteration}] streaming... (${step}/${CONNECT_DELAY_STEPS})`; const updated = buildTaskStatus(task, 'working', waitMessage); task = updated.task; statusEvent = updated.statusEvent; @@ -154,7 +240,7 @@ export const pollCycleNode = async ( view: { task, activity: { events: [statusEvent], telemetry: state.view.activity.telemetry }, - metrics: { latestCycle: telemetry }, + metrics: { latestCycle: exposureAdjusted }, }, }); await delay(stepDelayMs); @@ -163,9 +249,41 @@ export const pollCycleNode = async ( const telemetryEvent: ClmmEvent = { type: 'artifact', - artifact: buildTelemetryArtifact(telemetry), + artifact: buildTelemetryArtifact(exposureAdjusted), append: true, }; + const executionPlan = buildPerpetualExecutionPlan({ + telemetry: exposureAdjusted, + chainId: ARBITRUM_CHAIN_ID.toString(), + marketAddress: gmxMarketAddress as `0x${string}`, + walletAddress: operatorConfig.walletAddress, + payTokenAddress: operatorConfig.fundingTokenAddress, + collateralTokenAddress: operatorConfig.fundingTokenAddress, + }); + const executionResult = await executePerpetualPlan({ + client: getOnchainActionsClient(), + plan: executionPlan, + }); + const executionPlanEvent: ClmmEvent | undefined = + executionPlan.action === 'none' + ? undefined + : { + type: 'artifact', + artifact: buildExecutionPlanArtifact(executionPlan), + append: true, + }; + const executionResultEvent: ClmmEvent | undefined = + executionPlan.action === 'none' + ? undefined + : { + type: 'artifact', + artifact: buildExecutionResultArtifact({ + action: executionResult.action, + ok: executionResult.ok, + error: executionResult.error, + }), + append: true, + }; let cronScheduled = state.private.cronScheduled; const threadId = (config as Configurable).configurable?.thread_id; @@ -183,7 +301,7 @@ export const pollCycleNode = async ( txHash, status: 'success' as const, reason, - timestamp, + timestamp: exposureAdjusted.timestamp, } : undefined; @@ -206,12 +324,16 @@ export const pollCycleNode = async ( cyclesSinceRebalance: nextCyclesSinceTrade, staleCycles: state.view.metrics.staleCycles ?? 0, iteration, - latestCycle: telemetry, + latestCycle: exposureAdjusted, }, task, activity: { - telemetry: [telemetry], - events: [telemetryEvent, statusEvent], + telemetry: [exposureAdjusted], + events: executionPlanEvent + ? executionResultEvent + ? [telemetryEvent, executionPlanEvent, executionResultEvent, statusEvent] + : [telemetryEvent, executionPlanEvent, statusEvent] + : [telemetryEvent, statusEvent], }, transactionHistory: transactionEntry ? [...state.view.transactionHistory, transactionEntry] diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/prepareOperator.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/prepareOperator.ts index 1e9a08dc..9514f96b 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/prepareOperator.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/prepareOperator.ts @@ -14,8 +14,6 @@ import { AGENT_WALLET_ADDRESS, MARKETS } from '../seedData.js'; type CopilotKitConfig = Parameters[0]; -const DEFAULT_ALLOCATION_USD = 100; - export const prepareOperatorNode = async ( state: ClmmState, config: CopilotKitConfig, @@ -121,7 +119,7 @@ export const prepareOperatorNode = async ( const operatorConfig: ResolvedGmxConfig = { walletAddress: delegationsBypassActive ? AGENT_WALLET_ADDRESS : operatorWalletAddress, - baseContributionUsd: operatorInput.baseContributionUsd ?? DEFAULT_ALLOCATION_USD, + baseContributionUsd: operatorInput.usdcAllocation, fundingTokenAddress, targetMarket, maxLeverage: targetMarket.maxLeverage, @@ -129,7 +127,7 @@ export const prepareOperatorNode = async ( logInfo('GMX Allora strategy configuration established', { operatorWalletAddress, - baseContributionUsd: operatorConfig.baseContributionUsd, + usdcAllocation: operatorConfig.baseContributionUsd, fundingToken: fundingTokenAddress, market: `${targetMarket.baseSymbol}/${targetMarket.quoteSymbol}`, maxLeverage: targetMarket.maxLeverage, From 925215538c15dca7cf6e7f3336228d0b8b092735 Mon Sep 17 00:00:00 2001 From: Sebas Date: Wed, 4 Feb 2026 20:16:52 -0800 Subject: [PATCH 09/70] fix(agent-gmx-allora): cover core and workflow with unit and integration tests --- .../src/config/constants.unit.test.ts | 49 ++++ .../src/workflow/artifacts.unit.test.ts | 39 +++ .../src/workflow/clientFactory.unit.test.ts | 31 +++ .../src/workflow/execution.unit.test.ts | 64 +++++ .../tests/onboarding.int.test.ts | 148 +++++++++++ .../tests/pollCycle.int.test.ts | 251 ++++++++++++++++++ .../tests/setup/vitest.setup.ts | 3 + 7 files changed, 585 insertions(+) create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.unit.test.ts create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.unit.test.ts create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.unit.test.ts create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/onboarding.int.test.ts create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/setup/vitest.setup.ts diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts new file mode 100644 index 00000000..6f6feb54 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts @@ -0,0 +1,49 @@ +import { describe, expect, it, vi } from 'vitest'; + +import { resolveOnchainActionsBaseUrl } from './constants.js'; + +describe('config/constants', () => { + it('normalizes the OpenAPI endpoint to a base URL and logs the change', () => { + process.env.ONCHAIN_ACTIONS_BASE_URL = 'https://api.emberai.xyz/openapi.json'; + + const logger = vi.fn(); + const baseUrl = resolveOnchainActionsBaseUrl({ logger }); + + expect(baseUrl).toBe('https://api.emberai.xyz'); + expect(logger).toHaveBeenCalledWith( + 'Normalized onchain-actions endpoint from OpenAPI spec URL', + expect.objectContaining({ + endpoint: 'https://api.emberai.xyz/openapi.json', + baseUrl: 'https://api.emberai.xyz', + source: 'ONCHAIN_ACTIONS_BASE_URL', + }), + ); + }); + + it('returns the trimmed base URL for explicit overrides and logs the override', () => { + process.env.ONCHAIN_ACTIONS_BASE_URL = 'https://api.example.test/'; + + const logger = vi.fn(); + const baseUrl = resolveOnchainActionsBaseUrl({ logger }); + + expect(baseUrl).toBe('https://api.example.test'); + expect(logger).toHaveBeenCalledWith( + 'Using custom onchain-actions base URL', + expect.objectContaining({ + baseUrl: 'https://api.example.test', + source: 'ONCHAIN_ACTIONS_BASE_URL', + }), + ); + }); + + it('uses defaults without logging when no overrides are supplied', () => { + delete process.env.ONCHAIN_ACTIONS_BASE_URL; + delete process.env.ONCHAIN_ACTIONS_OPENAPI_URL; + + const logger = vi.fn(); + const baseUrl = resolveOnchainActionsBaseUrl({ logger }); + + expect(baseUrl).toBe('https://api.emberai.xyz'); + expect(logger).not.toHaveBeenCalled(); + }); +}); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.unit.test.ts new file mode 100644 index 00000000..0736c4bd --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.unit.test.ts @@ -0,0 +1,39 @@ +import { describe, expect, it } from 'vitest'; + +import type { ExecutionPlan } from '../core/executionPlan.js'; + +import { buildExecutionPlanArtifact, buildExecutionResultArtifact } from './artifacts.js'; + + +describe('buildExecutionPlanArtifact', () => { + it('wraps execution plan data into an artifact', () => { + const plan: ExecutionPlan = { + action: 'long', + request: { + amount: 160n, + walletAddress: '0xwallet', + chainId: '42161', + marketAddress: '0xmarket', + payTokenAddress: '0xusdc', + collateralTokenAddress: '0xusdc', + leverage: '2', + }, + }; + + const artifact = buildExecutionPlanArtifact(plan); + + expect(artifact.artifactId).toBe('gmx-allora-execution-plan'); + expect(artifact.name).toBe('gmx-allora-execution-plan.json'); + expect(artifact.parts[0]?.data).toEqual(plan); + }); + + it('wraps execution result data into an artifact', () => { + const artifact = buildExecutionResultArtifact({ + action: 'long', + ok: true, + }); + + expect(artifact.artifactId).toBe('gmx-allora-execution-result'); + expect(artifact.parts[0]?.data).toEqual({ action: 'long', ok: true }); + }); +}); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.unit.test.ts new file mode 100644 index 00000000..feddcdff --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.unit.test.ts @@ -0,0 +1,31 @@ +import { afterEach, describe, expect, it, vi } from 'vitest'; + +import { clearClientCache, getOnchainActionsClient } from './clientFactory.js'; + +const { onchainActionsCtorMock } = vi.hoisted(() => ({ + onchainActionsCtorMock: vi.fn(), +})); + +vi.mock('../clients/onchainActions.js', () => ({ + OnchainActionsClient: onchainActionsCtorMock, +})); + +vi.mock('viem/accounts', () => ({ + privateKeyToAccount: vi.fn(), +})); + +describe('clientFactory', () => { + afterEach(() => { + clearClientCache(); + onchainActionsCtorMock.mockReset(); + }); + + it('creates and caches the onchain actions client', () => { + const first = getOnchainActionsClient(); + const second = getOnchainActionsClient(); + + expect(first).toBe(second); + expect(onchainActionsCtorMock).toHaveBeenCalledTimes(1); + expect(onchainActionsCtorMock).toHaveBeenCalledWith('https://api.emberai.xyz'); + }); +}); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.unit.test.ts new file mode 100644 index 00000000..5860f911 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.unit.test.ts @@ -0,0 +1,64 @@ +import { describe, expect, it, vi } from 'vitest'; + +import type { ExecutionPlan } from '../core/executionPlan.js'; + +import { executePerpetualPlan } from './execution.js'; + +const createPerpetualLong = vi.fn(() => Promise.resolve(undefined)); +const createPerpetualShort = vi.fn(() => Promise.resolve(undefined)); +const createPerpetualClose = vi.fn(() => Promise.resolve(undefined)); + +const client = { + createPerpetualLong, + createPerpetualShort, + createPerpetualClose, +}; + +describe('executePerpetualPlan', () => { + it('skips execution when plan action is none', async () => { + const plan: ExecutionPlan = { action: 'none' }; + + const result = await executePerpetualPlan({ client, plan }); + + expect(result.ok).toBe(true); + expect(createPerpetualLong).not.toHaveBeenCalled(); + }); + + it('executes long plans', async () => { + const plan: ExecutionPlan = { + action: 'long', + request: { + amount: 100n, + walletAddress: '0x0000000000000000000000000000000000000001', + chainId: '42161', + marketAddress: '0xmarket', + payTokenAddress: '0xusdc', + collateralTokenAddress: '0xusdc', + leverage: '2', + }, + }; + + const result = await executePerpetualPlan({ client, plan }); + + expect(result.ok).toBe(true); + expect(createPerpetualLong).toHaveBeenCalled(); + }); + + it('captures execution errors', async () => { + createPerpetualClose.mockRejectedValueOnce(new Error('boom')); + const plan: ExecutionPlan = { + action: 'close', + request: { + walletAddress: '0x0000000000000000000000000000000000000001', + marketAddress: '0xmarket', + positionSide: 'long', + isLimit: false, + }, + }; + + const result = await executePerpetualPlan({ client, plan }); + + expect(result.ok).toBe(false); + expect(result.error).toContain('boom'); + }); +}); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/onboarding.int.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/onboarding.int.test.ts new file mode 100644 index 00000000..11a4f71a --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/onboarding.int.test.ts @@ -0,0 +1,148 @@ +import { afterEach, describe, expect, it, vi } from 'vitest'; + +import type { ClmmState } from '../src/workflow/context.js'; +import { collectDelegationsNode } from '../src/workflow/nodes/collectDelegations.js'; +import { collectFundingTokenInputNode } from '../src/workflow/nodes/collectFundingTokenInput.js'; +import { collectSetupInputNode } from '../src/workflow/nodes/collectSetupInput.js'; +import { prepareOperatorNode } from '../src/workflow/nodes/prepareOperator.js'; +import { FUNDING_TOKENS } from '../src/workflow/seedData.js'; + +const { copilotkitEmitStateMock, interruptMock } = vi.hoisted(() => ({ + copilotkitEmitStateMock: vi.fn(async () => undefined), + interruptMock: vi.fn<[], Promise>(), +})); + +vi.mock('@copilotkit/sdk-js/langgraph', () => ({ + copilotkitEmitState: copilotkitEmitStateMock, +})); + +vi.mock('@langchain/langgraph', async () => { + const actual = await vi.importActual('@langchain/langgraph'); + return { + ...actual, + interrupt: interruptMock, + }; +}); + +function buildBaseState(): ClmmState { + return { + messages: [], + copilotkit: { actions: [], context: [] }, + settings: { amount: undefined }, + private: { + mode: undefined, + pollIntervalMs: 5000, + streamLimit: -1, + cronScheduled: false, + bootstrapped: false, + }, + view: { + command: undefined, + task: undefined, + poolArtifact: undefined, + operatorInput: undefined, + onboarding: undefined, + fundingTokenInput: undefined, + selectedPool: undefined, + operatorConfig: undefined, + delegationBundle: undefined, + haltReason: undefined, + executionError: undefined, + delegationsBypassActive: true, + profile: { + agentIncome: undefined, + aum: undefined, + totalUsers: undefined, + apy: undefined, + chains: [], + protocols: [], + tokens: [], + pools: [], + allowedPools: [], + }, + activity: { telemetry: [], events: [] }, + metrics: { + lastSnapshot: undefined, + previousPrice: undefined, + cyclesSinceRebalance: 0, + staleCycles: 0, + iteration: 0, + latestCycle: undefined, + }, + transactionHistory: [], + }, + }; +} + +function mergeState(state: ClmmState, update: Partial): ClmmState { + return { + ...state, + ...update, + view: { + ...state.view, + ...update.view, + activity: update.view?.activity ?? state.view.activity, + metrics: update.view?.metrics ?? state.view.metrics, + profile: update.view?.profile ?? state.view.profile, + transactionHistory: update.view?.transactionHistory ?? state.view.transactionHistory, + }, + private: { + ...state.private, + ...update.private, + }, + settings: { + ...state.settings, + ...update.settings, + }, + copilotkit: { + ...state.copilotkit, + ...update.copilotkit, + }, + }; +} + +afterEach(() => { + copilotkitEmitStateMock.mockReset(); + interruptMock.mockReset(); +}); + +describe('GMX Allora onboarding (integration)', () => { + it('collects USDC allocation and prepares operator config', async () => { + const state = buildBaseState(); + + interruptMock.mockResolvedValueOnce({ + walletAddress: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', + usdcAllocation: 250, + targetMarket: 'BTC', + }); + + const setupUpdate = await collectSetupInputNode(state, {}); + const stateAfterSetup = mergeState(state, setupUpdate); + + const fundingUpdate = await collectFundingTokenInputNode(stateAfterSetup, {}); + const stateAfterFunding = mergeState(stateAfterSetup, fundingUpdate); + + const delegationsUpdate = await collectDelegationsNode(stateAfterFunding, {}); + const stateAfterDelegations = mergeState(stateAfterFunding, delegationsUpdate); + + const prepared = await prepareOperatorNode(stateAfterDelegations, {}); + + expect(prepared.view?.operatorConfig?.baseContributionUsd).toBe(250); + expect(prepared.view?.operatorConfig?.fundingTokenAddress).toBe( + FUNDING_TOKENS.find((token) => token.symbol === 'USDC')?.address, + ); + }); + + it('rejects setup input without USDC allocation', async () => { + const state = buildBaseState(); + + interruptMock.mockResolvedValueOnce({ + walletAddress: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', + targetMarket: 'BTC', + }); + + const setupUpdate = await collectSetupInputNode(state, {}); + + expect(setupUpdate.view?.haltReason).toContain('Invalid setup input'); + }); +}); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts new file mode 100644 index 00000000..bc4133bf --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts @@ -0,0 +1,251 @@ +import { describe, expect, it, vi } from 'vitest'; + +import type { AlloraInference } from '../src/clients/allora.js'; +import type { PerpetualMarket, PerpetualPosition } from '../src/clients/onchainActions.js'; +import type { ClmmState } from '../src/workflow/context.js'; +import { pollCycleNode } from '../src/workflow/nodes/pollCycle.js'; + +const { + copilotkitEmitStateMock, + fetchAlloraInferenceMock, + listPerpetualMarketsMock, + listPerpetualPositionsMock, + createPerpetualLongMock, + createPerpetualShortMock, + createPerpetualCloseMock, +} = vi.hoisted(() => ({ + copilotkitEmitStateMock: vi.fn(async () => undefined), + fetchAlloraInferenceMock: vi.fn<[], Promise>(), + listPerpetualMarketsMock: vi.fn<[], Promise>(), + listPerpetualPositionsMock: vi.fn<[], Promise>(), + createPerpetualLongMock: vi.fn<[], Promise>(), + createPerpetualShortMock: vi.fn<[], Promise>(), + createPerpetualCloseMock: vi.fn<[], Promise>(), +})); + +vi.mock('@copilotkit/sdk-js/langgraph', () => ({ + copilotkitEmitState: copilotkitEmitStateMock, +})); + +vi.mock('../src/clients/allora.js', async () => { + const actual = await vi.importActual( + '../src/clients/allora.js', + ); + return { + ...actual, + fetchAlloraInference: fetchAlloraInferenceMock, + }; +}); + +vi.mock('../src/workflow/clientFactory.js', () => ({ + getOnchainActionsClient: () => ({ + listPerpetualMarkets: listPerpetualMarketsMock, + listPerpetualPositions: listPerpetualPositionsMock, + createPerpetualLong: createPerpetualLongMock, + createPerpetualShort: createPerpetualShortMock, + createPerpetualClose: createPerpetualCloseMock, + }), +})); + +vi.mock('../src/workflow/cronScheduler.js', () => ({ + ensureCronForThread: vi.fn(), +})); + +function buildBaseState(): ClmmState { + return { + messages: [], + copilotkit: { actions: [], context: [] }, + settings: { amount: undefined }, + private: { + mode: undefined, + pollIntervalMs: 5000, + streamLimit: -1, + cronScheduled: false, + bootstrapped: true, + }, + view: { + command: undefined, + task: undefined, + poolArtifact: undefined, + operatorInput: undefined, + onboarding: undefined, + fundingTokenInput: undefined, + selectedPool: { + address: '0xmarket', + baseSymbol: 'BTC', + quoteSymbol: 'USDC', + token0: { symbol: 'BTC' }, + token1: { symbol: 'USDC' }, + maxLeverage: 2, + }, + operatorConfig: { + walletAddress: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', + baseContributionUsd: 200, + fundingTokenAddress: '0x1111111111111111111111111111111111111111', + targetMarket: { + address: '0xmarket', + baseSymbol: 'BTC', + quoteSymbol: 'USDC', + token0: { symbol: 'BTC' }, + token1: { symbol: 'USDC' }, + maxLeverage: 2, + }, + maxLeverage: 2, + }, + delegationBundle: undefined, + haltReason: undefined, + executionError: undefined, + delegationsBypassActive: true, + profile: { + agentIncome: undefined, + aum: undefined, + totalUsers: undefined, + apy: undefined, + chains: [], + protocols: [], + tokens: [], + pools: [], + allowedPools: [], + }, + activity: { telemetry: [], events: [] }, + metrics: { + lastSnapshot: undefined, + previousPrice: undefined, + cyclesSinceRebalance: 0, + staleCycles: 0, + iteration: 0, + latestCycle: undefined, + }, + transactionHistory: [], + }, + }; +} + +const baseMarket: PerpetualMarket = { + marketToken: { chainId: '42161', address: '0xmarket' }, + longFundingFee: '0', + shortFundingFee: '0', + longBorrowingFee: '0', + shortBorrowingFee: '0', + chainId: '42161', + name: 'GMX BTC/USD', + indexToken: { + tokenUid: { chainId: '42161', address: '0xbtc' }, + name: 'Bitcoin', + symbol: 'BTC', + isNative: false, + decimals: 8, + iconUri: null, + isVetted: true, + }, + longToken: { + tokenUid: { chainId: '42161', address: '0xusdc' }, + name: 'USD Coin', + symbol: 'USDC', + isNative: false, + decimals: 6, + iconUri: null, + isVetted: true, + }, + shortToken: { + tokenUid: { chainId: '42161', address: '0xusdc' }, + name: 'USD Coin', + symbol: 'USDC', + isNative: false, + decimals: 6, + iconUri: null, + isVetted: true, + }, +}; + +describe('pollCycleNode (integration)', () => { + it('emits telemetry and execution plan artifacts on open action', async () => { + fetchAlloraInferenceMock.mockResolvedValueOnce({ + topicId: 14, + combinedValue: 47000, + confidenceIntervalValues: [46000, 46500, 47000, 47500, 48000], + }); + listPerpetualMarketsMock.mockResolvedValueOnce([baseMarket]); + listPerpetualPositionsMock.mockResolvedValueOnce([]); + + const state = buildBaseState(); + const result = await pollCycleNode(state, {}); + + const update = (result as { update: ClmmState }).update; + const events = update.view?.activity.events ?? []; + const artifactIds = events + .filter((event) => event.type === 'artifact') + .map((event) => event.artifact.artifactId); + + expect(artifactIds).toContain('gmx-allora-telemetry'); + expect(artifactIds).toContain('gmx-allora-execution-plan'); + }); + + it('fails the cycle when no GMX market matches', async () => { + fetchAlloraInferenceMock.mockResolvedValueOnce({ + topicId: 14, + combinedValue: 47000, + confidenceIntervalValues: [46000, 46500, 47000, 47500, 48000], + }); + listPerpetualMarketsMock.mockResolvedValueOnce([]); + listPerpetualPositionsMock.mockResolvedValueOnce([]); + + const state = buildBaseState(); + const result = await pollCycleNode(state, {}); + + const update = (result as { update: ClmmState }).update; + expect(update.view?.haltReason).toContain('No GMX'); + }); + + it('blocks open trades when exposure exceeds caps', async () => { + fetchAlloraInferenceMock.mockResolvedValueOnce({ + topicId: 14, + combinedValue: 47000, + confidenceIntervalValues: [46000, 46500, 47000, 47500, 48000], + }); + listPerpetualMarketsMock.mockResolvedValueOnce([baseMarket]); + listPerpetualPositionsMock.mockResolvedValueOnce([ + { + chainId: '42161', + key: '0xpos', + contractKey: '0xcontract', + account: '0xwallet', + marketAddress: '0xmarket', + sizeInUsd: '1000', + sizeInTokens: '0.02', + collateralAmount: '500', + pendingBorrowingFeesUsd: '0', + increasedAtTime: '0', + decreasedAtTime: '0', + positionSide: 'long', + isLong: true, + fundingFeeAmount: '0', + claimableLongTokenAmount: '0', + claimableShortTokenAmount: '0', + isOpening: false, + pnl: '0', + positionFeeAmount: '0', + traderDiscountAmount: '0', + uiFeeAmount: '0', + collateralToken: { + tokenUid: { chainId: '42161', address: '0xusdc' }, + name: 'USD Coin', + symbol: 'USDC', + isNative: false, + decimals: 6, + iconUri: null, + isVetted: true, + }, + }, + ]); + + const state = buildBaseState(); + const result = await pollCycleNode(state, {}); + + const update = (result as { update: ClmmState }).update; + const latestCycle = update.view?.metrics.latestCycle; + + expect(latestCycle?.action).toBe('hold'); + expect(latestCycle?.reason).toContain('Exposure limit'); + }); +}); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/setup/vitest.setup.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/setup/vitest.setup.ts new file mode 100644 index 00000000..fd2c7551 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/setup/vitest.setup.ts @@ -0,0 +1,3 @@ +// Placeholder setup file referenced by the shared Vitest config. +// Projects can extend this stub with log controls or global mocks as needed. +export {}; From 4770f9617db239a072f05d368cd18882b39d1851 Mon Sep 17 00:00:00 2001 From: Sebas Date: Wed, 4 Feb 2026 20:17:01 -0800 Subject: [PATCH 10/70] fix(agent-gmx-allora): include smoke test harness --- .../agent-gmx-allora/tests/smoke/README.md | 19 ++ .../tests/smoke/gmx-allora-smoke.ts | 165 ++++++++++++++++++ 2 files changed, 184 insertions(+) create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/README.md create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/README.md b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/README.md new file mode 100644 index 00000000..88bfc49a --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/README.md @@ -0,0 +1,19 @@ +# GMX Allora Smoke Tests + +## Purpose + +Manual smoke checks for Phase 2 execution planning against onchain-actions and Allora. + +## Environment Variables + +- `SMOKE_WALLET`: Wallet address used for listing positions. +- `SMOKE_USDC_ADDRESS`: USDC token address for collateral/pay token. +- `ONCHAIN_ACTIONS_API_URL`: Optional override (default: `https://api.emberai.xyz`). +- `ALLORA_API_BASE_URL`: Optional override (default uses `resolveAlloraApiBaseUrl`). +- `ALLORA_API_KEY`: Allora API key. + +## Run + +```bash +pnpm tsx tests/smoke/gmx-allora-smoke.ts +``` diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts new file mode 100644 index 00000000..e3242489 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts @@ -0,0 +1,165 @@ +import { getAddress } from 'viem'; + +import { fetchAlloraInference } from '../../src/clients/allora.js'; +import { OnchainActionsClient } from '../../src/clients/onchainActions.js'; +import { + ALLORA_TOPIC_IDS, + resolveAlloraApiBaseUrl, + resolveAlloraApiKey, + resolveAlloraChainId, + resolveOnchainActionsBaseUrl, +} from '../../src/config/constants.js'; + +const resolveBaseUrl = (): string => + resolveOnchainActionsBaseUrl({ + endpoint: process.env['ONCHAIN_ACTIONS_API_URL'] ?? process.env['ONCHAIN_ACTIONS_BASE_URL'], + logger: (message, metadata) => { + console.info(`[smoke] ${message}`, metadata); + }, + }); + +const resolveWalletAddress = (): `0x${string}` | undefined => { + const value = process.env['SMOKE_WALLET']; + if (!value) { + return undefined; + } + if (!value.startsWith('0x')) { + throw new Error(`SMOKE_WALLET must be a hex address, got: ${value}`); + } + return value as `0x${string}`; +}; + +const resolveUsdcAddress = (): `0x${string}` | undefined => { + const value = process.env['SMOKE_USDC_ADDRESS']; + if (!value) { + return undefined; + } + if (!value.startsWith('0x')) { + throw new Error(`SMOKE_USDC_ADDRESS must be a hex address, got: ${value}`); + } + return value as `0x${string}`; +}; + +const baseUrl = resolveBaseUrl(); +const walletAddress = resolveWalletAddress(); +const usdcAddress = resolveUsdcAddress(); +const client = new OnchainActionsClient(baseUrl); + +const run = async () => { + console.log('[smoke] Using onchain-actions base URL:', baseUrl); + + const markets = await client.listPerpetualMarkets({ chainIds: ['42161'] }); + if (markets.length === 0) { + throw new Error('No perpetual markets returned.'); + } + console.log(`[smoke] Perpetual markets: ${markets.length}`); + + if (!walletAddress || !usdcAddress) { + throw new Error('SMOKE_WALLET and SMOKE_USDC_ADDRESS are required for GMX planning checks.'); + } + + const positions = await client.listPerpetualPositions({ walletAddress, chainIds: ['42161'] }); + console.log(`[smoke] Positions for ${walletAddress}: ${positions.length}`); + + const btcMarket = + markets.find( + (market) => + market.indexToken.symbol.toUpperCase() === 'BTC' && market.name.includes('GMX'), + ) ?? markets[0]; + if (!btcMarket) { + throw new Error('No GMX market found for smoke test.'); + } + + const marketAddress = getAddress(btcMarket.marketToken.address); + const payTokenAddress = getAddress(usdcAddress); + + const inference = await fetchAlloraInference({ + baseUrl: resolveAlloraApiBaseUrl(), + chainId: resolveAlloraChainId(), + topicId: ALLORA_TOPIC_IDS.BTC, + apiKey: resolveAlloraApiKey(), + }); + console.log('[smoke] Allora inference fetched', { topicId: inference.topicId }); + + const failures: string[] = []; + const warnings: string[] = []; + + const runStep = async ( + label: string, + fn: () => Promise, + tolerateWhen?: (message: string) => string | null, + ) => { + try { + await Promise.race([ + fn(), + new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), 15_000)), + ]); + console.log(`[smoke] ${label}: ok`); + } catch (error: unknown) { + const message = error instanceof Error ? error.message : String(error); + const tolerateReason = tolerateWhen ? tolerateWhen(message) : null; + if (tolerateReason) { + warnings.push(`${label}: ${tolerateReason}`); + console.warn(`[smoke] ${label}: warning -> ${tolerateReason}`); + return; + } + failures.push(`${label}: ${message}`); + console.error(`[smoke] ${label}: failed -> ${message}`); + } + }; + + await runStep( + 'perpetual long planning', + async () => { + await client.createPerpetualLong({ + amount: 100n, + walletAddress, + chainId: '42161', + marketAddress, + payTokenAddress, + collateralTokenAddress: payTokenAddress, + leverage: '2', + }); + }, + (message) => { + if (message.includes('Expected bigint')) { + return 'API expects bigint amount type (upstream mismatch)'; + } + return null; + }, + ); + + await runStep( + 'perpetual close planning', + async () => { + await client.createPerpetualClose({ + walletAddress, + marketAddress, + positionSide: 'long', + isLimit: false, + }); + }, + (message) => { + if (message.includes('No position or order found')) { + return 'no closeable positions for wallet'; + } + return null; + }, + ); + + if (failures.length > 0) { + throw new Error(`Smoke checks failed:\n- ${failures.join('\n- ')}`); + } + + if (warnings.length > 0) { + console.warn(`[smoke] Warnings:\n- ${warnings.join('\n- ')}`); + } + + console.log('[smoke] OK'); +}; + +run().catch((error: unknown) => { + const message = error instanceof Error ? error.message : String(error); + console.error('[smoke] FAILED:', message); + process.exitCode = 1; +}); From e5e61fda807a90fcd9283669a2e1828b15bab366 Mon Sep 17 00:00:00 2001 From: Sebas Date: Wed, 4 Feb 2026 20:17:06 -0800 Subject: [PATCH 11/70] fix(community): scaffold gmx-allora community agent package --- .../agents/gmx-allora-agent/.env.example | 27 +++++++++++++++++++ .../agents/gmx-allora-agent/package.json | 19 +++++++++++++ .../agents/gmx-allora-agent/tsconfig.json | 9 +++++++ 3 files changed, 55 insertions(+) create mode 100644 typescript/community/agents/gmx-allora-agent/.env.example create mode 100644 typescript/community/agents/gmx-allora-agent/package.json create mode 100644 typescript/community/agents/gmx-allora-agent/tsconfig.json diff --git a/typescript/community/agents/gmx-allora-agent/.env.example b/typescript/community/agents/gmx-allora-agent/.env.example new file mode 100644 index 00000000..af5732be --- /dev/null +++ b/typescript/community/agents/gmx-allora-agent/.env.example @@ -0,0 +1,27 @@ +# GMX Allora Agent Environment + +# Allora API (required) +ALLORA_API_KEY= + +# Optional: override Allora API base URL (default: https://api.allora.network/v2) +# ALLORA_API_BASE_URL= + +# Optional: Allora chain slug (example: mainnet) +# ALLORA_CHAIN_SLUG=mainnet + +# Optional: use explicit topic IDs if required by the implementation +# Discovered via Allora API (mainnet) on 2026-02-05 +ALLORA_BTC_8H_TOPIC_ID=14 +ALLORA_ETH_8H_TOPIC_ID=9 + +# Onchain-actions / trading execution +ARBITRUM_ONE_RPC_URL= +MNEMONIC= + +# Agent runtime +PORT=3012 +NODE_ENV=development +LOG_LEVEL=info + +# Optional: bypass delegation signing by using the agent wallet for execution +DELEGATIONS_BYPASS=false diff --git a/typescript/community/agents/gmx-allora-agent/package.json b/typescript/community/agents/gmx-allora-agent/package.json new file mode 100644 index 00000000..3268c0d6 --- /dev/null +++ b/typescript/community/agents/gmx-allora-agent/package.json @@ -0,0 +1,19 @@ +{ + "name": "gmx-allora-agent", + "version": "0.1.0", + "description": "GMX Allora trading agent", + "type": "module", + "main": "dist/index.js", + "scripts": { + "build": "tsc --build", + "lint": "eslint src", + "lint:fix": "eslint src --fix", + "dev": "tsx src/index.ts", + "start": "node dist/index.js", + "test": "vitest", + "test:watch": "vitest", + "test:ci": "vitest run --passWithNoTests", + "format": "prettier --write \"src/**/*.{ts,tsx,js,jsx}\"", + "format:check": "prettier --check \"src/**/*.{ts,tsx,js,jsx}\"" + } +} diff --git a/typescript/community/agents/gmx-allora-agent/tsconfig.json b/typescript/community/agents/gmx-allora-agent/tsconfig.json new file mode 100644 index 00000000..07a89bc1 --- /dev/null +++ b/typescript/community/agents/gmx-allora-agent/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "dist", + "types": ["node"] + }, + "include": ["src"] +} From b737ca6c6b34c9d81ea0ef8fb12d3806279000a8 Mon Sep 17 00:00:00 2001 From: Sebas Date: Thu, 5 Feb 2026 12:39:18 -0800 Subject: [PATCH 12/70] feat(web-ag-ui): refresh gmx allora workflows and tests --- typescript/clients/web-ag-ui/TESTING.md | 75 ++++++ .../apps/agent-gmx-allora/.env.test.example | 3 + .../apps/agent-gmx-allora/src/agent.ts | 35 ++- .../agent-gmx-allora/src/clients/allora.ts | 5 +- .../src/clients/onchainActions.unit.test.ts | 22 +- .../agent-gmx-allora/src/config/constants.ts | 8 +- .../src/config/constants.unit.test.ts | 1 - .../src/config/serviceConfig.ts | 4 +- .../apps/agent-gmx-allora/src/core/cycle.ts | 4 +- .../agent-gmx-allora/src/core/exposure.ts | 4 +- .../src/core/marketSelection.ts | 4 +- .../agent-gmx-allora/src/cronApiRunner.ts | 14 +- .../apps/agent-gmx-allora/src/domain/types.ts | 8 +- .../src/shallowMemorySaver.ts | 4 +- .../src/workflow/artifacts.unit.test.ts | 1 - .../agent-gmx-allora/src/workflow/context.ts | 5 +- .../src/workflow/execution.ts | 18 +- .../src/workflow/nodes/collectDelegations.ts | 5 +- .../nodes/collectFundingTokenInput.ts | 5 +- .../src/workflow/nodes/fireCommand.ts | 4 +- .../src/workflow/nodes/hireCommand.ts | 4 +- .../src/workflow/nodes/pollCycle.ts | 5 +- .../src/workflow/nodes/prepareOperator.ts | 4 +- .../src/workflow/nodes/runCommand.ts | 2 +- .../src/workflow/nodes/runCycleCommand.ts | 4 +- .../src/workflow/nodes/summarize.ts | 7 +- .../agent-gmx-allora/src/workflow/seedData.ts | 23 +- .../tests/happyPath.e2e.test.ts | 80 ++++++ .../agent-gmx-allora/tests/smoke/README.md | 2 +- .../tests/smoke/gmx-allora-smoke.ts | 5 +- .../clients/web-ag-ui/apps/web/package.json | 9 +- .../apps/web/src/app/api/agents/sync/route.ts | 21 +- .../web/src/app/hire-agents/[id]/page.tsx | 6 +- .../web-ag-ui/apps/web/src/app/layout.tsx | 2 +- .../web/src/components/AgentDetailPage.tsx | 230 ++++++++++-------- .../src/components/AgentRuntimeProvider.tsx | 9 +- .../apps/web/src/components/AppSidebar.tsx | 13 +- .../web/src/components/HireAgentsPage.tsx | 36 +-- .../apps/web/src/contexts/AgentContext.tsx | 5 +- .../web/src/contexts/AgentListContext.tsx | 24 +- .../apps/web/src/hooks/useAgentConnection.ts | 39 ++- .../web/src/hooks/useUpgradeToSmartAccount.ts | 8 +- 42 files changed, 488 insertions(+), 279 deletions(-) create mode 100644 typescript/clients/web-ag-ui/TESTING.md create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/happyPath.e2e.test.ts diff --git a/typescript/clients/web-ag-ui/TESTING.md b/typescript/clients/web-ag-ui/TESTING.md new file mode 100644 index 00000000..96c864de --- /dev/null +++ b/typescript/clients/web-ag-ui/TESTING.md @@ -0,0 +1,75 @@ +# Web AG-UI Agent Testing Notes + +This note documents how to correctly run tests for any given agent in `clients/web-ag-ui`, based on what was tried initially, what was wrong, and where we landed. + +## What I Tried Initially (Wrong) + +1. I ran repo-level commands from `typescript/`: + - `pnpm lint` + - `pnpm build` + +2. I also ran a general `pnpm install` in the monorepo root. + +These actions triggered unrelated packages (for example `clients/web-a2a`) and caused failures unrelated to the target agent. This made the results noisy and misleading for the actual work. + +Additionally, I attempted to add dependencies directly inside `apps/web`: +- `pnpm add -D prettier` + +That failed with: +- `ERR_PNPM_PATCH_NOT_APPLIED` because `clients/web-ag-ui` uses `patchedDependencies` at the workspace root, and installing inside a leaf app can conflict with those patches. + +## What Was Actually Correct + +All test and build workflows should be scoped to **`clients/web-ag-ui` only**, and ideally filtered to the specific app (agent) being worked on. + +### Correct Pattern (for any agent app) + +Use `pnpm -C` to scope to `clients/web-ag-ui` and then filter to the agent package name. + +Example for `agent-gmx-allora`: + +``` +pnpm -C typescript/clients/web-ag-ui --filter agent-gmx-allora run lint +pnpm -C typescript/clients/web-ag-ui --filter agent-gmx-allora run build +pnpm -C typescript/clients/web-ag-ui --filter agent-gmx-allora run test +``` + +This runs unit + integration + e2e (if defined) without touching unrelated workspaces. + +### Example for `apps/web` + +``` +pnpm -C typescript/clients/web-ag-ui --filter web run lint +pnpm -C typescript/clients/web-ag-ui --filter web run build +pnpm -C typescript/clients/web-ag-ui --filter web run test +``` + +Note: `apps/web` currently has no test suites, so the test scripts are no-ops (by design). + +## Practical Outcome / Final Approach + +- Always scope commands to `clients/web-ag-ui`. +- Always use `--filter ` to target the exact app you are testing. +- Avoid running monorepo-root scripts for this workstream. +- Avoid `pnpm add` inside leaf apps unless patches are fully resolved at the workspace root. + +## Recommended Quick Checklist + +For any agent in `clients/web-ag-ui/apps/`: + +1. Lint: + - `pnpm -C typescript/clients/web-ag-ui --filter run lint` + +2. Build: + - `pnpm -C typescript/clients/web-ag-ui --filter run build` + +3. Tests: + - `pnpm -C typescript/clients/web-ag-ui --filter run test` + +4. Format (if needed): + - `pnpm -C typescript/clients/web-ag-ui --filter run format` + +5. Format check: + - `pnpm -C typescript/clients/web-ag-ui --filter run format:check` + +This keeps the scope tight and avoids unrelated failures. diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example index 151b824c..44a1d78c 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example @@ -1,2 +1,5 @@ # CI-safe defaults for integration/e2e tests. # Copy this file to `.env.test` to override locally (file is gitignored). + +# Local onchain-actions dev server (default is https://api.emberai.xyz) +ONCHAIN_ACTIONS_BASE_URL=http://localhost:50051 diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/agent.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/agent.ts index 1835b93d..36b1308d 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/agent.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/agent.ts @@ -19,7 +19,11 @@ import { fireCommandNode } from './workflow/nodes/fireCommand.js'; import { hireCommandNode } from './workflow/nodes/hireCommand.js'; import { pollCycleNode } from './workflow/nodes/pollCycle.js'; import { prepareOperatorNode } from './workflow/nodes/prepareOperator.js'; -import { extractCommand, resolveCommandTarget, runCommandNode } from './workflow/nodes/runCommand.js'; +import { + extractCommand, + resolveCommandTarget, + runCommandNode, +} from './workflow/nodes/runCommand.js'; import { runCycleCommandNode } from './workflow/nodes/runCycleCommand.js'; import { summarizeNode } from './workflow/nodes/summarize.js'; import { syncStateNode } from './workflow/nodes/syncState.js'; @@ -162,7 +166,10 @@ async function updateCycleState( } catch (error: unknown) { const message = error instanceof Error ? error.message : typeof error === 'string' ? error : 'Unknown error'; - console.warn('[cron] Unable to fetch thread state before cycle update', { threadId, error: message }); + console.warn('[cron] Unable to fetch thread state before cycle update', { + threadId, + error: message, + }); } const view = existingView ? { ...existingView, command: 'cycle' } : { command: 'cycle' }; @@ -201,7 +208,9 @@ async function createRun(params: { if (response.status === 422) { const payloadText = await response.text(); - console.info(`[cron] Run rejected; thread busy (thread=${params.threadId})`, { detail: payloadText }); + console.info(`[cron] Run rejected; thread busy (thread=${params.threadId})`, { + detail: payloadText, + }); return undefined; } @@ -219,11 +228,14 @@ async function waitForRunStreamCompletion(params: { threadId: string; runId: string; }): Promise { - const response = await fetch(`${params.baseUrl}/threads/${params.threadId}/runs/${params.runId}/stream`, { - headers: { - Accept: 'text/event-stream', + const response = await fetch( + `${params.baseUrl}/threads/${params.threadId}/runs/${params.runId}/stream`, + { + headers: { + Accept: 'text/event-stream', + }, }, - }); + ); if (!response.ok) { const payloadText = await response.text(); throw new Error(`LangGraph run stream failed (${response.status}): ${payloadText}`); @@ -273,7 +285,9 @@ export async function runGraphOnce( } const status = await waitForRunStreamCompletion({ baseUrl, threadId, runId }); if (status === 'interrupted') { - console.warn('[cron] Graph interrupted awaiting operator input; supply input via UI and rerun.'); + console.warn( + '[cron] Graph interrupted awaiting operator input; supply input via UI and rerun.', + ); return; } if (status && status !== 'success') { @@ -288,10 +302,7 @@ export async function runGraphOnce( } } -export async function startCron( - threadId: string, - options?: { durability?: LangGraphDurability }, -) { +export async function startCron(threadId: string, options?: { durability?: LangGraphDurability }) { await runGraphOnce(threadId, options); } diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/allora.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/allora.ts index 389e7dba..fea9c5dc 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/allora.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/allora.ts @@ -63,7 +63,10 @@ export function parseAlloraInferenceResponse(payload: unknown): AlloraInference if (rawParse.success) { const parsed: RawInference = rawParse.data; const topicId = parseFiniteNumber(parsed.network_inferences.topic_id, 'topic_id'); - const combinedValue = parseFiniteNumber(parsed.network_inferences.combined_value, 'combined_value'); + const combinedValue = parseFiniteNumber( + parsed.network_inferences.combined_value, + 'combined_value', + ); const confidenceIntervalValues = parsed.confidence_interval_values.map((value) => parseFiniteNumber(value, 'confidence_interval_values'), ); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.unit.test.ts index ded8ac9e..82336a90 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.unit.test.ts @@ -120,11 +120,12 @@ describe('OnchainActionsClient', () => { }); it('posts perpetual long requests', async () => { - const fetchMock = vi.fn(() => - new Response(JSON.stringify({ ok: true }), { - status: 200, - headers: { 'Content-Type': 'application/json' }, - }), + const fetchMock = vi.fn( + () => + new Response(JSON.stringify({ ok: true }), { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }), ); vi.stubGlobal('fetch', fetchMock); @@ -144,11 +145,12 @@ describe('OnchainActionsClient', () => { }); it('posts perpetual close requests', async () => { - const fetchMock = vi.fn(() => - new Response(JSON.stringify({ ok: true }), { - status: 200, - headers: { 'Content-Type': 'application/json' }, - }), + const fetchMock = vi.fn( + () => + new Response(JSON.stringify({ ok: true }), { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }), ); vi.stubGlobal('fetch', fetchMock); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts index a98d6a83..ee1d5595 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts @@ -13,17 +13,13 @@ type OnchainActionsBaseUrlOptions = { export function resolveOnchainActionsBaseUrl(options?: OnchainActionsBaseUrlOptions): string { const envBaseUrl = process.env['ONCHAIN_ACTIONS_BASE_URL']; - const envOpenApiUrl = process.env['ONCHAIN_ACTIONS_OPENAPI_URL']; - const rawEndpoint = - options?.endpoint ?? envBaseUrl ?? envOpenApiUrl ?? DEFAULT_ONCHAIN_ACTIONS_BASE_URL; + const rawEndpoint = options?.endpoint ?? envBaseUrl ?? DEFAULT_ONCHAIN_ACTIONS_BASE_URL; const source = options?.endpoint ? 'override' : envBaseUrl ? 'ONCHAIN_ACTIONS_BASE_URL' - : envOpenApiUrl - ? 'ONCHAIN_ACTIONS_OPENAPI_URL' - : 'default'; + : 'default'; const endpoint = rawEndpoint.replace(/\/$/u, ''); const isOpenApi = endpoint.endsWith('/openapi.json'); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts index 6f6feb54..86017955 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts @@ -38,7 +38,6 @@ describe('config/constants', () => { it('uses defaults without logging when no overrides are supplied', () => { delete process.env.ONCHAIN_ACTIONS_BASE_URL; - delete process.env.ONCHAIN_ACTIONS_OPENAPI_URL; const logger = vi.fn(); const baseUrl = resolveOnchainActionsBaseUrl({ logger }); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/serviceConfig.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/serviceConfig.ts index 12b74505..8401b653 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/serviceConfig.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/serviceConfig.ts @@ -85,9 +85,7 @@ export function resolveLangGraphDefaults(): LangGraphDefaults { return cachedDefaults; } -export function resolveLangGraphDurability( - override?: LangGraphDurability, -): LangGraphDurability { +export function resolveLangGraphDurability(override?: LangGraphDurability): LangGraphDurability { if (override) { return override; } diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/cycle.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/cycle.ts index 2ac660fd..0e197cd8 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/cycle.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/cycle.ts @@ -72,8 +72,6 @@ export function buildCycleTelemetry(params: BuildCycleTelemetryParams): { return { telemetry, - nextCyclesSinceTrade: isTradeAction(decision.action) - ? 0 - : params.cyclesSinceTrade + 1, + nextCyclesSinceTrade: isTradeAction(decision.action) ? 0 : params.cyclesSinceTrade + 1, }; } diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/exposure.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/exposure.ts index 678de98b..27e84064 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/exposure.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/exposure.ts @@ -9,7 +9,9 @@ function parseUsd(value: string | undefined): number { return Number.isFinite(parsed) ? parsed : 0; } -function isTradeAction(action: GmxAlloraTelemetry['action']): action is 'open' | 'reduce' | 'close' { +function isTradeAction( + action: GmxAlloraTelemetry['action'], +): action is 'open' | 'reduce' | 'close' { return action === 'open' || action === 'reduce' || action === 'close'; } diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/marketSelection.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/marketSelection.ts index 5f84856b..f608507c 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/marketSelection.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/marketSelection.ts @@ -6,7 +6,9 @@ type MarketSelectionParams = { quoteSymbol: string; }; -export function selectGmxPerpetualMarket(params: MarketSelectionParams): PerpetualMarket | undefined { +export function selectGmxPerpetualMarket( + params: MarketSelectionParams, +): PerpetualMarket | undefined { const base = params.baseSymbol.toUpperCase(); const quote = params.quoteSymbol.toUpperCase(); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/cronApiRunner.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/cronApiRunner.ts index fe6c05fd..964f2c87 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/cronApiRunner.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/cronApiRunner.ts @@ -97,10 +97,7 @@ const buildCycleMessage = (): MessageInput => ({ content: JSON.stringify({ command: 'cycle' }), }); -const buildRunPayload = (params: { - graphId: string; - threadId: string; -}): RunCreatePayload => ({ +const buildRunPayload = (params: { graphId: string; threadId: string }): RunCreatePayload => ({ assistant_id: params.graphId, input: { messages: [buildCycleMessage()], @@ -142,11 +139,7 @@ const ensureThread = async (baseUrl: string, threadId: string) => { await parseJsonResponse(response, ThreadResponseSchema); }; -const createRun = async (params: { - baseUrl: string; - threadId: string; - graphId: string; -}) => { +const createRun = async (params: { baseUrl: string; threadId: string; graphId: string }) => { const response = await fetch(`${params.baseUrl}/threads/${params.threadId}/runs`, { method: 'POST', headers: { @@ -175,8 +168,7 @@ const startStarterCron = async () => { const graphId = process.env.LANGGRAPH_GRAPH_ID ?? 'agent-gmx-allora'; const threadId = resolveThreadId(); const intervalMs = resolveIntervalMs(); - const cronExpression = - process.env.STARTER_CRON_EXPRESSION ?? toCronExpression(intervalMs); + const cronExpression = process.env.STARTER_CRON_EXPRESSION ?? toCronExpression(intervalMs); if (!process.env.STARTER_THREAD_ID) { console.info(`[starter-cron] STARTER_THREAD_ID not provided; using ${threadId}`); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/domain/types.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/domain/types.ts index b9e4dddf..15a3f7e5 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/domain/types.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/domain/types.ts @@ -57,13 +57,7 @@ export type ResolvedGmxConfig = { maxLeverage: number; }; -export type GmxAlloraActionKind = - | 'signal' - | 'open' - | 'reduce' - | 'close' - | 'hold' - | 'cooldown'; +export type GmxAlloraActionKind = 'signal' | 'open' | 'reduce' | 'close' | 'hold' | 'cooldown'; export type GmxAlloraTelemetry = { cycle: number; diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/shallowMemorySaver.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/shallowMemorySaver.ts index f568ed4d..08cde575 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/shallowMemorySaver.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/shallowMemorySaver.ts @@ -12,9 +12,7 @@ type CheckpointConfig = RunnableConfig> & { type ThreadStorage = MemorySaver['storage'][string]; export class ShallowMemorySaver extends MemorySaver { - override async put( - ...args: Parameters - ): ReturnType { + override async put(...args: Parameters): ReturnType { const nextConfig = await super.put(...args); this.pruneHistory(nextConfig as CheckpointConfig); return nextConfig; diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.unit.test.ts index 0736c4bd..c288d300 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.unit.test.ts @@ -4,7 +4,6 @@ import type { ExecutionPlan } from '../core/executionPlan.js'; import { buildExecutionPlanArtifact, buildExecutionResultArtifact } from './artifacts.js'; - describe('buildExecutionPlanArtifact', () => { it('wraps execution plan data into an artifact', () => { const plan: ExecutionPlan = { diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/context.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/context.ts index 82f7f882..421f546d 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/context.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/context.ts @@ -361,7 +361,10 @@ const mergeViewState = (left: ClmmViewState, right?: Partial): Cl }; }; -const mergeCopilotkit = (left: CopilotkitState, right?: Partial): CopilotkitState => ({ +const mergeCopilotkit = ( + left: CopilotkitState, + right?: Partial, +): CopilotkitState => ({ actions: right?.actions ?? left.actions ?? [], context: right?.context ?? left.context ?? [], }); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.ts index 9ae71445..43613146 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.ts @@ -1,7 +1,6 @@ import type { OnchainActionsClient } from '../clients/onchainActions.js'; import type { ExecutionPlan } from '../core/executionPlan.js'; - export type ExecutionResult = { action: ExecutionPlan['action']; ok: boolean; @@ -9,7 +8,10 @@ export type ExecutionResult = { }; export async function executePerpetualPlan(params: { - client: Pick; + client: Pick< + OnchainActionsClient, + 'createPerpetualLong' | 'createPerpetualShort' | 'createPerpetualClose' + >; plan: ExecutionPlan; }): Promise { const { plan } = params; @@ -20,14 +22,20 @@ export async function executePerpetualPlan(params: { try { if (plan.action === 'long') { - await params.client.createPerpetualLong(plan.request as Parameters[0]); + await params.client.createPerpetualLong( + plan.request as Parameters[0], + ); return { action: plan.action, ok: true }; } if (plan.action === 'short') { - await params.client.createPerpetualShort(plan.request as Parameters[0]); + await params.client.createPerpetualShort( + plan.request as Parameters[0], + ); return { action: plan.action, ok: true }; } - await params.client.createPerpetualClose(plan.request as Parameters[0]); + await params.client.createPerpetualClose( + plan.request as Parameters[0], + ); return { action: plan.action, ok: true }; } catch (error: unknown) { const message = error instanceof Error ? error.message : String(error); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectDelegations.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectDelegations.ts index 90f51984..1d249ab7 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectDelegations.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectDelegations.ts @@ -135,7 +135,10 @@ export const collectDelegationsNode = async ( }); } - const delegatorAddress = normalizeHexAddress(operatorInput.walletAddress, 'delegator wallet address'); + const delegatorAddress = normalizeHexAddress( + operatorInput.walletAddress, + 'delegator wallet address', + ); const delegateeAddress = AGENT_WALLET_ADDRESS; const request: DelegationSigningInterrupt = { diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectFundingTokenInput.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectFundingTokenInput.ts index 650a4194..b288efc1 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectFundingTokenInput.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectFundingTokenInput.ts @@ -78,10 +78,7 @@ export const collectFundingTokenInputNode = async ( }; } - const normalizedFundingToken = normalizeHexAddress( - usdcOption.address, - 'funding token address', - ); + const normalizedFundingToken = normalizeHexAddress(usdcOption.address, 'funding token address'); const { task, statusEvent } = buildTaskStatus( awaitingInput.task, 'working', diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/fireCommand.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/fireCommand.ts index af7915b6..5ab0727e 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/fireCommand.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/fireCommand.ts @@ -40,7 +40,9 @@ export const fireCommandNode = async ( ? 'Agent fired. Workflow completed.' : 'Agent fired before onboarding completed.'; const { task, statusEvent } = buildTaskStatus(currentTask, terminalState, terminalMessage); - await copilotkitEmitState(config, { view: { task, activity: { events: [statusEvent], telemetry: [] } } }); + await copilotkitEmitState(config, { + view: { task, activity: { events: [statusEvent], telemetry: [] } }, + }); return { view: { diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/hireCommand.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/hireCommand.ts index 6e40509b..7801edda 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/hireCommand.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/hireCommand.ts @@ -33,7 +33,9 @@ export const hireCommandNode = async ( 'submitted', `Agent hired!${amount ? ` Trading ${amount} tokens...` : ''}`, ); - await copilotkitEmitState(config, { view: { task, activity: { events: [statusEvent], telemetry: [] } } }); + await copilotkitEmitState(config, { + view: { task, activity: { events: [statusEvent], telemetry: [] } }, + }); return { view: { diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts index 6368f49a..b8144011 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts @@ -146,7 +146,10 @@ export const pollCycleNode = async ( const failureMessage = `ERROR: No GMX ${selectedPool.baseSymbol}/${selectedPool.quoteSymbol} market available`; const { task, statusEvent } = buildTaskStatus(state.view.task, 'failed', failureMessage); await copilotkitEmitState(config, { - view: { task, activity: { events: [statusEvent], telemetry: state.view.activity.telemetry } }, + view: { + task, + activity: { events: [statusEvent], telemetry: state.view.activity.telemetry }, + }, }); return new Command({ update: { diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/prepareOperator.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/prepareOperator.ts index 9514f96b..f3ba61a2 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/prepareOperator.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/prepareOperator.ts @@ -92,9 +92,7 @@ export const prepareOperatorNode = async ( }); } - const targetMarket = MARKETS.find( - (market) => market.baseSymbol === operatorInput.targetMarket, - ); + const targetMarket = MARKETS.find((market) => market.baseSymbol === operatorInput.targetMarket); if (!targetMarket) { const failureMessage = `ERROR: Unsupported GMX market ${operatorInput.targetMarket}`; diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/runCommand.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/runCommand.ts index 21773b6d..cba782e3 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/runCommand.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/runCommand.ts @@ -55,7 +55,7 @@ export function extractCommand(messages: ClmmState['messages']): Command | null export function runCommandNode(state: ClmmState): ClmmState { const parsedCommand = extractCommand(state.messages); const nextCommand = - parsedCommand === 'sync' ? state.view.command : parsedCommand ?? state.view.command; + parsedCommand === 'sync' ? state.view.command : (parsedCommand ?? state.view.command); return { ...state, view: { diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/runCycleCommand.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/runCycleCommand.ts index 8e118a6f..938dbbef 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/runCycleCommand.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/runCycleCommand.ts @@ -13,7 +13,9 @@ export const runCycleCommandNode = async ( 'working', 'Running scheduled GMX Allora cycle.', ); - await copilotkitEmitState(config, { view: { task, activity: { events: [statusEvent], telemetry: [] } } }); + await copilotkitEmitState(config, { + view: { task, activity: { events: [statusEvent], telemetry: [] } }, + }); return { view: { diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/summarize.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/summarize.ts index 7726d572..2501b965 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/summarize.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/summarize.ts @@ -1,12 +1,7 @@ import { copilotkitEmitState } from '@copilotkit/sdk-js/langgraph'; import { buildSummaryArtifact } from '../artifacts.js'; -import { - buildTaskStatus, - type ClmmState, - type ClmmUpdate, - type TaskState, -} from '../context.js'; +import { buildTaskStatus, type ClmmState, type ClmmUpdate, type TaskState } from '../context.js'; type CopilotKitConfig = Parameters[0]; diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/seedData.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/seedData.ts index 8898c753..75da0fd1 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/seedData.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/seedData.ts @@ -1,17 +1,10 @@ import type { AlloraPrediction, GmxMarket } from '../domain/types.js'; -import type { - DelegationIntentSummary, - FundingTokenOption, - UnsignedDelegation, -} from './context.js'; +import type { DelegationIntentSummary, FundingTokenOption, UnsignedDelegation } from './context.js'; -export const AGENT_WALLET_ADDRESS = - '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' as const; -export const DELEGATION_MANAGER = - '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' as const; -export const DELEGATION_ENFORCER = - '0xcccccccccccccccccccccccccccccccccccccccc' as const; +export const AGENT_WALLET_ADDRESS = '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' as const; +export const DELEGATION_MANAGER = '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' as const; +export const DELEGATION_ENFORCER = '0xcccccccccccccccccccccccccccccccccccccccc' as const; const ZERO_WORD = `0x${'0'.repeat(64)}` as const; const SALT_WORD = `0x${'1'.repeat(64)}` as const; @@ -104,13 +97,9 @@ export const DELEGATION_DESCRIPTIONS = [ 'Use Allora predictions to size low-leverage trades.', ]; -export const DELEGATION_WARNINGS = [ - 'This delegation flow is for testing only.', -]; +export const DELEGATION_WARNINGS = ['This delegation flow is for testing only.']; -export function buildDelegations( - delegatorAddress: `0x${string}`, -): UnsignedDelegation[] { +export function buildDelegations(delegatorAddress: `0x${string}`): UnsignedDelegation[] { return [ { delegate: AGENT_WALLET_ADDRESS, diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/happyPath.e2e.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/happyPath.e2e.test.ts new file mode 100644 index 00000000..df514c17 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/happyPath.e2e.test.ts @@ -0,0 +1,80 @@ +import { describe, expect, it } from 'vitest'; +import { getAddress } from 'viem'; + +import { fetchAlloraInference } from '../src/clients/allora.js'; +import { OnchainActionsClient } from '../src/clients/onchainActions.js'; +import { + ALLORA_TOPIC_IDS, + resolveAlloraApiBaseUrl, + resolveAlloraApiKey, + resolveAlloraChainId, + resolveOnchainActionsBaseUrl, +} from '../src/config/constants.js'; + +const requiredEnv = ['ONCHAIN_ACTIONS_BASE_URL', 'SMOKE_WALLET', 'SMOKE_USDC_ADDRESS'] as const; +const hasRequiredEnv = requiredEnv.every((key) => Boolean(process.env[key])); +const itIf = hasRequiredEnv ? it : it.skip; + +const normalizeUrl = (value: string): string => value.replace(/\/$/u, ''); + +const resolveEnvAddress = (key: 'SMOKE_WALLET' | 'SMOKE_USDC_ADDRESS'): `0x${string}` => { + const raw = process.env[key]; + if (!raw) { + throw new Error(`${key} is required for happy path e2e.`); + } + return getAddress(raw) as `0x${string}`; +}; + +describe('GMX Allora happy path (e2e)', () => { + itIf('plans a perpetual long via local onchain-actions', async () => { + const originalBaseUrl = process.env['ONCHAIN_ACTIONS_BASE_URL']; + const baseUrl = process.env['ONCHAIN_ACTIONS_BASE_URL']; + if (!baseUrl) { + throw new Error('ONCHAIN_ACTIONS_BASE_URL is required for this test.'); + } + + try { + const resolved = resolveOnchainActionsBaseUrl(); + expect(resolved).toBe(normalizeUrl(baseUrl)); + + const client = new OnchainActionsClient(resolved); + const markets = await client.listPerpetualMarkets({ chainIds: ['42161'] }); + expect(markets.length).toBeGreaterThan(0); + + const walletAddress = resolveEnvAddress('SMOKE_WALLET'); + const payTokenAddress = resolveEnvAddress('SMOKE_USDC_ADDRESS'); + const market = + markets.find( + (entry) => + entry.indexToken.symbol.toUpperCase() === 'BTC' && entry.name.includes('GMX'), + ) ?? markets[0]; + + const inference = await fetchAlloraInference({ + baseUrl: resolveAlloraApiBaseUrl(), + chainId: resolveAlloraChainId(), + topicId: ALLORA_TOPIC_IDS.BTC, + apiKey: resolveAlloraApiKey(), + }); + expect(inference.topicId).toBe(ALLORA_TOPIC_IDS.BTC); + expect(Number.isFinite(inference.combinedValue)).toBe(true); + + await expect( + client.createPerpetualLong({ + amount: 100n, + walletAddress, + chainId: '42161', + marketAddress: getAddress(market.marketToken.address), + payTokenAddress, + collateralTokenAddress: payTokenAddress, + leverage: '2', + }), + ).resolves.toBeDefined(); + } finally { + if (originalBaseUrl === undefined) { + delete process.env['ONCHAIN_ACTIONS_BASE_URL']; + } else { + process.env['ONCHAIN_ACTIONS_BASE_URL'] = originalBaseUrl; + } + } + }); +}); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/README.md b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/README.md index 88bfc49a..adcb030a 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/README.md +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/README.md @@ -8,7 +8,7 @@ Manual smoke checks for Phase 2 execution planning against onchain-actions and A - `SMOKE_WALLET`: Wallet address used for listing positions. - `SMOKE_USDC_ADDRESS`: USDC token address for collateral/pay token. -- `ONCHAIN_ACTIONS_API_URL`: Optional override (default: `https://api.emberai.xyz`). +- `ONCHAIN_ACTIONS_BASE_URL`: Optional override (default: `https://api.emberai.xyz`). - `ALLORA_API_BASE_URL`: Optional override (default uses `resolveAlloraApiBaseUrl`). - `ALLORA_API_KEY`: Allora API key. diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts index e3242489..a1e17ea6 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts @@ -12,7 +12,7 @@ import { const resolveBaseUrl = (): string => resolveOnchainActionsBaseUrl({ - endpoint: process.env['ONCHAIN_ACTIONS_API_URL'] ?? process.env['ONCHAIN_ACTIONS_BASE_URL'], + endpoint: process.env['ONCHAIN_ACTIONS_BASE_URL'], logger: (message, metadata) => { console.info(`[smoke] ${message}`, metadata); }, @@ -125,6 +125,9 @@ const run = async () => { if (message.includes('Expected bigint')) { return 'API expects bigint amount type (upstream mismatch)'; } + if (message.includes('No long actions found')) { + return 'no long actions available (transactions-only env)'; + } return null; }, ); diff --git a/typescript/clients/web-ag-ui/apps/web/package.json b/typescript/clients/web-ag-ui/apps/web/package.json index bb883745..cdb84d2e 100644 --- a/typescript/clients/web-ag-ui/apps/web/package.json +++ b/typescript/clients/web-ag-ui/apps/web/package.json @@ -7,12 +7,15 @@ "build": "next build --webpack", "start": "next start", "lint": "eslint .", - "test": "pnpm test:unit", - "test:ci": "pnpm test:unit", + "lint:fix": "eslint . --fix", + "format": "prettier \"src/**/*.{ts,tsx,js,jsx}\" --write", + "format:check": "prettier \"src/**/*.{ts,tsx,js,jsx}\" --check", + "test": "pnpm test:unit && pnpm test:int && pnpm test:e2e", "test:watch": "vitest watch --config vitest.config.unit.ts", "test:unit": "vitest run --config vitest.config.unit.ts", "test:int": "vitest run --config vitest.config.unit.ts", - "test:e2e": "vitest run --config vitest.config.unit.ts", + "test:e2e": "vitest run --config vitest.config.e2e.ts", + "test:ci": "pnpm test:unit && pnpm test:int", "test:coverage": "vitest run --config vitest.config.unit.ts --coverage" }, "dependencies": { diff --git a/typescript/clients/web-ag-ui/apps/web/src/app/api/agents/sync/route.ts b/typescript/clients/web-ag-ui/apps/web/src/app/api/agents/sync/route.ts index 855a8dc8..1a3a27c0 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/app/api/agents/sync/route.ts +++ b/typescript/clients/web-ag-ui/apps/web/src/app/api/agents/sync/route.ts @@ -247,7 +247,10 @@ async function fetchViewState(baseUrl: string, threadId: string): Promise { const runtime = resolveAgentRuntime(parsed.data.agentId); if (!runtime) { - return NextResponse.json({ error: 'Unknown agent', agentId: parsed.data.agentId }, { status: 404 }); + return NextResponse.json( + { error: 'Unknown agent', agentId: parsed.data.agentId }, + { status: 404 }, + ); } const baseUrl = normalizeBaseUrl(runtime.deploymentUrl); @@ -308,18 +314,15 @@ export async function POST(request: NextRequest): Promise { transactionHistory: state?.view?.transactionHistory ?? null, task: task ?? null, taskId, - taskState: hasTask ? task?.taskStatus?.state ?? null : null, - haltReason: hasTask ? state?.view?.haltReason ?? null : null, - executionError: hasTask ? state?.view?.executionError ?? null : null, + taskState: hasTask ? (task?.taskStatus?.state ?? null) : null, + haltReason: hasTask ? (state?.view?.haltReason ?? null) : null, + executionError: hasTask ? (state?.view?.executionError ?? null) : null, }, { status: 200 }, ); } catch (error) { const message = error instanceof Error ? error.message : 'Unknown error'; console.error('[agent-sync] Sync failed', { agentId: parsed.data.agentId, error: message }); - return NextResponse.json( - { error: 'Sync failed', details: message }, - { status: 500 }, - ); + return NextResponse.json({ error: 'Sync failed', details: message }, { status: 500 }); } } diff --git a/typescript/clients/web-ag-ui/apps/web/src/app/hire-agents/[id]/page.tsx b/typescript/clients/web-ag-ui/apps/web/src/app/hire-agents/[id]/page.tsx index c294710a..18d79380 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/app/hire-agents/[id]/page.tsx +++ b/typescript/clients/web-ag-ui/apps/web/src/app/hire-agents/[id]/page.tsx @@ -5,11 +5,7 @@ import { useRouter } from 'next/navigation'; import { AgentDetailPage } from '@/components/AgentDetailPage'; import { useAgent } from '@/contexts/AgentContext'; -export default function AgentDetailRoute({ - params, -}: { - params: Promise<{ id: string }>; -}) { +export default function AgentDetailRoute({ params }: { params: Promise<{ id: string }> }) { const { id } = use(params); const router = useRouter(); const agent = useAgent(); diff --git a/typescript/clients/web-ag-ui/apps/web/src/app/layout.tsx b/typescript/clients/web-ag-ui/apps/web/src/app/layout.tsx index 43c3c898..31d4d251 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/app/layout.tsx +++ b/typescript/clients/web-ag-ui/apps/web/src/app/layout.tsx @@ -16,7 +16,7 @@ export default function RootLayout({ children, }: Readonly<{ children: React.ReactNode; - }>) { +}>) { const themeColor = '#fd6731'; return ( diff --git a/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.tsx b/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.tsx index 0d3493ca..35ed3428 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.tsx +++ b/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.tsx @@ -278,9 +278,7 @@ export function AgentDetailPage({ onClick={onFire} disabled={isFiring} className={`px-4 py-1.5 rounded-lg text-white text-sm font-medium transition-colors ${ - isFiring - ? 'bg-gray-600 cursor-wait' - : 'bg-[#fd6731] hover:bg-[#e55a28]' + isFiring ? 'bg-gray-600 cursor-wait' : 'bg-[#fd6731] hover:bg-[#e55a28]' }`} > {isFiring ? 'Firing...' : 'Fire'} @@ -363,15 +361,10 @@ export function AgentDetailPage({ /> )} - {resolvedTab === 'transactions' && ( - - )} + {resolvedTab === 'transactions' && } {resolvedTab === 'settings' && ( - + )} @@ -507,13 +500,7 @@ export function AgentDetailPage({ {activeTab === 'metrics' && ( - + )} @@ -588,35 +575,38 @@ function TransactionHistoryTab({ transactions }: TransactionHistoryTabProps) {

{transactions.length} transactions

- {transactions.slice(-10).reverse().map((tx, index) => ( -
-
-
-

- Cycle {tx.cycle} • {tx.action} -

-

- {tx.txHash ? `${tx.txHash.slice(0, 12)}…` : 'pending'} - {tx.reason ? ` · ${tx.reason}` : ''} -

-
-
- - {tx.status} - - {formatDate(tx.timestamp)} + {transactions + .slice(-10) + .reverse() + .map((tx, index) => ( +
+
+
+

+ Cycle {tx.cycle} • {tx.action} +

+

+ {tx.txHash ? `${tx.txHash.slice(0, 12)}…` : 'pending'} + {tx.reason ? ` · ${tx.reason}` : ''} +

+
+
+ + {tx.status} + + {formatDate(tx.timestamp)} +
-
- ))} + ))}
); @@ -943,8 +933,10 @@ function AgentBlockersTab({ const fundingOptions: FundingTokenOption[] = showFundingTokenForm ? [...(activeInterrupt as { options: FundingTokenOption[] }).options].sort((a, b) => { - const aValue = typeof a.valueUsd === 'number' && Number.isFinite(a.valueUsd) ? a.valueUsd : null; - const bValue = typeof b.valueUsd === 'number' && Number.isFinite(b.valueUsd) ? b.valueUsd : null; + const aValue = + typeof a.valueUsd === 'number' && Number.isFinite(a.valueUsd) ? a.valueUsd : null; + const bValue = + typeof b.valueUsd === 'number' && Number.isFinite(b.valueUsd) ? b.valueUsd : null; if (aValue !== null && bValue !== null && aValue !== bValue) { return bValue - aValue; } @@ -1035,7 +1027,11 @@ function AgentBlockersTab({ onInterruptSubmit?.(response); } catch (signError: unknown) { const message = - signError instanceof Error ? signError.message : typeof signError === 'string' ? signError : 'Unknown error'; + signError instanceof Error + ? signError.message + : typeof signError === 'string' + ? signError + : 'Unknown error'; setError(`Failed to sign delegations: ${message}`); } finally { setIsSigningDelegations(false); @@ -1104,19 +1100,19 @@ function AgentBlockersTab({
Latest Activity
- {telemetry.slice(-3).reverse().map((t, i) => ( -
-
- Cycle {t.cycle} - - {t.action} + {telemetry + .slice(-3) + .reverse() + .map((t, i) => ( +
+
+ Cycle {t.cycle} + + {t.action} +
+ {formatDate(t.timestamp)}
- {formatDate(t.timestamp)} -
- ))} + ))}
)} @@ -1125,8 +1121,8 @@ function AgentBlockersTab({

Set up agent

- Get this agent started working on your wallet in a few steps, delegate assets and set - your preferences. + Get this agent started working on your wallet in a few steps, delegate assets and set your + preferences.

@@ -1153,12 +1149,18 @@ function AgentBlockersTab({
-
Auto-selected yield
+
+ Auto-selected yield +

- The agent will automatically select the highest-yield YT market and rotate when yields change. + The agent will automatically select the highest-yield YT market and rotate + when yields change.

- Wallet: {connectedWalletAddress ? `${connectedWalletAddress.slice(0, 10)}…` : 'Not connected'} + Wallet:{' '} + {connectedWalletAddress + ? `${connectedWalletAddress.slice(0, 10)}…` + : 'Not connected'}

@@ -1208,12 +1210,18 @@ function AgentBlockersTab({
-
Allora Signal Source
+
+ Allora Signal Source +

- The agent consumes 8-hour Allora prediction feeds and enforces max 2x leverage. + The agent consumes 8-hour Allora prediction feeds and enforces max 2x + leverage.

- Wallet: {connectedWalletAddress ? `${connectedWalletAddress.slice(0, 10)}…` : 'Not connected'} + Wallet:{' '} + {connectedWalletAddress + ? `${connectedWalletAddress.slice(0, 10)}…` + : 'Not connected'}

@@ -1256,7 +1264,9 @@ function AgentBlockersTab({
- + Choose a token... {fundingOptions.map((option) => ( ))} @@ -1332,17 +1343,23 @@ function AgentBlockersTab({
Warnings
    - {(activeInterrupt as unknown as { warnings: string[] }).warnings.map((w) => ( -
  • {w}
  • - ))} + {(activeInterrupt as unknown as { warnings: string[] }).warnings.map( + (w) => ( +
  • {w}
  • + ), + )}
) : null}
-
What you are authorizing
+
+ What you are authorizing +
    - {(activeInterrupt as unknown as { descriptions?: string[] }).descriptions?.map((d) => ( + {( + activeInterrupt as unknown as { descriptions?: string[] } + ).descriptions?.map((d) => (
  • {d}
  • ))}
@@ -1377,9 +1394,9 @@ function AgentBlockersTab({ - +
{activeTab === 'metrics' && ( - + )} -
- - - - ); + + + + + ); } // Tab Button Component @@ -1613,17 +1608,63 @@ function PointsColumn({ metrics }: PointsColumnProps) { // Metrics Tab Component interface MetricsTabProps { - agentId: string; profile: AgentProfile; metrics: AgentMetrics; fullMetrics?: AgentViewMetrics; events: ClmmEvent[]; } -function MetricsTab({ agentId, profile, metrics, fullMetrics, events }: MetricsTabProps) { - if (agentId === 'agent-pendle') { - return ; - } +type UnknownRecord = Record; + +function asRecord(value: unknown): UnknownRecord | undefined { + return value && typeof value === 'object' ? (value as UnknownRecord) : undefined; +} + +function getNestedRecord(value: unknown, key: string): UnknownRecord | undefined { + const record = asRecord(value); + const nested = record ? record[key] : undefined; + return asRecord(nested); +} + +function getStringField(value: unknown, key: string): string | undefined { + const record = asRecord(value); + const candidate = record ? record[key] : undefined; + return typeof candidate === 'string' ? candidate : undefined; +} + +function getNumberField(value: unknown, key: string): number | undefined { + const record = asRecord(value); + const candidate = record ? record[key] : undefined; + return typeof candidate === 'number' ? candidate : undefined; +} + +function MetricsTab({ profile, metrics, fullMetrics, events }: MetricsTabProps) { + const isRecord = (value: unknown): value is Record => + typeof value === 'object' && value !== null && !Array.isArray(value); + + const formatArtifactLabel = (artifact: unknown): string => { + if (!isRecord(artifact)) return 'unknown'; + + const name = artifact['name']; + if (typeof name === 'string' && name.trim().length > 0) return name; + + const artifactId = artifact['artifactId']; + if (typeof artifactId === 'string' && artifactId.trim().length > 0) return artifactId; + + const type = artifact['type']; + if (typeof type === 'string' && type.trim().length > 0) return type; + + const id = artifact['id']; + if (typeof id === 'string' && id.trim().length > 0) return id; + + return 'unknown'; + }; + + const formatArtifactDescription = (artifact: unknown): string | null => { + if (!isRecord(artifact)) return null; + const description = artifact['description']; + return typeof description === 'string' && description.trim().length > 0 ? description : null; + }; const formatDate = (timestamp?: string) => { if (!timestamp) return '—'; @@ -1673,6 +1714,8 @@ function MetricsTab({ agentId, profile, metrics, fullMetrics, events }: MetricsT const poolSnapshot = fullMetrics?.lastSnapshot; const poolName = formatPoolPair(poolSnapshot); const positionTokens = latestSnapshot?.positionTokens ?? []; + const resolvedApy = metrics.apy ?? profile.apy; + const resolvedAum = metrics.aumUsd ?? profile.aum; return (
@@ -1683,13 +1726,13 @@ function MetricsTab({ agentId, profile, metrics, fullMetrics, events }: MetricsT
APY
- {metrics.apy !== undefined ? `${metrics.apy.toFixed(1)}%` : '—'} + {resolvedApy !== undefined ? `${resolvedApy.toFixed(1)}%` : '—'}
AUM
- {metrics.aumUsd !== undefined ? `$${metrics.aumUsd.toLocaleString()}` : '—'} + {resolvedAum !== undefined ? `$${resolvedAum.toLocaleString()}` : '—'}
@@ -1834,10 +1877,15 @@ function MetricsTab({ agentId, profile, metrics, fullMetrics, events }: MetricsT
{event.type === 'status' && event.message} {event.type === 'artifact' && - `Artifact: ${event.artifact?.type ?? 'unknown'}`} + `Artifact: ${formatArtifactLabel(event.artifact)}`} {event.type === 'dispatch-response' && `Response with ${event.parts?.length ?? 0} parts`}
+ {event.type === 'artifact' && formatArtifactDescription(event.artifact) && ( +
+ {formatArtifactDescription(event.artifact)} +
+ )}
))} @@ -1848,203 +1896,8 @@ function MetricsTab({ agentId, profile, metrics, fullMetrics, events }: MetricsT ); } -function PendleMetricsTab({ profile, metrics, fullMetrics, events }: Omit) { - const formatDate = (timestamp?: string) => { - if (!timestamp) return '—'; - const date = new Date(timestamp); - if (Number.isNaN(date.getTime())) return '—'; - return date.toLocaleString(undefined, { - month: 'short', - day: 'numeric', - hour: '2-digit', - minute: '2-digit', - }); - }; - - const strategy = fullMetrics?.pendle; - const latestCycle = fullMetrics?.latestCycle; - - const rewardLines = strategy?.position?.claimableRewards ?? []; - - return ( -
-
-

Strategy

-
-
-
Target YT
-
{strategy?.ytSymbol ?? '—'}
-
-
-
Underlying
-
{strategy?.underlyingSymbol ?? '—'}
-
-
-
Current APY
-
- {strategy?.currentApy !== undefined ? `${strategy.currentApy.toFixed(2)}%` : '—'} -
-
-
-
Contribution
-
- {strategy?.baseContributionUsd !== undefined ? `$${strategy.baseContributionUsd.toLocaleString()}` : '—'} -
-
-
-
-
-
Maturity
-
{strategy?.maturity ?? '—'}
-
-
-
Best APY
-
- {strategy?.bestApy !== undefined ? `${strategy.bestApy.toFixed(2)}%` : '—'} -
-
-
-
Delta
-
- {strategy?.apyDelta !== undefined ? `${strategy.apyDelta.toFixed(2)}%` : '—'} -
-
-
-
Funding Token
-
- {strategy?.fundingTokenAddress ? strategy.fundingTokenAddress.slice(0, 10) + '…' : '—'} -
-
-
-
- -
-

Position

-
-
-
PT
-
- {strategy?.position?.ptSymbol ? `${strategy.position.ptSymbol} ${strategy.position.ptAmount ?? ''}`.trim() : '—'} -
-
-
-
YT
-
- {strategy?.position?.ytSymbol ? `${strategy.position.ytSymbol} ${strategy.position.ytAmount ?? ''}`.trim() : '—'} -
-
-
-
APY
-
{metrics.apy !== undefined ? `${metrics.apy.toFixed(2)}%` : '—'}
-
-
-
AUM
-
{metrics.aumUsd !== undefined ? `$${metrics.aumUsd.toLocaleString()}` : '—'}
-
-
-
-
Claimable Rewards
- {rewardLines.length > 0 ? ( -
- {rewardLines.map((reward) => ( -
- {reward.symbol} - {reward.amount} -
- ))} -
- ) : ( -
- )} -
-
- -
- } - /> - } - /> - } - /> - } - /> -
- - {latestCycle && ( -
-

Latest Cycle

-
-
-
Cycle
-
{latestCycle.cycle}
-
-
-
Action
-
{latestCycle.action}
-
-
-
APY
-
- {latestCycle.apy !== undefined ? `${latestCycle.apy.toFixed(2)}%` : '—'} -
-
-
-
Timestamp
-
{formatDate(latestCycle.timestamp)}
-
-
- {latestCycle.reason && ( -
-
Reason
-
{latestCycle.reason}
-
- )} -
- )} - - {events.length > 0 && ( -
-

Activity Stream

-
- {events.slice(-10).reverse().map((event, i) => ( -
-
-
-
{event.type}
-
- {event.type === 'status' && event.message} - {event.type === 'artifact' && `Artifact: ${event.artifact?.type ?? 'unknown'}`} - {event.type === 'dispatch-response' && `Response with ${event.parts?.length ?? 0} parts`} -
-
-
- ))} -
-
- )} -
- ); -} +// GMX Allora uses the same Metrics/Activity layout as other agents. Any agent-specific +// surface area should be reflected through standard artifacts/events. interface MetricCardProps { label: string; diff --git a/typescript/clients/web-ag-ui/apps/web/src/utils/agentUi.ts b/typescript/clients/web-ag-ui/apps/web/src/utils/agentUi.ts new file mode 100644 index 00000000..0300033d --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/web/src/utils/agentUi.ts @@ -0,0 +1,4 @@ +export function resolveMetricsTabLabel(agentId: string): string { + void agentId; + return 'Metrics'; +} diff --git a/typescript/clients/web-ag-ui/apps/web/src/utils/agentUi.unit.test.ts b/typescript/clients/web-ag-ui/apps/web/src/utils/agentUi.unit.test.ts new file mode 100644 index 00000000..94239c05 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/web/src/utils/agentUi.unit.test.ts @@ -0,0 +1,11 @@ +import { describe, expect, it } from 'vitest'; + +import { resolveMetricsTabLabel } from './agentUi'; + +describe('agentUi', () => { + it('labels the metrics tab as Metrics', () => { + expect(resolveMetricsTabLabel('agent-gmx-allora')).toBe('Metrics'); + expect(resolveMetricsTabLabel('agent-clmm')).toBe('Metrics'); + expect(resolveMetricsTabLabel('agent-pendle')).toBe('Metrics'); + }); +}); diff --git a/typescript/clients/web-ag-ui/apps/web/tests/gmxAllora.system.e2e.test.ts b/typescript/clients/web-ag-ui/apps/web/tests/gmxAllora.system.e2e.test.ts new file mode 100644 index 00000000..cb0e77c6 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/web/tests/gmxAllora.system.e2e.test.ts @@ -0,0 +1,264 @@ +import crypto from 'node:crypto'; + +import { describe, expect, it } from 'vitest'; + +function requireEnv(name: string): string { + const value = process.env[name]; + if (!value) { + throw new Error(`Missing required env var: ${name}`); + } + return value; +} + +async function postJson(url: string, body: unknown): Promise<{ status: number; json: T }> { + const res = await fetch(url, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify(body), + }); + const json = (await res.json()) as T; + return { status: res.status, json }; +} + +type AgentSyncResponse = { + agentId: string; + error?: string; + details?: string; + profile: null | { protocols?: unknown }; + metrics: unknown; + activity: null | { telemetry?: unknown; events?: unknown }; +}; + +async function ensureThread(baseUrl: string, threadId: string, graphId: string): Promise { + const res = await fetch(`${baseUrl}/threads`, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ thread_id: threadId, if_exists: 'do_nothing', metadata: { graph_id: graphId } }), + }); + if (!res.ok) { + throw new Error(`Failed to create thread: ${res.status} ${await res.text()}`); + } + + const patch = await fetch(`${baseUrl}/threads/${threadId}`, { + method: 'PATCH', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ metadata: { graph_id: graphId } }), + }); + if (!patch.ok) { + throw new Error(`Failed to patch thread metadata: ${patch.status} ${await patch.text()}`); + } +} + +async function updateThreadState(params: { + baseUrl: string; + threadId: string; + values: unknown; +}): Promise { + const res = await fetch(`${params.baseUrl}/threads/${params.threadId}/state`, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + // Use a plain state update for non-message fields; `as_node` updates can be + // interpreted as a node execution and may not apply arbitrary `view/private` + // patches the way we expect. + body: JSON.stringify({ values: params.values }), + }); + if (!res.ok) { + throw new Error(`Failed to update thread state: ${res.status} ${await res.text()}`); + } +} + +async function sendCommand(params: { + baseUrl: string; + threadId: string; + command: 'cycle' | 'sync'; +}): Promise { + const message = { + id: crypto.randomUUID(), + role: 'user', + content: JSON.stringify({ command: params.command }), + }; + + const res = await fetch(`${params.baseUrl}/threads/${params.threadId}/state`, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ values: { messages: [message] }, as_node: 'runCommand' }), + }); + if (!res.ok) { + throw new Error(`Failed to send command: ${res.status} ${await res.text()}`); + } +} + +async function createRun(params: { + baseUrl: string; + threadId: string; + graphId: string; +}): Promise { + const res = await fetch(`${params.baseUrl}/threads/${params.threadId}/runs`, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ + assistant_id: params.graphId, + input: null, + config: { configurable: { thread_id: params.threadId }, durability: 'exit' }, + stream_mode: ['values'], + stream_resumable: true, + }), + }); + const text = await res.text(); + if (!res.ok) { + throw new Error(`Failed to create run: ${res.status} ${text}`); + } + const payload = JSON.parse(text) as { run_id?: string }; + if (!payload.run_id) { + throw new Error(`Run response missing run_id: ${text}`); + } + return payload.run_id; +} + +async function waitForRunCompletion(params: { + baseUrl: string; + threadId: string; + runId: string; + timeoutMs: number; +}): Promise { + const start = Date.now(); + const running = new Set(['pending', 'queued', 'running']); + + while (Date.now() - start < params.timeoutMs) { + const res = await fetch(`${params.baseUrl}/threads/${params.threadId}/runs/${params.runId}`); + const text = await res.text(); + if (!res.ok) { + throw new Error(`Failed to poll run status: ${res.status} ${text}`); + } + const payload = JSON.parse(text) as { status?: string }; + const status = (payload.status ?? '').toLowerCase(); + if (!running.has(status)) { + return; + } + await new Promise((r) => setTimeout(r, 250)); + } + + throw new Error(`Run did not complete within ${params.timeoutMs}ms`); +} + +describe('GMX Allora full system (web + agent runtime + onchain-actions)', () => { + it('web /api/agents/sync succeeds when agent runtime is up', async () => { + const webBaseUrl = requireEnv('WEB_E2E_BASE_URL'); + + const threadId = crypto.randomUUID(); + const { status, json } = await postJson(`${webBaseUrl}/api/agents/sync`, { + agentId: 'agent-gmx-allora', + threadId, + }); + + expect(status).toBe(200); + expect(json.error).toBeUndefined(); + expect(json.details).toBeUndefined(); + expect(json.profile).not.toBeNull(); + expect(Array.isArray(json.profile?.protocols)).toBe(true); + expect(json.metrics).not.toBeNull(); + }); + + it('cycle run produces telemetry/artifacts and the web sync can read them', async () => { + const webBaseUrl = requireEnv('WEB_E2E_BASE_URL'); + const langgraphBaseUrl = requireEnv('WEB_E2E_LANGGRAPH_BASE_URL'); + + const graphId = 'agent-gmx-allora'; + const threadId = crypto.randomUUID(); + + // Bootstrap via web sync (ensures the thread exists and the graph can respond). + const initial = await postJson(`${webBaseUrl}/api/agents/sync`, { + agentId: graphId, + threadId, + }); + expect(initial.status).toBe(200); + + await ensureThread(langgraphBaseUrl, threadId, graphId); + + // Prime state so the cycle path can run without a full interactive onboarding. + const selectedPool = { + address: '0x0000000000000000000000000000000000000001', + baseSymbol: 'BTC', + quoteSymbol: 'USDC', + token0: { symbol: 'BTC' }, + token1: { symbol: 'USDC' }, + maxLeverage: 2, + }; + + const operatorConfig = { + walletAddress: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', + baseContributionUsd: 250, + fundingTokenAddress: '0x1111111111111111111111111111111111111111', + targetMarket: selectedPool, + maxLeverage: 2, + }; + + await updateThreadState({ + baseUrl: langgraphBaseUrl, + threadId, + values: { + private: { + bootstrapped: true, + pollIntervalMs: 1000, + streamLimit: 10, + cronScheduled: false, + }, + view: { + delegationsBypassActive: true, + operatorConfig, + selectedPool, + // Preserve shape expected by reducers. + activity: { telemetry: [], events: [] }, + profile: { chains: [], protocols: [], tokens: [], pools: [], allowedPools: [] }, + metrics: { iteration: 0, previousPrice: 47000, cyclesSinceRebalance: 0, staleCycles: 0 }, + transactionHistory: [], + }, + }, + }); + + // Now send the command using the same `as_node` pattern the web route uses. + await sendCommand({ baseUrl: langgraphBaseUrl, threadId, command: 'cycle' }); + + const runId = await createRun({ baseUrl: langgraphBaseUrl, threadId, graphId }); + await waitForRunCompletion({ baseUrl: langgraphBaseUrl, threadId, runId, timeoutMs: 120_000 }); + + const after = await postJson(`${webBaseUrl}/api/agents/sync`, { + agentId: graphId, + threadId, + }); + expect(after.status).toBe(200); + expect(after.json.error).toBeUndefined(); + + const activity = after.json.activity as { telemetry?: unknown; events?: unknown } | null; + expect(activity).not.toBeNull(); + expect(Array.isArray(activity?.telemetry)).toBe(true); + const telemetry = activity?.telemetry as unknown[]; + if (telemetry.length === 0) { + const threadState = await fetch(`${langgraphBaseUrl}/threads/${threadId}/state`).then( + async (res) => ({ + status: res.status, + body: await res.text(), + }), + ); + throw new Error( + [ + 'Expected cycle run telemetry, but got empty telemetry array.', + `web sync: ${JSON.stringify(after.json)}`, + `langgraph state (status=${threadState.status}): ${threadState.body}`, + ].join('\n'), + ); + } + expect(telemetry.length).toBeGreaterThan(0); + expect(Array.isArray(activity?.events)).toBe(true); + + const events = activity?.events as Array>; + const hasPlanArtifact = events.some( + (event) => + event?.type === 'artifact' && + typeof event.artifact === 'object' && + event.artifact !== null && + (event.artifact as Record).artifactId === 'gmx-allora-execution-plan', + ); + expect(hasPlanArtifact).toBe(true); + }, 180_000); +}); diff --git a/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts b/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts new file mode 100644 index 00000000..95e7a7c3 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts @@ -0,0 +1,523 @@ +import { execFileSync, spawn } from 'node:child_process'; +import crypto from 'node:crypto'; +import { fileURLToPath } from 'node:url'; +import path from 'node:path'; +import http from 'node:http'; +import net from 'node:net'; +import fs from 'node:fs'; + +type Cleanup = () => Promise | void; +type Child = ReturnType; + +function resolvePnpmInvocation(): { command: string; prefixArgs: string[] } { + const execPath = process.env.npm_execpath; + const nodePath = process.env.npm_node_execpath; + if (execPath && nodePath && execPath.endsWith('.js')) { + return { command: nodePath, prefixArgs: [execPath] }; + } + return { command: 'pnpm', prefixArgs: [] }; +} + +function resolveForgeRoot(): string { + const currentFilePath = fileURLToPath(import.meta.url); + const marker = `${path.sep}worktrees${path.sep}`; + const index = currentFilePath.lastIndexOf(marker); + if (index < 0) { + return process.cwd(); + } + return currentFilePath.slice(0, index); +} + +function resolveOnchainActionsDir(): string { + const override = process.env['ONCHAIN_ACTIONS_WORKTREE_DIR']; + if (override && override.trim().length > 0) { + return override.trim(); + } + return path.join(resolveForgeRoot(), 'worktrees', 'onchain-actions-001'); +} + +function resolvePnpmBin(): string { + const home = process.env['HOME']; + const toolBases = home + ? [ + path.join(home, 'Library', 'pnpm', '.tools', 'pnpm'), + path.join(home, '.local', 'share', 'pnpm', '.tools', 'pnpm'), + ] + : []; + + const toolCandidates: string[] = []; + for (const base of toolBases) { + try { + const entries = fs.readdirSync(base, { withFileTypes: true }); + for (const entry of entries) { + if (!entry.isDirectory()) continue; + const bin = path.join(base, entry.name, 'bin', 'pnpm'); + if (fs.existsSync(bin)) { + toolCandidates.push(bin); + } + } + } catch { + // ignore + } + } + + const candidates = [ + process.env['PNPM_BINARY'], + ...toolCandidates, + '/usr/local/bin/pnpm', + '/opt/homebrew/bin/pnpm', + 'pnpm', + ].filter((value): value is string => Boolean(value && value.trim().length > 0)); + + let best: { bin: string; major: number } | null = null; + + for (const candidate of candidates) { + if (candidate.includes(path.sep) && !fs.existsSync(candidate)) { + continue; + } + try { + const version = execFileSync(candidate, ['-v'], { encoding: 'utf8' }).trim(); + const major = Number(version.split('.')[0] ?? NaN); + if (!Number.isFinite(major)) { + continue; + } + if (!best || major > best.major) { + best = { bin: candidate, major }; + } + // Prefer pnpm v10+ immediately. + if (major >= 10) { + return candidate; + } + } catch { + continue; + } + } + + return best?.bin ?? 'pnpm'; +} + +async function getFreePort(): Promise { + return await new Promise((resolve, reject) => { + const server = net.createServer(); + server.once('error', reject); + server.listen(0, '127.0.0.1', () => { + const address = server.address(); + if (!address || typeof address === 'string') { + server.close(() => reject(new Error('Unable to resolve an ephemeral port.'))); + return; + } + const port = address.port; + server.close((closeErr) => (closeErr ? reject(closeErr) : resolve(port))); + }); + }); +} + +async function waitForHttp(params: { + url: string; + timeoutMs: number; + child?: Child; + childOutput?: string[]; + predicate?: (res: Response) => boolean; +}): Promise { + const start = Date.now(); + const predicate = params.predicate ?? ((res) => res.status >= 200); + + while (Date.now() - start < params.timeoutMs) { + if (params.child && params.child.exitCode !== null) { + const logs = params.childOutput?.slice(-80).join('\n') ?? ''; + throw new Error( + `Server process exited before becoming ready (code=${params.child.exitCode}).` + + (logs ? `\nLast logs:\n${logs}` : ''), + ); + } + + try { + const res = await fetch(params.url); + if (predicate(res)) { + return; + } + } catch { + // Ignore until timeout. + } + + await new Promise((r) => setTimeout(r, 250)); + } + + const logs = params.childOutput?.slice(-80).join('\n') ?? ''; + throw new Error(`Timed out waiting for ${params.url}` + (logs ? `\nLast logs:\n${logs}` : '')); +} + +function spawnProcess(params: { + cwd: string; + args: string[]; + env?: NodeJS.ProcessEnv; +}): { child: Child; output: string[]; cleanup: Cleanup } { + const pnpm = resolvePnpmInvocation(); + const child = spawn(pnpm.command, [...pnpm.prefixArgs, ...params.args], { + cwd: params.cwd, + env: { ...process.env, ...params.env }, + stdio: 'pipe', + }); + + const output: string[] = []; + child.stdout?.on('data', (chunk: Buffer) => output.push(chunk.toString('utf8'))); + child.stderr?.on('data', (chunk: Buffer) => output.push(chunk.toString('utf8'))); + + const cleanup: Cleanup = async () => { + if (child.exitCode !== null) return; + child.kill('SIGTERM'); + await new Promise((r) => setTimeout(r, 2_000)); + if (child.exitCode === null) { + child.kill('SIGKILL'); + } + }; + + return { child, output, cleanup }; +} + +async function delay(ms: number): Promise { + await new Promise((r) => setTimeout(r, ms)); +} + +async function waitForTcpPort(params: { host: string; port: number; timeoutMs: number }): Promise { + const deadline = Date.now() + params.timeoutMs; + let lastError: unknown; + + while (Date.now() < deadline) { + try { + await new Promise((resolve, reject) => { + const socket = net.connect({ host: params.host, port: params.port }); + socket.once('connect', () => { + socket.end(); + resolve(); + }); + socket.once('error', reject); + }); + return; + } catch (error: unknown) { + lastError = error; + } + + await delay(250); + } + + const message = lastError instanceof Error ? lastError.message : String(lastError); + throw new Error(`Timed out waiting for TCP ${params.host}:${params.port}: ${message}`); +} + +async function waitForHttpOk(url: string, timeoutMs: number): Promise { + const deadline = Date.now() + timeoutMs; + let lastError: unknown; + + while (Date.now() < deadline) { + try { + const response = await fetch(url); + if (response.ok) { + return; + } + lastError = new Error(`Non-OK response: ${response.status}`); + } catch (error: unknown) { + lastError = error; + } + + await delay(250); + } + + const message = lastError instanceof Error ? lastError.message : String(lastError); + throw new Error(`Timed out waiting for ${url}: ${message}`); +} + +async function waitForNonEmptyMarkets(url: string, timeoutMs: number): Promise { + const deadline = Date.now() + timeoutMs; + let lastError: unknown; + + while (Date.now() < deadline) { + try { + const response = await fetch(url); + if (!response.ok) { + lastError = new Error(`Non-OK response: ${response.status}`); + await delay(500); + continue; + } + const payload = (await response.json()) as { markets?: unknown[] }; + const count = Array.isArray(payload.markets) ? payload.markets.length : 0; + if (count > 0) { + return; + } + lastError = new Error('Markets response was empty'); + } catch (error: unknown) { + lastError = error; + } + + await delay(1000); + } + + const message = lastError instanceof Error ? lastError.message : String(lastError); + throw new Error(`Timed out waiting for non-empty markets from ${url}: ${message}`); +} + +async function runCommandAndWait(cmd: string, args: string[], cwd: string): Promise { + const child = spawn(cmd, args, { + cwd, + env: process.env, + stdio: 'inherit', + }); + + await new Promise((resolve, reject) => { + child.once('error', reject); + child.once('exit', (code) => { + if (code === 0) { + resolve(); + return; + } + reject(new Error(`${cmd} ${args.join(' ')} exited with code ${code ?? 'null'}`)); + }); + }); +} + +async function dockerCompose(dir: string, args: string[]): Promise { + await runCommandAndWait('docker', ['compose', ...args], dir); +} + +async function startOnchainActions(): Promise<{ baseUrl: string; cleanup: Cleanup }> { + const ONCHAIN_ACTIONS_DIR = resolveOnchainActionsDir(); + const MEMGRAPH_COMPOSE_FILE = + process.env['ONCHAIN_ACTIONS_MEMGRAPH_COMPOSE_FILE'] ?? + path.join(ONCHAIN_ACTIONS_DIR, 'compose.dev.db.yaml'); + + const ONCHAIN_ACTIONS_PORT = 50051; + const baseUrl = `http://127.0.0.1:${ONCHAIN_ACTIONS_PORT}`; + const HEALTH_URL = `${baseUrl}/health`; + const MARKETS_URL = `${baseUrl}/perpetuals/markets?chainIds=42161`; + + // Ensure tests target the local server started by this setup. + process.env['ONCHAIN_ACTIONS_BASE_URL'] = baseUrl; + + await dockerCompose(ONCHAIN_ACTIONS_DIR, ['-f', MEMGRAPH_COMPOSE_FILE, 'up', '-d', 'memgraph']); + await waitForTcpPort({ host: '127.0.0.1', port: 7687, timeoutMs: 30_000 }); + + const pnpmBin = resolvePnpmBin(); + try { + const version = execFileSync(pnpmBin, ['-v'], { encoding: 'utf8' }).trim(); + console.log('[web-e2e] pnpm for onchain-actions', { pnpmBin, version }); + if (!version.startsWith('10.')) { + console.warn('[web-e2e] pnpm version for onchain-actions is not v10+', { pnpmBin, version }); + } + } catch (error) { + console.warn('[web-e2e] Unable to read pnpm version for onchain-actions', { + pnpmBin, + error: error instanceof Error ? error.message : String(error), + }); + } + const server = spawn(pnpmBin, ['dev'], { + cwd: ONCHAIN_ACTIONS_DIR, + env: { + ...process.env, + PORT: String(ONCHAIN_ACTIONS_PORT), + MEMGRAPH_HOST: 'localhost', + MEMGRAPH_BOLT_PORT: '7687', + MEMGRAPH_LAB_PORT: '7444', + TEST_ENV: 'mock', + SKIP_FIRST_IMPORT: 'false', + ENABLE_CONTRACT_SNIPER: 'false', + PRE_FETCH_GMX_MARKET_QUERY: 'false', + GMX_SKIP_SIMULATION: 'true', + COINGECKO_API_KEY: process.env['COINGECKO_API_KEY'] ?? '', + COINGECKO_USE_PRO: process.env['COINGECKO_USE_PRO'] ?? 'false', + SQUID_INTEGRATOR_ID: process.env['SQUID_INTEGRATOR_ID'] ?? 'test', + DUNE_API_KEY: process.env['DUNE_API_KEY'] ?? 'test', + BIRDEYE_API_KEY: process.env['BIRDEYE_API_KEY'] ?? '', + PENDLE_CHAIN_IDS: process.env['PENDLE_CHAIN_IDS'] ?? '42161', + ALGEBRA_CHAIN_IDS: process.env['ALGEBRA_CHAIN_IDS'] ?? '42161', + GMX_CHAIN_IDS: process.env['GMX_CHAIN_IDS'] ?? '42161', + SERVICE_WALLET_PRIVATE_KEY: process.env['SERVICE_WALLET_PRIVATE_KEY'] ?? `0x${'1'.repeat(64)}`, + DUST_CHAIN_ID: process.env['DUST_CHAIN_ID'] ?? '1', + DUST_CHAIN_RECEIVER_ADDRESS: + process.env['DUST_CHAIN_RECEIVER_ADDRESS'] ?? '0x0000000000000000000000000000000000000000', + }, + stdio: 'inherit', + }); + + let exitError: Error | undefined; + server.once('exit', (code, signal) => { + if (code === 0) return; + exitError = new Error( + `onchain-actions exited unexpectedly (code=${code ?? 'null'}, signal=${signal ?? 'null'})`, + ); + }); + server.once('error', (error) => { + exitError = error instanceof Error ? error : new Error(String(error)); + }); + + await waitForHttpOk(HEALTH_URL, 60_000); + if (exitError) throw exitError; + + await waitForNonEmptyMarkets(MARKETS_URL, 120_000); + if (exitError) throw exitError; + + return { + baseUrl, + cleanup: async () => { + if (server.exitCode === null) { + server.kill('SIGTERM'); + for (let i = 0; i < 20; i += 1) { + if (server.exitCode !== null) break; + await delay(100); + } + if (server.exitCode === null) { + server.kill('SIGKILL'); + } + } + await dockerCompose(ONCHAIN_ACTIONS_DIR, ['-f', MEMGRAPH_COMPOSE_FILE, 'down', '--remove-orphans']); + }, + }; +} + +async function startMockAlloraServer(): Promise<{ + baseUrl: string; + cleanup: Cleanup; +}> { + const server = http.createServer((req, res) => { + if (!req.url) { + res.statusCode = 400; + res.end('Missing URL'); + return; + } + + const url = new URL(req.url, 'http://127.0.0.1'); + const match = url.pathname.match(/^\/v2\/allora\/consumer\/(.+)$/u); + if (!match) { + res.statusCode = 404; + res.end('not found'); + return; + } + + const topicId = url.searchParams.get('allora_topic_id') ?? '0'; + const combined = topicId === '14' ? '48000' : topicId === '9' ? '2600' : '100'; + + res.setHeader('content-type', 'application/json'); + res.statusCode = 200; + res.end( + JSON.stringify({ + status: true, + data: { + inference_data: { + topic_id: topicId, + network_inference_normalized: combined, + }, + }, + }), + ); + }); + + await new Promise((resolve, reject) => { + server.once('error', reject); + server.listen(0, '127.0.0.1', () => resolve()); + }); + + const address = server.address(); + if (!address || typeof address === 'string') { + server.close(); + throw new Error('Failed to resolve mock Allora server address.'); + } + + const baseUrl = `http://127.0.0.1:${address.port}`; + + return { + baseUrl, + cleanup: async () => { + await new Promise((resolve) => server.close(() => resolve())); + }, + }; +} + +export default async function systemGlobalSetup(): Promise { + // 1) Start onchain-actions + memgraph. + const onchain = await startOnchainActions(); + const onchainCleanup = onchain.cleanup; + const onchainBaseUrl = onchain.baseUrl; + + // 2) Start mock Allora API and point the agent runtime at it. + const mockAllora = await startMockAlloraServer(); + process.env.ALLORA_API_BASE_URL = mockAllora.baseUrl; + + // 3) Start LangGraph runtime for agent-gmx-allora. + const langgraphPort = await getFreePort(); + const langgraphBaseUrl = `http://127.0.0.1:${langgraphPort}`; + process.env.LANGGRAPH_GMX_ALLORA_DEPLOYMENT_URL = langgraphBaseUrl; + process.env.WEB_E2E_LANGGRAPH_BASE_URL = langgraphBaseUrl; + + const langgraph = spawnProcess({ + cwd: process.cwd(), // apps/web + args: [ + 'exec', + 'langgraphjs', + 'dev', + '--port', + String(langgraphPort), + '--host', + '127.0.0.1', + '--no-browser', + '--config', + '../agent-gmx-allora', + ], + env: { + ...process.env, + DELEGATIONS_BYPASS: 'true', + GMX_ALLORA_MODE: 'debug', + ONCHAIN_ACTIONS_BASE_URL: onchainBaseUrl, + ALLORA_API_BASE_URL: mockAllora.baseUrl, + }, + }); + + // Server returns 404 on unknown thread state, but that still proves it's accepting connections. + await waitForHttp({ + url: `${langgraphBaseUrl}/threads/00000000-0000-0000-0000-000000000000/state`, + timeoutMs: 60_000, + child: langgraph.child, + childOutput: langgraph.output, + predicate: (res) => res.status === 404, + }); + + // 4) Start the web app server. + const webPort = await getFreePort(); + const webBaseUrl = `http://127.0.0.1:${webPort}`; + process.env.WEB_E2E_BASE_URL = webBaseUrl; + + // If a previous dev server crashed, it can leave a stale lock file behind. + try { + const lockPath = path.join(process.cwd(), '.next', 'dev', 'lock'); + if (fs.existsSync(lockPath)) { + fs.unlinkSync(lockPath); + } + } catch { + // ignore + } + + const web = spawnProcess({ + cwd: process.cwd(), // apps/web + args: ['dev', '-p', String(webPort), '-H', '127.0.0.1'], + env: { + ...process.env, + LANGGRAPH_GMX_ALLORA_DEPLOYMENT_URL: langgraphBaseUrl, + // Keep other agents from failing if the UI touches them. + LANGGRAPH_DEPLOYMENT_URL: langgraphBaseUrl, + LANGGRAPH_PENDLE_DEPLOYMENT_URL: langgraphBaseUrl, + }, + }); + + await waitForHttp({ + url: `${webBaseUrl}/hire-agents`, + timeoutMs: 120_000, + child: web.child, + childOutput: web.output, + predicate: (res) => res.status === 200, + }); + + return async () => { + await web.cleanup(); + await langgraph.cleanup(); + await mockAllora.cleanup(); + await onchainCleanup(); + }; +} diff --git a/typescript/clients/web-ag-ui/apps/web/tsconfig.json b/typescript/clients/web-ag-ui/apps/web/tsconfig.json index b575f7da..1430e772 100644 --- a/typescript/clients/web-ag-ui/apps/web/tsconfig.json +++ b/typescript/clients/web-ag-ui/apps/web/tsconfig.json @@ -33,7 +33,8 @@ "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", - ".next/dev/types/**/*.ts" + ".next/dev/types/**/*.ts", + ".next/dev/dev/types/**/*.ts" ], "exclude": [ "node_modules" diff --git a/typescript/clients/web-ag-ui/apps/web/vitest.config.e2e.ts b/typescript/clients/web-ag-ui/apps/web/vitest.config.e2e.ts new file mode 100644 index 00000000..7eac35c5 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/web/vitest.config.e2e.ts @@ -0,0 +1,26 @@ +import { defineConfig } from 'vitest/config'; +import tsconfigPaths from 'vite-tsconfig-paths'; + +const setupFiles = ['./tests/setup/vitest.setup.ts']; + +export default defineConfig({ + plugins: [tsconfigPaths()], + test: { + name: 'e2e', + globals: true, + environment: 'node', + setupFiles, + globalSetup: ['./tests/setup/system.globalSetup.ts'], + include: ['src/**/*.e2e.test.ts', 'tests/**/*.e2e.test.ts'], + testTimeout: 90_000, + hookTimeout: 90_000, + coverage: { + provider: 'v8', + reportsDirectory: './coverage/e2e', + reporter: ['text', 'lcov'], + }, + typecheck: { + tsconfig: './tsconfig.vitest.json', + }, + }, +}); From f22758dbc7484a9b986a47d32ae6b0f60bd2f2c0 Mon Sep 17 00:00:00 2001 From: Sebas Date: Thu, 5 Feb 2026 21:52:08 -0800 Subject: [PATCH 20/70] fix(agent-pendle): increase unit test timeout --- .../apps/agent-pendle/src/workflow/clientFactory.unit.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/clientFactory.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/clientFactory.unit.test.ts index 8698892e..e0b73071 100644 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/clientFactory.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/clientFactory.unit.test.ts @@ -41,7 +41,7 @@ describe('clientFactory', () => { expect(first).toBe(second); expect(onchainActionsCtorMock).toHaveBeenCalledTimes(1); expect(onchainActionsCtorMock).toHaveBeenCalledWith('https://api.emberai.xyz'); - }); + }, 15_000); it('creates and caches onchain clients using the agent private key', async () => { process.env.A2A_TEST_AGENT_NODE_PRIVATE_KEY = From 0c1e349335eba20011f5c80170aa3b08bf9046b8 Mon Sep 17 00:00:00 2001 From: Sebas Date: Fri, 6 Feb 2026 09:44:29 -0800 Subject: [PATCH 21/70] fix(web): stabilize e2e startup --- .../web-ag-ui/apps/web/tests/setup/system.globalSetup.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts b/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts index 95e7a7c3..abbd2b0a 100644 --- a/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts +++ b/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts @@ -352,7 +352,9 @@ async function startOnchainActions(): Promise<{ baseUrl: string; cleanup: Cleanu await waitForHttpOk(HEALTH_URL, 60_000); if (exitError) throw exitError; - await waitForNonEmptyMarkets(MARKETS_URL, 120_000); + // onchain-actions performs a fairly heavy initial import (and may be rate-limited by CoinGecko), + // so give it enough time to hydrate the GMX markets list before running UI/system E2E tests. + await waitForNonEmptyMarkets(MARKETS_URL, 240_000); if (exitError) throw exitError; return { From 4841aecc08c6f0c879b1b1be782b5a55fb7b38c1 Mon Sep 17 00:00:00 2001 From: Sebas Date: Fri, 6 Feb 2026 09:57:54 -0800 Subject: [PATCH 22/70] fix(agent-gmx-allora): use ETH topic 2 --- .../web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts | 2 +- .../apps/agent-gmx-allora/src/workflow/artifacts.int.test.ts | 2 +- .../web-ag-ui/apps/web/tests/setup/system.globalSetup.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts index ee1d5595..e48b76c0 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts @@ -57,7 +57,7 @@ export function resolveAlloraChainId(): string { export const ALLORA_HORIZON_HOURS = 8; export const ALLORA_TOPIC_IDS = { BTC: 14, - ETH: 9, + ETH: 2, } as const; export const ALLORA_TOPIC_LABELS = { diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.int.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.int.test.ts index 86b16115..4e07a9db 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.int.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.int.test.ts @@ -29,7 +29,7 @@ describe('buildSummaryArtifact (integration)', () => { reason: 'Signal bearish', marketSymbol: 'ETH/USDC', timestamp: '2026-02-05T14:00:00.000Z', - prediction: { topicId: 9, combinedValue: 2600, confidence: 0.8 }, + prediction: { topicId: 2, combinedValue: 2600, confidence: 0.8 }, txHash: '0xabc', }, ]; diff --git a/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts b/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts index abbd2b0a..4195886c 100644 --- a/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts +++ b/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts @@ -395,7 +395,7 @@ async function startMockAlloraServer(): Promise<{ } const topicId = url.searchParams.get('allora_topic_id') ?? '0'; - const combined = topicId === '14' ? '48000' : topicId === '9' ? '2600' : '100'; + const combined = topicId === '14' ? '48000' : topicId === '2' ? '2600' : '100'; res.setHeader('content-type', 'application/json'); res.statusCode = 200; From c1b7b5356726c15db8bc1ffee440fdb6f1110413 Mon Sep 17 00:00:00 2001 From: Sebas Date: Fri, 6 Feb 2026 10:44:59 -0800 Subject: [PATCH 23/70] fix(web): prevent StrictMode cleanup from aborting agent connections --- .../clients/web-ag-ui/apps/web/package.json | 2 + .../apps/web/src/hooks/useAgentConnection.ts | 4 +- .../web/src/utils/agentConnectionCleanup.ts | 14 +++++++ .../utils/agentConnectionCleanup.unit.test.ts | 19 +++++++++ .../apps/web/src/utils/aguiAbort.unit.test.ts | 42 +++++++++++++++++++ 5 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 typescript/clients/web-ag-ui/apps/web/src/utils/agentConnectionCleanup.ts create mode 100644 typescript/clients/web-ag-ui/apps/web/src/utils/agentConnectionCleanup.unit.test.ts create mode 100644 typescript/clients/web-ag-ui/apps/web/src/utils/aguiAbort.unit.test.ts diff --git a/typescript/clients/web-ag-ui/apps/web/package.json b/typescript/clients/web-ag-ui/apps/web/package.json index ba0e4b44..ae38b317 100644 --- a/typescript/clients/web-ag-ui/apps/web/package.json +++ b/typescript/clients/web-ag-ui/apps/web/package.json @@ -36,6 +36,7 @@ "zod": "^3.24.4" }, "devDependencies": { + "@ag-ui/client": "0.0.42", "@eslint/eslintrc": "^3", "@tailwindcss/postcss": "^4", "@types/node": "^20", @@ -44,6 +45,7 @@ "@vitest/coverage-v8": "^4.0.18", "eslint": "^9", "eslint-config-next": "16.0.8", + "rxjs": "7.8.1", "tailwindcss": "^4", "typescript": "^5", "vite-tsconfig-paths": "^6.0.5", diff --git a/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts b/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts index 36eecc24..f4a7cfb1 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts +++ b/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts @@ -33,6 +33,7 @@ import { initialAgentState, } from '../types/agent'; import { applyAgentSyncToState, parseAgentSyncResponse } from '../utils/agentSync'; +import { cleanupAgentConnection } from '../utils/agentConnectionCleanup'; export type { AgentState, @@ -277,8 +278,7 @@ export function useAgentConnection(agentId: string): UseAgentConnectionResult { agent: getAgentDebugId(agent), threadId, }); - agent.abortRun(); - void agent.detachActiveRun(); + void cleanupAgentConnection(agent); }; }, [agent, agentId, getAgentDebugId, logConnectEvent, threadId]); diff --git a/typescript/clients/web-ag-ui/apps/web/src/utils/agentConnectionCleanup.ts b/typescript/clients/web-ag-ui/apps/web/src/utils/agentConnectionCleanup.ts new file mode 100644 index 00000000..667b7504 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/web/src/utils/agentConnectionCleanup.ts @@ -0,0 +1,14 @@ +type CleanupAgent = { + detachActiveRun?: () => Promise | void; +}; + +export async function cleanupAgentConnection(agent: CleanupAgent): Promise { + // `abortRun()` on @ag-ui/client's HttpAgent aborts its underlying AbortController. + // In React dev StrictMode, effect cleanups can run immediately after mount, and + // aborting here can poison the agent instance so subsequent `connectAgent()` + // requests are aborted on page load. + await Promise.resolve(agent.detachActiveRun?.()).catch(() => { + // best-effort cleanup; ignore + }); +} + diff --git a/typescript/clients/web-ag-ui/apps/web/src/utils/agentConnectionCleanup.unit.test.ts b/typescript/clients/web-ag-ui/apps/web/src/utils/agentConnectionCleanup.unit.test.ts new file mode 100644 index 00000000..e913aebd --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/web/src/utils/agentConnectionCleanup.unit.test.ts @@ -0,0 +1,19 @@ +import { describe, expect, it, vi } from 'vitest'; + +import { cleanupAgentConnection } from './agentConnectionCleanup'; + +describe('cleanupAgentConnection', () => { + it('detaches active runs without poisoning future connections (does not call abortRun)', async () => { + const abortRun = vi.fn(); + const detachActiveRun = vi.fn().mockResolvedValue(undefined); + + await cleanupAgentConnection({ + abortRun, + detachActiveRun, + }); + + expect(detachActiveRun).toHaveBeenCalledTimes(1); + expect(abortRun).not.toHaveBeenCalled(); + }); +}); + diff --git a/typescript/clients/web-ag-ui/apps/web/src/utils/aguiAbort.unit.test.ts b/typescript/clients/web-ag-ui/apps/web/src/utils/aguiAbort.unit.test.ts new file mode 100644 index 00000000..5abfcde4 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/web/src/utils/aguiAbort.unit.test.ts @@ -0,0 +1,42 @@ +import { describe, expect, it } from 'vitest'; +import { Observable } from 'rxjs'; +import { transformHttpEventStream } from '@ag-ui/client'; + +function createAbortError(): Error { + // DOMException is available in Node 18+; fall back to a named Error. + try { + // eslint-disable-next-line no-new + return new DOMException('aborted', 'AbortError') as unknown as Error; + } catch { + const error = new Error('aborted'); + (error as Error & { name: string }).name = 'AbortError'; + return error; + } +} + +describe('@ag-ui/client AbortError handling', () => { + it('treats AbortError as a normal completion (no RUN_ERROR event emitted)', async () => { + const source$ = new Observable<{ type: 'headers' | 'data'; status?: number; headers?: Headers; data?: Uint8Array }>( + (observer) => { + observer.next({ + type: 'headers', + status: 200, + headers: new Headers({ 'content-type': 'text/event-stream' }), + }); + observer.error(createAbortError()); + }, + ); + + const events: unknown[] = []; + await new Promise((resolve, reject) => { + transformHttpEventStream(source$ as any).subscribe({ + next: (event) => events.push(event), + error: reject, + complete: resolve, + }); + }); + + expect(events).toEqual([]); + }); +}); + From 9e66aef83d232723511b9ca2c56a02915ecdab18 Mon Sep 17 00:00:00 2001 From: Sebas Date: Fri, 6 Feb 2026 10:45:04 -0800 Subject: [PATCH 24/70] fix(web): keep e2e system stack running for manual QA --- .../apps/web/tests/setup/mockAlloraServer.ts | 53 +++++++++ .../web/tests/setup/system.globalSetup.ts | 102 ++++++++++++++++-- 2 files changed, 147 insertions(+), 8 deletions(-) create mode 100644 typescript/clients/web-ag-ui/apps/web/tests/setup/mockAlloraServer.ts diff --git a/typescript/clients/web-ag-ui/apps/web/tests/setup/mockAlloraServer.ts b/typescript/clients/web-ag-ui/apps/web/tests/setup/mockAlloraServer.ts new file mode 100644 index 00000000..1219d38a --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/web/tests/setup/mockAlloraServer.ts @@ -0,0 +1,53 @@ +import http from 'node:http'; + +function resolvePort(): number { + const raw = process.env['PORT']; + const parsed = raw ? Number(raw) : NaN; + if (!Number.isFinite(parsed) || parsed <= 0) return 0; + return parsed; +} + +const port = resolvePort(); + +const server = http.createServer((req, res) => { + if (!req.url) { + res.statusCode = 400; + res.end('Missing URL'); + return; + } + + const url = new URL(req.url, 'http://127.0.0.1'); + const match = url.pathname.match(/^\/v2\/allora\/consumer\/(.+)$/u); + if (!match) { + res.statusCode = 404; + res.end('not found'); + return; + } + + const topicId = url.searchParams.get('allora_topic_id') ?? '0'; + const combined = topicId === '14' ? '48000' : topicId === '2' ? '2600' : '100'; + + res.setHeader('content-type', 'application/json'); + res.statusCode = 200; + res.end( + JSON.stringify({ + status: true, + data: { + inference_data: { + topic_id: topicId, + network_inference_normalized: combined, + }, + }, + }), + ); +}); + +server.listen(port, '127.0.0.1', () => { + const address = server.address(); + if (!address || typeof address === 'string') { + throw new Error('Failed to resolve mock Allora server address.'); + } + const baseUrl = `http://127.0.0.1:${address.port}`; + // Printed for humans; in persist mode we use a fixed port anyway. + console.log(`[mock-allora] listening ${baseUrl}`); +}); diff --git a/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts b/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts index 4195886c..dee05d30 100644 --- a/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts +++ b/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts @@ -9,6 +9,18 @@ import fs from 'node:fs'; type Cleanup = () => Promise | void; type Child = ReturnType; +function shouldPersistE2EProcesses(): boolean { + return process.env['WEB_E2E_PERSIST'] === 'true'; +} + +function resolveBooleanEnv(name: string, fallback: boolean): boolean { + const raw = process.env[name]; + if (!raw) return fallback; + if (raw === 'true') return true; + if (raw === 'false') return false; + return fallback; +} + function resolvePnpmInvocation(): { command: string; prefixArgs: string[] } { const execPath = process.env.npm_execpath; const nodePath = process.env.npm_node_execpath; @@ -151,19 +163,29 @@ function spawnProcess(params: { cwd: string; args: string[]; env?: NodeJS.ProcessEnv; + persist?: boolean; }): { child: Child; output: string[]; cleanup: Cleanup } { const pnpm = resolvePnpmInvocation(); + const persist = params.persist ?? false; const child = spawn(pnpm.command, [...pnpm.prefixArgs, ...params.args], { cwd: params.cwd, env: { ...process.env, ...params.env }, - stdio: 'pipe', + detached: persist, + // When persisting processes for manual QA, avoid stdio pipes so the vitest + // process can exit without being held open by open pipe handles. + stdio: persist ? 'ignore' : 'pipe', }); const output: string[] = []; - child.stdout?.on('data', (chunk: Buffer) => output.push(chunk.toString('utf8'))); - child.stderr?.on('data', (chunk: Buffer) => output.push(chunk.toString('utf8'))); + if (!persist) { + child.stdout?.on('data', (chunk: Buffer) => output.push(chunk.toString('utf8'))); + child.stderr?.on('data', (chunk: Buffer) => output.push(chunk.toString('utf8'))); + } else { + child.unref(); + } const cleanup: Cleanup = async () => { + if (persist) return; if (child.exitCode !== null) return; child.kill('SIGTERM'); await new Promise((r) => setTimeout(r, 2_000)); @@ -309,6 +331,7 @@ async function startOnchainActions(): Promise<{ baseUrl: string; cleanup: Cleanu error: error instanceof Error ? error.message : String(error), }); } + const persist = shouldPersistE2EProcesses(); const server = spawn(pnpmBin, ['dev'], { cwd: ONCHAIN_ACTIONS_DIR, env: { @@ -335,8 +358,12 @@ async function startOnchainActions(): Promise<{ baseUrl: string; cleanup: Cleanu DUST_CHAIN_RECEIVER_ADDRESS: process.env['DUST_CHAIN_RECEIVER_ADDRESS'] ?? '0x0000000000000000000000000000000000000000', }, - stdio: 'inherit', + detached: persist, + stdio: persist ? 'ignore' : 'inherit', }); + if (persist) { + server.unref(); + } let exitError: Error | undefined; server.once('exit', (code, signal) => { @@ -360,6 +387,7 @@ async function startOnchainActions(): Promise<{ baseUrl: string; cleanup: Cleanu return { baseUrl, cleanup: async () => { + if (persist) return; if (server.exitCode === null) { server.kill('SIGTERM'); for (let i = 0; i < 20; i += 1) { @@ -433,15 +461,59 @@ async function startMockAlloraServer(): Promise<{ }; } +async function startDetachedMockAlloraServer(params: { + port: number; +}): Promise<{ baseUrl: string; cleanup: Cleanup }> { + const persist = true; + const pnpm = resolvePnpmInvocation(); + const child = spawn( + pnpm.command, + [...pnpm.prefixArgs, 'exec', 'tsx', 'tests/setup/mockAlloraServer.ts'], + { + cwd: process.cwd(), // apps/web + env: { + ...process.env, + PORT: String(params.port), + }, + detached: persist, + stdio: 'ignore', + }, + ); + child.unref(); + + const baseUrl = `http://127.0.0.1:${params.port}`; + await waitForHttp({ url: `${baseUrl}/health`, timeoutMs: 2_000 }).catch(() => { + // The mock server doesn't implement /health; we just need the port open for the Allora path. + // We'll validate readiness by hitting a known Allora route. + }); + await waitForHttp({ + url: `${baseUrl}/v2/allora/consumer/test?allora_topic_id=14`, + timeoutMs: 10_000, + predicate: (res) => res.status === 200, + }); + + return { baseUrl, cleanup: async () => {} }; +} + export default async function systemGlobalSetup(): Promise { + const persist = shouldPersistE2EProcesses(); + // 1) Start onchain-actions + memgraph. const onchain = await startOnchainActions(); const onchainCleanup = onchain.cleanup; const onchainBaseUrl = onchain.baseUrl; // 2) Start mock Allora API and point the agent runtime at it. - const mockAllora = await startMockAlloraServer(); - process.env.ALLORA_API_BASE_URL = mockAllora.baseUrl; + const shouldUseRealAllora = resolveBooleanEnv('WEB_E2E_USE_REAL_ALLORA', false); + const mockAllora = persist ? undefined : await startMockAlloraServer(); + + const alloraBaseUrl = shouldUseRealAllora + ? process.env['ALLORA_API_BASE_URL'] ?? 'https://api.allora.network' + : persist + ? (await startDetachedMockAlloraServer({ port: 63381 })).baseUrl + : mockAllora!.baseUrl; + + process.env.ALLORA_API_BASE_URL = alloraBaseUrl; // 3) Start LangGraph runtime for agent-gmx-allora. const langgraphPort = await getFreePort(); @@ -468,8 +540,9 @@ export default async function systemGlobalSetup(): Promise { DELEGATIONS_BYPASS: 'true', GMX_ALLORA_MODE: 'debug', ONCHAIN_ACTIONS_BASE_URL: onchainBaseUrl, - ALLORA_API_BASE_URL: mockAllora.baseUrl, + ALLORA_API_BASE_URL: alloraBaseUrl, }, + persist, }); // Server returns 404 on unknown thread state, but that still proves it's accepting connections. @@ -506,6 +579,7 @@ export default async function systemGlobalSetup(): Promise { LANGGRAPH_DEPLOYMENT_URL: langgraphBaseUrl, LANGGRAPH_PENDLE_DEPLOYMENT_URL: langgraphBaseUrl, }, + persist, }); await waitForHttp({ @@ -516,10 +590,22 @@ export default async function systemGlobalSetup(): Promise { predicate: (res) => res.status === 200, }); + console.log('[web-e2e] services ready', { + persist, + webBaseUrl, + langgraphBaseUrl, + onchainActionsBaseUrl: onchainBaseUrl, + alloraMockBaseUrl: shouldUseRealAllora ? undefined : alloraBaseUrl, + }); + return async () => { + if (persist) { + console.log('[web-e2e] WEB_E2E_PERSIST=true; leaving services running for manual QA'); + return; + } await web.cleanup(); await langgraph.cleanup(); - await mockAllora.cleanup(); + await mockAllora?.cleanup(); await onchainCleanup(); }; } From d178daccc36477ad4c0bcd543c5a2916918ac6d8 Mon Sep 17 00:00:00 2001 From: Sebas Date: Fri, 6 Feb 2026 11:14:55 -0800 Subject: [PATCH 25/70] fix(web): allow firing agent while setup interrupt is pending --- .../apps/web/src/hooks/useAgentConnection.ts | 23 ++++++-- .../apps/web/src/utils/aguiAbort.unit.test.ts | 2 - .../apps/web/src/utils/fireAgentRun.ts | 53 +++++++++++++++++ .../web/src/utils/fireAgentRun.unit.test.ts | 57 +++++++++++++++++++ 4 files changed, 128 insertions(+), 7 deletions(-) create mode 100644 typescript/clients/web-ag-ui/apps/web/src/utils/fireAgentRun.ts create mode 100644 typescript/clients/web-ag-ui/apps/web/src/utils/fireAgentRun.unit.test.ts diff --git a/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts b/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts index f4a7cfb1..78338bea 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts +++ b/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts @@ -34,6 +34,7 @@ import { } from '../types/agent'; import { applyAgentSyncToState, parseAgentSyncResponse } from '../utils/agentSync'; import { cleanupAgentConnection } from '../utils/agentConnectionCleanup'; +import { fireAgentRun } from '../utils/fireAgentRun'; export type { AgentState, @@ -452,12 +453,24 @@ export function useAgentConnection(agentId: string): UseAgentConnectionResult { }, [runCommand, isHired, isHiring]); const runFire = useCallback(() => { - if (!isFiring) { - if (!runCommand('fire')) return; - setIsFiring(true); + if (isFiring) return; + + setIsFiring(true); + const currentAgent = agentRef.current; + void fireAgentRun({ + agent: currentAgent, + copilotkit, + threadId, + runInFlightRef, + createId: v7, + }).then((ok) => { + if (!ok) { + setIsFiring(false); + return; + } setTimeout(() => setIsFiring(false), 3000); - } - }, [runCommand, isFiring]); + }); + }, [copilotkit, isFiring, threadId]); const resolveInterrupt = useCallback( ( diff --git a/typescript/clients/web-ag-ui/apps/web/src/utils/aguiAbort.unit.test.ts b/typescript/clients/web-ag-ui/apps/web/src/utils/aguiAbort.unit.test.ts index 5abfcde4..fdee3f7d 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/utils/aguiAbort.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/web/src/utils/aguiAbort.unit.test.ts @@ -5,7 +5,6 @@ import { transformHttpEventStream } from '@ag-ui/client'; function createAbortError(): Error { // DOMException is available in Node 18+; fall back to a named Error. try { - // eslint-disable-next-line no-new return new DOMException('aborted', 'AbortError') as unknown as Error; } catch { const error = new Error('aborted'); @@ -39,4 +38,3 @@ describe('@ag-ui/client AbortError handling', () => { expect(events).toEqual([]); }); }); - diff --git a/typescript/clients/web-ag-ui/apps/web/src/utils/fireAgentRun.ts b/typescript/clients/web-ag-ui/apps/web/src/utils/fireAgentRun.ts new file mode 100644 index 00000000..6c77d3ba --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/web/src/utils/fireAgentRun.ts @@ -0,0 +1,53 @@ +import type { v7 as uuidv7 } from 'uuid'; + +type AgentLike = { + addMessage: (message: { id: string; role: 'user'; content: string }) => void; + abortRun?: () => void; + detachActiveRun?: () => Promise | void; +}; + +type CopilotkitLike = { + runAgent: (params: { agent: AgentLike }) => Promise; +}; + +type BoolRef = { current: boolean }; + +export async function fireAgentRun(params: { + agent: AgentLike | null; + copilotkit: CopilotkitLike; + threadId: string | undefined; + runInFlightRef: BoolRef; + createId: typeof uuidv7; +}): Promise { + const { agent, threadId, runInFlightRef } = params; + if (!agent || !threadId) return false; + + // If an onboarding run is currently blocked at an interrupt, the hook-level guard + // prevents new commands. `fire` is special: it must always work as an escape hatch. + if (runInFlightRef.current) { + try { + agent.abortRun?.(); + } finally { + await Promise.resolve(agent.detachActiveRun?.()).catch(() => { + // best-effort; ignore + }); + } + } + + // Keep `runInFlightRef` true: we are immediately starting a new run. + runInFlightRef.current = true; + + agent.addMessage({ + id: params.createId(), + role: 'user', + content: JSON.stringify({ command: 'fire' }), + }); + + // Fire-and-forget: UI state updates will flow in via the AG-UI stream / sync poller. + void params.copilotkit.runAgent({ agent }).catch(() => { + // Errors are surfaced via CopilotKit / agent subscribers. + }); + + return true; +} + diff --git a/typescript/clients/web-ag-ui/apps/web/src/utils/fireAgentRun.unit.test.ts b/typescript/clients/web-ag-ui/apps/web/src/utils/fireAgentRun.unit.test.ts new file mode 100644 index 00000000..d87f7efb --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/web/src/utils/fireAgentRun.unit.test.ts @@ -0,0 +1,57 @@ +import { describe, expect, it, vi } from 'vitest'; + +import { fireAgentRun } from './fireAgentRun'; + +describe('fireAgentRun', () => { + it('force-detaches the active run then sends the fire command', async () => { + const calls: string[] = []; + + const agent = { + abortRun: vi.fn(() => calls.push('abortRun')), + detachActiveRun: vi.fn(async () => calls.push('detachActiveRun')), + addMessage: vi.fn(() => calls.push('addMessage')), + }; + const copilotkit = { + runAgent: vi.fn(async () => calls.push('runAgent')), + }; + + const runInFlightRef = { current: true }; + + const ok = await fireAgentRun({ + agent, + copilotkit, + threadId: 'thread-1', + runInFlightRef, + createId: () => 'msg-1', + }); + + expect(ok).toBe(true); + expect(runInFlightRef.current).toBe(true); + expect(agent.abortRun).toHaveBeenCalledTimes(1); + expect(agent.detachActiveRun).toHaveBeenCalledTimes(1); + expect(agent.addMessage).toHaveBeenCalledTimes(1); + expect(copilotkit.runAgent).toHaveBeenCalledTimes(1); + expect(calls).toEqual(['abortRun', 'detachActiveRun', 'addMessage', 'runAgent']); + }); + + it('does nothing when threadId is missing', async () => { + const agent = { abortRun: vi.fn(), detachActiveRun: vi.fn(), addMessage: vi.fn() }; + const copilotkit = { runAgent: vi.fn() }; + const runInFlightRef = { current: true }; + + const ok = await fireAgentRun({ + agent, + copilotkit, + threadId: undefined, + runInFlightRef, + createId: () => 'msg-1', + }); + + expect(ok).toBe(false); + expect(agent.abortRun).not.toHaveBeenCalled(); + expect(agent.detachActiveRun).not.toHaveBeenCalled(); + expect(agent.addMessage).not.toHaveBeenCalled(); + expect(copilotkit.runAgent).not.toHaveBeenCalled(); + }); +}); + From 92678ca3f3ec130a48be42ae86f720825055b5a9 Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Fri, 6 Feb 2026 13:43:38 -0500 Subject: [PATCH 26/70] fix(agent-pendle): block on missing funding and avoid onboarding recursion --- .../apps/agent-pendle/src/workflow/context.ts | 9 ++ .../src/workflow/nodes/collectDelegations.ts | 20 ++-- .../nodes/collectFundingTokenInput.ts | 105 ++++++++++++------ .../src/workflow/nodes/collectSetupInput.ts | 23 ++-- .../src/workflow/nodes/pollCycle.ts | 15 +-- 5 files changed, 111 insertions(+), 61 deletions(-) diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/context.ts b/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/context.ts index ed6ba7f2..59f540be 100644 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/context.ts +++ b/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/context.ts @@ -158,6 +158,15 @@ export type FundingTokenInterrupt = { options: FundingTokenOption[]; }; +export type PendleFundWalletInterrupt = { + type: 'pendle-fund-wallet-request'; + message: string; + payloadSchema: Record; + artifactId: string; + walletAddress: `0x${string}`; + whitelistSymbols: string[]; +}; + export type DelegationCaveat = { enforcer: `0x${string}`; terms: `0x${string}`; diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/nodes/collectDelegations.ts b/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/nodes/collectDelegations.ts index 5dd082c4..6414d5d5 100644 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/nodes/collectDelegations.ts +++ b/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/nodes/collectDelegations.ts @@ -183,14 +183,20 @@ export const collectDelegationsNode = async ( await copilotkitEmitState(config, { view: { task, activity: { events: [statusEvent], telemetry: state.view.activity.telemetry } }, }); - return { - view: { - haltReason: failureMessage, - task, - activity: { events: [statusEvent], telemetry: state.view.activity.telemetry }, - onboarding: { ...ONBOARDING, step: 3 }, + return new Command({ + update: { + view: { + haltReason: failureMessage, + task, + activity: { events: [statusEvent], telemetry: state.view.activity.telemetry }, + onboarding: { ...ONBOARDING, step: 3 }, + profile: state.view.profile, + metrics: state.view.metrics, + transactionHistory: state.view.transactionHistory, + }, }, - }; + goto: 'summarize', + }); } if (parsed.data.outcome === 'rejected') { diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/nodes/collectFundingTokenInput.ts b/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/nodes/collectFundingTokenInput.ts index ea7f3136..1a92495c 100644 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/nodes/collectFundingTokenInput.ts +++ b/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/nodes/collectFundingTokenInput.ts @@ -12,6 +12,7 @@ import { normalizeHexAddress, type ClmmState, type ClmmUpdate, + type PendleFundWalletInterrupt, type FundingTokenInterrupt, type OnboardingState, } from '../context.js'; @@ -22,6 +23,10 @@ const ONBOARDING: Pick = { totalSteps: 3, }; +const FundWalletAckSchema = z.object({ + acknowledged: z.literal(true), +}); + export const collectFundingTokenInputNode = async ( state: ClmmState, config: CopilotKitConfig, @@ -56,13 +61,15 @@ export const collectFundingTokenInputNode = async ( const onchainActionsClient = getOnchainActionsClient(); const operatorWalletAddress = normalizeHexAddress(operatorInput.walletAddress, 'wallet address'); + const whitelistSymbols = resolveStablecoinWhitelist(); + const loadOptions = async (): Promise => { + const balances = await onchainActionsClient.listWalletBalances(operatorWalletAddress); + return buildFundingTokenOptions({ balances, whitelistSymbols }); + }; + let options = []; try { - const balances = await onchainActionsClient.listWalletBalances(operatorWalletAddress); - options = buildFundingTokenOptions({ - balances, - whitelistSymbols: resolveStablecoinWhitelist(), - }); + options = await loadOptions(); } catch (error: unknown) { const message = error instanceof Error ? error.message : 'Unknown error'; const failureMessage = `ERROR: Unable to fetch wallet balances: ${message}`; @@ -86,24 +93,46 @@ export const collectFundingTokenInputNode = async ( } if (options.length === 0) { - const failureMessage = 'ERROR: No eligible stablecoin balances found for funding token selection.'; - const { task, statusEvent } = buildTaskStatus(state.view.task, 'failed', failureMessage); + const message = + 'WARNING: No eligible stablecoin balances found for funding token selection. Fund your wallet with an eligible stablecoin on Arbitrum (for example, USDai or USDC), then click Continue.'; + const request: PendleFundWalletInterrupt = { + type: 'pendle-fund-wallet-request', + message, + payloadSchema: z.toJSONSchema(FundWalletAckSchema), + artifactId: `pendle-fund-wallet-${Date.now()}`, + walletAddress: operatorWalletAddress, + whitelistSymbols, + }; + + const { task, statusEvent } = buildTaskStatus(state.view.task, 'input-required', message); await copilotkitEmitState(config, { - view: { task, activity: { events: [statusEvent], telemetry: state.view.activity.telemetry } }, - }); - return new Command({ - update: { - view: { - haltReason: failureMessage, - task, - activity: { events: [statusEvent], telemetry: state.view.activity.telemetry }, - profile: state.view.profile, - metrics: state.view.metrics, - transactionHistory: state.view.transactionHistory, - }, + view: { + onboarding: { ...ONBOARDING, step: 2 }, + task, + activity: { events: [statusEvent], telemetry: state.view.activity.telemetry }, }, - goto: 'summarize', }); + + const incoming: unknown = await interrupt(request); + let inputToParse: unknown = incoming; + if (typeof incoming === 'string') { + try { + inputToParse = JSON.parse(incoming); + } catch { + // ignore + } + } + + const parsedAck = FundWalletAckSchema.safeParse(inputToParse); + if (!parsedAck.success) { + // Treat invalid responses as a no-op and keep the agent blocked. + return new Command({ goto: '__end__' }); + } + + // This interrupt is intentionally an "ack + retry" flow. + // We end the run here and let the UI trigger a new `cycle` run which re-checks balances + // and proceeds into the next onboarding interrupt (funding token selection). + return new Command({ goto: '__end__' }); } const request: FundingTokenInterrupt = { @@ -145,13 +174,19 @@ export const collectFundingTokenInputNode = async ( await copilotkitEmitState(config, { view: { task, activity: { events: [statusEvent], telemetry: state.view.activity.telemetry } }, }); - return { - view: { - haltReason: failureMessage, - task, - activity: { events: [statusEvent], telemetry: state.view.activity.telemetry }, + return new Command({ + update: { + view: { + haltReason: failureMessage, + task, + activity: { events: [statusEvent], telemetry: state.view.activity.telemetry }, + profile: state.view.profile, + metrics: state.view.metrics, + transactionHistory: state.view.transactionHistory, + }, }, - }; + goto: 'summarize', + }); } const normalizedFundingToken = normalizeHexAddress( @@ -167,13 +202,19 @@ export const collectFundingTokenInputNode = async ( await copilotkitEmitState(config, { view: { task, activity: { events: [statusEvent], telemetry: state.view.activity.telemetry } }, }); - return { - view: { - haltReason: failureMessage, - task, - activity: { events: [statusEvent], telemetry: state.view.activity.telemetry }, + return new Command({ + update: { + view: { + haltReason: failureMessage, + task, + activity: { events: [statusEvent], telemetry: state.view.activity.telemetry }, + profile: state.view.profile, + metrics: state.view.metrics, + transactionHistory: state.view.transactionHistory, + }, }, - }; + goto: 'summarize', + }); } const { task, statusEvent } = buildTaskStatus( diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/nodes/collectSetupInput.ts b/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/nodes/collectSetupInput.ts index 855c1c8b..9535ba85 100644 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/nodes/collectSetupInput.ts +++ b/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/nodes/collectSetupInput.ts @@ -1,5 +1,5 @@ import { copilotkitEmitState } from '@copilotkit/sdk-js/langgraph'; -import { interrupt, type Command } from '@langchain/langgraph'; +import { Command, interrupt } from '@langchain/langgraph'; import { z } from 'zod'; import { PendleSetupInputSchema } from '../../domain/types.js'; @@ -64,16 +64,19 @@ export const collectSetupInputNode = async ( await copilotkitEmitState(config, { view: { task, activity: { events: [statusEvent], telemetry: [] } }, }); - return { - view: { - haltReason: failureMessage, - task, - activity: { events: [statusEvent], telemetry: [] }, - profile: state.view.profile, - metrics: state.view.metrics, - transactionHistory: state.view.transactionHistory, + return new Command({ + update: { + view: { + haltReason: failureMessage, + task, + activity: { events: [statusEvent], telemetry: [] }, + profile: state.view.profile, + metrics: state.view.metrics, + transactionHistory: state.view.transactionHistory, + }, }, - }; + goto: 'summarize', + }); } const { task, statusEvent } = buildTaskStatus( diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/nodes/pollCycle.ts b/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/nodes/pollCycle.ts index e8b6834e..3adea7b6 100644 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/nodes/pollCycle.ts +++ b/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/nodes/pollCycle.ts @@ -81,21 +81,12 @@ export const pollCycleNode = async ( if (!operatorConfig) { const message = - 'Pendle strategy configuration missing. Continuing onboarding to establish configuration.'; - const { task, statusEvent } = buildTaskStatus(state.view.task, 'working', message); + 'WARNING: Pendle strategy configuration missing. Complete onboarding (funding token + strategy setup) before running cycles.'; + const { task, statusEvent } = buildTaskStatus(state.view.task, 'input-required', message); await copilotkitEmitState(config, { view: { task, activity: { events: [statusEvent], telemetry: state.view.activity.telemetry } }, }); - const nextNode = - !state.view.operatorInput - ? 'collectSetupInput' - : !state.view.fundingTokenInput - ? 'collectFundingTokenInput' - : state.view.delegationsBypassActive !== true && !state.view.delegationBundle - ? 'collectDelegations' - : 'prepareOperator'; - return new Command({ update: { view: { @@ -108,7 +99,7 @@ export const pollCycleNode = async ( transactionHistory: state.view.transactionHistory, }, }, - goto: nextNode, + goto: '__end__', }); } From fa87d44f2d5816b094a56b5917a93185052654d4 Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Fri, 6 Feb 2026 13:43:43 -0500 Subject: [PATCH 27/70] test(agent-pendle): cover fund-wallet interrupt and halt behavior --- .../collectFundingTokenInput.int.test.ts | 110 +++++++++++++++++- .../src/workflow/nodes/pollCycle.int.test.ts | 7 +- 2 files changed, 112 insertions(+), 5 deletions(-) diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/nodes/collectFundingTokenInput.int.test.ts b/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/nodes/collectFundingTokenInput.int.test.ts index 552952ad..2f88f288 100644 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/nodes/collectFundingTokenInput.int.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/nodes/collectFundingTokenInput.int.test.ts @@ -383,8 +383,114 @@ describe('collectFundingTokenInputNode', () => { }; const result = await collectFundingTokenInputNode(state, {}); - const update = result as ClmmUpdate; + expect(result).toBeInstanceOf(Command); + const update = (result as { update?: ClmmUpdate }).update; + const haltReason: string | undefined = update?.view?.haltReason; + + expect(haltReason).toContain('not in allowed options'); + }); + + it('fails when no eligible stablecoin balances exist', async () => { + process.env.PENDLE_STABLECOIN_WHITELIST = 'USDai,USDC'; + const fetchMock = vi.fn((input: string | URL) => { + const url = typeof input === 'string' ? input : input.toString(); + if (url.includes('/wallet/balances/')) { + return new Response( + JSON.stringify({ + balances: [ + { + tokenUid: { chainId: '42161', address: '0xeth' }, + amount: '1', + symbol: 'ETH', + valueUsd: 2000, + decimals: 18, + }, + ], + cursor: null, + currentPage: 1, + totalPages: 1, + totalItems: 1, + }), + { status: 200, headers: { 'Content-Type': 'application/json' } }, + ); + } + return new Response('Not found', { status: 404 }); + }); + + vi.stubGlobal('fetch', fetchMock); + + const { interrupt } = await import('@langchain/langgraph'); + const interruptMock = vi.mocked(interrupt); + const capturedTypes: string[] = []; + interruptMock.mockImplementation((request: { type?: string }) => { + if (request.type) { + capturedTypes.push(request.type); + } + if (request.type === 'pendle-fund-wallet-request') { + return JSON.stringify({ acknowledged: true }); + } + return JSON.stringify({ acknowledged: true }); + }); + + const state: ClmmState = { + messages: [], + copilotkit: { actions: [], context: [] }, + settings: { amount: undefined }, + private: { + mode: undefined, + pollIntervalMs: 5_000, + streamLimit: -1, + cronScheduled: false, + bootstrapped: true, + }, + view: { + command: undefined, + task: undefined, + poolArtifact: undefined, + operatorInput: { + walletAddress: '0x0000000000000000000000000000000000000001', + baseContributionUsd: 10, + }, + onboarding: undefined, + fundingTokenInput: undefined, + selectedPool: undefined, + operatorConfig: undefined, + delegationBundle: undefined, + haltReason: undefined, + executionError: undefined, + delegationsBypassActive: true, + profile: { + agentIncome: undefined, + aum: undefined, + totalUsers: undefined, + apy: undefined, + chains: [], + protocols: [], + tokens: [], + pools: [], + allowedPools: [], + }, + activity: { telemetry: [], events: [] }, + metrics: { + lastSnapshot: undefined, + previousApy: undefined, + cyclesSinceRebalance: 0, + staleCycles: 0, + iteration: 0, + latestCycle: undefined, + }, + transactionHistory: [], + }, + }; - expect(update.view?.haltReason).toContain('not in allowed options'); + const result = await collectFundingTokenInputNode(state, {}); + + // The "fund wallet" interrupt is an ack-only flow. After acknowledgement we end the run + // and let the UI trigger a new cycle which re-checks balances and proceeds. + expect(result).toBeInstanceOf(Command); + const goto = (result as Command).goto; + expect(Array.isArray(goto) ? goto[0] : goto).toBe('__end__'); + expect(capturedTypes[0]).toBe('pendle-fund-wallet-request'); + expect(capturedTypes).not.toContain('pendle-funding-token-request'); }); }); diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/nodes/pollCycle.int.test.ts b/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/nodes/pollCycle.int.test.ts index 0916e298..b4c4662c 100644 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/nodes/pollCycle.int.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-pendle/src/workflow/nodes/pollCycle.int.test.ts @@ -641,7 +641,7 @@ describe('pollCycleNode', () => { expect(executeRebalanceMock).not.toHaveBeenCalled(); }); - it('routes back into onboarding when operator config is missing', async () => { + it('halts when operator config is missing (no onboarding recursion)', async () => { const state: ClmmState = { messages: [], copilotkit: { actions: [], context: [] }, @@ -696,8 +696,9 @@ describe('pollCycleNode', () => { const resolvedGoto = Array.isArray(goto) ? goto[0] : goto; expect(result).toBeInstanceOf(Command); - expect(resolvedGoto).toBe('collectSetupInput'); - expect(update?.view?.haltReason).toBe(''); + expect(resolvedGoto).toBe('__end__'); + expect(update?.view?.task?.taskStatus?.state).toBe('input-required'); + expect(update?.view?.task?.taskStatus?.message?.content).toContain('strategy configuration missing'); }); it('downgrades to hold in smoke mode when no position exists', async () => { From ecc9cc3477b3b602437362dd15d9f81b59767920 Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Fri, 6 Feb 2026 13:43:48 -0500 Subject: [PATCH 28/70] fix(web): handle pendle fund-wallet interrupt and auto-cycle --- .../web/src/components/AgentDetailPage.tsx | 39 ++++++++++++++- .../apps/web/src/hooks/useAgentConnection.ts | 20 +++++++- .../web-ag-ui/apps/web/src/types/agent.ts | 14 ++++++ .../apps/web/src/utils/interruptAutoCycle.ts | 46 +++++++++++++++++ .../src/utils/interruptAutoCycle.unit.test.ts | 50 +++++++++++++++++++ 5 files changed, 167 insertions(+), 2 deletions(-) create mode 100644 typescript/clients/web-ag-ui/apps/web/src/utils/interruptAutoCycle.ts create mode 100644 typescript/clients/web-ag-ui/apps/web/src/utils/interruptAutoCycle.unit.test.ts diff --git a/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.tsx b/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.tsx index 019a72b2..caaf6607 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.tsx +++ b/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.tsx @@ -25,6 +25,7 @@ import type { Pool, OperatorConfigInput, PendleSetupInput, + FundWalletAcknowledgement, GmxSetupInput, FundingTokenInput, DelegationSigningResponse, @@ -71,6 +72,7 @@ interface AgentDetailPageProps { input: | OperatorConfigInput | PendleSetupInput + | FundWalletAcknowledgement | GmxSetupInput | FundingTokenInput | DelegationSigningResponse, @@ -616,6 +618,7 @@ interface AgentBlockersTabProps { input: | OperatorConfigInput | PendleSetupInput + | FundWalletAcknowledgement | GmxSetupInput | FundingTokenInput | DelegationSigningResponse, @@ -891,6 +894,7 @@ function AgentBlockersTab({ // Derive which form to show from the interrupt type (the authoritative source) const showOperatorConfigForm = activeInterrupt?.type === 'operator-config-request'; const showPendleSetupForm = activeInterrupt?.type === 'pendle-setup-request'; + const showPendleFundWalletForm = activeInterrupt?.type === 'pendle-fund-wallet-request'; const showGmxSetupForm = activeInterrupt?.type === 'gmx-setup-request'; const showFundingTokenForm = activeInterrupt?.type === 'clmm-funding-token-request' || @@ -903,7 +907,7 @@ function AgentBlockersTab({ // Sync currentStep with the interrupt type when it changes useEffect(() => { - if (showOperatorConfigForm || showPendleSetupForm || showGmxSetupForm) { + if (showOperatorConfigForm || showPendleSetupForm || showPendleFundWalletForm || showGmxSetupForm) { setCurrentStep(1); } else if (showFundingTokenForm) { setCurrentStep(2); @@ -913,6 +917,7 @@ function AgentBlockersTab({ }, [ showOperatorConfigForm, showPendleSetupForm, + showPendleFundWalletForm, showGmxSetupForm, showFundingTokenForm, showDelegationSigningForm, @@ -1172,6 +1177,38 @@ function AgentBlockersTab({
+ ) : showPendleFundWalletForm ? ( +
+

Fund Wallet

+ {activeInterrupt?.message && ( +

{activeInterrupt.message}

+ )} + +
+
What to do
+
    +
  • + Add a small balance of an eligible stablecoin on Arbitrum to your wallet, then click Continue. +
  • +
  • + Eligible: {(activeInterrupt as unknown as { whitelistSymbols?: string[] }).whitelistSymbols?.join(', ') || 'USDai, USDC'} +
  • +
  • + Wallet: {(activeInterrupt as unknown as { walletAddress?: string }).walletAddress || connectedWalletAddress || 'Unknown'} +
  • +
+
+ +
+ +
+
) : showGmxSetupForm ? (

GMX Allora Setup

diff --git a/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts b/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts index 78338bea..829fbdf2 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts +++ b/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts @@ -23,6 +23,7 @@ import { type GmxSetupInput, type FundingTokenInput, type DelegationSigningResponse, + type FundWalletAcknowledgement, type Transaction, type ClmmEvent, defaultView, @@ -35,6 +36,7 @@ import { import { applyAgentSyncToState, parseAgentSyncResponse } from '../utils/agentSync'; import { cleanupAgentConnection } from '../utils/agentConnectionCleanup'; import { fireAgentRun } from '../utils/fireAgentRun'; +import { scheduleCycleAfterInterruptResolution } from '../utils/interruptAutoCycle'; export type { AgentState, @@ -47,6 +49,7 @@ export type { OperatorConfigInput, PendleSetupInput, GmxSetupInput, + FundWalletAcknowledgement, FundingTokenInput, Transaction, ClmmEvent, @@ -57,6 +60,7 @@ const isAgentInterrupt = (value: unknown): value is AgentInterrupt => value !== null && ((value as { type?: string }).type === 'operator-config-request' || (value as { type?: string }).type === 'pendle-setup-request' || + (value as { type?: string }).type === 'pendle-fund-wallet-request' || (value as { type?: string }).type === 'gmx-setup-request' || (value as { type?: string }).type === 'clmm-funding-token-request' || (value as { type?: string }).type === 'pendle-funding-token-request' || @@ -99,6 +103,7 @@ export interface UseAgentConnectionResult { | OperatorConfigInput | PendleSetupInput | GmxSetupInput + | FundWalletAcknowledgement | FundingTokenInput | DelegationSigningResponse, ) => void; @@ -474,11 +479,24 @@ export function useAgentConnection(agentId: string): UseAgentConnectionResult { const resolveInterrupt = useCallback( ( +<<<<<<< HEAD input: OperatorConfigInput | PendleSetupInput | FundingTokenInput | DelegationSigningResponse, +======= + input: + | OperatorConfigInput + | PendleSetupInput + | FundWalletAcknowledgement + | FundingTokenInput + | DelegationSigningResponse, +>>>>>>> a4e1e054 (fix(web): handle pendle fund-wallet interrupt and auto-cycle) ) => { resolve(JSON.stringify(input)); + scheduleCycleAfterInterruptResolution({ + interruptType: activeInterrupt?.type, + runCommand, + }); }, - [resolve], + [activeInterrupt?.type, resolve, runCommand], ); // Settings sync pattern: update local state only (no automatic sync to avoid 409) diff --git a/typescript/clients/web-ag-ui/apps/web/src/types/agent.ts b/typescript/clients/web-ag-ui/apps/web/src/types/agent.ts index 2037fa39..541d7979 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/types/agent.ts +++ b/typescript/clients/web-ag-ui/apps/web/src/types/agent.ts @@ -121,6 +121,15 @@ export type PendleSetupRequestInterrupt = { payloadSchema?: Record; }; +export type PendleFundWalletRequestInterrupt = { + type: 'pendle-fund-wallet-request'; + message: string; + payloadSchema?: Record; + artifactId?: string; + walletAddress?: `0x${string}`; + whitelistSymbols?: string[]; +}; + export type GmxSetupRequestInterrupt = { type: 'gmx-setup-request'; message: string; @@ -171,6 +180,7 @@ export type DelegationSigningRequestInterrupt = { export type AgentInterrupt = | OperatorConfigRequestInterrupt | PendleSetupRequestInterrupt + | PendleFundWalletRequestInterrupt | GmxSetupRequestInterrupt | FundingTokenRequestInterrupt | DelegationSigningRequestInterrupt; @@ -187,6 +197,10 @@ export interface PendleSetupInput { baseContributionUsd: number; } +export interface FundWalletAcknowledgement { + acknowledged: true; +} + export interface GmxSetupInput { walletAddress: `0x${string}`; baseContributionUsd: number; diff --git a/typescript/clients/web-ag-ui/apps/web/src/utils/interruptAutoCycle.ts b/typescript/clients/web-ag-ui/apps/web/src/utils/interruptAutoCycle.ts new file mode 100644 index 00000000..46916cc1 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/web/src/utils/interruptAutoCycle.ts @@ -0,0 +1,46 @@ +export type InterruptType = string | null | undefined; + +type ScheduleFn = (fn: () => void, ms: number) => unknown; + +type Options = { + interruptType: InterruptType; + runCommand: (command: string) => boolean; + schedule?: ScheduleFn; + retryMs?: number; + maxMs?: number; + now?: () => number; +}; + +/** + * Some interrupts are "ack-only" UI affordances, not true user input steps. + * For these, we proactively trigger a new `cycle` run after resolution so the + * agent can re-check external state (wallet balances, RPC state, etc). + */ +export function scheduleCycleAfterInterruptResolution(options: Options): void { + if (options.interruptType !== 'pendle-fund-wallet-request') { + return; + } + + const schedule: ScheduleFn = + options.schedule ?? + ((fn, ms) => { + return setTimeout(fn, ms); + }); + const retryMs = options.retryMs ?? 250; + const maxMs = options.maxMs ?? 5_000; + const now = options.now ?? (() => Date.now()); + const deadline = now() + maxMs; + + const tick = (): void => { + if (options.runCommand('cycle')) { + return; + } + if (now() >= deadline) { + return; + } + schedule(tick, retryMs); + }; + + schedule(tick, retryMs); +} + diff --git a/typescript/clients/web-ag-ui/apps/web/src/utils/interruptAutoCycle.unit.test.ts b/typescript/clients/web-ag-ui/apps/web/src/utils/interruptAutoCycle.unit.test.ts new file mode 100644 index 00000000..5ba2767a --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/web/src/utils/interruptAutoCycle.unit.test.ts @@ -0,0 +1,50 @@ +import { describe, expect, it, vi } from 'vitest'; + +import { scheduleCycleAfterInterruptResolution } from './interruptAutoCycle'; + +describe('scheduleCycleAfterInterruptResolution', () => { + it('does nothing for unrelated interrupt types', () => { + vi.useFakeTimers(); + const runCommand = vi.fn(() => true); + + scheduleCycleAfterInterruptResolution({ + interruptType: 'some-other-interrupt', + runCommand, + retryMs: 10, + maxMs: 50, + }); + + vi.runAllTimers(); + expect(runCommand).not.toHaveBeenCalled(); + }); + + it('retries until it can trigger a cycle run (or times out)', () => { + vi.useFakeTimers(); + const runCommand = vi + .fn<(command: string) => boolean>() + .mockImplementationOnce(() => false) + .mockImplementationOnce(() => false) + .mockImplementationOnce(() => true); + + scheduleCycleAfterInterruptResolution({ + interruptType: 'pendle-fund-wallet-request', + runCommand, + retryMs: 100, + maxMs: 1_000, + now: () => Date.now(), + }); + + expect(runCommand).not.toHaveBeenCalled(); + + vi.advanceTimersByTime(100); + expect(runCommand).toHaveBeenCalledTimes(1); + expect(runCommand).toHaveBeenLastCalledWith('cycle'); + + vi.advanceTimersByTime(100); + expect(runCommand).toHaveBeenCalledTimes(2); + + vi.advanceTimersByTime(100); + expect(runCommand).toHaveBeenCalledTimes(3); + }); +}); + From 4e99e724d760c7086b3e671931560e2c16069d30 Mon Sep 17 00:00:00 2001 From: Sebas Date: Thu, 5 Feb 2026 12:39:18 -0800 Subject: [PATCH 29/70] feat(web-ag-ui): refresh gmx allora workflows and tests --- .../src/workflow/artifacts.unit.test.ts | 6 +- .../tests/happyPath.e2e.test.ts | 3 - .../web/src/components/AgentDetailPage.tsx | 120 +++++++++++++++++- .../apps/web/src/hooks/useAgentConnection.ts | 1 + 4 files changed, 117 insertions(+), 13 deletions(-) diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.unit.test.ts index dbf3491f..c4526135 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.unit.test.ts @@ -3,11 +3,7 @@ import { describe, expect, it } from 'vitest'; import type { ExecutionPlan } from '../core/executionPlan.js'; import type { GmxAlloraTelemetry } from '../domain/types.js'; -import { - buildExecutionPlanArtifact, - buildExecutionResultArtifact, - buildTelemetryArtifact, -} from './artifacts.js'; +import { buildExecutionPlanArtifact, buildExecutionResultArtifact, buildTelemetryArtifact } from './artifacts.js'; describe('buildExecutionPlanArtifact', () => { it('wraps execution plan data into an artifact', () => { diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/happyPath.e2e.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/happyPath.e2e.test.ts index 2f190d21..f20bbe59 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/happyPath.e2e.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/happyPath.e2e.test.ts @@ -43,7 +43,6 @@ describe('GMX Allora happy path (e2e)', () => { const walletAddress = resolveEnvAddress('SMOKE_WALLET'); const payTokenAddress = resolveEnvAddress('SMOKE_USDC_ADDRESS'); - const market = markets.find( (entry) => @@ -54,7 +53,6 @@ describe('GMX Allora happy path (e2e)', () => { if (!market) { throw new Error('Expected at least one perpetual market from onchain-actions.'); } - const inference = await fetchAlloraInference({ baseUrl: resolveAlloraApiBaseUrl(), chainId: resolveAlloraChainId(), @@ -84,4 +82,3 @@ describe('GMX Allora happy path (e2e)', () => { } }); }); - diff --git a/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.tsx b/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.tsx index caaf6607..1ff9ebf1 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.tsx +++ b/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.tsx @@ -499,9 +499,9 @@ export function AgentDetailPage({ {activeTab === 'metrics' && ( )} - - - + + + ); } @@ -1913,8 +1913,7 @@ function MetricsTab({ profile, metrics, fullMetrics, events }: MetricsTabProps)
{event.type === 'status' && event.message} - {event.type === 'artifact' && - `Artifact: ${formatArtifactLabel(event.artifact)}`} + {event.type === 'artifact' && `Artifact: ${formatArtifactLabel(event.artifact)}`} {event.type === 'dispatch-response' && `Response with ${event.parts?.length ?? 0} parts`}
@@ -1933,6 +1932,117 @@ function MetricsTab({ profile, metrics, fullMetrics, events }: MetricsTabProps) ); } +function PendleMetricsTab({ profile, metrics, fullMetrics, events }: Omit) { + const formatDate = (timestamp?: string) => { + if (!timestamp) return '—'; + const date = new Date(timestamp); + if (Number.isNaN(date.getTime())) return '—'; + return date.toLocaleString(undefined, { + month: 'short', + day: 'numeric', + hour: '2-digit', + minute: '2-digit', + }); + }; + + const strategy = fullMetrics?.pendle; + const latestCycle = fullMetrics?.latestCycle; + + const rewardLines = strategy?.position?.claimableRewards ?? []; + + return ( +
+
+

Strategy

+
+
+
Target YT
+
{strategy?.ytSymbol ?? '—'}
+
+
+
Underlying
+
{strategy?.underlyingSymbol ?? '—'}
+
+
+
Current APY
+
+ {strategy?.currentApy !== undefined ? `${strategy.currentApy.toFixed(2)}%` : '—'} +
+
+
+
Contribution
+
+ {strategy?.baseContributionUsd !== undefined ? `$${strategy.baseContributionUsd.toLocaleString()}` : '—'} +
+
+
+
+
+
Maturity
+
{strategy?.maturity ?? '—'}
+
+
+
Best APY
+
+ {strategy?.bestApy !== undefined ? `${strategy.bestApy.toFixed(2)}%` : '—'} +
+
+
+
Delta
+
+ {strategy?.apyDelta !== undefined ? `${strategy.apyDelta.toFixed(2)}%` : '—'} +
+
+
+
Funding Token
+
+ {strategy?.fundingTokenAddress ? strategy.fundingTokenAddress.slice(0, 10) + '…' : '—'} +
+
+
+
+ +
+

Position

+
+
+
PT
+
+ {strategy?.position?.ptSymbol ? `${strategy.position.ptSymbol} ${strategy.position.ptAmount ?? ''}`.trim() : '—'} +
+
+
+
YT
+
+ {strategy?.position?.ytSymbol ? `${strategy.position.ytSymbol} ${strategy.position.ytAmount ?? ''}`.trim() : '—'} +
+
+
+
APY
+
{metrics.apy !== undefined ? `${metrics.apy.toFixed(2)}%` : '—'}
+
+
+
AUM
+
{metrics.aumUsd !== undefined ? `$${metrics.aumUsd.toLocaleString()}` : '—'}
+
+
+
+
Claimable Rewards
+ {rewardLines.length > 0 ? ( +
+ {rewardLines.map((reward) => ( +
+ {reward.symbol} + {reward.amount} +
+ ))} +
+
+ )} +
+ ); +} + // GMX Allora uses the same Metrics/Activity layout as other agents. Any agent-specific // surface area should be reflected through standard artifacts/events. diff --git a/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts b/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts index 829fbdf2..600fc621 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts +++ b/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts @@ -485,6 +485,7 @@ export function useAgentConnection(agentId: string): UseAgentConnectionResult { input: | OperatorConfigInput | PendleSetupInput + | GmxSetupInput | FundWalletAcknowledgement | FundingTokenInput | DelegationSigningResponse, From b4dc4e6c2ba1303c4c40392732660942dd89e3db Mon Sep 17 00:00:00 2001 From: Sebas Date: Fri, 6 Feb 2026 10:44:59 -0800 Subject: [PATCH 30/70] fix(web): prevent StrictMode cleanup from aborting agent connections --- .../clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts | 1 + .../clients/web-ag-ui/apps/web/src/utils/aguiAbort.unit.test.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts b/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts index 600fc621..bdeaa4ea 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts +++ b/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts @@ -37,6 +37,7 @@ import { applyAgentSyncToState, parseAgentSyncResponse } from '../utils/agentSyn import { cleanupAgentConnection } from '../utils/agentConnectionCleanup'; import { fireAgentRun } from '../utils/fireAgentRun'; import { scheduleCycleAfterInterruptResolution } from '../utils/interruptAutoCycle'; +import { cleanupAgentConnection } from '../utils/agentConnectionCleanup'; export type { AgentState, diff --git a/typescript/clients/web-ag-ui/apps/web/src/utils/aguiAbort.unit.test.ts b/typescript/clients/web-ag-ui/apps/web/src/utils/aguiAbort.unit.test.ts index fdee3f7d..aabce800 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/utils/aguiAbort.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/web/src/utils/aguiAbort.unit.test.ts @@ -5,6 +5,7 @@ import { transformHttpEventStream } from '@ag-ui/client'; function createAbortError(): Error { // DOMException is available in Node 18+; fall back to a named Error. try { + // eslint-disable-next-line no-new return new DOMException('aborted', 'AbortError') as unknown as Error; } catch { const error = new Error('aborted'); From b5b80740d56528bb23692d837e13278d174fb2a2 Mon Sep 17 00:00:00 2001 From: Sebas Date: Fri, 6 Feb 2026 11:14:55 -0800 Subject: [PATCH 31/70] fix(web): allow firing agent while setup interrupt is pending --- .../clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts | 1 + .../clients/web-ag-ui/apps/web/src/utils/aguiAbort.unit.test.ts | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts b/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts index bdeaa4ea..9a7b3d02 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts +++ b/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts @@ -38,6 +38,7 @@ import { cleanupAgentConnection } from '../utils/agentConnectionCleanup'; import { fireAgentRun } from '../utils/fireAgentRun'; import { scheduleCycleAfterInterruptResolution } from '../utils/interruptAutoCycle'; import { cleanupAgentConnection } from '../utils/agentConnectionCleanup'; +import { fireAgentRun } from '../utils/fireAgentRun'; export type { AgentState, diff --git a/typescript/clients/web-ag-ui/apps/web/src/utils/aguiAbort.unit.test.ts b/typescript/clients/web-ag-ui/apps/web/src/utils/aguiAbort.unit.test.ts index aabce800..fdee3f7d 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/utils/aguiAbort.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/web/src/utils/aguiAbort.unit.test.ts @@ -5,7 +5,6 @@ import { transformHttpEventStream } from '@ag-ui/client'; function createAbortError(): Error { // DOMException is available in Node 18+; fall back to a named Error. try { - // eslint-disable-next-line no-new return new DOMException('aborted', 'AbortError') as unknown as Error; } catch { const error = new Error('aborted'); From 2a4b5d6bfdd9fd56d2daf33051cd993b1d8c61dc Mon Sep 17 00:00:00 2001 From: Sebas Date: Fri, 6 Feb 2026 11:32:05 -0800 Subject: [PATCH 32/70] fix(agent-gmx-allora): treat Allora fetch failures as transient --- .../src/workflow/nodes/pollCycle.ts | 67 +++++++++++++++++-- .../tests/pollCycle.int.test.ts | 31 ++++++++- 2 files changed, 92 insertions(+), 6 deletions(-) diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts index b8144011..67137173 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts @@ -41,6 +41,7 @@ const DECISION_THRESHOLD = 0.62; const COOLDOWN_CYCLES = 2; const CONNECT_DELAY_MS = 2500; const CONNECT_DELAY_STEPS = 3; +const ALLORA_STALE_CYCLE_LIMIT = 3; function shouldDelayIteration(iteration: number): boolean { return iteration % 3 === 0; @@ -87,6 +88,7 @@ export const pollCycleNode = async ( const topicLabel = ALLORA_TOPIC_LABELS[topicKey]; let prediction: AlloraPrediction; + let staleCycles = state.view.metrics.staleCycles ?? 0; try { const inference = await fetchAlloraInference({ baseUrl: resolveAlloraApiBaseUrl(), @@ -94,6 +96,7 @@ export const pollCycleNode = async ( topicId, apiKey: resolveAlloraApiKey(), }); + staleCycles = 0; const currentPrice = state.view.metrics.previousPrice ?? inference.combinedValue; prediction = buildAlloraPrediction({ inference, @@ -103,17 +106,71 @@ export const pollCycleNode = async ( }); } catch (error: unknown) { const message = error instanceof Error ? error.message : 'Unknown error'; - const failureMessage = `ERROR: Failed to fetch Allora prediction: ${message}`; - const { task, statusEvent } = buildTaskStatus(state.view.task, 'failed', failureMessage); + staleCycles += 1; + + // Auth errors are configuration errors; surface them immediately. + if (message.includes('(401)') || message.includes('(403)')) { + const failureMessage = `ERROR: Failed to fetch Allora prediction: ${message}`; + const { task, statusEvent } = buildTaskStatus(state.view.task, 'failed', failureMessage); + await copilotkitEmitState(config, { + view: { + task, + activity: { events: [statusEvent], telemetry: state.view.activity.telemetry }, + }, + }); + return new Command({ + update: { + view: { + haltReason: failureMessage, + activity: { events: [statusEvent], telemetry: state.view.activity.telemetry }, + metrics: { ...state.view.metrics, staleCycles, iteration }, + task, + profile: state.view.profile, + transactionHistory: state.view.transactionHistory, + }, + }, + goto: 'summarize', + }); + } + + // Transient failures should not brick the agent; skip trades and retry on the next cycle. + if (staleCycles > ALLORA_STALE_CYCLE_LIMIT) { + const failureMessage = `ERROR: Abort: Allora API unreachable for ${staleCycles} consecutive cycles (last error: ${message})`; + const { task, statusEvent } = buildTaskStatus(state.view.task, 'failed', failureMessage); + await copilotkitEmitState(config, { + view: { + task, + activity: { events: [statusEvent], telemetry: state.view.activity.telemetry }, + }, + }); + return new Command({ + update: { + view: { + haltReason: failureMessage, + activity: { events: [statusEvent], telemetry: state.view.activity.telemetry }, + metrics: { ...state.view.metrics, staleCycles, iteration }, + task, + profile: state.view.profile, + transactionHistory: state.view.transactionHistory, + }, + }, + goto: 'summarize', + }); + } + + const warningMessage = `WARNING: Allora prediction unavailable (attempt ${staleCycles}/${ALLORA_STALE_CYCLE_LIMIT}); skipping trades this cycle.`; + const { task, statusEvent } = buildTaskStatus(state.view.task, 'working', warningMessage); await copilotkitEmitState(config, { - view: { task, activity: { events: [statusEvent], telemetry: state.view.activity.telemetry } }, + view: { + task, + activity: { events: [statusEvent], telemetry: state.view.activity.telemetry }, + }, }); return new Command({ update: { view: { - haltReason: failureMessage, activity: { events: [statusEvent], telemetry: state.view.activity.telemetry }, - metrics: state.view.metrics, + metrics: { ...state.view.metrics, staleCycles, iteration }, task, profile: state.view.profile, transactionHistory: state.view.transactionHistory, diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts index bc4133bf..d98e55eb 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it, vi } from 'vitest'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import type { AlloraInference } from '../src/clients/allora.js'; import type { PerpetualMarket, PerpetualPosition } from '../src/clients/onchainActions.js'; @@ -159,6 +159,35 @@ const baseMarket: PerpetualMarket = { }; describe('pollCycleNode (integration)', () => { + beforeEach(() => { + fetchAlloraInferenceMock.mockReset(); + listPerpetualMarketsMock.mockReset(); + listPerpetualPositionsMock.mockReset(); + createPerpetualLongMock.mockReset(); + createPerpetualShortMock.mockReset(); + createPerpetualCloseMock.mockReset(); + copilotkitEmitStateMock.mockReset(); + }); + + it('falls back to cached state when Allora fetch fails transiently', async () => { + fetchAlloraInferenceMock.mockRejectedValueOnce(new TypeError('fetch failed')); + + const state = buildBaseState(); + state.view.metrics.previousPrice = 47000; + + const result = await pollCycleNode(state, {}); + const update = (result as { update: ClmmState }).update; + + expect(update.view?.haltReason).toBeUndefined(); + expect(update.view?.metrics.staleCycles).toBe(1); + expect(update.view?.metrics.previousPrice).toBe(47000); + + const statusMessages = (update.view?.activity.events ?? []) + .filter((event) => event.type === 'status') + .map((event) => event.message); + expect(statusMessages.join(' ')).toContain('WARNING'); + }); + it('emits telemetry and execution plan artifacts on open action', async () => { fetchAlloraInferenceMock.mockResolvedValueOnce({ topicId: 14, From 6f73ebf6e0d7e3b10ada52061f3b953806a5a2a1 Mon Sep 17 00:00:00 2001 From: Sebas Date: Fri, 6 Feb 2026 12:46:13 -0800 Subject: [PATCH 33/70] Fix reset:dev-stack killing orphaned dev processes --- .../web-ag-ui/scripts/reset-dev-stack.sh | 83 +++++++++++++++++-- 1 file changed, 77 insertions(+), 6 deletions(-) diff --git a/typescript/clients/web-ag-ui/scripts/reset-dev-stack.sh b/typescript/clients/web-ag-ui/scripts/reset-dev-stack.sh index 7b460ddf..61022df4 100755 --- a/typescript/clients/web-ag-ui/scripts/reset-dev-stack.sh +++ b/typescript/clients/web-ag-ui/scripts/reset-dev-stack.sh @@ -4,6 +4,8 @@ set -u ports=(3000 3001 3002 3003 3004 3005 8123 8124 8125 8126) +repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)" + kill_pids() { local pids="$1" if [ -n "$pids" ]; then @@ -12,6 +14,56 @@ kill_pids() { fi } +pid_cwd() { + local pid="$1" + if ! command -v lsof >/dev/null 2>&1; then + return 0 + fi + lsof -p "$pid" 2>/dev/null | awk '$4=="cwd" {print $9; exit}' +} + +kill_pid_tree() { + local root_pid="$1" + local children + + # Depth-first: kill descendants first to reduce immediate respawns. + if command -v pgrep >/dev/null 2>&1; then + children="$(pgrep -P "$root_pid" 2>/dev/null || true)" + if [ -n "$children" ]; then + local child + for child in $children; do + kill_pid_tree "$child" + done + fi + fi + + kill_pids "$root_pid" +} + +kill_by_pattern_in_repo() { + local pattern="$1" + local pids pid cwd + + # Only kill processes whose working directory is inside this repo to avoid + # nuking unrelated `pnpm dev` sessions in other worktrees. + pids="$(ps -axo pid=,command= | awk -v pat="$pattern" '$0 ~ pat {print $1}')" + if [ -z "$pids" ]; then + return 0 + fi + + for pid in $pids; do + # Avoid killing ourselves / our parent shell. + if [ "$pid" = "$$" ] || [ "$pid" = "$PPID" ]; then + continue + fi + + cwd="$(pid_cwd "$pid" || true)" + if [ -n "$cwd" ] && [[ "$cwd" == "$repo_root"* ]]; then + kill_pid_tree "$pid" + fi + done +} + kill_playwright_headless() { # Smoke scripts (and other test tooling) can leave headless Chromium running if interrupted. # Those stale processes may keep polling the dev server, making logs appear "busy" even when @@ -35,15 +87,32 @@ kill_ports() { } kill_langgraph() { - local pids - pids=$(ps -axo pid=,command= | awk -v p1="langgraph-api/dist/cli/entrypoint.mjs" -v p2="apps/(agent|agent-clmm|agent-pendle|agent-gmx-allora)" '$0 ~ p1 && $0 ~ p2 {print $1}') - kill_pids "$pids" + # LangGraph CLI signatures have changed over time: + # - older: .../langgraph-api/dist/cli/entrypoint.mjs + # - newer: @langchain/langgraph-cli/.../cli.mjs or `pnpm exec langgraphjs dev` + # + # Some processes can also get orphaned (`ppid=1`) and will survive port-based kills + # if they chose a different port. We only kill those whose CWD is within this repo. + # Be specific enough to not kill shells/editor commands that merely *mention* these strings. + kill_by_pattern_in_repo "^node .*langgraph-api/dist/cli/entrypoint\\.mjs" + kill_by_pattern_in_repo "^node .*@langchain/langgraph-cli/.*cli\\.mjs dev" + kill_by_pattern_in_repo "^node .*\\/pnpm[^ ]* exec langgraphjs dev" + kill_by_pattern_in_repo "^bash .*scripts/langgraph-dev\\.sh" } kill_next_dev() { - local pids - pids=$(ps -axo pid=,command= | awk -v p1="apps/web" -v p2="next dev" '$0 ~ p1 && $0 ~ p2 {print $1}') - kill_pids "$pids" + # Match the actual Next.js dev process (usually `node .../next/dist/bin/next dev`). + kill_by_pattern_in_repo "^node .*next/dist/bin/next dev" +} + +kill_turbo_dev() { + # If a parent `turbo run dev` is still running, it will respawn children we just killed. + kill_by_pattern_in_repo "^node .*turbo[^ ]* .* run dev" +} + +kill_pnpm_dev() { + # `pnpm dev` is typically a node wrapper: `node .../pnpm dev`. + kill_by_pattern_in_repo "^node .*\\/pnpm[^ ]* dev( |$)" } cleanup_state() { @@ -51,6 +120,8 @@ cleanup_state() { } kill_ports +kill_turbo_dev +kill_pnpm_dev kill_langgraph kill_next_dev kill_playwright_headless From 281fe21f37612ec1e11e04db4dc94f04216f8219 Mon Sep 17 00:00:00 2001 From: Sebas Date: Fri, 6 Feb 2026 17:21:00 -0800 Subject: [PATCH 34/70] chore(web): add qa build script and harden e2e --- .../apps/agent-gmx-allora/.env.test.example | 14 + .../tests/setup/onchainActions.globalSetup.ts | 282 ++++++++ .../web-ag-ui/apps/web/.env.test.example | 16 + .../clients/web-ag-ui/apps/web/package.json | 12 +- .../apps/web/src/hooks/useAgentConnection.ts | 24 +- .../apps/web/src/utils/fireAgentRun.ts | 48 ++ .../web/src/utils/fireAgentRun.unit.test.ts | 56 ++ .../web/tests/setup/system.globalSetup.ts | 643 ++++++++++++++++++ typescript/clients/web-ag-ui/package.json | 1 + 9 files changed, 1086 insertions(+), 10 deletions(-) create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/setup/onchainActions.globalSetup.ts create mode 100644 typescript/clients/web-ag-ui/apps/web/.env.test.example create mode 100644 typescript/clients/web-ag-ui/apps/web/src/utils/fireAgentRun.ts create mode 100644 typescript/clients/web-ag-ui/apps/web/src/utils/fireAgentRun.unit.test.ts create mode 100644 typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example index 151b824c..980f8bde 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example @@ -1,2 +1,16 @@ # CI-safe defaults for integration/e2e tests. # Copy this file to `.env.test` to override locally (file is gitignored). + +# Local onchain-actions dev server (default is https://api.emberai.xyz) +ONCHAIN_ACTIONS_BASE_URL=http://localhost:50051 + +# If agent/web E2E needs to boot onchain-actions + memgraph locally, point at the worktree. +# Auto-discovery will look for a single `worktrees/onchain-actions-*` directory, but if you have +# more than one, set this explicitly. +# ONCHAIN_ACTIONS_WORKTREE_DIR=/absolute/path/to/forge/worktrees/onchain-actions-001 + +# Allora API (agent is the only component that talks to Allora directly). +ALLORA_API_BASE_URL=https://api.allora.network +# ALLORA_API_KEY= +# ALLORA_CHAIN_ID=allora-mainnet-1 + diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/setup/onchainActions.globalSetup.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/setup/onchainActions.globalSetup.ts new file mode 100644 index 00000000..e31df2a1 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/setup/onchainActions.globalSetup.ts @@ -0,0 +1,282 @@ +import { spawn } from 'node:child_process'; +import net from 'node:net'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import fs from 'node:fs'; + +type Cleanup = () => Promise | void; + +function resolveForgeRoot(): string { + const currentFilePath = fileURLToPath(import.meta.url); + const marker = `${path.sep}worktrees${path.sep}`; + const index = currentFilePath.lastIndexOf(marker); + if (index < 0) { + return process.cwd(); + } + return currentFilePath.slice(0, index); +} + +function resolveOnchainActionsDir(): string { + const override = process.env['ONCHAIN_ACTIONS_WORKTREE_DIR']; + if (override && override.trim().length > 0) { + return override.trim(); + } + + const worktreesDir = path.join(resolveForgeRoot(), 'worktrees'); + try { + const entries = fs.readdirSync(worktreesDir, { withFileTypes: true }); + const candidates = entries + .filter((entry) => entry.isDirectory() && entry.name.startsWith('onchain-actions-')) + .map((entry) => path.join(worktreesDir, entry.name)) + .filter((dir) => { + return ( + fs.existsSync(path.join(dir, 'package.json')) && + fs.existsSync(path.join(dir, 'compose.dev.db.yaml')) + ); + }); + + if (candidates.length === 1) { + return candidates[0]!; + } + if (candidates.length > 1) { + throw new Error( + `Multiple onchain-actions worktrees found. Set ONCHAIN_ACTIONS_WORKTREE_DIR explicitly.\n` + + candidates.map((value) => `- ${value}`).join('\n'), + ); + } + } catch { + // fall through to error below + } + + throw new Error( + `Unable to locate an onchain-actions worktree.\n` + + `Set ONCHAIN_ACTIONS_WORKTREE_DIR to an existing worktree directory (e.g. .../worktrees/onchain-actions-XXX).`, + ); +} + +const ONCHAIN_ACTIONS_DIR = resolveOnchainActionsDir(); +const MEMGRAPH_COMPOSE_FILE = + process.env['ONCHAIN_ACTIONS_MEMGRAPH_COMPOSE_FILE'] ?? + path.join(ONCHAIN_ACTIONS_DIR, 'compose.dev.db.yaml'); +const ONCHAIN_ACTIONS_PORT = 50051; +const HEALTH_URL = `http://localhost:${ONCHAIN_ACTIONS_PORT}/health` as const; +const MARKETS_URL = `http://localhost:${ONCHAIN_ACTIONS_PORT}/perpetuals/markets?chainIds=42161` as const; + +async function delay(ms: number): Promise { + await new Promise((resolve) => setTimeout(resolve, ms)); +} + +async function waitForHttpOk(url: string, timeoutMs: number): Promise { + const deadline = Date.now() + timeoutMs; + let lastError: unknown; + + while (Date.now() < deadline) { + try { + const response = await fetch(url); + if (response.ok) { + return; + } + lastError = new Error(`Non-OK response: ${response.status}`); + } catch (error: unknown) { + lastError = error; + } + + await delay(250); + } + + const message = lastError instanceof Error ? lastError.message : String(lastError); + throw new Error(`Timed out waiting for ${url}: ${message}`); +} + +async function waitForNonEmptyMarkets(url: string, timeoutMs: number): Promise { + const deadline = Date.now() + timeoutMs; + let lastError: unknown; + + while (Date.now() < deadline) { + try { + const response = await fetch(url); + if (!response.ok) { + lastError = new Error(`Non-OK response: ${response.status}`); + await delay(500); + continue; + } + const payload = (await response.json()) as { markets?: unknown[] }; + const count = Array.isArray(payload.markets) ? payload.markets.length : 0; + if (count > 0) { + return; + } + lastError = new Error('Markets response was empty'); + } catch (error: unknown) { + lastError = error; + } + + await delay(1000); + } + + const message = lastError instanceof Error ? lastError.message : String(lastError); + throw new Error(`Timed out waiting for non-empty markets from ${url}: ${message}`); +} + +async function waitForTcpPort(params: { host: string; port: number; timeoutMs: number }): Promise { + const deadline = Date.now() + params.timeoutMs; + let lastError: unknown; + + while (Date.now() < deadline) { + try { + await new Promise((resolve, reject) => { + const socket = net.connect({ host: params.host, port: params.port }); + socket.once('connect', () => { + socket.end(); + resolve(); + }); + socket.once('error', reject); + }); + return; + } catch (error: unknown) { + lastError = error; + } + + await delay(250); + } + + const message = lastError instanceof Error ? lastError.message : String(lastError); + throw new Error(`Timed out waiting for TCP ${params.host}:${params.port}: ${message}`); +} + +async function runCommandAndWait( + cmd: string, + args: string[], + options: { cwd: string; env?: NodeJS.ProcessEnv }, +): Promise { + const child = spawn(cmd, args, { + cwd: options.cwd, + env: options.env, + stdio: 'inherit', + }); + + await new Promise((resolve, reject) => { + child.once('error', reject); + child.once('exit', (code) => { + if (code === 0) { + resolve(); + return; + } + reject(new Error(`${cmd} ${args.join(' ')} exited with code ${code ?? 'null'}`)); + }); + }); +} + +function spawnLongLivedCommand( + cmd: string, + args: string[], + options: { cwd: string; env?: NodeJS.ProcessEnv }, +): { cleanup: Cleanup; getExitError: () => Error | undefined } { + const child = spawn(cmd, args, { + cwd: options.cwd, + env: options.env, + stdio: 'inherit', + }); + + let exitError: Error | undefined; + child.once('exit', (code, signal) => { + if (code === 0) { + return; + } + exitError = new Error( + `${cmd} ${args.join(' ')} exited unexpectedly (code=${code ?? 'null'}, signal=${signal ?? 'null'})`, + ); + }); + child.once('error', (error) => { + exitError = error instanceof Error ? error : new Error(String(error)); + }); + + return { + getExitError: () => exitError, + cleanup: async () => { + if (child.exitCode !== null) { + return; + } + child.kill('SIGTERM'); + + // Give it a moment to shutdown cleanly. + for (let i = 0; i < 20; i += 1) { + if (child.exitCode !== null) { + return; + } + await delay(100); + } + + child.kill('SIGKILL'); + }, + }; +} + +async function dockerCompose(args: string[]): Promise { + // Use the plugin-style CLI ("docker compose") to match modern setups. + await runCommandAndWait('docker', ['compose', ...args], { + cwd: ONCHAIN_ACTIONS_DIR, + env: process.env, + }); +} + +export default async function onchainActionsGlobalSetup(): Promise { + // Ensure tests target the local server started by this global setup. + process.env['ONCHAIN_ACTIONS_BASE_URL'] = `http://localhost:${ONCHAIN_ACTIONS_PORT}`; + + // Start Memgraph (required by onchain-actions container initialization). + await dockerCompose(['-f', MEMGRAPH_COMPOSE_FILE, 'up', '-d', 'memgraph']); + await waitForTcpPort({ host: '127.0.0.1', port: 7687, timeoutMs: 30_000 }); + + // Start onchain-actions REST server. + const onchainActionsEnv: NodeJS.ProcessEnv = { + ...process.env, + PORT: String(ONCHAIN_ACTIONS_PORT), + MEMGRAPH_HOST: 'localhost', + MEMGRAPH_BOLT_PORT: '7687', + MEMGRAPH_LAB_PORT: '7444', + TEST_ENV: 'mock', + // Avoid heavy/long-running services and first-import loops during tests. + SKIP_FIRST_IMPORT: 'false', + ENABLE_CONTRACT_SNIPER: 'false', + PRE_FETCH_GMX_MARKET_QUERY: 'false', + GMX_SKIP_SIMULATION: 'true', + // Minimal required settings for container init. + COINGECKO_API_KEY: process.env['COINGECKO_API_KEY'] ?? '', + COINGECKO_USE_PRO: process.env['COINGECKO_USE_PRO'] ?? 'false', + SQUID_INTEGRATOR_ID: process.env['SQUID_INTEGRATOR_ID'] ?? 'test', + DUNE_API_KEY: process.env['DUNE_API_KEY'] ?? 'test', + BIRDEYE_API_KEY: process.env['BIRDEYE_API_KEY'] ?? '', + PENDLE_CHAIN_IDS: process.env['PENDLE_CHAIN_IDS'] ?? '42161', + ALGEBRA_CHAIN_IDS: process.env['ALGEBRA_CHAIN_IDS'] ?? '42161', + GMX_CHAIN_IDS: process.env['GMX_CHAIN_IDS'] ?? '42161', + SERVICE_WALLET_PRIVATE_KEY: + process.env['SERVICE_WALLET_PRIVATE_KEY'] ?? `0x${'1'.repeat(64)}`, + DUST_CHAIN_ID: process.env['DUST_CHAIN_ID'] ?? '1', + DUST_CHAIN_RECEIVER_ADDRESS: + process.env['DUST_CHAIN_RECEIVER_ADDRESS'] ?? + '0x0000000000000000000000000000000000000000', + }; + + const server = spawnLongLivedCommand('pnpm', ['dev'], { + cwd: ONCHAIN_ACTIONS_DIR, + env: onchainActionsEnv, + }); + + // Wait for server readiness. + await waitForHttpOk(HEALTH_URL, 60_000); + const earlyExit = server.getExitError(); + if (earlyExit) { + throw earlyExit; + } + // Wait for plugin import to populate GMX perpetual markets. + await waitForNonEmptyMarkets(MARKETS_URL, 120_000); + const postImportExit = server.getExitError(); + if (postImportExit) { + throw postImportExit; + } + + return async () => { + await server.cleanup(); + await dockerCompose(['-f', MEMGRAPH_COMPOSE_FILE, 'down', '--remove-orphans']); + }; +} diff --git a/typescript/clients/web-ag-ui/apps/web/.env.test.example b/typescript/clients/web-ag-ui/apps/web/.env.test.example new file mode 100644 index 00000000..e71f9686 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/web/.env.test.example @@ -0,0 +1,16 @@ +# Values loaded automatically by `pnpm test:*` scripts via `tsx --env-file=...`. +# Copy this file to `.env.test` to override locally (file is gitignored). + +# Path to a local onchain-actions worktree. +# E2E can try to auto-discover a single `worktrees/onchain-actions-*` directory, but if you have +# more than one, you must set this explicitly. +# ONCHAIN_ACTIONS_WORKTREE_DIR=/absolute/path/to/forge/worktrees/onchain-actions-001 + +# Optional: override which docker compose file is used to boot memgraph. +# Defaults to `${ONCHAIN_ACTIONS_WORKTREE_DIR}/compose.dev.db.yaml`. +# ONCHAIN_ACTIONS_MEMGRAPH_COMPOSE_FILE=/absolute/path/to/compose.dev.db.yaml + +# E2E switches. +# Leave unset for normal CI-like behavior; set to "true" to use a real Allora API. +# The Allora base URL itself is configured in `apps/agent-gmx-allora/.env.test`. +WEB_E2E_USE_REAL_ALLORA=false diff --git a/typescript/clients/web-ag-ui/apps/web/package.json b/typescript/clients/web-ag-ui/apps/web/package.json index bb883745..30c015fc 100644 --- a/typescript/clients/web-ag-ui/apps/web/package.json +++ b/typescript/clients/web-ag-ui/apps/web/package.json @@ -6,13 +6,15 @@ "dev": "next dev", "build": "next build --webpack", "start": "next start", + "qa": "next build --webpack && next start", "lint": "eslint .", - "test": "pnpm test:unit", - "test:ci": "pnpm test:unit", + "lint:fix": "eslint . --fix", + "test": "pnpm test:unit && pnpm test:int && pnpm test:e2e", "test:watch": "vitest watch --config vitest.config.unit.ts", - "test:unit": "vitest run --config vitest.config.unit.ts", - "test:int": "vitest run --config vitest.config.unit.ts", - "test:e2e": "vitest run --config vitest.config.unit.ts", + "test:unit": "bash -lc 'ENV_FILE=.env.test; [ -f \"$ENV_FILE\" ] || ENV_FILE=.env.test.example; exec node --env-file=\"$ENV_FILE\" ./node_modules/vitest/vitest.mjs run --config vitest.config.unit.ts \"$@\"' --", + "test:int": "bash -lc 'ENV_FILE=.env.test; [ -f \"$ENV_FILE\" ] || ENV_FILE=.env.test.example; exec node --env-file=\"$ENV_FILE\" ./node_modules/vitest/vitest.mjs run --config vitest.config.unit.ts \"$@\"' --", + "test:e2e": "bash -lc 'ENV_FILE=.env.test; [ -f \"$ENV_FILE\" ] || ENV_FILE=.env.test.example; exec node --env-file=\"$ENV_FILE\" ./node_modules/vitest/vitest.mjs run --config vitest.config.e2e.ts --no-file-parallelism --maxConcurrency=1 \"$@\"' --", + "test:ci": "pnpm test:unit && pnpm test:int", "test:coverage": "vitest run --config vitest.config.unit.ts --coverage" }, "dependencies": { diff --git a/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts b/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts index 063f07b9..788d96c6 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts +++ b/typescript/clients/web-ag-ui/apps/web/src/hooks/useAgentConnection.ts @@ -34,6 +34,7 @@ import { initialAgentState, } from '../types/agent'; import { applyAgentSyncToState, parseAgentSyncResponse } from '../utils/agentSync'; +import { fireAgentRun } from '../utils/fireAgentRun'; import { scheduleCycleAfterInterruptResolution } from '../utils/interruptAutoCycle'; export type { @@ -454,12 +455,25 @@ export function useAgentConnection(agentId: string): UseAgentConnectionResult { }, [runCommand, isHired, isHiring]); const runFire = useCallback(() => { - if (!isFiring) { - if (!runCommand('fire')) return; - setIsFiring(true); + if (isFiring) return; + + setIsFiring(true); + const currentAgent = agentRef.current; + void fireAgentRun({ + agent: currentAgent, + runAgent: async (value) => + copilotkit.runAgent({ agent: value } as unknown as Parameters[0]), + threadId, + runInFlightRef, + createId: v7, + }).then((ok) => { + if (!ok) { + setIsFiring(false); + return; + } setTimeout(() => setIsFiring(false), 3000); - } - }, [runCommand, isFiring]); + }); + }, [copilotkit, isFiring, threadId]); const resolveInterrupt = useCallback( ( diff --git a/typescript/clients/web-ag-ui/apps/web/src/utils/fireAgentRun.ts b/typescript/clients/web-ag-ui/apps/web/src/utils/fireAgentRun.ts new file mode 100644 index 00000000..d2e317a7 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/web/src/utils/fireAgentRun.ts @@ -0,0 +1,48 @@ +import type { v7 as uuidv7 } from 'uuid'; + +type AgentLike = { + addMessage: (message: { id: string; role: 'user'; content: string }) => void; + abortRun?: () => void; + detachActiveRun?: () => Promise | void; +}; + +type BoolRef = { current: boolean }; + +export async function fireAgentRun(params: { + agent: TAgent | null; + runAgent: (agent: TAgent) => Promise; + threadId: string | undefined; + runInFlightRef: BoolRef; + createId: typeof uuidv7; +}): Promise { + const { agent, threadId, runInFlightRef } = params; + if (!agent || !threadId) return false; + + // If an onboarding run is currently blocked at an interrupt, the hook-level guard + // prevents new commands. `fire` is special: it must always work as an escape hatch. + if (runInFlightRef.current) { + try { + agent.abortRun?.(); + } finally { + await Promise.resolve(agent.detachActiveRun?.()).catch(() => { + // best-effort; ignore + }); + } + } + + // Keep `runInFlightRef` true: we are immediately starting a new run. + runInFlightRef.current = true; + + agent.addMessage({ + id: params.createId(), + role: 'user', + content: JSON.stringify({ command: 'fire' }), + }); + + // Fire-and-forget: UI state updates will flow in via the AG-UI stream / sync poller. + void params.runAgent(agent).catch(() => { + // Errors are surfaced via CopilotKit / agent subscribers. + }); + + return true; +} diff --git a/typescript/clients/web-ag-ui/apps/web/src/utils/fireAgentRun.unit.test.ts b/typescript/clients/web-ag-ui/apps/web/src/utils/fireAgentRun.unit.test.ts new file mode 100644 index 00000000..f831af68 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/web/src/utils/fireAgentRun.unit.test.ts @@ -0,0 +1,56 @@ +import { describe, expect, it, vi } from 'vitest'; + +import { fireAgentRun } from './fireAgentRun'; + +describe('fireAgentRun', () => { + it('force-detaches the active run then sends the fire command', async () => { + const calls: string[] = []; + + const agent = { + abortRun: vi.fn(() => calls.push('abortRun')), + detachActiveRun: vi.fn(async () => calls.push('detachActiveRun')), + addMessage: vi.fn(() => calls.push('addMessage')), + }; + const copilotkit = { + runAgent: vi.fn(async () => calls.push('runAgent')), + }; + + const runInFlightRef = { current: true }; + + const ok = await fireAgentRun({ + agent, + runAgent: async (value) => copilotkit.runAgent({ agent: value }), + threadId: 'thread-1', + runInFlightRef, + createId: () => 'msg-1', + }); + + expect(ok).toBe(true); + expect(runInFlightRef.current).toBe(true); + expect(agent.abortRun).toHaveBeenCalledTimes(1); + expect(agent.detachActiveRun).toHaveBeenCalledTimes(1); + expect(agent.addMessage).toHaveBeenCalledTimes(1); + expect(copilotkit.runAgent).toHaveBeenCalledTimes(1); + expect(calls).toEqual(['abortRun', 'detachActiveRun', 'addMessage', 'runAgent']); + }); + + it('does nothing when threadId is missing', async () => { + const agent = { abortRun: vi.fn(), detachActiveRun: vi.fn(), addMessage: vi.fn() }; + const copilotkit = { runAgent: vi.fn() }; + const runInFlightRef = { current: true }; + + const ok = await fireAgentRun({ + agent, + runAgent: async (value) => copilotkit.runAgent({ agent: value }), + threadId: undefined, + runInFlightRef, + createId: () => 'msg-1', + }); + + expect(ok).toBe(false); + expect(agent.abortRun).not.toHaveBeenCalled(); + expect(agent.detachActiveRun).not.toHaveBeenCalled(); + expect(agent.addMessage).not.toHaveBeenCalled(); + expect(copilotkit.runAgent).not.toHaveBeenCalled(); + }); +}); diff --git a/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts b/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts new file mode 100644 index 00000000..844d2a8c --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts @@ -0,0 +1,643 @@ +import { execFileSync, spawn } from 'node:child_process'; +import crypto from 'node:crypto'; +import { fileURLToPath } from 'node:url'; +import path from 'node:path'; +import http from 'node:http'; +import net from 'node:net'; +import fs from 'node:fs'; + +type Cleanup = () => Promise | void; +type Child = ReturnType; + +function killProcessTree(child: Child, signal: NodeJS.Signals): void { + // `pnpm dev` frequently spawns a child node process. Use a new process group and kill + // the group so we don't leave stray processes holding the Vitest runner open. + const pid = child.pid; + if (!pid) { + child.kill(signal); + return; + } + try { + process.kill(-pid, signal); + return; + } catch { + // Fallback: best-effort direct kill. + } + child.kill(signal); +} + +function resolveBooleanEnv(name: string, fallback: boolean): boolean { + const raw = process.env[name]; + if (!raw) return fallback; + if (raw === 'true') return true; + if (raw === 'false') return false; + return fallback; +} + +function resolvePnpmInvocation(): { command: string; prefixArgs: string[] } { + const execPath = process.env.npm_execpath; + const nodePath = process.env.npm_node_execpath; + if (execPath && nodePath && execPath.endsWith('.js')) { + return { command: nodePath, prefixArgs: [execPath] }; + } + return { command: 'pnpm', prefixArgs: [] }; +} + +function resolveForgeRoot(): string { + const currentFilePath = fileURLToPath(import.meta.url); + const marker = `${path.sep}worktrees${path.sep}`; + const index = currentFilePath.lastIndexOf(marker); + if (index < 0) { + return process.cwd(); + } + return currentFilePath.slice(0, index); +} + +function parseEnvFile(contents: string): Record { + const out: Record = {}; + for (const rawLine of contents.split('\n')) { + const line = rawLine.trim(); + if (!line || line.startsWith('#')) continue; + const normalized = line.startsWith('export ') ? line.slice('export '.length).trim() : line; + const idx = normalized.indexOf('='); + if (idx <= 0) continue; + const key = normalized.slice(0, idx).trim(); + if (!key) continue; + let value = normalized.slice(idx + 1).trim(); + if ( + (value.startsWith('"') && value.endsWith('"') && value.length >= 2) || + (value.startsWith("'") && value.endsWith("'") && value.length >= 2) + ) { + value = value.slice(1, -1); + } + out[key] = value; + } + return out; +} + +function loadEnvFileIfPresent(filePath: string): void { + try { + if (!fs.existsSync(filePath)) return; + const parsed = parseEnvFile(fs.readFileSync(filePath, 'utf8')); + for (const [key, value] of Object.entries(parsed)) { + if (process.env[key] === undefined) { + process.env[key] = value; + } + } + } catch { + // best-effort: env files are optional + } +} + +function loadAgentTestEnv(): void { + // E2E tests run from apps/web, but the Allora configuration belongs to the agent. + // Load agent-gmx-allora `.env.test`/`.env.test.example` as a fallback (without overriding + // any already-provided environment variables). + const agentDir = path.resolve(process.cwd(), '..', 'agent-gmx-allora'); + loadEnvFileIfPresent(path.join(agentDir, '.env.test')); + loadEnvFileIfPresent(path.join(agentDir, '.env.test.example')); +} + +function resolveOnchainActionsDir(): string { + const override = process.env['ONCHAIN_ACTIONS_WORKTREE_DIR']; + if (override && override.trim().length > 0) { + return override.trim(); + } + + const worktreesDir = path.join(resolveForgeRoot(), 'worktrees'); + try { + const entries = fs.readdirSync(worktreesDir, { withFileTypes: true }); + const candidates = entries + .filter((entry) => entry.isDirectory() && entry.name.startsWith('onchain-actions-')) + .map((entry) => path.join(worktreesDir, entry.name)) + .filter((dir) => { + return ( + fs.existsSync(path.join(dir, 'package.json')) && + fs.existsSync(path.join(dir, 'compose.dev.db.yaml')) + ); + }); + + if (candidates.length === 1) { + return candidates[0]!; + } + if (candidates.length > 1) { + throw new Error( + `Multiple onchain-actions worktrees found. Set ONCHAIN_ACTIONS_WORKTREE_DIR explicitly.\n` + + candidates.map((value) => `- ${value}`).join('\n'), + ); + } + } catch { + // fall through to error below + } + + throw new Error( + `Unable to locate an onchain-actions worktree.\n` + + `Set ONCHAIN_ACTIONS_WORKTREE_DIR to an existing worktree directory (e.g. .../worktrees/onchain-actions-XXX).`, + ); +} + +function resolvePnpmBin(): string { + const home = process.env['HOME']; + const toolBases = home + ? [ + path.join(home, 'Library', 'pnpm', '.tools', 'pnpm'), + path.join(home, '.local', 'share', 'pnpm', '.tools', 'pnpm'), + ] + : []; + + const toolCandidates: string[] = []; + for (const base of toolBases) { + try { + const entries = fs.readdirSync(base, { withFileTypes: true }); + for (const entry of entries) { + if (!entry.isDirectory()) continue; + const bin = path.join(base, entry.name, 'bin', 'pnpm'); + if (fs.existsSync(bin)) { + toolCandidates.push(bin); + } + } + } catch { + // ignore + } + } + + const candidates = [ + process.env['PNPM_BINARY'], + ...toolCandidates, + '/usr/local/bin/pnpm', + '/opt/homebrew/bin/pnpm', + 'pnpm', + ].filter((value): value is string => Boolean(value && value.trim().length > 0)); + + let best: { bin: string; major: number } | null = null; + + for (const candidate of candidates) { + if (candidate.includes(path.sep) && !fs.existsSync(candidate)) { + continue; + } + try { + const version = execFileSync(candidate, ['-v'], { encoding: 'utf8' }).trim(); + const major = Number(version.split('.')[0] ?? NaN); + if (!Number.isFinite(major)) { + continue; + } + if (!best || major > best.major) { + best = { bin: candidate, major }; + } + // Prefer pnpm v10+ immediately. + if (major >= 10) { + return candidate; + } + } catch { + continue; + } + } + + return best?.bin ?? 'pnpm'; +} + +async function getFreePort(): Promise { + return await new Promise((resolve, reject) => { + const server = net.createServer(); + server.once('error', reject); + server.listen(0, '127.0.0.1', () => { + const address = server.address(); + if (!address || typeof address === 'string') { + server.close(() => reject(new Error('Unable to resolve an ephemeral port.'))); + return; + } + const port = address.port; + server.close((closeErr) => (closeErr ? reject(closeErr) : resolve(port))); + }); + }); +} + +async function waitForHttp(params: { + url: string; + timeoutMs: number; + child?: Child; + childOutput?: string[]; + predicate?: (res: Response) => boolean; +}): Promise { + const start = Date.now(); + const predicate = params.predicate ?? ((res) => res.status >= 200); + + while (Date.now() - start < params.timeoutMs) { + if (params.child && params.child.exitCode !== null) { + const logs = params.childOutput?.slice(-80).join('\n') ?? ''; + throw new Error( + `Server process exited before becoming ready (code=${params.child.exitCode}).` + + (logs ? `\nLast logs:\n${logs}` : ''), + ); + } + + try { + const res = await fetch(params.url); + if (predicate(res)) { + return; + } + } catch { + // Ignore until timeout. + } + + await new Promise((r) => setTimeout(r, 250)); + } + + const logs = params.childOutput?.slice(-80).join('\n') ?? ''; + throw new Error(`Timed out waiting for ${params.url}` + (logs ? `\nLast logs:\n${logs}` : '')); +} + +function spawnProcess(params: { + cwd: string; + args: string[]; + env?: NodeJS.ProcessEnv; +}): { child: Child; output: string[]; cleanup: Cleanup } { + const pnpm = resolvePnpmInvocation(); + const child = spawn(pnpm.command, [...pnpm.prefixArgs, ...params.args], { + cwd: params.cwd, + env: { ...process.env, ...params.env }, + detached: true, + stdio: 'pipe', + }); + + const output: string[] = []; + child.stdout?.on('data', (chunk: Buffer) => output.push(chunk.toString('utf8'))); + child.stderr?.on('data', (chunk: Buffer) => output.push(chunk.toString('utf8'))); + + const cleanup: Cleanup = async () => { + if (child.exitCode !== null) return; + killProcessTree(child, 'SIGTERM'); + await new Promise((r) => setTimeout(r, 2_000)); + if (child.exitCode === null) { + killProcessTree(child, 'SIGKILL'); + } + }; + + return { child, output, cleanup }; +} + +async function delay(ms: number): Promise { + await new Promise((r) => setTimeout(r, ms)); +} + +async function waitForTcpPort(params: { host: string; port: number; timeoutMs: number }): Promise { + const deadline = Date.now() + params.timeoutMs; + let lastError: unknown; + + while (Date.now() < deadline) { + try { + await new Promise((resolve, reject) => { + const socket = net.connect({ host: params.host, port: params.port }); + socket.once('connect', () => { + socket.end(); + resolve(); + }); + socket.once('error', reject); + }); + return; + } catch (error: unknown) { + lastError = error; + } + + await delay(250); + } + + const message = lastError instanceof Error ? lastError.message : String(lastError); + throw new Error(`Timed out waiting for TCP ${params.host}:${params.port}: ${message}`); +} + +async function waitForHttpOk(url: string, timeoutMs: number): Promise { + const deadline = Date.now() + timeoutMs; + let lastError: unknown; + + while (Date.now() < deadline) { + try { + const response = await fetch(url); + if (response.ok) { + return; + } + lastError = new Error(`Non-OK response: ${response.status}`); + } catch (error: unknown) { + lastError = error; + } + + await delay(250); + } + + const message = lastError instanceof Error ? lastError.message : String(lastError); + throw new Error(`Timed out waiting for ${url}: ${message}`); +} + +async function waitForNonEmptyMarkets(url: string, timeoutMs: number): Promise { + const deadline = Date.now() + timeoutMs; + let lastError: unknown; + + while (Date.now() < deadline) { + try { + const response = await fetch(url); + if (!response.ok) { + lastError = new Error(`Non-OK response: ${response.status}`); + await delay(500); + continue; + } + const payload = (await response.json()) as { markets?: unknown[] }; + const count = Array.isArray(payload.markets) ? payload.markets.length : 0; + if (count > 0) { + return; + } + lastError = new Error('Markets response was empty'); + } catch (error: unknown) { + lastError = error; + } + + await delay(1000); + } + + const message = lastError instanceof Error ? lastError.message : String(lastError); + throw new Error(`Timed out waiting for non-empty markets from ${url}: ${message}`); +} + +async function runCommandAndWait(cmd: string, args: string[], cwd: string): Promise { + const child = spawn(cmd, args, { + cwd, + env: process.env, + stdio: 'inherit', + }); + + await new Promise((resolve, reject) => { + child.once('error', reject); + child.once('exit', (code) => { + if (code === 0) { + resolve(); + return; + } + reject(new Error(`${cmd} ${args.join(' ')} exited with code ${code ?? 'null'}`)); + }); + }); +} + +async function dockerCompose(dir: string, args: string[]): Promise { + await runCommandAndWait('docker', ['compose', ...args], dir); +} + +async function startOnchainActions(): Promise<{ baseUrl: string; cleanup: Cleanup }> { + const ONCHAIN_ACTIONS_DIR = resolveOnchainActionsDir(); + const MEMGRAPH_COMPOSE_FILE = + process.env['ONCHAIN_ACTIONS_MEMGRAPH_COMPOSE_FILE'] ?? + path.join(ONCHAIN_ACTIONS_DIR, 'compose.dev.db.yaml'); + + const ONCHAIN_ACTIONS_PORT = 50051; + const baseUrl = `http://127.0.0.1:${ONCHAIN_ACTIONS_PORT}`; + const HEALTH_URL = `${baseUrl}/health`; + const MARKETS_URL = `${baseUrl}/perpetuals/markets?chainIds=42161`; + + // Ensure tests target the local server started by this setup. + process.env['ONCHAIN_ACTIONS_BASE_URL'] = baseUrl; + + await dockerCompose(ONCHAIN_ACTIONS_DIR, ['-f', MEMGRAPH_COMPOSE_FILE, 'up', '-d', 'memgraph']); + await waitForTcpPort({ host: '127.0.0.1', port: 7687, timeoutMs: 30_000 }); + + const pnpmBin = resolvePnpmBin(); + try { + const version = execFileSync(pnpmBin, ['-v'], { encoding: 'utf8' }).trim(); + console.log('[web-e2e] pnpm for onchain-actions', { pnpmBin, version }); + if (!version.startsWith('10.')) { + console.warn('[web-e2e] pnpm version for onchain-actions is not v10+', { pnpmBin, version }); + } + } catch (error) { + console.warn('[web-e2e] Unable to read pnpm version for onchain-actions', { + pnpmBin, + error: error instanceof Error ? error.message : String(error), + }); + } + const server = spawn(pnpmBin, ['dev'], { + cwd: ONCHAIN_ACTIONS_DIR, + env: { + ...process.env, + PORT: String(ONCHAIN_ACTIONS_PORT), + MEMGRAPH_HOST: 'localhost', + MEMGRAPH_BOLT_PORT: '7687', + MEMGRAPH_LAB_PORT: '7444', + TEST_ENV: 'mock', + SKIP_FIRST_IMPORT: 'false', + ENABLE_CONTRACT_SNIPER: 'false', + PRE_FETCH_GMX_MARKET_QUERY: 'false', + GMX_SKIP_SIMULATION: 'true', + COINGECKO_API_KEY: process.env['COINGECKO_API_KEY'] ?? '', + COINGECKO_USE_PRO: process.env['COINGECKO_USE_PRO'] ?? 'false', + SQUID_INTEGRATOR_ID: process.env['SQUID_INTEGRATOR_ID'] ?? 'test', + DUNE_API_KEY: process.env['DUNE_API_KEY'] ?? 'test', + BIRDEYE_API_KEY: process.env['BIRDEYE_API_KEY'] ?? '', + PENDLE_CHAIN_IDS: process.env['PENDLE_CHAIN_IDS'] ?? '42161', + ALGEBRA_CHAIN_IDS: process.env['ALGEBRA_CHAIN_IDS'] ?? '42161', + GMX_CHAIN_IDS: process.env['GMX_CHAIN_IDS'] ?? '42161', + SERVICE_WALLET_PRIVATE_KEY: process.env['SERVICE_WALLET_PRIVATE_KEY'] ?? `0x${'1'.repeat(64)}`, + DUST_CHAIN_ID: process.env['DUST_CHAIN_ID'] ?? '1', + DUST_CHAIN_RECEIVER_ADDRESS: + process.env['DUST_CHAIN_RECEIVER_ADDRESS'] ?? '0x0000000000000000000000000000000000000000', + }, + detached: true, + stdio: 'inherit', + }); + + let exitError: Error | undefined; + server.once('exit', (code, signal) => { + if (code === 0) return; + exitError = new Error( + `onchain-actions exited unexpectedly (code=${code ?? 'null'}, signal=${signal ?? 'null'})`, + ); + }); + server.once('error', (error) => { + exitError = error instanceof Error ? error : new Error(String(error)); + }); + + await waitForHttpOk(HEALTH_URL, 60_000); + if (exitError) throw exitError; + + // onchain-actions performs a fairly heavy initial import (and may be rate-limited by CoinGecko), + // so give it enough time to hydrate the GMX markets list before running UI/system E2E tests. + await waitForNonEmptyMarkets(MARKETS_URL, 240_000); + if (exitError) throw exitError; + + return { + baseUrl, + cleanup: async () => { + if (server.exitCode === null) { + killProcessTree(server, 'SIGTERM'); + for (let i = 0; i < 20; i += 1) { + if (server.exitCode !== null) break; + await delay(100); + } + if (server.exitCode === null) { + killProcessTree(server, 'SIGKILL'); + } + } + await dockerCompose(ONCHAIN_ACTIONS_DIR, ['-f', MEMGRAPH_COMPOSE_FILE, 'down', '--remove-orphans']); + }, + }; +} + +async function startMockAlloraServer(): Promise<{ + baseUrl: string; + cleanup: Cleanup; +}> { + const server = http.createServer((req, res) => { + if (!req.url) { + res.statusCode = 400; + res.end('Missing URL'); + return; + } + + const url = new URL(req.url, 'http://127.0.0.1'); + const match = url.pathname.match(/^\/v2\/allora\/consumer\/(.+)$/u); + if (!match) { + res.statusCode = 404; + res.end('not found'); + return; + } + + const topicId = url.searchParams.get('allora_topic_id') ?? '0'; + const combined = topicId === '14' ? '48000' : topicId === '2' ? '2600' : '100'; + + res.setHeader('content-type', 'application/json'); + res.statusCode = 200; + res.end( + JSON.stringify({ + status: true, + data: { + inference_data: { + topic_id: topicId, + network_inference_normalized: combined, + }, + }, + }), + ); + }); + + await new Promise((resolve, reject) => { + server.once('error', reject); + server.listen(0, '127.0.0.1', () => resolve()); + }); + + const address = server.address(); + if (!address || typeof address === 'string') { + server.close(); + throw new Error('Failed to resolve mock Allora server address.'); + } + + const baseUrl = `http://127.0.0.1:${address.port}`; + + return { + baseUrl, + cleanup: async () => { + await new Promise((resolve) => server.close(() => resolve())); + }, + }; +} + +export default async function systemGlobalSetup(): Promise { + // 1) Start onchain-actions + memgraph. + const onchain = await startOnchainActions(); + const onchainCleanup = onchain.cleanup; + const onchainBaseUrl = onchain.baseUrl; + + // Load agent test env to pick up Allora configuration (e.g. ALLORA_API_BASE_URL). + loadAgentTestEnv(); + + // 2) Start mock Allora API and point the agent runtime at it. + const shouldUseRealAllora = resolveBooleanEnv('WEB_E2E_USE_REAL_ALLORA', false); + const mockAllora = shouldUseRealAllora ? undefined : await startMockAlloraServer(); + + const alloraBaseUrl = shouldUseRealAllora + ? process.env['ALLORA_API_BASE_URL'] ?? 'https://api.allora.network' + : mockAllora!.baseUrl; + + process.env.ALLORA_API_BASE_URL = alloraBaseUrl; + + // 3) Start LangGraph runtime for agent-gmx-allora. + const langgraphPort = await getFreePort(); + const langgraphBaseUrl = `http://127.0.0.1:${langgraphPort}`; + process.env.LANGGRAPH_GMX_ALLORA_DEPLOYMENT_URL = langgraphBaseUrl; + process.env.WEB_E2E_LANGGRAPH_BASE_URL = langgraphBaseUrl; + + const langgraph = spawnProcess({ + cwd: process.cwd(), // apps/web + args: [ + 'exec', + 'langgraphjs', + 'dev', + '--port', + String(langgraphPort), + '--host', + '127.0.0.1', + '--no-browser', + '--config', + '../agent-gmx-allora', + ], + env: { + ...process.env, + DELEGATIONS_BYPASS: 'true', + GMX_ALLORA_MODE: 'debug', + ONCHAIN_ACTIONS_BASE_URL: onchainBaseUrl, + ALLORA_API_BASE_URL: alloraBaseUrl, + }, + }); + + // Server returns 404 on unknown thread state, but that still proves it's accepting connections. + await waitForHttp({ + url: `${langgraphBaseUrl}/threads/00000000-0000-0000-0000-000000000000/state`, + timeoutMs: 60_000, + child: langgraph.child, + childOutput: langgraph.output, + predicate: (res) => res.status === 404, + }); + + // 4) Start the web app server. + const webPort = await getFreePort(); + const webBaseUrl = `http://127.0.0.1:${webPort}`; + process.env.WEB_E2E_BASE_URL = webBaseUrl; + + // If a previous dev server crashed, it can leave a stale lock file behind. + try { + const lockPath = path.join(process.cwd(), '.next', 'dev', 'lock'); + if (fs.existsSync(lockPath)) { + fs.unlinkSync(lockPath); + } + } catch { + // ignore + } + + const web = spawnProcess({ + cwd: process.cwd(), // apps/web + args: ['dev', '-p', String(webPort), '-H', '127.0.0.1'], + env: { + ...process.env, + LANGGRAPH_GMX_ALLORA_DEPLOYMENT_URL: langgraphBaseUrl, + // Keep other agents from failing if the UI touches them. + LANGGRAPH_DEPLOYMENT_URL: langgraphBaseUrl, + LANGGRAPH_PENDLE_DEPLOYMENT_URL: langgraphBaseUrl, + }, + }); + + await waitForHttp({ + url: `${webBaseUrl}/hire-agents`, + timeoutMs: 120_000, + child: web.child, + childOutput: web.output, + predicate: (res) => res.status === 200, + }); + + console.log('[web-e2e] services ready', { + webBaseUrl, + langgraphBaseUrl, + onchainActionsBaseUrl: onchainBaseUrl, + alloraMockBaseUrl: shouldUseRealAllora ? undefined : alloraBaseUrl, + }); + + return async () => { + await web.cleanup(); + await langgraph.cleanup(); + await mockAllora?.cleanup(); + await onchainCleanup(); + }; +} diff --git a/typescript/clients/web-ag-ui/package.json b/typescript/clients/web-ag-ui/package.json index 345328db..afd2180c 100644 --- a/typescript/clients/web-ag-ui/package.json +++ b/typescript/clients/web-ag-ui/package.json @@ -8,6 +8,7 @@ "scripts": { "dev": "turbo run dev", "dev:delegations-bypass": "DELEGATIONS_BYPASS=true NEXT_PUBLIC_DELEGATIONS_BYPASS=true turbo run dev", + "qa": "pnpm --filter web qa", "build": "turbo run build", "start": "turbo run start", "start:delegations-bypass": "DELEGATIONS_BYPASS=true NEXT_PUBLIC_DELEGATIONS_BYPASS=true turbo run start", From b66f9f4b4b6557fd270395a88345deb7b8cfa3e5 Mon Sep 17 00:00:00 2001 From: Sebas Date: Fri, 6 Feb 2026 17:29:23 -0800 Subject: [PATCH 35/70] test(web): add e2e coverage for agent sync --- .../src/app/api/agents/sync/route.e2e.test.ts | 36 +++++++++++++++++++ .../web-ag-ui/apps/web/vitest.config.e2e.ts | 27 ++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 typescript/clients/web-ag-ui/apps/web/src/app/api/agents/sync/route.e2e.test.ts create mode 100644 typescript/clients/web-ag-ui/apps/web/vitest.config.e2e.ts diff --git a/typescript/clients/web-ag-ui/apps/web/src/app/api/agents/sync/route.e2e.test.ts b/typescript/clients/web-ag-ui/apps/web/src/app/api/agents/sync/route.e2e.test.ts new file mode 100644 index 00000000..207b662c --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/web/src/app/api/agents/sync/route.e2e.test.ts @@ -0,0 +1,36 @@ +import crypto from 'node:crypto'; + +import { describe, expect, it } from 'vitest'; + +function requireEnv(name: string): string { + const value = process.env[name]; + if (!value) { + throw new Error(`Missing env var: ${name}`); + } + return value; +} + +describe('POST /api/agents/sync (e2e)', () => { + it('syncs against a running agent runtime without stubbing fetch', async () => { + const webBaseUrl = requireEnv('WEB_E2E_BASE_URL'); + + const response = await fetch(`${webBaseUrl}/api/agents/sync`, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ + agentId: 'agent-gmx-allora', + threadId: crypto.randomUUID(), + }), + }); + + expect(response.status).toBe(200); + const payload = (await response.json()) as unknown; + + expect(payload).toEqual( + expect.objectContaining({ + agentId: 'agent-gmx-allora', + }), + ); + }); +}); + diff --git a/typescript/clients/web-ag-ui/apps/web/vitest.config.e2e.ts b/typescript/clients/web-ag-ui/apps/web/vitest.config.e2e.ts new file mode 100644 index 00000000..f6459531 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/web/vitest.config.e2e.ts @@ -0,0 +1,27 @@ +import { defineConfig } from 'vitest/config'; +import tsconfigPaths from 'vite-tsconfig-paths'; + +const setupFiles = ['./tests/setup/vitest.setup.ts']; + +export default defineConfig({ + plugins: [tsconfigPaths()], + test: { + name: 'e2e', + globals: true, + environment: 'node', + setupFiles, + globalSetup: ['./tests/setup/system.globalSetup.ts'], + include: ['src/**/*.e2e.test.ts', 'tests/**/*.e2e.test.ts'], + testTimeout: 90_000, + hookTimeout: 90_000, + coverage: { + provider: 'v8', + reportsDirectory: './coverage/e2e', + reporter: ['text', 'lcov'], + }, + typecheck: { + tsconfig: './tsconfig.vitest.json', + }, + }, +}); + From 35ad8324bef27ccf0c7ce78b466c0f98aff9ef99 Mon Sep 17 00:00:00 2001 From: Sebas Date: Fri, 6 Feb 2026 17:29:41 -0800 Subject: [PATCH 36/70] chore(web): include Next dev type output --- typescript/clients/web-ag-ui/apps/web/tsconfig.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/typescript/clients/web-ag-ui/apps/web/tsconfig.json b/typescript/clients/web-ag-ui/apps/web/tsconfig.json index b575f7da..1430e772 100644 --- a/typescript/clients/web-ag-ui/apps/web/tsconfig.json +++ b/typescript/clients/web-ag-ui/apps/web/tsconfig.json @@ -33,7 +33,8 @@ "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", - ".next/dev/types/**/*.ts" + ".next/dev/types/**/*.ts", + ".next/dev/dev/types/**/*.ts" ], "exclude": [ "node_modules" From a7792b6d9d9a16352d49430f7ba8233bd2701601 Mon Sep 17 00:00:00 2001 From: Sebas Date: Fri, 6 Feb 2026 12:46:13 -0800 Subject: [PATCH 37/70] Fix reset:dev-stack killing orphaned dev processes --- .../web-ag-ui/scripts/reset-dev-stack.sh | 83 +++++++++++++++++-- 1 file changed, 77 insertions(+), 6 deletions(-) diff --git a/typescript/clients/web-ag-ui/scripts/reset-dev-stack.sh b/typescript/clients/web-ag-ui/scripts/reset-dev-stack.sh index 7b460ddf..61022df4 100755 --- a/typescript/clients/web-ag-ui/scripts/reset-dev-stack.sh +++ b/typescript/clients/web-ag-ui/scripts/reset-dev-stack.sh @@ -4,6 +4,8 @@ set -u ports=(3000 3001 3002 3003 3004 3005 8123 8124 8125 8126) +repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)" + kill_pids() { local pids="$1" if [ -n "$pids" ]; then @@ -12,6 +14,56 @@ kill_pids() { fi } +pid_cwd() { + local pid="$1" + if ! command -v lsof >/dev/null 2>&1; then + return 0 + fi + lsof -p "$pid" 2>/dev/null | awk '$4=="cwd" {print $9; exit}' +} + +kill_pid_tree() { + local root_pid="$1" + local children + + # Depth-first: kill descendants first to reduce immediate respawns. + if command -v pgrep >/dev/null 2>&1; then + children="$(pgrep -P "$root_pid" 2>/dev/null || true)" + if [ -n "$children" ]; then + local child + for child in $children; do + kill_pid_tree "$child" + done + fi + fi + + kill_pids "$root_pid" +} + +kill_by_pattern_in_repo() { + local pattern="$1" + local pids pid cwd + + # Only kill processes whose working directory is inside this repo to avoid + # nuking unrelated `pnpm dev` sessions in other worktrees. + pids="$(ps -axo pid=,command= | awk -v pat="$pattern" '$0 ~ pat {print $1}')" + if [ -z "$pids" ]; then + return 0 + fi + + for pid in $pids; do + # Avoid killing ourselves / our parent shell. + if [ "$pid" = "$$" ] || [ "$pid" = "$PPID" ]; then + continue + fi + + cwd="$(pid_cwd "$pid" || true)" + if [ -n "$cwd" ] && [[ "$cwd" == "$repo_root"* ]]; then + kill_pid_tree "$pid" + fi + done +} + kill_playwright_headless() { # Smoke scripts (and other test tooling) can leave headless Chromium running if interrupted. # Those stale processes may keep polling the dev server, making logs appear "busy" even when @@ -35,15 +87,32 @@ kill_ports() { } kill_langgraph() { - local pids - pids=$(ps -axo pid=,command= | awk -v p1="langgraph-api/dist/cli/entrypoint.mjs" -v p2="apps/(agent|agent-clmm|agent-pendle|agent-gmx-allora)" '$0 ~ p1 && $0 ~ p2 {print $1}') - kill_pids "$pids" + # LangGraph CLI signatures have changed over time: + # - older: .../langgraph-api/dist/cli/entrypoint.mjs + # - newer: @langchain/langgraph-cli/.../cli.mjs or `pnpm exec langgraphjs dev` + # + # Some processes can also get orphaned (`ppid=1`) and will survive port-based kills + # if they chose a different port. We only kill those whose CWD is within this repo. + # Be specific enough to not kill shells/editor commands that merely *mention* these strings. + kill_by_pattern_in_repo "^node .*langgraph-api/dist/cli/entrypoint\\.mjs" + kill_by_pattern_in_repo "^node .*@langchain/langgraph-cli/.*cli\\.mjs dev" + kill_by_pattern_in_repo "^node .*\\/pnpm[^ ]* exec langgraphjs dev" + kill_by_pattern_in_repo "^bash .*scripts/langgraph-dev\\.sh" } kill_next_dev() { - local pids - pids=$(ps -axo pid=,command= | awk -v p1="apps/web" -v p2="next dev" '$0 ~ p1 && $0 ~ p2 {print $1}') - kill_pids "$pids" + # Match the actual Next.js dev process (usually `node .../next/dist/bin/next dev`). + kill_by_pattern_in_repo "^node .*next/dist/bin/next dev" +} + +kill_turbo_dev() { + # If a parent `turbo run dev` is still running, it will respawn children we just killed. + kill_by_pattern_in_repo "^node .*turbo[^ ]* .* run dev" +} + +kill_pnpm_dev() { + # `pnpm dev` is typically a node wrapper: `node .../pnpm dev`. + kill_by_pattern_in_repo "^node .*\\/pnpm[^ ]* dev( |$)" } cleanup_state() { @@ -51,6 +120,8 @@ cleanup_state() { } kill_ports +kill_turbo_dev +kill_pnpm_dev kill_langgraph kill_next_dev kill_playwright_headless From c6b3d408e2bc2b7d9dbfb42e66d8540ba9b59f65 Mon Sep 17 00:00:00 2001 From: Sebas Date: Fri, 6 Feb 2026 18:15:23 -0800 Subject: [PATCH 38/70] fix: stabilize GMX market selection + web detail rendering --- .../src/clients/onchainActions.ts | 8 ++++--- .../src/core/marketSelection.ts | 15 ++++++++++++- .../src/core/marketSelection.unit.test.ts | 22 +++++++++++++++++++ .../web/src/components/AgentDetailPage.tsx | 7 ++++-- 4 files changed, 46 insertions(+), 6 deletions(-) diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.ts index da7ec028..ed9b43a1 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.ts @@ -59,9 +59,11 @@ const PerpetualMarketSchema = z.object({ shortBorrowingFee: z.string(), chainId: z.string(), name: z.string(), - indexToken: TokenSchemaBridge, - longToken: TokenSchemaBridge, - shortToken: TokenSchemaBridge, + // Some markets returned by onchain-actions omit indexToken. Keep the boundary + // validation, but allow skipping incomplete markets in our selection logic. + indexToken: TokenSchemaBridge.optional(), + longToken: TokenSchemaBridge.optional(), + shortToken: TokenSchemaBridge.optional(), }); export type PerpetualMarket = z.infer; diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/marketSelection.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/marketSelection.ts index 4bcdba1c..6fd80deb 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/marketSelection.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/marketSelection.ts @@ -11,12 +11,25 @@ export function selectGmxPerpetualMarket( ): PerpetualMarket | undefined { const base = params.baseSymbol.toUpperCase(); const quote = params.quoteSymbol.toUpperCase(); + const quotes = quote === 'USDC' ? ['USDC', 'USD'] : [quote]; return params.markets.find((market) => { + const name = market.name.toUpperCase().replaceAll(' ', ''); + const nameMatches = quotes.some((q) => { + const patterns = [`${base}/${q}`, `${base}-${q}`, `${base}_${q}`, `${base}${q}`]; + return patterns.some((pattern) => name.includes(pattern)); + }); + if (nameMatches) { + return true; + } + + if (!market.indexToken || !market.longToken || !market.shortToken) { + return false; + } const index = market.indexToken.symbol.toUpperCase(); const longToken = market.longToken.symbol.toUpperCase(); const shortToken = market.shortToken.symbol.toUpperCase(); - const matchesSymbols = index === base && (longToken === quote || shortToken === quote); + const matchesSymbols = index === base && (quotes.includes(longToken) || quotes.includes(shortToken)); // onchain-actions aggregates markets across plugins; GMX market names are not guaranteed // to include "GMX" (GMX SDK typically returns names like "BTC/USD"). return matchesSymbols; diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/marketSelection.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/marketSelection.unit.test.ts index e940d10c..eb27f578 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/marketSelection.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/marketSelection.unit.test.ts @@ -102,4 +102,26 @@ describe('selectGmxPerpetualMarket', () => { expect(result?.marketToken.address).toBe('0x1'); }); + + it('falls back to matching by market name when token metadata is missing', () => { + const markets: PerpetualMarket[] = [ + { + marketToken: { chainId: '42161', address: '0x1' }, + longFundingFee: '0.01', + shortFundingFee: '0.02', + longBorrowingFee: '0.03', + shortBorrowingFee: '0.04', + chainId: '42161', + name: 'BTC/USD', + }, + ]; + + const result = selectGmxPerpetualMarket({ + markets, + baseSymbol: 'BTC', + quoteSymbol: 'USDC', + }); + + expect(result?.marketToken.address).toBe('0x1'); + }); }); diff --git a/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.tsx b/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.tsx index 1ff9ebf1..6b164367 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.tsx +++ b/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.tsx @@ -2036,9 +2036,12 @@ function PendleMetricsTab({ profile, metrics, fullMetrics, events }: Omit{reward.amount}
))} - + + ) : ( +
+ )} - )} + ); } From c72f77c8203502f7d22fd108b61501e9c67f9233 Mon Sep 17 00:00:00 2001 From: Sebas Date: Fri, 6 Feb 2026 18:31:46 -0800 Subject: [PATCH 39/70] chore(web-ag-ui): qa starts agent runtimes --- typescript/clients/web-ag-ui/package.json | 2 +- typescript/clients/web-ag-ui/scripts/qa.sh | 33 ++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100755 typescript/clients/web-ag-ui/scripts/qa.sh diff --git a/typescript/clients/web-ag-ui/package.json b/typescript/clients/web-ag-ui/package.json index afd2180c..7a42cada 100644 --- a/typescript/clients/web-ag-ui/package.json +++ b/typescript/clients/web-ag-ui/package.json @@ -8,7 +8,7 @@ "scripts": { "dev": "turbo run dev", "dev:delegations-bypass": "DELEGATIONS_BYPASS=true NEXT_PUBLIC_DELEGATIONS_BYPASS=true turbo run dev", - "qa": "pnpm --filter web qa", + "qa": "bash scripts/qa.sh", "build": "turbo run build", "start": "turbo run start", "start:delegations-bypass": "DELEGATIONS_BYPASS=true NEXT_PUBLIC_DELEGATIONS_BYPASS=true turbo run start", diff --git a/typescript/clients/web-ag-ui/scripts/qa.sh b/typescript/clients/web-ag-ui/scripts/qa.sh new file mode 100755 index 00000000..1adbcb3a --- /dev/null +++ b/typescript/clients/web-ag-ui/scripts/qa.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Manual QA entrypoint: run the production-like web server (`next build && next start`) +# plus the local LangGraph agent dev servers required by the web runtime. +# +# Stop with Ctrl-C; the trap below will clean up background agent processes. + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" + +cleanup() { + # Kill the whole process group so we don't leave stray LangGraph processes behind. + local pid + pid="$(jobs -pr | tr '\n' ' ' | xargs echo -n)" + if [ -n "${pid:-}" ]; then + kill ${pid} 2>/dev/null || true + fi +} + +trap cleanup EXIT INT TERM + +cd "$ROOT_DIR" + +echo "[qa] starting agent runtimes (LangGraph dev servers)..." + +# Match `apps/web/src/app/api/copilotkit/route.ts` defaults. +pnpm --filter agent-clmm start >/dev/null 2>&1 & +pnpm --filter agent-pendle start >/dev/null 2>&1 & +pnpm --filter agent-gmx-allora start >/dev/null 2>&1 & + +echo "[qa] starting web (build + next start) on http://localhost:3000 ..." +exec pnpm --filter web qa + From d2ddf75bdd087386a7452fb6cb19ef87ab71dc6d Mon Sep 17 00:00:00 2001 From: Sebas Date: Fri, 6 Feb 2026 19:42:55 -0800 Subject: [PATCH 40/70] fix(web-ag-ui): ensure qa starts onchain-actions on 50051 --- typescript/clients/web-ag-ui/scripts/qa.sh | 149 +++++++++++++++++- .../web-ag-ui/scripts/reset-dev-stack.sh | 4 +- 2 files changed, 151 insertions(+), 2 deletions(-) diff --git a/typescript/clients/web-ag-ui/scripts/qa.sh b/typescript/clients/web-ag-ui/scripts/qa.sh index 1adbcb3a..08db8a1e 100755 --- a/typescript/clients/web-ag-ui/scripts/qa.sh +++ b/typescript/clients/web-ag-ui/scripts/qa.sh @@ -21,6 +21,154 @@ trap cleanup EXIT INT TERM cd "$ROOT_DIR" +resolve_forge_root() { + # web-ag-ui lives inside the arbitrum-vibekit worktree at: + # $FORGE_ROOT/worktrees//arbitrum-vibekit/typescript/clients/web-ag-ui + local git_root + git_root="$(git -C "$ROOT_DIR" rev-parse --show-toplevel 2>/dev/null || true)" + if [ -z "$git_root" ]; then + return 1 + fi + (cd "$git_root/../../.." && pwd -P) +} + +resolve_onchain_actions_worktree_dir() { + if [ -n "${ONCHAIN_ACTIONS_WORKTREE_DIR:-}" ]; then + echo "$ONCHAIN_ACTIONS_WORKTREE_DIR" + return 0 + fi + + local forge_root + forge_root="$(resolve_forge_root || true)" + if [ -z "$forge_root" ]; then + return 1 + fi + + local candidates=() + local d + while IFS= read -r d; do + [ -n "$d" ] && candidates+=("$d") + done < <(find "$forge_root/worktrees" -maxdepth 1 -type d -name 'onchain-actions-*' -print 2>/dev/null || true) + + if [ "${#candidates[@]}" -eq 1 ]; then + echo "${candidates[0]}" + return 0 + fi + + echo "[qa] Unable to auto-discover onchain-actions worktree under $forge_root/worktrees." >&2 + echo "[qa] Set ONCHAIN_ACTIONS_WORKTREE_DIR=/absolute/path/to/forge/worktrees/onchain-actions-001" >&2 + return 1 +} + +wait_for_http_ok() { + local url="$1" + local timeout_s="${2:-60}" + + local start + start="$(date +%s)" + while true; do + if curl -fs -o /dev/null "$url"; then + return 0 + fi + local now + now="$(date +%s)" + if [ $((now - start)) -ge "$timeout_s" ]; then + return 1 + fi + sleep 1 + done +} + +resolve_onchain_actions_pnpm_bin() { + local onchain_dir="${1:?missing onchain-actions dir}" + # This repo uses a pinned pnpm version (packageManager field). The onchain-actions + # worktree enforces pnpm >= 10 via engines.pnpm, so we must invoke a pnpm 10+ binary + # explicitly (not whatever pnpm version the current workspace is using). + if [ -n "${ONCHAIN_ACTIONS_PNPM_BIN:-}" ]; then + echo "$ONCHAIN_ACTIONS_PNPM_BIN" + return 0 + fi + + local candidates=( + "/usr/local/bin/pnpm" + "/opt/homebrew/bin/pnpm" + "$(command -v pnpm 2>/dev/null || true)" + ) + + local tool_dir="${HOME}/Library/pnpm/.tools/pnpm" + if [ -d "$tool_dir" ]; then + local b + while IFS= read -r b; do + [ -n "$b" ] && candidates+=("$b") + done < <(find "$tool_dir" -maxdepth 3 \( -type f -o -type l \) -path "*/bin/pnpm" -print 2>/dev/null || true) + fi + + local bin version major + for bin in "${candidates[@]}"; do + [ -n "$bin" ] || continue + [ -x "$bin" ] || continue + # Ask pnpm to resolve its version in the onchain-actions directory (so packageManager switching + # doesn't lock us to this repo's pinned pnpm). + version="$("$bin" -C "$onchain_dir" -v 2>/dev/null || true)" + major="${version%%.*}" + if [[ "$major" =~ ^[0-9]+$ ]] && [ "$major" -ge 10 ]; then + echo "$bin" + return 0 + fi + done + + echo "[qa] Could not find a pnpm 10+ binary for onchain-actions." >&2 + echo "[qa] Set ONCHAIN_ACTIONS_PNPM_BIN=/absolute/path/to/pnpm" >&2 + return 1 +} + +ensure_onchain_actions_50051() { + export ONCHAIN_ACTIONS_BASE_URL="${ONCHAIN_ACTIONS_BASE_URL:-http://localhost:50051}" + + local markets_url="${ONCHAIN_ACTIONS_BASE_URL}/perpetuals/markets?chainIds=42161" + + if curl -fs -o /dev/null "$markets_url"; then + echo "[qa] onchain-actions already reachable at ${ONCHAIN_ACTIONS_BASE_URL}" + return 0 + fi + + local onchain_dir + onchain_dir="$(resolve_onchain_actions_worktree_dir)" + if [ -z "$onchain_dir" ]; then + exit 1 + fi + + if [ ! -d "$onchain_dir" ]; then + echo "[qa] ONCHAIN_ACTIONS_WORKTREE_DIR does not exist: $onchain_dir" >&2 + exit 1 + fi + + if [ -f "$onchain_dir/compose.dev.db.yaml" ] && command -v docker >/dev/null 2>&1; then + # Only bring up memgraph (compose file also defines memgraph_lab on 3000 which conflicts with the web QA server). + docker compose -f "$onchain_dir/compose.dev.db.yaml" up -d memgraph >/dev/null + fi + + local pnpm_bin + pnpm_bin="$(resolve_onchain_actions_pnpm_bin "$onchain_dir")" || exit 1 + + local log_file="$ROOT_DIR/.qa-onchain-actions.log" + echo "[qa] starting onchain-actions on http://localhost:50051 (logs: $log_file) ..." + ( + "$pnpm_bin" -C "$onchain_dir" dev + ) >"$log_file" 2>&1 & + + if ! wait_for_http_ok "$markets_url" 120; then + echo "[qa] onchain-actions failed to become reachable at ${ONCHAIN_ACTIONS_BASE_URL} within 120s" >&2 + echo "[qa] tail of $log_file:" >&2 + tail -n 40 "$log_file" >&2 || true + exit 1 + fi + + echo "[qa] onchain-actions ready at ${ONCHAIN_ACTIONS_BASE_URL}" +} + +ensure_onchain_actions_50051 + echo "[qa] starting agent runtimes (LangGraph dev servers)..." # Match `apps/web/src/app/api/copilotkit/route.ts` defaults. @@ -30,4 +178,3 @@ pnpm --filter agent-gmx-allora start >/dev/null 2>&1 & echo "[qa] starting web (build + next start) on http://localhost:3000 ..." exec pnpm --filter web qa - diff --git a/typescript/clients/web-ag-ui/scripts/reset-dev-stack.sh b/typescript/clients/web-ag-ui/scripts/reset-dev-stack.sh index 61022df4..b8bea423 100755 --- a/typescript/clients/web-ag-ui/scripts/reset-dev-stack.sh +++ b/typescript/clients/web-ag-ui/scripts/reset-dev-stack.sh @@ -2,7 +2,9 @@ set -u -ports=(3000 3001 3002 3003 3004 3005 8123 8124 8125 8126) +# Web QA uses 3000, LangGraph dev servers use 8123-8126. +# onchain-actions defaults to 3001 but local dev commonly runs it on 50051. +ports=(3000 3001 3002 3003 3004 3005 8123 8124 8125 8126 50051) repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)" From 6ff00be59bdb0aa19262a41d6e24eedc1e6d8fd7 Mon Sep 17 00:00:00 2001 From: Sebas Date: Fri, 6 Feb 2026 19:43:07 -0800 Subject: [PATCH 41/70] fix(web): unblock agent detail + fire run in qa --- typescript/clients/web-ag-ui/apps/web/src/utils/fireAgentRun.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/typescript/clients/web-ag-ui/apps/web/src/utils/fireAgentRun.ts b/typescript/clients/web-ag-ui/apps/web/src/utils/fireAgentRun.ts index d2e317a7..a4e0fee2 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/utils/fireAgentRun.ts +++ b/typescript/clients/web-ag-ui/apps/web/src/utils/fireAgentRun.ts @@ -46,3 +46,4 @@ export async function fireAgentRun(params: { return true; } + From 18f677b895cd634eb5e6222660f791317964b051 Mon Sep 17 00:00:00 2001 From: Sebas Date: Sat, 7 Feb 2026 12:03:56 -0800 Subject: [PATCH 42/70] fix(agent-gmx-allora): cache allora + improve artifacts --- .../web-ag-ui/apps/agent-gmx-allora/README.md | 37 ++++ .../agent-gmx-allora/src/clients/allora.ts | 106 ++++++++++- .../src/clients/allora.unit.test.ts | 85 ++++++++- .../agent-gmx-allora/src/config/constants.ts | 15 ++ .../src/workflow/artifacts.int.test.ts | 47 ++++- .../src/workflow/artifacts.ts | 164 +++++++++++++++++- .../src/workflow/artifacts.unit.test.ts | 37 +++- .../src/workflow/nodes/pollCycle.ts | 8 +- 8 files changed, 464 insertions(+), 35 deletions(-) create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md new file mode 100644 index 00000000..0656785b --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md @@ -0,0 +1,37 @@ +# GMX Allora Agent + +This agent uses Allora prediction feeds to make deterministic trading decisions for GMX perpetuals on Arbitrum and then: + +- builds **transaction plans** to open/modify/close positions via `onchain-actions` +- optionally **submits user transactions** in embedded-wallet mode (normal user flows, not GMX keeper "execution") + +## Roadmap Vocabulary + +- **Transaction planning**: producing `transactions[]` that a wallet can sign and submit. +- **Transaction submission**: broadcasting signed transactions and recording tx hashes in artifacts/history. + +## Current Milestones + +- Plan-building mode (no submission) is implemented. +- Next: validate onchain-actions read-path correctness (markets/positions/balances) before enabling transaction submission. + +## Transaction Submission Behavior + +The agent always uses onchain-actions to build a `transactions[]` plan for the chosen action (`long`, `short`, `close`). + +- `GMX_ALLORA_TX_SUBMISSION_MODE=plan`: + - The agent emits the planned `transactions[]` in artifacts/history and does not broadcast anything. +- `GMX_ALLORA_TX_SUBMISSION_MODE=submit`: + - `long`: build `transactions[]` via onchain-actions, then broadcast each transaction sequentially and wait for receipts; record `txHashes` and `lastTxHash` in artifacts/history. + - `short`: same as `long`. + - `close`: build `transactions[]` via onchain-actions, then broadcast each transaction sequentially and wait for receipts. + - Note: this requires an onchain-actions GMX plugin that plans position closes using GMX decrease orders. Older onchain-actions versions may return order-cancellation transactions instead. + +## Environment + +- `GMX_MIN_NATIVE_ETH_WEI`: minimum native ETH (in wei) required in the operator wallet before the agent will proceed (defaults to `2000000000000000` = 0.002 ETH). +- `ALLORA_INFERENCE_CACHE_TTL_MS`: cache TTL (ms) for Allora consumer inference requests. Defaults to `30000`; set to `0` to disable caching. +- `GMX_ALLORA_TX_SUBMISSION_MODE`: transaction submission mode. Supported values: + - `plan` (default): build and emit `transactions[]` but do not broadcast. + - `submit`: broadcast planned transactions via an embedded wallet (no delegations). Requires an onchain-actions version that correctly plans the requested GMX action (especially close via decrease order). +- `GMX_ALLORA_EMBEDDED_PRIVATE_KEY`: required when `GMX_ALLORA_TX_SUBMISSION_MODE=submit` (0x + 64 hex chars). Only for local/dev use. diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/allora.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/allora.ts index fea9c5dc..3ed25db3 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/allora.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/allora.ts @@ -101,19 +101,109 @@ export async function fetchAlloraInference(params: { chainId: string; topicId: number; apiKey?: string; + cacheTtlMs?: number; }): Promise { const base = params.baseUrl.replace(/\/$/u, ''); const query = new URLSearchParams({ allora_topic_id: params.topicId.toString() }); const url = `${base}/v2/allora/consumer/${params.chainId}?${query.toString()}`; - const response = await fetch(url, { - headers: params.apiKey ? { 'x-api-key': params.apiKey } : undefined, - }); + const cacheTtlMs = params.cacheTtlMs ?? 0; - const bodyText = await response.text(); - if (!response.ok) { - throw new Error(`Allora API request failed (${response.status}): ${bodyText}`); + if (cacheTtlMs > 0) { + const cached = getCachedInference({ cacheKey: url, now: Date.now() }); + if (cached) { + return cached; + } + const inflight = inflightRequests.get(url); + if (inflight) { + return inflight; + } } - const payload = bodyText.trim().length > 0 ? (JSON.parse(bodyText) as unknown) : {}; - return parseAlloraInferenceResponse(payload); + const request = (async () => { + const response = await fetch(url, { + headers: params.apiKey ? { 'x-api-key': params.apiKey } : undefined, + }); + + const bodyText = await response.text(); + if (!response.ok) { + throw new Error(`Allora API request failed (${response.status}): ${bodyText}`); + } + + const payload = bodyText.trim().length > 0 ? (JSON.parse(bodyText) as unknown) : {}; + const parsed = parseAlloraInferenceResponse(payload); + if (cacheTtlMs > 0) { + storeCachedInference({ cacheKey: url, now: Date.now(), ttlMs: cacheTtlMs, value: parsed }); + } + return parsed; + })(); + + if (cacheTtlMs > 0) { + inflightRequests.set(url, request); + try { + return await request; + } finally { + inflightRequests.delete(url); + } + } + + return await request; +} + +type CacheEntry = { expiresAt: number; value: AlloraInference }; + +const MAX_CACHE_ENTRIES = 32; +const inferenceCache = new Map(); +const inflightRequests = new Map>(); + +function getCachedInference(params: { cacheKey: string; now: number }): AlloraInference | null { + const cached = inferenceCache.get(params.cacheKey); + if (!cached) { + return null; + } + if (cached.expiresAt <= params.now) { + inferenceCache.delete(params.cacheKey); + return null; + } + return cached.value; +} + +function storeCachedInference(params: { + cacheKey: string; + now: number; + ttlMs: number; + value: AlloraInference; +}): void { + if (params.ttlMs <= 0) { + return; + } + inferenceCache.set(params.cacheKey, { expiresAt: params.now + params.ttlMs, value: params.value }); + pruneCache(params.now); +} + +function pruneCache(now: number): void { + // Fast path: keep under limit without scanning. + if (inferenceCache.size <= MAX_CACHE_ENTRIES) { + return; + } + + // Drop expired first. + for (const [key, entry] of inferenceCache) { + if (entry.expiresAt <= now) { + inferenceCache.delete(key); + } + } + + // If still too large, evict oldest insertions (Map iteration order). + while (inferenceCache.size > MAX_CACHE_ENTRIES) { + const oldest = inferenceCache.keys().next(); + if (oldest.done) { + break; + } + inferenceCache.delete(oldest.value); + } +} + +export function clearAlloraInferenceCache(): void { + inferenceCache.clear(); + inflightRequests.clear(); } diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/allora.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/allora.unit.test.ts index 010a9b19..97fa46f8 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/allora.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/allora.unit.test.ts @@ -1,6 +1,11 @@ -import { describe, expect, it } from 'vitest'; +import { afterEach, describe, expect, it, vi } from 'vitest'; -import { parseAlloraInferenceResponse } from './allora.js'; +import { clearAlloraInferenceCache, fetchAlloraInference, parseAlloraInferenceResponse } from './allora.js'; + +afterEach(() => { + clearAlloraInferenceCache(); + vi.unstubAllGlobals(); +}); describe('parseAlloraInferenceResponse', () => { it('parses combined value and confidence intervals into numbers', () => { @@ -51,3 +56,79 @@ describe('parseAlloraInferenceResponse', () => { }); }); }); + +describe('fetchAlloraInference caching', () => { + it('dedupes repeated requests within the TTL', async () => { + const fetchSpy = vi.fn(() => { + return { + ok: true, + status: 200, + text: () => + Promise.resolve( + JSON.stringify({ + status: true, + data: { inference_data: { topic_id: '14', network_inference_normalized: '65000' } }, + }), + ), + } satisfies Partial as Response; + }); + + vi.stubGlobal('fetch', fetchSpy); + + const first = await fetchAlloraInference({ + baseUrl: 'http://127.0.0.1:1234', + chainId: 'test', + topicId: 14, + cacheTtlMs: 60_000, + }); + const second = await fetchAlloraInference({ + baseUrl: 'http://127.0.0.1:1234', + chainId: 'test', + topicId: 14, + cacheTtlMs: 60_000, + }); + + expect(first).toEqual(second); + expect(fetchSpy).toHaveBeenCalledTimes(1); + }); + + it('re-fetches once the TTL has elapsed', async () => { + const fetchSpy = vi.fn(() => { + return { + ok: true, + status: 200, + text: () => + Promise.resolve( + JSON.stringify({ + status: true, + data: { inference_data: { topic_id: '14', network_inference_normalized: '65000' } }, + }), + ), + } satisfies Partial as Response; + }); + + vi.stubGlobal('fetch', fetchSpy); + + vi.useFakeTimers(); + vi.setSystemTime(new Date('2025-01-01T00:00:00.000Z')); + + await fetchAlloraInference({ + baseUrl: 'http://127.0.0.1:1234', + chainId: 'test', + topicId: 14, + cacheTtlMs: 1000, + }); + + vi.setSystemTime(new Date('2025-01-01T00:00:02.000Z')); + + await fetchAlloraInference({ + baseUrl: 'http://127.0.0.1:1234', + chainId: 'test', + topicId: 14, + cacheTtlMs: 1000, + }); + + expect(fetchSpy).toHaveBeenCalledTimes(2); + vi.useRealTimers(); + }); +}); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts index e48b76c0..a62dab3f 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts @@ -3,6 +3,7 @@ export const ARBITRUM_CHAIN_ID = 42161; const DEFAULT_ONCHAIN_ACTIONS_BASE_URL = 'https://api.emberai.xyz'; const DEFAULT_ALLORA_API_BASE_URL = 'https://api.allora.network'; const DEFAULT_ALLORA_CHAIN_ID = 'allora-mainnet-1'; +const DEFAULT_ALLORA_INFERENCE_CACHE_TTL_MS = 30_000; type OnchainActionsBaseUrlLogger = (message: string, metadata?: Record) => void; @@ -54,6 +55,20 @@ export function resolveAlloraChainId(): string { return process.env['ALLORA_CHAIN_ID']?.trim() || DEFAULT_ALLORA_CHAIN_ID; } +export function resolveAlloraInferenceCacheTtlMs(): number { + const raw = process.env['ALLORA_INFERENCE_CACHE_TTL_MS']; + if (!raw) { + return DEFAULT_ALLORA_INFERENCE_CACHE_TTL_MS; + } + + const parsed = Number(raw); + // Allow disabling caching by setting <= 0 or invalid values. + if (!Number.isFinite(parsed) || parsed <= 0) { + return 0; + } + return Math.trunc(parsed); +} + export const ALLORA_HORIZON_HOURS = 8; export const ALLORA_TOPIC_IDS = { BTC: 14, diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.int.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.int.test.ts index 4e07a9db..d81c9bd8 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.int.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.int.test.ts @@ -9,11 +9,21 @@ describe('buildSummaryArtifact (integration)', () => { const telemetry: GmxAlloraTelemetry[] = [ { cycle: 1, - action: 'long', + action: 'open', reason: 'Signal bullish', marketSymbol: 'BTC/USDC', + side: 'long', + leverage: 2, + sizeUsd: 250, timestamp: '2026-02-05T10:00:00.000Z', - prediction: { topicId: 14, combinedValue: 48000, confidence: 0.4 }, + prediction: { + topic: 'BTC/USD - Price Prediction - 8h', + horizonHours: 8, + confidence: 0.4, + direction: 'up', + predictedPrice: 48000, + timestamp: '2026-02-05T10:00:00.000Z', + }, }, { cycle: 2, @@ -21,21 +31,41 @@ describe('buildSummaryArtifact (integration)', () => { reason: 'Exposure limit', marketSymbol: 'BTC/USDC', timestamp: '2026-02-05T12:00:00.000Z', - prediction: { topicId: 14, combinedValue: 47000, confidence: 0.2 }, + prediction: { + topic: 'BTC/USD - Price Prediction - 8h', + horizonHours: 8, + confidence: 0.2, + direction: 'down', + predictedPrice: 47000, + timestamp: '2026-02-05T12:00:00.000Z', + }, }, { cycle: 3, - action: 'short', + action: 'open', reason: 'Signal bearish', marketSymbol: 'ETH/USDC', timestamp: '2026-02-05T14:00:00.000Z', - prediction: { topicId: 2, combinedValue: 2600, confidence: 0.8 }, + side: 'short', + leverage: 2, + sizeUsd: 250, + prediction: { + topic: 'ETH/USD - Price Prediction - 8h', + horizonHours: 8, + confidence: 0.8, + direction: 'down', + predictedPrice: 2600, + timestamp: '2026-02-05T14:00:00.000Z', + }, txHash: '0xabc', }, ]; const artifact = buildSummaryArtifact(telemetry); - const data = artifact.parts[0]?.data as { + expect(artifact.artifactId).toBe('gmx-allora-summary'); + expect(artifact.description.toLowerCase()).toContain('bearish'); + + const data = artifact.parts[1]?.data as { cycles: number; actionCounts: Record; timeWindow: { firstTimestamp?: string; lastTimestamp?: string }; @@ -44,9 +74,8 @@ describe('buildSummaryArtifact (integration)', () => { actionsTimeline: Array<{ cycle: number; action: string; reason: string; txHash?: string }>; }; - expect(artifact.artifactId).toBe('gmx-allora-summary'); expect(data.cycles).toBe(3); - expect(data.actionCounts).toEqual({ long: 1, hold: 1, short: 1 }); + expect(data.actionCounts).toEqual({ open: 2, hold: 1 }); expect(data.timeWindow.firstTimestamp).toBe('2026-02-05T10:00:00.000Z'); expect(data.timeWindow.lastTimestamp).toBe('2026-02-05T14:00:00.000Z'); expect(data.signalSummary.bestConfidence).toBe(0.8); @@ -55,7 +84,7 @@ describe('buildSummaryArtifact (integration)', () => { expect(data.latestCycle?.cycle).toBe(3); expect(data.actionsTimeline[2]).toEqual({ cycle: 3, - action: 'short', + action: 'open', reason: 'Signal bearish', txHash: '0xabc', }); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.ts index 86e404ab..5b90df10 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.ts @@ -1,14 +1,104 @@ +import crypto from 'node:crypto'; + import { type Artifact } from '@emberai/agent-node/workflow'; +import type { TransactionPlan } from '../clients/onchainActions.js'; import type { ExecutionPlan } from '../core/executionPlan.js'; -import { type GmxAlloraTelemetry } from '../domain/types.js'; +import type { AlloraPrediction, GmxAlloraTelemetry } from '../domain/types.js'; + +function formatConfidence(value: number | undefined): string | null { + if (value === undefined || !Number.isFinite(value)) { + return null; + } + return `${Math.round(value * 100)}%`; +} + +function formatUsd(value: number | undefined): string | null { + if (value === undefined || !Number.isFinite(value)) { + return null; + } + return `$${value.toFixed(2)}`; +} + +function formatSignal(prediction?: AlloraPrediction): string | null { + if (!prediction) { + return null; + } + const direction = prediction.direction === 'up' ? 'bullish' : 'bearish'; + const confidence = formatConfidence(prediction.confidence); + const predicted = Number.isFinite(prediction.predictedPrice) + ? `$${Math.round(prediction.predictedPrice).toLocaleString()}` + : null; + const parts = [ + `Allora ${prediction.horizonHours}h signal: ${direction}`, + confidence ? `confidence ${confidence}` : null, + predicted ? `predicted ${predicted}` : null, + ].filter((value): value is string => Boolean(value)); + + return parts.join(' · '); +} + +function formatRebalance(telemetry: GmxAlloraTelemetry): string { + switch (telemetry.action) { + case 'open': { + const side = telemetry.side ? telemetry.side.toUpperCase() : 'POSITION'; + const leverage = telemetry.leverage !== undefined ? `${telemetry.leverage}x` : null; + const size = formatUsd(telemetry.sizeUsd); + const parts = ['Rebalance: OPEN', side, leverage, size].filter( + (value): value is string => Boolean(value), + ); + return parts.join(' '); + } + case 'reduce': { + const side = telemetry.side ? telemetry.side.toUpperCase() : 'POSITION'; + return `Rebalance: REDUCE ${side}`; + } + case 'close': { + const side = telemetry.side ? telemetry.side.toUpperCase() : 'POSITION'; + return `Rebalance: CLOSE ${side}`; + } + case 'hold': + return 'Rebalance: HOLD (no trade)'; + case 'cooldown': + return 'Rebalance: COOLDOWN (no trade)'; + case 'signal': + return 'Allora signal summarized'; + default: { + const exhaustive: never = telemetry.action; + return `Rebalance: ${String(exhaustive)}`; + } + } +} + +function createTxPlanSlug(transactions: TransactionPlan[] | undefined): string | null { + if (!transactions || transactions.length === 0) { + return null; + } + + const normalized = transactions.map((tx) => ({ + chainId: tx.chainId, + to: tx.to.toLowerCase(), + data: tx.data.toLowerCase(), + value: tx.value.toLowerCase(), + })); + const digest = crypto.createHash('sha256').update(JSON.stringify(normalized)).digest('hex'); + return `plan_${digest.slice(0, 10)}`; +} export function buildTelemetryArtifact(entry: GmxAlloraTelemetry): Artifact { + const signal = formatSignal(entry.prediction); + const rebalance = formatRebalance(entry); + const description = signal ? `${rebalance} · ${signal}` : rebalance; + return { artifactId: 'gmx-allora-telemetry', name: 'gmx-allora-telemetry.json', - description: 'GMX Allora telemetry entry', + description, parts: [ + { + kind: 'text', + text: description, + }, { kind: 'data', data: entry, @@ -17,33 +107,80 @@ export function buildTelemetryArtifact(entry: GmxAlloraTelemetry): Artifact { }; } -export function buildExecutionPlanArtifact(plan: ExecutionPlan): Artifact { +export function buildExecutionPlanArtifact(params: { + plan: ExecutionPlan; + telemetry: GmxAlloraTelemetry; +}): Artifact { + const rebalance = formatRebalance(params.telemetry); + const signal = formatSignal(params.telemetry.prediction); + const description = signal ? `${rebalance} · ${signal}` : rebalance; + return { artifactId: 'gmx-allora-execution-plan', name: 'gmx-allora-execution-plan.json', - description: 'GMX Allora execution plan', + description, parts: [ + { + kind: 'text', + text: description, + }, { kind: 'data', - data: plan, + data: params.plan, }, ], }; } -export function buildExecutionResultArtifact(result: { +export function buildExecutionResultArtifact(params: { action: ExecutionPlan['action']; ok: boolean; error?: string; + telemetry?: GmxAlloraTelemetry; + transactions?: TransactionPlan[]; + txHashes?: `0x${string}`[]; + lastTxHash?: `0x${string}`; }): Artifact { + const txHash = params.lastTxHash; + const planSlug = txHash ? null : createTxPlanSlug(params.transactions); + const rebalance = params.telemetry ? formatRebalance(params.telemetry) : null; + const signal = params.telemetry ? formatSignal(params.telemetry.prediction) : null; + + const txRef = txHash + ? { kind: 'tx' as const, value: txHash, url: `https://arbiscan.io/tx/${txHash}` } + : planSlug + ? { kind: 'plan' as const, value: planSlug } + : undefined; + + const headline = [ + rebalance, + signal, + txRef ? `${txRef.kind === 'tx' ? 'tx' : 'plan'} ${txRef.value}` : null, + ] + .filter((value): value is string => Boolean(value)) + .join(' · '); + return { artifactId: 'gmx-allora-execution-result', name: 'gmx-allora-execution-result.json', - description: 'GMX Allora execution result', + description: headline.length > 0 ? headline : 'GMX Allora execution result', parts: [ + { + kind: 'text', + text: headline.length > 0 ? headline : `Execution ${params.ok ? 'succeeded' : 'failed'}`, + }, { kind: 'data', - data: result, + data: { + action: params.action, + ok: params.ok, + error: params.error, + txHashes: params.txHashes, + lastTxHash: params.lastTxHash, + txRef, + // Useful for the UI to render the signal next to the plan/tx reference. + signal, + }, }, ], }; @@ -74,12 +211,21 @@ export function buildSummaryArtifact(telemetry: GmxAlloraTelemetry[]): Artifact } const latest = telemetry.length > 0 ? telemetry[telemetry.length - 1] : undefined; + const summaryText = latest + ? [formatRebalance(latest), formatSignal(latest.prediction)] + .filter((value): value is string => Boolean(value)) + .join(' · ') + : 'Allora signal summarized'; return { artifactId: 'gmx-allora-summary', name: 'gmx-allora-summary.json', - description: 'Summary of GMX Allora trade cycles', + description: summaryText, parts: [ + { + kind: 'text', + text: summaryText, + }, { kind: 'data', data: { diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.unit.test.ts index c4526135..bd36cf62 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.unit.test.ts @@ -20,11 +20,32 @@ describe('buildExecutionPlanArtifact', () => { }, }; - const artifact = buildExecutionPlanArtifact(plan); + const telemetry: GmxAlloraTelemetry = { + cycle: 1, + action: 'open', + reason: 'Signal bullish', + marketSymbol: 'BTC/USDC', + side: 'long', + leverage: 2, + sizeUsd: 250, + timestamp: '2026-02-05T20:00:00.000Z', + prediction: { + topic: 'BTC/USD - Price Prediction - 8h', + horizonHours: 8, + confidence: 0.71, + direction: 'up', + predictedPrice: 47000, + timestamp: '2026-02-05T20:00:00.000Z', + }, + }; + + const artifact = buildExecutionPlanArtifact({ plan, telemetry }); expect(artifact.artifactId).toBe('gmx-allora-execution-plan'); expect(artifact.name).toBe('gmx-allora-execution-plan.json'); - expect(artifact.parts[0]?.data).toEqual(plan); + expect(artifact.description.toLowerCase()).toContain('bullish'); + expect(artifact.parts[0]?.kind).toBe('text'); + expect(artifact.parts[1]?.data).toEqual(plan); }); it('wraps execution result data into an artifact', () => { @@ -34,7 +55,7 @@ describe('buildExecutionPlanArtifact', () => { }); expect(artifact.artifactId).toBe('gmx-allora-execution-result'); - expect(artifact.parts[0]?.data).toEqual({ action: 'long', ok: true }); + expect(artifact.parts[1]?.data).toMatchObject({ action: 'long', ok: true }); }); it('wraps telemetry data into an artifact', () => { @@ -45,15 +66,19 @@ describe('buildExecutionPlanArtifact', () => { marketSymbol: 'BTC/USDC', timestamp: '2026-02-05T20:00:00.000Z', prediction: { - topicId: 14, - combinedValue: 47000, + topic: 'BTC/USD - Price Prediction - 8h', + horizonHours: 8, confidence: 0.42, + direction: 'down', + predictedPrice: 47000, + timestamp: '2026-02-05T20:00:00.000Z', }, }; const artifact = buildTelemetryArtifact(telemetry); expect(artifact.artifactId).toBe('gmx-allora-telemetry'); - expect(artifact.parts[0]?.data).toEqual(telemetry); + expect(artifact.description.length).toBeGreaterThan(0); + expect(artifact.parts[1]?.data).toEqual(telemetry); }); }); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts index 67137173..77199145 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts @@ -10,6 +10,7 @@ import { resolveAlloraApiBaseUrl, resolveAlloraApiKey, resolveAlloraChainId, + resolveAlloraInferenceCacheTtlMs, resolvePollIntervalMs, } from '../../config/constants.js'; import { buildAlloraPrediction } from '../../core/alloraPrediction.js'; @@ -95,6 +96,7 @@ export const pollCycleNode = async ( chainId: resolveAlloraChainId(), topicId, apiKey: resolveAlloraApiKey(), + cacheTtlMs: resolveAlloraInferenceCacheTtlMs(), }); staleCycles = 0; const currentPrice = state.view.metrics.previousPrice ?? inference.combinedValue; @@ -329,7 +331,7 @@ export const pollCycleNode = async ( ? undefined : { type: 'artifact', - artifact: buildExecutionPlanArtifact(executionPlan), + artifact: buildExecutionPlanArtifact({ plan: executionPlan, telemetry: exposureAdjusted }), append: true, }; const executionResultEvent: ClmmEvent | undefined = @@ -341,6 +343,10 @@ export const pollCycleNode = async ( action: executionResult.action, ok: executionResult.ok, error: executionResult.error, + txHashes: executionResult.txHashes, + lastTxHash: executionResult.lastTxHash, + telemetry: exposureAdjusted, + transactions: executionResult.transactions, }), append: true, }; From 5c9dabd4ca59fd81b71193fd329acac5dcc20f5b Mon Sep 17 00:00:00 2001 From: Sebas Date: Sat, 7 Feb 2026 12:03:59 -0800 Subject: [PATCH 43/70] chore(web-ag-ui): add mnemonic helper --- .../scripts/mnemonic-to-private-key.ts | 92 +++++++++++++++++++ typescript/clients/web-ag-ui/scripts/mnemonic | 22 +++++ 2 files changed, 114 insertions(+) create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/scripts/mnemonic-to-private-key.ts create mode 100755 typescript/clients/web-ag-ui/scripts/mnemonic diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/scripts/mnemonic-to-private-key.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/scripts/mnemonic-to-private-key.ts new file mode 100644 index 00000000..799cb07a --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/scripts/mnemonic-to-private-key.ts @@ -0,0 +1,92 @@ +import process from 'node:process'; + +import { bytesToHex } from 'viem'; +import { mnemonicToAccount } from 'viem/accounts'; + +type Args = { + index: number; + count: number; + basePath: string; +}; + +function parseInteger(value: string | undefined, fallback: number): number { + if (!value) return fallback; + const parsed = Number(value); + if (!Number.isFinite(parsed)) return fallback; + return Math.trunc(parsed); +} + +function parseArgs(argv: string[]): Args { + // Minimal flag parsing: --index N --count N --base-path "m/44'/60'/0'/0" + let index = 0; + let count = 1; + let basePath = `m/44'/60'/0'/0`; + + for (let i = 0; i < argv.length; i += 1) { + const arg = argv[i]; + const next = argv[i + 1]; + if (arg === '--index') { + index = parseInteger(next, index); + i += 1; + continue; + } + if (arg === '--count') { + count = parseInteger(next, count); + i += 1; + continue; + } + if (arg === '--base-path') { + if (next) { + basePath = next; + } + i += 1; + continue; + } + } + + if (index < 0) index = 0; + if (count < 1) count = 1; + if (count > 50) count = 50; + + return { index, count, basePath }; +} + +function resolveMnemonic(): string { + const raw = process.env['MNEMONIC']?.trim(); + if (!raw) { + throw new Error( + 'MNEMONIC is required. Use the `scripts/mnemonic` wrapper which prompts securely.', + ); + } + return raw; +} + +function resolvePrivateKeyHex(account: ReturnType): `0x${string}` { + const hdKey = account.getHdKey(); + const pk = hdKey.privateKey; + if (typeof pk === 'string') { + return pk as `0x${string}`; + } + return bytesToHex(pk) as `0x${string}`; +} + +const args = parseArgs(process.argv.slice(2)); +const mnemonic = resolveMnemonic(); + +for (let offset = 0; offset < args.count; offset += 1) { + const index = args.index + offset; + const path = `${args.basePath}/${index}`; + const account = mnemonicToAccount(mnemonic, { path }); + const privateKey = resolvePrivateKeyHex(account); + + // Print machine-readable JSON for easy copy/paste. + process.stdout.write( + `${JSON.stringify({ + index, + path, + address: account.address, + privateKey, + })}\n`, + ); +} + diff --git a/typescript/clients/web-ag-ui/scripts/mnemonic b/typescript/clients/web-ag-ui/scripts/mnemonic new file mode 100755 index 00000000..36be94c6 --- /dev/null +++ b/typescript/clients/web-ag-ui/scripts/mnemonic @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Usage: +# mnemonic # prompts for seed phrase and prints index 0 +# mnemonic --index 0 # prompts for seed phrase +# mnemonic --index 0 --count 5 +# +# Output is JSON lines with address + privateKey. Do not paste your seed phrase into commands +# (shell history). This wrapper prompts with `read -s`. + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" + +if [ -z "${MNEMONIC:-}" ]; then + printf "MNEMONIC (input hidden): " + # shellcheck disable=SC2162 + read -s MNEMONIC + printf "\n" + export MNEMONIC +fi + +exec pnpm -C "$ROOT_DIR" --filter agent-gmx-allora exec tsx scripts/mnemonic-to-private-key.ts "$@" From aa64e4c10006c75176a5db72f92f909383d2dcce Mon Sep 17 00:00:00 2001 From: Sebas Date: Sat, 7 Feb 2026 12:09:56 -0800 Subject: [PATCH 44/70] fix(agent-gmx-allora): avoid unsafe tx hash fields --- .../apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts index 77199145..fb7080de 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts @@ -343,8 +343,6 @@ export const pollCycleNode = async ( action: executionResult.action, ok: executionResult.ok, error: executionResult.error, - txHashes: executionResult.txHashes, - lastTxHash: executionResult.lastTxHash, telemetry: exposureAdjusted, transactions: executionResult.transactions, }), From 007fd2540014518d737805f8a3269fbfcf36a098 Mon Sep 17 00:00:00 2001 From: Sebas Date: Sat, 7 Feb 2026 13:10:32 -0800 Subject: [PATCH 45/70] feat(agent-gmx-allora): reduce plans + 8h inference cache --- .../web-ag-ui/apps/agent-gmx-allora/README.md | 1 + .../src/clients/onchainActions.ts | 15 +++++ .../src/clients/onchainActions.unit.test.ts | 22 +++++++ .../agent-gmx-allora/src/config/constants.ts | 14 ++++ .../src/core/executionPlan.ts | 48 +++++++++++++- .../src/core/executionPlan.unit.test.ts | 11 ++-- .../src/workflow/artifacts.ts | 15 ++++- .../src/workflow/artifacts.unit.test.ts | 7 +- .../src/workflow/execution.ts | 8 ++- .../src/workflow/execution.unit.test.ts | 18 ++++++ .../src/workflow/nodes/pollCycle.ts | 20 +++++- .../tests/pollCycle.int.test.ts | 64 +++++++++++++++++++ 12 files changed, 228 insertions(+), 15 deletions(-) diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md index 0656785b..7212b626 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md @@ -31,6 +31,7 @@ The agent always uses onchain-actions to build a `transactions[]` plan for the c - `GMX_MIN_NATIVE_ETH_WEI`: minimum native ETH (in wei) required in the operator wallet before the agent will proceed (defaults to `2000000000000000` = 0.002 ETH). - `ALLORA_INFERENCE_CACHE_TTL_MS`: cache TTL (ms) for Allora consumer inference requests. Defaults to `30000`; set to `0` to disable caching. +- `ALLORA_8H_INFERENCE_CACHE_TTL_MS`: cache TTL (ms) specifically for the GMX agent's 8-hour inference fetch. Defaults to `30000`; set to `3600000` (1 hour) to avoid re-fetching on every 5s poll tick. - `GMX_ALLORA_TX_SUBMISSION_MODE`: transaction submission mode. Supported values: - `plan` (default): build and emit `transactions[]` but do not broadcast. - `submit`: broadcast planned transactions via an embedded wallet (no delegations). Requires an onchain-actions version that correctly plans the requested GMX action (especially close via decrease order). diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.ts index ed9b43a1..b249b2b1 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.ts @@ -157,6 +157,14 @@ export type PerpetualCloseRequest = { isLimit?: boolean; }; +export type PerpetualReduceRequest = { + walletAddress: `0x${string}`; + key: string; + // onchain-actions expects a bigint-like decimal string (GMX USD units, 30 decimals). + sizeDeltaUsd: string; + providerName?: string; +}; + export class OnchainActionsClient { constructor(private readonly baseUrl: string) {} @@ -288,6 +296,13 @@ export class OnchainActionsClient { body: this.stringifyPayload(request), }); } + + async createPerpetualReduce(request: PerpetualReduceRequest): Promise { + return this.fetchEndpoint('/perpetuals/reduce', PerpetualActionResponseSchema, { + method: 'POST', + body: this.stringifyPayload(request), + }); + } } export type { TokenIdentifier }; diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.unit.test.ts index c9698829..25f24b23 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.unit.test.ts @@ -182,6 +182,28 @@ describe('OnchainActionsClient', () => { expect(requestInit?.method).toBe('POST'); }); + it('posts perpetual reduce requests', async () => { + const fetchMock = vi.fn( + () => + new Response(JSON.stringify({ transactions: [] }), { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }), + ); + vi.stubGlobal('fetch', fetchMock); + + const client = new OnchainActionsClient('https://api.example.test'); + await client.createPerpetualReduce({ + walletAddress: '0x0000000000000000000000000000000000000001', + key: '0xposition', + sizeDeltaUsd: '1000000000000000000000000000000', + }); + + const [url, requestInit] = fetchMock.mock.calls[0] ?? []; + expect(url).toBe('https://api.example.test/perpetuals/reduce'); + expect((requestInit as RequestInit | undefined)?.method).toBe('POST'); + }); + it('lists perpetual positions across paginated responses', async () => { const fetchMock = vi .fn() diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts index a62dab3f..54b1038d 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts @@ -4,6 +4,7 @@ const DEFAULT_ONCHAIN_ACTIONS_BASE_URL = 'https://api.emberai.xyz'; const DEFAULT_ALLORA_API_BASE_URL = 'https://api.allora.network'; const DEFAULT_ALLORA_CHAIN_ID = 'allora-mainnet-1'; const DEFAULT_ALLORA_INFERENCE_CACHE_TTL_MS = 30_000; +const DEFAULT_ALLORA_8H_INFERENCE_CACHE_TTL_MS = 30_000; type OnchainActionsBaseUrlLogger = (message: string, metadata?: Record) => void; @@ -69,6 +70,19 @@ export function resolveAlloraInferenceCacheTtlMs(): number { return Math.trunc(parsed); } +export function resolveAllora8hInferenceCacheTtlMs(): number { + const raw = process.env['ALLORA_8H_INFERENCE_CACHE_TTL_MS']; + if (!raw) { + return DEFAULT_ALLORA_8H_INFERENCE_CACHE_TTL_MS; + } + + const parsed = Number(raw); + if (!Number.isFinite(parsed) || parsed <= 0) { + return 0; + } + return Math.trunc(parsed); +} + export const ALLORA_HORIZON_HOURS = 8; export const ALLORA_TOPIC_IDS = { BTC: 14, diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.ts index 7683e888..f1adad88 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.ts @@ -1,7 +1,7 @@ import type { GmxAlloraTelemetry } from '../domain/types.js'; export type ExecutionPlan = { - action: 'none' | 'long' | 'short' | 'close'; + action: 'none' | 'long' | 'short' | 'close' | 'reduce'; request?: { amount?: string; walletAddress?: `0x${string}`; @@ -12,6 +12,8 @@ export type ExecutionPlan = { leverage?: string; positionSide?: 'long' | 'short'; isLimit?: boolean; + key?: string; + sizeDeltaUsd?: string; }; }; @@ -22,6 +24,8 @@ type BuildPlanParams = { walletAddress: `0x${string}`; payTokenAddress: `0x${string}`; collateralTokenAddress: `0x${string}`; + positionContractKey?: string; + positionSizeInUsd?: string; }; function formatNumber(value: number | undefined): string | undefined { @@ -41,6 +45,31 @@ function toAmountString(value: number | undefined): string | undefined { return String(Math.round(value)); } +function toGmxUsdDelta(positionSizeInUsd: string | undefined): string | undefined { + if (!positionSizeInUsd) { + return undefined; + } + + let size: bigint; + try { + size = BigInt(positionSizeInUsd); + } catch { + return undefined; + } + + if (size <= 0n) { + return undefined; + } + + // Deterministic default: reduce by 50% of current notional. + const delta = size / 2n; + if (delta <= 0n) { + return undefined; + } + + return delta.toString(); +} + export function buildPerpetualExecutionPlan(params: BuildPlanParams): ExecutionPlan { const { telemetry } = params; @@ -68,6 +97,23 @@ export function buildPerpetualExecutionPlan(params: BuildPlanParams): ExecutionP return { action: 'none' }; } + if (telemetry.action === 'reduce') { + const key = params.positionContractKey; + const sizeDeltaUsd = toGmxUsdDelta(params.positionSizeInUsd); + if (!key || !sizeDeltaUsd) { + return { action: 'none' }; + } + + return { + action: 'reduce', + request: { + walletAddress: params.walletAddress, + key, + sizeDeltaUsd, + }, + }; + } + return { action: 'close', request: { diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.unit.test.ts index 134baa2e..3e085bbb 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.unit.test.ts @@ -38,7 +38,7 @@ describe('buildPerpetualExecutionPlan', () => { }); }); - it('builds a close request for reduce actions', () => { + it('builds a reduce request for reduce actions', () => { const telemetry: GmxAlloraTelemetry = { cycle: 2, action: 'reduce', @@ -57,14 +57,15 @@ describe('buildPerpetualExecutionPlan', () => { walletAddress: '0xwallet', payTokenAddress: '0xusdc', collateralTokenAddress: '0xusdc', + positionContractKey: '0xposition', + positionSizeInUsd: '2000000000000000000000000000000', }); - expect(plan.action).toBe('close'); + expect(plan.action).toBe('reduce'); expect(plan.request).toEqual({ walletAddress: '0xwallet', - marketAddress: '0xmarket', - positionSide: 'short', - isLimit: false, + key: '0xposition', + sizeDeltaUsd: '1000000000000000000000000000000', }); }); }); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.ts index 5b90df10..b329a288 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.ts @@ -62,7 +62,7 @@ function formatRebalance(telemetry: GmxAlloraTelemetry): string { case 'cooldown': return 'Rebalance: COOLDOWN (no trade)'; case 'signal': - return 'Allora signal summarized'; + return formatSignal(telemetry.prediction) ?? 'Allora signal summarized'; default: { const exhaustive: never = telemetry.action; return `Rebalance: ${String(exhaustive)}`; @@ -70,6 +70,12 @@ function formatRebalance(telemetry: GmxAlloraTelemetry): string { } } +function createExecutionPlanSlug(plan: ExecutionPlan): string { + // Stable placeholder for the UI before we have a concrete `transactions[]` plan. + const digest = crypto.createHash('sha256').update(JSON.stringify(plan)).digest('hex'); + return `planreq_${digest.slice(0, 10)}`; +} + function createTxPlanSlug(transactions: TransactionPlan[] | undefined): string | null { if (!transactions || transactions.length === 0) { return null; @@ -113,7 +119,10 @@ export function buildExecutionPlanArtifact(params: { }): Artifact { const rebalance = formatRebalance(params.telemetry); const signal = formatSignal(params.telemetry.prediction); - const description = signal ? `${rebalance} · ${signal}` : rebalance; + const planSlug = createExecutionPlanSlug(params.plan); + const description = [rebalance, signal, `plan ${planSlug}`] + .filter((value): value is string => Boolean(value)) + .join(' · '); return { artifactId: 'gmx-allora-execution-plan', @@ -126,7 +135,7 @@ export function buildExecutionPlanArtifact(params: { }, { kind: 'data', - data: params.plan, + data: { ...params.plan, planSlug }, }, ], }; diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.unit.test.ts index bd36cf62..6b3b1cc8 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.unit.test.ts @@ -44,8 +44,11 @@ describe('buildExecutionPlanArtifact', () => { expect(artifact.artifactId).toBe('gmx-allora-execution-plan'); expect(artifact.name).toBe('gmx-allora-execution-plan.json'); expect(artifact.description.toLowerCase()).toContain('bullish'); - expect(artifact.parts[0]?.kind).toBe('text'); - expect(artifact.parts[1]?.data).toEqual(plan); + expect(artifact.parts[0]).toEqual({ kind: 'text', text: artifact.description }); + expect(artifact.parts[1]).toMatchObject({ kind: 'data', data: plan }); + expect((artifact.parts[1] as { kind: 'data'; data: { planSlug?: unknown } }).data.planSlug).toMatch( + /^planreq_[0-9a-f]{10}$/u, + ); }); it('wraps execution result data into an artifact', () => { diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.ts index fd618b34..f290e3db 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.ts @@ -11,7 +11,7 @@ export type ExecutionResult = { export async function executePerpetualPlan(params: { client: Pick< OnchainActionsClient, - 'createPerpetualLong' | 'createPerpetualShort' | 'createPerpetualClose' + 'createPerpetualLong' | 'createPerpetualShort' | 'createPerpetualClose' | 'createPerpetualReduce' >; plan: ExecutionPlan; }): Promise { @@ -34,6 +34,12 @@ export async function executePerpetualPlan(params: { ); return { action: plan.action, ok: true, transactions: response.transactions }; } + if (plan.action === 'reduce') { + const response = await params.client.createPerpetualReduce( + plan.request as Parameters[0], + ); + return { action: plan.action, ok: true, transactions: response.transactions }; + } const response = await params.client.createPerpetualClose( plan.request as Parameters[0], ); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.unit.test.ts index ce259d32..e4ce0bec 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.unit.test.ts @@ -19,11 +19,13 @@ const createPerpetualLong = vi.fn(() => ); const createPerpetualShort = vi.fn(() => Promise.resolve({ transactions: [] })); const createPerpetualClose = vi.fn(() => Promise.resolve({ transactions: [] })); +const createPerpetualReduce = vi.fn(() => Promise.resolve({ transactions: [] })); const client = { createPerpetualLong, createPerpetualShort, createPerpetualClose, + createPerpetualReduce, }; describe('executePerpetualPlan', () => { @@ -58,6 +60,22 @@ describe('executePerpetualPlan', () => { expect(result.transactions?.[0]?.to).toBe('0xrouter'); }); + it('executes reduce plans', async () => { + const plan: ExecutionPlan = { + action: 'reduce', + request: { + walletAddress: '0x0000000000000000000000000000000000000001', + key: '0xposition', + sizeDeltaUsd: '1000000000000000000000000000000', + }, + }; + + const result = await executePerpetualPlan({ client, plan }); + + expect(result.ok).toBe(true); + expect(createPerpetualReduce).toHaveBeenCalled(); + }); + it('captures execution errors', async () => { createPerpetualClose.mockRejectedValueOnce(new Error('boom')); const plan: ExecutionPlan = { diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts index fb7080de..4aabba77 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts @@ -2,6 +2,7 @@ import { copilotkitEmitState } from '@copilotkit/sdk-js/langgraph'; import { Command } from '@langchain/langgraph'; import { fetchAlloraInference } from '../../clients/allora.js'; +import type { PerpetualPosition } from '../../clients/onchainActions.js'; import { ALLORA_HORIZON_HOURS, ALLORA_TOPIC_IDS, @@ -10,7 +11,7 @@ import { resolveAlloraApiBaseUrl, resolveAlloraApiKey, resolveAlloraChainId, - resolveAlloraInferenceCacheTtlMs, + resolveAllora8hInferenceCacheTtlMs, resolvePollIntervalMs, } from '../../config/constants.js'; import { buildAlloraPrediction } from '../../core/alloraPrediction.js'; @@ -96,7 +97,7 @@ export const pollCycleNode = async ( chainId: resolveAlloraChainId(), topicId, apiKey: resolveAlloraApiKey(), - cacheTtlMs: resolveAlloraInferenceCacheTtlMs(), + cacheTtlMs: resolveAllora8hInferenceCacheTtlMs(), }); staleCycles = 0; const currentPrice = state.view.metrics.previousPrice ?? inference.combinedValue; @@ -183,7 +184,7 @@ export const pollCycleNode = async ( } let gmxMarketAddress: string; - let positions = []; + let positions: PerpetualPosition[] = []; try { const onchainActionsClient = getOnchainActionsClient(); const chainIds = [ARBITRUM_CHAIN_ID.toString()]; @@ -314,6 +315,17 @@ export const pollCycleNode = async ( artifact: buildTelemetryArtifact(exposureAdjusted), append: true, }; + + const normalizedTargetMarket = gmxMarketAddress.toLowerCase(); + const positionForReduce = + exposureAdjusted.action === 'reduce' && exposureAdjusted.side + ? positions.find( + (position) => + position.marketAddress.toLowerCase() === normalizedTargetMarket && + position.positionSide === exposureAdjusted.side, + ) + : undefined; + const executionPlan = buildPerpetualExecutionPlan({ telemetry: exposureAdjusted, chainId: ARBITRUM_CHAIN_ID.toString(), @@ -321,6 +333,8 @@ export const pollCycleNode = async ( walletAddress: operatorConfig.walletAddress, payTokenAddress: operatorConfig.fundingTokenAddress, collateralTokenAddress: operatorConfig.fundingTokenAddress, + positionContractKey: positionForReduce?.contractKey, + positionSizeInUsd: positionForReduce?.sizeInUsd, }); const executionResult = await executePerpetualPlan({ client: getOnchainActionsClient(), diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts index d98e55eb..4799a4f6 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts @@ -13,6 +13,7 @@ const { createPerpetualLongMock, createPerpetualShortMock, createPerpetualCloseMock, + createPerpetualReduceMock, } = vi.hoisted(() => ({ copilotkitEmitStateMock: vi.fn(async () => undefined), fetchAlloraInferenceMock: vi.fn<[], Promise>(), @@ -21,6 +22,7 @@ const { createPerpetualLongMock: vi.fn<[], Promise>(), createPerpetualShortMock: vi.fn<[], Promise>(), createPerpetualCloseMock: vi.fn<[], Promise>(), + createPerpetualReduceMock: vi.fn<[], Promise>(), })); vi.mock('@copilotkit/sdk-js/langgraph', () => ({ @@ -44,6 +46,7 @@ vi.mock('../src/workflow/clientFactory.js', () => ({ createPerpetualLong: createPerpetualLongMock, createPerpetualShort: createPerpetualShortMock, createPerpetualClose: createPerpetualCloseMock, + createPerpetualReduce: createPerpetualReduceMock, }), })); @@ -166,6 +169,7 @@ describe('pollCycleNode (integration)', () => { createPerpetualLongMock.mockReset(); createPerpetualShortMock.mockReset(); createPerpetualCloseMock.mockReset(); + createPerpetualReduceMock.mockReset(); copilotkitEmitStateMock.mockReset(); }); @@ -210,6 +214,66 @@ describe('pollCycleNode (integration)', () => { expect(artifactIds).toContain('gmx-allora-execution-plan'); }); + it('executes reduce plans via onchain-actions reduce endpoint when position exists', async () => { + fetchAlloraInferenceMock.mockResolvedValueOnce({ + topicId: 14, + combinedValue: 47000, + confidenceIntervalValues: [46000, 46500, 47000, 47500, 48000], + }); + listPerpetualMarketsMock.mockResolvedValueOnce([baseMarket]); + listPerpetualPositionsMock.mockResolvedValueOnce([ + { + chainId: '42161', + key: '0xpos1', + contractKey: '0xposition', + account: '0xwallet', + marketAddress: '0xmarket', + sizeInUsd: '2000000000000000000000000000000', + sizeInTokens: '0.01', + collateralAmount: '50', + pendingBorrowingFeesUsd: '0', + increasedAtTime: '0', + decreasedAtTime: '0', + positionSide: 'long', + isLong: true, + fundingFeeAmount: '0', + claimableLongTokenAmount: '0', + claimableShortTokenAmount: '0', + isOpening: false, + pnl: '0', + positionFeeAmount: '0', + traderDiscountAmount: '0', + uiFeeAmount: '0', + collateralToken: { + tokenUid: { chainId: '42161', address: '0xusdc' }, + name: 'USD Coin', + symbol: 'USDC', + isNative: false, + decimals: 6, + iconUri: null, + isVetted: true, + }, + }, + ]); + + const state = buildBaseState(); + state.view.metrics.previousPrice = 46000; + state.view.metrics.latestCycle = { + cycle: 0, + action: 'open', + reason: 'previous open', + marketSymbol: 'BTC/USDC', + side: 'long', + leverage: 2, + sizeUsd: 160, + timestamp: '2026-02-05T12:00:00.000Z', + }; + + await pollCycleNode(state, {}); + + expect(createPerpetualReduceMock).toHaveBeenCalled(); + }); + it('fails the cycle when no GMX market matches', async () => { fetchAlloraInferenceMock.mockResolvedValueOnce({ topicId: 14, From b3807557b8c64aaa31f9f524d6817999cbce1f21 Mon Sep 17 00:00:00 2001 From: Sebas Date: Sun, 8 Feb 2026 15:43:25 -0800 Subject: [PATCH 46/70] fix(agent-gmx-allora): stabilize QA cycles and artifacts --- .../web-ag-ui/apps/agent-gmx-allora/README.md | 2 + .../apps/agent-gmx-allora/package.json | 1 + .../agent-gmx-allora/src/clients/clients.ts | 48 +++++ .../agent-gmx-allora/src/config/constants.ts | 24 ++- .../src/config/constants.unit.test.ts | 20 +- .../agent-gmx-allora/src/core/decision.ts | 4 +- .../src/core/decision.unit.test.ts | 24 +++ .../agent-gmx-allora/src/core/transaction.ts | 119 +++++++++++ .../src/core/transaction.unit.test.ts | 65 ++++++ .../src/workflow/artifacts.ts | 6 +- .../src/workflow/artifacts.unit.test.ts | 24 +++ .../src/workflow/clientFactory.ts | 20 ++ .../src/workflow/clientFactory.unit.test.ts | 36 +++- .../agent-gmx-allora/src/workflow/context.ts | 6 + .../src/workflow/execution.ts | 125 ++++++++++- .../src/workflow/execution.unit.test.ts | 51 ++++- .../src/workflow/nodes/pollCycle.ts | 69 ++++-- .../tests/pollCycle.int.test.ts | 31 +-- .../apps/web/tests/setup/mockAlloraServer.ts | 16 +- .../web/tests/setup/system.globalSetup.ts | 16 +- .../clients/web-ag-ui/scripts/mock-allora.mjs | 74 +++++++ typescript/clients/web-ag-ui/scripts/qa.sh | 43 +++- typescript/pnpm-lock.yaml | 201 +++++++++++++++--- 23 files changed, 942 insertions(+), 83 deletions(-) create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/clients.ts create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/transaction.ts create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/transaction.unit.test.ts create mode 100644 typescript/clients/web-ag-ui/scripts/mock-allora.mjs diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md index 7212b626..e1c28021 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md @@ -29,6 +29,7 @@ The agent always uses onchain-actions to build a `transactions[]` plan for the c ## Environment +- `GMX_ALLORA_POLL_INTERVAL_MS`: poll interval (ms) for each agent cycle. Defaults to `10000` (10s). - `GMX_MIN_NATIVE_ETH_WEI`: minimum native ETH (in wei) required in the operator wallet before the agent will proceed (defaults to `2000000000000000` = 0.002 ETH). - `ALLORA_INFERENCE_CACHE_TTL_MS`: cache TTL (ms) for Allora consumer inference requests. Defaults to `30000`; set to `0` to disable caching. - `ALLORA_8H_INFERENCE_CACHE_TTL_MS`: cache TTL (ms) specifically for the GMX agent's 8-hour inference fetch. Defaults to `30000`; set to `3600000` (1 hour) to avoid re-fetching on every 5s poll tick. @@ -36,3 +37,4 @@ The agent always uses onchain-actions to build a `transactions[]` plan for the c - `plan` (default): build and emit `transactions[]` but do not broadcast. - `submit`: broadcast planned transactions via an embedded wallet (no delegations). Requires an onchain-actions version that correctly plans the requested GMX action (especially close via decrease order). - `GMX_ALLORA_EMBEDDED_PRIVATE_KEY`: required when `GMX_ALLORA_TX_SUBMISSION_MODE=submit` (0x + 64 hex chars). Only for local/dev use. +- `ARBITRUM_RPC_URL`: RPC URL for broadcasting transactions when submission is enabled. diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/package.json b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/package.json index 2e53e8c1..4bc2b54f 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/package.json +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/package.json @@ -53,6 +53,7 @@ "@langchain/openai": "^1.1.3", "@metamask/delegation-toolkit": "^0.13.0", "node-cron": "^4.2.1", + "p-retry": "^7.1.1", "permissionless": "^0.2.57", "uuid": "^13.0.0", "viem": "catalog:", diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/clients.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/clients.ts new file mode 100644 index 00000000..9db6325e --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/clients.ts @@ -0,0 +1,48 @@ +import { createPublicClient, createWalletClient, http, type Account } from 'viem'; +import { arbitrum } from 'viem/chains'; + +const ARBITRUM_RPC_URL = + process.env['ARBITRUM_RPC_URL'] ?? 'https://arb-mainnet.g.alchemy.com/v2/demo-key'; + +const RPC_RETRY_COUNT = 2; +const RPC_TIMEOUT_MS = 8000; + +type WalletInstance = ReturnType; + +export type OnchainClients = { + public: ReturnType; + wallet: WalletInstance & { account: Account }; +}; + +export function createRpcTransport(url: string): ReturnType { + const baseTransport = http(url); + const baseTransportValue: unknown = baseTransport; + if (typeof baseTransportValue !== 'function') { + return baseTransport; + } + return ((params: Parameters[0]) => + baseTransport({ + ...params, + retryCount: RPC_RETRY_COUNT, + timeout: RPC_TIMEOUT_MS, + })) as ReturnType; +} + +export function createClients(account: Account): OnchainClients { + const transport = createRpcTransport(ARBITRUM_RPC_URL); + const publicClient = createPublicClient({ + chain: arbitrum, + transport, + }); + const walletClient = createWalletClient({ + account, + chain: arbitrum, + transport, + }) as WalletInstance & { account: Account }; + + return { + public: publicClient, + wallet: walletClient, + }; +} + diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts index 54b1038d..7a4f2a18 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts @@ -5,6 +5,9 @@ const DEFAULT_ALLORA_API_BASE_URL = 'https://api.allora.network'; const DEFAULT_ALLORA_CHAIN_ID = 'allora-mainnet-1'; const DEFAULT_ALLORA_INFERENCE_CACHE_TTL_MS = 30_000; const DEFAULT_ALLORA_8H_INFERENCE_CACHE_TTL_MS = 30_000; +const DEFAULT_GMX_ALLORA_TX_EXECUTION_MODE: GmxAlloraTxExecutionMode = 'plan'; + +export type GmxAlloraTxExecutionMode = 'plan' | 'execute'; type OnchainActionsBaseUrlLogger = (message: string, metadata?: Record) => void; @@ -94,7 +97,26 @@ export const ALLORA_TOPIC_LABELS = { ETH: 'ETH/USD - Price Prediction - 8h', } as const; -const DEFAULT_POLL_INTERVAL_MS = 5_000; +export function resolveGmxAlloraTxExecutionMode(): GmxAlloraTxExecutionMode { + const raw = process.env['GMX_ALLORA_TX_SUBMISSION_MODE']; + if (!raw) { + return DEFAULT_GMX_ALLORA_TX_EXECUTION_MODE; + } + + const normalized = raw.trim().toLowerCase(); + if (normalized === 'plan') { + return 'plan'; + } + + // Support both "submit" (documented) and "execute" (consistent with other agents). + if (normalized === 'submit' || normalized === 'execute') { + return 'execute'; + } + + return DEFAULT_GMX_ALLORA_TX_EXECUTION_MODE; +} + +const DEFAULT_POLL_INTERVAL_MS = 10_000; const DEFAULT_STREAM_LIMIT = -1; const DEFAULT_STATE_HISTORY_LIMIT = 100; diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts index 86017955..d328868c 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it, vi } from 'vitest'; -import { resolveOnchainActionsBaseUrl } from './constants.js'; +import { resolveGmxAlloraTxExecutionMode, resolveOnchainActionsBaseUrl } from './constants.js'; describe('config/constants', () => { it('normalizes the OpenAPI endpoint to a base URL and logs the change', () => { @@ -45,4 +45,22 @@ describe('config/constants', () => { expect(baseUrl).toBe('https://api.emberai.xyz'); expect(logger).not.toHaveBeenCalled(); }); + + it('defaults to plan mode for transaction execution', () => { + delete process.env.GMX_ALLORA_TX_SUBMISSION_MODE; + + expect(resolveGmxAlloraTxExecutionMode()).toBe('plan'); + }); + + it('uses execute mode when submission mode is submit', () => { + process.env.GMX_ALLORA_TX_SUBMISSION_MODE = 'submit'; + + expect(resolveGmxAlloraTxExecutionMode()).toBe('execute'); + }); + + it('uses plan mode when submission mode is plan', () => { + process.env.GMX_ALLORA_TX_SUBMISSION_MODE = 'plan'; + + expect(resolveGmxAlloraTxExecutionMode()).toBe('plan'); + }); }); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/decision.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/decision.ts index 6afc3e39..383735ca 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/decision.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/decision.ts @@ -56,11 +56,11 @@ export function decideTradeAction(params: DecideTradeActionParams): TradeDecisio if (params.previousAction === 'open' && params.previousSide === side) { return { - action: 'reduce', + action: 'hold', side, leverage, sizeUsd, - reason: `Signal persists in ${side}; reducing exposure.`, + reason: `Signal persists in ${side}; holding open position.`, }; } diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/decision.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/decision.unit.test.ts index edcc3ad7..df256691 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/decision.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/decision.unit.test.ts @@ -33,4 +33,28 @@ describe('decideTradeAction', () => { reason: 'Signal confidence 0.8 >= 0.62; opening long position.', }); }); + + it('holds when a position is already open and the signal stays in the same direction', () => { + const prediction: AlloraPrediction = { + topic: 'BTC/USD - Price Prediction - 8h', + horizonHours: 8, + confidence: 0.9, + direction: 'up', + predictedPrice: 110, + timestamp: '2026-02-05T12:00:00.000Z', + }; + + const decision = decideTradeAction({ + prediction, + decisionThreshold: 0.62, + cooldownRemaining: 0, + maxLeverage: 2, + baseContributionUsd: 100, + previousAction: 'open', + previousSide: 'long', + }); + + expect(decision.action).toBe('hold'); + expect(decision.reason.toLowerCase()).toContain('persists'); + }); }); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/transaction.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/transaction.ts new file mode 100644 index 00000000..30bbd5a9 --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/transaction.ts @@ -0,0 +1,119 @@ +import pRetry, { AbortError } from 'p-retry'; +import { parseEther } from 'viem'; + +import type { OnchainClients } from '../clients/clients.js'; +import { logInfo } from '../workflow/context.js'; + +const RPC_RATE_LIMIT_STATUS = 429; +const SEND_TRANSACTION_RETRIES = 5; +const SEND_TRANSACTION_BASE_DELAY_MS = 1000; +const SEND_TRANSACTION_MAX_DELAY_MS = 12000; + +function formatRetryError(error: unknown): string { + if (error instanceof Error) { + return error.message; + } + if (typeof error === 'string') { + return error; + } + return 'Unknown error'; +} + +function readStatusCode(error: unknown): number | undefined { + if (!error || typeof error !== 'object') { + return undefined; + } + if ('status' in error && typeof (error as { status?: unknown }).status === 'number') { + return (error as { status: number }).status; + } + if ( + 'response' in error && + typeof (error as { response?: unknown }).response === 'object' && + (error as { response?: { status?: unknown } }).response?.status !== undefined + ) { + const status = (error as { response?: { status?: unknown } }).response?.status; + return typeof status === 'number' ? status : undefined; + } + return undefined; +} + +function isRateLimitError(error: unknown): boolean { + if (typeof error === 'string') { + return /Status:\s*429\b/u.test(error) || /"code"\s*:\s*429\b/u.test(error); + } + if (error instanceof Error) { + if (/Status:\s*429\b/u.test(error.message)) { + return true; + } + const status = readStatusCode(error); + if (status === RPC_RATE_LIMIT_STATUS) { + return true; + } + const cause = (error as { cause?: unknown }).cause; + if (cause && cause !== error) { + return isRateLimitError(cause); + } + } + return false; +} + +function sendTransactionWithRetry( + clients: OnchainClients, + tx: { + to: `0x${string}`; + data: `0x${string}`; + value?: bigint; + }, +): Promise<`0x${string}`> { + return pRetry<`0x${string}`>( + async () => + clients.wallet.sendTransaction({ + account: clients.wallet.account, + chain: clients.wallet.chain, + to: tx.to, + data: tx.data, + value: tx.value, + }), + { + retries: SEND_TRANSACTION_RETRIES, + factor: 2, + minTimeout: SEND_TRANSACTION_BASE_DELAY_MS, + maxTimeout: SEND_TRANSACTION_MAX_DELAY_MS, + randomize: true, + onFailedAttempt: ({ attemptNumber, retriesLeft, error }) => { + if (!isRateLimitError(error)) { + throw new AbortError(error); + } + logInfo('RPC rate limit detected; retrying transaction', { + attemptNumber, + retriesLeft, + error: formatRetryError(error), + }); + }, + }, + ); +} + +export async function executeTransaction( + clients: OnchainClients, + tx: { + to: `0x${string}`; + data: `0x${string}`; + value?: bigint; + }, +) { + const hash = await sendTransactionWithRetry(clients, tx); + const receipt = await clients.public.waitForTransactionReceipt({ hash }); + return receipt; +} + +export function assertGasBudget(maxGasSpendEth: number) { + if (maxGasSpendEth <= 0) { + throw new Error('Gas budget must be positive'); + } +} + +export function toWei(amountEth: number) { + return parseEther(amountEth.toString()); +} + diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/transaction.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/transaction.unit.test.ts new file mode 100644 index 00000000..fad7a95f --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/transaction.unit.test.ts @@ -0,0 +1,65 @@ +import { describe, expect, it, vi } from 'vitest'; + +import type { OnchainClients } from '../clients/clients.js'; + +import { assertGasBudget, executeTransaction, toWei } from './transaction.js'; + +const partial = >(value: T): unknown => + expect.objectContaining(value) as unknown; + +function makeClients({ + txHash, + receipt, +}: { + txHash: `0x${string}`; + receipt: { transactionHash: `0x${string}` }; +}): OnchainClients { + return { + public: { + waitForTransactionReceipt: vi.fn().mockResolvedValue(receipt), + } as unknown as OnchainClients['public'], + wallet: { + account: { address: '0xaaaa' } as `0x${string}`, + sendTransaction: vi.fn().mockResolvedValue(txHash), + } as unknown as OnchainClients['wallet'], + }; +} + +describe('executeTransaction', () => { + it('submits transactions via the wallet client and waits for the receipt', async () => { + const clients = makeClients({ + txHash: '0xhash', + receipt: { transactionHash: '0xreceipt' as `0x${string}` }, + }); + + const receipt = await executeTransaction(clients, { + to: '0xbbb' as `0x${string}`, + data: '0x01' as `0x${string}`, + value: 123n, + }); + + expect(clients.wallet.sendTransaction).toHaveBeenCalledWith( + partial({ + account: clients.wallet.account, + to: '0xbbb', + data: '0x01', + value: 123n, + }), + ); + expect(clients.public.waitForTransactionReceipt).toHaveBeenCalledWith({ hash: '0xhash' }); + expect(receipt.transactionHash).toBe('0xreceipt'); + }); +}); + +describe('assertGasBudget', () => { + it('rejects zero or negative budgets', () => { + expect(() => assertGasBudget(0)).toThrow(/must be positive/); + }); +}); + +describe('toWei', () => { + it('parses floating-point ETH amounts into wei', () => { + expect(toWei(0.5)).toBe(500000000000000000n); + }); +}); + diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.ts index b329a288..0e909ff8 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.ts @@ -143,6 +143,7 @@ export function buildExecutionPlanArtifact(params: { export function buildExecutionResultArtifact(params: { action: ExecutionPlan['action']; + plan?: ExecutionPlan; ok: boolean; error?: string; telemetry?: GmxAlloraTelemetry; @@ -151,7 +152,10 @@ export function buildExecutionResultArtifact(params: { lastTxHash?: `0x${string}`; }): Artifact { const txHash = params.lastTxHash; - const planSlug = txHash ? null : createTxPlanSlug(params.transactions); + const txPlanSlug = txHash ? null : createTxPlanSlug(params.transactions); + const placeholderSlug = + !txHash && !txPlanSlug && params.plan ? createExecutionPlanSlug(params.plan) : null; + const planSlug = txPlanSlug ?? placeholderSlug; const rebalance = params.telemetry ? formatRebalance(params.telemetry) : null; const signal = params.telemetry ? formatSignal(params.telemetry.prediction) : null; diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.unit.test.ts index 6b3b1cc8..a91514c5 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/artifacts.unit.test.ts @@ -61,6 +61,30 @@ describe('buildExecutionPlanArtifact', () => { expect(artifact.parts[1]?.data).toMatchObject({ action: 'long', ok: true }); }); + it('includes a stable plan placeholder when transactions are unavailable', () => { + const plan: ExecutionPlan = { + action: 'long', + request: { + amount: '160', + walletAddress: '0xwallet', + chainId: '42161', + marketAddress: '0xmarket', + payTokenAddress: '0xusdc', + collateralTokenAddress: '0xusdc', + leverage: '2', + }, + }; + + const artifact = buildExecutionResultArtifact({ + action: 'long', + plan, + ok: true, + transactions: [], + }); + + expect(artifact.description).toMatch(/plan planreq_[0-9a-f]{10}$/u); + }); + it('wraps telemetry data into an artifact', () => { const telemetry: GmxAlloraTelemetry = { cycle: 3, diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.ts index 5b074f59..6cc2daa0 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.ts @@ -1,7 +1,13 @@ +import { privateKeyToAccount } from 'viem/accounts'; + +import { createClients, type OnchainClients } from '../clients/clients.js'; import { OnchainActionsClient } from '../clients/onchainActions.js'; import { ONCHAIN_ACTIONS_BASE_URL } from '../config/constants.js'; +import { normalizeHexAddress } from './context.js'; + let cachedOnchainActionsClient: OnchainActionsClient | null = null; +let cachedOnchainClients: OnchainClients | null = null; export function getOnchainActionsClient(): OnchainActionsClient { if (!cachedOnchainActionsClient) { @@ -10,6 +16,20 @@ export function getOnchainActionsClient(): OnchainActionsClient { return cachedOnchainActionsClient; } +export function getOnchainClients(): OnchainClients { + if (!cachedOnchainClients) { + const rawPrivateKey = process.env['GMX_ALLORA_EMBEDDED_PRIVATE_KEY']; + if (!rawPrivateKey) { + throw new Error('GMX_ALLORA_EMBEDDED_PRIVATE_KEY environment variable is required'); + } + const privateKey = normalizeHexAddress(rawPrivateKey, 'embedded private key'); + const account = privateKeyToAccount(privateKey); + cachedOnchainClients = createClients(account); + } + return cachedOnchainClients; +} + export function clearClientCache(): void { cachedOnchainActionsClient = null; + cachedOnchainClients = null; } diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.unit.test.ts index feddcdff..6cbd9f7a 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.unit.test.ts @@ -1,23 +1,32 @@ import { afterEach, describe, expect, it, vi } from 'vitest'; -import { clearClientCache, getOnchainActionsClient } from './clientFactory.js'; +import { clearClientCache, getOnchainActionsClient, getOnchainClients } from './clientFactory.js'; -const { onchainActionsCtorMock } = vi.hoisted(() => ({ +const { createClientsMock, onchainActionsCtorMock, privateKeyToAccountMock } = vi.hoisted(() => ({ + createClientsMock: vi.fn(), onchainActionsCtorMock: vi.fn(), + privateKeyToAccountMock: vi.fn(), })); vi.mock('../clients/onchainActions.js', () => ({ OnchainActionsClient: onchainActionsCtorMock, })); +vi.mock('../clients/clients.js', () => ({ + createClients: createClientsMock, +})); + vi.mock('viem/accounts', () => ({ - privateKeyToAccount: vi.fn(), + privateKeyToAccount: privateKeyToAccountMock, })); describe('clientFactory', () => { afterEach(() => { clearClientCache(); onchainActionsCtorMock.mockReset(); + createClientsMock.mockReset(); + privateKeyToAccountMock.mockReset(); + delete process.env.GMX_ALLORA_EMBEDDED_PRIVATE_KEY; }); it('creates and caches the onchain actions client', () => { @@ -28,4 +37,25 @@ describe('clientFactory', () => { expect(onchainActionsCtorMock).toHaveBeenCalledTimes(1); expect(onchainActionsCtorMock).toHaveBeenCalledWith('https://api.emberai.xyz'); }); + + it('creates and caches the onchain clients from the embedded private key', () => { + process.env.GMX_ALLORA_EMBEDDED_PRIVATE_KEY = + '0x0000000000000000000000000000000000000000000000000000000000000001'; + + privateKeyToAccountMock.mockReturnValue({ address: '0xabc' }); + createClientsMock.mockReturnValue({ kind: 'clients' }); + + const first = getOnchainClients(); + const second = getOnchainClients(); + + expect(first).toBe(second); + expect(privateKeyToAccountMock).toHaveBeenCalledTimes(1); + expect(createClientsMock).toHaveBeenCalledTimes(1); + }); + + it('throws when embedded private key is missing', () => { + delete process.env.GMX_ALLORA_EMBEDDED_PRIVATE_KEY; + + expect(() => getOnchainClients()).toThrow(/GMX_ALLORA_EMBEDDED_PRIVATE_KEY/); + }); }); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/context.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/context.ts index 421f546d..7cf31806 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/context.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/context.ts @@ -78,6 +78,10 @@ export type ClmmMetrics = { staleCycles: number; iteration: number; latestCycle?: GmxAlloraTelemetry; + // When running in plan-only mode (no submission), we may want to avoid re-planning + // the same open action every time the signal stays stable. This field tracks the + // last assumed position side for decisioning until a close/flip occurs. + assumedPositionSide?: 'long' | 'short'; }; export type TaskState = @@ -246,6 +250,7 @@ const defaultViewState = (): ClmmViewState => ({ staleCycles: 0, iteration: 0, latestCycle: undefined, + assumedPositionSide: undefined, }, transactionHistory: [], }); @@ -334,6 +339,7 @@ const mergeViewState = (left: ClmmViewState, right?: Partial): Cl staleCycles: right.metrics?.staleCycles ?? left.metrics.staleCycles, iteration: right.metrics?.iteration ?? left.metrics.iteration, latestCycle: right.metrics?.latestCycle ?? left.metrics.latestCycle, + assumedPositionSide: right.metrics?.assumedPositionSide ?? left.metrics.assumedPositionSide, }; return { diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.ts index f290e3db..818f8b1d 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.ts @@ -1,24 +1,95 @@ +import type { OnchainClients } from '../clients/clients.js'; import type { OnchainActionsClient, TransactionPlan } from '../clients/onchainActions.js'; import type { ExecutionPlan } from '../core/executionPlan.js'; +import { executeTransaction } from '../core/transaction.js'; + +import { logInfo, normalizeHexAddress } from './context.js'; export type ExecutionResult = { action: ExecutionPlan['action']; ok: boolean; transactions?: TransactionPlan[]; + txHashes?: `0x${string}`[]; + lastTxHash?: `0x${string}`; error?: string; }; +function normalizeHexData(value: string, label: string): `0x${string}` { + if (!value.startsWith('0x')) { + throw new Error(`Invalid ${label}: ${value}`); + } + return value as `0x${string}`; +} + +function parseTransactionValue(value: string | undefined): bigint { + if (!value) { + return 0n; + } + try { + return BigInt(value); + } catch (error) { + const reason = error instanceof Error ? error.message : String(error); + throw new Error(`Unable to parse transaction value "${value}": ${reason}`); + } +} + +async function executePlannedTransaction(params: { + clients: OnchainClients; + tx: TransactionPlan; +}): Promise<`0x${string}`> { + const to = normalizeHexAddress(params.tx.to, 'transaction target'); + const data = normalizeHexData(params.tx.data, 'transaction data'); + const value = parseTransactionValue(params.tx.value); + + logInfo('Submitting GMX planned transaction', { + to, + chainId: params.tx.chainId, + value: params.tx.value, + }); + + const receipt = await executeTransaction(params.clients, { to, data, value }); + + logInfo('GMX transaction confirmed', { transactionHash: receipt.transactionHash }); + + return receipt.transactionHash; +} + +async function planOrExecuteTransactions(params: { + txExecutionMode: 'plan' | 'execute'; + clients?: OnchainClients; + transactions: TransactionPlan[]; +}): Promise<{ txHashes: `0x${string}`[]; lastTxHash?: `0x${string}` }> { + if (params.txExecutionMode === 'plan') { + return { txHashes: [] }; + } + if (!params.clients) { + throw new Error('Onchain clients are required to execute GMX transactions'); + } + if (params.transactions.length === 0) { + return { txHashes: [] }; + } + + const txHashes: `0x${string}`[] = []; + for (const tx of params.transactions) { + const hash = await executePlannedTransaction({ clients: params.clients, tx }); + txHashes.push(hash); + } + return { txHashes, lastTxHash: txHashes.at(-1) }; +} + export async function executePerpetualPlan(params: { client: Pick< OnchainActionsClient, 'createPerpetualLong' | 'createPerpetualShort' | 'createPerpetualClose' | 'createPerpetualReduce' >; plan: ExecutionPlan; + txExecutionMode: 'plan' | 'execute'; + clients?: OnchainClients; }): Promise { const { plan } = params; if (plan.action === 'none' || !plan.request) { - return { action: plan.action, ok: true }; + return { action: plan.action, ok: true, txHashes: [] }; } try { @@ -26,24 +97,68 @@ export async function executePerpetualPlan(params: { const response = await params.client.createPerpetualLong( plan.request as Parameters[0], ); - return { action: plan.action, ok: true, transactions: response.transactions }; + const execution = await planOrExecuteTransactions({ + txExecutionMode: params.txExecutionMode, + clients: params.clients, + transactions: response.transactions, + }); + return { + action: plan.action, + ok: true, + transactions: response.transactions, + txHashes: execution.txHashes, + lastTxHash: execution.lastTxHash, + }; } if (plan.action === 'short') { const response = await params.client.createPerpetualShort( plan.request as Parameters[0], ); - return { action: plan.action, ok: true, transactions: response.transactions }; + const execution = await planOrExecuteTransactions({ + txExecutionMode: params.txExecutionMode, + clients: params.clients, + transactions: response.transactions, + }); + return { + action: plan.action, + ok: true, + transactions: response.transactions, + txHashes: execution.txHashes, + lastTxHash: execution.lastTxHash, + }; } if (plan.action === 'reduce') { const response = await params.client.createPerpetualReduce( plan.request as Parameters[0], ); - return { action: plan.action, ok: true, transactions: response.transactions }; + const execution = await planOrExecuteTransactions({ + txExecutionMode: params.txExecutionMode, + clients: params.clients, + transactions: response.transactions, + }); + return { + action: plan.action, + ok: true, + transactions: response.transactions, + txHashes: execution.txHashes, + lastTxHash: execution.lastTxHash, + }; } const response = await params.client.createPerpetualClose( plan.request as Parameters[0], ); - return { action: plan.action, ok: true, transactions: response.transactions }; + const execution = await planOrExecuteTransactions({ + txExecutionMode: params.txExecutionMode, + clients: params.clients, + transactions: response.transactions, + }); + return { + action: plan.action, + ok: true, + transactions: response.transactions, + txHashes: execution.txHashes, + lastTxHash: execution.lastTxHash, + }; } catch (error: unknown) { const message = error instanceof Error ? error.message : String(error); return { action: plan.action, ok: false, error: message }; diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.unit.test.ts index e4ce0bec..a60c63ae 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.unit.test.ts @@ -1,9 +1,18 @@ import { describe, expect, it, vi } from 'vitest'; +import type { OnchainClients } from '../clients/clients.js'; import type { ExecutionPlan } from '../core/executionPlan.js'; import { executePerpetualPlan } from './execution.js'; +const { executeTransactionMock } = vi.hoisted(() => ({ + executeTransactionMock: vi.fn(), +})); + +vi.mock('../core/transaction.js', () => ({ + executeTransaction: executeTransactionMock, +})); + const createPerpetualLong = vi.fn(() => Promise.resolve({ transactions: [ @@ -32,10 +41,11 @@ describe('executePerpetualPlan', () => { it('skips execution when plan action is none', async () => { const plan: ExecutionPlan = { action: 'none' }; - const result = await executePerpetualPlan({ client, plan }); + const result = await executePerpetualPlan({ client, plan, txExecutionMode: 'plan' }); expect(result.ok).toBe(true); expect(createPerpetualLong).not.toHaveBeenCalled(); + expect(executeTransactionMock).not.toHaveBeenCalled(); }); it('executes long plans', async () => { @@ -52,12 +62,13 @@ describe('executePerpetualPlan', () => { }, }; - const result = await executePerpetualPlan({ client, plan }); + const result = await executePerpetualPlan({ client, plan, txExecutionMode: 'plan' }); expect(result.ok).toBe(true); expect(createPerpetualLong).toHaveBeenCalled(); expect(result.transactions).toHaveLength(1); expect(result.transactions?.[0]?.to).toBe('0xrouter'); + expect(executeTransactionMock).not.toHaveBeenCalled(); }); it('executes reduce plans', async () => { @@ -70,10 +81,11 @@ describe('executePerpetualPlan', () => { }, }; - const result = await executePerpetualPlan({ client, plan }); + const result = await executePerpetualPlan({ client, plan, txExecutionMode: 'plan' }); expect(result.ok).toBe(true); expect(createPerpetualReduce).toHaveBeenCalled(); + expect(executeTransactionMock).not.toHaveBeenCalled(); }); it('captures execution errors', async () => { @@ -88,9 +100,40 @@ describe('executePerpetualPlan', () => { }, }; - const result = await executePerpetualPlan({ client, plan }); + const result = await executePerpetualPlan({ client, plan, txExecutionMode: 'plan' }); expect(result.ok).toBe(false); expect(result.error).toContain('boom'); }); + + it('submits transactions when tx execution mode is execute', async () => { + executeTransactionMock.mockResolvedValueOnce({ transactionHash: '0xhash' }); + const clients = {} as OnchainClients; + + const plan: ExecutionPlan = { + action: 'long', + request: { + amount: '100', + walletAddress: '0x0000000000000000000000000000000000000001', + chainId: '42161', + marketAddress: '0xmarket', + payTokenAddress: '0xusdc', + collateralTokenAddress: '0xusdc', + leverage: '2', + }, + }; + + const result = await executePerpetualPlan({ + client, + clients, + plan, + txExecutionMode: 'execute', + }); + + expect(result.ok).toBe(true); + expect(result.transactions).toHaveLength(1); + expect(executeTransactionMock).toHaveBeenCalledTimes(1); + expect(result.txHashes).toEqual(['0xhash']); + expect(result.lastTxHash).toBe('0xhash'); + }); }); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts index 4aabba77..af3b901f 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts @@ -12,6 +12,7 @@ import { resolveAlloraApiKey, resolveAlloraChainId, resolveAllora8hInferenceCacheTtlMs, + resolveGmxAlloraTxExecutionMode, resolvePollIntervalMs, } from '../../config/constants.js'; import { buildAlloraPrediction } from '../../core/alloraPrediction.js'; @@ -25,7 +26,7 @@ import { buildExecutionResultArtifact, buildTelemetryArtifact, } from '../artifacts.js'; -import { getOnchainActionsClient } from '../clientFactory.js'; +import { getOnchainActionsClient, getOnchainClients } from '../clientFactory.js'; import { buildTaskStatus, logInfo, @@ -251,14 +252,23 @@ export const pollCycleNode = async ( } const previousCycle = state.view.metrics.latestCycle; + const assumedPositionSide = state.view.metrics.assumedPositionSide; + const normalizedTargetMarket = gmxMarketAddress.toLowerCase(); + const currentMarketPosition = positions.find( + (position) => position.marketAddress.toLowerCase() === normalizedTargetMarket, + ); + const currentPositionSide = currentMarketPosition?.positionSide; + + const decisionPreviousSide = currentPositionSide ?? assumedPositionSide ?? previousCycle?.side; + const decisionPreviousAction = decisionPreviousSide ? 'open' : previousCycle?.action; const { telemetry, nextCyclesSinceTrade: initialCyclesSinceTrade } = buildCycleTelemetry({ prediction, decisionThreshold: DECISION_THRESHOLD, cooldownCycles: COOLDOWN_CYCLES, maxLeverage: operatorConfig.maxLeverage, baseContributionUsd: operatorConfig.baseContributionUsd, - previousAction: previousCycle?.action, - previousSide: previousCycle?.side, + previousAction: decisionPreviousAction, + previousSide: decisionPreviousSide, cyclesSinceTrade: state.view.metrics.cyclesSinceRebalance ?? 0, isFirstCycle: iteration === 1, iteration, @@ -316,7 +326,6 @@ export const pollCycleNode = async ( append: true, }; - const normalizedTargetMarket = gmxMarketAddress.toLowerCase(); const positionForReduce = exposureAdjusted.action === 'reduce' && exposureAdjusted.side ? positions.find( @@ -336,10 +345,35 @@ export const pollCycleNode = async ( positionContractKey: positionForReduce?.contractKey, positionSizeInUsd: positionForReduce?.sizeInUsd, }); + + const txExecutionMode = resolveGmxAlloraTxExecutionMode(); + const clients = txExecutionMode === 'execute' ? getOnchainClients() : undefined; const executionResult = await executePerpetualPlan({ client: getOnchainActionsClient(), + clients, plan: executionPlan, + txExecutionMode, }); + + const nextAssumedPositionSide = (() => { + // Prefer actual onchain state when available. + if (currentPositionSide) { + return currentPositionSide; + } + if (!executionResult.ok) { + return assumedPositionSide; + } + if (executionPlan.action === 'long') { + return 'long'; + } + if (executionPlan.action === 'short') { + return 'short'; + } + if (executionPlan.action === 'close') { + return undefined; + } + return assumedPositionSide; + })(); const executionPlanEvent: ClmmEvent | undefined = executionPlan.action === 'none' ? undefined @@ -353,15 +387,18 @@ export const pollCycleNode = async ( ? undefined : { type: 'artifact', - artifact: buildExecutionResultArtifact({ - action: executionResult.action, - ok: executionResult.ok, - error: executionResult.error, - telemetry: exposureAdjusted, - transactions: executionResult.transactions, - }), - append: true, - }; + artifact: buildExecutionResultArtifact({ + action: executionResult.action, + plan: executionPlan, + ok: executionResult.ok, + error: executionResult.error, + telemetry: exposureAdjusted, + transactions: executionResult.transactions, + txHashes: executionResult.txHashes, + lastTxHash: executionResult.lastTxHash, + }), + append: true, + }; let cronScheduled = state.private.cronScheduled; const threadId = (config as Configurable).configurable?.thread_id; @@ -372,11 +409,12 @@ export const pollCycleNode = async ( cronScheduled = true; } - const transactionEntry = txHash + const resolvedTxHash = executionResult.lastTxHash ?? txHash; + const transactionEntry = resolvedTxHash ? { cycle: iteration, action, - txHash, + txHash: resolvedTxHash, status: 'success' as const, reason, timestamp: exposureAdjusted.timestamp, @@ -403,6 +441,7 @@ export const pollCycleNode = async ( staleCycles: state.view.metrics.staleCycles ?? 0, iteration, latestCycle: exposureAdjusted, + assumedPositionSide: nextAssumedPositionSide, }, task, activity: { diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts index 4799a4f6..7c9a3eb6 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts @@ -48,6 +48,7 @@ vi.mock('../src/workflow/clientFactory.js', () => ({ createPerpetualClose: createPerpetualCloseMock, createPerpetualReduce: createPerpetualReduceMock, }), + getOnchainClients: vi.fn(), })); vi.mock('../src/workflow/cronScheduler.js', () => ({ @@ -258,20 +259,23 @@ describe('pollCycleNode (integration)', () => { const state = buildBaseState(); state.view.metrics.previousPrice = 46000; - state.view.metrics.latestCycle = { - cycle: 0, - action: 'open', - reason: 'previous open', - marketSymbol: 'BTC/USDC', - side: 'long', - leverage: 2, - sizeUsd: 160, - timestamp: '2026-02-05T12:00:00.000Z', - }; + state.view.metrics.iteration = 10; + state.view.metrics.cyclesSinceRebalance = 2; + state.view.metrics.assumedPositionSide = 'long'; - await pollCycleNode(state, {}); + const result = await pollCycleNode(state, {}); + const update = (result as { update: ClmmState }).update; - expect(createPerpetualReduceMock).toHaveBeenCalled(); + // When we assume the position is already open and the signal stays bullish, + // we should not keep planning repeated opens. + expect(createPerpetualLongMock).not.toHaveBeenCalled(); + expect(createPerpetualReduceMock).not.toHaveBeenCalled(); + + const artifactIds = (update.view?.activity.events ?? []) + .filter((event) => event.type === 'artifact') + .map((event) => event.artifact.artifactId); + expect(artifactIds).toContain('gmx-allora-telemetry'); + expect(artifactIds).not.toContain('gmx-allora-execution-plan'); }); it('fails the cycle when no GMX market matches', async () => { @@ -303,7 +307,8 @@ describe('pollCycleNode (integration)', () => { key: '0xpos', contractKey: '0xcontract', account: '0xwallet', - marketAddress: '0xmarket', + // Different market: still counts towards total exposure, but does not satisfy "already open". + marketAddress: '0xother', sizeInUsd: '1000', sizeInTokens: '0.02', collateralAmount: '500', diff --git a/typescript/clients/web-ag-ui/apps/web/tests/setup/mockAlloraServer.ts b/typescript/clients/web-ag-ui/apps/web/tests/setup/mockAlloraServer.ts index 1219d38a..ac1591ed 100644 --- a/typescript/clients/web-ag-ui/apps/web/tests/setup/mockAlloraServer.ts +++ b/typescript/clients/web-ag-ui/apps/web/tests/setup/mockAlloraServer.ts @@ -9,6 +9,9 @@ function resolvePort(): number { const port = resolvePort(); +const counters: Record = {}; +const STABLE_WINDOW_REQUESTS = 3; + const server = http.createServer((req, res) => { if (!req.url) { res.statusCode = 400; @@ -25,7 +28,18 @@ const server = http.createServer((req, res) => { } const topicId = url.searchParams.get('allora_topic_id') ?? '0'; - const combined = topicId === '14' ? '48000' : topicId === '2' ? '2600' : '100'; + // Alternate between two extremes so UIs/tests can easily detect when they're + // using the mock vs a static/stale value. + // BTC=14, ETH=2 (8h feed); any other topic returns a stable default. + const combined = (() => { + if (topicId !== '14' && topicId !== '2') { + return '100'; + } + const next = (counters[topicId] ?? 0) + 1; + counters[topicId] = next; + const phase = Math.floor((next - 1) / STABLE_WINDOW_REQUESTS) % 2; + return phase === 0 ? '1' : '100000'; + })(); res.setHeader('content-type', 'application/json'); res.statusCode = 200; diff --git a/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts b/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts index 844d2a8c..89ab4017 100644 --- a/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts +++ b/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts @@ -481,6 +481,9 @@ async function startMockAlloraServer(): Promise<{ baseUrl: string; cleanup: Cleanup; }> { + const counters: Record = {}; + const stableWindowRequests = 3; + const server = http.createServer((req, res) => { if (!req.url) { res.statusCode = 400; @@ -497,7 +500,18 @@ async function startMockAlloraServer(): Promise<{ } const topicId = url.searchParams.get('allora_topic_id') ?? '0'; - const combined = topicId === '14' ? '48000' : topicId === '2' ? '2600' : '100'; + // Alternate between two extremes so UIs/tests can easily detect that they're + // talking to the mock server and can observe changes across polling cycles. + // BTC=14, ETH=2 (8h feed); any other topic returns a stable default. + const combined = (() => { + if (topicId !== '14' && topicId !== '2') { + return '100'; + } + const next = (counters[topicId] ?? 0) + 1; + counters[topicId] = next; + const phase = Math.floor((next - 1) / stableWindowRequests) % 2; + return phase === 0 ? '1' : '100000'; + })(); res.setHeader('content-type', 'application/json'); res.statusCode = 200; diff --git a/typescript/clients/web-ag-ui/scripts/mock-allora.mjs b/typescript/clients/web-ag-ui/scripts/mock-allora.mjs new file mode 100644 index 00000000..b7f4bc59 --- /dev/null +++ b/typescript/clients/web-ag-ui/scripts/mock-allora.mjs @@ -0,0 +1,74 @@ +import http from 'node:http'; + +const portRaw = process.env.PORT; +const port = portRaw ? Number(portRaw) : 0; +if (!Number.isFinite(port) || port <= 0) { + throw new Error(`PORT must be a positive number (got: ${String(portRaw)})`); +} + +const counters = {}; +const stableWindowRequestsRaw = process.env.ALLORA_MOCK_STABLE_WINDOW_REQUESTS; +const stableWindowRequests = stableWindowRequestsRaw ? Number(stableWindowRequestsRaw) : 3; +if (!Number.isFinite(stableWindowRequests) || stableWindowRequests <= 0) { + throw new Error( + `ALLORA_MOCK_STABLE_WINDOW_REQUESTS must be a positive number (got: ${String( + stableWindowRequestsRaw, + )})`, + ); +} + +const server = http.createServer((req, res) => { + if (!req.url) { + res.statusCode = 400; + res.end('Missing URL'); + return; + } + + const url = new URL(req.url, 'http://127.0.0.1'); + const match = url.pathname.match(/^\/v2\/allora\/consumer\/(.+)$/u); + if (!match) { + res.statusCode = 404; + res.end('not found'); + return; + } + + const topicId = url.searchParams.get('allora_topic_id') ?? '0'; + + // BTC=14, ETH=2 (8h feed); anything else is stable. + const combined = (() => { + if (topicId !== '14' && topicId !== '2') { + return '100'; + } + const next = (counters[topicId] ?? 0) + 1; + counters[topicId] = next; + const phase = Math.floor((next - 1) / stableWindowRequests) % 2; + return phase === 0 ? '1' : '100000'; + })(); + + // eslint-disable-next-line no-console + console.log(`[mock-allora] topic=${topicId} -> ${combined}`); + + res.setHeader('content-type', 'application/json'); + res.statusCode = 200; + res.end( + JSON.stringify({ + status: true, + data: { + inference_data: { + topic_id: topicId, + network_inference_normalized: combined, + }, + }, + }), + ); +}); + +server.listen(port, '127.0.0.1', () => { + const address = server.address(); + if (!address || typeof address === 'string') { + throw new Error('Failed to resolve mock Allora server address.'); + } + // Printed for humans. + // eslint-disable-next-line no-console + console.log(`[mock-allora] listening http://127.0.0.1:${address.port}`); +}); diff --git a/typescript/clients/web-ag-ui/scripts/qa.sh b/typescript/clients/web-ag-ui/scripts/qa.sh index 08db8a1e..5a041937 100755 --- a/typescript/clients/web-ag-ui/scripts/qa.sh +++ b/typescript/clients/web-ag-ui/scripts/qa.sh @@ -79,6 +79,44 @@ wait_for_http_ok() { done } +ensure_mock_allora() { + # By default QA uses a local deterministic Allora mock so the agent can be tested + # without hitting the live Allora API. + if [ "${QA_USE_REAL_ALLORA:-false}" = "true" ]; then + echo "[qa] using real Allora (QA_USE_REAL_ALLORA=true)" + return 0 + fi + + export ALLORA_API_BASE_URL="${ALLORA_API_BASE_URL:-http://127.0.0.1:5055}" + # Disable caching by default when using the mock so flips/stable windows are visible + # at the agent polling cadence. Override explicitly if you want caching. + export ALLORA_8H_INFERENCE_CACHE_TTL_MS="${ALLORA_8H_INFERENCE_CACHE_TTL_MS:-0}" + export ALLORA_INFERENCE_CACHE_TTL_MS="${ALLORA_INFERENCE_CACHE_TTL_MS:-0}" + # Keep signals stable for a few cycles, but flip quickly enough for manual QA. + export ALLORA_MOCK_STABLE_WINDOW_REQUESTS="${ALLORA_MOCK_STABLE_WINDOW_REQUESTS:-2}" + + local health_url="${ALLORA_API_BASE_URL}/v2/allora/consumer/mock?allora_topic_id=14" + if curl -fs -o /dev/null "$health_url"; then + echo "[qa] mock Allora already reachable at ${ALLORA_API_BASE_URL}" + return 0 + fi + + local log_file="$ROOT_DIR/.qa-mock-allora.log" + echo "[qa] starting mock Allora on ${ALLORA_API_BASE_URL} (logs: $log_file) ..." + ( + PORT=5055 node "$ROOT_DIR/scripts/mock-allora.mjs" + ) >"$log_file" 2>&1 & + + if ! wait_for_http_ok "$health_url" 30; then + echo "[qa] mock Allora failed to become reachable at ${ALLORA_API_BASE_URL} within 30s" >&2 + echo "[qa] tail of $log_file:" >&2 + tail -n 40 "$log_file" >&2 || true + exit 1 + fi + + echo "[qa] mock Allora ready at ${ALLORA_API_BASE_URL}" +} + resolve_onchain_actions_pnpm_bin() { local onchain_dir="${1:?missing onchain-actions dir}" # This repo uses a pinned pnpm version (packageManager field). The onchain-actions @@ -154,7 +192,9 @@ ensure_onchain_actions_50051() { local log_file="$ROOT_DIR/.qa-onchain-actions.log" echo "[qa] starting onchain-actions on http://localhost:50051 (logs: $log_file) ..." ( - "$pnpm_bin" -C "$onchain_dir" dev + # GMX order simulation can revert in dev environments due to plugin/role checks. + # For QA in plan-building mode we want deterministic `transactions[]` output. + GMX_SKIP_SIMULATION=true "$pnpm_bin" -C "$onchain_dir" dev ) >"$log_file" 2>&1 & if ! wait_for_http_ok "$markets_url" 120; then @@ -167,6 +207,7 @@ ensure_onchain_actions_50051() { echo "[qa] onchain-actions ready at ${ONCHAIN_ACTIONS_BASE_URL}" } +ensure_mock_allora ensure_onchain_actions_50051 echo "[qa] starting agent runtimes (LangGraph dev servers)..." diff --git a/typescript/pnpm-lock.yaml b/typescript/pnpm-lock.yaml index aa647901..5d3b7731 100644 --- a/typescript/pnpm-lock.yaml +++ b/typescript/pnpm-lock.yaml @@ -388,6 +388,9 @@ importers: eslint-config-next: specifier: ^16.0.8 version: 16.0.8(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + next: + specifier: 16.0.8 + version: 16.0.8(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) turbo: specifier: ^2.3.3 version: 2.6.3 @@ -609,6 +612,9 @@ importers: node-cron: specifier: ^4.2.1 version: 4.2.1 + p-retry: + specifier: ^7.1.1 + version: 7.1.1 permissionless: specifier: ^0.2.57 version: 0.2.57(ox@0.8.6(typescript@5.9.3)(zod@4.3.5))(viem@2.38.1(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.5)) @@ -617,7 +623,7 @@ importers: version: 13.0.0 viem: specifier: 'catalog:' - version: 2.38.1(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.5) + version: 2.42.1(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.5) zod: specifier: ^4.3.5 version: 4.3.5 @@ -793,7 +799,7 @@ importers: version: 0.561.0(react@19.2.3) next: specifier: 16.0.8 - version: 16.0.8(@opentelemetry/api@1.9.0)(@playwright/test@1.56.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 16.0.8(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: specifier: ^19.2.1 version: 19.2.3 @@ -813,6 +819,9 @@ importers: specifier: ^3.24.4 version: 3.25.76 devDependencies: + '@ag-ui/client': + specifier: 0.0.42 + version: 0.0.42 '@eslint/eslintrc': specifier: ^3 version: 3.3.1 @@ -821,7 +830,7 @@ importers: version: 4.1.17 '@types/node': specifier: ^20 - version: 22.19.2 + version: 20.19.21 '@types/react': specifier: ^19 version: 19.2.2 @@ -830,13 +839,16 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitest/coverage-v8': specifier: ^4.0.18 - version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.2)(@vitest/ui@3.2.4(vitest@3.2.4))(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.8(@types/node@22.19.2)(typescript@5.9.3))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@20.19.21)(@vitest/ui@3.2.4(vitest@3.2.4))(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.8(@types/node@20.19.21)(typescript@5.9.3))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) eslint: specifier: ^9 version: 9.39.2(jiti@2.6.1) eslint-config-next: specifier: 16.0.8 version: 16.0.8(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + rxjs: + specifier: 7.8.1 + version: 7.8.1 tailwindcss: specifier: ^4 version: 4.1.17 @@ -845,10 +857,10 @@ importers: version: 5.9.3 vite-tsconfig-paths: specifier: ^6.0.5 - version: 6.0.5(typescript@5.9.3)(vite@7.1.7(@types/node@22.19.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 6.0.5(typescript@5.9.3)(vite@7.1.7(@types/node@20.19.21)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: specifier: ^4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.2)(@vitest/ui@3.2.4(vitest@3.2.4))(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.8(@types/node@22.19.2)(typescript@5.9.3))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@20.19.21)(@vitest/ui@3.2.4(vitest@3.2.4))(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.8(@types/node@20.19.21)(typescript@5.9.3))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) clients/web-legacy: dependencies: @@ -1234,6 +1246,8 @@ importers: specifier: ^1.2.0 version: 1.6.1(@types/node@20.19.21)(@vitest/ui@3.2.4(vitest@3.2.4))(lightningcss@1.30.2)(terser@5.44.0) + community/agents/gmx-allora-agent: {} + community/agents/lending-agent-no-wallet: dependencies: '@emberai/arbitrum-vibekit-core': @@ -8638,6 +8652,7 @@ packages: '@vercel/postgres@0.10.0': resolution: {integrity: sha512-fSD23DxGND40IzSkXjcFcxr53t3Tiym59Is0jSYIFpG4/0f0KO9SGtcp1sXiebvPaGe7N/tU05cH4yt2S6/IPg==} engines: {node: '>=18.14'} + deprecated: '@vercel/postgres is deprecated. You can either choose an alternate storage solution from the Vercel Marketplace if you want to set up a new database. Or you can follow this guide to migrate your existing Vercel Postgres db: https://neon.com/docs/guides/vercel-postgres-transition-guide' '@viem/anvil@0.0.10': resolution: {integrity: sha512-9PzYXBRikfSUhhm8Bd0avv07agwcbMJ5FaSu2D2vbE0cxkvXGtolL3fW5nz2yefMqOqVQL4XzfM5nwY81x3ytw==} @@ -13841,6 +13856,7 @@ packages: next@16.0.8: resolution: {integrity: sha512-LmcZzG04JuzNXi48s5P+TnJBsTGPJunViNKV/iE4uM6kstjTQsQhvsAv+xF6MJxU2Pr26tl15eVbp0jQnsv6/g==} engines: {node: '>=20.9.0'} + deprecated: This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/security-update-2025-12-11 for more details. hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -17295,6 +17311,7 @@ packages: whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation whatwg-fetch@3.6.20: resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} @@ -19313,26 +19330,6 @@ snapshots: - utf-8-validate - zod - '@coinbase/wallet-sdk@4.3.6(bufferutil@4.0.9)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(zod@3.25.76)': - dependencies: - '@noble/hashes': 1.4.0 - clsx: 1.2.1 - eventemitter3: 5.0.1 - idb-keyval: 6.2.1 - ox: 0.6.9(typescript@5.9.3)(zod@3.25.76) - preact: 10.24.2 - viem: 2.42.1(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - zustand: 5.0.3(@types/react@19.2.2)(react@19.2.3)(use-sync-external-store@1.4.0(react@19.2.3)) - transitivePeerDependencies: - - '@types/react' - - bufferutil - - immer - - react - - typescript - - use-sync-external-store - - utf-8-validate - - zod - '@colors/colors@1.5.0': optional: true @@ -20926,6 +20923,14 @@ snapshots: '@inquirer/ansi@1.0.2': {} + '@inquirer/confirm@5.1.20(@types/node@20.19.21)': + dependencies: + '@inquirer/core': 10.3.1(@types/node@20.19.21) + '@inquirer/type': 3.0.10(@types/node@20.19.21) + optionalDependencies: + '@types/node': 20.19.21 + optional: true + '@inquirer/confirm@5.1.20(@types/node@22.18.8)': dependencies: '@inquirer/core': 10.3.1(@types/node@22.18.8) @@ -20940,6 +20945,20 @@ snapshots: optionalDependencies: '@types/node': 22.19.2 + '@inquirer/core@10.3.1(@types/node@20.19.21)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@20.19.21) + cli-width: 4.1.0 + mute-stream: 3.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 20.19.21 + optional: true + '@inquirer/core@10.3.1(@types/node@22.18.8)': dependencies: '@inquirer/ansi': 1.0.2 @@ -20968,6 +20987,11 @@ snapshots: '@inquirer/figures@1.0.15': {} + '@inquirer/type@3.0.10(@types/node@20.19.21)': + optionalDependencies: + '@types/node': 20.19.21 + optional: true + '@inquirer/type@3.0.10(@types/node@22.18.8)': optionalDependencies: '@types/node': 22.18.8 @@ -28468,6 +28492,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@20.19.21)(@vitest/ui@3.2.4(vitest@3.2.4))(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.8(@types/node@20.19.21)(typescript@5.9.3))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@bcoe/v8-coverage': 1.0.2 + '@vitest/utils': 4.0.18 + ast-v8-to-istanbul: 0.3.10 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.2.0 + magicast: 0.5.1 + obug: 2.1.1 + std-env: 3.10.0 + tinyrainbow: 3.0.3 + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@20.19.21)(@vitest/ui@3.2.4(vitest@3.2.4))(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.8(@types/node@20.19.21)(typescript@5.9.3))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.2)(@vitest/ui@3.2.4(vitest@3.2.4))(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.8(@types/node@22.19.2)(typescript@5.9.3))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@bcoe/v8-coverage': 1.0.2 @@ -28523,6 +28561,15 @@ snapshots: msw: 2.12.8(@types/node@22.18.8)(typescript@5.9.3) vite: 7.1.7(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + '@vitest/mocker@4.0.18(msw@2.12.8(@types/node@20.19.21)(typescript@5.9.3))(vite@7.1.7(@types/node@20.19.21)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@vitest/spy': 4.0.18 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + msw: 2.12.8(@types/node@20.19.21)(typescript@5.9.3) + vite: 7.1.7(@types/node@20.19.21)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + '@vitest/mocker@4.0.18(msw@2.12.8(@types/node@22.19.2)(typescript@5.9.3))(vite@7.1.7(@types/node@22.19.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 4.0.18 @@ -28873,7 +28920,7 @@ snapshots: '@wagmi/connectors@6.2.0(@wagmi/core@2.22.1(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(viem@2.42.1(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.5)))(bufferutil@4.0.9)(debug@4.4.3)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(viem@2.42.1(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.5))(wagmi@2.19.5(bufferutil@4.0.9)(debug@4.4.3)(react@19.2.3)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.42.1(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.5))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.76)': dependencies: '@base-org/account': 2.4.0(bufferutil@4.0.9)(debug@4.4.3)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.76) - '@coinbase/wallet-sdk': 4.3.6(bufferutil@4.0.9)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(zod@3.25.76) + '@coinbase/wallet-sdk': 4.3.6(@types/react@19.2.2)(bufferutil@4.0.9)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(zod@3.25.76) '@gemini-wallet/core': 0.3.2(viem@2.42.1(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.5)) '@metamask/sdk': 0.33.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) @@ -36872,6 +36919,32 @@ snapshots: transitivePeerDependencies: - '@types/node' + msw@2.12.8(@types/node@20.19.21)(typescript@5.9.3): + dependencies: + '@inquirer/confirm': 5.1.20(@types/node@20.19.21) + '@mswjs/interceptors': 0.41.0 + '@open-draft/deferred-promise': 2.2.0 + '@types/statuses': 2.0.6 + cookie: 1.0.2 + graphql: 16.12.0 + headers-polyfill: 4.0.3 + is-node-process: 1.2.0 + outvariant: 1.4.3 + path-to-regexp: 6.3.0 + picocolors: 1.1.1 + rettime: 0.10.1 + statuses: 2.0.2 + strict-event-emitter: 0.5.1 + tough-cookie: 6.0.0 + type-fest: 5.3.1 + until-async: 3.0.2 + yargs: 17.7.2 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@types/node' + optional: true + msw@2.12.8(@types/node@22.18.8)(typescript@5.9.3): dependencies: '@inquirer/confirm': 5.1.20(@types/node@22.18.8) @@ -37035,7 +37108,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@16.0.8(@opentelemetry/api@1.9.0)(@playwright/test@1.56.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + next@16.0.8(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.56.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: '@next/env': 16.0.8 '@swc/helpers': 0.5.15 @@ -37043,7 +37116,7 @@ snapshots: postcss: 8.4.31 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - styled-jsx: 5.1.6(react@19.2.3) + styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.2.3) optionalDependencies: '@next/swc-darwin-arm64': 16.0.8 '@next/swc-darwin-x64': 16.0.8 @@ -40047,15 +40120,17 @@ snapshots: optionalDependencies: '@babel/core': 7.28.5 - styled-jsx@5.1.6(react@19.0.0-rc-45804af1-20241021): + styled-jsx@5.1.6(@babel/core@7.28.5)(react@19.2.3): dependencies: client-only: 0.0.1 - react: 19.0.0-rc-45804af1-20241021 + react: 19.2.3 + optionalDependencies: + '@babel/core': 7.28.5 - styled-jsx@5.1.6(react@19.2.3): + styled-jsx@5.1.6(react@19.0.0-rc-45804af1-20241021): dependencies: client-only: 0.0.1 - react: 19.2.3 + react: 19.0.0-rc-45804af1-20241021 stylis@4.3.2: {} @@ -41319,12 +41394,12 @@ snapshots: - tsx - yaml - vite-tsconfig-paths@6.0.5(typescript@5.9.3)(vite@7.1.7(@types/node@22.19.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-tsconfig-paths@6.0.5(typescript@5.9.3)(vite@7.1.7(@types/node@20.19.21)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: debug: 4.4.3(supports-color@5.5.0) globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) - vite: 7.1.7(@types/node@22.19.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.7(@types/node@20.19.21)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript @@ -41340,6 +41415,23 @@ snapshots: lightningcss: 1.30.2 terser: 5.44.0 + vite@7.1.7(@types/node@20.19.21)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + dependencies: + esbuild: 0.25.10 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.3 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 20.19.21 + fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.30.2 + terser: 5.44.0 + tsx: 4.20.6 + yaml: 2.8.1 + vite@7.1.7(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: esbuild: 0.25.10 @@ -41495,6 +41587,45 @@ snapshots: - tsx - yaml + vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@20.19.21)(@vitest/ui@3.2.4(vitest@3.2.4))(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.8(@types/node@20.19.21)(typescript@5.9.3))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + dependencies: + '@vitest/expect': 4.0.18 + '@vitest/mocker': 4.0.18(msw@2.12.8(@types/node@20.19.21)(typescript@5.9.3))(vite@7.1.7(@types/node@20.19.21)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/pretty-format': 4.0.18 + '@vitest/runner': 4.0.18 + '@vitest/snapshot': 4.0.18 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 + es-module-lexer: 1.7.0 + expect-type: 1.2.2 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 7.1.7(@types/node@20.19.21)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@opentelemetry/api': 1.9.0 + '@types/node': 20.19.21 + '@vitest/ui': 3.2.4(vitest@3.2.4) + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.2)(@vitest/ui@3.2.4(vitest@3.2.4))(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.8(@types/node@22.19.2)(typescript@5.9.3))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@vitest/expect': 4.0.18 From d9d0b909e87913b7cd92fdc58dd244f9b511980e Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Tue, 10 Feb 2026 13:03:03 -0500 Subject: [PATCH 47/70] chore(web-ag-ui): expand env templates for gmx agent --- .../apps/agent-gmx-allora/.env.example | 49 ++++++++++++++++++ .../apps/agent-gmx-allora/.env.test.example | 51 +++++++++++++++++++ .../clients/web-ag-ui/apps/web/.env.example | 21 ++++++++ .../web-ag-ui/apps/web/.env.test.example | 6 +++ 4 files changed, 127 insertions(+) diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.example b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.example index c0a47f71..a962e1c6 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.example +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.example @@ -1,2 +1,51 @@ +# GMX Allora Agent (.env.example) +# +# Copy to `.env` (gitignored) and adjust for local development. +# This app uses Node's native env loading via `tsx --env-file=...` in scripts. + # Optional: bypass delegation signing by using the agent wallet for execution DELEGATIONS_BYPASS=false + +# Onchain-actions base URL. +# Accepts either a base URL (e.g. https://api.emberai.xyz) or an OpenAPI spec URL +# (e.g. https://api.emberai.xyz/openapi.json); the agent normalizes to the base URL. +# ONCHAIN_ACTIONS_BASE_URL=https://api.emberai.xyz + +# Allora API (agent is the only component that talks to Allora directly). +# ALLORA_API_BASE_URL=https://api.allora.network +# ALLORA_API_KEY= +# ALLORA_CHAIN_ID=allora-mainnet-1 + +# Allora inference cache TTLs (ms). Set to 0 to disable caching. +# ALLORA_INFERENCE_CACHE_TTL_MS=30000 +# ALLORA_8H_INFERENCE_CACHE_TTL_MS=30000 + +# GMX agent runtime controls. +# GMX_ALLORA_MODE=debug # debug (default) | production +# GMX_ALLORA_POLL_INTERVAL_MS=10000 # default 10000 +# GMX_ALLORA_STREAM_LIMIT=-1 # default -1 (no limit) +# GMX_ALLORA_STATE_HISTORY_LIMIT=100 # default 100 + +# Transaction submission mode. +# - plan: build transaction plans via onchain-actions only (no broadcasting) +# - submit/execute: broadcast planned transactions (dev only; requires embedded key) +# GMX_ALLORA_TX_SUBMISSION_MODE=plan +# GMX_ALLORA_EMBEDDED_PRIVATE_KEY=0x0000000000000000000000000000000000000000000000000000000000000000 + +# RPC used when transaction broadcasting is enabled. +# ARBITRUM_RPC_URL=https://arb-mainnet.g.alchemy.com/v2/replace-with-key + +# LangGraph dev server configuration. +# If omitted, defaults to http://localhost:8126 and graph id "agent-gmx-allora". +# LANGGRAPH_DEPLOYMENT_URL=http://localhost:8126 +# LANGGRAPH_GRAPH_ID=agent-gmx-allora + +# Optional: pin a thread id for cron/runner scripts (otherwise a UUIDv7 is generated). +# STARTER_THREAD_ID= + +# Optional: run the "starter cron" API runner (see src/cronApiRunner.ts). +# STARTER_CRON_INTERVAL_MS=5000 +# STARTER_CRON_EXPRESSION=*/5 * * * * * + +# Optional: override where the agent looks for config/service.json (expects service.json inside this dir). +# AGENT_CONFIG_DIR=/absolute/path/to/config/dir diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example index 5dd85e1a..05f958db 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example @@ -9,7 +9,58 @@ ONCHAIN_ACTIONS_BASE_URL=http://localhost:50051 # more than one, set this explicitly. # ONCHAIN_ACTIONS_WORKTREE_DIR=/absolute/path/to/forge/worktrees/onchain-actions-001 +# Optional: override which docker compose file is used to boot memgraph in the onchain-actions worktree. +# Defaults to `${ONCHAIN_ACTIONS_WORKTREE_DIR}/compose.dev.db.yaml`. +# ONCHAIN_ACTIONS_MEMGRAPH_COMPOSE_FILE=/absolute/path/to/compose.dev.db.yaml + +# Optional: onchain-actions boot overrides used by tests/setup/onchainActions.globalSetup.ts. +# These are forwarded to the onchain-actions worktree when the test global setup runs. +# (Most have CI-safe defaults in the setup script, so you typically don't need to set them.) +# COINGECKO_API_KEY= +# COINGECKO_USE_PRO=false +# SQUID_INTEGRATOR_ID=test +# DUNE_API_KEY=test +# BIRDEYE_API_KEY= +# PENDLE_CHAIN_IDS=42161 +# ALGEBRA_CHAIN_IDS=42161 +# GMX_CHAIN_IDS=42161 +# SERVICE_WALLET_PRIVATE_KEY=0x0000000000000000000000000000000000000000000000000000000000000000 +# DUST_CHAIN_ID=1 +# DUST_CHAIN_RECEIVER_ADDRESS=0x0000000000000000000000000000000000000000 + # Allora API (agent is the only component that talks to Allora directly). ALLORA_API_BASE_URL=https://api.allora.network # ALLORA_API_KEY= # ALLORA_CHAIN_ID=allora-mainnet-1 + +# Allora inference cache TTLs (ms). Set to 0 to disable caching (useful in tests). +# ALLORA_INFERENCE_CACHE_TTL_MS=0 +# ALLORA_8H_INFERENCE_CACHE_TTL_MS=0 + +# GMX agent runtime controls (optional). +# GMX_ALLORA_MODE=debug +# GMX_ALLORA_POLL_INTERVAL_MS=10000 +# GMX_ALLORA_STREAM_LIMIT=-1 +# GMX_ALLORA_STATE_HISTORY_LIMIT=100 + +# Transaction submission mode (tests default to plan-building). +# GMX_ALLORA_TX_SUBMISSION_MODE=plan +# GMX_ALLORA_EMBEDDED_PRIVATE_KEY=0x0000000000000000000000000000000000000000000000000000000000000000 + +# RPC used when transaction broadcasting is enabled. +# ARBITRUM_RPC_URL=https://arb-mainnet.g.alchemy.com/v2/demo-key + +# Smoke/E2E helpers. +# Used by tests/happyPath.e2e.test.ts and tests/smoke/gmx-allora-smoke.ts. +# SMOKE_WALLET=0x0000000000000000000000000000000000000000 +# SMOKE_USDC_ADDRESS=0x0000000000000000000000000000000000000000 + +# LangGraph API runner config (optional; used by src/cronApiRunner.ts). +# LANGGRAPH_DEPLOYMENT_URL=http://localhost:8126 +# LANGGRAPH_GRAPH_ID=agent-gmx-allora +# STARTER_THREAD_ID= +# STARTER_CRON_INTERVAL_MS=5000 +# STARTER_CRON_EXPRESSION=*/5 * * * * * + +# Optional: override where the agent looks for config/service.json. +# AGENT_CONFIG_DIR=/absolute/path/to/config/dir diff --git a/typescript/clients/web-ag-ui/apps/web/.env.example b/typescript/clients/web-ag-ui/apps/web/.env.example index c94f1d16..43b67825 100644 --- a/typescript/clients/web-ag-ui/apps/web/.env.example +++ b/typescript/clients/web-ag-ui/apps/web/.env.example @@ -2,6 +2,16 @@ DELEGATIONS_BYPASS=false NEXT_PUBLIC_DELEGATIONS_BYPASS=false +# Optional: enable extra agent connection debugging in the browser console. +# NEXT_PUBLIC_AGENT_CONNECT_DEBUG=false + +# Optional: which agent is selected by default. +# NEXT_PUBLIC_DEFAULT_AGENT_ID=agent-clmm + +# Optional: polling intervals (ms) for sync refresh. +# NEXT_PUBLIC_AGENT_LIST_SYNC_POLL_MS=15000 +# NEXT_PUBLIC_AGENT_DETAIL_SYNC_POLL_MS=5000 + # Optional: wallet address used when DELEGATIONS_BYPASS=true and no wallet is connected NEXT_PUBLIC_WALLET_BYPASS_ADDRESS=0x0000000000000000000000000000000000000000 @@ -9,6 +19,17 @@ NEXT_PUBLIC_WALLET_BYPASS_ADDRESS=0x0000000000000000000000000000000000000000 # This is the EIP-7702 authorization `executor` address. # NEXT_PUBLIC_EXECUTOR_ADDRESS=0x0000000000000000000000000000000000000000 +# Required for wallet connection UX (Privy). +# NEXT_PUBLIC_PRIVY_APP_ID= + # Server-side: relayer wallet that broadcasts the EIP-7702 authorization transaction. # Never expose this key publicly. # FUNDING_WALLET_PRIVATE_KEY= + +# Server-side: LangGraph agent deployments (defaults match `scripts/qa.sh`). +# LANGGRAPH_DEPLOYMENT_URL=http://localhost:8124 +# LANGGRAPH_PENDLE_DEPLOYMENT_URL=http://localhost:8125 +# LANGGRAPH_GMX_ALLORA_DEPLOYMENT_URL=http://localhost:8126 + +# Optional: LangSmith API key for tracing (used by the CopilotKit LangGraph agent clients). +# LANGSMITH_API_KEY= diff --git a/typescript/clients/web-ag-ui/apps/web/.env.test.example b/typescript/clients/web-ag-ui/apps/web/.env.test.example index e71f9686..915ef311 100644 --- a/typescript/clients/web-ag-ui/apps/web/.env.test.example +++ b/typescript/clients/web-ag-ui/apps/web/.env.test.example @@ -14,3 +14,9 @@ # Leave unset for normal CI-like behavior; set to "true" to use a real Allora API. # The Allora base URL itself is configured in `apps/agent-gmx-allora/.env.test`. WEB_E2E_USE_REAL_ALLORA=false + +# Optional: override the base URL used by the web E2E runner. +# WEB_E2E_BASE_URL=http://localhost:3000 + +# Optional: override the LangGraph base URL used by the web E2E runner when it boots local agents. +# WEB_E2E_LANGGRAPH_BASE_URL=http://localhost:8126 From 0900b0dddf6dddac196cbe6026e31b2a31f3a3e2 Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Tue, 10 Feb 2026 14:00:56 -0500 Subject: [PATCH 48/70] refactor(web-ag-ui): use ONCHAIN_ACTIONS_API_URL and optional boot --- .../apps/agent-gmx-allora/.env.example | 2 +- .../apps/agent-gmx-allora/.env.test.example | 5 +-- .../agent-gmx-allora/src/config/constants.ts | 16 ++++----- .../src/config/constants.unit.test.ts | 18 +++++----- .../src/workflow/clientFactory.ts | 4 +-- .../src/workflow/nodes/bootstrap.ts | 4 +-- .../tests/happyPath.e2e.test.ts | 16 ++++----- .../tests/setup/onchainActions.globalSetup.ts | 22 +++++++++++- .../agent-gmx-allora/tests/smoke/README.md | 2 +- .../tests/smoke/gmx-allora-smoke.ts | 6 ++-- .../web-ag-ui/apps/web/.env.test.example | 4 +++ .../web/tests/setup/system.globalSetup.ts | 36 +++++++++++++++---- typescript/clients/web-ag-ui/scripts/qa.sh | 22 +++++++----- 13 files changed, 106 insertions(+), 51 deletions(-) diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.example b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.example index a962e1c6..da511397 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.example +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.example @@ -9,7 +9,7 @@ DELEGATIONS_BYPASS=false # Onchain-actions base URL. # Accepts either a base URL (e.g. https://api.emberai.xyz) or an OpenAPI spec URL # (e.g. https://api.emberai.xyz/openapi.json); the agent normalizes to the base URL. -# ONCHAIN_ACTIONS_BASE_URL=https://api.emberai.xyz +# ONCHAIN_ACTIONS_API_URL=https://api.emberai.xyz # Allora API (agent is the only component that talks to Allora directly). # ALLORA_API_BASE_URL=https://api.allora.network diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example index 05f958db..1e965687 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example @@ -1,8 +1,9 @@ # CI-safe defaults for integration/e2e tests. # Copy this file to `.env.test` to override locally (file is gitignored). -# Local onchain-actions dev server (default is https://api.emberai.xyz) -ONCHAIN_ACTIONS_BASE_URL=http://localhost:50051 +# If set, tests use this URL and skip booting a local onchain-actions worktree. +# Leave unset to auto-boot a local worktree on http://localhost:50051. +# ONCHAIN_ACTIONS_API_URL=http://localhost:50051 # If agent/web E2E needs to boot onchain-actions + memgraph locally, point at the worktree. # Auto-discovery will look for a single `worktrees/onchain-actions-*` directory, but if you have diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts index 7a4f2a18..d7cf5eeb 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts @@ -1,6 +1,6 @@ export const ARBITRUM_CHAIN_ID = 42161; -const DEFAULT_ONCHAIN_ACTIONS_BASE_URL = 'https://api.emberai.xyz'; +const DEFAULT_ONCHAIN_ACTIONS_API_URL = 'https://api.emberai.xyz'; const DEFAULT_ALLORA_API_BASE_URL = 'https://api.allora.network'; const DEFAULT_ALLORA_CHAIN_ID = 'allora-mainnet-1'; const DEFAULT_ALLORA_INFERENCE_CACHE_TTL_MS = 30_000; @@ -16,14 +16,14 @@ type OnchainActionsBaseUrlOptions = { logger?: OnchainActionsBaseUrlLogger; }; -export function resolveOnchainActionsBaseUrl(options?: OnchainActionsBaseUrlOptions): string { - const envBaseUrl = process.env['ONCHAIN_ACTIONS_BASE_URL']; - const rawEndpoint = options?.endpoint ?? envBaseUrl ?? DEFAULT_ONCHAIN_ACTIONS_BASE_URL; +export function resolveOnchainActionsApiUrl(options?: OnchainActionsBaseUrlOptions): string { + const envUrl = process.env['ONCHAIN_ACTIONS_API_URL']; + const rawEndpoint = options?.endpoint ?? envUrl ?? DEFAULT_ONCHAIN_ACTIONS_API_URL; const source = options?.endpoint ? 'override' - : envBaseUrl - ? 'ONCHAIN_ACTIONS_BASE_URL' + : envUrl + ? 'ONCHAIN_ACTIONS_API_URL' : 'default'; const endpoint = rawEndpoint.replace(/\/$/u, ''); @@ -37,7 +37,7 @@ export function resolveOnchainActionsBaseUrl(options?: OnchainActionsBaseUrlOpti baseUrl, source, }); - } else if (baseUrl !== DEFAULT_ONCHAIN_ACTIONS_BASE_URL) { + } else if (baseUrl !== DEFAULT_ONCHAIN_ACTIONS_API_URL) { options.logger('Using custom onchain-actions base URL', { baseUrl, source }); } } @@ -45,7 +45,7 @@ export function resolveOnchainActionsBaseUrl(options?: OnchainActionsBaseUrlOpti return baseUrl; } -export const ONCHAIN_ACTIONS_BASE_URL = resolveOnchainActionsBaseUrl(); +export const ONCHAIN_ACTIONS_API_URL = resolveOnchainActionsApiUrl(); export function resolveAlloraApiBaseUrl(): string { return process.env['ALLORA_API_BASE_URL']?.replace(/\/$/u, '') ?? DEFAULT_ALLORA_API_BASE_URL; diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts index d328868c..a9f9ef7f 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts @@ -1,13 +1,13 @@ import { describe, expect, it, vi } from 'vitest'; -import { resolveGmxAlloraTxExecutionMode, resolveOnchainActionsBaseUrl } from './constants.js'; +import { resolveGmxAlloraTxExecutionMode, resolveOnchainActionsApiUrl } from './constants.js'; describe('config/constants', () => { it('normalizes the OpenAPI endpoint to a base URL and logs the change', () => { - process.env.ONCHAIN_ACTIONS_BASE_URL = 'https://api.emberai.xyz/openapi.json'; + process.env.ONCHAIN_ACTIONS_API_URL = 'https://api.emberai.xyz/openapi.json'; const logger = vi.fn(); - const baseUrl = resolveOnchainActionsBaseUrl({ logger }); + const baseUrl = resolveOnchainActionsApiUrl({ logger }); expect(baseUrl).toBe('https://api.emberai.xyz'); expect(logger).toHaveBeenCalledWith( @@ -15,32 +15,32 @@ describe('config/constants', () => { expect.objectContaining({ endpoint: 'https://api.emberai.xyz/openapi.json', baseUrl: 'https://api.emberai.xyz', - source: 'ONCHAIN_ACTIONS_BASE_URL', + source: 'ONCHAIN_ACTIONS_API_URL', }), ); }); it('returns the trimmed base URL for explicit overrides and logs the override', () => { - process.env.ONCHAIN_ACTIONS_BASE_URL = 'https://api.example.test/'; + process.env.ONCHAIN_ACTIONS_API_URL = 'https://api.example.test/'; const logger = vi.fn(); - const baseUrl = resolveOnchainActionsBaseUrl({ logger }); + const baseUrl = resolveOnchainActionsApiUrl({ logger }); expect(baseUrl).toBe('https://api.example.test'); expect(logger).toHaveBeenCalledWith( 'Using custom onchain-actions base URL', expect.objectContaining({ baseUrl: 'https://api.example.test', - source: 'ONCHAIN_ACTIONS_BASE_URL', + source: 'ONCHAIN_ACTIONS_API_URL', }), ); }); it('uses defaults without logging when no overrides are supplied', () => { - delete process.env.ONCHAIN_ACTIONS_BASE_URL; + delete process.env.ONCHAIN_ACTIONS_API_URL; const logger = vi.fn(); - const baseUrl = resolveOnchainActionsBaseUrl({ logger }); + const baseUrl = resolveOnchainActionsApiUrl({ logger }); expect(baseUrl).toBe('https://api.emberai.xyz'); expect(logger).not.toHaveBeenCalled(); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.ts index 6cc2daa0..5c67e261 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.ts @@ -2,7 +2,7 @@ import { privateKeyToAccount } from 'viem/accounts'; import { createClients, type OnchainClients } from '../clients/clients.js'; import { OnchainActionsClient } from '../clients/onchainActions.js'; -import { ONCHAIN_ACTIONS_BASE_URL } from '../config/constants.js'; +import { ONCHAIN_ACTIONS_API_URL } from '../config/constants.js'; import { normalizeHexAddress } from './context.js'; @@ -11,7 +11,7 @@ let cachedOnchainClients: OnchainClients | null = null; export function getOnchainActionsClient(): OnchainActionsClient { if (!cachedOnchainActionsClient) { - cachedOnchainActionsClient = new OnchainActionsClient(ONCHAIN_ACTIONS_BASE_URL); + cachedOnchainActionsClient = new OnchainActionsClient(ONCHAIN_ACTIONS_API_URL); } return cachedOnchainActionsClient; } diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/bootstrap.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/bootstrap.ts index 5c926acd..b8e95db4 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/bootstrap.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/bootstrap.ts @@ -3,7 +3,7 @@ import { Command } from '@langchain/langgraph'; import { resolveAlloraApiBaseUrl, - resolveOnchainActionsBaseUrl, + resolveOnchainActionsApiUrl, resolvePollIntervalMs, resolveStreamLimit, } from '../../config/constants.js'; @@ -31,7 +31,7 @@ export const bootstrapNode = async ( const pollIntervalMs = resolvePollIntervalMs(); const streamLimit = resolveStreamLimit(); const delegationsBypassActive = process.env['DELEGATIONS_BYPASS'] === 'true'; - const onchainActionsBaseUrl = resolveOnchainActionsBaseUrl({ logger: logInfo }); + const onchainActionsBaseUrl = resolveOnchainActionsApiUrl({ logger: logInfo }); logInfo('Initialized GMX Allora workflow context', { mode, diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/happyPath.e2e.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/happyPath.e2e.test.ts index f20bbe59..82f4b9df 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/happyPath.e2e.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/happyPath.e2e.test.ts @@ -8,10 +8,10 @@ import { resolveAlloraApiBaseUrl, resolveAlloraApiKey, resolveAlloraChainId, - resolveOnchainActionsBaseUrl, + resolveOnchainActionsApiUrl, } from '../src/config/constants.js'; -const requiredEnv = ['ONCHAIN_ACTIONS_BASE_URL', 'SMOKE_WALLET', 'SMOKE_USDC_ADDRESS'] as const; +const requiredEnv = ['ONCHAIN_ACTIONS_API_URL', 'SMOKE_WALLET', 'SMOKE_USDC_ADDRESS'] as const; const hasRequiredEnv = requiredEnv.every((key) => Boolean(process.env[key])); const itIf = hasRequiredEnv ? it : it.skip; @@ -27,14 +27,14 @@ const resolveEnvAddress = (key: 'SMOKE_WALLET' | 'SMOKE_USDC_ADDRESS'): `0x${str describe('GMX Allora happy path (e2e)', () => { itIf('plans a perpetual long via local onchain-actions', async () => { - const originalBaseUrl = process.env['ONCHAIN_ACTIONS_BASE_URL']; - const baseUrl = process.env['ONCHAIN_ACTIONS_BASE_URL']; + const originalBaseUrl = process.env['ONCHAIN_ACTIONS_API_URL']; + const baseUrl = process.env['ONCHAIN_ACTIONS_API_URL']; if (!baseUrl) { - throw new Error('ONCHAIN_ACTIONS_BASE_URL is required for this test.'); + throw new Error('ONCHAIN_ACTIONS_API_URL is required for this test.'); } try { - const resolved = resolveOnchainActionsBaseUrl(); + const resolved = resolveOnchainActionsApiUrl(); expect(resolved).toBe(normalizeUrl(baseUrl)); const client = new OnchainActionsClient(resolved); @@ -75,9 +75,9 @@ describe('GMX Allora happy path (e2e)', () => { ).resolves.toBeDefined(); } finally { if (originalBaseUrl === undefined) { - delete process.env['ONCHAIN_ACTIONS_BASE_URL']; + delete process.env['ONCHAIN_ACTIONS_API_URL']; } else { - process.env['ONCHAIN_ACTIONS_BASE_URL'] = originalBaseUrl; + process.env['ONCHAIN_ACTIONS_API_URL'] = originalBaseUrl; } } }); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/setup/onchainActions.globalSetup.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/setup/onchainActions.globalSetup.ts index e31df2a1..40b999eb 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/setup/onchainActions.globalSetup.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/setup/onchainActions.globalSetup.ts @@ -220,8 +220,28 @@ async function dockerCompose(args: string[]): Promise { } export default async function onchainActionsGlobalSetup(): Promise { + const configured = process.env['ONCHAIN_ACTIONS_API_URL']; + if (configured) { + // When ONCHAIN_ACTIONS_API_URL is explicitly provided, tests should use that URL + // and skip booting a local onchain-actions worktree. + const trimmed = configured.trim(); + const normalized = trimmed.endsWith('/') + ? trimmed.slice(0, -1) + : trimmed.endsWith('/openapi.json') + ? trimmed.slice(0, -'/openapi.json'.length) + : trimmed; + process.env['ONCHAIN_ACTIONS_API_URL'] = normalized; + await waitForNonEmptyMarkets( + `${normalized}/perpetuals/markets?chainIds=42161`, + 30_000, + ); + return async () => { + // no-op + }; + } + // Ensure tests target the local server started by this global setup. - process.env['ONCHAIN_ACTIONS_BASE_URL'] = `http://localhost:${ONCHAIN_ACTIONS_PORT}`; + process.env['ONCHAIN_ACTIONS_API_URL'] = `http://localhost:${ONCHAIN_ACTIONS_PORT}`; // Start Memgraph (required by onchain-actions container initialization). await dockerCompose(['-f', MEMGRAPH_COMPOSE_FILE, 'up', '-d', 'memgraph']); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/README.md b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/README.md index adcb030a..88bfc49a 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/README.md +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/README.md @@ -8,7 +8,7 @@ Manual smoke checks for Phase 2 execution planning against onchain-actions and A - `SMOKE_WALLET`: Wallet address used for listing positions. - `SMOKE_USDC_ADDRESS`: USDC token address for collateral/pay token. -- `ONCHAIN_ACTIONS_BASE_URL`: Optional override (default: `https://api.emberai.xyz`). +- `ONCHAIN_ACTIONS_API_URL`: Optional override (default: `https://api.emberai.xyz`). - `ALLORA_API_BASE_URL`: Optional override (default uses `resolveAlloraApiBaseUrl`). - `ALLORA_API_KEY`: Allora API key. diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts index a1e17ea6..6198c890 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts @@ -7,12 +7,12 @@ import { resolveAlloraApiBaseUrl, resolveAlloraApiKey, resolveAlloraChainId, - resolveOnchainActionsBaseUrl, + resolveOnchainActionsApiUrl, } from '../../src/config/constants.js'; const resolveBaseUrl = (): string => - resolveOnchainActionsBaseUrl({ - endpoint: process.env['ONCHAIN_ACTIONS_BASE_URL'], + resolveOnchainActionsApiUrl({ + endpoint: process.env['ONCHAIN_ACTIONS_API_URL'], logger: (message, metadata) => { console.info(`[smoke] ${message}`, metadata); }, diff --git a/typescript/clients/web-ag-ui/apps/web/.env.test.example b/typescript/clients/web-ag-ui/apps/web/.env.test.example index 915ef311..b43db8b4 100644 --- a/typescript/clients/web-ag-ui/apps/web/.env.test.example +++ b/typescript/clients/web-ag-ui/apps/web/.env.test.example @@ -6,6 +6,10 @@ # more than one, you must set this explicitly. # ONCHAIN_ACTIONS_WORKTREE_DIR=/absolute/path/to/forge/worktrees/onchain-actions-001 +# If set, web E2E uses this onchain-actions instance and skips booting a local worktree. +# Leave unset to auto-boot a local onchain-actions worktree + memgraph (Docker required). +# ONCHAIN_ACTIONS_API_URL=https://api.emberai.xyz + # Optional: override which docker compose file is used to boot memgraph. # Defaults to `${ONCHAIN_ACTIONS_WORKTREE_DIR}/compose.dev.db.yaml`. # ONCHAIN_ACTIONS_MEMGRAPH_COMPOSE_FILE=/absolute/path/to/compose.dev.db.yaml diff --git a/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts b/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts index 89ab4017..ed366017 100644 --- a/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts +++ b/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts @@ -380,6 +380,15 @@ async function dockerCompose(dir: string, args: string[]): Promise { await runCommandAndWait('docker', ['compose', ...args], dir); } +function normalizeOnchainActionsApiUrl(value: string): string { + const trimmed = value.trim(); + const noTrailingSlash = trimmed.endsWith('/') ? trimmed.slice(0, -1) : trimmed; + if (noTrailingSlash.endsWith('/openapi.json')) { + return noTrailingSlash.slice(0, -'/openapi.json'.length); + } + return noTrailingSlash; +} + async function startOnchainActions(): Promise<{ baseUrl: string; cleanup: Cleanup }> { const ONCHAIN_ACTIONS_DIR = resolveOnchainActionsDir(); const MEMGRAPH_COMPOSE_FILE = @@ -392,7 +401,7 @@ async function startOnchainActions(): Promise<{ baseUrl: string; cleanup: Cleanu const MARKETS_URL = `${baseUrl}/perpetuals/markets?chainIds=42161`; // Ensure tests target the local server started by this setup. - process.env['ONCHAIN_ACTIONS_BASE_URL'] = baseUrl; + process.env['ONCHAIN_ACTIONS_API_URL'] = baseUrl; await dockerCompose(ONCHAIN_ACTIONS_DIR, ['-f', MEMGRAPH_COMPOSE_FILE, 'up', '-d', 'memgraph']); await waitForTcpPort({ host: '127.0.0.1', port: 7687, timeoutMs: 30_000 }); @@ -550,10 +559,25 @@ async function startMockAlloraServer(): Promise<{ } export default async function systemGlobalSetup(): Promise { - // 1) Start onchain-actions + memgraph. - const onchain = await startOnchainActions(); + // 1) Resolve onchain-actions API URL. + // + // - If ONCHAIN_ACTIONS_API_URL is set, use it as-is and do not boot the onchain-actions worktree. + // - If it's unset, boot a local onchain-actions worktree + memgraph and set ONCHAIN_ACTIONS_API_URL. + const configuredOnchainActionsUrl = process.env['ONCHAIN_ACTIONS_API_URL']; + const shouldBootOnchainActions = !configuredOnchainActionsUrl; + + const onchain = shouldBootOnchainActions + ? await startOnchainActions() + : { baseUrl: normalizeOnchainActionsApiUrl(configuredOnchainActionsUrl!), cleanup: async () => {} }; + const onchainCleanup = onchain.cleanup; - const onchainBaseUrl = onchain.baseUrl; + const onchainApiUrl = onchain.baseUrl; + + if (!shouldBootOnchainActions) { + // Fail early with a clearer error than "markets empty" later on. + process.env['ONCHAIN_ACTIONS_API_URL'] = onchainApiUrl; + await waitForNonEmptyMarkets(`${onchainApiUrl}/perpetuals/markets?chainIds=42161`, 30_000); + } // Load agent test env to pick up Allora configuration (e.g. ALLORA_API_BASE_URL). loadAgentTestEnv(); @@ -592,7 +616,7 @@ export default async function systemGlobalSetup(): Promise { ...process.env, DELEGATIONS_BYPASS: 'true', GMX_ALLORA_MODE: 'debug', - ONCHAIN_ACTIONS_BASE_URL: onchainBaseUrl, + ONCHAIN_ACTIONS_API_URL: onchainApiUrl, ALLORA_API_BASE_URL: alloraBaseUrl, }, }); @@ -644,7 +668,7 @@ export default async function systemGlobalSetup(): Promise { console.log('[web-e2e] services ready', { webBaseUrl, langgraphBaseUrl, - onchainActionsBaseUrl: onchainBaseUrl, + onchainActionsApiUrl: onchainApiUrl, alloraMockBaseUrl: shouldUseRealAllora ? undefined : alloraBaseUrl, }); diff --git a/typescript/clients/web-ag-ui/scripts/qa.sh b/typescript/clients/web-ag-ui/scripts/qa.sh index 5a041937..a41c56cd 100755 --- a/typescript/clients/web-ag-ui/scripts/qa.sh +++ b/typescript/clients/web-ag-ui/scripts/qa.sh @@ -161,14 +161,20 @@ resolve_onchain_actions_pnpm_bin() { } ensure_onchain_actions_50051() { - export ONCHAIN_ACTIONS_BASE_URL="${ONCHAIN_ACTIONS_BASE_URL:-http://localhost:50051}" + if [ -n "${ONCHAIN_ACTIONS_API_URL:-}" ]; then + local markets_url="${ONCHAIN_ACTIONS_API_URL}/perpetuals/markets?chainIds=42161" + if curl -fs -o /dev/null "$markets_url"; then + echo "[qa] using ONCHAIN_ACTIONS_API_URL=${ONCHAIN_ACTIONS_API_URL}" + return 0 + fi + echo "[qa] ONCHAIN_ACTIONS_API_URL is set but not reachable: ${ONCHAIN_ACTIONS_API_URL}" >&2 + echo "[qa] Either start onchain-actions at that URL, or unset ONCHAIN_ACTIONS_API_URL to auto-boot a local worktree." >&2 + return 1 + fi - local markets_url="${ONCHAIN_ACTIONS_BASE_URL}/perpetuals/markets?chainIds=42161" + export ONCHAIN_ACTIONS_API_URL="http://localhost:50051" - if curl -fs -o /dev/null "$markets_url"; then - echo "[qa] onchain-actions already reachable at ${ONCHAIN_ACTIONS_BASE_URL}" - return 0 - fi + local markets_url="${ONCHAIN_ACTIONS_API_URL}/perpetuals/markets?chainIds=42161" local onchain_dir onchain_dir="$(resolve_onchain_actions_worktree_dir)" @@ -198,13 +204,13 @@ ensure_onchain_actions_50051() { ) >"$log_file" 2>&1 & if ! wait_for_http_ok "$markets_url" 120; then - echo "[qa] onchain-actions failed to become reachable at ${ONCHAIN_ACTIONS_BASE_URL} within 120s" >&2 + echo "[qa] onchain-actions failed to become reachable at ${ONCHAIN_ACTIONS_API_URL} within 120s" >&2 echo "[qa] tail of $log_file:" >&2 tail -n 40 "$log_file" >&2 || true exit 1 fi - echo "[qa] onchain-actions ready at ${ONCHAIN_ACTIONS_BASE_URL}" + echo "[qa] onchain-actions ready at ${ONCHAIN_ACTIONS_API_URL}" } ensure_mock_allora From 5692dcfabae427b225ec9b8d63a842c32764363f Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Tue, 10 Feb 2026 14:19:11 -0500 Subject: [PATCH 49/70] test(agent-gmx-allora): replace happy path e2e with smoke --- .../apps/agent-gmx-allora/.env.test.example | 2 +- .../tests/happyPath.e2e.test.ts | 84 ------------------- .../agent-gmx-allora/tests/smoke/README.md | 4 +- .../tests/smoke/gmx-allora-smoke.ts | 18 +++- 4 files changed, 20 insertions(+), 88 deletions(-) delete mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/happyPath.e2e.test.ts diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example index 1e965687..56872775 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example @@ -52,7 +52,7 @@ ALLORA_API_BASE_URL=https://api.allora.network # ARBITRUM_RPC_URL=https://arb-mainnet.g.alchemy.com/v2/demo-key # Smoke/E2E helpers. -# Used by tests/happyPath.e2e.test.ts and tests/smoke/gmx-allora-smoke.ts. +# Used by tests/smoke/gmx-allora-smoke.ts. # SMOKE_WALLET=0x0000000000000000000000000000000000000000 # SMOKE_USDC_ADDRESS=0x0000000000000000000000000000000000000000 diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/happyPath.e2e.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/happyPath.e2e.test.ts deleted file mode 100644 index 82f4b9df..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/happyPath.e2e.test.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import { getAddress } from 'viem'; - -import { fetchAlloraInference } from '../src/clients/allora.js'; -import { OnchainActionsClient } from '../src/clients/onchainActions.js'; -import { - ALLORA_TOPIC_IDS, - resolveAlloraApiBaseUrl, - resolveAlloraApiKey, - resolveAlloraChainId, - resolveOnchainActionsApiUrl, -} from '../src/config/constants.js'; - -const requiredEnv = ['ONCHAIN_ACTIONS_API_URL', 'SMOKE_WALLET', 'SMOKE_USDC_ADDRESS'] as const; -const hasRequiredEnv = requiredEnv.every((key) => Boolean(process.env[key])); -const itIf = hasRequiredEnv ? it : it.skip; - -const normalizeUrl = (value: string): string => value.replace(/\/$/u, ''); - -const resolveEnvAddress = (key: 'SMOKE_WALLET' | 'SMOKE_USDC_ADDRESS'): `0x${string}` => { - const raw = process.env[key]; - if (!raw) { - throw new Error(`${key} is required for happy path e2e.`); - } - return getAddress(raw) as `0x${string}`; -}; - -describe('GMX Allora happy path (e2e)', () => { - itIf('plans a perpetual long via local onchain-actions', async () => { - const originalBaseUrl = process.env['ONCHAIN_ACTIONS_API_URL']; - const baseUrl = process.env['ONCHAIN_ACTIONS_API_URL']; - if (!baseUrl) { - throw new Error('ONCHAIN_ACTIONS_API_URL is required for this test.'); - } - - try { - const resolved = resolveOnchainActionsApiUrl(); - expect(resolved).toBe(normalizeUrl(baseUrl)); - - const client = new OnchainActionsClient(resolved); - const markets = await client.listPerpetualMarkets({ chainIds: ['42161'] }); - expect(markets.length).toBeGreaterThan(0); - - const walletAddress = resolveEnvAddress('SMOKE_WALLET'); - const payTokenAddress = resolveEnvAddress('SMOKE_USDC_ADDRESS'); - const market = - markets.find( - (entry) => - entry.indexToken.symbol.toUpperCase() === 'BTC' && - entry.longToken.symbol.toUpperCase() === 'USDC', - ) ?? markets[0]; - - if (!market) { - throw new Error('Expected at least one perpetual market from onchain-actions.'); - } - const inference = await fetchAlloraInference({ - baseUrl: resolveAlloraApiBaseUrl(), - chainId: resolveAlloraChainId(), - topicId: ALLORA_TOPIC_IDS.BTC, - apiKey: resolveAlloraApiKey(), - }); - expect(inference.topicId).toBe(ALLORA_TOPIC_IDS.BTC); - expect(Number.isFinite(inference.combinedValue)).toBe(true); - - await expect( - client.createPerpetualLong({ - amount: '100', - walletAddress, - chainId: '42161', - marketAddress: getAddress(market.marketToken.address), - payTokenAddress, - collateralTokenAddress: payTokenAddress, - leverage: '2', - }), - ).resolves.toBeDefined(); - } finally { - if (originalBaseUrl === undefined) { - delete process.env['ONCHAIN_ACTIONS_API_URL']; - } else { - process.env['ONCHAIN_ACTIONS_API_URL'] = originalBaseUrl; - } - } - }); -}); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/README.md b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/README.md index 88bfc49a..c431ab86 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/README.md +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/README.md @@ -3,11 +3,13 @@ ## Purpose Manual smoke checks for Phase 2 execution planning against onchain-actions and Allora. +These replace the old “happy path” e2e test; they are intended to be run explicitly by a developer. ## Environment Variables - `SMOKE_WALLET`: Wallet address used for listing positions. -- `SMOKE_USDC_ADDRESS`: USDC token address for collateral/pay token. +- `SMOKE_USDC_ADDRESS`: USDC token address for collateral/pay token. Defaults to Arbitrum USDC + (`0xaf88d065e77c8cC2239327C5EDb3A432268e5831`) when unset. - `ONCHAIN_ACTIONS_API_URL`: Optional override (default: `https://api.emberai.xyz`). - `ALLORA_API_BASE_URL`: Optional override (default uses `resolveAlloraApiBaseUrl`). - `ALLORA_API_KEY`: Allora API key. diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts index 6198c890..e9347e28 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts @@ -10,6 +10,11 @@ import { resolveOnchainActionsApiUrl, } from '../../src/config/constants.js'; +const DEFAULT_SMOKE_USDC_ADDRESS = '0xaf88d065e77c8cC2239327C5EDb3A432268e5831' as const; +// 1 USDC in base units (6 decimals). Keep this small but non-trivial so onchain-actions +// can plan a realistic position increase when simulation is enabled. +const DEFAULT_LONG_AMOUNT_BASE_UNITS = 1_000_000n; + const resolveBaseUrl = (): string => resolveOnchainActionsApiUrl({ endpoint: process.env['ONCHAIN_ACTIONS_API_URL'], @@ -32,7 +37,10 @@ const resolveWalletAddress = (): `0x${string}` | undefined => { const resolveUsdcAddress = (): `0x${string}` | undefined => { const value = process.env['SMOKE_USDC_ADDRESS']; if (!value) { - return undefined; + console.info('[smoke] SMOKE_USDC_ADDRESS not set; using default Arbitrum USDC', { + address: DEFAULT_SMOKE_USDC_ADDRESS, + }); + return DEFAULT_SMOKE_USDC_ADDRESS; } if (!value.startsWith('0x')) { throw new Error(`SMOKE_USDC_ADDRESS must be a hex address, got: ${value}`); @@ -112,7 +120,7 @@ const run = async () => { 'perpetual long planning', async () => { await client.createPerpetualLong({ - amount: 100n, + amount: DEFAULT_LONG_AMOUNT_BASE_UNITS, walletAddress, chainId: '42161', marketAddress, @@ -128,6 +136,12 @@ const run = async () => { if (message.includes('No long actions found')) { return 'no long actions available (transactions-only env)'; } + if ( + message.includes('Execute order simulation failed') || + message.toLowerCase().includes('simulation failed') + ) { + return 'order simulation failed; rerun against an onchain-actions configured for planning (e.g. GMX_SKIP_SIMULATION=true) or a keeper-capable simulation environment'; + } return null; }, ); From 5aa7c04eb5e4cfafa24cfd3c61f145b61316900d Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Tue, 10 Feb 2026 18:33:02 -0500 Subject: [PATCH 50/70] fix(agent-gmx-allora): align env docs/examples with delegator/delegatee wallet flow --- .../apps/agent-gmx-allora/.env.example | 18 +++++++++++++++--- .../apps/agent-gmx-allora/.env.test.example | 17 ++++++++++++----- .../web-ag-ui/apps/agent-gmx-allora/README.md | 3 ++- .../agent-gmx-allora/tests/smoke/README.md | 8 ++++++-- 4 files changed, 35 insertions(+), 11 deletions(-) diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.example b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.example index da511397..f3357ce1 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.example +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.example @@ -6,6 +6,11 @@ # Optional: bypass delegation signing by using the agent wallet for execution DELEGATIONS_BYPASS=false +# Agent wallet (delegatee). +# Used for delegation signing context and for tx execution when broadcasting is enabled. +# If GMX_ALLORA_AGENT_WALLET_ADDRESS is not set, it will be derived from A2A_TEST_AGENT_NODE_PRIVATE_KEY. +# GMX_ALLORA_AGENT_WALLET_ADDRESS=0x0000000000000000000000000000000000000000 + # Onchain-actions base URL. # Accepts either a base URL (e.g. https://api.emberai.xyz) or an OpenAPI spec URL # (e.g. https://api.emberai.xyz/openapi.json); the agent normalizes to the base URL. @@ -14,7 +19,7 @@ DELEGATIONS_BYPASS=false # Allora API (agent is the only component that talks to Allora directly). # ALLORA_API_BASE_URL=https://api.allora.network # ALLORA_API_KEY= -# ALLORA_CHAIN_ID=allora-mainnet-1 +# ALLORA_CHAIN_ID=ethereum-11155111 # Allora inference cache TTLs (ms). Set to 0 to disable caching. # ALLORA_INFERENCE_CACHE_TTL_MS=30000 @@ -28,13 +33,20 @@ DELEGATIONS_BYPASS=false # Transaction submission mode. # - plan: build transaction plans via onchain-actions only (no broadcasting) -# - submit/execute: broadcast planned transactions (dev only; requires embedded key) +# - submit/execute: broadcast planned transactions (dev only; requires agent key) # GMX_ALLORA_TX_SUBMISSION_MODE=plan -# GMX_ALLORA_EMBEDDED_PRIVATE_KEY=0x0000000000000000000000000000000000000000000000000000000000000000 +# A2A_TEST_AGENT_NODE_PRIVATE_KEY=0x0000000000000000000000000000000000000000000000000000000000000000 # RPC used when transaction broadcasting is enabled. # ARBITRUM_RPC_URL=https://arb-mainnet.g.alchemy.com/v2/replace-with-key +# Smoke helpers (tests/smoke/gmx-allora-smoke.ts). +# SMOKE_WALLET=0x0000000000000000000000000000000000000000 +# SMOKE_USDC_ADDRESS=0xaf88d065e77c8cC2239327C5EDb3A432268e5831 +# When DELEGATIONS_BYPASS=false and GMX_ALLORA_TX_SUBMISSION_MODE=execute, smoke runs need a delegator key +# to sign delegations that the agent wallet can redeem. +# SMOKE_DELEGATOR_PRIVATE_KEY=0x0000000000000000000000000000000000000000000000000000000000000000 + # LangGraph dev server configuration. # If omitted, defaults to http://localhost:8126 and graph id "agent-gmx-allora". # LANGGRAPH_DEPLOYMENT_URL=http://localhost:8126 diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example index 56872775..15873aef 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example @@ -32,7 +32,7 @@ # Allora API (agent is the only component that talks to Allora directly). ALLORA_API_BASE_URL=https://api.allora.network # ALLORA_API_KEY= -# ALLORA_CHAIN_ID=allora-mainnet-1 +# ALLORA_CHAIN_ID=ethereum-11155111 # Allora inference cache TTLs (ms). Set to 0 to disable caching (useful in tests). # ALLORA_INFERENCE_CACHE_TTL_MS=0 @@ -44,16 +44,23 @@ ALLORA_API_BASE_URL=https://api.allora.network # GMX_ALLORA_STREAM_LIMIT=-1 # GMX_ALLORA_STATE_HISTORY_LIMIT=100 +# Agent wallet (delegatee). +# If GMX_ALLORA_AGENT_WALLET_ADDRESS is not set, it will be derived from A2A_TEST_AGENT_NODE_PRIVATE_KEY. +# GMX_ALLORA_AGENT_WALLET_ADDRESS=0x0000000000000000000000000000000000000000 + # Transaction submission mode (tests default to plan-building). -# GMX_ALLORA_TX_SUBMISSION_MODE=plan -# GMX_ALLORA_EMBEDDED_PRIVATE_KEY=0x0000000000000000000000000000000000000000000000000000000000000000 +GMX_ALLORA_TX_SUBMISSION_MODE=plan +# A2A_TEST_AGENT_NODE_PRIVATE_KEY=0x0000000000000000000000000000000000000000000000000000000000000000 # RPC used when transaction broadcasting is enabled. # ARBITRUM_RPC_URL=https://arb-mainnet.g.alchemy.com/v2/demo-key # Smoke/E2E helpers. -# Used by tests/smoke/gmx-allora-smoke.ts. -# SMOKE_WALLET=0x0000000000000000000000000000000000000000 +# Used by tests/smoke/gmx-allora-smoke.ts and apps/web/tests/gmxAllora.system.e2e.test.ts. +SMOKE_WALLET=0x0000000000000000000000000000000000000001 +# When DELEGATIONS_BYPASS=false and GMX_ALLORA_TX_SUBMISSION_MODE=execute, smoke runs need a delegator key +# to sign delegations that the agent wallet can redeem. +# SMOKE_DELEGATOR_PRIVATE_KEY=0x0000000000000000000000000000000000000000000000000000000000000000 # SMOKE_USDC_ADDRESS=0x0000000000000000000000000000000000000000 # LangGraph API runner config (optional; used by src/cronApiRunner.ts). diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md index e1c28021..6f9abd31 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md @@ -36,5 +36,6 @@ The agent always uses onchain-actions to build a `transactions[]` plan for the c - `GMX_ALLORA_TX_SUBMISSION_MODE`: transaction submission mode. Supported values: - `plan` (default): build and emit `transactions[]` but do not broadcast. - `submit`: broadcast planned transactions via an embedded wallet (no delegations). Requires an onchain-actions version that correctly plans the requested GMX action (especially close via decrease order). -- `GMX_ALLORA_EMBEDDED_PRIVATE_KEY`: required when `GMX_ALLORA_TX_SUBMISSION_MODE=submit` (0x + 64 hex chars). Only for local/dev use. +- `GMX_ALLORA_AGENT_WALLET_ADDRESS`: optional override for the agent wallet (delegatee) address. If omitted, it is derived from `A2A_TEST_AGENT_NODE_PRIVATE_KEY`. +- `A2A_TEST_AGENT_NODE_PRIVATE_KEY`: required when `GMX_ALLORA_TX_SUBMISSION_MODE=submit` (0x + 64 hex chars). Only for local/dev use. - `ARBITRUM_RPC_URL`: RPC URL for broadcasting transactions when submission is enabled. diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/README.md b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/README.md index c431ab86..84f7ade3 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/README.md +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/README.md @@ -7,15 +7,19 @@ These replace the old “happy path” e2e test; they are intended to be run exp ## Environment Variables -- `SMOKE_WALLET`: Wallet address used for listing positions. +- `SMOKE_WALLET`: Delegator wallet address used for listing positions / planning. - `SMOKE_USDC_ADDRESS`: USDC token address for collateral/pay token. Defaults to Arbitrum USDC (`0xaf88d065e77c8cC2239327C5EDb3A432268e5831`) when unset. - `ONCHAIN_ACTIONS_API_URL`: Optional override (default: `https://api.emberai.xyz`). - `ALLORA_API_BASE_URL`: Optional override (default uses `resolveAlloraApiBaseUrl`). - `ALLORA_API_KEY`: Allora API key. +- `DELEGATIONS_BYPASS`: When `true`, smoke execution uses the agent wallet directly (no delegations). +- `GMX_ALLORA_TX_SUBMISSION_MODE`: `plan` (default) or `execute` (broadcast). +- `A2A_TEST_AGENT_NODE_PRIVATE_KEY`: Required when `GMX_ALLORA_TX_SUBMISSION_MODE=execute`. +- `SMOKE_DELEGATOR_PRIVATE_KEY`: Required when `DELEGATIONS_BYPASS=false` and `GMX_ALLORA_TX_SUBMISSION_MODE=execute`. ## Run ```bash -pnpm tsx tests/smoke/gmx-allora-smoke.ts +pnpm test:smoke ``` From af9bc5be1aa7ecdbe8e9a8d1d02965a46e3b388e Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Tue, 10 Feb 2026 18:33:11 -0500 Subject: [PATCH 51/70] fix(agent-gmx-allora): standardize wallet resolution for delegation and execution --- .../agent-gmx-allora/src/config/constants.ts | 54 ++++++++++++++++++- .../apps/agent-gmx-allora/src/domain/types.ts | 7 ++- .../src/workflow/nodes/bootstrap.ts | 3 +- .../src/workflow/nodes/collectDelegations.ts | 15 +++--- .../src/workflow/nodes/pollCycle.ts | 8 ++- .../src/workflow/nodes/prepareOperator.ts | 21 +++++--- .../agent-gmx-allora/src/workflow/seedData.ts | 21 +++----- 7 files changed, 98 insertions(+), 31 deletions(-) diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts index d7cf5eeb..815f102c 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts @@ -1,11 +1,17 @@ +import { privateKeyToAccount } from 'viem/accounts'; + export const ARBITRUM_CHAIN_ID = 42161; const DEFAULT_ONCHAIN_ACTIONS_API_URL = 'https://api.emberai.xyz'; const DEFAULT_ALLORA_API_BASE_URL = 'https://api.allora.network'; -const DEFAULT_ALLORA_CHAIN_ID = 'allora-mainnet-1'; +// Allora Consumer API expects a "signature format" / target chain slug. +// Docs commonly use Sepolia: "ethereum-11155111". +// Production deployments should override via ALLORA_CHAIN_ID. +const DEFAULT_ALLORA_CHAIN_ID = 'ethereum-11155111'; const DEFAULT_ALLORA_INFERENCE_CACHE_TTL_MS = 30_000; const DEFAULT_ALLORA_8H_INFERENCE_CACHE_TTL_MS = 30_000; const DEFAULT_GMX_ALLORA_TX_EXECUTION_MODE: GmxAlloraTxExecutionMode = 'plan'; +const DEFAULT_DELEGATIONS_BYPASS = false; export type GmxAlloraTxExecutionMode = 'plan' | 'execute'; @@ -97,6 +103,52 @@ export const ALLORA_TOPIC_LABELS = { ETH: 'ETH/USD - Price Prediction - 8h', } as const; +export function resolveDelegationsBypass(): boolean { + const raw = process.env['DELEGATIONS_BYPASS']; + if (!raw) { + return DEFAULT_DELEGATIONS_BYPASS; + } + const normalized = raw.trim().toLowerCase(); + return normalized === 'true' || normalized === '1' || normalized === 'yes'; +} + +function normalizeHexAddress(value: string, label: string): `0x${string}` { + if (!value.startsWith('0x')) { + throw new Error(`Invalid ${label}: ${value}`); + } + return value.toLowerCase() as `0x${string}`; +} + +export function resolveAgentWalletAddress(): `0x${string}` { + const explicitAddress = process.env['GMX_ALLORA_AGENT_WALLET_ADDRESS']; + if (explicitAddress) { + const normalized = normalizeHexAddress(explicitAddress.trim(), 'GMX_ALLORA_AGENT_WALLET_ADDRESS'); + + const rawPrivateKey = process.env['A2A_TEST_AGENT_NODE_PRIVATE_KEY']; + if (rawPrivateKey) { + const privateKey = normalizeHexAddress(rawPrivateKey.trim(), 'A2A_TEST_AGENT_NODE_PRIVATE_KEY'); + const derived = privateKeyToAccount(privateKey).address.toLowerCase() as `0x${string}`; + if (derived !== normalized) { + throw new Error( + `GMX_ALLORA_AGENT_WALLET_ADDRESS (${normalized}) does not match A2A_TEST_AGENT_NODE_PRIVATE_KEY address (${derived}).`, + ); + } + } + + return normalized; + } + + const rawPrivateKey = process.env['A2A_TEST_AGENT_NODE_PRIVATE_KEY']; + if (!rawPrivateKey) { + throw new Error( + 'Missing agent wallet configuration. Set GMX_ALLORA_AGENT_WALLET_ADDRESS (address only) or A2A_TEST_AGENT_NODE_PRIVATE_KEY (0x + 64 hex chars).', + ); + } + const privateKey = normalizeHexAddress(rawPrivateKey.trim(), 'A2A_TEST_AGENT_NODE_PRIVATE_KEY'); + const account = privateKeyToAccount(privateKey); + return account.address.toLowerCase() as `0x${string}`; +} + export function resolveGmxAlloraTxExecutionMode(): GmxAlloraTxExecutionMode { const raw = process.env['GMX_ALLORA_TX_SUBMISSION_MODE']; if (!raw) { diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/domain/types.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/domain/types.ts index 08e8830f..7ce43833 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/domain/types.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/domain/types.ts @@ -67,7 +67,12 @@ export interface FundingTokenInput extends FundingTokenInputBase { } export type ResolvedGmxConfig = { - walletAddress: `0x${string}`; + // Delegator: wallet whose positions/balances this strategy manages. + // When delegations bypass is enabled, this is the agent wallet address. + delegatorWalletAddress: `0x${string}`; + // Delegatee: agent wallet address that would execute actions when delegations are enabled. + // When delegations bypass is enabled, this equals the delegator wallet. + delegateeWalletAddress: `0x${string}`; baseContributionUsd: number; fundingTokenAddress: `0x${string}`; targetMarket: GmxMarket; diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/bootstrap.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/bootstrap.ts index b8e95db4..aadab954 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/bootstrap.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/bootstrap.ts @@ -3,6 +3,7 @@ import { Command } from '@langchain/langgraph'; import { resolveAlloraApiBaseUrl, + resolveDelegationsBypass, resolveOnchainActionsApiUrl, resolvePollIntervalMs, resolveStreamLimit, @@ -30,7 +31,7 @@ export const bootstrapNode = async ( const mode = process.env['GMX_ALLORA_MODE'] === 'production' ? 'production' : 'debug'; const pollIntervalMs = resolvePollIntervalMs(); const streamLimit = resolveStreamLimit(); - const delegationsBypassActive = process.env['DELEGATIONS_BYPASS'] === 'true'; + const delegationsBypassActive = resolveDelegationsBypass(); const onchainActionsBaseUrl = resolveOnchainActionsApiUrl({ logger: logInfo }); logInfo('Initialized GMX Allora workflow context', { diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectDelegations.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectDelegations.ts index 1d249ab7..6745a661 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectDelegations.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectDelegations.ts @@ -1,8 +1,9 @@ import { copilotkitEmitState } from '@copilotkit/sdk-js/langgraph'; import { Command, interrupt } from '@langchain/langgraph'; +import { getDeleGatorEnvironment } from '@metamask/delegation-toolkit'; import { z } from 'zod'; -import { ARBITRUM_CHAIN_ID } from '../../config/constants.js'; +import { ARBITRUM_CHAIN_ID, resolveAgentWalletAddress } from '../../config/constants.js'; import { buildTaskStatus, logInfo, @@ -15,10 +16,8 @@ import { type SignedDelegation, } from '../context.js'; import { - AGENT_WALLET_ADDRESS, DELEGATION_DESCRIPTIONS, DELEGATION_INTENTS, - DELEGATION_MANAGER, DELEGATION_WARNINGS, buildDelegations, } from '../seedData.js'; @@ -139,17 +138,19 @@ export const collectDelegationsNode = async ( operatorInput.walletAddress, 'delegator wallet address', ); - const delegateeAddress = AGENT_WALLET_ADDRESS; + const delegateeAddress = resolveAgentWalletAddress(); + const { DelegationManager } = getDeleGatorEnvironment(ARBITRUM_CHAIN_ID); + const delegationManager = normalizeHexAddress(DelegationManager, 'delegation manager'); const request: DelegationSigningInterrupt = { type: 'gmx-delegation-signing-request', message: 'Review and approve the permissions needed to manage your GMX perps.', payloadSchema: z.toJSONSchema(DelegationSigningResponseJsonSchema), chainId: ARBITRUM_CHAIN_ID, - delegationManager: DELEGATION_MANAGER, + delegationManager, delegatorAddress, delegateeAddress, - delegationsToSign: buildDelegations(delegatorAddress), + delegationsToSign: buildDelegations({ delegatorAddress, delegateeAddress }), descriptions: [...DELEGATION_DESCRIPTIONS], warnings: [...DELEGATION_WARNINGS], }; @@ -224,7 +225,7 @@ export const collectDelegationsNode = async ( const delegationBundle: DelegationBundle = { chainId: ARBITRUM_CHAIN_ID, - delegationManager: DELEGATION_MANAGER, + delegationManager, delegatorAddress, delegateeAddress, delegations: signedDelegations, diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts index af3b901f..bca80e11 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts @@ -192,7 +192,7 @@ export const pollCycleNode = async ( const [markets, walletPositions] = await Promise.all([ onchainActionsClient.listPerpetualMarkets({ chainIds }), onchainActionsClient.listPerpetualPositions({ - walletAddress: operatorConfig.walletAddress, + walletAddress: operatorConfig.delegatorWalletAddress, chainIds, }), ]); @@ -339,7 +339,7 @@ export const pollCycleNode = async ( telemetry: exposureAdjusted, chainId: ARBITRUM_CHAIN_ID.toString(), marketAddress: gmxMarketAddress as `0x${string}`, - walletAddress: operatorConfig.walletAddress, + walletAddress: operatorConfig.delegatorWalletAddress, payTokenAddress: operatorConfig.fundingTokenAddress, collateralTokenAddress: operatorConfig.fundingTokenAddress, positionContractKey: positionForReduce?.contractKey, @@ -353,6 +353,10 @@ export const pollCycleNode = async ( clients, plan: executionPlan, txExecutionMode, + delegationsBypassActive: state.view.delegationsBypassActive === true, + delegationBundle: state.view.delegationBundle, + delegatorWalletAddress: operatorConfig.delegatorWalletAddress, + delegateeWalletAddress: operatorConfig.delegateeWalletAddress, }); const nextAssumedPositionSide = (() => { diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/prepareOperator.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/prepareOperator.ts index f3ba61a2..a4fed23e 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/prepareOperator.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/prepareOperator.ts @@ -1,6 +1,7 @@ import { copilotkitEmitState } from '@copilotkit/sdk-js/langgraph'; import { Command } from '@langchain/langgraph'; +import { resolveAgentWalletAddress } from '../../config/constants.js'; import { type ResolvedGmxConfig } from '../../domain/types.js'; import { buildTaskStatus, @@ -10,7 +11,7 @@ import { type ClmmState, type ClmmUpdate, } from '../context.js'; -import { AGENT_WALLET_ADDRESS, MARKETS } from '../seedData.js'; +import { MARKETS } from '../seedData.js'; type CopilotKitConfig = Parameters[0]; @@ -40,8 +41,6 @@ export const prepareOperatorNode = async ( }); } - const operatorWalletAddress = normalizeHexAddress(operatorInput.walletAddress, 'wallet address'); - const fundingTokenInput = state.view.fundingTokenInput; if (!fundingTokenInput) { const failureMessage = 'ERROR: Funding token input missing before strategy setup'; @@ -70,6 +69,11 @@ export const prepareOperatorNode = async ( ); const delegationsBypassActive = state.view.delegationsBypassActive === true; + const agentWalletAddress = resolveAgentWalletAddress(); + const delegatorWalletAddress = delegationsBypassActive + ? agentWalletAddress + : normalizeHexAddress(operatorInput.walletAddress, 'delegator wallet address'); + const delegatorInputWalletAddress = delegationsBypassActive ? undefined : delegatorWalletAddress; if (!delegationsBypassActive && !state.view.delegationBundle) { const failureMessage = 'ERROR: Delegation bundle missing. Complete delegation signing before continuing.'; @@ -115,8 +119,11 @@ export const prepareOperatorNode = async ( }); } + const delegateeWalletAddress = agentWalletAddress; + const operatorConfig: ResolvedGmxConfig = { - walletAddress: delegationsBypassActive ? AGENT_WALLET_ADDRESS : operatorWalletAddress, + delegatorWalletAddress, + delegateeWalletAddress, baseContributionUsd: operatorInput.usdcAllocation, fundingTokenAddress, targetMarket, @@ -124,7 +131,9 @@ export const prepareOperatorNode = async ( }; logInfo('GMX Allora strategy configuration established', { - operatorWalletAddress, + delegatorInputWalletAddress, + delegatorWalletAddress, + delegateeWalletAddress: operatorConfig.delegateeWalletAddress, usdcAllocation: operatorConfig.baseContributionUsd, fundingToken: fundingTokenAddress, market: `${targetMarket.baseSymbol}/${targetMarket.quoteSymbol}`, @@ -136,7 +145,7 @@ export const prepareOperatorNode = async ( 'working', delegationsBypassActive ? `Delegation bypass active. Preparing ${targetMarket.baseSymbol} GMX strategy from agent wallet.` - : `Delegations active. Preparing ${targetMarket.baseSymbol} GMX strategy from user wallet ${operatorWalletAddress}.`, + : `Delegations active. Preparing ${targetMarket.baseSymbol} GMX strategy from user wallet ${delegatorInputWalletAddress}.`, ); await copilotkitEmitState(config, { view: { task, activity: { events: [statusEvent], telemetry: state.view.activity.telemetry } }, diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/seedData.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/seedData.ts index 75da0fd1..312ea5e7 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/seedData.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/seedData.ts @@ -2,9 +2,6 @@ import type { AlloraPrediction, GmxMarket } from '../domain/types.js'; import type { DelegationIntentSummary, FundingTokenOption, UnsignedDelegation } from './context.js'; -export const AGENT_WALLET_ADDRESS = '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' as const; -export const DELEGATION_MANAGER = '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' as const; -export const DELEGATION_ENFORCER = '0xcccccccccccccccccccccccccccccccccccccccc' as const; const ZERO_WORD = `0x${'0'.repeat(64)}` as const; const SALT_WORD = `0x${'1'.repeat(64)}` as const; @@ -99,19 +96,17 @@ export const DELEGATION_DESCRIPTIONS = [ export const DELEGATION_WARNINGS = ['This delegation flow is for testing only.']; -export function buildDelegations(delegatorAddress: `0x${string}`): UnsignedDelegation[] { +export function buildDelegations(params: { + delegatorAddress: `0x${string}`; + delegateeAddress: `0x${string}`; +}): UnsignedDelegation[] { return [ { - delegate: AGENT_WALLET_ADDRESS, - delegator: delegatorAddress, + delegate: params.delegateeAddress, + delegator: params.delegatorAddress, authority: ZERO_WORD, - caveats: [ - { - enforcer: DELEGATION_ENFORCER, - terms: ZERO_WORD, - args: ZERO_WORD, - }, - ], + // Keep this open for now; in production we'd want to constrain scope via caveats. + caveats: [], salt: SALT_WORD, }, ]; From 62729fa920cf599e760e220815e484adf411856b Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Tue, 10 Feb 2026 18:33:20 -0500 Subject: [PATCH 52/70] fix(agent-gmx-allora): support delegated execution path without signing mismatches --- .../src/workflow/execution.ts | 99 +++++++++++++- .../src/workflow/execution.unit.test.ts | 125 ++++++++++++++++-- 2 files changed, 214 insertions(+), 10 deletions(-) diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.ts index 818f8b1d..def3c42e 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.ts @@ -1,9 +1,13 @@ +import type { Delegation } from '@metamask/delegation-toolkit'; +import { erc7710WalletActions } from '@metamask/delegation-toolkit/experimental'; +import { encodePermissionContexts } from '@metamask/delegation-toolkit/utils'; + import type { OnchainClients } from '../clients/clients.js'; import type { OnchainActionsClient, TransactionPlan } from '../clients/onchainActions.js'; import type { ExecutionPlan } from '../core/executionPlan.js'; import { executeTransaction } from '../core/transaction.js'; -import { logInfo, normalizeHexAddress } from './context.js'; +import { logInfo, normalizeHexAddress, type DelegationBundle } from './context.js'; export type ExecutionResult = { action: ExecutionPlan['action']; @@ -54,10 +58,78 @@ async function executePlannedTransaction(params: { return receipt.transactionHash; } +function resolveDelegationExecutionConfig(params: { + delegationBundle?: DelegationBundle; + delegatorWalletAddress?: `0x${string}`; + delegateeWalletAddress?: `0x${string}`; +}): { delegationManager: `0x${string}`; permissionsContext: `0x${string}` } { + const bundle = params.delegationBundle; + if (!bundle) { + throw new Error( + 'Delegations are required for embedded execution. Complete delegation signing or set DELEGATIONS_BYPASS=true.', + ); + } + + if (params.delegatorWalletAddress && bundle.delegatorAddress !== params.delegatorWalletAddress) { + throw new Error( + `Delegation bundle delegatorAddress (${bundle.delegatorAddress}) does not match operator delegator wallet (${params.delegatorWalletAddress}).`, + ); + } + if (params.delegateeWalletAddress && bundle.delegateeAddress !== params.delegateeWalletAddress) { + throw new Error( + `Delegation bundle delegateeAddress (${bundle.delegateeAddress}) does not match operator delegatee wallet (${params.delegateeWalletAddress}).`, + ); + } + + const contexts = encodePermissionContexts([bundle.delegations as unknown as Delegation[]]); + const permissionsContext = contexts[0]; + if (!permissionsContext) { + throw new Error('Delegation bundle did not produce a permissions context.'); + } + + return { + delegationManager: normalizeHexAddress(bundle.delegationManager, 'delegation manager'), + permissionsContext, + }; +} + +async function executePlannedTransactionWithDelegation(params: { + clients: OnchainClients; + tx: TransactionPlan; + delegationManager: `0x${string}`; + permissionsContext: `0x${string}`; +}): Promise<`0x${string}`> { + const to = normalizeHexAddress(params.tx.to, 'transaction target'); + const data = normalizeHexData(params.tx.data, 'transaction data'); + const value = parseTransactionValue(params.tx.value); + + logInfo('Submitting GMX planned transaction via delegations', { + to, + chainId: params.tx.chainId, + delegationManager: params.delegationManager, + value: params.tx.value, + }); + + const hash = await erc7710WalletActions()(params.clients.wallet).sendTransactionWithDelegation({ + account: params.clients.wallet.account, + chain: params.clients.wallet.chain, + to, + data, + value, + permissionsContext: params.permissionsContext, + delegationManager: params.delegationManager, + }); + + logInfo('GMX delegated transaction submitted', { transactionHash: hash }); + + return hash; +} + async function planOrExecuteTransactions(params: { txExecutionMode: 'plan' | 'execute'; clients?: OnchainClients; transactions: TransactionPlan[]; + delegation?: { delegationManager: `0x${string}`; permissionsContext: `0x${string}` }; }): Promise<{ txHashes: `0x${string}`[]; lastTxHash?: `0x${string}` }> { if (params.txExecutionMode === 'plan') { return { txHashes: [] }; @@ -71,7 +143,13 @@ async function planOrExecuteTransactions(params: { const txHashes: `0x${string}`[] = []; for (const tx of params.transactions) { - const hash = await executePlannedTransaction({ clients: params.clients, tx }); + const hash = params.delegation + ? await executePlannedTransactionWithDelegation({ + clients: params.clients, + tx, + ...params.delegation, + }) + : await executePlannedTransaction({ clients: params.clients, tx }); txHashes.push(hash); } return { txHashes, lastTxHash: txHashes.at(-1) }; @@ -85,6 +163,10 @@ export async function executePerpetualPlan(params: { plan: ExecutionPlan; txExecutionMode: 'plan' | 'execute'; clients?: OnchainClients; + delegationsBypassActive: boolean; + delegationBundle?: DelegationBundle; + delegatorWalletAddress?: `0x${string}`; + delegateeWalletAddress?: `0x${string}`; }): Promise { const { plan } = params; @@ -92,6 +174,15 @@ export async function executePerpetualPlan(params: { return { action: plan.action, ok: true, txHashes: [] }; } + const delegation = + params.txExecutionMode === 'execute' && params.delegationsBypassActive === false + ? resolveDelegationExecutionConfig({ + delegationBundle: params.delegationBundle, + delegatorWalletAddress: params.delegatorWalletAddress, + delegateeWalletAddress: params.delegateeWalletAddress, + }) + : undefined; + try { if (plan.action === 'long') { const response = await params.client.createPerpetualLong( @@ -101,6 +192,7 @@ export async function executePerpetualPlan(params: { txExecutionMode: params.txExecutionMode, clients: params.clients, transactions: response.transactions, + delegation, }); return { action: plan.action, @@ -118,6 +210,7 @@ export async function executePerpetualPlan(params: { txExecutionMode: params.txExecutionMode, clients: params.clients, transactions: response.transactions, + delegation, }); return { action: plan.action, @@ -135,6 +228,7 @@ export async function executePerpetualPlan(params: { txExecutionMode: params.txExecutionMode, clients: params.clients, transactions: response.transactions, + delegation, }); return { action: plan.action, @@ -151,6 +245,7 @@ export async function executePerpetualPlan(params: { txExecutionMode: params.txExecutionMode, clients: params.clients, transactions: response.transactions, + delegation, }); return { action: plan.action, diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.unit.test.ts index a60c63ae..f8a3b1d5 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.unit.test.ts @@ -1,18 +1,32 @@ -import { describe, expect, it, vi } from 'vitest'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import type { OnchainClients } from '../clients/clients.js'; import type { ExecutionPlan } from '../core/executionPlan.js'; +import type { DelegationBundle } from './context.js'; import { executePerpetualPlan } from './execution.js'; -const { executeTransactionMock } = vi.hoisted(() => ({ - executeTransactionMock: vi.fn(), -})); +const { executeTransactionMock, encodePermissionContextsMock, sendTransactionWithDelegationMock } = + vi.hoisted(() => ({ + executeTransactionMock: vi.fn(), + encodePermissionContextsMock: vi.fn(), + sendTransactionWithDelegationMock: vi.fn(), + })); vi.mock('../core/transaction.js', () => ({ executeTransaction: executeTransactionMock, })); +vi.mock('@metamask/delegation-toolkit/utils', () => ({ + encodePermissionContexts: encodePermissionContextsMock, +})); + +vi.mock('@metamask/delegation-toolkit/experimental', () => ({ + erc7710WalletActions: () => () => ({ + sendTransactionWithDelegation: sendTransactionWithDelegationMock, + }), +})); + const createPerpetualLong = vi.fn(() => Promise.resolve({ transactions: [ @@ -38,10 +52,21 @@ const client = { }; describe('executePerpetualPlan', () => { + beforeEach(() => { + executeTransactionMock.mockReset(); + encodePermissionContextsMock.mockReset(); + sendTransactionWithDelegationMock.mockReset(); + }); + it('skips execution when plan action is none', async () => { const plan: ExecutionPlan = { action: 'none' }; - const result = await executePerpetualPlan({ client, plan, txExecutionMode: 'plan' }); + const result = await executePerpetualPlan({ + client, + plan, + txExecutionMode: 'plan', + delegationsBypassActive: true, + }); expect(result.ok).toBe(true); expect(createPerpetualLong).not.toHaveBeenCalled(); @@ -62,7 +87,12 @@ describe('executePerpetualPlan', () => { }, }; - const result = await executePerpetualPlan({ client, plan, txExecutionMode: 'plan' }); + const result = await executePerpetualPlan({ + client, + plan, + txExecutionMode: 'plan', + delegationsBypassActive: true, + }); expect(result.ok).toBe(true); expect(createPerpetualLong).toHaveBeenCalled(); @@ -81,7 +111,12 @@ describe('executePerpetualPlan', () => { }, }; - const result = await executePerpetualPlan({ client, plan, txExecutionMode: 'plan' }); + const result = await executePerpetualPlan({ + client, + plan, + txExecutionMode: 'plan', + delegationsBypassActive: true, + }); expect(result.ok).toBe(true); expect(createPerpetualReduce).toHaveBeenCalled(); @@ -100,7 +135,12 @@ describe('executePerpetualPlan', () => { }, }; - const result = await executePerpetualPlan({ client, plan, txExecutionMode: 'plan' }); + const result = await executePerpetualPlan({ + client, + plan, + txExecutionMode: 'plan', + delegationsBypassActive: true, + }); expect(result.ok).toBe(false); expect(result.error).toContain('boom'); @@ -128,6 +168,7 @@ describe('executePerpetualPlan', () => { clients, plan, txExecutionMode: 'execute', + delegationsBypassActive: true, }); expect(result.ok).toBe(true); @@ -136,4 +177,72 @@ describe('executePerpetualPlan', () => { expect(result.txHashes).toEqual(['0xhash']); expect(result.lastTxHash).toBe('0xhash'); }); + + it('submits transactions via delegation redemption when delegations are active', async () => { + encodePermissionContextsMock.mockReturnValue(['0xperm']); + sendTransactionWithDelegationMock.mockResolvedValueOnce('0xhash2'); + const clients = { + wallet: { + account: { address: '0x00000000000000000000000000000000000000cc' }, + chain: null, + }, + } as unknown as OnchainClients; + + const delegationBundle: DelegationBundle = { + chainId: 42161, + delegationManager: '0x00000000000000000000000000000000000000aa', + delegatorAddress: '0x00000000000000000000000000000000000000bb', + delegateeAddress: '0x00000000000000000000000000000000000000cc', + delegations: [ + { + delegate: '0x00000000000000000000000000000000000000cc', + delegator: '0x00000000000000000000000000000000000000bb', + authority: `0x${'0'.repeat(64)}`, + caveats: [], + salt: `0x${'1'.repeat(64)}`, + signature: `0x${'2'.repeat(130)}`, + }, + ], + intents: [], + descriptions: [], + warnings: [], + }; + + const plan: ExecutionPlan = { + action: 'long', + request: { + amount: '100', + walletAddress: delegationBundle.delegatorAddress, + chainId: '42161', + marketAddress: '0xmarket', + payTokenAddress: '0xusdc', + collateralTokenAddress: '0xusdc', + leverage: '2', + }, + }; + + const result = await executePerpetualPlan({ + client, + clients, + plan, + txExecutionMode: 'execute', + delegationsBypassActive: false, + delegationBundle, + delegatorWalletAddress: delegationBundle.delegatorAddress, + delegateeWalletAddress: delegationBundle.delegateeAddress, + }); + + expect(result.ok).toBe(true); + expect(executeTransactionMock).not.toHaveBeenCalled(); + expect(sendTransactionWithDelegationMock).toHaveBeenCalledTimes(1); + expect(sendTransactionWithDelegationMock).toHaveBeenCalledWith( + expect.objectContaining({ + to: '0xrouter', + permissionsContext: '0xperm', + delegationManager: delegationBundle.delegationManager, + }), + ); + expect(result.txHashes).toEqual(['0xhash2']); + expect(result.lastTxHash).toBe('0xhash2'); + }); }); From 94b5da4f3ddb23e03912fe2806560c237ae744b9 Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Tue, 10 Feb 2026 18:33:26 -0500 Subject: [PATCH 53/70] fix(agent-gmx-allora): make onchain-actions client calls consistent for smoke/debug --- .../src/clients/onchainActions.ts | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.ts index b249b2b1..7ef4a5c7 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.ts @@ -102,6 +102,19 @@ const PerpetualPositionsResponseSchema = PaginationSchema.extend({ positions: z.array(PerpetualPositionSchema), }); +const WalletBalanceSchema = z.object({ + tokenUid: TokenIdentifierSchema, + amount: z.string(), + symbol: z.string().optional(), + valueUsd: z.number().optional(), + decimals: z.number().int().optional(), +}); +export type WalletBalance = z.infer; + +const WalletBalancesResponseSchema = PaginationSchema.extend({ + balances: z.array(WalletBalanceSchema), +}); + export const TransactionPlanSchema = z.object({ type: z.string(), to: z.string(), @@ -270,6 +283,28 @@ export class OnchainActionsClient { return positions; } + async listWalletBalances(params: { walletAddress: `0x${string}` }): Promise { + const endpoint = `/wallet/balances/${params.walletAddress}`; + const firstPage = await this.fetchEndpoint(endpoint, WalletBalancesResponseSchema); + const balances = [...firstPage.balances]; + const cursor = firstPage.cursor ?? undefined; + if (!cursor || firstPage.totalPages <= 1) { + return balances; + } + + for (let page = 2; page <= firstPage.totalPages; page += 1) { + const query = this.buildQuery({ + cursor, + page: page.toString(), + }); + const pageEndpoint = `/wallet/balances/${params.walletAddress}?${query.toString()}`; + const data = await this.fetchEndpoint(pageEndpoint, WalletBalancesResponseSchema); + balances.push(...data.balances); + } + + return balances; + } + private stringifyPayload(value: unknown): string { return JSON.stringify(value, (_key: string, item: unknown): unknown => typeof item === 'bigint' ? item.toString() : item, From 07b1858789044ba8c784b2d530e16c5dd8d8b9f8 Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Tue, 10 Feb 2026 18:33:37 -0500 Subject: [PATCH 54/70] fix(agent-gmx-allora): stabilize smoke preflight by using RPC balances as source of truth --- .../apps/agent-gmx-allora/package.json | 1 + .../tests/smoke/gmx-allora-smoke.ts | 381 ++++++++++++++++-- 2 files changed, 341 insertions(+), 41 deletions(-) diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/package.json b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/package.json index 4bc2b54f..07a41871 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/package.json +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/package.json @@ -13,6 +13,7 @@ "test:unit": "vitest run --config vitest.config.unit.ts", "test:int": "bash -lc 'ENV_FILE=.env.test; [ -f \"$ENV_FILE\" ] || ENV_FILE=.env.test.example; exec tsx --env-file=\"$ENV_FILE\" ./node_modules/vitest/vitest.mjs run --config vitest.config.int.ts \"$@\"' --", "test:e2e": "bash -lc 'ENV_FILE=.env.test; [ -f \"$ENV_FILE\" ] || ENV_FILE=.env.test.example; exec tsx --env-file=\"$ENV_FILE\" ./node_modules/vitest/vitest.mjs run --config vitest.config.e2e.ts --no-file-parallelism --maxConcurrency=1 \"$@\"' --", + "test:smoke": "bash -lc 'ENV_FILE=.env; [ -f \"$ENV_FILE\" ] || ENV_FILE=.env.test; [ -f \"$ENV_FILE\" ] || ENV_FILE=.env.test.example; exec tsx --env-file=\"$ENV_FILE\" tests/smoke/gmx-allora-smoke.ts'", "test:watch": "vitest watch", "test:coverage": "vitest run --config vitest.config.coverage.ts", "test:ci": "pnpm test:unit && pnpm test:int", diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts index e9347e28..0903b3aa 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts @@ -1,19 +1,36 @@ -import { getAddress } from 'viem'; +import crypto from 'node:crypto'; + +import { createPublicClient, erc20Abi, formatUnits, getAddress, http, type Address } from 'viem'; +import { getDeleGatorEnvironment, ROOT_AUTHORITY, signDelegation } from '@metamask/delegation-toolkit'; +import { privateKeyToAccount } from 'viem/accounts'; +import { arbitrum } from 'viem/chains'; import { fetchAlloraInference } from '../../src/clients/allora.js'; import { OnchainActionsClient } from '../../src/clients/onchainActions.js'; import { ALLORA_TOPIC_IDS, + ARBITRUM_CHAIN_ID, resolveAlloraApiBaseUrl, resolveAlloraApiKey, resolveAlloraChainId, + resolveDelegationsBypass, + resolveGmxAlloraTxExecutionMode, + resolveAgentWalletAddress, resolveOnchainActionsApiUrl, } from '../../src/config/constants.js'; +import type { DelegationBundle, SignedDelegation } from '../../src/workflow/context.js'; +import { executePerpetualPlan } from '../../src/workflow/execution.js'; +import { getOnchainClients } from '../../src/workflow/clientFactory.js'; +import type { ExecutionPlan } from '../../src/core/executionPlan.js'; const DEFAULT_SMOKE_USDC_ADDRESS = '0xaf88d065e77c8cC2239327C5EDb3A432268e5831' as const; // 1 USDC in base units (6 decimals). Keep this small but non-trivial so onchain-actions // can plan a realistic position increase when simulation is enabled. const DEFAULT_LONG_AMOUNT_BASE_UNITS = 1_000_000n; +const USDC_DECIMALS = 6; + +const resolveArbitrumRpcUrl = (): string => + process.env['ARBITRUM_RPC_URL'] ?? process.env['ARBITRUM_ONE_RPC_URL'] ?? 'https://arbitrum.gateway.tenderly.co'; const resolveBaseUrl = (): string => resolveOnchainActionsApiUrl({ @@ -34,6 +51,17 @@ const resolveWalletAddress = (): `0x${string}` | undefined => { return value as `0x${string}`; }; +function resolveDelegatorPrivateKey(): `0x${string}` | undefined { + const value = process.env['SMOKE_DELEGATOR_PRIVATE_KEY']; + if (!value) { + return undefined; + } + if (!value.startsWith('0x')) { + throw new Error(`SMOKE_DELEGATOR_PRIVATE_KEY must be a hex string, got: ${value}`); + } + return value as `0x${string}`; +} + const resolveUsdcAddress = (): `0x${string}` | undefined => { const value = process.env['SMOKE_USDC_ADDRESS']; if (!value) { @@ -49,12 +77,29 @@ const resolveUsdcAddress = (): `0x${string}` | undefined => { }; const baseUrl = resolveBaseUrl(); -const walletAddress = resolveWalletAddress(); +const delegationsBypassActive = resolveDelegationsBypass(); +const txExecutionMode = resolveGmxAlloraTxExecutionMode(); +const agentWalletAddress = + delegationsBypassActive || txExecutionMode === 'execute' ? resolveAgentWalletAddress() : undefined; +const delegatorPrivateKey = resolveDelegatorPrivateKey(); +const walletAddress = + resolveWalletAddress() ?? + (delegationsBypassActive ? agentWalletAddress : undefined) ?? + (delegatorPrivateKey ? (privateKeyToAccount(delegatorPrivateKey).address as `0x${string}`) : undefined); const usdcAddress = resolveUsdcAddress(); const client = new OnchainActionsClient(baseUrl); +const arbitrumClient = createPublicClient({ + chain: arbitrum, + transport: http(resolveArbitrumRpcUrl(), { retryCount: 0 }), +}); const run = async () => { console.log('[smoke] Using onchain-actions base URL:', baseUrl); + console.log('[smoke] Delegations bypass active:', delegationsBypassActive); + console.log('[smoke] TX submission mode:', txExecutionMode); + if (agentWalletAddress) { + console.log('[smoke] Agent wallet address:', agentWalletAddress); + } const markets = await client.listPerpetualMarkets({ chainIds: ['42161'] }); if (markets.length === 0) { @@ -62,13 +107,176 @@ const run = async () => { } console.log(`[smoke] Perpetual markets: ${markets.length}`); - if (!walletAddress || !usdcAddress) { - throw new Error('SMOKE_WALLET and SMOKE_USDC_ADDRESS are required for GMX planning checks.'); + if (!walletAddress) { + throw new Error( + 'Missing delegator wallet configuration. Set SMOKE_WALLET, or set SMOKE_DELEGATOR_PRIVATE_KEY, or set DELEGATIONS_BYPASS=true with GMX_ALLORA_AGENT_WALLET_ADDRESS/A2A_TEST_AGENT_NODE_PRIVATE_KEY.', + ); } const positions = await client.listPerpetualPositions({ walletAddress, chainIds: ['42161'] }); console.log(`[smoke] Positions for ${walletAddress}: ${positions.length}`); + // Preflight balances: simulation requires collateral + gas. + if (!usdcAddress) { + throw new Error('SMOKE_USDC_ADDRESS resolved to empty value.'); + } + + const fetchBalancesViaRpc = async (address: `0x${string}`) => { + const [eth, usdc] = await Promise.all([ + arbitrumClient.getBalance({ address: address as Address }), + arbitrumClient.readContract({ + address: usdcAddress as Address, + abi: erc20Abi, + functionName: 'balanceOf', + args: [address as Address], + }), + ]); + return { eth, usdc }; + }; + + // These RPC reads are the source of truth for preflight (onchain-actions' wallet balances endpoint + // can depend on third party APIs like Dune and may return empty results in local/dev). + const delegatorRpcBalances = await fetchBalancesViaRpc(walletAddress); + const agentRpcBalances = + agentWalletAddress && agentWalletAddress.toLowerCase() !== walletAddress.toLowerCase() + ? await fetchBalancesViaRpc(agentWalletAddress) + : undefined; + + // Best-effort: still call onchain-actions balances for debugging (not gating). + const onchainActionsDelegatorBalances = await client.listWalletBalances({ walletAddress }); + const onchainActionsAgentBalances = + agentWalletAddress && agentWalletAddress.toLowerCase() !== walletAddress.toLowerCase() + ? await client.listWalletBalances({ walletAddress: agentWalletAddress }) + : undefined; + + const findOnchainActionsBalance = ( + balances: typeof onchainActionsDelegatorBalances, + params: { chainId: string; address: `0x${string}` }, + ) => + balances.find( + (balance) => + balance.tokenUid.chainId === params.chainId && + balance.tokenUid.address.toLowerCase() === params.address.toLowerCase(), + ); + + const delegatorEthBalance = findOnchainActionsBalance(onchainActionsDelegatorBalances, { + chainId: '42161', + address: '0x0000000000000000000000000000000000000000', + }); + const delegatorUsdcBalance = findOnchainActionsBalance(onchainActionsDelegatorBalances, { + chainId: '42161', + address: usdcAddress, + }); + const agentEthBalance = onchainActionsAgentBalances + ? findOnchainActionsBalance(onchainActionsAgentBalances, { + chainId: '42161', + address: '0x0000000000000000000000000000000000000000', + }) + : undefined; + + const delegatorUsdcAmountBaseUnits = delegatorRpcBalances.usdc; + + console.log('[smoke] Wallet balances (chainId=42161)', { + rpc: { + delegator: { + address: walletAddress, + eth: { + amount: delegatorRpcBalances.eth.toString(), + decimals: 18, + formatted: formatUnits(delegatorRpcBalances.eth, 18), + }, + usdc: { + address: usdcAddress, + amount: delegatorRpcBalances.usdc.toString(), + decimals: USDC_DECIMALS, + formatted: formatUnits(delegatorRpcBalances.usdc, USDC_DECIMALS), + }, + }, + agent: agentWalletAddress + ? { + address: agentWalletAddress, + eth: agentRpcBalances + ? { + amount: agentRpcBalances.eth.toString(), + decimals: 18, + formatted: formatUnits(agentRpcBalances.eth, 18), + } + : undefined, + } + : null, + }, + onchainActions: { + delegator: { + address: walletAddress, + eth: delegatorEthBalance + ? { + amount: delegatorEthBalance.amount, + decimals: delegatorEthBalance.decimals, + formatted: + delegatorEthBalance.decimals === undefined + ? undefined + : formatUnits(BigInt(delegatorEthBalance.amount), delegatorEthBalance.decimals), + } + : null, + usdc: delegatorUsdcBalance + ? { + address: usdcAddress, + amount: delegatorUsdcBalance.amount, + formatted: + delegatorUsdcBalance.decimals === undefined + ? undefined + : formatUnits(BigInt(delegatorUsdcBalance.amount), delegatorUsdcBalance.decimals), + } + : { address: usdcAddress, amount: '0' }, + }, + agent: agentWalletAddress + ? { + address: agentWalletAddress, + eth: agentEthBalance + ? { + amount: agentEthBalance.amount, + decimals: agentEthBalance.decimals, + formatted: + agentEthBalance.decimals === undefined + ? undefined + : formatUnits(BigInt(agentEthBalance.amount), agentEthBalance.decimals), + } + : null, + } + : null, + }, + }); + + if (delegatorUsdcAmountBaseUnits < DEFAULT_LONG_AMOUNT_BASE_UNITS) { + throw new Error( + [ + 'GMX long planning failed preflight: wallet has insufficient Arbitrum USDC for simulation.', + `walletAddress=${walletAddress}`, + `usdcAddress=${usdcAddress}`, + `required>=${formatUnits(DEFAULT_LONG_AMOUNT_BASE_UNITS, USDC_DECIMALS)} USDC`, + `found=${formatUnits(delegatorUsdcAmountBaseUnits, USDC_DECIMALS)} USDC`, + 'Fund this wallet with USDC on Arbitrum (chainId=42161) or lower the smoke amount.', + ].join(' '), + ); + } + + if (txExecutionMode === 'execute' && delegationsBypassActive === false) { + if (!agentWalletAddress) { + throw new Error('Agent wallet address is required when executing with DELEGATIONS_BYPASS=false.'); + } + const agentEthAmount = agentEthBalance ? BigInt(agentEthBalance.amount) : 0n; + if (agentEthAmount === 0n) { + throw new Error( + [ + 'GMX execute preflight failed: agent/delegatee wallet needs ETH on Arbitrum to pay gas for delegated execution.', + `agentWalletAddress=${agentWalletAddress}`, + ].join(' '), + ); + } + } + + console.log('[smoke] Preflight checks passed.'); + const btcMarket = markets.find( (market) => @@ -90,12 +298,12 @@ const run = async () => { console.log('[smoke] Allora inference fetched', { topicId: inference.topicId }); const failures: string[] = []; - const warnings: string[] = []; + const skips: string[] = []; const runStep = async ( label: string, fn: () => Promise, - tolerateWhen?: (message: string) => string | null, + skipWhen?: (message: string) => string | null, ) => { try { await Promise.race([ @@ -105,10 +313,10 @@ const run = async () => { console.log(`[smoke] ${label}: ok`); } catch (error: unknown) { const message = error instanceof Error ? error.message : String(error); - const tolerateReason = tolerateWhen ? tolerateWhen(message) : null; - if (tolerateReason) { - warnings.push(`${label}: ${tolerateReason}`); - console.warn(`[smoke] ${label}: warning -> ${tolerateReason}`); + const skipReason = skipWhen ? skipWhen(message) : null; + if (skipReason) { + skips.push(`${label}: ${skipReason}`); + console.warn(`[smoke] ${label}: skipped -> ${skipReason}`); return; } failures.push(`${label}: ${message}`); @@ -116,45 +324,136 @@ const run = async () => { } }; + const buildDelegationBundle = async (): Promise => { + if (delegationsBypassActive) { + throw new Error('Delegation bundle requested while DELEGATIONS_BYPASS=true.'); + } + if (!agentWalletAddress) { + throw new Error('Agent wallet address is required to build a delegation bundle.'); + } + if (!delegatorPrivateKey) { + throw new Error( + 'SMOKE_DELEGATOR_PRIVATE_KEY is required when DELEGATIONS_BYPASS=false and broadcasting is enabled.', + ); + } + const derivedDelegator = privateKeyToAccount(delegatorPrivateKey).address.toLowerCase() as `0x${string}`; + if (derivedDelegator !== walletAddress.toLowerCase()) { + throw new Error( + `Delegator private key address (${derivedDelegator}) does not match SMOKE_WALLET (${walletAddress}).`, + ); + } + + const { DelegationManager } = getDeleGatorEnvironment(ARBITRUM_CHAIN_ID); + const salt = (`0x${crypto.randomBytes(32).toString('hex')}` as const) satisfies `0x${string}`; + + const unsigned = { + delegate: agentWalletAddress, + delegator: walletAddress, + authority: ROOT_AUTHORITY, + caveats: [], + salt, + } satisfies Omit; + + // Smoke uses an unrestricted delegation so the agent wallet can redeem onchain-actions plans. + const signature = await signDelegation({ + privateKey: delegatorPrivateKey, + delegation: unsigned, + delegationManager: DelegationManager, + chainId: ARBITRUM_CHAIN_ID, + allowInsecureUnrestrictedDelegation: true, + }); + + const signed: SignedDelegation = { ...unsigned, signature }; + + return { + chainId: ARBITRUM_CHAIN_ID, + delegationManager: DelegationManager, + delegatorAddress: walletAddress, + delegateeAddress: agentWalletAddress, + delegations: [signed], + intents: [], + descriptions: [], + warnings: [], + }; + }; + + const clients = txExecutionMode === 'execute' ? getOnchainClients() : undefined; + const delegationBundle = + txExecutionMode === 'execute' && delegationsBypassActive === false + ? await buildDelegationBundle() + : undefined; + + if (txExecutionMode === 'execute' && delegationsBypassActive) { + if (!agentWalletAddress) { + throw new Error('Agent wallet address is required for bypass execution mode.'); + } + if (walletAddress.toLowerCase() !== agentWalletAddress.toLowerCase()) { + throw new Error( + `SMOKE_WALLET (${walletAddress}) must equal agent wallet (${agentWalletAddress}) when DELEGATIONS_BYPASS=true and broadcasting is enabled.`, + ); + } + } + await runStep( - 'perpetual long planning', + txExecutionMode === 'execute' ? 'perpetual long execute' : 'perpetual long planning', async () => { - await client.createPerpetualLong({ - amount: DEFAULT_LONG_AMOUNT_BASE_UNITS, - walletAddress, - chainId: '42161', - marketAddress, - payTokenAddress, - collateralTokenAddress: payTokenAddress, - leverage: '2', + const plan: ExecutionPlan = { + action: 'long', + request: { + amount: DEFAULT_LONG_AMOUNT_BASE_UNITS.toString(), + walletAddress, + chainId: ARBITRUM_CHAIN_ID.toString(), + marketAddress, + payTokenAddress, + collateralTokenAddress: payTokenAddress, + leverage: '2', + }, + }; + + const result = await executePerpetualPlan({ + client, + clients, + plan, + txExecutionMode, + delegationsBypassActive, + delegationBundle, + delegatorWalletAddress: walletAddress, + delegateeWalletAddress: agentWalletAddress, }); - }, - (message) => { - if (message.includes('Expected bigint')) { - return 'API expects bigint amount type (upstream mismatch)'; - } - if (message.includes('No long actions found')) { - return 'no long actions available (transactions-only env)'; - } - if ( - message.includes('Execute order simulation failed') || - message.toLowerCase().includes('simulation failed') - ) { - return 'order simulation failed; rerun against an onchain-actions configured for planning (e.g. GMX_SKIP_SIMULATION=true) or a keeper-capable simulation environment'; + + if (!result.ok) { + throw new Error(result.error ?? 'unknown execution error'); } - return null; }, ); await runStep( - 'perpetual close planning', + txExecutionMode === 'execute' ? 'perpetual close execute' : 'perpetual close planning', async () => { - await client.createPerpetualClose({ - walletAddress, - marketAddress, - positionSide: 'long', - isLimit: false, + const plan: ExecutionPlan = { + action: 'close', + request: { + walletAddress, + marketAddress, + positionSide: 'long', + isLimit: false, + }, + }; + + const result = await executePerpetualPlan({ + client, + clients, + plan, + txExecutionMode, + delegationsBypassActive, + delegationBundle, + delegatorWalletAddress: walletAddress, + delegateeWalletAddress: agentWalletAddress, }); + + if (!result.ok) { + throw new Error(result.error ?? 'unknown execution error'); + } }, (message) => { if (message.includes('No position or order found')) { @@ -168,8 +467,8 @@ const run = async () => { throw new Error(`Smoke checks failed:\n- ${failures.join('\n- ')}`); } - if (warnings.length > 0) { - console.warn(`[smoke] Warnings:\n- ${warnings.join('\n- ')}`); + if (skips.length > 0) { + console.warn(`[smoke] Skipped checks:\n- ${skips.join('\n- ')}`); } console.log('[smoke] OK'); From f4a3db7c6ac603c9ba0d0971b8534f500d9d6775 Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Tue, 10 Feb 2026 18:33:45 -0500 Subject: [PATCH 55/70] fix(agent-gmx-allora): update tests to match wallet/env semantics --- .../src/config/constants.unit.test.ts | 56 ++++++++++++++++++- .../src/workflow/clientFactory.ts | 4 +- .../src/workflow/clientFactory.unit.test.ts | 8 +-- .../tests/onboarding.int.test.ts | 10 +++- .../tests/pollCycle.int.test.ts | 9 +-- 5 files changed, 75 insertions(+), 12 deletions(-) diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts index a9f9ef7f..4aa365ce 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts @@ -1,6 +1,11 @@ import { describe, expect, it, vi } from 'vitest'; -import { resolveGmxAlloraTxExecutionMode, resolveOnchainActionsApiUrl } from './constants.js'; +import { + resolveAgentWalletAddress, + resolveDelegationsBypass, + resolveGmxAlloraTxExecutionMode, + resolveOnchainActionsApiUrl, +} from './constants.js'; describe('config/constants', () => { it('normalizes the OpenAPI endpoint to a base URL and logs the change', () => { @@ -63,4 +68,53 @@ describe('config/constants', () => { expect(resolveGmxAlloraTxExecutionMode()).toBe('plan'); }); + + it('parses delegations bypass flag', () => { + delete process.env.DELEGATIONS_BYPASS; + expect(resolveDelegationsBypass()).toBe(false); + + process.env.DELEGATIONS_BYPASS = 'true'; + expect(resolveDelegationsBypass()).toBe(true); + + process.env.DELEGATIONS_BYPASS = 'TRUE'; + expect(resolveDelegationsBypass()).toBe(true); + + process.env.DELEGATIONS_BYPASS = '1'; + expect(resolveDelegationsBypass()).toBe(true); + + process.env.DELEGATIONS_BYPASS = 'yes'; + expect(resolveDelegationsBypass()).toBe(true); + + process.env.DELEGATIONS_BYPASS = 'false'; + expect(resolveDelegationsBypass()).toBe(false); + }); + + it('resolves agent wallet address from explicit address env var', () => { + process.env.GMX_ALLORA_AGENT_WALLET_ADDRESS = '0xAbCd000000000000000000000000000000000000'; + delete process.env.A2A_TEST_AGENT_NODE_PRIVATE_KEY; + + expect(resolveAgentWalletAddress()).toBe('0xabcd000000000000000000000000000000000000'); + }); + + it('throws when explicit agent wallet address does not match private key', () => { + process.env.GMX_ALLORA_AGENT_WALLET_ADDRESS = '0x0000000000000000000000000000000000000001'; + process.env.A2A_TEST_AGENT_NODE_PRIVATE_KEY = `0x${'1'.repeat(64)}`; + + expect(() => resolveAgentWalletAddress()).toThrow(/does not match A2A_TEST_AGENT_NODE_PRIVATE_KEY/u); + }); + + it('resolves agent wallet address from private key when address is not provided', () => { + delete process.env.GMX_ALLORA_AGENT_WALLET_ADDRESS; + process.env.A2A_TEST_AGENT_NODE_PRIVATE_KEY = `0x${'1'.repeat(64)}`; + + const resolved = resolveAgentWalletAddress(); + expect(resolved).toMatch(/^0x[0-9a-f]{40}$/u); + }); + + it('throws when no agent wallet configuration is available', () => { + delete process.env.GMX_ALLORA_AGENT_WALLET_ADDRESS; + delete process.env.A2A_TEST_AGENT_NODE_PRIVATE_KEY; + + expect(() => resolveAgentWalletAddress()).toThrow(/Missing agent wallet configuration/u); + }); }); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.ts index 5c67e261..f5cb27ff 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.ts @@ -18,9 +18,9 @@ export function getOnchainActionsClient(): OnchainActionsClient { export function getOnchainClients(): OnchainClients { if (!cachedOnchainClients) { - const rawPrivateKey = process.env['GMX_ALLORA_EMBEDDED_PRIVATE_KEY']; + const rawPrivateKey = process.env['A2A_TEST_AGENT_NODE_PRIVATE_KEY']; if (!rawPrivateKey) { - throw new Error('GMX_ALLORA_EMBEDDED_PRIVATE_KEY environment variable is required'); + throw new Error('A2A_TEST_AGENT_NODE_PRIVATE_KEY environment variable is required'); } const privateKey = normalizeHexAddress(rawPrivateKey, 'embedded private key'); const account = privateKeyToAccount(privateKey); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.unit.test.ts index 6cbd9f7a..449323c2 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/clientFactory.unit.test.ts @@ -26,7 +26,7 @@ describe('clientFactory', () => { onchainActionsCtorMock.mockReset(); createClientsMock.mockReset(); privateKeyToAccountMock.mockReset(); - delete process.env.GMX_ALLORA_EMBEDDED_PRIVATE_KEY; + delete process.env.A2A_TEST_AGENT_NODE_PRIVATE_KEY; }); it('creates and caches the onchain actions client', () => { @@ -39,7 +39,7 @@ describe('clientFactory', () => { }); it('creates and caches the onchain clients from the embedded private key', () => { - process.env.GMX_ALLORA_EMBEDDED_PRIVATE_KEY = + process.env.A2A_TEST_AGENT_NODE_PRIVATE_KEY = '0x0000000000000000000000000000000000000000000000000000000000000001'; privateKeyToAccountMock.mockReturnValue({ address: '0xabc' }); @@ -54,8 +54,8 @@ describe('clientFactory', () => { }); it('throws when embedded private key is missing', () => { - delete process.env.GMX_ALLORA_EMBEDDED_PRIVATE_KEY; + delete process.env.A2A_TEST_AGENT_NODE_PRIVATE_KEY; - expect(() => getOnchainClients()).toThrow(/GMX_ALLORA_EMBEDDED_PRIVATE_KEY/); + expect(() => getOnchainClients()).toThrow(/A2A_TEST_AGENT_NODE_PRIVATE_KEY/); }); }); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/onboarding.int.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/onboarding.int.test.ts index 11a4f71a..87846031 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/onboarding.int.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/onboarding.int.test.ts @@ -1,4 +1,4 @@ -import { afterEach, describe, expect, it, vi } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import type { ClmmState } from '../src/workflow/context.js'; import { collectDelegationsNode } from '../src/workflow/nodes/collectDelegations.js'; @@ -107,6 +107,14 @@ afterEach(() => { }); describe('GMX Allora onboarding (integration)', () => { + beforeEach(() => { + process.env.GMX_ALLORA_AGENT_WALLET_ADDRESS = '0x0000000000000000000000000000000000000002'; + }); + + afterEach(() => { + delete process.env.GMX_ALLORA_AGENT_WALLET_ADDRESS; + }); + it('collects USDC allocation and prepares operator config', async () => { const state = buildBaseState(); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts index 7c9a3eb6..dbdf0d80 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts @@ -79,11 +79,12 @@ function buildBaseState(): ClmmState { baseSymbol: 'BTC', quoteSymbol: 'USDC', token0: { symbol: 'BTC' }, - token1: { symbol: 'USDC' }, - maxLeverage: 2, - }, + token1: { symbol: 'USDC' }, + maxLeverage: 2, + }, operatorConfig: { - walletAddress: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', + delegatorWalletAddress: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', + delegateeWalletAddress: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', baseContributionUsd: 200, fundingTokenAddress: '0x1111111111111111111111111111111111111111', targetMarket: { From 478de8db93c3bbe9c9ef1356cee7771299643516 Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Tue, 10 Feb 2026 18:33:51 -0500 Subject: [PATCH 56/70] fix(web): remove hardcoded GMX smoke wallet from UI e2e wrapper --- .../apps/web/tests/gmxAllora.system.e2e.test.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/typescript/clients/web-ag-ui/apps/web/tests/gmxAllora.system.e2e.test.ts b/typescript/clients/web-ag-ui/apps/web/tests/gmxAllora.system.e2e.test.ts index cb0e77c6..50b4ff7c 100644 --- a/typescript/clients/web-ag-ui/apps/web/tests/gmxAllora.system.e2e.test.ts +++ b/typescript/clients/web-ag-ui/apps/web/tests/gmxAllora.system.e2e.test.ts @@ -10,6 +10,14 @@ function requireEnv(name: string): string { return value; } +function requireHexAddressEnv(name: string): `0x${string}` { + const value = requireEnv(name); + if (!value.startsWith('0x')) { + throw new Error(`Env var ${name} must be a hex address, got: ${value}`); + } + return value as `0x${string}`; +} + async function postJson(url: string, body: unknown): Promise<{ status: number; json: T }> { const res = await fetch(url, { method: 'POST', @@ -185,8 +193,10 @@ describe('GMX Allora full system (web + agent runtime + onchain-actions)', () => maxLeverage: 2, }; + const agentWalletAddress = requireHexAddressEnv('SMOKE_WALLET'); const operatorConfig = { - walletAddress: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', + delegatorWalletAddress: agentWalletAddress, + delegateeWalletAddress: agentWalletAddress, baseContributionUsd: 250, fundingTokenAddress: '0x1111111111111111111111111111111111111111', targetMarket: selectedPool, From 5401d9d312198f9d61912c3a742f8e01ca01709f Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Tue, 10 Feb 2026 21:54:53 -0500 Subject: [PATCH 57/70] fix(rpc): replace demo-key fallback and support ARBITRUM_ONE_RPC_URL --- .../clients/web-ag-ui/apps/agent-clmm/.env.test.example | 2 +- .../web-ag-ui/apps/agent-clmm/src/clients/clients.ts | 6 +++++- .../apps/agent-clmm/src/core/delegatedExecution.ts | 5 ++++- .../clients/web-ag-ui/apps/agent-gmx-allora/.env.example | 2 +- .../web-ag-ui/apps/agent-gmx-allora/.env.test.example | 2 +- .../web-ag-ui/apps/agent-gmx-allora/src/clients/clients.ts | 7 +++++-- .../web-ag-ui/apps/agent-pendle/src/clients/clients.ts | 6 +++++- 7 files changed, 22 insertions(+), 8 deletions(-) diff --git a/typescript/clients/web-ag-ui/apps/agent-clmm/.env.test.example b/typescript/clients/web-ag-ui/apps/agent-clmm/.env.test.example index beff9332..d9a09b79 100644 --- a/typescript/clients/web-ag-ui/apps/agent-clmm/.env.test.example +++ b/typescript/clients/web-ag-ui/apps/agent-clmm/.env.test.example @@ -14,4 +14,4 @@ CLMM_E2E_PRIVATE_KEY=replace-with-private-key # Optional: increase live test timeout (milliseconds). # EMBER_E2E_TIMEOUT_MS=180000 # Optional: provide a real Arbitrum RPC endpoint for live txs. -# ARBITRUM_RPC_URL=https://arb-mainnet.g.alchemy.com/v2/replace-with-key +# ARBITRUM_RPC_URL=https://arb1.arbitrum.io/rpc diff --git a/typescript/clients/web-ag-ui/apps/agent-clmm/src/clients/clients.ts b/typescript/clients/web-ag-ui/apps/agent-clmm/src/clients/clients.ts index f745be7e..e374f227 100644 --- a/typescript/clients/web-ag-ui/apps/agent-clmm/src/clients/clients.ts +++ b/typescript/clients/web-ag-ui/apps/agent-clmm/src/clients/clients.ts @@ -1,8 +1,12 @@ import { createPublicClient, createWalletClient, http, type Account } from 'viem'; import { arbitrum } from 'viem/chains'; +const DEFAULT_ARBITRUM_RPC_URL = 'https://arb1.arbitrum.io/rpc'; + const ARBITRUM_RPC_URL = - process.env['ARBITRUM_RPC_URL'] ?? 'https://arb-mainnet.g.alchemy.com/v2/demo-key'; + process.env['ARBITRUM_RPC_URL'] ?? + process.env['ARBITRUM_ONE_RPC_URL'] ?? + DEFAULT_ARBITRUM_RPC_URL; const RPC_RETRY_COUNT = 2; const RPC_TIMEOUT_MS = 8000; diff --git a/typescript/clients/web-ag-ui/apps/agent-clmm/src/core/delegatedExecution.ts b/typescript/clients/web-ag-ui/apps/agent-clmm/src/core/delegatedExecution.ts index 9a9c2ad7..29f30d93 100644 --- a/typescript/clients/web-ag-ui/apps/agent-clmm/src/core/delegatedExecution.ts +++ b/typescript/clients/web-ag-ui/apps/agent-clmm/src/core/delegatedExecution.ts @@ -149,10 +149,13 @@ export async function redeemDelegationsAndExecuteTransactions(params: { } const rpcUrl = (params.clients.public as unknown as { transport?: { url?: unknown } }).transport?.url; + const defaultArbitrumRpcUrl = 'https://arb1.arbitrum.io/rpc'; const resolvedRpcUrl = typeof rpcUrl === 'string' ? rpcUrl - : process.env['ARBITRUM_RPC_URL'] ?? 'https://arb-mainnet.g.alchemy.com/v2/demo-key'; + : process.env['ARBITRUM_RPC_URL'] ?? + process.env['ARBITRUM_ONE_RPC_URL'] ?? + defaultArbitrumRpcUrl; const simulationClient = createClient({ account: params.clients.wallet.account, diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.example b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.example index f3357ce1..8189f4f2 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.example +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.example @@ -38,7 +38,7 @@ DELEGATIONS_BYPASS=false # A2A_TEST_AGENT_NODE_PRIVATE_KEY=0x0000000000000000000000000000000000000000000000000000000000000000 # RPC used when transaction broadcasting is enabled. -# ARBITRUM_RPC_URL=https://arb-mainnet.g.alchemy.com/v2/replace-with-key +# ARBITRUM_RPC_URL=https://arb1.arbitrum.io/rpc # Smoke helpers (tests/smoke/gmx-allora-smoke.ts). # SMOKE_WALLET=0x0000000000000000000000000000000000000000 diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example index 15873aef..6b4a148b 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example @@ -53,7 +53,7 @@ GMX_ALLORA_TX_SUBMISSION_MODE=plan # A2A_TEST_AGENT_NODE_PRIVATE_KEY=0x0000000000000000000000000000000000000000000000000000000000000000 # RPC used when transaction broadcasting is enabled. -# ARBITRUM_RPC_URL=https://arb-mainnet.g.alchemy.com/v2/demo-key +# ARBITRUM_RPC_URL=https://arb1.arbitrum.io/rpc # Smoke/E2E helpers. # Used by tests/smoke/gmx-allora-smoke.ts and apps/web/tests/gmxAllora.system.e2e.test.ts. diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/clients.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/clients.ts index 9db6325e..e374f227 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/clients.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/clients.ts @@ -1,8 +1,12 @@ import { createPublicClient, createWalletClient, http, type Account } from 'viem'; import { arbitrum } from 'viem/chains'; +const DEFAULT_ARBITRUM_RPC_URL = 'https://arb1.arbitrum.io/rpc'; + const ARBITRUM_RPC_URL = - process.env['ARBITRUM_RPC_URL'] ?? 'https://arb-mainnet.g.alchemy.com/v2/demo-key'; + process.env['ARBITRUM_RPC_URL'] ?? + process.env['ARBITRUM_ONE_RPC_URL'] ?? + DEFAULT_ARBITRUM_RPC_URL; const RPC_RETRY_COUNT = 2; const RPC_TIMEOUT_MS = 8000; @@ -45,4 +49,3 @@ export function createClients(account: Account): OnchainClients { wallet: walletClient, }; } - diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/src/clients/clients.ts b/typescript/clients/web-ag-ui/apps/agent-pendle/src/clients/clients.ts index f745be7e..e374f227 100644 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/src/clients/clients.ts +++ b/typescript/clients/web-ag-ui/apps/agent-pendle/src/clients/clients.ts @@ -1,8 +1,12 @@ import { createPublicClient, createWalletClient, http, type Account } from 'viem'; import { arbitrum } from 'viem/chains'; +const DEFAULT_ARBITRUM_RPC_URL = 'https://arb1.arbitrum.io/rpc'; + const ARBITRUM_RPC_URL = - process.env['ARBITRUM_RPC_URL'] ?? 'https://arb-mainnet.g.alchemy.com/v2/demo-key'; + process.env['ARBITRUM_RPC_URL'] ?? + process.env['ARBITRUM_ONE_RPC_URL'] ?? + DEFAULT_ARBITRUM_RPC_URL; const RPC_RETRY_COUNT = 2; const RPC_TIMEOUT_MS = 8000; From e3d8adc606fabc90a76305cb3ce0c0b4196728f4 Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Tue, 10 Feb 2026 21:55:04 -0500 Subject: [PATCH 58/70] fix(agent-gmx-allora): raise smoke collateral default to avoid liquidation-threshold simulation failures --- .../apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts index 0903b3aa..e1d71235 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts @@ -24,9 +24,9 @@ import { getOnchainClients } from '../../src/workflow/clientFactory.js'; import type { ExecutionPlan } from '../../src/core/executionPlan.js'; const DEFAULT_SMOKE_USDC_ADDRESS = '0xaf88d065e77c8cC2239327C5EDb3A432268e5831' as const; -// 1 USDC in base units (6 decimals). Keep this small but non-trivial so onchain-actions -// can plan a realistic position increase when simulation is enabled. -const DEFAULT_LONG_AMOUNT_BASE_UNITS = 1_000_000n; +// 1.1 USDC in base units (6 decimals). 1.0 USDC can fail GMX simulation as "LiquidatablePosition" +// due to fees pushing remaining collateral below the min collateral threshold. +const DEFAULT_LONG_AMOUNT_BASE_UNITS = 1_100_000n; const USDC_DECIMALS = 6; const resolveArbitrumRpcUrl = (): string => From a4b4eafadcfe80bb105213a9c31316e9f129be3f Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Tue, 10 Feb 2026 22:40:53 -0500 Subject: [PATCH 59/70] fix(agent-gmx-allora-smoke): improve position lifecycle handling --- .../tests/smoke/gmx-allora-smoke.ts | 181 +++++++++++++----- 1 file changed, 130 insertions(+), 51 deletions(-) diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts index e1d71235..aa3b909f 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts @@ -28,6 +28,9 @@ const DEFAULT_SMOKE_USDC_ADDRESS = '0xaf88d065e77c8cC2239327C5EDb3A432268e5831' // due to fees pushing remaining collateral below the min collateral threshold. const DEFAULT_LONG_AMOUNT_BASE_UNITS = 1_100_000n; const USDC_DECIMALS = 6; +const DEFAULT_STEP_TIMEOUT_MS = 15_000; +const CLOSE_RETRY_INTERVAL_MS = 5_000; +const CLOSE_RETRY_TIMEOUT_MS = 90_000; const resolveArbitrumRpcUrl = (): string => process.env['ARBITRUM_RPC_URL'] ?? process.env['ARBITRUM_ONE_RPC_URL'] ?? 'https://arbitrum.gateway.tenderly.co'; @@ -247,19 +250,6 @@ const run = async () => { }, }); - if (delegatorUsdcAmountBaseUnits < DEFAULT_LONG_AMOUNT_BASE_UNITS) { - throw new Error( - [ - 'GMX long planning failed preflight: wallet has insufficient Arbitrum USDC for simulation.', - `walletAddress=${walletAddress}`, - `usdcAddress=${usdcAddress}`, - `required>=${formatUnits(DEFAULT_LONG_AMOUNT_BASE_UNITS, USDC_DECIMALS)} USDC`, - `found=${formatUnits(delegatorUsdcAmountBaseUnits, USDC_DECIMALS)} USDC`, - 'Fund this wallet with USDC on Arbitrum (chainId=42161) or lower the smoke amount.', - ].join(' '), - ); - } - if (txExecutionMode === 'execute' && delegationsBypassActive === false) { if (!agentWalletAddress) { throw new Error('Agent wallet address is required when executing with DELEGATIONS_BYPASS=false.'); @@ -287,7 +277,37 @@ const run = async () => { } const marketAddress = getAddress(btcMarket.marketToken.address); + const normalizedMarketAddress = marketAddress.toLowerCase(); const payTokenAddress = getAddress(usdcAddress); + const matchingMarketPositions = positions.filter( + (position) => position.marketAddress.toLowerCase() === normalizedMarketAddress, + ); + const preexistingPosition = matchingMarketPositions.find((position) => position.positionSide === 'long'); + const preexistingMarketPosition = preexistingPosition ?? matchingMarketPositions[0]; + const shouldOpenLongPosition = !preexistingMarketPosition; + let closePositionSide: 'long' | 'short' = preexistingMarketPosition?.positionSide ?? 'long'; + let openedPositionThisRun = false; + + if (preexistingMarketPosition) { + console.log('[smoke] Preexisting market position found; skipping long open and moving to close.', { + marketAddress, + positionSide: preexistingMarketPosition.positionSide, + key: preexistingMarketPosition.key, + }); + } + + if (shouldOpenLongPosition && delegatorUsdcAmountBaseUnits < DEFAULT_LONG_AMOUNT_BASE_UNITS) { + throw new Error( + [ + 'GMX long planning failed preflight: wallet has insufficient Arbitrum USDC for simulation.', + `walletAddress=${walletAddress}`, + `usdcAddress=${usdcAddress}`, + `required>=${formatUnits(DEFAULT_LONG_AMOUNT_BASE_UNITS, USDC_DECIMALS)} USDC`, + `found=${formatUnits(delegatorUsdcAmountBaseUnits, USDC_DECIMALS)} USDC`, + 'Fund this wallet with USDC on Arbitrum (chainId=42161) or lower the smoke amount.', + ].join(' '), + ); + } const inference = await fetchAlloraInference({ baseUrl: resolveAlloraApiBaseUrl(), @@ -303,17 +323,23 @@ const run = async () => { const runStep = async ( label: string, fn: () => Promise, - skipWhen?: (message: string) => string | null, + options?: { + skipWhen?: (message: string) => string | null; + timeoutMs?: number; + }, ) => { try { + const timeoutMs = options?.timeoutMs ?? DEFAULT_STEP_TIMEOUT_MS; await Promise.race([ fn(), - new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), 15_000)), + new Promise((_, reject) => + setTimeout(() => reject(new Error(`timeout after ${timeoutMs}ms`)), timeoutMs), + ), ]); console.log(`[smoke] ${label}: ok`); } catch (error: unknown) { const message = error instanceof Error ? error.message : String(error); - const skipReason = skipWhen ? skipWhen(message) : null; + const skipReason = options?.skipWhen ? options.skipWhen(message) : null; if (skipReason) { skips.push(`${label}: ${skipReason}`); console.warn(`[smoke] ${label}: skipped -> ${skipReason}`); @@ -394,9 +420,64 @@ const run = async () => { } } + const runClosePlan = async (): Promise => { + const plan: ExecutionPlan = { + action: 'close', + request: { + walletAddress, + marketAddress, + positionSide: closePositionSide, + isLimit: false, + }, + }; + + const result = await executePerpetualPlan({ + client, + clients, + plan, + txExecutionMode, + delegationsBypassActive, + delegationBundle, + delegatorWalletAddress: walletAddress, + delegateeWalletAddress: agentWalletAddress, + }); + + if (!result.ok) { + throw new Error(result.error ?? 'unknown execution error'); + } + }; + + const closeWithRetry = async (): Promise => { + const closeMissingReason = 'No position or order found matching criteria'; + const deadline = Date.now() + CLOSE_RETRY_TIMEOUT_MS; + let attempt = 0; + + while (true) { + attempt += 1; + try { + await runClosePlan(); + return; + } catch (error: unknown) { + const message = error instanceof Error ? error.message : String(error); + const canRetry = message.includes(closeMissingReason) && Date.now() < deadline; + if (!canRetry) { + throw error; + } + console.warn(`[smoke] close attempt ${attempt} not ready yet; retrying in ${CLOSE_RETRY_INTERVAL_MS}ms`, { + reason: message, + }); + await new Promise((resolve) => setTimeout(resolve, CLOSE_RETRY_INTERVAL_MS)); + } + } + }; + await runStep( txExecutionMode === 'execute' ? 'perpetual long execute' : 'perpetual long planning', async () => { + if (!shouldOpenLongPosition) { + return; + } + const plan: ExecutionPlan = { action: 'long', request: { @@ -424,45 +505,43 @@ const run = async () => { if (!result.ok) { throw new Error(result.error ?? 'unknown execution error'); } - }, - ); - - await runStep( - txExecutionMode === 'execute' ? 'perpetual close execute' : 'perpetual close planning', - async () => { - const plan: ExecutionPlan = { - action: 'close', - request: { - walletAddress, - marketAddress, - positionSide: 'long', - isLimit: false, - }, - }; - - const result = await executePerpetualPlan({ - client, - clients, - plan, - txExecutionMode, - delegationsBypassActive, - delegationBundle, - delegatorWalletAddress: walletAddress, - delegateeWalletAddress: agentWalletAddress, - }); - if (!result.ok) { - throw new Error(result.error ?? 'unknown execution error'); - } - }, - (message) => { - if (message.includes('No position or order found')) { - return 'no closeable positions for wallet'; - } - return null; + openedPositionThisRun = true; + closePositionSide = 'long'; }, ); + const closeStepLabel = txExecutionMode === 'execute' ? 'perpetual close execute' : 'perpetual close planning'; + const shouldAttemptExecuteClose = txExecutionMode !== 'execute' || preexistingMarketPosition !== undefined || openedPositionThisRun; + + if (!shouldAttemptExecuteClose) { + skips.push(`${closeStepLabel}: no opened/preexisting position to close`); + console.warn(`[smoke] ${closeStepLabel}: skipped -> no opened/preexisting position to close`); + } else { + await runStep( + closeStepLabel, + async () => { + if (txExecutionMode === 'execute') { + await closeWithRetry(); + return; + } + await runClosePlan(); + }, + { + timeoutMs: txExecutionMode === 'execute' ? CLOSE_RETRY_TIMEOUT_MS + DEFAULT_STEP_TIMEOUT_MS : DEFAULT_STEP_TIMEOUT_MS, + skipWhen: + txExecutionMode === 'execute' + ? undefined + : (message) => { + if (message.includes('No position or order found')) { + return 'no closeable positions for wallet'; + } + return null; + }, + }, + ); + } + if (failures.length > 0) { throw new Error(`Smoke checks failed:\n- ${failures.join('\n- ')}`); } From a3fac826c35dffd0a118a9121d0be44792dc667c Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Wed, 11 Feb 2026 14:32:07 -0500 Subject: [PATCH 60/70] fix(agent-gmx-allora): wait for position indexing before close --- .../tests/smoke/gmx-allora-smoke.ts | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts index aa3b909f..d72053ec 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts @@ -31,6 +31,7 @@ const USDC_DECIMALS = 6; const DEFAULT_STEP_TIMEOUT_MS = 15_000; const CLOSE_RETRY_INTERVAL_MS = 5_000; const CLOSE_RETRY_TIMEOUT_MS = 90_000; +const OPEN_POSITION_READY_TIMEOUT_MS = 180_000; const resolveArbitrumRpcUrl = (): string => process.env['ARBITRUM_RPC_URL'] ?? process.env['ARBITRUM_ONE_RPC_URL'] ?? 'https://arbitrum.gateway.tenderly.co'; @@ -296,6 +297,46 @@ const run = async () => { }); } + const waitForOpenedPosition = async (): Promise => { + const deadline = Date.now() + OPEN_POSITION_READY_TIMEOUT_MS; + let attempt = 0; + + while (true) { + attempt += 1; + const latestPositions = await client.listPerpetualPositions({ walletAddress, chainIds: ['42161'] }); + const latestMatchingPositions = latestPositions.filter( + (position) => position.marketAddress.toLowerCase() === normalizedMarketAddress, + ); + + if (latestMatchingPositions.length > 0) { + const closeCandidate = + latestMatchingPositions.find((position) => position.positionSide === 'long') ?? + latestMatchingPositions[0]; + closePositionSide = closeCandidate.positionSide; + console.log('[smoke] Opened position is indexed and ready for close.', { + marketAddress, + positionSide: closeCandidate.positionSide, + key: closeCandidate.key, + }); + return; + } + + if (Date.now() >= deadline) { + throw new Error( + [ + `Opened position was not indexed within ${OPEN_POSITION_READY_TIMEOUT_MS}ms.`, + 'GMX order execution may still be pending keeper fulfillment.', + ].join(' '), + ); + } + + console.warn( + `[smoke] waiting for opened position to index before close (attempt ${attempt}); retrying in ${CLOSE_RETRY_INTERVAL_MS}ms`, + ); + await new Promise((resolve) => setTimeout(resolve, CLOSE_RETRY_INTERVAL_MS)); + } + }; + if (shouldOpenLongPosition && delegatorUsdcAmountBaseUnits < DEFAULT_LONG_AMOUNT_BASE_UNITS) { throw new Error( [ @@ -511,6 +552,12 @@ const run = async () => { }, ); + if (txExecutionMode === 'execute' && openedPositionThisRun) { + await runStep('wait for opened position indexing', waitForOpenedPosition, { + timeoutMs: OPEN_POSITION_READY_TIMEOUT_MS + DEFAULT_STEP_TIMEOUT_MS, + }); + } + const closeStepLabel = txExecutionMode === 'execute' ? 'perpetual close execute' : 'perpetual close planning'; const shouldAttemptExecuteClose = txExecutionMode !== 'execute' || preexistingMarketPosition !== undefined || openedPositionThisRun; From d1bd389d658dd062f9d21166f4b5addbf9e8b6a3 Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Wed, 11 Feb 2026 15:55:16 -0500 Subject: [PATCH 61/70] fix(agent-gmx-allora): improve decision and plan test coverage --- .../web-ag-ui/apps/agent-gmx-allora/README.md | 7 ++ .../src/core/executionPlan.unit.test.ts | 100 ++++++++++++++++++ .../tests/pollCycle.int.test.ts | 58 ++++++++++ 3 files changed, 165 insertions(+) diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md index 6f9abd31..0aae22c5 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md @@ -15,6 +15,13 @@ This agent uses Allora prediction feeds to make deterministic trading decisions - Plan-building mode (no submission) is implemented. - Next: validate onchain-actions read-path correctness (markets/positions/balances) before enabling transaction submission. +## Test Taxonomy + +- `test:unit`: deterministic unit coverage for core decisioning, plan building, and client adapters. +- `test:int`: workflow-level integration tests (node-level orchestration and action wiring). +- `test:e2e`: intentionally reserved for full graph + service lifecycle tests; currently no e2e specs are checked in yet. +- `test:smoke`: live end-to-end transaction smoke script against a configured onchain-actions API URL. + ## Transaction Submission Behavior The agent always uses onchain-actions to build a `transactions[]` plan for the chosen action (`long`, `short`, `close`). diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.unit.test.ts index 3e085bbb..f83dbf71 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.unit.test.ts @@ -68,4 +68,104 @@ describe('buildPerpetualExecutionPlan', () => { sizeDeltaUsd: '1000000000000000000000000000000', }); }); + + it('builds a short request for open short actions', () => { + const telemetry: GmxAlloraTelemetry = { + cycle: 3, + action: 'open', + reason: 'Signal bearish', + marketSymbol: 'BTC/USDC', + side: 'short', + leverage: 2, + sizeUsd: 180, + timestamp: '2026-02-05T12:10:00.000Z', + }; + + const plan = buildPerpetualExecutionPlan({ + telemetry, + chainId: '42161', + marketAddress: '0xmarket', + walletAddress: '0xwallet', + payTokenAddress: '0xusdc', + collateralTokenAddress: '0xusdc', + }); + + expect(plan.action).toBe('short'); + expect(plan.request).toEqual({ + amount: '180', + walletAddress: '0xwallet', + chainId: '42161', + marketAddress: '0xmarket', + payTokenAddress: '0xusdc', + collateralTokenAddress: '0xusdc', + leverage: '2', + }); + }); + + it('builds a close request for close actions', () => { + const telemetry: GmxAlloraTelemetry = { + cycle: 4, + action: 'close', + reason: 'Direction flipped', + marketSymbol: 'BTC/USDC', + side: 'short', + leverage: 2, + sizeUsd: 180, + timestamp: '2026-02-05T12:15:00.000Z', + }; + + const plan = buildPerpetualExecutionPlan({ + telemetry, + chainId: '42161', + marketAddress: '0xmarket', + walletAddress: '0xwallet', + payTokenAddress: '0xusdc', + collateralTokenAddress: '0xusdc', + }); + + expect(plan.action).toBe('close'); + expect(plan.request).toEqual({ + walletAddress: '0xwallet', + marketAddress: '0xmarket', + positionSide: 'short', + isLimit: false, + }); + }); + + it('returns none when required telemetry fields are missing', () => { + const openWithoutSide: GmxAlloraTelemetry = { + cycle: 5, + action: 'open', + reason: 'Incomplete telemetry', + marketSymbol: 'BTC/USDC', + timestamp: '2026-02-05T12:20:00.000Z', + }; + const closeWithoutSide: GmxAlloraTelemetry = { + cycle: 6, + action: 'close', + reason: 'Missing side', + marketSymbol: 'BTC/USDC', + timestamp: '2026-02-05T12:25:00.000Z', + }; + + const openPlan = buildPerpetualExecutionPlan({ + telemetry: openWithoutSide, + chainId: '42161', + marketAddress: '0xmarket', + walletAddress: '0xwallet', + payTokenAddress: '0xusdc', + collateralTokenAddress: '0xusdc', + }); + const closePlan = buildPerpetualExecutionPlan({ + telemetry: closeWithoutSide, + chainId: '42161', + marketAddress: '0xmarket', + walletAddress: '0xwallet', + payTokenAddress: '0xusdc', + collateralTokenAddress: '0xusdc', + }); + + expect(openPlan).toEqual({ action: 'none' }); + expect(closePlan).toEqual({ action: 'none' }); + }); }); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts index dbdf0d80..a2c531d7 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts @@ -216,6 +216,64 @@ describe('pollCycleNode (integration)', () => { expect(artifactIds).toContain('gmx-allora-execution-plan'); }); + it('routes open long decisions to createPerpetualLong', async () => { + fetchAlloraInferenceMock.mockResolvedValueOnce({ + topicId: 14, + combinedValue: 47000, + confidenceIntervalValues: [46000, 46500, 47000, 47500, 48000], + }); + listPerpetualMarketsMock.mockResolvedValueOnce([baseMarket]); + listPerpetualPositionsMock.mockResolvedValueOnce([]); + + const state = buildBaseState(); + state.view.metrics.previousPrice = 46000; + await pollCycleNode(state, {}); + + expect(createPerpetualLongMock).toHaveBeenCalledTimes(1); + expect(createPerpetualShortMock).not.toHaveBeenCalled(); + expect(createPerpetualCloseMock).not.toHaveBeenCalled(); + expect(createPerpetualReduceMock).not.toHaveBeenCalled(); + }); + + it('routes open short decisions to createPerpetualShort', async () => { + fetchAlloraInferenceMock.mockResolvedValueOnce({ + topicId: 14, + combinedValue: 47000, + confidenceIntervalValues: [46000, 46500, 47000, 47500, 48000], + }); + listPerpetualMarketsMock.mockResolvedValueOnce([baseMarket]); + listPerpetualPositionsMock.mockResolvedValueOnce([]); + + const state = buildBaseState(); + state.view.metrics.previousPrice = 48000; + await pollCycleNode(state, {}); + + expect(createPerpetualShortMock).toHaveBeenCalledTimes(1); + expect(createPerpetualLongMock).not.toHaveBeenCalled(); + expect(createPerpetualCloseMock).not.toHaveBeenCalled(); + expect(createPerpetualReduceMock).not.toHaveBeenCalled(); + }); + + it('routes direction-flip decisions to createPerpetualClose', async () => { + fetchAlloraInferenceMock.mockResolvedValueOnce({ + topicId: 14, + combinedValue: 47000, + confidenceIntervalValues: [46000, 46500, 47000, 47500, 48000], + }); + listPerpetualMarketsMock.mockResolvedValueOnce([baseMarket]); + listPerpetualPositionsMock.mockResolvedValueOnce([]); + + const state = buildBaseState(); + state.view.metrics.previousPrice = 48000; + state.view.metrics.assumedPositionSide = 'long'; + await pollCycleNode(state, {}); + + expect(createPerpetualCloseMock).toHaveBeenCalledTimes(1); + expect(createPerpetualLongMock).not.toHaveBeenCalled(); + expect(createPerpetualShortMock).not.toHaveBeenCalled(); + expect(createPerpetualReduceMock).not.toHaveBeenCalled(); + }); + it('executes reduce plans via onchain-actions reduce endpoint when position exists', async () => { fetchAlloraInferenceMock.mockResolvedValueOnce({ topicId: 14, From 068cdca49c2c5eafbc0b3521a2e9fcd42c76eba0 Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Wed, 11 Feb 2026 15:55:20 -0500 Subject: [PATCH 62/70] fix(agent-gmx-allora): harden smoke lifecycle and parity checks --- .../tests/smoke/gmx-allora-smoke.ts | 168 +++++++++++++++++- 1 file changed, 161 insertions(+), 7 deletions(-) diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts index d72053ec..9895b68f 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts @@ -1,6 +1,14 @@ import crypto from 'node:crypto'; -import { createPublicClient, erc20Abi, formatUnits, getAddress, http, type Address } from 'viem'; +import { + createPublicClient, + erc20Abi, + formatUnits, + getAddress, + http, + type Address, + type Hash, +} from 'viem'; import { getDeleGatorEnvironment, ROOT_AUTHORITY, signDelegation } from '@metamask/delegation-toolkit'; import { privateKeyToAccount } from 'viem/accounts'; import { arbitrum } from 'viem/chains'; @@ -22,6 +30,8 @@ import type { DelegationBundle, SignedDelegation } from '../../src/workflow/cont import { executePerpetualPlan } from '../../src/workflow/execution.js'; import { getOnchainClients } from '../../src/workflow/clientFactory.js'; import type { ExecutionPlan } from '../../src/core/executionPlan.js'; +import type { ExecutionResult } from '../../src/workflow/execution.js'; +import type { PerpetualPosition } from '../../src/clients/onchainActions.js'; const DEFAULT_SMOKE_USDC_ADDRESS = '0xaf88d065e77c8cC2239327C5EDb3A432268e5831' as const; // 1.1 USDC in base units (6 decimals). 1.0 USDC can fail GMX simulation as "LiquidatablePosition" @@ -32,6 +42,9 @@ const DEFAULT_STEP_TIMEOUT_MS = 15_000; const CLOSE_RETRY_INTERVAL_MS = 5_000; const CLOSE_RETRY_TIMEOUT_MS = 90_000; const OPEN_POSITION_READY_TIMEOUT_MS = 180_000; +const TX_RECEIPT_TIMEOUT_MS = 180_000; +const CLOSE_POSITION_SETTLE_TIMEOUT_MS = 180_000; +const MAX_FULL_CYCLE_USDC_LOSS_BASE_UNITS = 1_000_000n; const resolveArbitrumRpcUrl = (): string => process.env['ARBITRUM_RPC_URL'] ?? process.env['ARBITRUM_ONE_RPC_URL'] ?? 'https://arbitrum.gateway.tenderly.co'; @@ -80,6 +93,22 @@ const resolveUsdcAddress = (): `0x${string}` | undefined => { return value as `0x${string}`; }; +function parseBigIntOrZero(value: string): bigint { + try { + return BigInt(value); + } catch { + return 0n; + } +} + +function isNonZeroPosition(position: PerpetualPosition): boolean { + if (parseBigIntOrZero(position.sizeInUsd) > 0n) { + return true; + } + const sizeInTokens = Number(position.sizeInTokens); + return Number.isFinite(sizeInTokens) && sizeInTokens > 0; +} + const baseUrl = resolveBaseUrl(); const delegationsBypassActive = resolveDelegationsBypass(); const txExecutionMode = resolveGmxAlloraTxExecutionMode(); @@ -391,6 +420,69 @@ const run = async () => { } }; + let attemptedOpenLongPlan = false; + let longResult: ExecutionResult | undefined; + let closeResult: ExecutionResult | undefined; + + const assertTransactionsPlanned = (label: string, result: ExecutionResult): void => { + const transactions = result.transactions ?? []; + if (transactions.length === 0) { + throw new Error(`${label} returned no transaction plan entries.`); + } + }; + + const assertSuccessfulReceipts = async (label: string, txHashes: `0x${string}`[]): Promise => { + if (txHashes.length === 0) { + throw new Error(`${label} returned no tx hashes in execute mode.`); + } + for (const txHash of txHashes) { + const receipt = await arbitrumClient.waitForTransactionReceipt({ + hash: txHash as Hash, + timeout: TX_RECEIPT_TIMEOUT_MS, + }); + if (receipt.status !== 'success') { + throw new Error(`${label} transaction reverted: ${txHash}`); + } + console.log(`[smoke] tx confirmed`, { + label, + txHash, + blockNumber: receipt.blockNumber.toString(), + }); + } + }; + + const waitForNoOpenMarketPosition = async (): Promise => { + const deadline = Date.now() + CLOSE_POSITION_SETTLE_TIMEOUT_MS; + let attempt = 0; + while (true) { + attempt += 1; + const latestPositions = await client.listPerpetualPositions({ walletAddress, chainIds: ['42161'] }); + const latestOpenPositions = latestPositions.filter( + (position) => + position.marketAddress.toLowerCase() === normalizedMarketAddress && isNonZeroPosition(position), + ); + if (latestOpenPositions.length === 0) { + return; + } + if (Date.now() >= deadline) { + const summary = latestOpenPositions.map((position) => ({ + key: position.key, + contractKey: position.contractKey, + side: position.positionSide, + sizeInUsd: position.sizeInUsd, + sizeInTokens: position.sizeInTokens, + })); + throw new Error( + `Position still open after close timeout (${CLOSE_POSITION_SETTLE_TIMEOUT_MS}ms): ${JSON.stringify(summary)}`, + ); + } + console.warn( + `[smoke] waiting for close settlement (attempt ${attempt}); retrying in ${CLOSE_RETRY_INTERVAL_MS}ms`, + ); + await new Promise((resolve) => setTimeout(resolve, CLOSE_RETRY_INTERVAL_MS)); + } + }; + const buildDelegationBundle = async (): Promise => { if (delegationsBypassActive) { throw new Error('Delegation bundle requested while DELEGATIONS_BYPASS=true.'); @@ -461,7 +553,7 @@ const run = async () => { } } - const runClosePlan = async (): Promise => { + const runClosePlan = async (): Promise => { const plan: ExecutionPlan = { action: 'close', request: { @@ -486,9 +578,11 @@ const run = async () => { if (!result.ok) { throw new Error(result.error ?? 'unknown execution error'); } + assertTransactionsPlanned('perpetual close', result); + return result; }; - const closeWithRetry = async (): Promise => { + const closeWithRetry = async (): Promise => { const closeMissingReason = 'No position or order found matching criteria'; const deadline = Date.now() + CLOSE_RETRY_TIMEOUT_MS; let attempt = 0; @@ -496,8 +590,7 @@ const run = async () => { while (true) { attempt += 1; try { - await runClosePlan(); - return; + return await runClosePlan(); } catch (error: unknown) { const message = error instanceof Error ? error.message : String(error); const canRetry = message.includes(closeMissingReason) && Date.now() < deadline; @@ -518,6 +611,7 @@ const run = async () => { if (!shouldOpenLongPosition) { return; } + attemptedOpenLongPlan = true; const plan: ExecutionPlan = { action: 'long', @@ -547,6 +641,8 @@ const run = async () => { throw new Error(result.error ?? 'unknown execution error'); } + assertTransactionsPlanned('perpetual long', result); + longResult = result; openedPositionThisRun = true; closePositionSide = 'long'; }, @@ -569,10 +665,10 @@ const run = async () => { closeStepLabel, async () => { if (txExecutionMode === 'execute') { - await closeWithRetry(); + closeResult = await closeWithRetry(); return; } - await runClosePlan(); + closeResult = await runClosePlan(); }, { timeoutMs: txExecutionMode === 'execute' ? CLOSE_RETRY_TIMEOUT_MS + DEFAULT_STEP_TIMEOUT_MS : DEFAULT_STEP_TIMEOUT_MS, @@ -589,6 +685,64 @@ const run = async () => { ); } + await runStep('preexisting-position branch behavior', async () => { + if (preexistingMarketPosition && attemptedOpenLongPlan) { + throw new Error('Expected open step to be skipped for preexisting market position.'); + } + if (!preexistingMarketPosition && !attemptedOpenLongPlan) { + throw new Error('Expected open step to run when no preexisting market position exists.'); + } + }); + + if (txExecutionMode === 'execute' && longResult?.txHashes) { + await runStep( + 'perpetual long tx lifecycle', + async () => { + await assertSuccessfulReceipts('perpetual long', longResult?.txHashes ?? []); + }, + { timeoutMs: TX_RECEIPT_TIMEOUT_MS + DEFAULT_STEP_TIMEOUT_MS }, + ); + } + + if (txExecutionMode === 'execute' && closeResult?.txHashes) { + await runStep( + 'perpetual close tx lifecycle', + async () => { + await assertSuccessfulReceipts('perpetual close', closeResult?.txHashes ?? []); + }, + { timeoutMs: TX_RECEIPT_TIMEOUT_MS + DEFAULT_STEP_TIMEOUT_MS }, + ); + } + + if (txExecutionMode === 'execute' && closeResult?.ok) { + await runStep('post-close position state', waitForNoOpenMarketPosition, { + timeoutMs: CLOSE_POSITION_SETTLE_TIMEOUT_MS + DEFAULT_STEP_TIMEOUT_MS, + }); + } + + if (txExecutionMode === 'execute' && openedPositionThisRun && closeResult?.ok) { + await runStep('full-cycle USDC balance delta sanity', async () => { + const endingBalances = await fetchBalancesViaRpc(walletAddress); + const delta = endingBalances.usdc - delegatorUsdcAmountBaseUnits; + console.log('[smoke] USDC balance delta', { + walletAddress, + startBaseUnits: delegatorUsdcAmountBaseUnits.toString(), + endBaseUnits: endingBalances.usdc.toString(), + deltaBaseUnits: delta.toString(), + deltaFormattedUsdc: formatUnits(delta, USDC_DECIMALS), + }); + if (delta < -MAX_FULL_CYCLE_USDC_LOSS_BASE_UNITS) { + throw new Error( + [ + 'USDC loss exceeded configured full-cycle tolerance.', + `maxLossBaseUnits=${MAX_FULL_CYCLE_USDC_LOSS_BASE_UNITS.toString()}`, + `actualLossBaseUnits=${(-delta).toString()}`, + ].join(' '), + ); + } + }); + } + if (failures.length > 0) { throw new Error(`Smoke checks failed:\n- ${failures.join('\n- ')}`); } From 04d8df1d8f05bbd9f15eea66e8e69cc878590423 Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Wed, 11 Feb 2026 15:55:25 -0500 Subject: [PATCH 63/70] fix(agent-gmx-allora): sequence delegated transactions by receipt --- .../agent-gmx-allora/src/workflow/execution.ts | 6 ++++++ .../src/workflow/execution.unit.test.ts | 14 +++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.ts index def3c42e..0e5ca472 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.ts @@ -122,6 +122,12 @@ async function executePlannedTransactionWithDelegation(params: { logInfo('GMX delegated transaction submitted', { transactionHash: hash }); + const receipt = await params.clients.public.waitForTransactionReceipt({ hash }); + if (receipt.status !== 'success') { + throw new Error(`Delegated GMX transaction reverted: ${hash}`); + } + logInfo('GMX delegated transaction confirmed', { transactionHash: hash }); + return hash; } diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.unit.test.ts index f8a3b1d5..c2fde974 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/execution.unit.test.ts @@ -6,11 +6,17 @@ import type { ExecutionPlan } from '../core/executionPlan.js'; import type { DelegationBundle } from './context.js'; import { executePerpetualPlan } from './execution.js'; -const { executeTransactionMock, encodePermissionContextsMock, sendTransactionWithDelegationMock } = +const { + executeTransactionMock, + encodePermissionContextsMock, + sendTransactionWithDelegationMock, + waitForTransactionReceiptMock, +} = vi.hoisted(() => ({ executeTransactionMock: vi.fn(), encodePermissionContextsMock: vi.fn(), sendTransactionWithDelegationMock: vi.fn(), + waitForTransactionReceiptMock: vi.fn(), })); vi.mock('../core/transaction.js', () => ({ @@ -56,6 +62,7 @@ describe('executePerpetualPlan', () => { executeTransactionMock.mockReset(); encodePermissionContextsMock.mockReset(); sendTransactionWithDelegationMock.mockReset(); + waitForTransactionReceiptMock.mockReset(); }); it('skips execution when plan action is none', async () => { @@ -181,7 +188,11 @@ describe('executePerpetualPlan', () => { it('submits transactions via delegation redemption when delegations are active', async () => { encodePermissionContextsMock.mockReturnValue(['0xperm']); sendTransactionWithDelegationMock.mockResolvedValueOnce('0xhash2'); + waitForTransactionReceiptMock.mockResolvedValueOnce({ status: 'success' }); const clients = { + public: { + waitForTransactionReceipt: waitForTransactionReceiptMock, + }, wallet: { account: { address: '0x00000000000000000000000000000000000000cc' }, chain: null, @@ -242,6 +253,7 @@ describe('executePerpetualPlan', () => { delegationManager: delegationBundle.delegationManager, }), ); + expect(waitForTransactionReceiptMock).toHaveBeenCalledWith({ hash: '0xhash2' }); expect(result.txHashes).toEqual(['0xhash2']); expect(result.lastTxHash).toBe('0xhash2'); }); From e7fa58974fadfabb325db30a5c9764b393892dc8 Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Wed, 11 Feb 2026 18:08:06 -0500 Subject: [PATCH 64/70] fix(agent-gmx-allora): harden allora topic and inference polling controls --- .../apps/agent-gmx-allora/.env.example | 13 ++- .../apps/agent-gmx-allora/.env.test.example | 13 ++- .../web-ag-ui/apps/agent-gmx-allora/README.md | 12 +- .../agent-gmx-allora/src/config/constants.ts | 51 +++++++- .../src/config/constants.unit.test.ts | 29 +++++ .../apps/agent-gmx-allora/src/core/cycle.ts | 17 +-- .../src/core/cycle.unit.test.ts | 15 ++- .../agent-gmx-allora/src/core/decision.ts | 7 -- .../src/core/decision.unit.test.ts | 29 +++++ .../agent-gmx-allora/src/workflow/context.ts | 11 ++ .../src/workflow/nodes/pollCycle.ts | 109 ++++++++++++------ .../tests/pollCycle.int.test.ts | 76 ++++++++++++ 12 files changed, 312 insertions(+), 70 deletions(-) diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.example b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.example index 8189f4f2..b30ea559 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.example +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.example @@ -20,6 +20,17 @@ DELEGATIONS_BYPASS=false # ALLORA_API_BASE_URL=https://api.allora.network # ALLORA_API_KEY= # ALLORA_CHAIN_ID=ethereum-11155111 +# +# Allora topic whitelist enforced in agent config (`src/config/constants.ts`): +# - TOPIC 1: BTC/USD - Log-Return - 8h +# - TOPIC 3: SOL/USD - Log-Return - 8h +# - TOPIC 14: BTC/USD - Price - 8h +# - TOPIC 19: NEAR/USD - Log-Return - 8h +# - TOPIC 2: ETH/USD - Log-Return - 24h +# - TOPIC 16: ETH/USD - Log-Return - 24h +# - TOPIC 2: ETH/USD - Log-Return - 8h +# - TOPIC 17: SOL/USD - Log-Return - 24h +# - TOPIC 10: SOL/USD - Price - 8h # Allora inference cache TTLs (ms). Set to 0 to disable caching. # ALLORA_INFERENCE_CACHE_TTL_MS=30000 @@ -27,7 +38,7 @@ DELEGATIONS_BYPASS=false # GMX agent runtime controls. # GMX_ALLORA_MODE=debug # debug (default) | production -# GMX_ALLORA_POLL_INTERVAL_MS=10000 # default 10000 +# GMX_ALLORA_POLL_INTERVAL_MS=1800000 # default 1800000 (30m) # GMX_ALLORA_STREAM_LIMIT=-1 # default -1 (no limit) # GMX_ALLORA_STATE_HISTORY_LIMIT=100 # default 100 diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example index 6b4a148b..9210eb38 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example @@ -33,6 +33,17 @@ ALLORA_API_BASE_URL=https://api.allora.network # ALLORA_API_KEY= # ALLORA_CHAIN_ID=ethereum-11155111 +# +# Allora topic whitelist enforced in agent config (`src/config/constants.ts`): +# - TOPIC 1: BTC/USD - Log-Return - 8h +# - TOPIC 3: SOL/USD - Log-Return - 8h +# - TOPIC 14: BTC/USD - Price - 8h +# - TOPIC 19: NEAR/USD - Log-Return - 8h +# - TOPIC 2: ETH/USD - Log-Return - 24h +# - TOPIC 16: ETH/USD - Log-Return - 24h +# - TOPIC 2: ETH/USD - Log-Return - 8h +# - TOPIC 17: SOL/USD - Log-Return - 24h +# - TOPIC 10: SOL/USD - Price - 8h # Allora inference cache TTLs (ms). Set to 0 to disable caching (useful in tests). # ALLORA_INFERENCE_CACHE_TTL_MS=0 @@ -40,7 +51,7 @@ ALLORA_API_BASE_URL=https://api.allora.network # GMX agent runtime controls (optional). # GMX_ALLORA_MODE=debug -# GMX_ALLORA_POLL_INTERVAL_MS=10000 +# GMX_ALLORA_POLL_INTERVAL_MS=1800000 # GMX_ALLORA_STREAM_LIMIT=-1 # GMX_ALLORA_STATE_HISTORY_LIMIT=100 diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md index 0aae22c5..d97fde2e 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md @@ -36,8 +36,18 @@ The agent always uses onchain-actions to build a `transactions[]` plan for the c ## Environment -- `GMX_ALLORA_POLL_INTERVAL_MS`: poll interval (ms) for each agent cycle. Defaults to `10000` (10s). +- `GMX_ALLORA_POLL_INTERVAL_MS`: poll interval (ms) for each agent cycle. Defaults to `1800000` (30m). - `GMX_MIN_NATIVE_ETH_WEI`: minimum native ETH (in wei) required in the operator wallet before the agent will proceed (defaults to `2000000000000000` = 0.002 ETH). +- `Allora topic whitelist` (enforced in `src/config/constants.ts`): + - `TOPIC 1`: `BTC/USD - Log-Return - 8h` + - `TOPIC 3`: `SOL/USD - Log-Return - 8h` + - `TOPIC 14`: `BTC/USD - Price - 8h` + - `TOPIC 19`: `NEAR/USD - Log-Return - 8h` + - `TOPIC 2`: `ETH/USD - Log-Return - 24h` + - `TOPIC 16`: `ETH/USD - Log-Return - 24h` + - `TOPIC 2`: `ETH/USD - Log-Return - 8h` + - `TOPIC 17`: `SOL/USD - Log-Return - 24h` + - `TOPIC 10`: `SOL/USD - Price - 8h` - `ALLORA_INFERENCE_CACHE_TTL_MS`: cache TTL (ms) for Allora consumer inference requests. Defaults to `30000`; set to `0` to disable caching. - `ALLORA_8H_INFERENCE_CACHE_TTL_MS`: cache TTL (ms) specifically for the GMX agent's 8-hour inference fetch. Defaults to `30000`; set to `3600000` (1 hour) to avoid re-fetching on every 5s poll tick. - `GMX_ALLORA_TX_SUBMISSION_MODE`: transaction submission mode. Supported values: diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts index 815f102c..b176fbd0 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts @@ -93,14 +93,59 @@ export function resolveAllora8hInferenceCacheTtlMs(): number { } export const ALLORA_HORIZON_HOURS = 8; +export type AlloraTopicInferenceType = 'Log-Return' | 'Price'; + +export type AlloraTopicWhitelistEntry = { + topicId: number; + pair: `${string}/USD`; + horizonHours: 8 | 24; + inferenceType: AlloraTopicInferenceType; +}; + +export const ALLORA_TOPIC_WHITELIST: readonly AlloraTopicWhitelistEntry[] = [ + { topicId: 1, pair: 'BTC/USD', horizonHours: 8, inferenceType: 'Log-Return' }, + { topicId: 3, pair: 'SOL/USD', horizonHours: 8, inferenceType: 'Log-Return' }, + { topicId: 14, pair: 'BTC/USD', horizonHours: 8, inferenceType: 'Price' }, + { topicId: 19, pair: 'NEAR/USD', horizonHours: 8, inferenceType: 'Log-Return' }, + { topicId: 2, pair: 'ETH/USD', horizonHours: 24, inferenceType: 'Log-Return' }, + { topicId: 16, pair: 'ETH/USD', horizonHours: 24, inferenceType: 'Log-Return' }, + { topicId: 2, pair: 'ETH/USD', horizonHours: 8, inferenceType: 'Log-Return' }, + { topicId: 17, pair: 'SOL/USD', horizonHours: 24, inferenceType: 'Log-Return' }, + { topicId: 10, pair: 'SOL/USD', horizonHours: 8, inferenceType: 'Price' }, +] as const; + +function buildTopicLabel(entry: AlloraTopicWhitelistEntry): string { + return `${entry.pair} - ${entry.inferenceType} - ${entry.horizonHours}h`; +} + +function getWhitelistedTopicOrThrow( + topicId: number, + horizonHours?: AlloraTopicWhitelistEntry['horizonHours'], +): AlloraTopicWhitelistEntry { + const whitelisted = ALLORA_TOPIC_WHITELIST.find((entry) => { + if (entry.topicId !== topicId) { + return false; + } + if (horizonHours === undefined) { + return true; + } + return entry.horizonHours === horizonHours; + }); + if (!whitelisted) { + const horizonSuffix = horizonHours ? ` (${horizonHours}h)` : ''; + throw new Error(`Allora topic ${topicId}${horizonSuffix} is not in whitelist.`); + } + return whitelisted; +} + export const ALLORA_TOPIC_IDS = { BTC: 14, ETH: 2, } as const; export const ALLORA_TOPIC_LABELS = { - BTC: 'BTC/USD - Price Prediction - 8h', - ETH: 'ETH/USD - Price Prediction - 8h', + BTC: buildTopicLabel(getWhitelistedTopicOrThrow(ALLORA_TOPIC_IDS.BTC, ALLORA_HORIZON_HOURS)), + ETH: buildTopicLabel(getWhitelistedTopicOrThrow(ALLORA_TOPIC_IDS.ETH, ALLORA_HORIZON_HOURS)), } as const; export function resolveDelegationsBypass(): boolean { @@ -168,7 +213,7 @@ export function resolveGmxAlloraTxExecutionMode(): GmxAlloraTxExecutionMode { return DEFAULT_GMX_ALLORA_TX_EXECUTION_MODE; } -const DEFAULT_POLL_INTERVAL_MS = 10_000; +const DEFAULT_POLL_INTERVAL_MS = 1_800_000; const DEFAULT_STREAM_LIMIT = -1; const DEFAULT_STATE_HISTORY_LIMIT = 100; diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts index 4aa365ce..a49419c0 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts @@ -1,10 +1,13 @@ import { describe, expect, it, vi } from 'vitest'; import { + ALLORA_TOPIC_LABELS, + ALLORA_TOPIC_WHITELIST, resolveAgentWalletAddress, resolveDelegationsBypass, resolveGmxAlloraTxExecutionMode, resolveOnchainActionsApiUrl, + resolvePollIntervalMs, } from './constants.js'; describe('config/constants', () => { @@ -51,6 +54,11 @@ describe('config/constants', () => { expect(logger).not.toHaveBeenCalled(); }); + it('defaults poll interval to 30 minutes', () => { + delete process.env.GMX_ALLORA_POLL_INTERVAL_MS; + expect(resolvePollIntervalMs()).toBe(1_800_000); + }); + it('defaults to plan mode for transaction execution', () => { delete process.env.GMX_ALLORA_TX_SUBMISSION_MODE; @@ -117,4 +125,25 @@ describe('config/constants', () => { expect(() => resolveAgentWalletAddress()).toThrow(/Missing agent wallet configuration/u); }); + + it('contains the curated Allora topic whitelist entries', () => { + expect(ALLORA_TOPIC_WHITELIST).toEqual( + expect.arrayContaining([ + { topicId: 1, pair: 'BTC/USD', horizonHours: 8, inferenceType: 'Log-Return' }, + { topicId: 3, pair: 'SOL/USD', horizonHours: 8, inferenceType: 'Log-Return' }, + { topicId: 14, pair: 'BTC/USD', horizonHours: 8, inferenceType: 'Price' }, + { topicId: 19, pair: 'NEAR/USD', horizonHours: 8, inferenceType: 'Log-Return' }, + { topicId: 2, pair: 'ETH/USD', horizonHours: 24, inferenceType: 'Log-Return' }, + { topicId: 16, pair: 'ETH/USD', horizonHours: 24, inferenceType: 'Log-Return' }, + { topicId: 2, pair: 'ETH/USD', horizonHours: 8, inferenceType: 'Log-Return' }, + { topicId: 17, pair: 'SOL/USD', horizonHours: 24, inferenceType: 'Log-Return' }, + { topicId: 10, pair: 'SOL/USD', horizonHours: 8, inferenceType: 'Price' }, + ]), + ); + }); + + it('uses whitelist metadata for active topic labels', () => { + expect(ALLORA_TOPIC_LABELS.BTC).toBe('BTC/USD - Price - 8h'); + expect(ALLORA_TOPIC_LABELS.ETH).toBe('ETH/USD - Log-Return - 8h'); + }); }); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/cycle.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/cycle.ts index 0e197cd8..3590280b 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/cycle.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/cycle.ts @@ -17,17 +17,6 @@ type BuildCycleTelemetryParams = { now?: Date; }; -function resolveCooldownRemaining(params: { - cooldownCycles: number; - cyclesSinceTrade: number; - isFirstCycle: boolean; -}): number { - if (params.isFirstCycle) { - return 0; - } - return Math.max(0, params.cooldownCycles - params.cyclesSinceTrade); -} - function isTradeAction(action: GmxAlloraActionKind): action is 'open' | 'reduce' | 'close' { return action === 'open' || action === 'reduce' || action === 'close'; } @@ -36,11 +25,7 @@ export function buildCycleTelemetry(params: BuildCycleTelemetryParams): { telemetry: GmxAlloraTelemetry; nextCyclesSinceTrade: number; } { - const cooldownRemaining = resolveCooldownRemaining({ - cooldownCycles: params.cooldownCycles, - cyclesSinceTrade: params.cyclesSinceTrade, - isFirstCycle: params.isFirstCycle, - }); + const cooldownRemaining = 0; const decision = decideTradeAction({ prediction: params.prediction, diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/cycle.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/cycle.unit.test.ts index d6e82e6c..d61424db 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/cycle.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/cycle.unit.test.ts @@ -5,9 +5,9 @@ import type { AlloraPrediction } from '../domain/types.js'; import { buildCycleTelemetry } from './cycle.js'; describe('buildCycleTelemetry', () => { - it('returns cooldown telemetry and increments cycles since trade', () => { + it('returns trade telemetry even when cooldown counters are non-zero', () => { const prediction: AlloraPrediction = { - topic: 'ETH/USD - Price Prediction - 8h', + topic: 'ETH/USD - Log-Return - 8h', horizonHours: 8, confidence: 0.75, direction: 'down', @@ -32,18 +32,21 @@ describe('buildCycleTelemetry', () => { expect(result.telemetry).toEqual({ cycle: 4, - action: 'cooldown', - reason: 'Cooldown active for 1 more cycle(s).', + action: 'close', + reason: 'Signal direction flipped to short; closing open position.', marketSymbol: 'ETH/USDC', + side: 'short', + leverage: 2, + sizeUsd: 80, prediction, timestamp: '2026-02-05T12:01:00.000Z', metrics: { confidence: 0.75, decisionThreshold: 0.62, - cooldownRemaining: 1, + cooldownRemaining: 0, }, }); - expect(result.nextCyclesSinceTrade).toBe(2); + expect(result.nextCyclesSinceTrade).toBe(0); }); it('opens with capped leverage and safety buffer sizing when signal is strong', () => { diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/decision.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/decision.ts index 383735ca..d9597afd 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/decision.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/decision.ts @@ -24,13 +24,6 @@ const SAFETY_BUFFER = 0.2; const formatNumber = (value: number) => String(value); export function decideTradeAction(params: DecideTradeActionParams): TradeDecision { - if (params.cooldownRemaining > 0) { - return { - action: 'cooldown', - reason: `Cooldown active for ${params.cooldownRemaining} more cycle(s).`, - }; - } - if (params.prediction.confidence < params.decisionThreshold) { return { action: 'hold', diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/decision.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/decision.unit.test.ts index df256691..ad40e40d 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/decision.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/decision.unit.test.ts @@ -57,4 +57,33 @@ describe('decideTradeAction', () => { expect(decision.action).toBe('hold'); expect(decision.reason.toLowerCase()).toContain('persists'); }); + + it('ignores cooldown counters and still returns a trade decision', () => { + const prediction: AlloraPrediction = { + topic: 'BTC/USD - Price - 8h', + horizonHours: 8, + confidence: 0.9, + direction: 'up', + predictedPrice: 110, + timestamp: '2026-02-05T12:00:00.000Z', + }; + + const decision = decideTradeAction({ + prediction, + decisionThreshold: 0.62, + cooldownRemaining: 2, + maxLeverage: 2, + baseContributionUsd: 100, + previousAction: undefined, + previousSide: undefined, + }); + + expect(decision).toEqual({ + action: 'open', + side: 'long', + leverage: 2, + sizeUsd: 80, + reason: 'Signal confidence 0.9 >= 0.62; opening long position.', + }); + }); }); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/context.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/context.ts index 7cf31806..bab07670 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/context.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/context.ts @@ -82,6 +82,11 @@ export type ClmmMetrics = { // the same open action every time the signal stays stable. This field tracks the // last assumed position side for decisioning until a close/flip occurs. assumedPositionSide?: 'long' | 'short'; + // Last observed Allora inference metrics fingerprint for the selected topic. + lastInferenceSnapshotKey?: string; + // Fingerprint of the last successful trade action. Used to prevent duplicate actions + // when inference metrics have not changed. + lastTradedInferenceSnapshotKey?: string; }; export type TaskState = @@ -251,6 +256,8 @@ const defaultViewState = (): ClmmViewState => ({ iteration: 0, latestCycle: undefined, assumedPositionSide: undefined, + lastInferenceSnapshotKey: undefined, + lastTradedInferenceSnapshotKey: undefined, }, transactionHistory: [], }); @@ -340,6 +347,10 @@ const mergeViewState = (left: ClmmViewState, right?: Partial): Cl iteration: right.metrics?.iteration ?? left.metrics.iteration, latestCycle: right.metrics?.latestCycle ?? left.metrics.latestCycle, assumedPositionSide: right.metrics?.assumedPositionSide ?? left.metrics.assumedPositionSide, + lastInferenceSnapshotKey: + right.metrics?.lastInferenceSnapshotKey ?? left.metrics.lastInferenceSnapshotKey, + lastTradedInferenceSnapshotKey: + right.metrics?.lastTradedInferenceSnapshotKey ?? left.metrics.lastTradedInferenceSnapshotKey, }; return { diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts index bca80e11..12c6cad0 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts @@ -1,7 +1,7 @@ import { copilotkitEmitState } from '@copilotkit/sdk-js/langgraph'; import { Command } from '@langchain/langgraph'; -import { fetchAlloraInference } from '../../clients/allora.js'; +import { fetchAlloraInference, type AlloraInference } from '../../clients/allora.js'; import type { PerpetualPosition } from '../../clients/onchainActions.js'; import { ALLORA_HORIZON_HOURS, @@ -41,7 +41,6 @@ type CopilotKitConfig = Parameters[0]; type Configurable = { configurable?: { thread_id?: string } }; const DECISION_THRESHOLD = 0.62; -const COOLDOWN_CYCLES = 2; const CONNECT_DELAY_MS = 2500; const CONNECT_DELAY_STEPS = 3; const ALLORA_STALE_CYCLE_LIMIT = 3; @@ -58,6 +57,18 @@ function resolveTopicKey(symbol: string): 'BTC' | 'ETH' { return symbol === 'BTC' ? 'BTC' : 'ETH'; } +function buildInferenceSnapshotKey(inference: AlloraInference): string { + return JSON.stringify({ + topicId: inference.topicId, + combinedValue: inference.combinedValue, + confidenceIntervalValues: inference.confidenceIntervalValues, + }); +} + +function isTradePlanAction(action: 'none' | 'long' | 'short' | 'close' | 'reduce'): boolean { + return action !== 'none'; +} + export const pollCycleNode = async ( state: ClmmState, config: CopilotKitConfig, @@ -91,6 +102,7 @@ export const pollCycleNode = async ( const topicLabel = ALLORA_TOPIC_LABELS[topicKey]; let prediction: AlloraPrediction; + let inferenceSnapshotKey = state.view.metrics.lastInferenceSnapshotKey; let staleCycles = state.view.metrics.staleCycles ?? 0; try { const inference = await fetchAlloraInference({ @@ -100,6 +112,7 @@ export const pollCycleNode = async ( apiKey: resolveAlloraApiKey(), cacheTtlMs: resolveAllora8hInferenceCacheTtlMs(), }); + inferenceSnapshotKey = buildInferenceSnapshotKey(inference); staleCycles = 0; const currentPrice = state.view.metrics.previousPrice ?? inference.combinedValue; prediction = buildAlloraPrediction({ @@ -264,7 +277,7 @@ export const pollCycleNode = async ( const { telemetry, nextCyclesSinceTrade: initialCyclesSinceTrade } = buildCycleTelemetry({ prediction, decisionThreshold: DECISION_THRESHOLD, - cooldownCycles: COOLDOWN_CYCLES, + cooldownCycles: 0, maxLeverage: operatorConfig.maxLeverage, baseContributionUsd: operatorConfig.baseContributionUsd, previousAction: decisionPreviousAction, @@ -283,14 +296,55 @@ export const pollCycleNode = async ( maxTotalExposureUsd: operatorConfig.baseContributionUsd * operatorConfig.maxLeverage, }); + const positionForReduce = + exposureAdjusted.action === 'reduce' && exposureAdjusted.side + ? positions.find( + (position) => + position.marketAddress.toLowerCase() === normalizedTargetMarket && + position.positionSide === exposureAdjusted.side, + ) + : undefined; + + const plannedExecutionPlan = buildPerpetualExecutionPlan({ + telemetry: exposureAdjusted, + chainId: ARBITRUM_CHAIN_ID.toString(), + marketAddress: gmxMarketAddress as `0x${string}`, + walletAddress: operatorConfig.delegatorWalletAddress, + payTokenAddress: operatorConfig.fundingTokenAddress, + collateralTokenAddress: operatorConfig.fundingTokenAddress, + positionContractKey: positionForReduce?.contractKey, + positionSizeInUsd: positionForReduce?.sizeInUsd, + }); + + const skipTradeForUnchangedInference = + isTradePlanAction(plannedExecutionPlan.action) && + Boolean(inferenceSnapshotKey) && + state.view.metrics.lastTradedInferenceSnapshotKey === inferenceSnapshotKey; + + const adjustedTelemetry = skipTradeForUnchangedInference + ? { + ...exposureAdjusted, + action: 'hold' as const, + reason: 'Inference metrics unchanged since last trade; skipping additional action.', + side: undefined, + leverage: undefined, + sizeUsd: undefined, + txHash: undefined, + } + : exposureAdjusted; + + const executionPlan = skipTradeForUnchangedInference + ? ({ action: 'none' } as const) + : plannedExecutionPlan; + const nextCyclesSinceTrade = - exposureAdjusted.action === 'hold' && telemetry.action === 'open' + adjustedTelemetry.action === 'hold' && telemetry.action === 'open' ? (state.view.metrics.cyclesSinceRebalance ?? 0) + 1 : initialCyclesSinceTrade; - const action = exposureAdjusted.action; - const reason = exposureAdjusted.reason; - const txHash = exposureAdjusted.txHash; + const action = adjustedTelemetry.action; + const reason = adjustedTelemetry.reason; + const txHash = adjustedTelemetry.txHash; const cycleStatusMessage = `[Cycle ${iteration}] ${action}: ${reason}${txHash ? ` (tx: ${txHash.slice(0, 10)}...)` : ''}`; let { task, statusEvent } = buildTaskStatus(state.view.task, 'working', cycleStatusMessage); @@ -298,7 +352,7 @@ export const pollCycleNode = async ( view: { task, activity: { events: [statusEvent], telemetry: state.view.activity.telemetry }, - metrics: { latestCycle: exposureAdjusted }, + metrics: { latestCycle: adjustedTelemetry }, }, }); @@ -313,7 +367,7 @@ export const pollCycleNode = async ( view: { task, activity: { events: [statusEvent], telemetry: state.view.activity.telemetry }, - metrics: { latestCycle: exposureAdjusted }, + metrics: { latestCycle: adjustedTelemetry }, }, }); await delay(stepDelayMs); @@ -322,30 +376,10 @@ export const pollCycleNode = async ( const telemetryEvent: ClmmEvent = { type: 'artifact', - artifact: buildTelemetryArtifact(exposureAdjusted), + artifact: buildTelemetryArtifact(adjustedTelemetry), append: true, }; - const positionForReduce = - exposureAdjusted.action === 'reduce' && exposureAdjusted.side - ? positions.find( - (position) => - position.marketAddress.toLowerCase() === normalizedTargetMarket && - position.positionSide === exposureAdjusted.side, - ) - : undefined; - - const executionPlan = buildPerpetualExecutionPlan({ - telemetry: exposureAdjusted, - chainId: ARBITRUM_CHAIN_ID.toString(), - marketAddress: gmxMarketAddress as `0x${string}`, - walletAddress: operatorConfig.delegatorWalletAddress, - payTokenAddress: operatorConfig.fundingTokenAddress, - collateralTokenAddress: operatorConfig.fundingTokenAddress, - positionContractKey: positionForReduce?.contractKey, - positionSizeInUsd: positionForReduce?.sizeInUsd, - }); - const txExecutionMode = resolveGmxAlloraTxExecutionMode(); const clients = txExecutionMode === 'execute' ? getOnchainClients() : undefined; const executionResult = await executePerpetualPlan({ @@ -383,7 +417,7 @@ export const pollCycleNode = async ( ? undefined : { type: 'artifact', - artifact: buildExecutionPlanArtifact({ plan: executionPlan, telemetry: exposureAdjusted }), + artifact: buildExecutionPlanArtifact({ plan: executionPlan, telemetry: adjustedTelemetry }), append: true, }; const executionResultEvent: ClmmEvent | undefined = @@ -396,7 +430,7 @@ export const pollCycleNode = async ( plan: executionPlan, ok: executionResult.ok, error: executionResult.error, - telemetry: exposureAdjusted, + telemetry: adjustedTelemetry, transactions: executionResult.transactions, txHashes: executionResult.txHashes, lastTxHash: executionResult.lastTxHash, @@ -421,7 +455,7 @@ export const pollCycleNode = async ( txHash: resolvedTxHash, status: 'success' as const, reason, - timestamp: exposureAdjusted.timestamp, + timestamp: adjustedTelemetry.timestamp, } : undefined; @@ -444,12 +478,17 @@ export const pollCycleNode = async ( cyclesSinceRebalance: nextCyclesSinceTrade, staleCycles: state.view.metrics.staleCycles ?? 0, iteration, - latestCycle: exposureAdjusted, + latestCycle: adjustedTelemetry, assumedPositionSide: nextAssumedPositionSide, + lastInferenceSnapshotKey: inferenceSnapshotKey, + lastTradedInferenceSnapshotKey: + executionPlan.action !== 'none' && executionResult.ok && inferenceSnapshotKey + ? inferenceSnapshotKey + : state.view.metrics.lastTradedInferenceSnapshotKey, }, task, activity: { - telemetry: [exposureAdjusted], + telemetry: [adjustedTelemetry], events: executionPlanEvent ? executionResultEvent ? [telemetryEvent, executionPlanEvent, executionResultEvent, statusEvent] diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts index a2c531d7..e70ee4e2 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts @@ -274,6 +274,82 @@ describe('pollCycleNode (integration)', () => { expect(createPerpetualReduceMock).not.toHaveBeenCalled(); }); + it('skips a second trade when inference metrics are unchanged', async () => { + fetchAlloraInferenceMock + .mockResolvedValueOnce({ + topicId: 14, + combinedValue: 47000, + confidenceIntervalValues: [46000, 46500, 47000, 47500, 48000], + }) + .mockResolvedValueOnce({ + topicId: 14, + combinedValue: 47000, + confidenceIntervalValues: [46000, 46500, 47000, 47500, 48000], + }); + listPerpetualMarketsMock.mockResolvedValue([baseMarket]); + listPerpetualPositionsMock.mockResolvedValue([]); + + const firstState = buildBaseState(); + firstState.view.metrics.previousPrice = 48000; + firstState.view.metrics.assumedPositionSide = 'long'; + const firstResult = await pollCycleNode(firstState, {}); + + const firstUpdate = (firstResult as { update: { view?: { metrics?: ClmmState['view']['metrics'] } } }) + .update; + + const secondState = buildBaseState(); + secondState.view.metrics = { + ...secondState.view.metrics, + ...(firstUpdate.view?.metrics ?? {}), + }; + secondState.view.metrics.assumedPositionSide = firstUpdate.view?.metrics?.assumedPositionSide; + secondState.view.metrics.latestCycle = firstUpdate.view?.metrics?.latestCycle; + secondState.view.metrics.previousPrice = firstUpdate.view?.metrics?.previousPrice; + secondState.view.metrics.cyclesSinceRebalance = 3; + + await pollCycleNode(secondState, {}); + + expect(createPerpetualCloseMock).toHaveBeenCalledTimes(1); + }); + + it('allows a second trade when inference metrics change', async () => { + fetchAlloraInferenceMock + .mockResolvedValueOnce({ + topicId: 14, + combinedValue: 47000, + confidenceIntervalValues: [46000, 46500, 47000, 47500, 48000], + }) + .mockResolvedValueOnce({ + topicId: 14, + combinedValue: 45000, + confidenceIntervalValues: [44000, 44500, 45000, 45500, 46000], + }); + listPerpetualMarketsMock.mockResolvedValue([baseMarket]); + listPerpetualPositionsMock.mockResolvedValue([]); + + const firstState = buildBaseState(); + firstState.view.metrics.previousPrice = 46000; + const firstResult = await pollCycleNode(firstState, {}); + + const firstUpdate = (firstResult as { update: { view?: { metrics?: ClmmState['view']['metrics'] } } }) + .update; + + const secondState = buildBaseState(); + secondState.view.metrics = { + ...secondState.view.metrics, + ...(firstUpdate.view?.metrics ?? {}), + }; + secondState.view.metrics.assumedPositionSide = firstUpdate.view?.metrics?.assumedPositionSide; + secondState.view.metrics.latestCycle = firstUpdate.view?.metrics?.latestCycle; + secondState.view.metrics.previousPrice = firstUpdate.view?.metrics?.previousPrice; + secondState.view.metrics.cyclesSinceRebalance = 3; + + await pollCycleNode(secondState, {}); + + expect(createPerpetualLongMock).toHaveBeenCalledTimes(1); + expect(createPerpetualCloseMock).toHaveBeenCalledTimes(1); + }); + it('executes reduce plans via onchain-actions reduce endpoint when position exists', async () => { fetchAlloraInferenceMock.mockResolvedValueOnce({ topicId: 14, From 7a619ff5478edd6b5586596003cee8db6c95d432 Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Wed, 11 Feb 2026 18:48:12 -0500 Subject: [PATCH 65/70] feat(web-ag-ui): add mocked/live gmx allora e2e profiles --- .../apps/agent-gmx-allora/.env.test.example | 6 +- .../web-ag-ui/apps/agent-gmx-allora/README.md | 7 + .../apps/agent-gmx-allora/package.json | 1 + .../apps/agent-gmx-allora/src/agent.ts | 3 + .../agent-gmx-allora/src/config/constants.ts | 18 ++ .../src/config/constants.unit.test.ts | 16 ++ .../src/e2e/agentLocalMocks.ts | 249 ++++++++++++++++++ .../agent-gmx-allora/src/workflow/context.ts | 24 +- .../src/workflow/nodes/pollCycle.ts | 17 +- .../web-ag-ui/apps/web/.env.test.example | 10 +- .../clients/web-ag-ui/apps/web/README.md | 19 ++ .../web/tests/gmxAllora.system.e2e.test.ts | 197 ++++++++++---- .../web/tests/setup/system.globalSetup.ts | 137 +++------- 13 files changed, 540 insertions(+), 164 deletions(-) create mode 100644 typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/e2e/agentLocalMocks.ts diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example index 9210eb38..3b50998f 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example @@ -3,7 +3,7 @@ # If set, tests use this URL and skip booting a local onchain-actions worktree. # Leave unset to auto-boot a local worktree on http://localhost:50051. -# ONCHAIN_ACTIONS_API_URL=http://localhost:50051 +ONCHAIN_ACTIONS_API_URL=http://localhost:50051 # If agent/web E2E needs to boot onchain-actions + memgraph locally, point at the worktree. # Auto-discovery will look for a single `worktrees/onchain-actions-*` directory, but if you have @@ -69,6 +69,10 @@ GMX_ALLORA_TX_SUBMISSION_MODE=plan # Smoke/E2E helpers. # Used by tests/smoke/gmx-allora-smoke.ts and apps/web/tests/gmxAllora.system.e2e.test.ts. SMOKE_WALLET=0x0000000000000000000000000000000000000001 +# Optional profile for web-driven E2E: +# - mocked: enable agent-local MSW interceptors for Allora + onchain-actions. +# - live: disable interceptors and use real HTTP providers. +# E2E_PROFILE=mocked # When DELEGATIONS_BYPASS=false and GMX_ALLORA_TX_SUBMISSION_MODE=execute, smoke runs need a delegator key # to sign delegations that the agent wallet can redeem. # SMOKE_DELEGATOR_PRIVATE_KEY=0x0000000000000000000000000000000000000000000000000000000000000000 diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md index d97fde2e..15725d0b 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/README.md @@ -22,6 +22,10 @@ This agent uses Allora prediction feeds to make deterministic trading decisions - `test:e2e`: intentionally reserved for full graph + service lifecycle tests; currently no e2e specs are checked in yet. - `test:smoke`: live end-to-end transaction smoke script against a configured onchain-actions API URL. +For web-driven E2E (`apps/web/tests/gmxAllora.system.e2e.test.ts`), the agent supports: +- `E2E_PROFILE=mocked`: enable agent-local MSW interception for Allora + onchain-actions. +- `E2E_PROFILE=live`: disable interception and use real HTTP providers. + ## Transaction Submission Behavior The agent always uses onchain-actions to build a `transactions[]` plan for the chosen action (`long`, `short`, `close`). @@ -53,6 +57,9 @@ The agent always uses onchain-actions to build a `transactions[]` plan for the c - `GMX_ALLORA_TX_SUBMISSION_MODE`: transaction submission mode. Supported values: - `plan` (default): build and emit `transactions[]` but do not broadcast. - `submit`: broadcast planned transactions via an embedded wallet (no delegations). Requires an onchain-actions version that correctly plans the requested GMX action (especially close via decrease order). +- `E2E_PROFILE`: optional system-test profile. + - `mocked`: deterministic agent-local MSW handlers intercept Allora + onchain-actions. + - `live` (default): normal runtime behavior with real providers. - `GMX_ALLORA_AGENT_WALLET_ADDRESS`: optional override for the agent wallet (delegatee) address. If omitted, it is derived from `A2A_TEST_AGENT_NODE_PRIVATE_KEY`. - `A2A_TEST_AGENT_NODE_PRIVATE_KEY`: required when `GMX_ALLORA_TX_SUBMISSION_MODE=submit` (0x + 64 hex chars). Only for local/dev use. - `ARBITRUM_RPC_URL`: RPC URL for broadcasting transactions when submission is enabled. diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/package.json b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/package.json index 07a41871..ddaece2b 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/package.json +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/package.json @@ -37,6 +37,7 @@ "eslint-config-prettier": "^10.1.8", "eslint-import-resolver-typescript": "^4.4.4", "eslint-plugin-import": "2.32.0", + "msw": "^2.12.8", "prettier": "catalog:", "tsx": "catalog:", "typescript": "^5.9.3", diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/agent.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/agent.ts index 36b1308d..377dc719 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/agent.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/agent.ts @@ -9,6 +9,7 @@ import { resolveLangGraphDurability, type LangGraphDurability, } from './config/serviceConfig.js'; +import { setupAgentLocalE2EMocksIfNeeded } from './e2e/agentLocalMocks.js'; import { ClmmStateAnnotation, memory, type ClmmState } from './workflow/context.js'; import { configureCronExecutor } from './workflow/cronScheduler.js'; import { bootstrapNode } from './workflow/nodes/bootstrap.js'; @@ -28,6 +29,8 @@ import { runCycleCommandNode } from './workflow/nodes/runCycleCommand.js'; import { summarizeNode } from './workflow/nodes/summarize.js'; import { syncStateNode } from './workflow/nodes/syncState.js'; +await setupAgentLocalE2EMocksIfNeeded(); + function resolvePostBootstrap(state: ClmmState): 'collectSetupInput' | 'syncState' { const command = extractCommand(state.messages) ?? state.view.command; return command === 'sync' ? 'syncState' : 'collectSetupInput'; diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts index b176fbd0..ff51974f 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts @@ -4,6 +4,7 @@ export const ARBITRUM_CHAIN_ID = 42161; const DEFAULT_ONCHAIN_ACTIONS_API_URL = 'https://api.emberai.xyz'; const DEFAULT_ALLORA_API_BASE_URL = 'https://api.allora.network'; +const DEFAULT_E2E_PROFILE: E2EProfile = 'live'; // Allora Consumer API expects a "signature format" / target chain slug. // Docs commonly use Sepolia: "ethereum-11155111". // Production deployments should override via ALLORA_CHAIN_ID. @@ -14,6 +15,7 @@ const DEFAULT_GMX_ALLORA_TX_EXECUTION_MODE: GmxAlloraTxExecutionMode = 'plan'; const DEFAULT_DELEGATIONS_BYPASS = false; export type GmxAlloraTxExecutionMode = 'plan' | 'execute'; +export type E2EProfile = 'mocked' | 'live'; type OnchainActionsBaseUrlLogger = (message: string, metadata?: Record) => void; @@ -65,6 +67,22 @@ export function resolveAlloraChainId(): string { return process.env['ALLORA_CHAIN_ID']?.trim() || DEFAULT_ALLORA_CHAIN_ID; } +export function resolveE2EProfile(): E2EProfile { + const raw = process.env['E2E_PROFILE']; + if (!raw) { + return DEFAULT_E2E_PROFILE; + } + + const normalized = raw.trim().toLowerCase(); + if (normalized === 'mocked') { + return 'mocked'; + } + if (normalized === 'live') { + return 'live'; + } + return DEFAULT_E2E_PROFILE; +} + export function resolveAlloraInferenceCacheTtlMs(): number { const raw = process.env['ALLORA_INFERENCE_CACHE_TTL_MS']; if (!raw) { diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts index a49419c0..5328a8f0 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts @@ -5,6 +5,7 @@ import { ALLORA_TOPIC_WHITELIST, resolveAgentWalletAddress, resolveDelegationsBypass, + resolveE2EProfile, resolveGmxAlloraTxExecutionMode, resolveOnchainActionsApiUrl, resolvePollIntervalMs, @@ -77,6 +78,21 @@ describe('config/constants', () => { expect(resolveGmxAlloraTxExecutionMode()).toBe('plan'); }); + it('defaults E2E profile to live', () => { + delete process.env.E2E_PROFILE; + expect(resolveE2EProfile()).toBe('live'); + }); + + it('accepts mocked E2E profile', () => { + process.env.E2E_PROFILE = 'mocked'; + expect(resolveE2EProfile()).toBe('mocked'); + }); + + it('falls back to live for unknown E2E profile values', () => { + process.env.E2E_PROFILE = 'something-else'; + expect(resolveE2EProfile()).toBe('live'); + }); + it('parses delegations bypass flag', () => { delete process.env.DELEGATIONS_BYPASS; expect(resolveDelegationsBypass()).toBe(false); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/e2e/agentLocalMocks.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/e2e/agentLocalMocks.ts new file mode 100644 index 00000000..500e00db --- /dev/null +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/e2e/agentLocalMocks.ts @@ -0,0 +1,249 @@ +import { z } from 'zod'; + +import { resolveE2EProfile } from '../config/constants.js'; + +type PositionSide = 'long' | 'short'; + +type ScenarioPosition = { + walletAddress: `0x${string}`; + marketAddress: `0x${string}`; + positionSide: PositionSide; + contractKey: `0x${string}`; +}; + +type ScenarioState = { + alloraCallsByTopic: Map; + positionsByWallet: Map; + txCounter: number; +}; + +const HexAddressSchema = z.string().regex(/^0x[a-fA-F0-9]{40}$/u); + +const OpenPositionRequestSchema = z.object({ + walletAddress: HexAddressSchema, + marketAddress: HexAddressSchema, +}); + +const ClosePositionRequestSchema = z.object({ + walletAddress: HexAddressSchema, + marketAddress: HexAddressSchema, + positionSide: z.enum(['long', 'short']).optional(), +}); + +const USDC_ADDRESS = '0x1111111111111111111111111111111111111111' as const; +const BTC_MARKET_ADDRESS = '0x0000000000000000000000000000000000000001' as const; +const CHAIN_ID = '42161' as const; + +const ALLORA_TOPIC_SEQUENCE: Record = { + '14': ['47000', '47000', '43000', '42000'], + '2': ['3200', '3200', '2900', '2800'], +}; + +const createState = (): ScenarioState => ({ + alloraCallsByTopic: new Map(), + positionsByWallet: new Map(), + txCounter: 0, +}); + +const normalizeWalletAddress = (value: string): `0x${string}` => value.toLowerCase() as `0x${string}`; + +const nextTopicValue = (state: ScenarioState, topicId: string): string => { + const current = (state.alloraCallsByTopic.get(topicId) ?? 0) + 1; + state.alloraCallsByTopic.set(topicId, current); + const sequence = ALLORA_TOPIC_SEQUENCE[topicId]; + if (!sequence || sequence.length === 0) { + return '100'; + } + return sequence[Math.min(current - 1, sequence.length - 1)] ?? '100'; +}; + +const nextContractKey = (state: ScenarioState): `0x${string}` => { + state.txCounter += 1; + const hex = state.txCounter.toString(16).padStart(64, '0'); + return `0x${hex}`; +}; + +const buildToken = (address: `0x${string}`, symbol: string, name: string, decimals: number) => ({ + tokenUid: { chainId: CHAIN_ID, address }, + name, + symbol, + isNative: false, + decimals, + iconUri: null, + isVetted: true, +}); + +const buildMarketsPayload = () => ({ + cursor: null, + currentPage: 1, + totalPages: 1, + totalItems: 1, + markets: [ + { + marketToken: { chainId: CHAIN_ID, address: BTC_MARKET_ADDRESS }, + longFundingFee: '0', + shortFundingFee: '0', + longBorrowingFee: '0', + shortBorrowingFee: '0', + chainId: CHAIN_ID, + name: 'GMX BTC/USD', + indexToken: buildToken('0x2222222222222222222222222222222222222222', 'BTC', 'Bitcoin', 8), + longToken: buildToken(USDC_ADDRESS, 'USDC', 'USD Coin', 6), + shortToken: buildToken(USDC_ADDRESS, 'USDC', 'USD Coin', 6), + }, + ], +}); + +const buildWalletBalancesPayload = (walletAddress: `0x${string}`) => ({ + cursor: null, + currentPage: 1, + totalPages: 1, + totalItems: 1, + balances: [ + { + tokenUid: { chainId: CHAIN_ID, address: USDC_ADDRESS }, + amount: '1000000000', + symbol: 'USDC', + valueUsd: 1000, + decimals: 6, + walletAddress, + }, + ], +}); + +const buildPositionsPayload = (position?: ScenarioPosition) => ({ + cursor: null, + currentPage: 1, + totalPages: 1, + totalItems: position ? 1 : 0, + positions: position + ? [ + { + chainId: CHAIN_ID, + key: position.contractKey, + contractKey: position.contractKey, + account: position.walletAddress, + marketAddress: position.marketAddress, + sizeInUsd: '2000000000000000000000000000000', + sizeInTokens: '1', + collateralAmount: '200000000', + pendingBorrowingFeesUsd: '0', + increasedAtTime: '0', + decreasedAtTime: '0', + positionSide: position.positionSide, + isLong: position.positionSide === 'long', + fundingFeeAmount: '0', + claimableLongTokenAmount: '0', + claimableShortTokenAmount: '0', + isOpening: false, + pnl: '0', + positionFeeAmount: '0', + traderDiscountAmount: '0', + uiFeeAmount: '0', + collateralToken: buildToken(USDC_ADDRESS, 'USDC', 'USD Coin', 6), + }, + ] + : [], +}); + +const buildTransactionResponse = () => ({ + transactions: [ + { + type: 'transaction', + to: '0x3333333333333333333333333333333333333333', + data: '0xdeadbeef', + value: '0', + chainId: CHAIN_ID, + }, + ], +}); + +let setupPromise: Promise | null = null; + +export async function setupAgentLocalE2EMocksIfNeeded(): Promise { + if (resolveE2EProfile() !== 'mocked') { + return; + } + + if (setupPromise) { + await setupPromise; + return; + } + + setupPromise = (async () => { + const [{ setupServer }, { http, HttpResponse }] = await Promise.all([ + import('msw/node'), + import('msw'), + ]); + + const state = createState(); + + const server = setupServer( + http.get('*/v2/allora/consumer/:chainId', ({ request }) => { + const url = new URL(request.url); + const topicId = url.searchParams.get('allora_topic_id') ?? '0'; + const combined = nextTopicValue(state, topicId); + return HttpResponse.json({ + status: true, + data: { + inference_data: { + topic_id: topicId, + network_inference_normalized: combined, + }, + }, + }); + }), + http.get('*/perpetuals/markets', () => { + return HttpResponse.json(buildMarketsPayload()); + }), + http.get('*/perpetuals/positions/:walletAddress', ({ params }) => { + const walletAddress = normalizeWalletAddress(String(params['walletAddress'] ?? '')); + const position = state.positionsByWallet.get(walletAddress); + return HttpResponse.json(buildPositionsPayload(position)); + }), + http.get('*/wallet/balances/:walletAddress', ({ params }) => { + const walletAddress = normalizeWalletAddress(String(params['walletAddress'] ?? '')); + return HttpResponse.json(buildWalletBalancesPayload(walletAddress)); + }), + http.post('*/perpetuals/long', async ({ request }) => { + const parsed = OpenPositionRequestSchema.parse(await request.json()); + const walletAddress = normalizeWalletAddress(parsed.walletAddress); + const marketAddress = normalizeWalletAddress(parsed.marketAddress); + state.positionsByWallet.set(walletAddress, { + walletAddress, + marketAddress, + positionSide: 'long', + contractKey: nextContractKey(state), + }); + return HttpResponse.json(buildTransactionResponse()); + }), + http.post('*/perpetuals/short', async ({ request }) => { + const parsed = OpenPositionRequestSchema.parse(await request.json()); + const walletAddress = normalizeWalletAddress(parsed.walletAddress); + const marketAddress = normalizeWalletAddress(parsed.marketAddress); + state.positionsByWallet.set(walletAddress, { + walletAddress, + marketAddress, + positionSide: 'short', + contractKey: nextContractKey(state), + }); + return HttpResponse.json(buildTransactionResponse()); + }), + http.post('*/perpetuals/close', async ({ request }) => { + const parsed = ClosePositionRequestSchema.parse(await request.json()); + const walletAddress = normalizeWalletAddress(parsed.walletAddress); + const marketAddress = normalizeWalletAddress(parsed.marketAddress); + const existing = state.positionsByWallet.get(walletAddress); + if (existing && existing.marketAddress === marketAddress) { + state.positionsByWallet.delete(walletAddress); + } + return HttpResponse.json(buildTransactionResponse()); + }), + ); + + server.listen({ onUnhandledRequest: 'bypass' }); + console.info('[gmx-allora] E2E mocked profile enabled with agent-local MSW handlers'); + })(); + + await setupPromise; +} diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/context.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/context.ts index bab07670..d062c909 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/context.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/context.ts @@ -339,18 +339,24 @@ const mergeViewState = (left: ClmmViewState, right?: Partial): Cl pools: right.profile?.pools ?? left.profile.pools, allowedPools: right.profile?.allowedPools ?? left.profile.allowedPools, }; + const rightMetrics = right.metrics; + const hasAssumedPositionSideUpdate = + rightMetrics !== undefined && + Object.prototype.hasOwnProperty.call(rightMetrics, 'assumedPositionSide'); const nextMetrics: ClmmMetrics = { - lastSnapshot: right.metrics?.lastSnapshot ?? left.metrics.lastSnapshot, - previousPrice: right.metrics?.previousPrice ?? left.metrics.previousPrice, - cyclesSinceRebalance: right.metrics?.cyclesSinceRebalance ?? left.metrics.cyclesSinceRebalance, - staleCycles: right.metrics?.staleCycles ?? left.metrics.staleCycles, - iteration: right.metrics?.iteration ?? left.metrics.iteration, - latestCycle: right.metrics?.latestCycle ?? left.metrics.latestCycle, - assumedPositionSide: right.metrics?.assumedPositionSide ?? left.metrics.assumedPositionSide, + lastSnapshot: rightMetrics?.lastSnapshot ?? left.metrics.lastSnapshot, + previousPrice: rightMetrics?.previousPrice ?? left.metrics.previousPrice, + cyclesSinceRebalance: rightMetrics?.cyclesSinceRebalance ?? left.metrics.cyclesSinceRebalance, + staleCycles: rightMetrics?.staleCycles ?? left.metrics.staleCycles, + iteration: rightMetrics?.iteration ?? left.metrics.iteration, + latestCycle: rightMetrics?.latestCycle ?? left.metrics.latestCycle, + assumedPositionSide: hasAssumedPositionSideUpdate + ? rightMetrics?.assumedPositionSide + : left.metrics.assumedPositionSide, lastInferenceSnapshotKey: - right.metrics?.lastInferenceSnapshotKey ?? left.metrics.lastInferenceSnapshotKey, + rightMetrics?.lastInferenceSnapshotKey ?? left.metrics.lastInferenceSnapshotKey, lastTradedInferenceSnapshotKey: - right.metrics?.lastTradedInferenceSnapshotKey ?? left.metrics.lastTradedInferenceSnapshotKey, + rightMetrics?.lastTradedInferenceSnapshotKey ?? left.metrics.lastTradedInferenceSnapshotKey, }; return { diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts index 12c6cad0..c09c7731 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts @@ -271,8 +271,9 @@ export const pollCycleNode = async ( (position) => position.marketAddress.toLowerCase() === normalizedTargetMarket, ); const currentPositionSide = currentMarketPosition?.positionSide; + const previousOpenSide = previousCycle?.action === 'open' ? previousCycle.side : undefined; - const decisionPreviousSide = currentPositionSide ?? assumedPositionSide ?? previousCycle?.side; + const decisionPreviousSide = currentPositionSide ?? assumedPositionSide ?? previousOpenSide; const decisionPreviousAction = decisionPreviousSide ? 'open' : previousCycle?.action; const { telemetry, nextCyclesSinceTrade: initialCyclesSinceTrade } = buildCycleTelemetry({ prediction, @@ -394,21 +395,23 @@ export const pollCycleNode = async ( }); const nextAssumedPositionSide = (() => { - // Prefer actual onchain state when available. - if (currentPositionSide) { - return currentPositionSide; - } if (!executionResult.ok) { return assumedPositionSide; } + // Planned actions should advance local assumptions immediately so we don't + // repeat stale intent on the next cycle. + if (executionPlan.action === 'close') { + return undefined; + } if (executionPlan.action === 'long') { return 'long'; } if (executionPlan.action === 'short') { return 'short'; } - if (executionPlan.action === 'close') { - return undefined; + // Otherwise, prefer actual onchain state when available. + if (currentPositionSide) { + return currentPositionSide; } return assumedPositionSide; })(); diff --git a/typescript/clients/web-ag-ui/apps/web/.env.test.example b/typescript/clients/web-ag-ui/apps/web/.env.test.example index b43db8b4..4e1de20c 100644 --- a/typescript/clients/web-ag-ui/apps/web/.env.test.example +++ b/typescript/clients/web-ag-ui/apps/web/.env.test.example @@ -8,16 +8,16 @@ # If set, web E2E uses this onchain-actions instance and skips booting a local worktree. # Leave unset to auto-boot a local onchain-actions worktree + memgraph (Docker required). -# ONCHAIN_ACTIONS_API_URL=https://api.emberai.xyz +ONCHAIN_ACTIONS_API_URL=http://localhost:50051 # Optional: override which docker compose file is used to boot memgraph. # Defaults to `${ONCHAIN_ACTIONS_WORKTREE_DIR}/compose.dev.db.yaml`. # ONCHAIN_ACTIONS_MEMGRAPH_COMPOSE_FILE=/absolute/path/to/compose.dev.db.yaml -# E2E switches. -# Leave unset for normal CI-like behavior; set to "true" to use a real Allora API. -# The Allora base URL itself is configured in `apps/agent-gmx-allora/.env.test`. -WEB_E2E_USE_REAL_ALLORA=false +# E2E profile: +# - mocked (default): no local onchain-actions boot; agent-local MSW mocks intercept Allora + onchain-actions. +# - live: uses real HTTP providers; boots local onchain-actions when ONCHAIN_ACTIONS_API_URL is unset. +E2E_PROFILE=mocked # Optional: override the base URL used by the web E2E runner. # WEB_E2E_BASE_URL=http://localhost:3000 diff --git a/typescript/clients/web-ag-ui/apps/web/README.md b/typescript/clients/web-ag-ui/apps/web/README.md index 10357e78..477c51ff 100644 --- a/typescript/clients/web-ag-ui/apps/web/README.md +++ b/typescript/clients/web-ag-ui/apps/web/README.md @@ -27,6 +27,25 @@ Optional configuration: - `NEXT_PUBLIC_AGENT_LIST_SYNC_POLL_MS` — polling interval (ms) for list-page sync refresh. Defaults to `15000`. +### E2E Profiles + +- `E2E_PROFILE=mocked` (default for `pnpm test:e2e`): + - Runs deterministic GMX Allora system tests with agent-local MSW handlers for Allora + onchain-actions. + - Skips booting local onchain-actions/docker dependencies. +- `E2E_PROFILE=live`: + - Runs against real HTTP providers. + - Uses `ONCHAIN_ACTIONS_API_URL` when set, otherwise boots local onchain-actions + Memgraph. + +Examples: + +```bash +# Fast deterministic lane +E2E_PROFILE=mocked pnpm test:e2e tests/gmxAllora.system.e2e.test.ts + +# Live-provider lane +E2E_PROFILE=live pnpm test:e2e tests/gmxAllora.system.e2e.test.ts +``` + ## 📁 Project Structure ``` diff --git a/typescript/clients/web-ag-ui/apps/web/tests/gmxAllora.system.e2e.test.ts b/typescript/clients/web-ag-ui/apps/web/tests/gmxAllora.system.e2e.test.ts index 50b4ff7c..ab5a26a5 100644 --- a/typescript/clients/web-ag-ui/apps/web/tests/gmxAllora.system.e2e.test.ts +++ b/typescript/clients/web-ag-ui/apps/web/tests/gmxAllora.system.e2e.test.ts @@ -37,6 +37,20 @@ type AgentSyncResponse = { activity: null | { telemetry?: unknown; events?: unknown }; }; +type CycleSnapshot = { + iteration: number; + action: string; + reason: string; + assumedPositionSide?: string; + hasExecutionPlan: boolean; + executionPlanAction?: string; + executionOk?: boolean; + executionError?: string; +}; + +const isRecord = (value: unknown): value is Record => + typeof value === 'object' && value !== null && !Array.isArray(value); + async function ensureThread(baseUrl: string, threadId: string, graphId: string): Promise { const res = await fetch(`${baseUrl}/threads`, { method: 'POST', @@ -149,6 +163,113 @@ async function waitForRunCompletion(params: { throw new Error(`Run did not complete within ${params.timeoutMs}ms`); } +function parseCycleSnapshot(sync: AgentSyncResponse): CycleSnapshot { + if (!isRecord(sync.metrics)) { + throw new Error(`Sync response metrics missing: ${JSON.stringify(sync)}`); + } + + const iteration = sync.metrics['iteration']; + const latestCycle = sync.metrics['latestCycle']; + if (typeof iteration !== 'number' || !isRecord(latestCycle)) { + throw new Error(`Sync response latestCycle missing: ${JSON.stringify(sync.metrics)}`); + } + + const action = latestCycle['action']; + const reason = latestCycle['reason']; + if (typeof action !== 'string' || typeof reason !== 'string') { + throw new Error(`latestCycle missing action/reason: ${JSON.stringify(latestCycle)}`); + } + const assumedPositionSide = + typeof sync.metrics['assumedPositionSide'] === 'string' + ? sync.metrics['assumedPositionSide'] + : undefined; + + let hasExecutionPlan = false; + let executionPlanAction: string | undefined; + let executionOk: boolean | undefined; + let executionError: string | undefined; + const events = sync.activity?.events; + if (Array.isArray(events)) { + for (const rawEvent of events) { + if (!isRecord(rawEvent) || rawEvent['type'] !== 'artifact' || !isRecord(rawEvent['artifact'])) { + continue; + } + const artifact = rawEvent['artifact']; + const artifactId = artifact['artifactId']; + if (artifactId !== 'gmx-allora-execution-plan' && artifactId !== 'gmx-allora-execution-result') { + continue; + } + const parts = artifact['parts']; + if (!Array.isArray(parts)) { + continue; + } + for (const rawPart of parts) { + if (!isRecord(rawPart) || rawPart['kind'] !== 'data' || !isRecord(rawPart['data'])) { + continue; + } + const data = rawPart['data']; + if (artifactId === 'gmx-allora-execution-plan') { + hasExecutionPlan = true; + const planAction = data['action']; + if (typeof planAction === 'string') { + executionPlanAction = planAction; + } + continue; + } + const ok = data['ok']; + if (typeof ok === 'boolean') { + executionOk = ok; + } + const error = data['error']; + if (typeof error === 'string' && error.length > 0) { + executionError = error; + } + } + } + } + + return { + iteration, + action, + reason, + assumedPositionSide, + hasExecutionPlan, + executionPlanAction, + executionOk, + executionError, + }; +} + +async function runCycleAndSync(params: { + webBaseUrl: string; + langgraphBaseUrl: string; + graphId: string; + threadId: string; +}): Promise { + await sendCommand({ baseUrl: params.langgraphBaseUrl, threadId: params.threadId, command: 'cycle' }); + const runId = await createRun({ + baseUrl: params.langgraphBaseUrl, + threadId: params.threadId, + graphId: params.graphId, + }); + await waitForRunCompletion({ + baseUrl: params.langgraphBaseUrl, + threadId: params.threadId, + runId, + timeoutMs: 120_000, + }); + + const synced = await postJson(`${params.webBaseUrl}/api/agents/sync`, { + agentId: params.graphId, + threadId: params.threadId, + }); + if (synced.status !== 200 || synced.json.error) { + throw new Error(`Web sync failed after cycle: ${JSON.stringify(synced)}`); + } + + return parseCycleSnapshot(synced.json); +} + describe('GMX Allora full system (web + agent runtime + onchain-actions)', () => { it('web /api/agents/sync succeeds when agent runtime is up', async () => { const webBaseUrl = requireEnv('WEB_E2E_BASE_URL'); @@ -167,12 +288,17 @@ describe('GMX Allora full system (web + agent runtime + onchain-actions)', () => expect(json.metrics).not.toBeNull(); }); - it('cycle run produces telemetry/artifacts and the web sync can read them', async () => { + it('runs deterministic open/hold/close/reopen assertions in mocked profile', async () => { const webBaseUrl = requireEnv('WEB_E2E_BASE_URL'); const langgraphBaseUrl = requireEnv('WEB_E2E_LANGGRAPH_BASE_URL'); + const e2eProfile = requireEnv('E2E_PROFILE'); const graphId = 'agent-gmx-allora'; const threadId = crypto.randomUUID(); + if (e2eProfile !== 'mocked') { + expect(e2eProfile).toBe('live'); + return; + } // Bootstrap via web sync (ensures the thread exists and the graph can respond). const initial = await postJson(`${webBaseUrl}/api/agents/sync`, { @@ -211,7 +337,7 @@ describe('GMX Allora full system (web + agent runtime + onchain-actions)', () => bootstrapped: true, pollIntervalMs: 1000, streamLimit: 10, - cronScheduled: false, + cronScheduled: true, }, view: { delegationsBypassActive: true, @@ -220,55 +346,36 @@ describe('GMX Allora full system (web + agent runtime + onchain-actions)', () => // Preserve shape expected by reducers. activity: { telemetry: [], events: [] }, profile: { chains: [], protocols: [], tokens: [], pools: [], allowedPools: [] }, - metrics: { iteration: 0, previousPrice: 47000, cyclesSinceRebalance: 0, staleCycles: 0 }, + metrics: { iteration: 0, previousPrice: 46000, cyclesSinceRebalance: 0, staleCycles: 0 }, transactionHistory: [], }, }, }); - // Now send the command using the same `as_node` pattern the web route uses. - await sendCommand({ baseUrl: langgraphBaseUrl, threadId, command: 'cycle' }); + const cycleOne = await runCycleAndSync({ webBaseUrl, langgraphBaseUrl, graphId, threadId }); + expect(cycleOne.iteration).toBe(1); + expect(cycleOne.action).toBe('open'); + expect(cycleOne.hasExecutionPlan).toBe(true); + expect(cycleOne.executionPlanAction).toBe('long'); - const runId = await createRun({ baseUrl: langgraphBaseUrl, threadId, graphId }); - await waitForRunCompletion({ baseUrl: langgraphBaseUrl, threadId, runId, timeoutMs: 120_000 }); + const cycleTwo = await runCycleAndSync({ webBaseUrl, langgraphBaseUrl, graphId, threadId }); + expect(cycleTwo.iteration).toBe(2); + expect(cycleTwo.action).toBe('hold'); + expect(cycleTwo.reason.toLowerCase()).toContain('holding'); - const after = await postJson(`${webBaseUrl}/api/agents/sync`, { - agentId: graphId, - threadId, - }); - expect(after.status).toBe(200); - expect(after.json.error).toBeUndefined(); - - const activity = after.json.activity as { telemetry?: unknown; events?: unknown } | null; - expect(activity).not.toBeNull(); - expect(Array.isArray(activity?.telemetry)).toBe(true); - const telemetry = activity?.telemetry as unknown[]; - if (telemetry.length === 0) { - const threadState = await fetch(`${langgraphBaseUrl}/threads/${threadId}/state`).then( - async (res) => ({ - status: res.status, - body: await res.text(), - }), - ); - throw new Error( - [ - 'Expected cycle run telemetry, but got empty telemetry array.', - `web sync: ${JSON.stringify(after.json)}`, - `langgraph state (status=${threadState.status}): ${threadState.body}`, - ].join('\n'), - ); - } - expect(telemetry.length).toBeGreaterThan(0); - expect(Array.isArray(activity?.events)).toBe(true); - - const events = activity?.events as Array>; - const hasPlanArtifact = events.some( - (event) => - event?.type === 'artifact' && - typeof event.artifact === 'object' && - event.artifact !== null && - (event.artifact as Record).artifactId === 'gmx-allora-execution-plan', - ); - expect(hasPlanArtifact).toBe(true); + const cycleThree = await runCycleAndSync({ webBaseUrl, langgraphBaseUrl, graphId, threadId }); + expect(cycleThree.iteration).toBe(3); + expect(cycleThree.action).toBe('close'); + expect(cycleThree.hasExecutionPlan).toBe(true); + expect(cycleThree.executionPlanAction).toBe('close'); + expect(cycleThree.executionOk).toBe(true); + expect(cycleThree.executionError).toBeUndefined(); + expect(cycleThree.assumedPositionSide).toBeUndefined(); + + const cycleFour = await runCycleAndSync({ webBaseUrl, langgraphBaseUrl, graphId, threadId }); + expect(cycleFour.iteration).toBe(4); + expect(cycleFour.action).toBe('open'); + expect(cycleFour.hasExecutionPlan).toBe(true); + expect(cycleFour.executionPlanAction).toBe('short'); }, 180_000); }); diff --git a/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts b/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts index ed366017..c306a6c3 100644 --- a/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts +++ b/typescript/clients/web-ag-ui/apps/web/tests/setup/system.globalSetup.ts @@ -1,13 +1,12 @@ import { execFileSync, spawn } from 'node:child_process'; -import crypto from 'node:crypto'; import { fileURLToPath } from 'node:url'; import path from 'node:path'; -import http from 'node:http'; import net from 'node:net'; import fs from 'node:fs'; type Cleanup = () => Promise | void; type Child = ReturnType; +type E2EProfile = 'mocked' | 'live'; function killProcessTree(child: Child, signal: NodeJS.Signals): void { // `pnpm dev` frequently spawns a child node process. Use a new process group and kill @@ -26,12 +25,13 @@ function killProcessTree(child: Child, signal: NodeJS.Signals): void { child.kill(signal); } -function resolveBooleanEnv(name: string, fallback: boolean): boolean { - const raw = process.env[name]; - if (!raw) return fallback; - if (raw === 'true') return true; - if (raw === 'false') return false; - return fallback; +function resolveE2EProfile(): E2EProfile { + const raw = process.env['E2E_PROFILE']; + if (!raw) { + return 'mocked'; + } + const normalized = raw.trim().toLowerCase(); + return normalized === 'live' ? 'live' : 'mocked'; } function resolvePnpmInvocation(): { command: string; prefixArgs: string[] } { @@ -486,94 +486,35 @@ async function startOnchainActions(): Promise<{ baseUrl: string; cleanup: Cleanu }; } -async function startMockAlloraServer(): Promise<{ - baseUrl: string; - cleanup: Cleanup; -}> { - const counters: Record = {}; - const stableWindowRequests = 3; - - const server = http.createServer((req, res) => { - if (!req.url) { - res.statusCode = 400; - res.end('Missing URL'); - return; - } - - const url = new URL(req.url, 'http://127.0.0.1'); - const match = url.pathname.match(/^\/v2\/allora\/consumer\/(.+)$/u); - if (!match) { - res.statusCode = 404; - res.end('not found'); - return; - } - - const topicId = url.searchParams.get('allora_topic_id') ?? '0'; - // Alternate between two extremes so UIs/tests can easily detect that they're - // talking to the mock server and can observe changes across polling cycles. - // BTC=14, ETH=2 (8h feed); any other topic returns a stable default. - const combined = (() => { - if (topicId !== '14' && topicId !== '2') { - return '100'; - } - const next = (counters[topicId] ?? 0) + 1; - counters[topicId] = next; - const phase = Math.floor((next - 1) / stableWindowRequests) % 2; - return phase === 0 ? '1' : '100000'; - })(); - - res.setHeader('content-type', 'application/json'); - res.statusCode = 200; - res.end( - JSON.stringify({ - status: true, - data: { - inference_data: { - topic_id: topicId, - network_inference_normalized: combined, - }, - }, - }), - ); - }); - - await new Promise((resolve, reject) => { - server.once('error', reject); - server.listen(0, '127.0.0.1', () => resolve()); - }); - - const address = server.address(); - if (!address || typeof address === 'string') { - server.close(); - throw new Error('Failed to resolve mock Allora server address.'); - } - - const baseUrl = `http://127.0.0.1:${address.port}`; - - return { - baseUrl, - cleanup: async () => { - await new Promise((resolve) => server.close(() => resolve())); - }, - }; -} - export default async function systemGlobalSetup(): Promise { + const profile = resolveE2EProfile(); + process.env['E2E_PROFILE'] = profile; + // 1) Resolve onchain-actions API URL. // - // - If ONCHAIN_ACTIONS_API_URL is set, use it as-is and do not boot the onchain-actions worktree. - // - If it's unset, boot a local onchain-actions worktree + memgraph and set ONCHAIN_ACTIONS_API_URL. + // - `mocked` profile: use an inert URL and rely on agent-local MSW handlers. + // - `live` profile: + // - If ONCHAIN_ACTIONS_API_URL is set, use it as-is and do not boot local onchain-actions. + // - If it's unset, boot a local onchain-actions worktree + memgraph and set ONCHAIN_ACTIONS_API_URL. const configuredOnchainActionsUrl = process.env['ONCHAIN_ACTIONS_API_URL']; - const shouldBootOnchainActions = !configuredOnchainActionsUrl; - - const onchain = shouldBootOnchainActions - ? await startOnchainActions() - : { baseUrl: normalizeOnchainActionsApiUrl(configuredOnchainActionsUrl!), cleanup: async () => {} }; + const shouldBootOnchainActions = profile === 'live' && !configuredOnchainActionsUrl; + + const onchain = + profile === 'mocked' + ? { + baseUrl: configuredOnchainActionsUrl + ? normalizeOnchainActionsApiUrl(configuredOnchainActionsUrl) + : 'http://127.0.0.1:50051', + cleanup: async () => {}, + } + : shouldBootOnchainActions + ? await startOnchainActions() + : { baseUrl: normalizeOnchainActionsApiUrl(configuredOnchainActionsUrl!), cleanup: async () => {} }; const onchainCleanup = onchain.cleanup; const onchainApiUrl = onchain.baseUrl; - if (!shouldBootOnchainActions) { + if (profile === 'live' && !shouldBootOnchainActions) { // Fail early with a clearer error than "markets empty" later on. process.env['ONCHAIN_ACTIONS_API_URL'] = onchainApiUrl; await waitForNonEmptyMarkets(`${onchainApiUrl}/perpetuals/markets?chainIds=42161`, 30_000); @@ -582,13 +523,8 @@ export default async function systemGlobalSetup(): Promise { // Load agent test env to pick up Allora configuration (e.g. ALLORA_API_BASE_URL). loadAgentTestEnv(); - // 2) Start mock Allora API and point the agent runtime at it. - const shouldUseRealAllora = resolveBooleanEnv('WEB_E2E_USE_REAL_ALLORA', false); - const mockAllora = shouldUseRealAllora ? undefined : await startMockAlloraServer(); - - const alloraBaseUrl = shouldUseRealAllora - ? process.env['ALLORA_API_BASE_URL'] ?? 'https://api.allora.network' - : mockAllora!.baseUrl; + // 2) Resolve Allora base URL. + const alloraBaseUrl = process.env['ALLORA_API_BASE_URL'] ?? 'https://api.allora.network'; process.env.ALLORA_API_BASE_URL = alloraBaseUrl; @@ -614,10 +550,17 @@ export default async function systemGlobalSetup(): Promise { ], env: { ...process.env, + E2E_PROFILE: profile, DELEGATIONS_BYPASS: 'true', GMX_ALLORA_MODE: 'debug', ONCHAIN_ACTIONS_API_URL: onchainApiUrl, ALLORA_API_BASE_URL: alloraBaseUrl, + ...(profile === 'mocked' + ? { + ALLORA_INFERENCE_CACHE_TTL_MS: '0', + ALLORA_8H_INFERENCE_CACHE_TTL_MS: '0', + } + : {}), }, }); @@ -666,16 +609,16 @@ export default async function systemGlobalSetup(): Promise { }); console.log('[web-e2e] services ready', { + e2eProfile: profile, webBaseUrl, langgraphBaseUrl, onchainActionsApiUrl: onchainApiUrl, - alloraMockBaseUrl: shouldUseRealAllora ? undefined : alloraBaseUrl, + alloraApiBaseUrl: alloraBaseUrl, }); return async () => { await web.cleanup(); await langgraph.cleanup(); - await mockAllora?.cleanup(); await onchainCleanup(); }; } From 3a7fc5b1a82558e347b32b689cd5162643534e0b Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Wed, 11 Feb 2026 21:39:34 -0500 Subject: [PATCH 66/70] fix(web-ag-ui): harden gmx-allora live execution and metrics --- .../apps/agent-gmx-allora/.env.example | 2 +- .../apps/agent-gmx-allora/.env.test.example | 2 +- .../src/clients/onchainActions.ts | 3 +- .../agent-gmx-allora/src/config/constants.ts | 18 + .../src/config/constants.unit.test.ts | 19 + .../src/core/executionPlan.ts | 13 +- .../src/core/executionPlan.unit.test.ts | 29 +- .../agent-gmx-allora/src/workflow/context.ts | 31 ++ .../src/workflow/nodes/bootstrap.ts | 3 +- .../src/workflow/nodes/collectDelegations.ts | 12 +- .../nodes/collectFundingTokenInput.ts | 44 +- .../src/workflow/nodes/pollCycle.ts | 272 ++++++++++-- .../agent-gmx-allora/src/workflow/seedData.ts | 16 +- .../tests/onboarding.int.test.ts | 103 ++++- .../tests/pollCycle.int.test.ts | 104 +++++ .../AgentDetailPage.gmxAllora.unit.test.ts | 130 ++++++ .../web/src/components/AgentDetailPage.tsx | 417 +++++++++++++++++- .../web/src/hooks/usePrivyWalletClient.ts | 14 +- .../web-ag-ui/apps/web/src/types/agent.ts | 30 +- .../web-ag-ui/scripts/reset-dev-stack.sh | 6 +- 20 files changed, 1194 insertions(+), 74 deletions(-) diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.example b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.example index b30ea559..4befe1e8 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.example +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.example @@ -37,7 +37,7 @@ DELEGATIONS_BYPASS=false # ALLORA_8H_INFERENCE_CACHE_TTL_MS=30000 # GMX agent runtime controls. -# GMX_ALLORA_MODE=debug # debug (default) | production +# GMX_ALLORA_MODE=debug # production (default) | debug # GMX_ALLORA_POLL_INTERVAL_MS=1800000 # default 1800000 (30m) # GMX_ALLORA_STREAM_LIMIT=-1 # default -1 (no limit) # GMX_ALLORA_STATE_HISTORY_LIMIT=100 # default 100 diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example index 3b50998f..b3e613b3 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/.env.test.example @@ -50,7 +50,7 @@ ALLORA_API_BASE_URL=https://api.allora.network # ALLORA_8H_INFERENCE_CACHE_TTL_MS=0 # GMX agent runtime controls (optional). -# GMX_ALLORA_MODE=debug +# GMX_ALLORA_MODE=debug # default is production # GMX_ALLORA_POLL_INTERVAL_MS=1800000 # GMX_ALLORA_STREAM_LIMIT=-1 # GMX_ALLORA_STATE_HISTORY_LIMIT=100 diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.ts index 7ef4a5c7..e06eb069 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/onchainActions.ts @@ -149,7 +149,8 @@ export class OnchainActionsRequestError extends Error { } export type PerpetualLongRequest = { - // REST API accepts a bigint-like decimal string; avoid JSON number precision loss. + // REST API accepts token base units as a bigint-like decimal string + // (e.g., 10 USDC => "10000000" with 6 decimals). amount: string; walletAddress: `0x${string}`; chainId: string; diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts index ff51974f..ff970bd2 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.ts @@ -11,9 +11,11 @@ const DEFAULT_E2E_PROFILE: E2EProfile = 'live'; const DEFAULT_ALLORA_CHAIN_ID = 'ethereum-11155111'; const DEFAULT_ALLORA_INFERENCE_CACHE_TTL_MS = 30_000; const DEFAULT_ALLORA_8H_INFERENCE_CACHE_TTL_MS = 30_000; +const DEFAULT_GMX_ALLORA_MODE: GmxAlloraMode = 'production'; const DEFAULT_GMX_ALLORA_TX_EXECUTION_MODE: GmxAlloraTxExecutionMode = 'plan'; const DEFAULT_DELEGATIONS_BYPASS = false; +export type GmxAlloraMode = 'debug' | 'production'; export type GmxAlloraTxExecutionMode = 'plan' | 'execute'; export type E2EProfile = 'mocked' | 'live'; @@ -175,6 +177,22 @@ export function resolveDelegationsBypass(): boolean { return normalized === 'true' || normalized === '1' || normalized === 'yes'; } +export function resolveGmxAlloraMode(): GmxAlloraMode { + const raw = process.env['GMX_ALLORA_MODE']; + if (!raw) { + return DEFAULT_GMX_ALLORA_MODE; + } + + const normalized = raw.trim().toLowerCase(); + if (normalized === 'debug') { + return 'debug'; + } + if (normalized === 'production') { + return 'production'; + } + return DEFAULT_GMX_ALLORA_MODE; +} + function normalizeHexAddress(value: string, label: string): `0x${string}` { if (!value.startsWith('0x')) { throw new Error(`Invalid ${label}: ${value}`); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts index 5328a8f0..c37ebe4a 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/config/constants.unit.test.ts @@ -6,6 +6,7 @@ import { resolveAgentWalletAddress, resolveDelegationsBypass, resolveE2EProfile, + resolveGmxAlloraMode, resolveGmxAlloraTxExecutionMode, resolveOnchainActionsApiUrl, resolvePollIntervalMs, @@ -113,6 +114,24 @@ describe('config/constants', () => { expect(resolveDelegationsBypass()).toBe(false); }); + it('defaults GMX mode to production', () => { + delete process.env.GMX_ALLORA_MODE; + expect(resolveGmxAlloraMode()).toBe('production'); + }); + + it('parses GMX mode from environment', () => { + process.env.GMX_ALLORA_MODE = 'debug'; + expect(resolveGmxAlloraMode()).toBe('debug'); + + process.env.GMX_ALLORA_MODE = 'production'; + expect(resolveGmxAlloraMode()).toBe('production'); + }); + + it('falls back to production for unknown GMX mode values', () => { + process.env.GMX_ALLORA_MODE = 'staging'; + expect(resolveGmxAlloraMode()).toBe('production'); + }); + it('resolves agent wallet address from explicit address env var', () => { process.env.GMX_ALLORA_AGENT_WALLET_ADDRESS = '0xAbCd000000000000000000000000000000000000'; delete process.env.A2A_TEST_AGENT_NODE_PRIVATE_KEY; diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.ts index f1adad88..be7b9fdd 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.ts @@ -1,3 +1,5 @@ +import { parseUnits } from 'viem'; + import type { GmxAlloraTelemetry } from '../domain/types.js'; export type ExecutionPlan = { @@ -35,6 +37,8 @@ function formatNumber(value: number | undefined): string | undefined { return String(value); } +const USDC_DECIMALS = 6; + function toAmountString(value: number | undefined): string | undefined { if (value === undefined) { return undefined; @@ -42,7 +46,14 @@ function toAmountString(value: number | undefined): string | undefined { if (!Number.isFinite(value) || value <= 0) { return undefined; } - return String(Math.round(value)); + + // onchain-actions expects token base units (e.g., 10 USDC => 10000000). + const normalized = value.toFixed(USDC_DECIMALS); + try { + return parseUnits(normalized, USDC_DECIMALS).toString(); + } catch { + return undefined; + } } function toGmxUsdDelta(positionSizeInUsd: string | undefined): string | undefined { diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.unit.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.unit.test.ts index f83dbf71..6f20a97e 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/core/executionPlan.unit.test.ts @@ -28,7 +28,7 @@ describe('buildPerpetualExecutionPlan', () => { expect(plan.action).toBe('long'); expect(plan.request).toEqual({ - amount: '160', + amount: '160000000', walletAddress: '0xwallet', chainId: '42161', marketAddress: '0xmarket', @@ -92,7 +92,7 @@ describe('buildPerpetualExecutionPlan', () => { expect(plan.action).toBe('short'); expect(plan.request).toEqual({ - amount: '180', + amount: '180000000', walletAddress: '0xwallet', chainId: '42161', marketAddress: '0xmarket', @@ -168,4 +168,29 @@ describe('buildPerpetualExecutionPlan', () => { expect(openPlan).toEqual({ action: 'none' }); expect(closePlan).toEqual({ action: 'none' }); }); + + it('converts fractional open size into USDC base units', () => { + const telemetry: GmxAlloraTelemetry = { + cycle: 7, + action: 'open', + reason: 'fractional sizing', + marketSymbol: 'BTC/USDC', + side: 'long', + leverage: 2, + sizeUsd: 10.5, + timestamp: '2026-02-05T12:30:00.000Z', + }; + + const plan = buildPerpetualExecutionPlan({ + telemetry, + chainId: '42161', + marketAddress: '0xmarket', + walletAddress: '0xwallet', + payTokenAddress: '0xusdc', + collateralTokenAddress: '0xusdc', + }); + + expect(plan.action).toBe('long'); + expect(plan.request?.amount).toBe('10500000'); + }); }); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/context.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/context.ts index d062c909..0a995684 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/context.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/context.ts @@ -71,6 +71,23 @@ export type ClmmTransaction = { timestamp: string; }; +export type GmxLatestSnapshot = { + poolAddress?: `0x${string}`; + totalUsd?: number; + feesUsd?: number; + feesApy?: number; + timestamp?: string; + positionOpenedAt?: string; + positionTokens: Array<{ + address: `0x${string}`; + symbol: string; + decimals: number; + amount?: number; + amountBaseUnits?: string; + valueUsd?: number; + }>; +}; + export type ClmmMetrics = { lastSnapshot?: GmxMarket; previousPrice?: number; @@ -78,6 +95,10 @@ export type ClmmMetrics = { staleCycles: number; iteration: number; latestCycle?: GmxAlloraTelemetry; + aumUsd?: number; + apy?: number; + lifetimePnlUsd?: number; + latestSnapshot?: GmxLatestSnapshot; // When running in plan-only mode (no submission), we may want to avoid re-planning // the same open action every time the signal stays stable. This field tracks the // last assumed position side for decisioning until a close/flip occurs. @@ -255,6 +276,10 @@ const defaultViewState = (): ClmmViewState => ({ staleCycles: 0, iteration: 0, latestCycle: undefined, + aumUsd: undefined, + apy: undefined, + lifetimePnlUsd: undefined, + latestSnapshot: undefined, assumedPositionSide: undefined, lastInferenceSnapshotKey: undefined, lastTradedInferenceSnapshotKey: undefined, @@ -343,6 +368,8 @@ const mergeViewState = (left: ClmmViewState, right?: Partial): Cl const hasAssumedPositionSideUpdate = rightMetrics !== undefined && Object.prototype.hasOwnProperty.call(rightMetrics, 'assumedPositionSide'); + const hasLatestSnapshotUpdate = + rightMetrics !== undefined && Object.prototype.hasOwnProperty.call(rightMetrics, 'latestSnapshot'); const nextMetrics: ClmmMetrics = { lastSnapshot: rightMetrics?.lastSnapshot ?? left.metrics.lastSnapshot, previousPrice: rightMetrics?.previousPrice ?? left.metrics.previousPrice, @@ -350,6 +377,10 @@ const mergeViewState = (left: ClmmViewState, right?: Partial): Cl staleCycles: rightMetrics?.staleCycles ?? left.metrics.staleCycles, iteration: rightMetrics?.iteration ?? left.metrics.iteration, latestCycle: rightMetrics?.latestCycle ?? left.metrics.latestCycle, + aumUsd: rightMetrics?.aumUsd ?? left.metrics.aumUsd, + apy: rightMetrics?.apy ?? left.metrics.apy, + lifetimePnlUsd: rightMetrics?.lifetimePnlUsd ?? left.metrics.lifetimePnlUsd, + latestSnapshot: hasLatestSnapshotUpdate ? rightMetrics?.latestSnapshot : left.metrics.latestSnapshot, assumedPositionSide: hasAssumedPositionSideUpdate ? rightMetrics?.assumedPositionSide : left.metrics.assumedPositionSide, diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/bootstrap.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/bootstrap.ts index aadab954..f2a6d8d5 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/bootstrap.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/bootstrap.ts @@ -4,6 +4,7 @@ import { Command } from '@langchain/langgraph'; import { resolveAlloraApiBaseUrl, resolveDelegationsBypass, + resolveGmxAlloraMode, resolveOnchainActionsApiUrl, resolvePollIntervalMs, resolveStreamLimit, @@ -28,7 +29,7 @@ export const bootstrapNode = async ( }); } - const mode = process.env['GMX_ALLORA_MODE'] === 'production' ? 'production' : 'debug'; + const mode = resolveGmxAlloraMode(); const pollIntervalMs = resolvePollIntervalMs(); const streamLimit = resolveStreamLimit(); const delegationsBypassActive = resolveDelegationsBypass(); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectDelegations.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectDelegations.ts index 6745a661..a110a9a3 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectDelegations.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectDelegations.ts @@ -3,7 +3,11 @@ import { Command, interrupt } from '@langchain/langgraph'; import { getDeleGatorEnvironment } from '@metamask/delegation-toolkit'; import { z } from 'zod'; -import { ARBITRUM_CHAIN_ID, resolveAgentWalletAddress } from '../../config/constants.js'; +import { + ARBITRUM_CHAIN_ID, + resolveAgentWalletAddress, + resolveGmxAlloraMode, +} from '../../config/constants.js'; import { buildTaskStatus, logInfo, @@ -138,6 +142,8 @@ export const collectDelegationsNode = async ( operatorInput.walletAddress, 'delegator wallet address', ); + const mode = state.private.mode ?? resolveGmxAlloraMode(); + const warnings = mode === 'debug' ? [...DELEGATION_WARNINGS] : []; const delegateeAddress = resolveAgentWalletAddress(); const { DelegationManager } = getDeleGatorEnvironment(ARBITRUM_CHAIN_ID); const delegationManager = normalizeHexAddress(DelegationManager, 'delegation manager'); @@ -152,7 +158,7 @@ export const collectDelegationsNode = async ( delegateeAddress, delegationsToSign: buildDelegations({ delegatorAddress, delegateeAddress }), descriptions: [...DELEGATION_DESCRIPTIONS], - warnings: [...DELEGATION_WARNINGS], + warnings, }; const awaitingInput = buildTaskStatus( @@ -231,7 +237,7 @@ export const collectDelegationsNode = async ( delegations: signedDelegations, intents: [...DELEGATION_INTENTS], descriptions: [...DELEGATION_DESCRIPTIONS], - warnings: [...DELEGATION_WARNINGS], + warnings, }; const { task, statusEvent } = buildTaskStatus( diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectFundingTokenInput.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectFundingTokenInput.ts index b288efc1..81b937d0 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectFundingTokenInput.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/collectFundingTokenInput.ts @@ -1,7 +1,11 @@ import { copilotkitEmitState } from '@copilotkit/sdk-js/langgraph'; import { Command } from '@langchain/langgraph'; +import type { PerpetualMarket } from '../../clients/onchainActions.js'; +import { ARBITRUM_CHAIN_ID, ONCHAIN_ACTIONS_API_URL } from '../../config/constants.js'; +import { selectGmxPerpetualMarket } from '../../core/marketSelection.js'; import { type FundingTokenInput } from '../../domain/types.js'; +import { getOnchainActionsClient } from '../clientFactory.js'; import { buildTaskStatus, logInfo, @@ -10,7 +14,6 @@ import { type ClmmUpdate, type OnboardingState, } from '../context.js'; -import { FUNDING_TOKENS } from '../seedData.js'; type CopilotKitConfig = Parameters[0]; @@ -18,6 +21,22 @@ const ONBOARDING: Pick = { totalSteps: 3, }; +function resolveUsdcTokenAddressFromMarket(market: PerpetualMarket): `0x${string}` { + const longToken = market.longToken; + const shortToken = market.shortToken; + if (!longToken || !shortToken) { + throw new Error('Selected GMX market is missing long/short token metadata.'); + } + + const candidates = [shortToken, longToken]; + const usdcToken = candidates.find((token) => token.symbol.toUpperCase() === 'USDC'); + if (!usdcToken) { + throw new Error('Selected GMX market does not provide USDC collateral.'); + } + + return normalizeHexAddress(usdcToken.tokenUid.address, 'funding token address'); +} + export const collectFundingTokenInputNode = async ( state: ClmmState, config: CopilotKitConfig, @@ -62,9 +81,25 @@ export const collectFundingTokenInputNode = async ( }, }); - const usdcOption = FUNDING_TOKENS.find((option) => option.symbol.toUpperCase() === 'USDC'); - if (!usdcOption) { - const failureMessage = 'ERROR: USDC funding option unavailable for GMX onboarding.'; + let normalizedFundingToken: `0x${string}`; + try { + const onchainActionsClient = getOnchainActionsClient(); + const markets = await onchainActionsClient.listPerpetualMarkets({ + chainIds: [ARBITRUM_CHAIN_ID.toString()], + }); + const selectedMarket = selectGmxPerpetualMarket({ + markets, + baseSymbol: operatorInput.targetMarket, + quoteSymbol: 'USDC', + }); + if (!selectedMarket) { + throw new Error(`No GMX ${operatorInput.targetMarket}/USDC market available`); + } + + normalizedFundingToken = resolveUsdcTokenAddressFromMarket(selectedMarket); + } catch (error: unknown) { + const message = error instanceof Error ? error.message : 'Unknown error'; + const failureMessage = `ERROR: Failed to resolve USDC funding token from ${ONCHAIN_ACTIONS_API_URL}: ${message}`; const { task, statusEvent } = buildTaskStatus(awaitingInput.task, 'failed', failureMessage); await copilotkitEmitState(config, { view: { task, activity: { events: [statusEvent], telemetry: state.view.activity.telemetry } }, @@ -78,7 +113,6 @@ export const collectFundingTokenInputNode = async ( }; } - const normalizedFundingToken = normalizeHexAddress(usdcOption.address, 'funding token address'); const { task, statusEvent } = buildTaskStatus( awaitingInput.task, 'working', diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts index c09c7731..01805ead 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts @@ -2,12 +2,13 @@ import { copilotkitEmitState } from '@copilotkit/sdk-js/langgraph'; import { Command } from '@langchain/langgraph'; import { fetchAlloraInference, type AlloraInference } from '../../clients/allora.js'; -import type { PerpetualPosition } from '../../clients/onchainActions.js'; +import type { PerpetualPosition, TransactionPlan } from '../../clients/onchainActions.js'; import { ALLORA_HORIZON_HOURS, ALLORA_TOPIC_IDS, ALLORA_TOPIC_LABELS, ARBITRUM_CHAIN_ID, + ONCHAIN_ACTIONS_API_URL, resolveAlloraApiBaseUrl, resolveAlloraApiKey, resolveAlloraChainId, @@ -30,7 +31,9 @@ import { getOnchainActionsClient, getOnchainClients } from '../clientFactory.js' import { buildTaskStatus, logInfo, + normalizeHexAddress, type ClmmEvent, + type GmxLatestSnapshot, type ClmmState, type ClmmUpdate, } from '../context.js'; @@ -44,6 +47,7 @@ const DECISION_THRESHOLD = 0.62; const CONNECT_DELAY_MS = 2500; const CONNECT_DELAY_STEPS = 3; const ALLORA_STALE_CYCLE_LIMIT = 3; +const ERC20_APPROVE_SELECTOR = '0x095ea7b3'; function shouldDelayIteration(iteration: number): boolean { return iteration % 3 === 0; @@ -69,6 +73,121 @@ function isTradePlanAction(action: 'none' | 'long' | 'short' | 'close' | 'reduce return action !== 'none'; } +function parseUsdMetric(raw: string | undefined): number | undefined { + if (!raw) { + return undefined; + } + const normalized = raw.trim(); + if (normalized.length === 0) { + return undefined; + } + if (/^-?\d+\.\d+$/u.test(normalized)) { + const value = Number(normalized); + return Number.isFinite(value) ? value : undefined; + } + if (!/^-?\d+$/u.test(normalized)) { + return undefined; + } + + const sign = normalized.startsWith('-') ? -1 : 1; + const digits = normalized.startsWith('-') ? normalized.slice(1) : normalized; + if (digits.length > 18) { + const scale = 10n ** 30n; + const bigint = BigInt(normalized); + const abs = bigint < 0n ? -bigint : bigint; + const integerPart = abs / scale; + const fractionPart = abs % scale; + return sign * (Number(integerPart) + Number(fractionPart) / Number(scale)); + } + + const value = Number(normalized); + return Number.isFinite(value) ? value : undefined; +} + +function parseEpochToIso(raw: string | undefined): string | undefined { + if (!raw) { + return undefined; + } + const trimmed = raw.trim(); + if (!/^\d+$/u.test(trimmed)) { + return undefined; + } + const asNumber = Number(trimmed); + if (!Number.isFinite(asNumber) || asNumber <= 0) { + return undefined; + } + const millis = asNumber > 1_000_000_000_000 ? asNumber : asNumber * 1000; + const date = new Date(millis); + return Number.isNaN(date.getTime()) ? undefined : date.toISOString(); +} + +function getCallSelector(data: string): string | undefined { + if (!data.startsWith('0x') || data.length < 10) { + return undefined; + } + return data.slice(0, 10).toLowerCase(); +} + +function isApprovalOnlyTransactions(transactions: TransactionPlan[] | undefined): boolean { + if (!transactions || transactions.length === 0) { + return false; + } + return transactions.every((tx) => getCallSelector(tx.data) === ERC20_APPROVE_SELECTOR); +} + +function buildLatestSnapshot(params: { + marketAddress: `0x${string}`; + timestamp: string; + position?: PerpetualPosition; + fallbackSizeUsd?: number; + fallbackOpenedAt?: string; + previous?: GmxLatestSnapshot; +}): GmxLatestSnapshot { + const positionSize = params.position ? parseUsdMetric(params.position.sizeInUsd) : undefined; + const totalUsd = positionSize ?? params.fallbackSizeUsd; + + const openedAt = params.position + ? parseEpochToIso(params.position.increasedAtTime) + : params.fallbackOpenedAt ?? params.previous?.positionOpenedAt; + + if (!params.position && totalUsd === undefined && params.previous) { + return { + ...params.previous, + timestamp: params.timestamp, + }; + } + + if (params.position) { + const collateralAddress = normalizeHexAddress( + params.position.collateralToken.tokenUid.address, + 'collateral token address', + ); + return { + poolAddress: normalizeHexAddress(params.position.marketAddress, 'market address'), + totalUsd, + timestamp: params.timestamp, + positionOpenedAt: openedAt, + positionTokens: [ + { + address: collateralAddress, + symbol: params.position.collateralToken.symbol, + decimals: params.position.collateralToken.decimals, + amountBaseUnits: params.position.collateralAmount, + valueUsd: totalUsd, + }, + ], + }; + } + + return { + poolAddress: params.marketAddress, + totalUsd, + timestamp: params.timestamp, + positionOpenedAt: openedAt, + positionTokens: [], + }; +} + export const pollCycleNode = async ( state: ClmmState, config: CopilotKitConfig, @@ -199,8 +318,8 @@ export const pollCycleNode = async ( let gmxMarketAddress: string; let positions: PerpetualPosition[] = []; + const onchainActionsClient = getOnchainActionsClient(); try { - const onchainActionsClient = getOnchainActionsClient(); const chainIds = [ARBITRUM_CHAIN_ID.toString()]; const [markets, walletPositions] = await Promise.all([ onchainActionsClient.listPerpetualMarkets({ chainIds }), @@ -244,7 +363,7 @@ export const pollCycleNode = async ( positions = walletPositions; } catch (error: unknown) { const message = error instanceof Error ? error.message : 'Unknown error'; - const failureMessage = `ERROR: Failed to fetch GMX markets/positions: ${message}`; + const failureMessage = `ERROR: Failed to fetch GMX markets/positions from ${ONCHAIN_ACTIONS_API_URL}: ${message}`; const { task, statusEvent } = buildTaskStatus(state.view.task, 'failed', failureMessage); await copilotkitEmitState(config, { view: { task, activity: { events: [statusEvent], telemetry: state.view.activity.telemetry } }, @@ -375,16 +494,10 @@ export const pollCycleNode = async ( } } - const telemetryEvent: ClmmEvent = { - type: 'artifact', - artifact: buildTelemetryArtifact(adjustedTelemetry), - append: true, - }; - const txExecutionMode = resolveGmxAlloraTxExecutionMode(); const clients = txExecutionMode === 'execute' ? getOnchainClients() : undefined; const executionResult = await executePerpetualPlan({ - client: getOnchainActionsClient(), + client: onchainActionsClient, clients, plan: executionPlan, txExecutionMode, @@ -393,11 +506,94 @@ export const pollCycleNode = async ( delegatorWalletAddress: operatorConfig.delegatorWalletAddress, delegateeWalletAddress: operatorConfig.delegateeWalletAddress, }); + const approvalOnlyExecution = + executionResult.ok && + (executionPlan.action === 'long' || executionPlan.action === 'short') && + isApprovalOnlyTransactions(executionResult.transactions); + + if (!executionResult.ok) { + const executionFailure = buildTaskStatus( + task, + 'working', + `[Cycle ${iteration}] execution failed: ${executionResult.error ?? 'Unknown error'}`, + ); + task = executionFailure.task; + statusEvent = executionFailure.statusEvent; + } else if (approvalOnlyExecution) { + const approvalStatus = buildTaskStatus( + task, + 'working', + `[Cycle ${iteration}] approval completed; waiting for executable GMX trade transaction.`, + ); + task = approvalStatus.task; + statusEvent = approvalStatus.statusEvent; + } + + const latestCycle = + approvalOnlyExecution + ? { + ...adjustedTelemetry, + action: 'hold' as const, + side: undefined, + leverage: undefined, + sizeUsd: undefined, + txHash: undefined, + reason: `${adjustedTelemetry.reason} Approval completed; waiting for executable GMX trade transaction.`, + } + : adjustedTelemetry; + + let positionAfterExecution = currentMarketPosition; + if (executionResult.ok && executionPlan.action !== 'none') { + try { + const refreshedPositions = await onchainActionsClient.listPerpetualPositions({ + walletAddress: operatorConfig.delegatorWalletAddress, + chainIds: [ARBITRUM_CHAIN_ID.toString()], + }); + positionAfterExecution = refreshedPositions.find( + (position) => position.marketAddress.toLowerCase() === normalizedTargetMarket, + ); + } catch (error: unknown) { + const message = error instanceof Error ? error.message : 'Unknown error'; + logInfo('Unable to refresh GMX position snapshot after execution', { error: message }); + } + } + + const fallbackSizeUsd = + approvalOnlyExecution + ? undefined + : executionResult.ok && executionPlan.action === 'close' + ? 0 + : executionResult.ok && (executionPlan.action === 'long' || executionPlan.action === 'short') + ? adjustedTelemetry.sizeUsd + : undefined; + + const latestSnapshot = buildLatestSnapshot({ + marketAddress: normalizeHexAddress(gmxMarketAddress, 'market address'), + timestamp: latestCycle.timestamp, + position: positionAfterExecution, + fallbackSizeUsd, + fallbackOpenedAt: + executionResult.ok && (executionPlan.action === 'long' || executionPlan.action === 'short') + ? latestCycle.timestamp + : undefined, + previous: state.view.metrics.latestSnapshot, + }); + + const hasCompletedTradeEffect = + executionResult.ok && executionPlan.action !== 'none' && !approvalOnlyExecution; + const lifetimePnlUsd = positionAfterExecution + ? parseUsdMetric(positionAfterExecution.pnl) + : executionResult.ok && executionPlan.action === 'close' + ? 0 + : state.view.metrics.lifetimePnlUsd; const nextAssumedPositionSide = (() => { if (!executionResult.ok) { return assumedPositionSide; } + if (approvalOnlyExecution) { + return assumedPositionSide; + } // Planned actions should advance local assumptions immediately so we don't // repeat stale intent on the next cycle. if (executionPlan.action === 'close') { @@ -410,8 +606,8 @@ export const pollCycleNode = async ( return 'short'; } // Otherwise, prefer actual onchain state when available. - if (currentPositionSide) { - return currentPositionSide; + if (positionAfterExecution?.positionSide) { + return positionAfterExecution.positionSide; } return assumedPositionSide; })(); @@ -420,7 +616,7 @@ export const pollCycleNode = async ( ? undefined : { type: 'artifact', - artifact: buildExecutionPlanArtifact({ plan: executionPlan, telemetry: adjustedTelemetry }), + artifact: buildExecutionPlanArtifact({ plan: executionPlan, telemetry: latestCycle }), append: true, }; const executionResultEvent: ClmmEvent | undefined = @@ -433,13 +629,18 @@ export const pollCycleNode = async ( plan: executionPlan, ok: executionResult.ok, error: executionResult.error, - telemetry: adjustedTelemetry, + telemetry: latestCycle, transactions: executionResult.transactions, txHashes: executionResult.txHashes, lastTxHash: executionResult.lastTxHash, }), append: true, }; + const telemetryEvent: ClmmEvent = { + type: 'artifact', + artifact: buildTelemetryArtifact(latestCycle), + append: true, + }; let cronScheduled = state.private.cronScheduled; const threadId = (config as Configurable).configurable?.thread_id; @@ -450,22 +651,25 @@ export const pollCycleNode = async ( cronScheduled = true; } - const resolvedTxHash = executionResult.lastTxHash ?? txHash; - const transactionEntry = resolvedTxHash - ? { - cycle: iteration, - action, - txHash: resolvedTxHash, - status: 'success' as const, - reason, - timestamp: adjustedTelemetry.timestamp, - } - : undefined; + const finalAction = latestCycle.action; + const finalReason = latestCycle.reason; + const resolvedTxHash = executionResult.lastTxHash ?? latestCycle.txHash; + const transactionEntry = + executionPlan.action !== 'none' + ? { + cycle: iteration, + action: finalAction, + txHash: resolvedTxHash, + status: executionResult.ok ? ('success' as const) : ('failed' as const), + reason: executionResult.ok ? finalReason : executionResult.error ?? finalReason, + timestamp: latestCycle.timestamp, + } + : undefined; const baseAum = state.view.profile.aum ?? 52_000; const baseIncome = state.view.profile.agentIncome ?? 5_400; - const aumDelta = action === 'hold' || action === 'cooldown' ? 10 : 180; - const incomeDelta = action === 'hold' || action === 'cooldown' ? 1.2 : 9.5; + const aumDelta = finalAction === 'hold' || finalAction === 'cooldown' ? 10 : 180; + const incomeDelta = finalAction === 'hold' || finalAction === 'cooldown' ? 1.2 : 9.5; const nextProfile = { ...state.view.profile, aum: Number((baseAum + aumDelta).toFixed(2)), @@ -478,20 +682,26 @@ export const pollCycleNode = async ( metrics: { lastSnapshot: selectedPool, previousPrice: prediction.predictedPrice, - cyclesSinceRebalance: nextCyclesSinceTrade, + cyclesSinceRebalance: approvalOnlyExecution + ? (state.view.metrics.cyclesSinceRebalance ?? 0) + 1 + : nextCyclesSinceTrade, staleCycles: state.view.metrics.staleCycles ?? 0, iteration, - latestCycle: adjustedTelemetry, + latestCycle, + aumUsd: latestSnapshot.totalUsd, + apy: state.view.metrics.apy ?? state.view.profile.apy, + lifetimePnlUsd, + latestSnapshot, assumedPositionSide: nextAssumedPositionSide, lastInferenceSnapshotKey: inferenceSnapshotKey, lastTradedInferenceSnapshotKey: - executionPlan.action !== 'none' && executionResult.ok && inferenceSnapshotKey + hasCompletedTradeEffect && inferenceSnapshotKey ? inferenceSnapshotKey : state.view.metrics.lastTradedInferenceSnapshotKey, }, task, activity: { - telemetry: [adjustedTelemetry], + telemetry: [latestCycle], events: executionPlanEvent ? executionResultEvent ? [telemetryEvent, executionPlanEvent, executionResultEvent, statusEvent] diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/seedData.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/seedData.ts index 312ea5e7..6aed01fd 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/seedData.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/seedData.ts @@ -1,3 +1,5 @@ +import { ROOT_AUTHORITY } from '@metamask/delegation-toolkit'; + import type { AlloraPrediction, GmxMarket } from '../domain/types.js'; import type { DelegationIntentSummary, FundingTokenOption, UnsignedDelegation } from './context.js'; @@ -5,14 +7,14 @@ import type { DelegationIntentSummary, FundingTokenOption, UnsignedDelegation } const ZERO_WORD = `0x${'0'.repeat(64)}` as const; const SALT_WORD = `0x${'1'.repeat(64)}` as const; -const USDC_ADDRESS = '0x1111111111111111111111111111111111111111' as const; -const USDT_ADDRESS = '0x2222222222222222222222222222222222222222' as const; -const WETH_ADDRESS = '0x3333333333333333333333333333333333333333' as const; -const ARB_ADDRESS = '0x4444444444444444444444444444444444444444' as const; +const USDC_ADDRESS = '0xaf88d065e77c8cc2239327c5edb3a432268e5831' as const; +const USDT_ADDRESS = '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9' as const; +const WETH_ADDRESS = '0x82af49447d8a07e3bd95bd0d56f35241523fbab1' as const; +const ARB_ADDRESS = '0x912ce59144191c1204e64559fe8253a0e49e6548' as const; export const MARKETS: GmxMarket[] = [ { - address: '0xaaaa000000000000000000000000000000000101', + address: '0x47c031236e19d024b42f8ae6780e44a573170703', baseSymbol: 'BTC', quoteSymbol: 'USDC', token0: { symbol: 'BTC' }, @@ -20,7 +22,7 @@ export const MARKETS: GmxMarket[] = [ maxLeverage: 2, }, { - address: '0xaaaa000000000000000000000000000000000102', + address: '0x70d95587d40a2caf56bd97485ab3eec10bee6336', baseSymbol: 'ETH', quoteSymbol: 'USDC', token0: { symbol: 'ETH' }, @@ -104,7 +106,7 @@ export function buildDelegations(params: { { delegate: params.delegateeAddress, delegator: params.delegatorAddress, - authority: ZERO_WORD, + authority: ROOT_AUTHORITY, // Keep this open for now; in production we'd want to constrain scope via caveats. caveats: [], salt: SALT_WORD, diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/onboarding.int.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/onboarding.int.test.ts index 87846031..32f681f4 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/onboarding.int.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/onboarding.int.test.ts @@ -1,15 +1,16 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import type { PerpetualMarket } from '../src/clients/onchainActions.js'; import type { ClmmState } from '../src/workflow/context.js'; import { collectDelegationsNode } from '../src/workflow/nodes/collectDelegations.js'; import { collectFundingTokenInputNode } from '../src/workflow/nodes/collectFundingTokenInput.js'; import { collectSetupInputNode } from '../src/workflow/nodes/collectSetupInput.js'; import { prepareOperatorNode } from '../src/workflow/nodes/prepareOperator.js'; -import { FUNDING_TOKENS } from '../src/workflow/seedData.js'; -const { copilotkitEmitStateMock, interruptMock } = vi.hoisted(() => ({ +const { copilotkitEmitStateMock, interruptMock, listPerpetualMarketsMock } = vi.hoisted(() => ({ copilotkitEmitStateMock: vi.fn(async () => undefined), interruptMock: vi.fn<[], Promise>(), + listPerpetualMarketsMock: vi.fn<[], Promise>(), })); vi.mock('@copilotkit/sdk-js/langgraph', () => ({ @@ -24,6 +25,13 @@ vi.mock('@langchain/langgraph', async () => { }; }); +vi.mock('../src/workflow/clientFactory.js', () => ({ + getOnchainActionsClient: () => ({ + listPerpetualMarkets: listPerpetualMarketsMock, + }), + getOnchainClients: vi.fn(), +})); + function buildBaseState(): ClmmState { return { messages: [], @@ -104,6 +112,7 @@ function mergeState(state: ClmmState, update: Partial): ClmmState { afterEach(() => { copilotkitEmitStateMock.mockReset(); interruptMock.mockReset(); + listPerpetualMarketsMock.mockReset(); }); describe('GMX Allora onboarding (integration)', () => { @@ -116,12 +125,51 @@ describe('GMX Allora onboarding (integration)', () => { }); it('collects USDC allocation and prepares operator config', async () => { + listPerpetualMarketsMock.mockResolvedValueOnce([ + { + marketToken: { chainId: '42161', address: '0x70d95587d40a2caf56bd97485ab3eec10bee6336' }, + longFundingFee: '0', + shortFundingFee: '0', + longBorrowingFee: '0', + shortBorrowingFee: '0', + chainId: '42161', + name: 'ETH/USD [WETH-USDC]', + indexToken: { + tokenUid: { chainId: '42161', address: '0x0000000000000000000000000000000000000000' }, + name: 'Ethereum', + symbol: 'ETH', + isNative: true, + decimals: 18, + iconUri: null, + isVetted: true, + }, + longToken: { + tokenUid: { chainId: '42161', address: '0x82af49447d8a07e3bd95bd0d56f35241523fbab1' }, + name: 'Wrapped Ether', + symbol: 'WETH', + isNative: false, + decimals: 18, + iconUri: null, + isVetted: true, + }, + shortToken: { + tokenUid: { chainId: '42161', address: '0xaf88d065e77c8cc2239327c5edb3a432268e5831' }, + name: 'USDC', + symbol: 'USDC', + isNative: false, + decimals: 6, + iconUri: null, + isVetted: true, + }, + }, + ]); + const state = buildBaseState(); interruptMock.mockResolvedValueOnce({ walletAddress: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', usdcAllocation: 250, - targetMarket: 'BTC', + targetMarket: 'ETH', }); const setupUpdate = await collectSetupInputNode(state, {}); @@ -137,10 +185,57 @@ describe('GMX Allora onboarding (integration)', () => { expect(prepared.view?.operatorConfig?.baseContributionUsd).toBe(250); expect(prepared.view?.operatorConfig?.fundingTokenAddress).toBe( - FUNDING_TOKENS.find((token) => token.symbol === 'USDC')?.address, + '0xaf88d065e77c8cc2239327c5edb3a432268e5831', ); }); + it('skips delegation signing interrupts when bypass is active', async () => { + const state = buildBaseState(); + state.view.delegationsBypassActive = true; + + const update = await collectDelegationsNode(state, {}); + + expect(interruptMock).not.toHaveBeenCalled(); + expect(update.view?.onboarding?.step).toBe(3); + }); + + it('omits testing warning in production-mode delegation requests', async () => { + const state = buildBaseState(); + state.view.delegationsBypassActive = false; + state.private.mode = 'production'; + state.view.operatorInput = { + walletAddress: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', + usdcAllocation: 10, + targetMarket: 'ETH', + }; + + interruptMock.mockResolvedValueOnce({ outcome: 'rejected' }); + + await collectDelegationsNode(state, {}); + + expect(interruptMock).toHaveBeenCalledTimes(1); + const request = interruptMock.mock.calls[0]?.[0] as { warnings?: string[] }; + expect(request.warnings).toEqual([]); + }); + + it('includes testing warning in debug-mode delegation requests', async () => { + const state = buildBaseState(); + state.view.delegationsBypassActive = false; + state.private.mode = 'debug'; + state.view.operatorInput = { + walletAddress: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', + usdcAllocation: 10, + targetMarket: 'ETH', + }; + + interruptMock.mockResolvedValueOnce({ outcome: 'rejected' }); + + await collectDelegationsNode(state, {}); + + const request = interruptMock.mock.calls[0]?.[0] as { warnings?: string[] }; + expect(request.warnings).toEqual(['This delegation flow is for testing only.']); + }); + it('rejects setup input without USDC allocation', async () => { const state = buildBaseState(); diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts index e70ee4e2..e5d3fe97 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts @@ -2,6 +2,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; import type { AlloraInference } from '../src/clients/allora.js'; import type { PerpetualMarket, PerpetualPosition } from '../src/clients/onchainActions.js'; +import { ONCHAIN_ACTIONS_API_URL } from '../src/config/constants.js'; import type { ClmmState } from '../src/workflow/context.js'; import { pollCycleNode } from '../src/workflow/nodes/pollCycle.js'; @@ -163,6 +164,14 @@ const baseMarket: PerpetualMarket = { }, }; +const approvalOnlyTransaction = { + type: 'transaction', + to: '0xaf88d065e77c8cc2239327c5edb3a432268e5831', + data: '0x095ea7b30000000000000000000000001111111111111111111111111111111111111111', + value: '0', + chainId: '42161', +}; + describe('pollCycleNode (integration)', () => { beforeEach(() => { fetchAlloraInferenceMock.mockReset(); @@ -194,6 +203,24 @@ describe('pollCycleNode (integration)', () => { expect(statusMessages.join(' ')).toContain('WARNING'); }); + it('surfaces onchain-actions endpoint in GMX markets/positions fetch failures', async () => { + fetchAlloraInferenceMock.mockResolvedValueOnce({ + topicId: 14, + combinedValue: 47000, + confidenceIntervalValues: [46000, 46500, 47000, 47500, 48000], + }); + listPerpetualMarketsMock.mockRejectedValueOnce(new TypeError('fetch failed')); + + const state = buildBaseState(); + const result = await pollCycleNode(state, {}); + const update = (result as { update: ClmmState }).update; + + expect(update.view?.haltReason).toContain( + `ERROR: Failed to fetch GMX markets/positions from ${ONCHAIN_ACTIONS_API_URL}`, + ); + expect(update.view?.haltReason).toContain('fetch failed'); + }); + it('emits telemetry and execution plan artifacts on open action', async () => { fetchAlloraInferenceMock.mockResolvedValueOnce({ topicId: 14, @@ -202,8 +229,10 @@ describe('pollCycleNode (integration)', () => { }); listPerpetualMarketsMock.mockResolvedValueOnce([baseMarket]); listPerpetualPositionsMock.mockResolvedValueOnce([]); + createPerpetualLongMock.mockResolvedValueOnce({ transactions: [] }); const state = buildBaseState(); + state.view.metrics.previousPrice = 46000; const result = await pollCycleNode(state, {}); const update = (result as { update: ClmmState }).update; @@ -214,6 +243,7 @@ describe('pollCycleNode (integration)', () => { expect(artifactIds).toContain('gmx-allora-telemetry'); expect(artifactIds).toContain('gmx-allora-execution-plan'); + expect(update.view?.metrics.latestSnapshot?.totalUsd).toBeGreaterThan(0); }); it('routes open long decisions to createPerpetualLong', async () => { @@ -350,6 +380,80 @@ describe('pollCycleNode (integration)', () => { expect(createPerpetualCloseMock).toHaveBeenCalledTimes(1); }); + it('retries open trades when the prior cycle only submitted approval transactions', async () => { + fetchAlloraInferenceMock + .mockResolvedValueOnce({ + topicId: 14, + combinedValue: 47000, + confidenceIntervalValues: [46000, 46500, 47000, 47500, 48000], + }) + .mockResolvedValueOnce({ + topicId: 14, + combinedValue: 47000, + confidenceIntervalValues: [46000, 46500, 47000, 47500, 48000], + }); + listPerpetualMarketsMock.mockResolvedValue([baseMarket]); + listPerpetualPositionsMock.mockResolvedValue([]); + createPerpetualLongMock.mockResolvedValue({ transactions: [approvalOnlyTransaction] }); + + const firstState = buildBaseState(); + firstState.view.metrics.previousPrice = 46000; + const firstResult = await pollCycleNode(firstState, {}); + + const firstUpdate = (firstResult as { update: { view?: { metrics?: ClmmState['view']['metrics'] } } }) + .update; + + const secondState = buildBaseState(); + secondState.view.metrics = { + ...secondState.view.metrics, + ...(firstUpdate.view?.metrics ?? {}), + }; + secondState.view.metrics.latestCycle = firstUpdate.view?.metrics?.latestCycle; + secondState.view.metrics.previousPrice = firstUpdate.view?.metrics?.previousPrice; + + await pollCycleNode(secondState, {}); + + expect(createPerpetualLongMock).toHaveBeenCalledTimes(2); + }); + + it('preserves the last known position snapshot when no fresh position snapshot is available', async () => { + fetchAlloraInferenceMock + .mockResolvedValueOnce({ + topicId: 14, + combinedValue: 47000, + confidenceIntervalValues: [46000, 46500, 47000, 47500, 48000], + }) + .mockResolvedValueOnce({ + topicId: 14, + combinedValue: 47000, + confidenceIntervalValues: [46000, 46500, 47000, 47500, 48000], + }); + listPerpetualMarketsMock.mockResolvedValue([baseMarket]); + listPerpetualPositionsMock.mockResolvedValue([]); + createPerpetualLongMock.mockResolvedValueOnce({ transactions: [] }); + + const firstState = buildBaseState(); + firstState.view.metrics.previousPrice = 46000; + const firstResult = await pollCycleNode(firstState, {}); + const firstUpdate = (firstResult as { update: ClmmState }).update; + const firstSnapshot = firstUpdate.view?.metrics.latestSnapshot; + expect(firstSnapshot?.totalUsd).toBeGreaterThan(0); + + const secondState = buildBaseState(); + secondState.view.metrics = { + ...secondState.view.metrics, + ...(firstUpdate.view?.metrics ?? {}), + }; + secondState.view.metrics.assumedPositionSide = firstUpdate.view?.metrics.assumedPositionSide; + secondState.view.metrics.latestCycle = firstUpdate.view?.metrics.latestCycle; + secondState.view.metrics.previousPrice = firstUpdate.view?.metrics.previousPrice; + + const secondResult = await pollCycleNode(secondState, {}); + const secondUpdate = (secondResult as { update: ClmmState }).update; + + expect(secondUpdate.view?.metrics.latestSnapshot?.totalUsd).toBe(firstSnapshot?.totalUsd); + }); + it('executes reduce plans via onchain-actions reduce endpoint when position exists', async () => { fetchAlloraInferenceMock.mockResolvedValueOnce({ topicId: 14, diff --git a/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.gmxAllora.unit.test.ts b/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.gmxAllora.unit.test.ts index 6f9ae8d6..9b1a9170 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.gmxAllora.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.gmxAllora.unit.test.ts @@ -57,4 +57,134 @@ describe('AgentDetailPage (GMX Allora)', () => { expect(html).not.toContain('>Latest Signal<'); expect(html).not.toContain('>Latest Plan<'); }); + + it('renders GMX execution and signal fields instead of CLMM-only metrics labels', () => { + const html = renderToStaticMarkup( + React.createElement(AgentDetailPage, { + agentId: 'agent-gmx-allora', + agentName: 'GMX Allora Trader', + agentDescription: 'Trades GMX perps using Allora 8-hour prediction feeds.', + creatorName: 'Ember AI Team', + creatorVerified: true, + ownerAddress: undefined, + rank: 3, + rating: 5, + avatar: '📈', + avatarBg: 'linear-gradient(135deg, #22c55e 0%, #16a34a 100%)', + profile: { + chains: ['Arbitrum One'], + protocols: ['GMX', 'Allora'], + tokens: ['USDC'], + agentIncome: 4109.5, + aum: 42180, + apy: 9.2, + totalUsers: 58, + }, + metrics: { + iteration: 1, + cyclesSinceRebalance: 0, + staleCycles: 0, + aumUsd: 8, + apy: 9.2, + lifetimePnlUsd: 0, + }, + fullMetrics: { + cyclesSinceRebalance: 0, + staleCycles: 0, + iteration: 1, + previousPrice: 67602.611, + latestCycle: { + cycle: 1, + action: 'open', + reason: 'Signal confidence 1 >= 0.62; opening long position.', + marketSymbol: 'BTC/USDC', + side: 'long', + leverage: 2, + sizeUsd: 10, + txHash: '0xb24f42dbfc6c0a30c16b7660ad5878a2a92abfb53a5ce02609bfd7e06a2cde7e', + timestamp: '2026-02-12T02:11:35.221Z', + prediction: { + topic: 'allora:btc:8h', + horizonHours: 8, + confidence: 1, + direction: 'up', + predictedPrice: 67603, + timestamp: '2026-02-12T02:11:30.000Z', + }, + metrics: { + confidence: 1, + decisionThreshold: 0.62, + cooldownRemaining: 0, + }, + }, + latestSnapshot: { + poolAddress: '0x47c031236e19d024b42f8AE6780E44A573170703', + totalUsd: 8, + timestamp: '2026-02-12T02:11:35.221Z', + positionTokens: [], + }, + }, + isHired: false, + isHiring: false, + isFiring: false, + isSyncing: false, + currentCommand: undefined, + onHire: () => {}, + onFire: () => {}, + onSync: () => {}, + onBack: () => {}, + activeInterrupt: undefined, + allowedPools: [], + onInterruptSubmit: () => {}, + taskId: undefined, + taskStatus: undefined, + haltReason: undefined, + executionError: undefined, + delegationsBypassActive: undefined, + onboarding: undefined, + transactions: [ + { + cycle: 1, + action: 'open', + txHash: '0xb24f42dbfc6c0a30c16b7660ad5878a2a92abfb53a5ce02609bfd7e06a2cde7e', + status: 'success', + timestamp: '2026-02-12T02:11:35.221Z', + }, + ], + telemetry: [], + events: [ + { + type: 'artifact', + artifact: { + artifactId: 'gmx-allora-execution-result', + description: + 'Rebalance: OPEN LONG 2x $10.00 · Allora 8h signal: bullish · confidence 100% · tx 0xb24f42...', + parts: [ + { + kind: 'data', + data: { + ok: true, + txHashes: [ + '0xe62fc16e0f8e3dcdd8fdb429a6d43a29921fa7ee1cdea9b861fc29d9f0e38854', + '0xb24f42dbfc6c0a30c16b7660ad5878a2a92abfb53a5ce02609bfd7e06a2cde7e', + ], + lastTxHash: + '0xb24f42dbfc6c0a30c16b7660ad5878a2a92abfb53a5ce02609bfd7e06a2cde7e', + }, + }, + ], + }, + }, + ], + settings: undefined, + onSettingsChange: () => {}, + }), + ); + + expect(html).toContain('Latest Execution'); + expect(html).toContain('Signal Confidence'); + expect(html).toContain('Transaction Hashes'); + expect(html).toContain('https://arbiscan.io/tx/0xb24f42dbfc6c0a30c16b7660ad5878a2a92abfb53a5ce02609bfd7e06a2cde7e'); + expect(html).not.toContain('Rebalance Cycles'); + }); }); diff --git a/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.tsx b/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.tsx index 89c6361b..4403dd20 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.tsx +++ b/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.tsx @@ -356,7 +356,14 @@ export function AgentDetailPage({ )} {resolvedTab === 'metrics' && ( - + )} {resolvedTab === 'transactions' && } @@ -498,7 +505,14 @@ export function AgentDetailPage({ {activeTab === 'metrics' && ( - + )} @@ -667,6 +681,11 @@ function AgentBlockersTab({ settings, onSettingsChange, }: AgentBlockersTabProps) { + const preferredDelegatorAddress = + activeInterrupt && 'delegatorAddress' in activeInterrupt + ? activeInterrupt.delegatorAddress + : undefined; + const { walletClient, privyWallet, @@ -674,7 +693,7 @@ function AgentBlockersTab({ switchChain, isLoading: isWalletLoading, error: walletError, - } = usePrivyWalletClient(); + } = usePrivyWalletClient(preferredDelegatorAddress); const delegationsBypassEnabled = (typeof process !== 'undefined' ? process.env.NEXT_PUBLIC_DELEGATIONS_BYPASS : undefined) === 'true'; @@ -993,6 +1012,7 @@ function AgentBlockersTab({ const interrupt = activeInterrupt as unknown as { chainId: number; delegationManager: `0x${string}`; + delegatorAddress: `0x${string}`; delegationsToSign: UnsignedDelegation[]; }; @@ -1013,15 +1033,33 @@ function AgentBlockersTab({ return; } + const requiredDelegatorAddress = interrupt.delegatorAddress.toLowerCase(); + const signerAddress = walletClient.account?.address?.toLowerCase(); + if (!signerAddress || signerAddress !== requiredDelegatorAddress) { + setError( + `Switch to Privy wallet ${interrupt.delegatorAddress} to sign delegations. Current signer: ${ + walletClient.account?.address ?? 'unknown' + }.`, + ); + return; + } + setIsSigningDelegations(true); try { const signedDelegations = []; for (const delegation of delegationsToSign) { + if (delegation.delegator.toLowerCase() !== requiredDelegatorAddress) { + throw new Error( + `Delegation delegator ${delegation.delegator} does not match required signer ${interrupt.delegatorAddress}.`, + ); + } + const allowInsecureUnrestrictedDelegation = delegation.caveats.length === 0; const signature = await signDelegation(walletClient, { delegation, delegationManager: interrupt.delegationManager, chainId: interrupt.chainId, - account: walletClient.account, + account: interrupt.delegatorAddress, + allowInsecureUnrestrictedDelegation, }); signedDelegations.push({ ...delegation, signature }); } @@ -1649,10 +1687,12 @@ function PointsColumn({ metrics }: PointsColumnProps) { // Metrics Tab Component interface MetricsTabProps { + agentId: string; profile: AgentProfile; metrics: AgentMetrics; fullMetrics?: AgentViewMetrics; events: ClmmEvent[]; + transactions: Transaction[]; } type UnknownRecord = Record; @@ -1679,7 +1719,83 @@ function getNumberField(value: unknown, key: string): number | undefined { return typeof candidate === 'number' ? candidate : undefined; } -function MetricsTab({ profile, metrics, fullMetrics, events }: MetricsTabProps) { +function getBooleanField(value: unknown, key: string): boolean | undefined { + const record = asRecord(value); + const candidate = record ? record[key] : undefined; + return typeof candidate === 'boolean' ? candidate : undefined; +} + +function getArrayField(value: unknown, key: string): unknown[] | undefined { + const record = asRecord(value); + const candidate = record ? record[key] : undefined; + return Array.isArray(candidate) ? candidate : undefined; +} + +function getArtifactId(artifact: unknown): string | undefined { + const name = getStringField(artifact, 'name'); + if (name && name.trim().length > 0) return name; + + const artifactId = getStringField(artifact, 'artifactId'); + if (artifactId && artifactId.trim().length > 0) return artifactId; + + const type = getStringField(artifact, 'type'); + if (type && type.trim().length > 0) return type; + + const id = getStringField(artifact, 'id'); + if (id && id.trim().length > 0) return id; + + return undefined; +} + +function getArtifactDescription(artifact: unknown): string | undefined { + const description = getStringField(artifact, 'description'); + return description && description.trim().length > 0 ? description : undefined; +} + +function getArtifactDataPart(artifact: unknown): UnknownRecord | undefined { + const parts = getArrayField(artifact, 'parts'); + if (parts) { + for (const part of parts) { + const record = asRecord(part); + if (!record) continue; + if (record['kind'] === 'data') { + const dataRecord = asRecord(record['data']); + if (dataRecord) return dataRecord; + } + } + } + + return getNestedRecord(artifact, 'data'); +} + +function toArbiscanTxUrl(txHash: string): string { + return `https://arbiscan.io/tx/${txHash}`; +} + +function MetricsTab({ agentId, profile, metrics, fullMetrics, events, transactions }: MetricsTabProps) { + if (agentId === 'agent-pendle') { + return ( + + ); + } + + if (agentId === 'agent-gmx-allora') { + return ( + + ); + } + const isRecord = (value: unknown): value is Record => typeof value === 'object' && value !== null && !Array.isArray(value); @@ -1936,7 +2052,293 @@ function MetricsTab({ profile, metrics, fullMetrics, events }: MetricsTabProps) ); } -function PendleMetricsTab({ profile, metrics, fullMetrics, events }: Omit) { +function GmxAlloraMetricsTab({ + profile, + metrics, + fullMetrics, + events, + transactions, +}: Omit) { + const formatDate = (timestamp?: string) => { + if (!timestamp) return '—'; + const date = new Date(timestamp); + if (Number.isNaN(date.getTime())) return '—'; + return date.toLocaleString(undefined, { + month: 'short', + day: 'numeric', + hour: '2-digit', + minute: '2-digit', + }); + }; + + const formatUsd = (value?: number, maxFractionDigits = 2): string => { + if (value === undefined) return '—'; + return `$${value.toLocaleString(undefined, { maximumFractionDigits: maxFractionDigits })}`; + }; + + const latestCycle = fullMetrics?.latestCycle; + const latestSnapshot = fullMetrics?.latestSnapshot; + const latestPrediction = latestCycle?.prediction; + const latestDecisionMetrics = latestCycle?.metrics; + const latestTransaction = transactions.at(-1); + + let latestExecutionData: UnknownRecord | undefined; + for (let index = events.length - 1; index >= 0; index -= 1) { + const event = events[index]; + if (!event || event.type !== 'artifact') continue; + if (getArtifactId(event.artifact) !== 'gmx-allora-execution-result') continue; + latestExecutionData = getArtifactDataPart(event.artifact); + break; + } + + const artifactTxHashes = + getArrayField(latestExecutionData, 'txHashes') + ?.filter((value): value is string => typeof value === 'string') + .filter((value) => /^0x[0-9a-fA-F]{64}$/.test(value)) ?? []; + + const executionHashCandidates = [ + ...artifactTxHashes, + getStringField(latestExecutionData, 'lastTxHash'), + latestTransaction?.txHash, + latestCycle?.txHash, + ]; + + const executionTxHashes = Array.from( + new Set( + executionHashCandidates.filter( + (value): value is string => typeof value === 'string' && /^0x[0-9a-fA-F]{64}$/.test(value), + ), + ), + ); + + const executionOk = getBooleanField(latestExecutionData, 'ok'); + const executionError = getStringField(latestExecutionData, 'error'); + const executionStatus = + executionOk === true + ? 'confirmed' + : executionOk === false + ? 'failed' + : latestTransaction?.status === 'success' + ? 'confirmed' + : latestTransaction?.status === 'failed' + ? 'failed' + : 'pending'; + const marketLabel = latestCycle?.marketSymbol ?? formatPoolPair(fullMetrics?.lastSnapshot); + const sideLabel = latestCycle?.side ? latestCycle.side.toUpperCase() : '—'; + const positionStatus = + latestCycle?.action === 'close' ? 'Closed' : latestSnapshot?.totalUsd && latestSnapshot.totalUsd > 0 ? 'Open' : 'Pending'; + + return ( +
+
+

Strategy Performance

+
+
+
APY
+
+ {metrics.apy !== undefined ? `${metrics.apy.toFixed(1)}%` : profile.apy !== undefined ? `${profile.apy.toFixed(1)}%` : '—'} +
+
+
+
AUM
+
+ {metrics.aumUsd !== undefined + ? formatUsd(metrics.aumUsd) + : profile.aum !== undefined + ? formatUsd(profile.aum) + : '—'} +
+
+
+
Agent Income
+
+ {profile.agentIncome !== undefined ? formatUsd(profile.agentIncome) : '—'} +
+
+
+
PnL
+
+ {metrics.lifetimePnlUsd !== undefined ? formatUsd(metrics.lifetimePnlUsd) : '—'} +
+
+
+
+ +
+
+

Latest Execution

+ + {executionStatus} + +
+
+
+
Action
+
{latestCycle?.action ?? '—'}
+
+
+
Market
+
{marketLabel}
+
+
+
Position Side
+
{sideLabel}
+
+
+
Executed At
+
{formatDate(latestTransaction?.timestamp ?? latestCycle?.timestamp)}
+
+
+ {executionError && ( +
+ {executionError} +
+ )} +
+
Transaction Hashes
+ {executionTxHashes.length > 0 ? ( +
+ {executionTxHashes.map((txHash) => ( + + {txHash} + + ))} +
+ ) : ( +
No transaction hash yet.
+ )} +
+
+ +
+

Perp Position + Allora Signal

+
+
+
Position Status
+
{positionStatus}
+
+
+
Position Size
+
{formatUsd(latestSnapshot?.totalUsd)}
+
+
+
Leverage
+
+ {latestCycle?.leverage !== undefined ? `${latestCycle.leverage}x` : '—'} +
+
+
+
Notional
+
{formatUsd(latestCycle?.sizeUsd)}
+
+
+
Signal Direction
+
{latestPrediction?.direction ?? '—'}
+
+
+
Signal Confidence
+
+ {latestPrediction?.confidence !== undefined + ? `${(latestPrediction.confidence * 100).toFixed(1)}%` + : '—'} +
+
+
+
Predicted Price
+
{formatUsd(latestPrediction?.predictedPrice, 6)}
+
+
+
Decision Threshold
+
+ {latestDecisionMetrics?.decisionThreshold !== undefined + ? `${(latestDecisionMetrics.decisionThreshold * 100).toFixed(1)}%` + : '—'} +
+
+
+
+
+
Cycle
+
{metrics.iteration ?? '—'}
+
+
+
Cycles Since Trade
+
{metrics.cyclesSinceRebalance ?? '—'}
+
+
+
Stale Signal Cycles
+
{metrics.staleCycles ?? '—'}
+
+
+
Reference Price
+
+ {fullMetrics?.previousPrice !== undefined ? fullMetrics.previousPrice.toFixed(6) : '—'} +
+
+
+
+ + {events.length > 0 && ( +
+

Activity Stream

+
+ {events + .slice(-10) + .reverse() + .map((event, index) => { + const artifactId = event.type === 'artifact' ? getArtifactId(event.artifact) : undefined; + const description = event.type === 'artifact' ? getArtifactDescription(event.artifact) : undefined; + return ( +
+
+
+
{event.type}
+
+ {event.type === 'status' && event.message} + {event.type === 'artifact' && `Artifact: ${artifactId ?? 'unknown'}`} + {event.type === 'dispatch-response' && + `Response with ${event.parts?.length ?? 0} parts`} +
+ {description &&
{description}
} +
+
+ ); + })} +
+
+ )} +
+ ); +} + +function PendleMetricsTab({ + profile: _profile, + metrics, + fullMetrics, + events: _events, +}: Omit) { const formatDate = (timestamp?: string) => { if (!timestamp) return '—'; const date = new Date(timestamp); @@ -2149,9 +2551,6 @@ function PendleMetricsTab({ profile, metrics, fullMetrics, events }: Omit { + if (!value) return null; + return value.trim().toLowerCase(); + }; + + const preferredAddress = normalizeAddress(preferredWalletAddress); + const privyWallet = useMemo(() => { + if (preferredAddress) { + return wallets.find((wallet) => wallet.address.toLowerCase() === preferredAddress) ?? null; + } return wallets.find((wallet) => wallet.walletClientType === 'privy') ?? null; - }, [wallets]); + }, [wallets, preferredAddress]); useEffect(() => { if (!privyWallet) return; diff --git a/typescript/clients/web-ag-ui/apps/web/src/types/agent.ts b/typescript/clients/web-ag-ui/apps/web/src/types/agent.ts index 3af389f3..ab8ff184 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/types/agent.ts +++ b/typescript/clients/web-ag-ui/apps/web/src/types/agent.ts @@ -61,13 +61,29 @@ export interface TelemetryItem { action: string; reason?: string; midPrice?: number; + marketSymbol?: string; + side?: 'long' | 'short'; + leverage?: number; + sizeUsd?: number; + txHash?: `0x${string}`; apy?: number; ytSymbol?: string; + prediction?: { + topic: string; + horizonHours: number; + confidence: number; + direction: 'up' | 'down'; + predictedPrice: number; + timestamp: string; + }; metrics?: { bestApy?: number; currentApy?: number; apyDelta?: number; rebalanceThresholdPct?: number; + confidence?: number; + decisionThreshold?: number; + cooldownRemaining?: number; }; timestamp?: string; } @@ -101,9 +117,17 @@ export interface PendleStrategyMetric { // Event types for activity streaming export interface Artifact { - id: string; - type: string; - data: unknown; + id?: string; + type?: string; + data?: unknown; + artifactId?: string; + name?: string; + description?: string; + parts?: Array<{ + kind: string; + text?: string; + data?: unknown; + }>; } export type ClmmEvent = diff --git a/typescript/clients/web-ag-ui/scripts/reset-dev-stack.sh b/typescript/clients/web-ag-ui/scripts/reset-dev-stack.sh index b8bea423..286c9bbe 100755 --- a/typescript/clients/web-ag-ui/scripts/reset-dev-stack.sh +++ b/typescript/clients/web-ag-ui/scripts/reset-dev-stack.sh @@ -3,8 +3,8 @@ set -u # Web QA uses 3000, LangGraph dev servers use 8123-8126. -# onchain-actions defaults to 3001 but local dev commonly runs it on 50051. -ports=(3000 3001 3002 3003 3004 3005 8123 8124 8125 8126 50051) +# Keep 50051 untouched so external onchain-actions dev sessions are not killed. +ports=(3000 3001 3002 3003 3004 3005 8123 8124 8125 8126) repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)" @@ -118,7 +118,7 @@ kill_pnpm_dev() { } cleanup_state() { - rm -rf apps/agent-clmm/.langgraph_api apps/agent/.langgraph_api apps/agent-pendle/.langgraph_api apps/agent-gmx-allora/.langgraph_api apps/web/.next/dev/lock + rm -rf apps/agent-clmm/.langgraph_api apps/agent/.langgraph_api apps/agent-pendle/.langgraph_api apps/agent-gmx-allora/.langgraph_api apps/web/.next } kill_ports From 88dbdf2abd212699054bc3001919d267a220bc9a Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Wed, 11 Feb 2026 21:57:12 -0500 Subject: [PATCH 67/70] fix(web-ag-ui): correct gmx existing-position leverage metrics --- .../agent-gmx-allora/src/workflow/context.ts | 1 + .../src/workflow/nodes/pollCycle.ts | 38 ++++++++- .../tests/pollCycle.int.test.ts | 56 +++++++++++++ .../AgentDetailPage.gmxAllora.unit.test.ts | 83 +++++++++++++++++++ .../web/src/components/AgentDetailPage.tsx | 6 +- .../web-ag-ui/apps/web/src/types/agent.ts | 1 + 6 files changed, 182 insertions(+), 3 deletions(-) diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/context.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/context.ts index 0a995684..922fe13e 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/context.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/context.ts @@ -74,6 +74,7 @@ export type ClmmTransaction = { export type GmxLatestSnapshot = { poolAddress?: `0x${string}`; totalUsd?: number; + leverage?: number; feesUsd?: number; feesApy?: number; timestamp?: string; diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts index 01805ead..9cc6b3a9 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/workflow/nodes/pollCycle.ts @@ -104,6 +104,27 @@ function parseUsdMetric(raw: string | undefined): number | undefined { return Number.isFinite(value) ? value : undefined; } +function parseBaseUnitAmount(raw: string | undefined, decimals: number): number | undefined { + if (!raw) { + return undefined; + } + if (!Number.isInteger(decimals) || decimals < 0) { + return undefined; + } + const normalized = raw.trim(); + if (!/^-?\d+$/u.test(normalized)) { + return undefined; + } + + const base = 10n ** BigInt(decimals); + const value = BigInt(normalized); + const sign = value < 0n ? -1 : 1; + const abs = value < 0n ? -value : value; + const integerPart = abs / base; + const fractionalPart = abs % base; + return sign * (Number(integerPart) + Number(fractionalPart) / Number(base)); +} + function parseEpochToIso(raw: string | undefined): string | undefined { if (!raw) { return undefined; @@ -140,11 +161,20 @@ function buildLatestSnapshot(params: { timestamp: string; position?: PerpetualPosition; fallbackSizeUsd?: number; + fallbackLeverage?: number; fallbackOpenedAt?: string; previous?: GmxLatestSnapshot; }): GmxLatestSnapshot { const positionSize = params.position ? parseUsdMetric(params.position.sizeInUsd) : undefined; const totalUsd = positionSize ?? params.fallbackSizeUsd; + const collateralUsd = params.position + ? parseBaseUnitAmount(params.position.collateralAmount, params.position.collateralToken.decimals) + : undefined; + const derivedLeverage = + positionSize !== undefined && collateralUsd !== undefined && collateralUsd > 0 + ? positionSize / collateralUsd + : undefined; + const leverage = derivedLeverage ?? params.fallbackLeverage ?? params.previous?.leverage; const openedAt = params.position ? parseEpochToIso(params.position.increasedAtTime) @@ -165,6 +195,7 @@ function buildLatestSnapshot(params: { return { poolAddress: normalizeHexAddress(params.position.marketAddress, 'market address'), totalUsd, + leverage, timestamp: params.timestamp, positionOpenedAt: openedAt, positionTokens: [ @@ -173,7 +204,7 @@ function buildLatestSnapshot(params: { symbol: params.position.collateralToken.symbol, decimals: params.position.collateralToken.decimals, amountBaseUnits: params.position.collateralAmount, - valueUsd: totalUsd, + valueUsd: collateralUsd, }, ], }; @@ -182,6 +213,7 @@ function buildLatestSnapshot(params: { return { poolAddress: params.marketAddress, totalUsd, + leverage, timestamp: params.timestamp, positionOpenedAt: openedAt, positionTokens: [], @@ -572,6 +604,10 @@ export const pollCycleNode = async ( timestamp: latestCycle.timestamp, position: positionAfterExecution, fallbackSizeUsd, + fallbackLeverage: + executionResult.ok && (executionPlan.action === 'long' || executionPlan.action === 'short') + ? latestCycle.leverage + : undefined, fallbackOpenedAt: executionResult.ok && (executionPlan.action === 'long' || executionPlan.action === 'short') ? latestCycle.timestamp diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts index e5d3fe97..0b5e444c 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/pollCycle.int.test.ts @@ -517,6 +517,62 @@ describe('pollCycleNode (integration)', () => { expect(artifactIds).not.toContain('gmx-allora-execution-plan'); }); + it('hydrates leverage and notional from an existing onchain position when holding', async () => { + fetchAlloraInferenceMock.mockResolvedValueOnce({ + topicId: 14, + combinedValue: 47000, + confidenceIntervalValues: [46000, 46500, 47000, 47500, 48000], + }); + listPerpetualMarketsMock.mockResolvedValueOnce([baseMarket]); + listPerpetualPositionsMock.mockResolvedValueOnce([ + { + chainId: '42161', + key: '0xpos2', + contractKey: '0xposition2', + account: '0xwallet', + marketAddress: '0xmarket', + sizeInUsd: '16000000000000000000000000000000', + sizeInTokens: '0.01', + collateralAmount: '8000000', + pendingBorrowingFeesUsd: '0', + increasedAtTime: '1739325000', + decreasedAtTime: '0', + positionSide: 'long', + isLong: true, + fundingFeeAmount: '0', + claimableLongTokenAmount: '0', + claimableShortTokenAmount: '0', + isOpening: false, + pnl: '0', + positionFeeAmount: '0', + traderDiscountAmount: '0', + uiFeeAmount: '0', + collateralToken: { + tokenUid: { chainId: '42161', address: '0xusdc' }, + name: 'USD Coin', + symbol: 'USDC', + isNative: false, + decimals: 6, + iconUri: null, + isVetted: true, + }, + }, + ]); + + const state = buildBaseState(); + state.view.metrics.previousPrice = 46000; + state.view.metrics.assumedPositionSide = 'long'; + + const result = await pollCycleNode(state, {}); + const update = (result as { update: ClmmState }).update; + const snapshot = update.view?.metrics.latestSnapshot; + + expect(createPerpetualLongMock).not.toHaveBeenCalled(); + expect(snapshot?.totalUsd).toBe(16); + expect(snapshot?.leverage).toBe(2); + expect(snapshot?.positionTokens[0]?.valueUsd).toBe(8); + }); + it('fails the cycle when no GMX market matches', async () => { fetchAlloraInferenceMock.mockResolvedValueOnce({ topicId: 14, diff --git a/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.gmxAllora.unit.test.ts b/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.gmxAllora.unit.test.ts index 9b1a9170..e45545bc 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.gmxAllora.unit.test.ts +++ b/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.gmxAllora.unit.test.ts @@ -187,4 +187,87 @@ describe('AgentDetailPage (GMX Allora)', () => { expect(html).toContain('https://arbiscan.io/tx/0xb24f42dbfc6c0a30c16b7660ad5878a2a92abfb53a5ce02609bfd7e06a2cde7e'); expect(html).not.toContain('Rebalance Cycles'); }); + + it('falls back to snapshot leverage/notional when the latest cycle is hold', () => { + const html = renderToStaticMarkup( + React.createElement(AgentDetailPage, { + agentId: 'agent-gmx-allora', + agentName: 'GMX Allora Trader', + agentDescription: 'Trades GMX perps using Allora 8-hour prediction feeds.', + creatorName: 'Ember AI Team', + creatorVerified: true, + ownerAddress: undefined, + rank: 3, + rating: 5, + avatar: '📈', + avatarBg: 'linear-gradient(135deg, #22c55e 0%, #16a34a 100%)', + profile: { + chains: ['Arbitrum One'], + protocols: ['GMX', 'Allora'], + tokens: ['USDC'], + agentIncome: 4109.5, + aum: 42180, + apy: 9.2, + totalUsers: 58, + }, + metrics: { + iteration: 2, + cyclesSinceRebalance: 1, + staleCycles: 0, + aumUsd: 16, + apy: 9.2, + lifetimePnlUsd: 0, + }, + fullMetrics: { + cyclesSinceRebalance: 1, + staleCycles: 0, + iteration: 2, + previousPrice: 67602.611, + latestCycle: { + cycle: 2, + action: 'hold', + reason: 'Inference metrics unchanged since last trade; holding position.', + marketSymbol: 'BTC/USDC', + side: undefined, + leverage: undefined, + sizeUsd: undefined, + timestamp: '2026-02-12T02:40:35.221Z', + }, + latestSnapshot: { + poolAddress: '0x47c031236e19d024b42f8AE6780E44A573170703', + totalUsd: 16, + leverage: 2, + timestamp: '2026-02-12T02:40:35.221Z', + positionTokens: [], + }, + }, + isHired: false, + isHiring: false, + isFiring: false, + isSyncing: false, + currentCommand: undefined, + onHire: () => {}, + onFire: () => {}, + onSync: () => {}, + onBack: () => {}, + activeInterrupt: undefined, + allowedPools: [], + onInterruptSubmit: () => {}, + taskId: undefined, + taskStatus: undefined, + haltReason: undefined, + executionError: undefined, + delegationsBypassActive: undefined, + onboarding: undefined, + transactions: [], + telemetry: [], + events: [], + settings: undefined, + onSettingsChange: () => {}, + }), + ); + + expect(html).toContain('>2.0x<'); + expect(html).toContain('$16'); + }); }); diff --git a/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.tsx b/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.tsx index 4403dd20..ab204017 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.tsx +++ b/typescript/clients/web-ag-ui/apps/web/src/components/AgentDetailPage.tsx @@ -2125,6 +2125,8 @@ function GmxAlloraMetricsTab({ : 'pending'; const marketLabel = latestCycle?.marketSymbol ?? formatPoolPair(fullMetrics?.lastSnapshot); const sideLabel = latestCycle?.side ? latestCycle.side.toUpperCase() : '—'; + const displayedLeverage = latestCycle?.leverage ?? latestSnapshot?.leverage; + const displayedNotionalUsd = latestCycle?.sizeUsd ?? latestSnapshot?.totalUsd; const positionStatus = latestCycle?.action === 'close' ? 'Closed' : latestSnapshot?.totalUsd && latestSnapshot.totalUsd > 0 ? 'Open' : 'Pending'; @@ -2238,12 +2240,12 @@ function GmxAlloraMetricsTab({
Leverage
- {latestCycle?.leverage !== undefined ? `${latestCycle.leverage}x` : '—'} + {displayedLeverage !== undefined ? `${displayedLeverage.toFixed(1)}x` : '—'}
Notional
-
{formatUsd(latestCycle?.sizeUsd)}
+
{formatUsd(displayedNotionalUsd)}
Signal Direction
diff --git a/typescript/clients/web-ag-ui/apps/web/src/types/agent.ts b/typescript/clients/web-ag-ui/apps/web/src/types/agent.ts index ab8ff184..cd2e0722 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/types/agent.ts +++ b/typescript/clients/web-ag-ui/apps/web/src/types/agent.ts @@ -303,6 +303,7 @@ export interface AgentViewMetrics { latestSnapshot?: { poolAddress?: `0x${string}`; totalUsd?: number; + leverage?: number; feesUsd?: number; feesApy?: number; timestamp?: string; From f488b5eca446dd9a1a39a2f50320742ea93a0b16 Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Thu, 12 Feb 2026 10:46:38 -0500 Subject: [PATCH 68/70] fix(agent-pendle): slim onchain-actions token mocks --- .../tests/mocks/data/onchain-actions/tokens-page-1.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-1.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-1.json index a49b4885..d7d48e1a 100644 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-1.json +++ b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-1.json @@ -14,13 +14,13 @@ "status": 200, "headers": { "connection": "keep-alive", - "content-length": "1441", + "content-length": "325", "content-type": "application/json; charset=utf-8", "date": "Thu, 05 Feb 2026 18:11:31 GMT", "etag": "W/\"5a1-VBHNSs2LYcd00t09YeNEe6Fya4k\"", "keep-alive": "timeout=5", "x-powered-by": "Express" }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiRVRIIiwibmFtZSI6IkV0aGVyZXVtIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9hc3NldHMuY29pbmdlY2tvLmNvbS9jb2lucy9pbWFnZXMvMS9ldGhlcmV1bS5wbmciLCJpc05hdGl2ZSI6dHJ1ZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4M0ExOGRjQzk3NDVlRGNEMUVmMzNlY0I5M2IwYjZlQkE1NjcxZTdDYSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJLVUpJIiwibmFtZSI6Ikt1amlyYSIsImRlY2ltYWxzIjo2LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL2t1amkuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhjMjRBMzY1QTg3MDgyMUVCODNGZDIxNmM5NTk2ZUREODk0NzlkOGQ3IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkczIiwibmFtZSI6IkdBTTNTLkdHIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL2czLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4NjRENTk5YjNkMGM1ZjEzNzVlNWU2MzlFOThhQjg2Mjk4MjYxQTMwQiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJIVUFIVUEiLCJuYW1lIjoiQ2hpaHVhaHVhIFRva2VuIiwiZGVjaW1hbHMiOjYsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMvaHVhaHVhLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4NDFiOTRjNTg2N2Y3RjYyMTdDOWEzMDUyMENiM2U3OTNCMWVlMWI5NyIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJUSUEuYXhsIiwibmFtZSI6IlRJQSAoQXhlbGFyKSIsImRlY2ltYWxzIjo2LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL3RpYS5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjoxLCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" + "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGFmODhkMDY1ZTc3YzhjQzIyMzkzMjdDNUVEYjNBNDMyMjY4ZTU4MzEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiVVNEQyIsIm5hbWUiOiJVU0RDIiwiZGVjaW1hbHMiOjYsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vMHhzcXVpZC9hc3NldHMvbWFpbi9pbWFnZXMvdG9rZW5zL3VzZGMuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX1dLCJjdXJzb3IiOm51bGwsImN1cnJlbnRQYWdlIjoxLCJ0b3RhbFBhZ2VzIjoxLCJ0b3RhbEl0ZW1zIjoxfQ==" } } From 3d34da566e1bff1c8672b9e7a6aacb875b0b8759 Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Thu, 12 Feb 2026 10:47:01 -0500 Subject: [PATCH 69/70] fix(agent-pendle): drop unused token page fixtures --- .../data/onchain-actions/tokens-page-10.json | 28 --------------- .../data/onchain-actions/tokens-page-11.json | 28 --------------- .../data/onchain-actions/tokens-page-12.json | 28 --------------- .../data/onchain-actions/tokens-page-13.json | 28 --------------- .../data/onchain-actions/tokens-page-14.json | 28 --------------- .../data/onchain-actions/tokens-page-15.json | 28 --------------- .../data/onchain-actions/tokens-page-16.json | 28 --------------- .../data/onchain-actions/tokens-page-17.json | 28 --------------- .../data/onchain-actions/tokens-page-18.json | 28 --------------- .../data/onchain-actions/tokens-page-19.json | 28 --------------- .../data/onchain-actions/tokens-page-2.json | 28 --------------- .../data/onchain-actions/tokens-page-20.json | 28 --------------- .../data/onchain-actions/tokens-page-21.json | 28 --------------- .../data/onchain-actions/tokens-page-22.json | 28 --------------- .../data/onchain-actions/tokens-page-23.json | 28 --------------- .../data/onchain-actions/tokens-page-24.json | 28 --------------- .../data/onchain-actions/tokens-page-25.json | 28 --------------- .../data/onchain-actions/tokens-page-26.json | 28 --------------- .../data/onchain-actions/tokens-page-27.json | 28 --------------- .../data/onchain-actions/tokens-page-28.json | 28 --------------- .../data/onchain-actions/tokens-page-29.json | 28 --------------- .../data/onchain-actions/tokens-page-3.json | 28 --------------- .../data/onchain-actions/tokens-page-30.json | 28 --------------- .../data/onchain-actions/tokens-page-31.json | 28 --------------- .../data/onchain-actions/tokens-page-32.json | 28 --------------- .../data/onchain-actions/tokens-page-33.json | 28 --------------- .../data/onchain-actions/tokens-page-34.json | 28 --------------- .../data/onchain-actions/tokens-page-35.json | 28 --------------- .../data/onchain-actions/tokens-page-36.json | 28 --------------- .../data/onchain-actions/tokens-page-37.json | 28 --------------- .../data/onchain-actions/tokens-page-38.json | 28 --------------- .../data/onchain-actions/tokens-page-39.json | 28 --------------- .../data/onchain-actions/tokens-page-4.json | 28 --------------- .../data/onchain-actions/tokens-page-40.json | 28 --------------- .../data/onchain-actions/tokens-page-41.json | 28 --------------- .../data/onchain-actions/tokens-page-42.json | 28 --------------- .../data/onchain-actions/tokens-page-43.json | 28 --------------- .../data/onchain-actions/tokens-page-44.json | 28 --------------- .../data/onchain-actions/tokens-page-45.json | 28 --------------- .../data/onchain-actions/tokens-page-46.json | 28 --------------- .../data/onchain-actions/tokens-page-47.json | 28 --------------- .../data/onchain-actions/tokens-page-48.json | 28 --------------- .../data/onchain-actions/tokens-page-49.json | 28 --------------- .../data/onchain-actions/tokens-page-5.json | 28 --------------- .../data/onchain-actions/tokens-page-50.json | 28 --------------- .../data/onchain-actions/tokens-page-51.json | 28 --------------- .../data/onchain-actions/tokens-page-52.json | 28 --------------- .../data/onchain-actions/tokens-page-53.json | 28 --------------- .../data/onchain-actions/tokens-page-54.json | 28 --------------- .../data/onchain-actions/tokens-page-55.json | 28 --------------- .../data/onchain-actions/tokens-page-56.json | 28 --------------- .../data/onchain-actions/tokens-page-57.json | 28 --------------- .../data/onchain-actions/tokens-page-58.json | 28 --------------- .../data/onchain-actions/tokens-page-59.json | 28 --------------- .../data/onchain-actions/tokens-page-6.json | 28 --------------- .../data/onchain-actions/tokens-page-60.json | 28 --------------- .../data/onchain-actions/tokens-page-61.json | 28 --------------- .../data/onchain-actions/tokens-page-62.json | 28 --------------- .../data/onchain-actions/tokens-page-63.json | 28 --------------- .../data/onchain-actions/tokens-page-64.json | 28 --------------- .../data/onchain-actions/tokens-page-65.json | 28 --------------- .../data/onchain-actions/tokens-page-66.json | 28 --------------- .../data/onchain-actions/tokens-page-67.json | 28 --------------- .../data/onchain-actions/tokens-page-68.json | 28 --------------- .../data/onchain-actions/tokens-page-69.json | 28 --------------- .../data/onchain-actions/tokens-page-7.json | 28 --------------- .../data/onchain-actions/tokens-page-70.json | 28 --------------- .../data/onchain-actions/tokens-page-71.json | 28 --------------- .../data/onchain-actions/tokens-page-72.json | 28 --------------- .../data/onchain-actions/tokens-page-73.json | 28 --------------- .../data/onchain-actions/tokens-page-74.json | 28 --------------- .../data/onchain-actions/tokens-page-75.json | 28 --------------- .../data/onchain-actions/tokens-page-76.json | 28 --------------- .../data/onchain-actions/tokens-page-77.json | 28 --------------- .../data/onchain-actions/tokens-page-78.json | 28 --------------- .../data/onchain-actions/tokens-page-79.json | 28 --------------- .../data/onchain-actions/tokens-page-8.json | 28 --------------- .../data/onchain-actions/tokens-page-80.json | 28 --------------- .../data/onchain-actions/tokens-page-81.json | 28 --------------- .../data/onchain-actions/tokens-page-82.json | 28 --------------- .../data/onchain-actions/tokens-page-83.json | 28 --------------- .../data/onchain-actions/tokens-page-84.json | 28 --------------- .../data/onchain-actions/tokens-page-85.json | 28 --------------- .../data/onchain-actions/tokens-page-86.json | 28 --------------- .../data/onchain-actions/tokens-page-87.json | 28 --------------- .../data/onchain-actions/tokens-page-88.json | 28 --------------- .../data/onchain-actions/tokens-page-89.json | 28 --------------- .../data/onchain-actions/tokens-page-9.json | 28 --------------- .../data/onchain-actions/tokens-page-90.json | 28 --------------- .../data/onchain-actions/tokens-page-91.json | 28 --------------- .../data/onchain-actions/tokens-page-92.json | 28 --------------- .../data/onchain-actions/tokens-page-93.json | 28 --------------- .../data/onchain-actions/tokens-page-94.json | 28 --------------- .../data/onchain-actions/tokens-page-95.json | 34 ------------------- .../data/onchain-actions/tokens-page-96.json | 34 ------------------- .../data/onchain-actions/tokens-page-97.json | 34 ------------------- .../data/onchain-actions/tokens-page-98.json | 34 ------------------- .../data/onchain-actions/tokens-page-99.json | 34 ------------------- 98 files changed, 2774 deletions(-) delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-10.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-11.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-12.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-13.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-14.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-15.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-16.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-17.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-18.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-19.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-2.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-20.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-21.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-22.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-23.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-24.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-25.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-26.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-27.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-28.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-29.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-3.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-30.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-31.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-32.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-33.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-34.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-35.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-36.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-37.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-38.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-39.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-4.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-40.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-41.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-42.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-43.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-44.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-45.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-46.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-47.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-48.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-49.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-5.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-50.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-51.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-52.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-53.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-54.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-55.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-56.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-57.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-58.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-59.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-6.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-60.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-61.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-62.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-63.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-64.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-65.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-66.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-67.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-68.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-69.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-7.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-70.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-71.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-72.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-73.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-74.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-75.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-76.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-77.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-78.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-79.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-8.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-80.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-81.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-82.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-83.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-84.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-85.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-86.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-87.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-88.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-89.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-9.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-90.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-91.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-92.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-93.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-94.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-95.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-96.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-97.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-98.json delete mode 100644 typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-99.json diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-10.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-10.json deleted file mode 100644 index 5df31ad0..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-10.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.691Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "10" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1509", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5e5-Q+cu+Ky1WnxiuAY786/81Bw3PO8\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDIxOTI3OTk1M2Q4RDIzNTIwQjc4Nzg0NDdlOEE2YzI2NmE1MWRlMmYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiRlBJIiwibmFtZSI6IkZyYXggUHJpY2UgSW5kZXgiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMvZnBpLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4NUUyQ2Y1NkE1NjJiMWJERDMyZWMyNjMxNTA2MzA3NEFEQzQyMEM3MyIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJGSUwuYXhsIiwibmFtZSI6IkZJTCAoQXhlbGFyKSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy93ZmlsLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4NTlERUJFRDhENDZhMGNCODIzRDhCRThiOTU3YWREOTg3ZUFkMzlhYSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJRVUFDSyIsIm5hbWUiOiJRdWFjayBUb2tlbiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9xdWFjay5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEMzNTI5NDMwNkIxN0ZBMkEzMEVkYTNiZGQzNDU2MzBlNTE2MTExRjUiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiTFZOIiwibmFtZSI6IkxldmFuYSBHb3Zlcm5hbmNlIFRva2VuIiwiZGVjaW1hbHMiOjYsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMvbHZuLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4ODhEZmFBQUJhZjA2ZjNhNDFEMjYwNkVBOThCQzhlZEExMDlBYmVCYiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJXTUFJLmF4bCIsIm5hbWUiOiJXTUFJIChBeGVsYXIpIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL3dtYWkuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX1dLCJjdXJzb3IiOiJkNTQ0NzIxMC1mNTZiLTQxMzUtOWVlNi04N2Y4NzUyZWMyMWQiLCJjdXJyZW50UGFnZSI6MTAsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-11.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-11.json deleted file mode 100644 index f3fd8444..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-11.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.692Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "11" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1422", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"58e-TKiwU3/dUi8OfYtl/cNJtxMOQYI\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDkxMkNFNTkxNDQxOTFDMTIwNEU2NDU1OUZFODI1M2EwZTQ5RTY1NDgiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQVJCIiwibmFtZSI6IkFyYml0cnVtIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL2FyYi5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGZjNUExQTZFQjA3NmEyQzdhRDA2ZUQyMkM5MGQ3RTcxMEUzNWFkMGEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiR01YIiwibmFtZSI6IkdNWCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9tYWluL2ltYWdlcy90b2tlbnMvZ214LnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4ZTgwNzcyRWFmNmUyRTE4QjY1MUYxNjBCYzkxNThiMkE1Y2FGQ0E2NSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJVU0QrIiwibmFtZSI6Ik92ZXJuaWdodC5maSBVU0QrIiwiZGVjaW1hbHMiOjYsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vMHhzcXVpZC9hc3NldHMvbWFpbi9pbWFnZXMvdG9rZW5zL3VzZCsuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhFQzcwRGNiNEExRUZhNDZiOEYyRDk3QzMxMEM5YzQ3OTBiYTVmZkE4IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6InJFVEgiLCJuYW1lIjoiUm9ja2V0IFBvb2wgRVRIIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL21haW4vaW1hZ2VzL3Rva2Vucy9yZXRoLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4NTFmQzBmNjY2MDQ4MkVhNzMzMzBFNDE0ZUZkNzgwODgxMWE1N0ZhMiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJQUkVNSUEiLCJuYW1lIjoiUHJlbWlhIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL21haW4vaW1hZ2VzL3Rva2Vucy9wcmVtaWEuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX1dLCJjdXJzb3IiOiJkNTQ0NzIxMC1mNTZiLTQxMzUtOWVlNi04N2Y4NzUyZWMyMWQiLCJjdXJyZW50UGFnZSI6MTEsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-12.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-12.json deleted file mode 100644 index 44860edd..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-12.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.692Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "12" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1438", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"59e-g7VW1em73lhpiMrbyDCMK3dxuTs\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDE3RkMwMDJiNDY2ZUVjNDBEYUU4MzdGYzRiRTVjNjc5OTNkZEJkNkYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiRlJBWCIsIm5hbWUiOiJGcmF4IiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL21haW4vaW1hZ2VzL3Rva2Vucy9mcmF4LnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4YzEzNkU2QjM3NmE5OTQ2QjE1NmRiMUVEM0EzNGIwOEFGZEFlRDc2ZCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJDUkVEQSIsIm5hbWUiOiJDcmVEQSBQcm90b2NvbCBUb2tlbiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9tYWluL2ltYWdlcy90b2tlbnMvY3JlZGEuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgzRTY2NDhDNWE3MEExNTBBODhiQ0U2NUY0YUQ0ZDUwNkZlMTVkMkFGIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlNQRUxMIiwibmFtZSI6IlNwZWxsIFRva2VuIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL21haW4vaW1hZ2VzL3Rva2Vucy9zcGVsbC5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDAzNDFDMEMwZWM0MjMzMjg2MjE3ODhkNDg1NDExOUI5N2Y0NEUzOTEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiU0lMTyIsIm5hbWUiOiJTaWxvIEdvdmVybmFuY2UgVG9rZW4iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vMHhzcXVpZC9hc3NldHMvbWFpbi9pbWFnZXMvdG9rZW5zL3NpbG8uc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgyRjI3MTE4RTNEMjMzMmFGYjdkMTY1MTQwQ2YxYkIxMjdlQTY5NzVkIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkdEWCIsIm5hbWUiOiJHcmlkZXgiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMvZ2R4LnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjEyLCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-13.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-13.json deleted file mode 100644 index 3a8a9e2d..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-13.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.693Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "13" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1455", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5af-WrIyQm1mQgRI+kd0SeXB+Jz+V7Q\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEIwMUNGMWJFOTU2OGYwOTQ0OTM4MmE0N0NkNWJGNThlMkE5RDU5MjIiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiU3BlZWQiLCJuYW1lIjoiTGlnaHRTcGVlZCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9zcGVlZC5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDEzREY3MkEwRjY4MjQyOTNGNTMyNDEyM2NEMzU2ZDlDNEY4MjcyNzEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUEVQRS5heGwiLCJuYW1lIjoiUEVQRSAoQXhlbGFyKSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9wZXBlLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4ZWI4RTkzQTBjNzUwNEJmZmQ4QThmRmE1NkNENzU0YzYzYUFlQkZlOCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJEQUkrIiwibmFtZSI6IkRBSSsgU3RhYmxlY29pbiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9tYWluL2ltYWdlcy90b2tlbnMvZGFpKy5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEZGOTcwQTYxQTA0YjFjQTE0ODM0QTQzZjVkRTQ1MzNlQkREQjVDQzgiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiVVNEQy5lIiwibmFtZSI6IlVTREMgKEJyaWRnZWQpIiwiZGVjaW1hbHMiOjYsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vMHhzcXVpZC9hc3NldHMvbWFpbi9pbWFnZXMvdG9rZW5zL3VzZGMuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhBRkQ4NzFmNjg0RjIxQWI5RDcxMzc2MDhDNzE4MDhmODNENzVlNmZjIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkJVQ0siLCJuYW1lIjoiQXJidWNrcyIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9tYWluL2ltYWdlcy90b2tlbnMvYnVja3Muc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX1dLCJjdXJzb3IiOiJkNTQ0NzIxMC1mNTZiLTQxMzUtOWVlNi04N2Y4NzUyZWMyMWQiLCJjdXJyZW50UGFnZSI6MTMsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-14.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-14.json deleted file mode 100644 index 5a20559a..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-14.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.694Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "14" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1466", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5ba-vS7aohxZ0MxQq/Oy2nrGyVHCdOA\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEZFYTdhNmEwQjM0NjM2MkJGODhBOWU0QTg4NDE2Qjc3YTU3RDZjMkEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiTUlNIiwibmFtZSI6Ik1hZ2ljIEludGVybmV0IE1vbmV5IiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL21haW4vaW1hZ2VzL3Rva2Vucy9taW0uc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhlRDNmQjc2MTQxNERBNzRiNzRGMzNlNWM1YTFmNzgxMDRiMTg4RGZDIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6Ik5ZQU4iLCJuYW1lIjoiQXJiaU5ZQU4iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vMHhzcXVpZC9hc3NldHMvbWFpbi9pbWFnZXMvdG9rZW5zL255YW4uc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhiODI5YjY4ZjU3Q0M1NDZkQTdFNTgwNkE5MjllNTNiRTMyYTQ2MjVEIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkVUSC5heGwiLCJuYW1lIjoiRVRIIChBeGVsYXIpIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL3dldGguc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhENTk1NGMzMDg0YTFjQ2Q3MEI0ZEEwMTFFNjc3NjBCOGU3OGFlRTg0IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkFSWCIsIm5hbWUiOiJBcmJpRGV4IFRva2VuIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL2FyeC5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDExZTk2OWU5QjNmODljQjE2RDY4NmEwM0NkODUwOEM5ZkMwMzYxQUYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiTEFWQSIsIm5hbWUiOiJMQVZBIChBeGVsYXIpIiwiZGVjaW1hbHMiOjYsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMvbGF2YS5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjoxNCwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-15.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-15.json deleted file mode 100644 index 2e017954..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-15.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.695Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "15" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1438", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"59e-+gYSvoWvK7iHCSKhtx5kERLUX/8\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDFkQjA2ZjM5YzE0ZDgxM2Q3YjFDQ0IyNzVBOTNmNWIwNTJERTFjYWMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiWEFWIiwibmFtZSI6IlhhdmUgVG9rZW4iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMveGF2LnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4NkMyQzA2NzkwYjNFM0UzYzM4ZTEyRWUyMkY4MTgzYjM3YTEzRUU1NSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJEUFgiLCJuYW1lIjoiRG9wZXggR292ZXJuYW5jZSBUb2tlbiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9tYWluL2ltYWdlcy90b2tlbnMvZHB4LnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4YWY4OGQwNjVlNzdjOGNDMjIzOTMyN0M1RURiM0E0MzIyNjhlNTgzMSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJVU0RDIiwibmFtZSI6IlVTREMiLCJkZWNpbWFscyI6NiwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9tYWluL2ltYWdlcy90b2tlbnMvdXNkYy5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGU0REREZmU2N0U3MTY0YjBGRTE0RTIxOGQ4MGRDNEMwOGVEQzAxY0IiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiS05DIiwibmFtZSI6Ikt5YmVyIE5ldHdvcmsgQ3J5c3RhbCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9tYWluL2ltYWdlcy90b2tlbnMva25jLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4Zjk3ZjRkZjc1MTE3YTc4YzFBNWEwREJiODE0QWY5MjQ1ODUzOUZCNCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJMSU5LIiwibmFtZSI6IkNoYWluTGluayIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9tYWluL2ltYWdlcy90b2tlbnMvY2hhaW5saW5rLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjE1LCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-16.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-16.json deleted file mode 100644 index 9b1c2244..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-16.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.695Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "16" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1475", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5c3-aMg44MiZucEjG400CFLCZIBInl8\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDE4MEY3Y0YzODgwNWQxYmU5NUM3NjMyRjY1M0UyNkIwODM4ZTI5NjkiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiWERFRkkiLCJuYW1lIjoiWERFRkkiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMveGRlZmkuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhERGY3ZDA4MEM4MmI4MDQ4QkFBZTU0ZTM3NmEzNDA2NTcyNDI5YjRlIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6Im9vb09PTyIsIm5hbWUiOiJHT0RET0ciLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMvb29vb29vLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MDBlMTcyNDg4NTQ3M0I2M2JDRTA4YTlmMGE1MkYzNWIwOTc5ZTM1QSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJPQVRIIiwibmFtZSI6Ik9hdGggVG9rZW4iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMvb2F0aC5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEI0NDhlQzUwNUM5MjQ5NDRjYThCMkM1NUVGMDVjMjk5ZUUwNzgxZGYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiS05DLmF4bCIsIm5hbWUiOiJLTkMgKEF4ZWxhcikiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMva25jLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4ZjNDMDkxZWQ0M2RlOWMyNzA1OTM0NDUxNjNhNDFBODc2QTBiYjNkZCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJPUkJTIiwibmFtZSI6Ik9yYnMiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMvb3Jicy5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjoxNiwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-17.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-17.json deleted file mode 100644 index 9e2794c5..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-17.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.696Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "17" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1586", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"632-JrUeRpWKUgm9s+8n/znz4jSsKu4\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDdiYTg2MWMwN2Q0MGUzMzQxQjkwMUZkNkY0MThlOTZFMDEzMkUyNWIiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoic3RBVE9NIiwibmFtZSI6IlN0cmlkZSBTdGFrZWQgQXRvbSIsImRlY2ltYWxzIjo2LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL3N0YXRvbS5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGM4N0IzN2E1ODFlYzMyNTdCNzM0ODg2ZDlkM2E1ODFGNUE5ZDA1NmMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQVRIIiwibmFtZSI6IkFldGhpciBUb2tlbiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9hdGguc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhCRGJBMTE5NDc3NUI5YTc2NDk4YTdmNjkwRUFFNDFCMDU5QTA2REZDIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IndwRklMIiwibmFtZSI6IndyYXBwZWQgcEZJTCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW5odHRwczovL3NhbG1vbi1vZmZpY2lhbC1hbGJhdHJvc3MtMjU0Lm15cGluYXRhLmNsb3VkL2lwZnMvUW1hdkRNWmJkTjRnZDMyTWFNWGF3a2h1VWFORHVlR0NUcXBXaVFHUWRrN1N1QiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4RUI0NjYzNDJDNGQ0NDlCQzlmNTNBODY1RDVDYjkwNTg2ZjQwNTIxNSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJVU0RDLmF4bCIsIm5hbWUiOiJVU0RDIChBeGVsYXIpIiwiZGVjaW1hbHMiOjYsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMvdXNkYy5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGVjRWI4OTI3RkVENWY2MTI4NzlGNzlkN0QzQUYyRTM5QzdmZDE2OEIiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUlNUSyIsIm5hbWUiOiJSZXN0YWtlIEZpbmFuY2UiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMvcnN0ay5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjoxNywidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-18.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-18.json deleted file mode 100644 index 0a1cdb5e..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-18.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.697Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "18" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1408", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"580-3Gdwh92NwbHeNGln5lJtlqeaq/A\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEZkMDg2YkM3Q0Q1QzQ4MURDQzlDODVlYkU0NzhBMUMwYjY5RkNiYjkiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiVVNEVCIsIm5hbWUiOiJVU0RUIiwiZGVjaW1hbHMiOjYsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vMHhzcXVpZC9hc3NldHMvbWFpbi9pbWFnZXMvdG9rZW5zL3VzZHQuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg4MTZFMjFjMzNmYTVGODQ0MEVCY0RGNmUwMUQzOTMxNDU0MUJFQTcyIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkxxZHIiLCJuYW1lIjoiTHFkclYyIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL2xxZHIuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhBM2QxYThERUI5N0IxMTE0NTRCMjk0RTIzMjRFZkFEMTNhOWQ4Mzk2IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6Ik9WTiIsIm5hbWUiOiJPVk4iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMvb3ZuLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4NTEzMThCN0QwMGRiN0FDYzQwMjZDODhjMzk1MkI2NjI3OEI2QTY3RiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJQTFMiLCJuYW1lIjoiUGx1dHVzIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL21haW4vaW1hZ2VzL3Rva2Vucy9wbHMuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg5M0MxNWNkN0RFMjZmMDcyNjVmMDI3MkUwYjgzMUM1RDdmQWIxNzRmIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkxJUUQiLCJuYW1lIjoiTGlxdWlkIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL21haW4vaW1hZ2VzL3Rva2Vucy9saXFkLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjE4LCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-19.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-19.json deleted file mode 100644 index d465df4c..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-19.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.697Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "19" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1444", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5a4-X4YlpuZ/A4MxbiRuDBYQYjvU8co\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDgyYUY0OTQ0N0Q4YTA3ZTNiZDk1QkQwZDU2ZjM1MjQxNTIzZkJhYjEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiV0VUSCIsIm5hbWUiOiJXcmFwcGVkIEVUSCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy93ZXRoLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4REU1ZWQ3NkU3YzA1ZUM1ZTQ1NzJDZkM4OGQxQUNFQTE2NTEwOUU0NCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJERVVTIiwibmFtZSI6IkRFVVMiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMvZGV1cy5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDA1OTMxRDVlMkY3RTFDMUE3MTBjOWMxZENkRDk0ZTQxMzY1MjM3NkYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiU1RSRCIsIm5hbWUiOiJTdHJpZGUiLCJkZWNpbWFscyI6NiwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9zdHJkLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4ODc2RWM2YkU1MjQ4NkVlZWMwNmJjMDY0MzRmM0U2MjlENjk1YzZiQSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJGTFVJRCIsIm5hbWUiOiJGbHVpZEZpIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL21haW4vaW1hZ2VzL3Rva2Vucy9mbHVpZGZpLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MTAzOTNjMjA5NzVjRjE3N2EzNTEzMDcxYkMxMTBmNzk2MkNENjdkYSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJKT05FUyIsIm5hbWUiOiJKb25lcyBEQU8iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vMHhzcXVpZC9hc3NldHMvbWFpbi9pbWFnZXMvdG9rZW5zL2pvbmVzLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjE5LCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-2.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-2.json deleted file mode 100644 index 84a4a768..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-2.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.679Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "2" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1490", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5d2-mFgQSLJzu7WIdaEryxUHNVLStTw\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDJhOThkOTc4ODE3OTQ5RDQ1YTU1MjgwMTM4NTA3NzJFNzYyQjdGMTIiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiSVNMTSIsIm5hbWUiOiJJc2xhbWljIENvaW4iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMvaXNsbS5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDVDN2UyOTlDRjUzMWViNjZmMkExZEY2MzdkMzdBYkI3OGU2MjAwQzciLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiREFJLmF4bCIsIm5hbWUiOiJEQUkgKEF4ZWxhcikiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMvZGFpLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MTFDMTg3OTIyN0Q0NjNiNjBkYjE4QzE3YzIwYUU3MzlhRThFOTYxYSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJCQUwuYXhsIiwibmFtZSI6IkJBTCAoQXhlbGFyKSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9iYWwuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgwODhjZDhmNWVGMzY1MjYyM2MyMkQ0OGIxNjA1RENmRTg2MENkNzA0IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlZFTEEiLCJuYW1lIjoiVmVsYVRva2VuIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL3ZlbGEuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg2NmUwOWVjMTc2Mjk1NzRBMENDOGFiYzQ4MGIwYzI1NzJmY2Q2OTg1IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkJTVyIsIm5hbWUiOiJCaXN3YXAiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluaHR0cHM6Ly9iaXN3YXAub3JnL2xvZ29CU1cuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX1dLCJjdXJzb3IiOiJkNTQ0NzIxMC1mNTZiLTQxMzUtOWVlNi04N2Y4NzUyZWMyMWQiLCJjdXJyZW50UGFnZSI6MiwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-20.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-20.json deleted file mode 100644 index b44b0f85..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-20.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.698Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "20" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1433", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"599-ZIaYWJaOcMsz1YNRtBAdw5LbSws\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDI1OWMxQzJFRDI2NDQwMmI1ZWQyZjAyYmM3ZEMyNUExNUM2ODBjMTgiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUklORyIsIm5hbWUiOiJPbmVSaW5nIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL3Jpbmcuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgzZDk5MDdGOWEzNjhhZDBhNTFCZTYwZjdEYTNiOTdjZjk0MDk4MkQ4IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkdSQUlMIiwibmFtZSI6IkNhbWVsb3QgVG9rZW4iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vMHhzcXVpZC9hc3NldHMvbWFpbi9pbWFnZXMvdG9rZW5zL2dyYWlsLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4ZDRkNDJGMGI2REVGNENFMDM4MzYzNjc3MGVGNzczMzkwZDg1YzYxQSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJTVVNISSIsIm5hbWUiOiJTdXNoaSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9tYWluL2ltYWdlcy90b2tlbnMvc3VzaGkuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg1MzliZEUwZDdEYmQzMzZiNzkxNDhBQTc0Mjg4MzE5OEJCRjYwMzQyIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6Ik1BR0lDIiwibmFtZSI6Ik1BR0lDIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL21haW4vaW1hZ2VzL3Rva2Vucy9tYWdpYy5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDNCNDc1RjZmMmY0MTg1MzcwNmFmYzlGYTZhNmI4QzVkRjFhMjcyNGMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiWllCIiwibmFtZSI6Ilp5YmVyIFRva2VuIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL3p5Yi5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjoyMCwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-21.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-21.json deleted file mode 100644 index 91a4a3b8..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-21.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.699Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "21" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1518", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5ee-DzNKONzhZ8+hDmRUr0r3LR0OLOU\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGQ1OERjN2FhNDgyN0NDNTExNjliNjhFNjRmMGZENEVBN2ZhQzU1N0QiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiU1RBUlMuYXhsIiwibmFtZSI6IlNUQVJTIChBeGVsYXIpIiwiZGVjaW1hbHMiOjYsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMvc3RhcnMuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgwMUM1RUQwMTlBMUJjMDdkM0EzMjBhMDlDODNDMzk4ZDkxZjhmZDVEIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IktUQyIsIm5hbWUiOiJLVFggQ29tbXVuaXR5IFRva2VuIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL2t0Yy5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDQwNkNkZTc2YTNmRDIwZTQ4YmMxRTBGNjA2NTFlNjBBZTIwNEIwNDAiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiRlJBWC5heGwiLCJuYW1lIjoiRlJBWCAoQXhlbGFyKSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9mcmF4LnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MzA4NzE3MjAzQWIwNDVkNGE4ZkU0OUVDRDE0OWFCMTRGMEViMTZjNSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJTQ1JUIiwibmFtZSI6IlNlY3JldCBuYXRpdmUgYXNzZXQiLCJkZWNpbWFscyI6NiwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9zY3J0LnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4RUJkZTAyMTY2Q0Y1ZTlDRTJEQmYyNzg5NUFGRjNGRkQwMDU1Yjg3MyIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJUQkgiLCJuYW1lIjoiVGJoIENyZWF0dXJlIFlpcHBlZSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy90Ymguc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX1dLCJjdXJzb3IiOiJkNTQ0NzIxMC1mNTZiLTQxMzUtOWVlNi04N2Y4NzUyZWMyMWQiLCJjdXJyZW50UGFnZSI6MjEsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-22.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-22.json deleted file mode 100644 index 2e0217e3..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-22.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.700Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "22" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1476", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5c4-p4Mcvbm9uoD2AzTziahb0JQWnuk\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDJDYUIzYWJmQzE2NzBEMWE0NTJkRjUwMmUyMTZhNjY4ODNjRGYwNzkiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiTDJEQU8iLCJuYW1lIjoiTGF5ZXIyREFPIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL21haW4vaW1hZ2VzL3Rva2Vucy9sMmRhby5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDhEOWJBNTcwRDZjYjYwQzdlM2UwRjMxMzQzRWZlNzVBQjhFNjVGQjEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiZ09ITSIsIm5hbWUiOiJHb3Zlcm5hbmNlIE9ITSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9tYWluL2ltYWdlcy90b2tlbnMvZ29obS5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDFERUJkNzNFNzUyYkVhRjc5ODY1RmQ2NDQ2YjBjOTcwRWFFNzczMmYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiY2JFVEgiLCJuYW1lIjoiQ29pbmJhc2UgV3JhcHBlZCBTdGFrZWQgRVRIIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL21haW4vaW1hZ2VzL3Rva2Vucy9jYmV0aC5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDRBQTgxRDdBQjU5Qzc3NWZlNkY5RjQ1RTY5NDFBMEZCOGNENjkyYTYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoibWlsa1RJQSIsIm5hbWUiOiJtaWxrVElBIiwiZGVjaW1hbHMiOjYsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMvbWlsa3RpYS5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDc4OUNiQkU1ZDE5ZjA0RjM4RWM5NzkwYjI4RWNiMDdiYTU2MTdmNjEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoic3RUSUEuYXhsIiwibmFtZSI6IlN0cmlkZSBTdGFrZWQgVGlhIiwiZGVjaW1hbHMiOjYsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMvc3R0aWEuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX1dLCJjdXJzb3IiOiJkNTQ0NzIxMC1mNTZiLTQxMzUtOWVlNi04N2Y4NzUyZWMyMWQiLCJjdXJyZW50UGFnZSI6MjIsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-23.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-23.json deleted file mode 100644 index be40bab3..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-23.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.700Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "23" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1459", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5b3-677U9B8U0UKI8ND9u5FafptTbqY\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDRGNjA0NzM1YzFjRjMxMzk5QzZFNzExRDU5NjJiMkIzRTAyMjVBRDMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiVVNER0xPIiwibmFtZSI6IkdsbyBEb2xsYXIiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vMHhzcXVpZC9hc3NldHMvbWFpbi9pbWFnZXMvdG9rZW5zL2dsby5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEQ1NjczNGQ3Zjk5NzlkRDk0RkFFM2Q2N0M3ZTkyODIzNGU3MWNENEMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiVElBLm4iLCJuYW1lIjoiQnJpZGdlZCBDZWxlc3RpYSIsImRlY2ltYWxzIjo2LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL21haW4vaW1hZ2VzL3Rva2Vucy90aWEuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhBMDZENTA1RUMyOEZEOTc1NmEyMDBEMkI1MDNBNjYxMDNkQjk4ZDA5IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IktFSSIsIm5hbWUiOiJLRUkgRmluYW5jZSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vYXNzZXRzLmNvaW5nZWNrby5jb20vY29pbnMvaW1hZ2VzLzI5ODQwL3N0YW5kYXJkLzIwMHgyMDAucG5nPzE2OTY1Mjg3NjciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEQyRDBBODBmRTFEQTg0OWVlODE3NDk0YkMyRGY3RUU0MzY3ZTYxZjYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiTU9MTEFSUyIsIm5hbWUiOiJNb2xsYXJzVG9rZW4iLCJkZWNpbWFscyI6OSwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9tb2xsYXJzLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MWJEMEZlOEU5MmExNTdEM2VmNjZDOUZCOWUzODYyMTI1MmI0MDdjMiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJhZ0VUSC5heGwiLCJuYW1lIjoiS2VscCBHYWluIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL2FnZXRoLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjIzLCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-24.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-24.json deleted file mode 100644 index 00a33365..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-24.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.701Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "24" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1487", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5cf-3NlTS0pgf2E9utcZil+WZOoDzpE\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDExOTIwZjEzOWEzMTIxYzI4MzZFMDE1NTFENDNGOTVCM2MzMTE1OWMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiWUJSIiwibmFtZSI6IllpZWxkYnJpY2tzIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL3lpZWxkYnJpY2tzLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4OUY0MWIzNGY0MjA1OGE3Yjc0NjcyMDU1YTVmYWUyMmM0YjExM0ZkMSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJZVU0iLCJuYW1lIjoiWXVtIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL3l1bS5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGYzNjAyQzVBN2Y2MjUxODE2NTk0NDVDOGRERGRlNzNkQTE1YzIyZTMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoic0ZSQVgiLCJuYW1lIjoiU3Rha2VkIEZSQVgiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMvc2ZyYXguc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhBOUFGNTFBNTVGMjc1NTAzYTM4NzYwNzdhMDhBZTY1NDA4MzVFRjhDIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IllpZWxkRVRILmF4bCIsIm5hbWUiOiJSZWFsIFlpZWxkIEVUSCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy95aWVsZGV0aC5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDY2RTUzNWU4RDJlYmYxM0Y0OUYzRDQ5ZTVjNTAzOTVhOTdDMTM3YjEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiTU9MVEVOIiwibmFtZSI6Ik1vbHRlbiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vYXNzZXRzLmNvaW5nZWNrby5jb20vY29pbnMvaW1hZ2VzLzM2NzI2L3N0YW5kYXJkL21vbHRlbm1lc2gucG5nPzE3MTIxNDc0MDciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjoyNCwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-25.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-25.json deleted file mode 100644 index 6b908283..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-25.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.702Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "25" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1488", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5d0-2NT2vX/u5WzA7ZlaQYhF8bc6sKc\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDQxODZCRkM3NkUyRTIzNzUyM0NCQzMwRkQyMjBGRTA1NTE1NmI0MUYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoicnNFVEgiLCJuYW1lIjoiS2VscERhbyBSZXN0YWtlZCBFVEgiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vMHhzcXVpZC9hc3NldHMvbWFpbi9pbWFnZXMvd2VicDEyOC90b2tlbnMvcnNldGgud2VicCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4RjBiQWYyOTVkRGM2QjJhQUE0OUE5NjJlRWQyNmZFMTRCMjZjNjdjRCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJLTEFVUyIsIm5hbWUiOiJLbGF1cyIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vdG9rZW4tbWVkaWEuZGVmaW5lZC5maS8xXzB4YjYxMmJmYzVjZTJmYjEzMzdiZDI5ZjVhZjI0Y2E4NWRiYjE4MWNlMl8xNzM2MDAwMTQ2X2xhcmdlLnBuZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MTFjRGI0MkIwRUI0NkQ5NWY5OTBCZURENDY5NUE2ZTNmQTAzNDk3OCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJDUlYiLCJuYW1lIjoiQ3VydmUgREFPIFRva2VuIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL2Nydi5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDYwYmY0RTdjRjE2RmYzNDUxMzUxNGI5Njg0ODNCNTRCZWZmNDJhODEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiVkNOVCIsIm5hbWUiOiJWaWNpQ29pbiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vYXNzZXRzLmNvaW5nZWNrby5jb20vY29pbnMvaW1hZ2VzLzMxMzA1L3N0YW5kYXJkL1ZpY2lDb2luXy1fc21hbGwucG5nPzE2OTY1MzAxMjQiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEY2M2IxNEY1ZUU1NTc0ZTNGMzM3YjI3OTZCYmRmNmRjZkI0RTJDQjciLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiS0lQIiwibmFtZSI6IktJUCBQcm90b2NvbCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9raXAuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX1dLCJjdXJzb3IiOiJkNTQ0NzIxMC1mNTZiLTQxMzUtOWVlNi04N2Y4NzUyZWMyMWQiLCJjdXJyZW50UGFnZSI6MjUsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-26.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-26.json deleted file mode 100644 index 147c29d7..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-26.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.702Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "26" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1500", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5dc-T7NahwSOX+/zeMHc+0aKFCPgUQc\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDEzQTdEZURiNzE2OWExN2JFOTJCMEUzQzdDMjMxNUI0NmY0NzcyQjMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQm9vcCIsIm5hbWUiOiJCb29wIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL2Jvb3Auc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhhNGYwNWZhNGYyODhDYzk3YzcxNDQ1MzZlRDEyQmJERDQxNTc0YzE2IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkFJUE8iLCJuYW1lIjoiQWlwb2NhbHlwdG8iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMvYWlwby5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDQ1NDE1NjFDRjY3RUFFMzk5MzIxOEFiM2ZkQUQyZTg1RTA3MDdDMTQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiTUVHQUxBTkQiLCJuYW1lIjoiTUVUQUdBTEFYWSBMQU5EIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL21lZ2FsYW5kLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MzIzQkFlOEVhNzQ4QTNjM0U0OEI1NDQwNjNmRWJjMGU3NDI0QzA0YSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJBRVRYIiwibmFtZSI6IkFldGhlclgiLCJkZWNpbWFscyI6OCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9hZXR4LnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MGNmRDgyRjM5MTBiM0E1ZmFmM2EwNDE3RmIwMDYzOTUzRDZCOTExYiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJZaWVsZFVTRC5heGwiLCJuYW1lIjoiUmVhbCBZaWVsZCBVU0QiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMveWllbGR1c2Quc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX1dLCJjdXJzb3IiOiJkNTQ0NzIxMC1mNTZiLTQxMzUtOWVlNi04N2Y4NzUyZWMyMWQiLCJjdXJyZW50UGFnZSI6MjYsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-27.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-27.json deleted file mode 100644 index b7809dc6..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-27.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.703Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "27" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1486", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5ce-EKLmKwx+mLkjLOllmvbW6kTAI8s\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDA1MWZiNTA5ZTRBNzc1RkFCZDI1NzYxMWVlQTFlZmFlZDhGOTEzNTkiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQ0FURSIsIm5hbWUiOiJDYXRlQ29pbiIsImRlY2ltYWxzIjo5LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL2NhdGUuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhmN0EwZGQzMzE3NTM1ZUM0ZjRkMjlBREY5ZDYyMEIzZDhENUQ1MDY5IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6InN0RVJOIiwibmFtZSI6IlN0YWtlZCBFUk4gVmF1bHQiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMvc3Rlcm4uc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgwMjQ1NGE5N0E4MzcyZjNBNzYwQTAzM0RCYjM5RTY3RDczQkQ2ZDg3IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IktBVEEiLCJuYW1lIjoiS2F0YW5hIEludSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9rYXRhLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MmZBYTIwOTI0N2MwZjc2NDFmRUYwYzczYWQ2YjQ0NjA3QTkyREQzYSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJFTERBIiwibmFtZSI6IkVsZGFydW5lIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL2VsZGEuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg5Yzk0ZTgyZDg3NTFGMTY5NTNGOUM4NmUxM0VEOWNEMDQxNGU2RTk3IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlZPTFMiLCJuYW1lIjoiVm9sYXJpcyBHYW1lcyIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy92b2xzLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjI3LCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-28.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-28.json deleted file mode 100644 index e289670c..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-28.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.704Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "28" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1489", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5d1-ityr3l0JXmVV1xLu4Z/OYC+1fCc\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDBlYTAxMGRDQjFEZkJFNWM5ZDFBQzQ3NTkwMWE1OTY0MmJhZDkwZjQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiRU5TVVJFIiwibmFtZSI6ImVuc3VyZSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9lbnN1cmUuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg2NUM1MmQyNzNFRDM1NzAyMThkZjgxRTVBMDlFMzU3Rjk1MjY1RTIxIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlVTREZJIiwibmFtZSI6IlVTREZJIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL3VzZGZpLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4NTEyMERBZjZmMzIzRTAzYjcwRUZhMjg5ZjFFREYwZTUwMTlkNTQzNiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJTVEFCTEUiLCJuYW1lIjoiU1RBQkxFIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL3N0YWJsZS5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEM2NWQ4ZDk2Y2RkREIzMTMyODE4NkVGQTExM2E0NjBiMEFmOUVjNjMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUEVMTCIsIm5hbWUiOiJQRUxMIE5ldHdvcmsgVG9rZW4iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMvcGVsbC5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDJFNkMwNWYxZjdEMWY0RWI5QTA4OGJmMTIyNTdmMTY0NzY4MmI3NTQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUkVHRU4iLCJuYW1lIjoiUmVnZW4gTmV0d29yayIsImRlY2ltYWxzIjo2LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL3JlZ2VuLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjI4LCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-29.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-29.json deleted file mode 100644 index 90d83447..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-29.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.704Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "29" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1472", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5c0-k5dIx443pG9W467LhLR7liyFGBk\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDdkZkY3MjY5M2Y2QTQxNDliMTdlN0M2MzE0NjU1ZjZBOUY3YzhCMzMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiR0hPIiwibmFtZSI6IkdITyBUb2tlbiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vYXNzZXRzLmNvaW5nZWNrby5jb20vY29pbnMvaW1hZ2VzLzMwNjYzL3N0YW5kYXJkL2doby10b2tlbi1sb2dvLnBuZz8xNzIwNTE3MDkyIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhEQzJERTc4MTdDMkVFQTdjOTY3Qjk5OTIxQkE1MjAxOGVGQ2RBZWIyIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IldIQUxFLmF4bCIsIm5hbWUiOiJXSEFMRSAoQXhlbGFyKSIsImRlY2ltYWxzIjo2LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL3doYWxlLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4QmU0MjQ3YkRGMGUxNjFCNjU3NDdFNGZFRkJkNDgyMUQyMUVkMDVkMiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJFQVJUSCIsIm5hbWUiOiJFYXJ0aCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9lYXJ0aC5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDFFYjVBMTQ3MEFmM0NGMkQ1RDJjNjllOTg3NTc0YzA2OUU0RTMwMzciLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiSVhPIiwibmFtZSI6IklYTyAoQXhlbGFyKSIsImRlY2ltYWxzIjo2LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL2l4by5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDIxOWZlYjA2MTE2MDM5ZWFDMTdkZkU0REU1OUM4NzJFRGRDOWRhNDgiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiWElPTiIsIm5hbWUiOiJYSU9OIiwiZGVjaW1hbHMiOjYsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMveGlvbi5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjoyOSwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-3.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-3.json deleted file mode 100644 index e3bf70aa..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-3.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.680Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "3" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1447", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5a7-ol0xrfqUjGViEj0b4ZM8w9S7DJk\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDU4NjBhMGJGMzcxMzNmODQ2MWIyREVEZTdDODBlNTVENmJmRjM3MjEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiRlhTLmF4bCIsIm5hbWUiOiJGcmF4IFNoYXJlIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL2Z4cy5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGM3RWRmN0I3YjM2NjdhMDY5OTI1MDhlN0IxNTZlZmY3OTRhOWUxYzgiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiWFBSVCIsIm5hbWUiOiJYUFJUIG5hdGl2ZSBhc3NldCIsImRlY2ltYWxzIjo2LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL3hwcnQuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgyZjJhMjU0M0I3NkE0MTY2NTQ5RjdhYUIyZTc1QmVmMGFlZkM1QjBmIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IldCVEMiLCJuYW1lIjoiV3JhcHBlZCBCVEMiLCJkZWNpbWFscyI6OCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9tYWluL2ltYWdlcy90b2tlbnMvd2J0Yy5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDA3RTQ5ZDVkRTQzRERBNjE2MkZhMjhEMjRkNTkzNUMxNTE4NzUyODMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiR09WSSIsIm5hbWUiOiJHT1ZJIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL21haW4vaW1hZ2VzL3Rva2Vucy9nb3ZpLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4NTE3MDdEQzY2MTYzMEY4RkQ2MjRiOTg1RkE2ZUY0ZjFkNEQ5MTlEYiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJVTlYiLCJuYW1lIjoiVW52ZXN0IiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL3Vudi5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjozLCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-30.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-30.json deleted file mode 100644 index 18426244..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-30.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.705Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "30" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1535", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5ff-CjpJv+BRXEkCLvoW58K1J7uJ2kA\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGY1MjVFNzNiZGVCNGFjMWIwZTc0MWFGM0VkOGE4Q0JCNDNhYjA3NTYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiS0lCU0hJIiwibmFtZSI6IktpYm9TaGliIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9hc3NldHMuY29pbmdlY2tvLmNvbS9jb2lucy9pbWFnZXMvMjkzMzUvc3RhbmRhcmQvZm90b19ub19leGlmXyUyODExJTI5JTI4MiUyOV8lMjgxJTI5LnBuZz8xNjk2NTI4Mjg1IiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg2ODVBMkZjNjM4RTM4MjY2MmE1RDA2MDE3QjA1ZGI0YmUzYzM3MkNCIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlRSSVVNUEgiLCJuYW1lIjoiVHJpdW1waCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy90cml1bXBoLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MDAwMDAwQzM5NjU1OGZmYkFCNUVhNjI4ZjM5NjU4QmRmNjEzNDViMyIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJCVU5OSSIsIm5hbWUiOiJCdW5uaSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9idW5uaS5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDAwMDAwMERjNTFCODJEQzlDMTRjMmMwMzQzNDFjOTEyOTA3ZDBkNTkiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoib0JVTk5JIiwibmFtZSI6IkJ1bm5pIENhbGwgT3B0aW9uIFRva2VuIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL2J1bm5pLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MDkyYkFhREI3REVmNEMzOTgxNDU0ZEQ5YzBBMEQ3RkYwN2JDRmM4NiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJNT1IiLCJuYW1lIjoiTU9SIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9naXRodWIuY29tLzB4c3F1aWQvYXNzZXRzL3RyZWUvbWFpbi9pbWFnZXMvbWlncmF0aW9uL3dlYnAvNDIxNjFfMHgwOTJiYWFkYjdkZWY0YzM5ODE0NTRkZDljMGEwZDdmZjA3YmNmYzg2LndlYnAiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjozMCwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-31.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-31.json deleted file mode 100644 index 5e85786d..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-31.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.705Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "31" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1619", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"653-1nlJ4wib3QNVMar/EjObbhrO9hI\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDJBYzJCMjU0QmMxOGNENDk5OWY2NDc3M2E5NjZFNGY0ODY5YzM0RWUiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUE5QIiwibmFtZSI6IlBlbnBpZSBUb2tlbiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vZ2l0aHViLmNvbS8weHNxdWlkL2Fzc2V0cy90cmVlL21haW4vaW1hZ2VzL21pZ3JhdGlvbi93ZWJwLzQyMTYxXzB4MmFjMmIyNTRiYzE4Y2Q0OTk5ZjY0NzczYTk2NmU0ZjQ4NjljMzRlZS53ZWJwIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgxOGMxMUZEMjg2QzVFQzExYzNiNjgzQ2FhODEzQjc3ZjUxNjNBMTIyIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkdOUyIsIm5hbWUiOiJHYWlucyBOZXR3b3JrIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9naXRodWIuY29tLzB4c3F1aWQvYXNzZXRzL3RyZWUvbWFpbi9pbWFnZXMvbWlncmF0aW9uL3dlYnAvNDIxNjFfMHgxOGMxMWZkMjg2YzVlYzExYzNiNjgzY2FhODEzYjc3ZjUxNjNhMTIyLndlYnAiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEJmYkNGZTg4NzNmRTI4RGZhMjVmMTA5OTI4MmIwODhENTJiYkFEOUMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiRVFCIiwibmFtZSI6IkVxdWlsaWJyaWEgVG9rZW4iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL2dpdGh1Yi5jb20vMHhzcXVpZC9hc3NldHMvdHJlZS9tYWluL2ltYWdlcy9taWdyYXRpb24vd2VicC80MjE2MV8weGJmYmNmZTg4NzNmZTI4ZGZhMjVmMTA5OTI4MmIwODhkNTJiYmFkOWMud2VicCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4NWQzYTFGZjJiNkJBYjgzYjYzY2Q5QUQwNzg3MDc0MDgxYTUyZWYzNCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJVU0RlIiwibmFtZSI6IlVTRGUiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL2dpdGh1Yi5jb20vMHhzcXVpZC9hc3NldHMvdHJlZS9tYWluL2ltYWdlcy9taWdyYXRpb24vd2VicC80MjE2MV8weDVkM2ExZmYyYjZiYWI4M2I2M2NkOWFkMDc4NzA3NDA4MWE1MmVmMzQud2VicCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MzhGOWJmOWRDZTUxODMzRWM3ZjAzQzlkQzIxODE5Nzk5OTk5OTk5OSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJOWUEiLCJuYW1lIjoiTnlhIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9naXRodWIuY29tLzB4c3F1aWQvYXNzZXRzL3RyZWUvbWFpbi9pbWFnZXMvbWlncmF0aW9uL3dlYnAvNDIxNjFfMHgzOGY5YmY5ZGNlNTE4MzNlYzdmMDNjOWRjMjE4MTk3OTk5OTk5OTk5LndlYnAiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjozMSwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-32.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-32.json deleted file mode 100644 index 2af8773b..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-32.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.706Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "32" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1620", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"654-eHcYwbwwfgl6hNs9YOiZ5s9eqGU\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDg5NDEzNGEyNWE1ZmFDMWMyQzI2RjFkOGZCZjA1MTExYTNDQjk0ODciLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiR1JBSSIsIm5hbWUiOiJHcmF2aXRhIERlYnQgVG9rZW4iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL2dpdGh1Yi5jb20vMHhzcXVpZC9hc3NldHMvdHJlZS9tYWluL2ltYWdlcy9taWdyYXRpb24vd2VicC80MjE2MV8weDg5NDEzNGEyNWE1ZmFjMWMyYzI2ZjFkOGZiZjA1MTExYTNjYjk0ODcud2VicCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4RDc3QjEwOGQ0ZjZjZWZhYTBDYWU5NTA2QTkzNGU4MjVCRWNjQTQ2RSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJXSU5SIiwibmFtZSI6IldJTlIiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL2dpdGh1Yi5jb20vMHhzcXVpZC9hc3NldHMvdHJlZS9tYWluL2ltYWdlcy9taWdyYXRpb24vd2VicC80MjE2MV8weGQ3N2IxMDhkNGY2Y2VmYWEwY2FlOTUwNmE5MzRlODI1YmVjY2E0NmUud2VicCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4RDc0ZjUyNTVENTU3OTQ0Y2Y3RGQwRTQ1RkY1MjE1MjAwMDJENTc0OCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJVU0RzIiwibmFtZSI6IlNwZXJheCBVU0QiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL2dpdGh1Yi5jb20vMHhzcXVpZC9hc3NldHMvdHJlZS9tYWluL2ltYWdlcy9taWdyYXRpb24vd2VicC80MjE2MV8weGQ3NGY1MjU1ZDU1Nzk0NGNmN2RkMGU0NWZmNTIxNTIwMDAyZDU3NDgud2VicCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4NmREOTYzQzUxMGMyRDJmMDlkNWVEZEI0OEVkZTQ1RmVEMDYzRWIzNiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJGQ1RSIiwibmFtZSI6IkZhY3RvciIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vZ2l0aHViLmNvbS8weHNxdWlkL2Fzc2V0cy90cmVlL21haW4vaW1hZ2VzL21pZ3JhdGlvbi93ZWJwLzQyMTYxXzB4NmRkOTYzYzUxMGMyZDJmMDlkNWVkZGI0OGVkZTQ1ZmVkMDYzZWIzNi53ZWJwIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgwOUUxODU5MEU4Zjc2YjZDZjQ3MWIzY2Q3NWZFMUExYTlEMkIyYzJiIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkFJRE9HRSIsIm5hbWUiOiJBSURPR0UiLCJkZWNpbWFscyI6NiwiaWNvblVyaSI6Imh0dHBzOi8vZ2l0aHViLmNvbS8weHNxdWlkL2Fzc2V0cy90cmVlL21haW4vaW1hZ2VzL21pZ3JhdGlvbi93ZWJwLzQyMTYxXzB4MDllMTg1OTBlOGY3NmI2Y2Y0NzFiM2NkNzVmZTFhMWE5ZDJiMmMyYi53ZWJwIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX1dLCJjdXJzb3IiOiJkNTQ0NzIxMC1mNTZiLTQxMzUtOWVlNi04N2Y4NzUyZWMyMWQiLCJjdXJyZW50UGFnZSI6MzIsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-33.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-33.json deleted file mode 100644 index c885767e..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-33.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.706Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "33" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1637", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"665-oajnOn1b9K7gs9Myvb26BxZ1VrA\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDY2OTQzNDBmYzAyMGM1RTZCOTY1Njc4NDNkYTJkZjAxYjJDRTFlYjYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiU1RHIiwibmFtZSI6IlN0YXJnYXRlVG9rZW4iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL2dpdGh1Yi5jb20vMHhzcXVpZC9hc3NldHMvdHJlZS9tYWluL2ltYWdlcy9taWdyYXRpb24vd2VicC80MjE2MV8weDY2OTQzNDBmYzAyMGM1ZTZiOTY1Njc4NDNkYTJkZjAxYjJjZTFlYjYud2VicCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4YTYxRjc0MjQ3NDU1QTQwYjAxYjA1NTlmZjYyNzQ0NDFGQWZhMjJBMyIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJNR1AiLCJuYW1lIjoiTWFncGllIFRva2VuIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9naXRodWIuY29tLzB4c3F1aWQvYXNzZXRzL3RyZWUvbWFpbi9pbWFnZXMvbWlncmF0aW9uL3dlYnAvNDIxNjFfMHhhNjFmNzQyNDc0NTVhNDBiMDFiMDU1OWZmNjI3NDQ0MWZhZmEyMmEzLndlYnAiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDk2OGJFM0Y3YmZlRjBGOGVEYzNjMWFEOTAyMzJFYkIwREEwODY3YUEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiU1dPUkxEIiwibmFtZSI6IlNlZWR3b3JsZCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vZ2l0aHViLmNvbS8weHNxdWlkL2Fzc2V0cy90cmVlL21haW4vaW1hZ2VzL21pZ3JhdGlvbi93ZWJwLzQyMTYxXzB4OTY4YmUzZjdiZmVmMGY4ZWRjM2MxYWQ5MDIzMmViYjBkYTA4NjdhYS53ZWJwIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg1NWZGNjI1NjdmMDk5MDZBODUxODNiODY2ZEY4NGJmNTk5YTRiZjcwIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IktST00iLCJuYW1lIjoiS3JvbWF0aWthIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9naXRodWIuY29tLzB4c3F1aWQvYXNzZXRzL3RyZWUvbWFpbi9pbWFnZXMvbWlncmF0aW9uL3dlYnAvNDIxNjFfMHg1NWZmNjI1NjdmMDk5MDZhODUxODNiODY2ZGY4NGJmNTk5YTRiZjcwLndlYnAiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDI0MTYwOTJmMTQzMzc4NzUwYmIyOWI3OWVEOTYxYWIxOTVDY0VlYTUiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiZXpFVEgiLCJuYW1lIjoiUmVuem8gUmVzdGFrZWQgRVRIIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9naXRodWIuY29tLzB4c3F1aWQvYXNzZXRzL3RyZWUvbWFpbi9pbWFnZXMvbWlncmF0aW9uL3dlYnAvNDIxNjFfMHgyNDE2MDkyZjE0MzM3ODc1MGJiMjliNzllZDk2MWFiMTk1Y2NlZWE1LndlYnAiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjozMywidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-34.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-34.json deleted file mode 100644 index c305819d..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-34.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.707Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "34" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1630", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"65e-aDdyM1ZGmY9blUoWCPje7deeHpA\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDM3YTY0NTY0OGRGMjkyMDVDNjI2MTI4OTk4M0ZCMDRFQ0Q3MGI0QjMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQU5JTUUiLCJuYW1lIjoiQW5pbWVjb2luIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9naXRodWIuY29tLzB4c3F1aWQvYXNzZXRzL3RyZWUvbWFpbi9pbWFnZXMvbWlncmF0aW9uL3dlYnAvNDIxNjFfMHgzN2E2NDU2NDhkZjI5MjA1YzYyNjEyODk5ODNmYjA0ZWNkNzBiNGIzLndlYnAiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDMwODJDQzIzNTY4ZUE2NDAyMjVjMjQ2NzY1M2RCOTBlOTI1MEFhQTAiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUkROVCIsIm5hbWUiOiJSYWRpYW50IiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9naXRodWIuY29tLzB4c3F1aWQvYXNzZXRzL3RyZWUvbWFpbi9pbWFnZXMvbWlncmF0aW9uL3dlYnAvNDIxNjFfMHgzMDgyY2MyMzU2OGVhNjQwMjI1YzI0Njc2NTNkYjkwZTkyNTBhYWEwLndlYnAiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDQ1RDk4MzFkODc1MUIyMzI1ZjNEQmY0OGRiNzQ4NzIzNzI2ZTFDOGMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiRVZBIiwibmFtZSI6IkV2ZXJWYWx1ZUNvaW4iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL2dpdGh1Yi5jb20vMHhzcXVpZC9hc3NldHMvdHJlZS9tYWluL2ltYWdlcy9taWdyYXRpb24vd2VicC80MjE2MV8weDQ1ZDk4MzFkODc1MWIyMzI1ZjNkYmY0OGRiNzQ4NzIzNzI2ZTFjOGMud2VicCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4QjY4OEJBMDk2YjdCYjc1ZDc4NDFlNDcxNjNDZDEyRDE4QjM2QTViRiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJtUGVuZGxlIiwibmFtZSI6Im1QZW5kbGUiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL2dpdGh1Yi5jb20vMHhzcXVpZC9hc3NldHMvdHJlZS9tYWluL2ltYWdlcy9taWdyYXRpb24vd2VicC80MjE2MV8weGI2ODhiYTA5NmI3YmI3NWQ3ODQxZTQ3MTYzY2QxMmQxOGIzNmE1YmYud2VicCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4OTk5OTk5OTkwMjM3ZTkwMWM1MzdCQkQ3NjhlMDk1NjJiZTAyRWZhNSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJVbmlzaG9wLmFpIiwibmFtZSI6IlVuaXNob3AuYWkiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL2dpdGh1Yi5jb20vMHhzcXVpZC9hc3NldHMvdHJlZS9tYWluL2ltYWdlcy9taWdyYXRpb24vd2VicC80MjE2MV8weDk5OTk5OTk5MDIzN2U5MDFjNTM3YmJkNzY4ZTA5NTYyYmUwMmVmYTUud2VicCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjM0LCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-35.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-35.json deleted file mode 100644 index 38ce56f7..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-35.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.708Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "35" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1616", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"650-fP+Z8Pz8qtrKqlJQcN63gmsttJg\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDNFYUJFMThlQUUyNjdEMUI1N2Y5MTdhQmEwODViYjU5MDYxMTQ2MDAiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiZVBlbmRsZSIsIm5hbWUiOiJFcXVpbGlicmlhIFBlbmRsZSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vZ2l0aHViLmNvbS8weHNxdWlkL2Fzc2V0cy90cmVlL21haW4vaW1hZ2VzL21pZ3JhdGlvbi93ZWJwLzQyMTYxXzB4M2VhYmUxOGVhZTI2N2QxYjU3ZjkxN2FiYTA4NWJiNTkwNjExNDYwMC53ZWJwIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgyMjk3YUViRDM4Mzc4N0ExNjBERDBkOUY3MTUwODE0ODc2OTM0MkUzIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkJUQy5iIiwibmFtZSI6IkJpdGNvaW4iLCJkZWNpbWFscyI6OCwiaWNvblVyaSI6Imh0dHBzOi8vZ2l0aHViLmNvbS8weHNxdWlkL2Fzc2V0cy90cmVlL21haW4vaW1hZ2VzL21pZ3JhdGlvbi93ZWJwLzQyMTYxXzB4MjI5N2FlYmQzODM3ODdhMTYwZGQwZDlmNzE1MDgxNDg3NjkzNDJlMy53ZWJwIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg5M0ZBMEI4OEMwQzc4ZTQ1OTgwRmE3NGNkZDg3NDY5MzExYjdCM0U0IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlhCRyIsIm5hbWUiOiJYQm9yZyIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vZ2l0aHViLmNvbS8weHNxdWlkL2Fzc2V0cy90cmVlL21haW4vaW1hZ2VzL21pZ3JhdGlvbi93ZWJwLzQyMTYxXzB4OTNmYTBiODhjMGM3OGU0NTk4MGZhNzRjZGQ4NzQ2OTMxMWI3YjNlNC53ZWJwIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhGMThlNDQ2NkYyNkI0Y0E1NWJiQWI4OTBiMzE0YTU0OTc2RTQ1QjE3IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6Ikc3IiwibmFtZSI6IkdhbWU3IiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9naXRodWIuY29tLzB4c3F1aWQvYXNzZXRzL3RyZWUvbWFpbi9pbWFnZXMvbWlncmF0aW9uL3dlYnAvNDIxNjFfMHhmMThlNDQ2NmYyNmI0Y2E1NWJiYWI4OTBiMzE0YTU0OTc2ZTQ1YjE3LndlYnAiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDc5YmJGNDUwOEIxMzkxYWYzQTBGNEIzMGJiNUZDNGFhOWFiMEUwN0MiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQU5PTiIsIm5hbWUiOiJIZXlBbm9uIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9naXRodWIuY29tLzB4c3F1aWQvYXNzZXRzL3RyZWUvbWFpbi9pbWFnZXMvbWlncmF0aW9uL3dlYnAvNDIxNjFfMHg3OWJiZjQ1MDhiMTM5MWFmM2EwZjRiMzBiYjVmYzRhYTlhYjBlMDdjLndlYnAiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjozNSwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-36.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-36.json deleted file mode 100644 index 984509bd..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-36.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.708Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "36" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1529", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5f9-b9J1pNPb3Vq4uRooiIlam+mWTmE\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDMyMTJkYzBGOGM4MzRlNERFODkzNTMyZDI3Q0M5QjYwMDE2ODREQjAiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUEVBUiIsIm5hbWUiOiJQZWFyIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9naXRodWIuY29tLzB4c3F1aWQvYXNzZXRzL3RyZWUvbWFpbi9pbWFnZXMvbWlncmF0aW9uL3dlYnAvNDIxNjFfMHgzMjEyZGMwZjhjODM0ZTRkZTg5MzUzMmQyN2NjOWI2MDAxNjg0ZGIwLndlYnAiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGE3OGQ4MzIxQjIwYzRFZjkwZUNkNzJmMjU4OEFBOTg1QTRCRGI2ODQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQU5UIiwibmFtZSI6IkF1dG9ub21pIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL2FudC5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDRDYjlhN0FFNDk4Q0VEY0JiNUVBZTlmMjU3MzZhRTdkNDI4QzlENjYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiWEFJIiwibmFtZSI6IlhhaSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9tYWluL2ltYWdlcy93ZWJwMTI4L3Rva2Vucy94YWkud2VicCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MzY0N2M1NGM0YzJDNjViQzdhMkQ2M2MwRGEyODA5QjM5OURCQkRDMCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJTb2x2QlRDIiwibmFtZSI6IlNvbHYgQlRDIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL3NvbHZidGMuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg0RTIwMGZFMmYzZUZiOTc3ZDVmZDljNDMwQTQxNTMxRkIwNGQ5N0I4IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6Ik9SREVSIiwibmFtZSI6Ik9yZGVybHkgTmV0d29yayIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9tYWluL2ltYWdlcy9taWdyYXRpb24vd2VicC80MjE2MV8weDRlMjAwZmUyZjNlZmI5NzdkNWZkOWM0MzBhNDE1MzFmYjA0ZDk3YjgiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjozNiwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-37.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-37.json deleted file mode 100644 index 313cd172..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-37.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.709Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "37" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1536", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"600-wGtqV92A1oSSLX6kDLQq7qGrAeI\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDk2MjMwNjMzNzdBRDFCMjc1NDRDOTY1Y0NkNzM0MmY3RUE3ZTg4QzciLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiR1JUIiwibmFtZSI6IlRoZSBHcmFwaCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9tYWluL2ltYWdlcy9taWdyYXRpb24vd2VicC80MjE2MV8weDk2MjMwNjMzNzdhZDFiMjc1NDRjOTY1Y2NkNzM0MmY3ZWE3ZTg4Yzcud2VicCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4NjFBMWZmNTVDNTIxNmI2MzZhMjk0QTA3RDc3QzZGNERmMTBkM0I1NiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJBUEVYIiwibmFtZSI6IkFwZVggVG9rZW4iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vMHhzcXVpZC9hc3NldHMvbWFpbi9pbWFnZXMvd2VicDEyOC90b2tlbnMvYXBleC53ZWJwIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg3ZjlGQmY5YkRkM0Y0MTA1QzQ3OGI5OTZCNjQ4RkU2ZTgyOGExZTk4IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkFQRSIsIm5hbWUiOiJBcGVDb2luIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL21haW4vaW1hZ2VzL3dlYnAxMjgvdG9rZW5zL2FwZS53ZWJwIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgxQTZCM0E2MjM5MUVDY2FhYTk5MmFkZTQ0Y2Q0QUZlNmJFQzhDZkYxIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlVYTElOSyIsIm5hbWUiOiJVWExJTksgVG9rZW4iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vMHhzcXVpZC9hc3NldHMvbWFpbi9pbWFnZXMvd2VicDEyOC90b2tlbnMvdXhsaW5rLndlYnAiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDY4MDQ0NzU5NWU4YjdiM0FhMUI0M2JlQjlmNjA5OEM3OWFjMkFiM2YiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiVVNERCIsIm5hbWUiOiJVU0REIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL21haW4vaW1hZ2VzL21pZ3JhdGlvbi93ZWJwLzQyMTYxXzB4NjgwNDQ3NTk1ZThiN2IzYWExYjQzYmViOWY2MDk4Yzc5YWMyYWIzZi53ZWJwIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX1dLCJjdXJzb3IiOiJkNTQ0NzIxMC1mNTZiLTQxMzUtOWVlNi04N2Y4NzUyZWMyMWQiLCJjdXJyZW50UGFnZSI6MzcsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-38.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-38.json deleted file mode 100644 index 059108b5..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-38.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.709Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "38" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1609", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"649-hoQ6R+dUdx/3RkPnFP1+kpEk7oQ\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEUwODYwMjIyOTA0NDRiY0QyNzlEMjJjNTY5MjVjYzVFZGEzODk5OTkiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiWVNBUkIiLCJuYW1lIjoibHVja3kgbW9uZXkgQXJiIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL21haW4vaW1hZ2VzL3dlYnAxMjgvdG9rZW5zL3lzYXJiLndlYnAiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGNiQjdDMDAwMGFCODhCNDczYjFmNWFGZDllZjgwODQ0MGVlZDMzQmYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiY2JCVEMiLCJuYW1lIjoiQ29pbmJhc2UgV3JhcHBlZCBCVEMiLCJkZWNpbWFscyI6OCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9tYWluL2ltYWdlcy93ZWJwMTI4L3Rva2Vucy9jYmJ0Yy53ZWJwIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgxQ0Q5YTU2YzhDMmVBOTEzYzcwMzE5QTQ0RGE3NWU5OTI1NWFhNDZmIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6Ik9CVCIsIm5hbWUiOiJPcmJpdGVyIEZpbmFuY2UiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vMHhzcXVpZC9hc3NldHMvbWFpbi9pbWFnZXMvbWlncmF0aW9uL3dlYnAvNDIxNjFfMHgxY2Q5YTU2YzhjMmVhOTEzYzcwMzE5YTQ0ZGE3NWU5OTI1NWFhNDZmLndlYnAiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDlkMkYyOTk3MTVEOTRkOEE3RTZGNWVhYThFNjU0RThjNzRhOTg4QTciLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiRlhTIiwibmFtZSI6IkZyYXggU2hhcmUiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vMHhzcXVpZC9hc3NldHMvbWFpbi9pbWFnZXMvbWlncmF0aW9uL3dlYnAvNDIxNjFfMHg5ZDJmMjk5NzE1ZDk0ZDhhN2U2ZjVlYWE4ZTY1NGU4Yzc0YTk4OGE3LndlYnAiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDFiODk2ODkzZGZjODZiYjY3Q2Y1Nzc2NzI5OGI5MDczRDJjMWJBMmMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQ0FLRSIsIm5hbWUiOiJQYW5jYWtlU3dhcCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9tYWluL2ltYWdlcy9taWdyYXRpb24vd2VicC80MjE2MV8weDFiODk2ODkzZGZjODZiYjY3Y2Y1Nzc2NzI5OGI5MDczZDJjMWJhMmMud2VicCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjM4LCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-39.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-39.json deleted file mode 100644 index 5325e582..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-39.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.710Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "39" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1531", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5fb-4j8VVppWGupwfvRRt8ZKTl3eP/A\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDM1NEE2ZEEzZmNkZTA5OEY4Mzg5Y2FkODRiMDE4MjcyNWM2QzkxZEUiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQ09NUCIsIm5hbWUiOiJDb21wb3VuZCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9tYWluL2ltYWdlcy9taWdyYXRpb24vd2VicC80MjE2MV8weDM1NGE2ZGEzZmNkZTA5OGY4Mzg5Y2FkODRiMDE4MjcyNWM2YzkxZGUud2VicCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MzU3NTEwMDdhNDA3Y2E2RkVGZkU4MGIzY0IzOTc3MzZEMmNmNGRiZSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJ3ZUVUSCIsIm5hbWUiOiJXcmFwcGVkIGVFVEgiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vMHhzcXVpZC9hc3NldHMvbWFpbi9pbWFnZXMvd2VicDEyOC90b2tlbnMvd2VldGgud2VicCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MTMzNzQyMGRFRDVBRGI5OTgwQ0ZjMzVmOGYyQjA1NGVhODZmOGFCMSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJTUUQiLCJuYW1lIjoiU3Vic3F1aWQiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vMHhzcXVpZC9hc3NldHMvbWFpbi9pbWFnZXMvd2VicDEyOC90b2tlbnMvc3FkLndlYnAiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGJhNURkRDFmOWQ3RjU3MGRjOTRhNTE0NzlhMDAwRTNCQ0U5NjcxOTYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQUFWRSIsIm5hbWUiOiJBYXZlIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL21haW4vaW1hZ2VzL21hc3Rlci90b2tlbnMvYWF2ZS5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDlFNzU4QjhhOThhNDJkNjEyYjNEMzhCNjZhMjIwNzREQzAzRDczNzAiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiU0lTIiwibmFtZSI6IlN5bWJpb3NpcyIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9tYWluL2ltYWdlcy9taWdyYXRpb24vd2VicC80MjE2MV8weDllNzU4YjhhOThhNDJkNjEyYjNkMzhiNjZhMjIwNzRkYzAzZDczNzAud2VicCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjM5LCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-4.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-4.json deleted file mode 100644 index 3e99e512..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-4.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.681Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "4" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1476", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5c4-Bwrt9ZNbBfXylCR6tZwnEzB5cqE\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDQ3QzMzN0JkNWI5MzQ0YTZGM0Q2ZjU4QzQ3NEQ5RDhjZDQxOUQ4Y0EiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiREFDS0lFIiwibmFtZSI6IkRhY2tpZSBUb2tlbiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9kYWNraWUuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg0OThDNjIwQzdDOTFDNmViYTJFM0NkNTQ4NTM4M2Y0MTYxM2I3RUI2IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkFNS1QiLCJuYW1lIjoiQWxvbmdzaWRlIENyeXB0byBNYXJrZXQgSW5kZXgiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vMHhzcXVpZC9hc3NldHMvbWFpbi9pbWFnZXMvdG9rZW5zL2Fta3Quc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgyODliYTE3MDFDMkYwODhjZjBmYWY4QjM3MDUyNDYzMzFjQjhBODM5IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkxQVCIsIm5hbWUiOiJMaXZlcGVlciIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9tYWluL2ltYWdlcy90b2tlbnMvbHB0LnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4N0M4RGJGZEIxODVDMDg4RTczOTk5NzcwQzkzYjg4NTI5NTgwNTczOSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJNT09OIiwibmFtZSI6Ik1vb25mbG93IiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL21vb24uc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgwNmJlRTlFNzIzOGEzMzFCNjhEODNEZjNCNUI5QjE2ZDVEQmE4M2ZmIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkFUT00uYXhsIiwibmFtZSI6IkFUT00gKEF4ZWxhcikiLCJkZWNpbWFscyI6NiwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9hdG9tLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjQsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-40.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-40.json deleted file mode 100644 index 33c2c0e8..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-40.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.710Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "40" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1626", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"65a-Erz2dbpZRsvOV+f2d4TzQcsFp/o\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGMwOENkMjY0NzQ3MjJjRTkzRjREMGMzNEQxNjIwMTQ2MWMxMEFBOEMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQ0FSViIsIm5hbWUiOiJDQVJWIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL21haW4vaW1hZ2VzL21pZ3JhdGlvbi93ZWJwLzQyMTYxXzB4YzA4Y2QyNjQ3NDcyMmNlOTNmNGQwYzM0ZDE2MjAxNDYxYzEwYWE4Yy53ZWJwIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg2Yzg0YThmMWMyOTEwOEY0N2E3OTk2NGI1RmU4ODhENGY0RDBkRTQwIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlRCVEMiLCJuYW1lIjoidEJUQyIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vdG9rZW4tbWVkaWEuZGVmaW5lZC5maS84NDUzXzB4MjM2YWE1MDk3OWQ1ZjNkZTNiZDFlZWI0MGU4MTEzN2YyMmFiNzk0Yl8xNzU1ODE5OTgxX2xhcmdlLnBuZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MDgwRjZBRWQzMkZjNDc0REQ1NzE3MTA1RGJhNWVhNTcyNjhGNDZlYiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJTWU4iLCJuYW1lIjoiU3luYXBzZSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9tYWluL2ltYWdlcy9taWdyYXRpb24vd2VicC80MjE2MV8weDA4MGY2YWVkMzJmYzQ3NGRkNTcxNzEwNWRiYTVlYTU3MjY4ZjQ2ZWIud2VicCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MGM4ODBmNjc2MUYxYWY4ZDlBYTlDNDY2OTg0YjgwREFiOWE4YzllOCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJQRU5ETEUiLCJuYW1lIjoiUGVuZGxlIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL21haW4vaW1hZ2VzL21pZ3JhdGlvbi93ZWJwLzQyMTYxXzB4MGM4ODBmNjc2MWYxYWY4ZDlhYTljNDY2OTg0YjgwZGFiOWE4YzllOC53ZWJwIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg3MTg5ZmI1QjY1MDRiYmZGNmE4NTJCMTNCN0I4MmEzYzExOGZEYzI3IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkVUSEZJIiwibmFtZSI6IkV0aGVyLmZpIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL21haW4vaW1hZ2VzL21pZ3JhdGlvbi93ZWJwLzQyMTYxXzB4NzE4OWZiNWI2NTA0YmJmZjZhODUyYjEzYjdiODJhM2MxMThmZGMyNy53ZWJwIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX1dLCJjdXJzb3IiOiJkNTQ0NzIxMC1mNTZiLTQxMzUtOWVlNi04N2Y4NzUyZWMyMWQiLCJjdXJyZW50UGFnZSI6NDAsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-41.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-41.json deleted file mode 100644 index 761c0728..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-41.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.711Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "41" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1620", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"654-5v/H6HPukEWulA6r870AmbImg+U\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDY5ODU4ODRDNDM5MkQzNDg1ODdCMTljYjllQUFmMTU3RjEzMjcxY2QiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiWlJPIiwibmFtZSI6IkxheWVyWmVybyIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9tYWluL2ltYWdlcy9taWdyYXRpb24vd2VicC80MjE2MV8weDY5ODU4ODRjNDM5MmQzNDg1ODdiMTljYjllYWFmMTU3ZjEzMjcxY2Qud2VicCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4QjBmRmE4MDAwODg2ZTU3Rjg2ZGQ1MjY0Yjk1ODJiMkFkODdiMmI5MSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJXIiwibmFtZSI6Ildvcm1ob2xlIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL21haW4vaW1hZ2VzL21pZ3JhdGlvbi93ZWJwLzQyMTYxXzB4YjBmZmE4MDAwODg2ZTU3Zjg2ZGQ1MjY0Yjk1ODJiMmFkODdiMmI5MS53ZWJwIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhjYjhiNUNEMjBCZENhZWE5YTAxMGFDMUY4ZDgzNTgyNEY1Qzg3QTA0IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkNPVyIsIm5hbWUiOiJDb1cgUHJvdG9jb2wiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vMHhzcXVpZC9hc3NldHMvbWFpbi9pbWFnZXMvbWlncmF0aW9uL3dlYnAvNDIxNjFfMHhjYjhiNWNkMjBiZGNhZWE5YTAxMGFjMWY4ZDgzNTgyNGY1Yzg3YTA0LndlYnAiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDA5MTk5ZDlBNUY0NDQ4RDA4NDhlNDM5NUQwNjVlMWFkOWM0YTFGNzQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQk9OSyIsIm5hbWUiOiJCb25rIiwiZGVjaW1hbHMiOjUsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vMHhzcXVpZC9hc3NldHMvbWFpbi9pbWFnZXMvbWlncmF0aW9uL3dlYnAvNDIxNjFfMHgwOTE5OWQ5YTVmNDQ0OGQwODQ4ZTQzOTVkMDY1ZTFhZDljNGExZjc0LndlYnAiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGIzNzE5NGU4Yjk5MDIwQUUwQjhiNjg2MWQ0MjE3YTlmMDE2NzA2YTQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiSFlCIiwibmFtZSI6Ikh5YnJpZCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9oeWJyaWQuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX1dLCJjdXJzb3IiOiJkNTQ0NzIxMC1mNTZiLTQxMzUtOWVlNi04N2Y4NzUyZWMyMWQiLCJjdXJyZW50UGFnZSI6NDEsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-42.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-42.json deleted file mode 100644 index 8b2ceb6c..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-42.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.712Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "42" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1567", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"61f-ZD3EEwxqbo/vosybERfnIHFQVc4\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDRlY2Y2MWE2YzJGYUI4QTA0N0NFQjNCM0IyNjNCNDAxNzYzZTlENDkiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiVVNORCIsIm5hbWUiOiJVUyBOZXJpdGUgRG9sbGFyIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9naXRodWIuY29tLzB4c3F1aWQvYXNzZXRzL3RyZWUvbWFpbi9pbWFnZXMvbWlncmF0aW9uL3dlYnAvNDIxNjFfMHg0ZWNmNjFhNmMyZmFiOGEwNDdjZWIzYjNiMjYzYjQwMTc2M2U5ZDQ5LndlYnAiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDBjM0ZGMDI1QUFjZkEyNjcwNDIwRjFENENCNTkzREQyYTBBMDM4M0UiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiV2VITU5EIiwibmFtZSI6IldyYXBwZWQgZUhNTkQiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL2dpdGh1Yi5jb20vMHhzcXVpZC9hc3NldHMvdHJlZS9tYWluL2ltYWdlcy9taWdyYXRpb24vd2VicC80MjE2MV8weDBjM2ZmMDI1YWFjZmEyNjcwNDIwZjFkNGNiNTkzZGQyYTBhMDM4M2Uud2VicCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4N0Y5NTMyOTQwZTk4ZUI3YzJkYTZiYTIzYzNmM0QwNjMxNUJmYUFGMSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJDSEFSIiwibmFtZSI6IkNoYXJsaWUgQnVsbCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9jaGFyLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4YjZBZDZlQjBCNGQ2NzNiM0NjNEExZEE0NDZmYTNiY2ZFYTA0ZDRlOCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJBblVTRCIsIm5hbWUiOiJUb2tlbiBvZiBBbm94Q2hhbmdlIEVjb3N5c3RlbSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9hbnVzZC5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDc2MjljMURGMzIzYzgxNjhjZjE1RDQ1NzZiMzQwY2E3NGM4MTEyMDciLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiVFJJIiwibmFtZSI6IlRyaXVtcGgiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMvdHJpLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjQyLCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-43.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-43.json deleted file mode 100644 index 391fec97..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-43.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.712Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "43" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1536", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"600-aSe7lnr8S0ON9bZQrokmhMs+Lr0\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGU2NDllNmExRjJhZmM2M2NhMjY4QzIzNjM2OTFjZUNBRjc1Q0Y0N0MiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUkxDIiwibmFtZSI6ImlFeGVjIFJMQyIsImRlY2ltYWxzIjo5LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL21haW4vaW1hZ2VzL3Rva2Vucy9ybGMuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg0MDQ2MTI5MTM0N2UxZUNiYjA5NDk5RjMzNzFEM2YxN2YxMGQ3MTU5IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlhBVXQwIiwibmFtZSI6IlRldGhlciBHb2xkIiwiZGVjaW1hbHMiOjYsImljb25VcmkiOiJodHRwczovL3Rva2VuLW1lZGlhLmRlZmluZWQuZmkvOTk5XzB4ZjRkOTIzNTI2OWE5NmFhZGFmYzlhZGFlNDU0YTA2MThlYmUzNzk0OV8xNzU4Mjk2NzY0X2xhcmdlLnBuZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4RjE5N0ZGQzI4YzIzRTAzMDlCNTU1OWU3YTE2NmYyYzYxNjRDODBhQSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJNWE5CIiwibmFtZSI6Ik1YTkIgKE1leGljYW4gUGVzbykiLCJkZWNpbWFscyI6NiwiaWNvblVyaSI6Imh0dHBzOi8vdG9rZW4tbWVkaWEuZGVmaW5lZC5maS80MzExNF8weGYxOTdmZmMyOGMyM2UwMzA5YjU1NTllN2ExNjZmMmM2MTY0YzgwYWFfMTc2MDQyNzgyMl9zbWFsbC5wbmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDQ2ODUwYUQ2MUMyQjdkNjRkMDhjOUM3NTRGNDUyNTQ1OTY2OTY5ODQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUFlVU0QiLCJuYW1lIjoiUGF5UGFsIFVTRCIsImRlY2ltYWxzIjo2LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL3JlZnMvaGVhZHMvbWFpbi9pbWFnZXMvbWFzdGVyL3Rva2Vucy9weXVzZC5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDBBMWExQTEwN0U0NWI3Q2VkODY4MzM4NjNmNDgyQkM1ZjRlZDgyRUYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiVVNEYWkiLCJuYW1lIjoiVVNEYWkiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3VnYy5wcm9kdWN0aW9uLmxpbmt0ci5lZS9hMTQ5OGM4My0zOTQzLTQ5OGItYTQ4Zi00ODEzY2U1YmU4MDZfOTM5YmY0MzAtMzFlYi00ZmM2LThlMGEtOWIxZTZkZDU2YTQwLmpwZWc/aW89dHJ1ZSZzaXplPWF2YXRhci12M18wIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX1dLCJjdXJzb3IiOiJkNTQ0NzIxMC1mNTZiLTQxMzUtOWVlNi04N2Y4NzUyZWMyMWQiLCJjdXJyZW50UGFnZSI6NDMsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-44.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-44.json deleted file mode 100644 index 68bdfc52..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-44.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.713Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "44" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1485", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5cd-rdZZy39uwTf+e0kg/k2MaI2CHhw\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDVGOGE3YzY0NjUxMUE3OTBDNTNGMTcxODkxRTVkNDY5Y0E4ODRFZEUiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiU0xJTkciLCJuYW1lIjoiU2xpbmdzaG90IiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly90b2tlbi1tZWRpYS5kZWZpbmVkLmZpLzQyMTYxXzB4NWY4YTdjNjQ2NTExYTc5MGM1M2YxNzE4OTFlNWQ0NjljYTg4NGVkZV8xNzU2ODQyNTkwX2xhcmdlLnBuZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4NjFEQmJCYjU1MmRjODkzYWIzYUFkMDlGMjg5ZjgxMUU2N2NFZjI4NSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJTS0FURSIsIm5hbWUiOiJTa2F0ZSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vdG9rZW4tbWVkaWEuZGVmaW5lZC5maS80MjE2MV8weDYxZGJiYmI1NTJkYzg5M2FiM2FhZDA5ZjI4OWY4MTFlNjdjZWYyODVfMTc1OTcyMjI1M19sYXJnZS5wbmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDRhMjRCMTAxNzI4ZTA3QTUyMDUzYzEzRkI0ZEIyQmNGNDkwQ0FiYzMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQUlVUyIsIm5hbWUiOiJBcmJpdXMiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vMHhzcXVpZC9hc3NldHMvcmVmcy9oZWFkcy9tYWluL2ltYWdlcy9tYXN0ZXIvdG9rZW5zL2FpdXMuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhhMzkyNDc4OGU3YzMwOGEzM2QwYTJEY0NjQ0FmN0JEZmFkZDlkNUVkIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IldQQ0kiLCJuYW1lIjoiV3JhcHBlZCBQQ0kiLCJkZWNpbWFscyI6OCwiaWNvblVyaSI6Imh0dHBzOi8vdG9rZW4tbWVkaWEuZGVmaW5lZC5maS8xXzB4M2MyYTMwOWQ5MDA1NDMzYzFiYzJjOTJlZjFiZTA2NDg5ZTViZjI1OF9sYXJnZS5wbmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGExNGEyNmJiNDZlMjM2ZGEzOTRkYTZCMDlhNWI0Q0Y3MzdjZTcwN2IiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoid1RBTyIsIm5hbWUiOiJXcmFwcGVkIFRBTyIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9tYWluL2ltYWdlcy9tYXN0ZXIvdG9rZW5zL3d0YW8uc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX1dLCJjdXJzb3IiOiJkNTQ0NzIxMC1mNTZiLTQxMzUtOWVlNi04N2Y4NzUyZWMyMWQiLCJjdXJyZW50UGFnZSI6NDQsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-45.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-45.json deleted file mode 100644 index 970e7fe9..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-45.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.713Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "45" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1532", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5fc-xFFjpEKzeNe9LUY4BqNn9R5+piY\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweENCOEZBOWE3NmI4ZTIwM0Q4QzM3OTdiRjQzOGQ4RkI4MUVhMzMyNkEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiYWxVU0QiLCJuYW1lIjoiQWxjaGVtaXggVVNEIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly90b2tlbi1tZWRpYS5kZWZpbmVkLmZpLzQyMTYxXzB4Y2I4ZmE5YTc2YjhlMjAzZDhjMzc5N2JmNDM4ZDhmYjgxZWEzMzI2YV9sYXJnZS5wbmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDE3ODQxMmU3OWMyNTk2OGEzMmU4OWIxMWY2M0IzM0Y3MzM3NzBjMkEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiZnJ4RVRIIiwibmFtZSI6IkZyYXggRXRoZXIiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Rva2VuLW1lZGlhLmRlZmluZWQuZmkvNDIxNjFfMHgxNzg0MTJlNzljMjU5NjhhMzJlODliMTFmNjNiMzNmNzMzNzcwYzJhXzE3NTY4OTI2MzdfbGFyZ2UucG5nIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg3NGNjYmU1M0Y3N2IwODYzMmNlMENCOTFEM0E1NDViRjZCOEUwOTc5IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6ImZCT01CIiwibmFtZSI6IkZhbnRvbSBCb21iIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly90b2tlbi1tZWRpYS5kZWZpbmVkLmZpLzQyMTYxXzB4NzRjY2JlNTNmNzdiMDg2MzJjZTBjYjkxZDNhNTQ1YmY2YjhlMDk3OV8xNzI5OTE5NjgxX2xhcmdlLnBuZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4NkE3NjYxNzk1QzM3NGMwYkZDNjM1OTM0ZWZBZGRGZjNBN0VlMjNiNiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJET0xBIiwibmFtZSI6IkRvbGEgVVNEIFN0YWJsZWNvaW4iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Rva2VuLW1lZGlhLmRlZmluZWQuZmkvNDIxNjFfMHg2YTc2NjE3OTVjMzc0YzBiZmM2MzU5MzRlZmFkZGZmM2E3ZWUyM2I2XzE3NTUyNTA4ODRfbGFyZ2UucG5nIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg1NTY3OGNkMDgzZmNEQzI5NDdhMERmNjM1YzkzQzgzOEM4OTQ1NEEzIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkxPTiIsIm5hbWUiOiJUb2tlbmxvbiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vdG9rZW4tbWVkaWEuZGVmaW5lZC5maS80MjE2MV8weDU1Njc4Y2QwODNmY2RjMjk0N2EwZGY2MzVjOTNjODM4Yzg5NDU0YTNfMTc1ODUxOTgxOF9sYXJnZS5wbmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo0NSwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-46.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-46.json deleted file mode 100644 index 0f8c0ec7..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-46.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.714Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "46" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1493", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5d5-K+3bPN5Vwsi1vp+9D5h5ZmBU9qQ\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDZmQkJiRDhiRkIxY2QzOTg2QjFEMDVlNzg2MWEwZjYyRjg3REI3NGIiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiVlNOIiwibmFtZSI6IlZpc2lvbiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vdG9rZW4tbWVkaWEuZGVmaW5lZC5maS80MjE2MV8weDZmYmJiZDhiZmIxY2QzOTg2YjFkMDVlNzg2MWEwZjYyZjg3ZGI3NGJfbGFyZ2UucG5nIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgzMTI0Njc4RDYyRDJhYTFmNjE1QjU0NTI1MzEwZmJmRGE2RGNGN0FFIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlNOU1kiLCJuYW1lIjoiU2Vuc2F5IiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly90b2tlbi1tZWRpYS5kZWZpbmVkLmZpLzQyMTYxXzB4MzEyNDY3OGQ2MmQyYWExZjYxNWI1NDUyNTMxMGZiZmRhNmRjZjdhZV8xNzU4ODI5NTc5X2xhcmdlLnBuZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4NDM3Y2MzMzM0NGEwQjI3QTQyOWY3OTVmZjZCNDY5QzcyNjk4QjI5MSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJ3TSIsIm5hbWUiOiJXcmFwcGVkTSBieSBNXjAiLCJkZWNpbWFscyI6NiwiaWNvblVyaSI6Imh0dHBzOi8vdG9rZW4tbWVkaWEuZGVmaW5lZC5maS80MjE2MV8weDQzN2NjMzMzNDRhMGIyN2E0MjlmNzk1ZmY2YjQ2OWM3MjY5OGIyOTFfbGFyZ2UucG5nIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhmREQyMkNlNkQxRjY2YmMwRWM4OWIyMEJGMTZDY0I2NjcwRjU1QTVhIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6InRoQklMTCIsIm5hbWUiOiJ0aEJJTEwiLCJkZWNpbWFscyI6NiwiaWNvblVyaSI6Imh0dHBzOi8vdG9rZW4tbWVkaWEuZGVmaW5lZC5maS80MjE2MV8weGZkZDIyY2U2ZDFmNjZiYzBlYzg5YjIwYmYxNmNjYjY2NzBmNTVhNWFfbGFyZ2UucG5nIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg5ODIyMzlEMzhBZjUwQjAxNjhkQTMzMzQ2ZDg1RmIxMjkyOWM0YzA3IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlRST1ZFIiwibmFtZSI6IkFyYml0cm92ZSBHb3Zlcm5hbmNlIFRva2VuIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly90b2tlbi1tZWRpYS5kZWZpbmVkLmZpLzQyMTYxXzB4OTgyMjM5ZDM4YWY1MGIwMTY4ZGEzMzM0NmQ4NWZiMTI5MjljNGMwN19sYXJnZS5wbmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo0NiwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-47.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-47.json deleted file mode 100644 index 173f0ff8..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-47.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.714Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "47" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1492", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5d4-2AnGzggjgnE6ndW+5zrjg+5Kc5Q\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDBCNjNDNjFiYmE0YTg3NmE2ZUI4YjVlNTk2ODAwRjc2NDlBOUI3MUUiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiU0VDVCIsIm5hbWUiOiJTZWN0b3IiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Rva2VuLW1lZGlhLmRlZmluZWQuZmkvNDIxNjFfMHgwYjYzYzYxYmJhNGE4NzZhNmViOGI1ZTU5NjgwMGY3NjQ5YTliNzFlX2xhcmdlLnBuZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MmU4MDI1OUM5MDcxQjYxNzYyMDVGRjVGNUViNkY3RUM4MzYxYjkzZiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJIQVNIIiwibmFtZSI6Ikhhc2hEQU8gVG9rZW4iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Rva2VuLW1lZGlhLmRlZmluZWQuZmkvNDIxNjFfMHgyZTgwMjU5YzkwNzFiNjE3NjIwNWZmNWY1ZWI2ZjdlYzgzNjFiOTNmX2xhcmdlLnBuZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4RjQyZTJCOGJjMmFGOEIxMTBiNjViZTk4ZEIxMzIxQjFhYjhENDRmNSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJET05VVCIsIm5hbWUiOiJEb251dCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vdG9rZW4tbWVkaWEuZGVmaW5lZC5maS80MjE2MV8weGY0MmUyYjhiYzJhZjhiMTEwYjY1YmU5OGRiMTMyMWIxYWI4ZDQ0ZjVfMTc1MzE3MDA1MV9sYXJnZS5wbmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDE3NTczMTUwZDY3ZDgyMDU0MkVGYjI0MjEwMzcxNTQ1YTQ4NjhCMDMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiYWxFVEgiLCJuYW1lIjoiQWxjaGVtaXggRVRIIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly90b2tlbi1tZWRpYS5kZWZpbmVkLmZpLzFfMHgwMTAwNTQ2ZjJjZDRjOWQ5N2Y3OThmZmM5NzU1ZTQ3ODY1ZmY3ZWU2X2xhcmdlLnBuZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MTE5MUFDNEEzQzQ3ZDdGMzM0QTc4ZDVEN2Q5Yjg3ZkU0NzhlODI2RiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJXQVJEIiwibmFtZSI6IldhcmRlbiBQcm90b2NvbCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9yZWZzL2hlYWRzL21haW4vaW1hZ2VzL21hc3Rlci90b2tlbnMvd2FyZGVuLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjQ3LCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-48.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-48.json deleted file mode 100644 index ec6b34e1..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-48.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.715Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "48" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1468", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5bc-AlC3gQWVwZNAQeXmAnH3+eYoi7k\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGVmMjYxNzE0RjdFNWJhNmI4NkY0NzgwZWI2ZTNiZjI2QjEwNzI5Q0YiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiTE9UVVMiLCJuYW1lIjoiV2hpdGUgTG90dXMiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Rva2VuLW1lZGlhLmRlZmluZWQuZmkvNDIxNjFfMHhlZjI2MTcxNGY3ZTViYTZiODZmNDc4MGViNmUzYmYyNmIxMDcyOWNmX2xhcmdlLnBuZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MTU1ZjBERDA0NDI0OTM5MzY4OTcyZjRlMTgzODY4N2Q2YTgzMTE1MSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJBRG9nZSIsIm5hbWUiOiJBcmJpRG9nZSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vdG9rZW4tbWVkaWEuZGVmaW5lZC5maS80MjE2MV8weDE1NWYwZGQwNDQyNDkzOTM2ODk3MmY0ZTE4Mzg2ODdkNmE4MzExNTFfMTc1ODM3NTg4Ml9sYXJnZS5wbmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGYxN0RiMkNjMzA4RDgyNDE3NTBlQTFCMEE1MjNFOUVCMDYxNWM4MTAiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUk5BTEEiLCJuYW1lIjoiUmVuYSBMYWJzIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9wYnMudHdpbWcuY29tL3Byb2ZpbGVfaW1hZ2VzLzE4NzY4NDkyNDA3NzQ3NDIwMTYvNFRTX2V5ZUJfNDAweDQwMC5qcGciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGNGODAwRjQ5NDhEMTZGMjMzMzM1MDgxOTFCMUIxNTkxZGFGNzA0MzgiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQXBlRVRIIiwibmFtZSI6IkFwZSBFVEgiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vMHhzcXVpZC9hc3NldHMvcmVmcy9oZWFkcy9tYWluL2ltYWdlcy9tYXN0ZXIvdG9rZW5zL2FwZWV0aC5wbmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEI5RjQ2NGQzNDY3YjNEM0E0NUNjYkFDNmRlNzI5MjNjNEM3ODEzZjIiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUExFIiwibmFtZSI6IlBlcmxlIExhYnMiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Bicy50d2ltZy5jb20vcHJvZmlsZV9pbWFnZXMvMTk1MzI1ODQ5MzI0MDEyNzQ4OS9qd2xPbTVsOV80MDB4NDAwLnBuZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjQ4LCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-49.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-49.json deleted file mode 100644 index ec17b493..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-49.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.715Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "49" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1378", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"562-M/Q9gzaEVh8Xsr4uxP/96CCAC7k\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDE3QTg1NDFCODJCRjY3ZTEwQjA4NzQyODRiNEFlNjY4NThjYjFmZDUiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUFNNIiwibmFtZSI6IlBvc3N1bSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vdG9rZW4tbWVkaWEuZGVmaW5lZC5maS80MjE2MV8weDE3YTg1NDFiODJiZjY3ZTEwYjA4NzQyODRiNGFlNjY4NThjYjFmZDVfMTc1Mzg1NDExN19sYXJnZS5wbmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGYwY2IyZGMwZGI1ZTZjNjZCOWE3MEFjMjdCMDZiODc4ZGEwMTcwMjgiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiT0hNIiwibmFtZSI6Ik9seW1wdXMiLCJkZWNpbWFscyI6OSwiaWNvblVyaSI6Imh0dHBzOi8vdG9rZW4tbWVkaWEuZGVmaW5lZC5maS80MjE2MV8weGYwY2IyZGMwZGI1ZTZjNjZiOWE3MGFjMjdiMDZiODc4ZGEwMTcwMjhfMTc0NDA2OTIyNl9sYXJnZS5wbmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDdhMWJFRTMyMDc2NUY3MTI1ZjNDMjEyRDhDMGQxZjdhOTc1QTRkQUEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiU0FUU00iLCJuYW1lIjoiU2F0c3VtYSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vd3d3LnNhdHN1bWEuZXhjaGFuZ2Uvc2F0c3VtYS1sb2dvLnBuZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MjdiNThEMjI2ZmU4Zjc5MjczMGE3OTU3NjQ5NDVDZjE0NjgxNUFBNyIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJBTENYIiwibmFtZSI6IkFsY2hlbWl4IiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9hbGNoZW1peC5maS9pbWFnZXMvaWNvbnMvYWxjeF9tZWQuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg2MWVGNERBYWQyYWZlQUNiNTI2MzQyYzExNzVGZTZiNTJENDEwRTM2IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IktOWCIsIm5hbWUiOiJLb25uZXgiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Bicy50d2ltZy5jb20vcHJvZmlsZV9pbWFnZXMvMTk2NjMzNjExODM1MTM0MzYyMS85QmdOZWVrVV80MDB4NDAwLmpwZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjQ5LCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-5.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-5.json deleted file mode 100644 index e0193e0e..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-5.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.683Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "5" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1486", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5ce-YV6NiD80a2jTM8Fe5kNyPJxTf6c\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDRlOTE0YmJEQ0RFMGY0NTVBOGFDOWQ1OWQzYkY3MzljNDYyODdFZDIiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiU09NTS5heGwiLCJuYW1lIjoiU09NTSAoQXhlbGFyKSIsImRlY2ltYWxzIjo2LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL3NvbW0uc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgyMjVDZjIwMjc0NThGNTM0QzI5Qzk1QTY3OWU4ODVCNEU4QkREZGY3IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkJUU0ciLCJuYW1lIjoiQlRTRyBuYXRpdmUgYXNzZXQiLCJkZWNpbWFscyI6NiwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9idHNnLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4N2Y1MzczQUUyNmMzRThGZkM0Yzc3YjcyNTVERjdlQzFBOWFGNTJhNiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJVU0RULmF4bCIsIm5hbWUiOiJVU0RUIChBeGVsYXIpIiwiZGVjaW1hbHMiOjYsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMvdXNkdC5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEVjYzY4ZDA0NTFFMjAyOTI0MDY5NjdGZTdDMDQyODBFNTIzOEFjN0QiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiZnJ4RVRILmF4bCIsIm5hbWUiOiJGcmF4IEV0aGVyIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL2ZyeGV0aC5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEZhN0Y4OTgwYjBmMUU2NEEyMDYyNzkxY2MzYjA4NzE1NzJmMUY3ZjAiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiVU5JIiwibmFtZSI6IlVuaXN3YXAiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vMHhzcXVpZC9hc3NldHMvbWFpbi9pbWFnZXMvdG9rZW5zL3VuaS5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo1LCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-50.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-50.json deleted file mode 100644 index 36ee4659..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-50.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.716Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "50" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1512", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5e8-kEC7O3xEUknedxfLIAXAWt5scbs\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDY4N0Y5MmJmYTVDZTAzYzY3ZDY5MEEwYjgwRmY0MGYwMzIzOGUzOTIiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiVFdBSUUiLCJuYW1lIjoiVGhlIFdpbGRjYXJkIEFsbGlhbmNlIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL3JlZnMvaGVhZHMvbWFpbi9pbWFnZXMvbWFzdGVyL3Rva2Vucy90d2FpZS5wbmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDExY0ZiNkQ0YmRmNTFkYjU5Mjc3NDRkMEI1RGEzMTBmNDBEQWNBNTEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQURJTiIsIm5hbWUiOiJBRElOIEFJIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL3JlZnMvaGVhZHMvbWFpbi9pbWFnZXMvbWFzdGVyL3Rva2Vucy9hZGluLnBuZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4OGQwZWMwOEI3NEEwQTc3ODRmNkUyQ2ZGOTBjOTkzMEQ5RDU5NWZkNyIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJOUEFJIiwibmFtZSI6Ik5hcHRoYSBBSSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9yZWZzL2hlYWRzL21haW4vaW1hZ2VzL21hc3Rlci90b2tlbnMvbnBhaS5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGJkMTQ0MEMwOTY5MzlmOEQ3YmRDNTM0RjU2QUU4MzQ4NkFjNTBmYkEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUE9XIiwibmFtZSI6IlBvbHlmbG93IiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL3JlZnMvaGVhZHMvbWFpbi9pbWFnZXMvbWFzdGVyL3Rva2Vucy9wb3cuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgxMzllY0ZjRTVjMTQ5NGVlMjdlRTI4NjRGMjFBNTg1ZEJiQjM1ZEIxIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkdTUFRMIiwibmFtZSI6IkdlbnN5biBQcm90b2NvbCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9yZWZzL2hlYWRzL21haW4vaW1hZ2VzL21hc3Rlci90b2tlbnMvZ3NwdGwucG5nIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX1dLCJjdXJzb3IiOiJkNTQ0NzIxMC1mNTZiLTQxMzUtOWVlNi04N2Y4NzUyZWMyMWQiLCJjdXJyZW50UGFnZSI6NTAsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-51.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-51.json deleted file mode 100644 index b559d286..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-51.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.717Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "51" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1459", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5b3-Wu87kGmKBgzFED1+Egllmhw3imc\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDAwYjA2QzQ0NjdENTEyMzc5NDg4RTUwMzFlM0NlMTk3NjBkOEEzNTAiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiR09OSyIsIm5hbWUiOiJHb25rYSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9yZWZzL2hlYWRzL21haW4vaW1hZ2VzL21hc3Rlci90b2tlbnMvZ29uay5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEYxRERlODU0MGM2OUE5OTBiMzNhMUExNDFjODg1MzljOGNCMzZGNWUiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUFlNQUkiLCJuYW1lIjoiUGF5bWFuIEFJIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9wYnMudHdpbWcuY29tL3Byb2ZpbGVfaW1hZ2VzLzE5MDgyNjY0NjAzMzU3MzA2ODgvbUNKUWlBQWdfNDAweDQwMC5qcGciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDA5YWQxMjU1MmVjNDVmODJiRTkwQjM4ZEZFN2IwNjMzMkE2ODA4NjQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQVJCWSIsIm5hbWUiOiJBZGFtYW50IFRva2VuIChBcmJpdHJ1bSkiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Bicy50d2ltZy5jb20vcHJvZmlsZV9pbWFnZXMvMTM4NjM5NzQ2ODUxMDg1NTE3OC9EU0JIbnEyLV80MDB4NDAwLnBuZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4Yjk4MjVBYWQ0MDFhMGFlNmI3MTAzZDNlN2JCQzYzZWFjZTgyMmM2RCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJQQU4iLCJuYW1lIjoiUEFOIE5ldHdvcmsiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Bicy50d2ltZy5jb20vcHJvZmlsZV9pbWFnZXMvMTg0NzUyNDUxMTEzNjMwNTE1My9oZHUxSlhYS180MDB4NDAwLmpwZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4ZDI1MzBmRTcyNzU1YjYwNTYyNTcwZjQ3OWIwNzdmM0ZmQThmMGViQyIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJIWUxJQyIsIm5hbWUiOiJIeXBlcmJvbGljIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL3JlZnMvaGVhZHMvbWFpbi9pbWFnZXMvbWFzdGVyL3Rva2Vucy9udWxsLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjUxLCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-52.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-52.json deleted file mode 100644 index 84be811d..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-52.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.718Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "52" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1118", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"45e-fu7eSRXXUIYDPxMjTBV7ngEnP8w\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDMyRWI3OTAyRDQxMzRiZjk4QTI4Yjk2M0QyNmRlNzc5QUY5MkEyMTIiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoickRQWCIsIm5hbWUiOiJEb3BleCBSZWJhdGUgVG9rZW4iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjpmYWxzZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgyYmNDNkQ2Q2RCYkRDMGE0MDcxZTQ4YmIzQjk2OWIwNkIzMzMwYzA3IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlNPTCIsIm5hbWUiOiJXcmFwcGVkIFNPTCAoV29ybWhvbGUpIiwiZGVjaW1hbHMiOjksImljb25VcmkiOiJodHRwczovL2Fzc2V0cy5jb2luZ2Vja28uY29tL2NvaW5zL2ltYWdlcy80MTI4L3NtYWxsL3NvbGFuYS5wbmc/MTY0MDEzMzQyMiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4NGUzNTJjRjE2NEU2NEFEQ0JhZDMxOEMzYTFlMjIyRTlFQmE0Q2U0MiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJNQ0IiLCJuYW1lIjoiTVVYIFByb3RvY29sIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6ZmFsc2V9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4ZGRCZkJkNWRjM0JBMEZlQjk2Q2I1MTNCNjg5OTY2YjIxNzZkNGMwOSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJTVEVBSyIsIm5hbWUiOiJTVEVBSyIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDU0QkRCRjNjRTM2ZjQ1MUVjNjE0OTMyMzZiOEU2MjEzYWM4N2MwZjYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUkRQIiwibmFtZSI6IlJhZHBpZSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo1MiwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-53.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-53.json deleted file mode 100644 index fa4eaf59..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-53.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.718Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "53" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1035", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"40b-MX1FGFPGNlZTqIZH2AeOxdPt9UU\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDcxNjI1Q2NkODE1N2MxMjMxNzJENDU3QUU5NDdGYjQxMzBhMDU5MzIiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQVRMQVMiLCJuYW1lIjoiQXRsYXNQYWlycyIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDAyZjkyODAwRjU3QkNENzQwNjZGNTcwOUYxRGFhMUE0MzAyRGY4NzUiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUEVBUyIsIm5hbWUiOiJQZWFwb2RzIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6ZmFsc2V9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4RUQ2NUM1MDg1YTE4RmExNjBBZjAzMTNFNjBkY2M3OTA1RTk0NERjNyIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJFVEh4IiwibmFtZSI6IkVUSHgiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjpmYWxzZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg4MGM0MDM4MDdiMTAzMmQ3Q0IxOWI2RDYxMmNFMjNmMDVBMjEzRDM2IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlJFTlpPU0lMTysrIiwibmFtZSI6IlJFTlpPU0lMTysrIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6ZmFsc2V9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MTBhQWVEMjg5YTdiMUIwMTU1YkY0Yjg2Yzg2MmYyOTdFODQ0NjVlMCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJSQkMiLCJuYW1lIjoiUlVCSUMgVE9LRU4iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjpmYWxzZX1dLCJjdXJzb3IiOiJkNTQ0NzIxMC1mNTZiLTQxMzUtOWVlNi04N2Y4NzUyZWMyMWQiLCJjdXJyZW50UGFnZSI6NTMsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-54.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-54.json deleted file mode 100644 index 98aaef25..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-54.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.719Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "54" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1051", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"41b-hRCyyO0j4AI7gXAlswwacgiF0YY\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEY2NTI0N0I2RUQzRTdGRGJBQzMxMzk1OUIzZjYyNDc1RkJCNUY4RTQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQlJJWCIsIm5hbWUiOiJCcmlnaHRQb29sIEV4Y2hhbmdlIFRva2VuIiwiZGVjaW1hbHMiOjksImljb25VcmkiOiIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjpmYWxzZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg1NTc1NTUyOTg4QTNBODA1MDRiQmFlQjEzMTE2NzRmQ0ZkNDBhRDRCIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlNQQSIsIm5hbWUiOiJTcGVyYXgiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjpmYWxzZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgzNWUwNTBkM0MwZUMyZDI5RDI2OWE4RWNFYTc2M2ExODNiREY5QTlEIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlVTRFkiLCJuYW1lIjoiT25kbyBVLlMuIERvbGxhciBZaWVsZCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDM1ZjFDNWNCN0ZiOTc3RTY2OWZEMjQ0QzU2N0RhOTlkOGEzYTY4NTAiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiVVNEMCIsIm5hbWUiOiJVc3VhbCBVU0QiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjpmYWxzZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgyMEQ0MTlhOGUxMkM0NWY4OGZEQTdjNTc2MGJiNjkyM0NlZTI3Rjk4IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6Im9MUCIsIm5hbWUiOiJvc3RpdW1MUCIsImRlY2ltYWxzIjo2LCJpY29uVXJpIjoiIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6ZmFsc2V9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjU0LCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-55.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-55.json deleted file mode 100644 index 852203b9..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-55.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.720Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "55" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1007", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"3ef-v+Zdzvn5fVExWtdb+NVuxuqQ6jY\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGY4MTczYTM5YzU2YTU1NDgzN0M0QzdmMTA0MTUzQTAwNUQyODREMTEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiRURVIiwibmFtZSI6IkVEVSBDb2luIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6ZmFsc2V9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MDk0M0MxNzhGYmMxZWFmNjExNDdBODhDMTBFN0FlNWMyRDA4OTc1QSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJCQVNFIiwibmFtZSI6IkJBU0UiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjpmYWxzZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg3NzVCMTY2YUUxYmEwNzU5MGQ2ODI1MDQ0NUVEYTc4NTIxMTBkNzc0IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkNhbVYzIiwibmFtZSI6IkNhbVYzIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6ZmFsc2V9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4OUU5MDI5NkExMzQzMjU4Mzg4QTY0NzZkYjFjMTJkNzZkZDA0NTA0RSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJVU0RDIiwibmFtZSI6IlVTREMiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjpmYWxzZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgzMGE1MzhlRkZEOTFBQ2VGYjFiMTJDRTlCYzAwNzRlRDE4YzlkRmM5IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlQiLCJuYW1lIjoiVGFsb3MiLCJkZWNpbWFscyI6OSwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo1NSwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-56.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-56.json deleted file mode 100644 index 20ef33df..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-56.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.720Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "56" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1023", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"3ff-wJAp/QCCHW/LaFmijV/JbuGKN+Y\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDgyNjU2QjAxMjExZUQ3NjBGM2NBN0Y1OTdiMDU5MjhjZDcyYzE5NzEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQ1VTRCIsIm5hbWUiOiJDcnlwdG9ob3N0IEJyaWRnZWQgVVNEIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6ZmFsc2V9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MjkxMzQ0RkJhYUM0ZkUxNDYzMjA2MUU0YzMzNkZlM0I5NGM1MjMyMCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJBUkIrKyIsIm5hbWUiOiJBUkIrKyIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDhkQTAyYjVBNTRFMjBGNTVEZTVBOEUyOTNkYjk5YzllYzBkQTdCMDciLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiV0xGSSIsIm5hbWUiOiJXTEZJIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6ZmFsc2V9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4YjAyQUNlNGMzODRCRjAwQjlDODAwRUVDQ2U2RTAxN2E3OTI2MmIwNyIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJXTEZJIiwibmFtZSI6IldMRkkiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjpmYWxzZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg0ZDJhOWQwYkM4N0IxMmRkNTU5REQzMTZCM0VEQ0I0N2Q4MjVFMWM2IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6Ind1dCIsIm5hbWUiOiJ3dXQiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjpmYWxzZX1dLCJjdXJzb3IiOiJkNTQ0NzIxMC1mNTZiLTQxMzUtOWVlNi04N2Y4NzUyZWMyMWQiLCJjdXJyZW50UGFnZSI6NTYsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-57.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-57.json deleted file mode 100644 index 3d82170c..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-57.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.721Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "57" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1018", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"3fa-CVH4SydDWU1vrwDVCJlbJe971As\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDhjODNFNjA5NUMzZkVjMWMxNjJFNEQzNDAyMURDYjI4RDEwYURlM0UiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiVEVTVDIiLCJuYW1lIjoidGVzdDIiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjpmYWxzZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhERDA3MDA2Q0QxRjc4NEQ5NjhGYUNBQkIwMTk3NDQ3NEY3NGIzODJBIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlRFU1QyIiwibmFtZSI6InRlc3QyIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6ZmFsc2V9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4ODQ3ZjUzOTI5OTI5NjA4MjZGRTJENzk0OTY0NGU3MDM2MzUzQzVCYyIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJURVNUMiIsIm5hbWUiOiJ0ZXN0MiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDlkMWU1RDNEOGExNDcxNzViZDhEOTVGOTA5QjBjRTU1ZWM5MWU1ODkiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiVEVTVDIiLCJuYW1lIjoidGVzdDIiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjpmYWxzZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgzN2JCMjI1NTk4MzIwZmMzM0M3NjE5NDYwMjYyM2E0RmU3OTE0ZDk0IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6Ik1UVCIsIm5hbWUiOiJNeVRheFRva2VuIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6ZmFsc2V9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjU3LCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-58.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-58.json deleted file mode 100644 index 85f6453c..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-58.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.721Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "58" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "986", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"3da-WVMxxVgFnZb6gpxwEO9ObJrKQNM\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDU4QjJERDY3QTMyM2IyNWUwMTMwMTBENzRiMUE2NjRjMDJhMEE5RkQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiTU5GUiIsIm5hbWUiOiJNYXN0ZXIgTWFuaWZlc3RvciIsImRlY2ltYWxzIjoxMSwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGQ4NDVmN0Q0ZjREZUI5RmY1YkNmMDlEMTQwRWYxMzcxOEY2ZjZDNzEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGU1MTYzNWFlODEzNmFCQWM0NDkwNkE4ZjIzMEMyRDIzNUU5YzE5NUYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGM4NkViN0I4NTgwNzAyMGI0NTQ4RUUwNUI1NGJmQzk1NmVFYmJmQ0QiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEIxMDI2YjhlNzI3NmU3QUM3NTQxMEYxZmNiYmUyMTc5NmU4Zjc1MjYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo1OCwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-59.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-59.json deleted file mode 100644 index 690daa6c..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-59.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.722Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "59" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "965", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"3c5-6Pm+Ls3IWJUFMC9gJh/w13THatI\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDEzQkMzNUQxMDFCNjQ2Q2YxRjU2NmY5NTA3N0U2N2E5ZjViMzAxYTMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEU0NjFmODRDM2ZFNkJDRGQxMTYyRWIwRWY0Mjg0RjNiQjZlNENBRDMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDhjYzgwOTMyMThiQ2FDOEIxODk2QTFFRUQ0RDkyNUY2RjZhQjI4OUYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGExN2FGQ0FiMDU5RjNDNjc1MUY1QjY0MzQ3YjVhNTAzQzMyOTE4NjgiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGRFYjg5REU0YmI2ZWNmNUJGZUQ1ODFFQjA0OTMwOGI1MmQ5YjJEYTciLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo1OSwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-6.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-6.json deleted file mode 100644 index 71c0a1da..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-6.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.684Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "6" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1466", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5ba-+vgk5hM6R1SZaK/WcswoCWMAGcM\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDkzYjM0NmI2QkMyNTQ4ZEE2QTFFN2Q5OEU5YTQyMUI0MjU0MTQyNWIiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiTFVTRCIsIm5hbWUiOiJMaXF1aXR5IFVTRCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9tYWluL2ltYWdlcy90b2tlbnMvbHVzZC5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDI1OThjMzAzMzBENTc3MUFFOUY5ODM5NzkyMDk0ODZhRTI2ZEU4NzUiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQUkiLCJuYW1lIjoiQW55IEludSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9haS5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDgwYkIzMEQ2MmExNmUxRjIwODRkRUFFODRkYzI5MzUzMWMzQUMzQTEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiR1JBSU4iLCJuYW1lIjoiR3JhbmFyeSBUb2tlbiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9ncmFpbi5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDRiNTcwNzQ1MEUyMTg4YTdENEVCODU2NDAwQzE3MTYzMmY4OTcyNWMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiVVNETS5heGwiLCJuYW1lIjoiQXhlbGFyIFVTRE0iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMvYXhsdXNkbS5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDIzZWUyMzQzQjg5MmIxQkI2MzUwM2E0RkFiYzg0MEUwZTJDNjgxMGYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoid0FYTCIsIm5hbWUiOiJBeGVsYXIiLCJkZWNpbWFscyI6NiwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9heGwuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX1dLCJjdXJzb3IiOiJkNTQ0NzIxMC1mNTZiLTQxMzUtOWVlNi04N2Y4NzUyZWMyMWQiLCJjdXJyZW50UGFnZSI6NiwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-60.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-60.json deleted file mode 100644 index 0ea78f3a..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-60.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.722Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "60" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "965", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"3c5-sZoD3ZC9kgUGHd20l9KKa+x0Ogg\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDYwNDUxQjZhQzU1RTNDNUYwZjNhZUUzMTUxOTY3MEVjQzYyREMyOGYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGMzZTI1NEUzOWM0NWM3ODg2QTEyNDU1Y2I4MjA3YzgwODQ4NkZBQzMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDQ1RmFFOEQwRDJhY0U3MzU0NGJhYWI0NTJmOTAyMDkyNUFmQ0NDNzUiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGZhRTJBRTBhOWY4N0ZEMzViNWIwRTI0QjQ3QkFDNzk2QTdFRWZFYTEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEM5OWJlNDQzODNCQzhkODIzNTdGNUExRDlhZTk5NzZFRTlkNzViZWUiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo2MCwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-61.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-61.json deleted file mode 100644 index cab98872..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-61.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.723Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "61" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "965", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"3c5-kZo//dzTh5HcSbEOEs20uBWJ7bY\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDExMDZkQjcxNjVBOGQ0YTg1NTlCNDQxZUNkRWUxNGE1ZDUwNzBEYkMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDVEQURFOTE2RTY2NDcwRUQ1Mzk3QkVFN0UyZDFhY0M0RDI0Y0FhOTQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGU4Nzk1Y0Y5YzIzMDllQ2ZlMDVEZjAyOGVCMEYyMUQ1RDZlM2E5NTEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDYyMkI1MTg2Mzg0NzgzQkI4MDVjMTJBODA4Y0NGMDdGNDFERTFGZjAiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDlDOWIzRDQ4YzgxM2YyNTNhOEZFNEQ3ODA0YzEyN2Q3MzA4QzFjMTQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo2MSwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-62.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-62.json deleted file mode 100644 index 17b7b6fd..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-62.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.723Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "62" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "965", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"3c5-UFcu7AMhz9IUPVyRZMFPUI0yBTk\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDkwQWQ4QzY2NkY0Q0UyNEM4MjJlNmVhZDZiNTRGM0JFOTYzNTEwNDgiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDkwNjM1RGRmMEI3ZkI5QUVCM2Q5RGU3NDliODE1Mzc0MzAyREJiRGUiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGMzOUQ4YzFGNGUwOTEzMzczOEEzZjk3QzYzQzdFMzMwMDAzNWQyYkQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGVmNWYxQWFBRDVlZjA5RDI5YTM4MTg0NTE2MUE1ZDE4OEU2QTM3RDMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDczNzYxNTMxQzVkNzJFRDZmMGZjMDdhMDcyMDJjODAyNGUxNkVFRDkiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo2MiwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-63.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-63.json deleted file mode 100644 index 661cd051..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-63.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.724Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "63" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "965", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"3c5-FpNLzAXkAHpbHd3B62ML1rjG7tY\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEQ0NTQwZUU0ODIxYjcyRmExMzFBMWY5NUQzRTA4MzEwOTJhODZlYzYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEQ1RURFNTJkREQzNDdmQWY0NWYxMzQ1OTY4QjNlRTRlNTc5MjM5QjQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGIzNTVjY0U1Q0JBRjQxMWJkNTZlM2IwOTJGNUFBMTBBODk0MDgzYWUiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGFBNDUyNjVBOTRDOTM4MDJCRTk1MTFFNDI2OTMzMjM5MTE3RTY1OGYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEJCYzUyRDA5NmE4QzZhNDgwZTc0RmNmZWMxMmY5NTQzRjQ5OTAwZDUiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo2MywidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-64.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-64.json deleted file mode 100644 index e755e9da..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-64.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.724Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "64" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "965", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"3c5-iraXQpTWr8v1NBMLQYylDmuG0MA\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDQ0Y0M4YjQwQjE0ODNlNjJlNTlFRjkzNzQ0MUJhNmFBOEU1ODRBNzciLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGVlREI4NTQyNzc4ZjM3QTI3M0QxNkI4RkE0NkEwMDdiOWY2ZjU4NTQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGMyM2YzMDhDRjFiRkE3ZWZGRkI1OTI5MjBhNjE5RjAwOTkwRjhENzQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDI5M0RGRDk5NmQ1Y2Q3MkJlZDcxMkIwRUVBYjk2REJFNDAwYzA0MTYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEY3QTY5MTZFRGY1QjNCQzBGZTM4MTJkYjc5MEM4YWU0QjcyQkMwM2QiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo2NCwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-65.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-65.json deleted file mode 100644 index 51bae616..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-65.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.725Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "65" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "965", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"3c5-+kELoSRXoemxD5RacHeloA/1ibA\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDUzMzc2REU3N2MxRGRhNDc4ZTBCRTZjMjk2MjU1MTkzNGQwODRlZDUiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDMxNTViNDk0QjkyODc4OTMxQzMzMmE3ODEwMTNCMkExQjRkMDJDQjEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDhDZjZiMTJGNkI4MjZlM0QyYjIyOTU4NTE2OTgzMzkzZkRENGIyNEQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDFmMzU3MkJhZUUzNjM2MEQyM0U5NzZjMjQ0RTA4MTYwNTIzQ2U3ZUIiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDliNkZGMDI1QWVFMjQ1RDMxNGMwOUY1N0I3MmYwZEU2RTIzMWMzYTYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo2NSwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-66.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-66.json deleted file mode 100644 index ab98424d..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-66.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.725Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "66" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "965", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"3c5-0d4h6JpmqmpD/MkT7m4V7kjqpz8\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDEwNWJhODVkOTA0N2RBRjNmOUZFOTQxRDgxODhkNGI5QTY5MDAzODgiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDBmMTQzRkM1MGQ2YzcxRmVlOTVENkVjMTAzMGU2MkQ3ODg1MDdiODQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDNBMzFlMTcwNDczOGI2ZkM1QWYwOTVmNTA3YkE2MUMxRjZmMTI5ZWUiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDI4QURhQzU3NzI4YTdmQjdBNTJkM0I1MUYzMTk5MmY0MDRFN0IwMTAiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDI5OWM3RDZmMkVmODJDQjUyQjJBQjgzYjE0ZjA1QzZCMmI4MDNBQmEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo2NiwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-67.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-67.json deleted file mode 100644 index d1eb81dd..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-67.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.726Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "67" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "965", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"3c5-hJbw5VvaJ9wJfepNef182xgg/AM\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDRCMDQ5NWM1RjUxNDcwNTFCQTVmYTAyNTQyNEQzOTNkMzQzZDEwQkYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGU2RDg1NGZiM0ExNmU1NDllNjI0MjVDNGYzYWI5YjcwNEQ5QWYwMDgiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDg2ZmU2ZTUzZmE2MjQzMTMzYzE2NzY1MmM2YmM3ZjE1OEIzOWYyMzgiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDA5ZTZhN2FEZmI4YzA2ZjIyQWRmZWZkODcyZEU3MzA1OWQ5NTVCRTMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDBCM0JjNGNmNzA3RDk2M0ViMDAzYzNiNjNlYjE3YTg5MzY5Q0JENjEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo2NywidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-68.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-68.json deleted file mode 100644 index 55ad118d..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-68.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.727Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "68" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "965", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"3c5-PxTSwqhy1b241JQfQafiX2QYgLk\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGZmNDBkYUZmQjdGQjUzYjQzQjNFMDA0MmYwN0IyODUzZGU5YmFhNTIiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGE1MzlBYmE1RDY1QmUxZEJEZkEwNDA1Mjk0QWMwMmZhNTcyNTNiNUYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEQ5NzFmRjVhNzUzMDkxOWFlNjdlMDY2OTU3MTBiMjYyQTcyRThmMmYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDQ2ZTYzNWU4YTZCN0I2ZTA5MTc4QWE2MzI2NThkNmE0NTA4YzRiOTYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGZkMUQwNURhMzUzYzBBMkNhOWFhQTdFMWQ0NDAyOTA4MDE3NTM0MkEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo2OCwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-69.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-69.json deleted file mode 100644 index ac881fba..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-69.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.727Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "69" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "965", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"3c5-1LsM16FanCpzJAfK1rXgbjvz46E\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDgyODU3ZTY4MjBjN2FkNDlDMzUxRTBlODY1Q0FlRTk3NUEzZjA1QTAiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDVhNmNEMDUyQWQzQjU5MTQ1N2RBNzFDOEZCRDdEMDdCYjM5YjBGZDEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDg4Mjc4ZDA4MDdmYzhkNUZFMWEzNjkwNzE2MDdjZkE4NjE3MWQ4ZEMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDUzMWREMEVhNzg4ZTA4YjNmNWIxQzMxREE5NWY3Mzc3MjBCMzNGNGUiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDIwNjcyNzVENzM1MzVFQjk4OTNEMWNhNjNEN2JCRDdEMkNkMEQ4MzIiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo2OSwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-7.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-7.json deleted file mode 100644 index 18226943..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-7.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.687Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "7" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1479", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5c7-bnMibLZCGxxBXKqxhhY6M3wuXrk\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGEzMzQ4ODRiRjZiMEEwNjZkNTUzRDE5ZTUwNzMxNUU4Mzk0MDllNjIiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiRVJOIiwibmFtZSI6IkV0aG9zIFJlc2VydmUgTm90ZSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9lcm4uc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg1MjAzOTFENDEwMzE0NDUxRTEyQTg1RDc5OTcwYTYxOTE1QmMzMTVEIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkM0RSIsIm5hbWUiOiJDNEUgbmF0aXZlIGFzc2V0IiwiZGVjaW1hbHMiOjYsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXhlbGFybmV0d29yay9heGVsYXItY29uZmlncy9tYWluL2ltYWdlcy90b2tlbnMvYzRlLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4OWNmQjEzRTZjMTEwNTRhYzlmY0I5MkJBODk2NDRGMzA3NzU0MzZlNCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJ3c3RFVEguYXhsIiwibmFtZSI6IndzdEVUSCAoQXhlbGFyKSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy93c3RldGguc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhiMTA4NGRiOEQzQzA1Q0ViZDVGQTkzMzVkRjk1RUU0YjhhMGVkYzMwIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlVTRFQrIiwibmFtZSI6Ik92ZXJuaWdodC5maSBVU0RUKyIsImRlY2ltYWxzIjo2LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL21haW4vaW1hZ2VzL3Rva2Vucy91c2R0Ky5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDg2QTEwMTJkNDM3QkJGZjg0ZmJERjYyNTY5RDEyZDRGRDMzOTZGOGMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQVJCWVMiLCJuYW1lIjoiQXJieXMiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vMHhzcXVpZC9hc3NldHMvbWFpbi9pbWFnZXMvdG9rZW5zL2FyYnlzLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjcsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-70.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-70.json deleted file mode 100644 index 1b4f5ac0..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-70.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.728Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "70" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "965", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"3c5-guEHPVAcN0HKR7SDTT4zbH0DsRE\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDRhQTdDOTQ3QTc0NkZEMTJBODBFMTFENDI2MDQwNzEzZEQxOTc3MTciLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDdBOTA0QjU1Q2I5QTE5NkNGY0FCMzUwNDA0MzNiZWFlOTY1YUM2RTEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDIxNjNFQjQ3ZDk2NUM5ZWU0ZGQ5ZjA2ODM4YTE0RWI1NDVhRDI2QUEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDcwN0Y5QjFCQTdFRjExQTMxNmM4MTgzRkNjQjQ1YUYxMTZGMjg5YTQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEY4MEM0QzEyMmYxZWFFMzYwODk5ODZGMjhiNkFBMkRkODhCRDQwN0EiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo3MCwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-71.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-71.json deleted file mode 100644 index 7a0c55df..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-71.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.728Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "71" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1144", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"478-X0yk51K6eZkcp6WUjs2AgG0kQ/g\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGY2NEJjYTlEMWYyN2IyNjU3YjdBMjU3OTVmY0FGMUM3MDg2ODI0RjMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDNkMTVmRDQ2Q0U5ZTU1MTQ5ODMyOEIxQzgzMDcxRDk1MDlFMkMzYTAiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoidW5pRVRIIiwibmFtZSI6IlVuaXZlcnNhbCBFVEgiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjpmYWxzZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg1YjU2ZjRiZjk0ODA3QjU0N0VCNUU3ZUJhNUNkOEMwMzNhZjgzYWVkIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlNZLXVuaUVUSCIsIm5hbWUiOiJ1bmlFVEgiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vcHJvZC1wZW5kbGUtYnVja2V0LWEvaW1hZ2VzL3VwbG9hZHMvZTBiYzcyYzktNDMxYy00ZDViLTljMzgtM2I5ZDU2YzNmNTEzLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4ZDM0NDNlZTFlOTFhRjI4ZTVGQjg1OEZiZDBENzJBNjNiQTgwNDZFMCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJnVVNEQyIsIm5hbWUiOiJHYWlucyBOZXR3b3JrIFVTREMiLCJkZWNpbWFscyI6NiwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDEzQWQ1MWVkNEYxQjdlOURjMTY4ZDhhMDBjQjNmNGRERDg1RWZBNjAiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiTERPIiwibmFtZSI6IkxpZG8gREFPIFRva2VuIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6ZmFsc2V9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjcxLCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-72.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-72.json deleted file mode 100644 index c5f87c60..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-72.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.729Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "72" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1329", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"531-Ukes/UrJOtCHwyw4hDuj/nHtDuk\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDI1ZDg4N0NlN2EzNTE3MkM2MkZlQkZENjdhMTg1NkYyMEZhRWJCMDAiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUEVQRSIsIm5hbWUiOiJQZXBlIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9hc3NldHMuY29pbmdlY2tvLmNvbS9jb2lucy9pbWFnZXMvMjk4NTAvc3RhbmRhcmQvcGVwZS10b2tlbi5qcGVnPzE2OTY1Mjg3NzYiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGREYjQ2OTk5Rjg4OTE2NjNhOEYyODI4ZDI1Mjk4ZjcwNDE2ZDc2MTAiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoic1VTRFMiLCJuYW1lIjoiU2F2aW5ncyBVU0RTIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6ZmFsc2V9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4NjQ5MWMwNUE4MjIxOWI4RDE0NzkwNTczNjFmZjE2NTQ3NDliODc2YiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJVU0RTIiwibmFtZSI6IlVTRFMgU3RhYmxlY29pbiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGE2Qzg5NUVCMzMyRTkxYzViM0QwMEI3YmFlRUFhZTQ3OGNjNTAyREEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiU1ktd2VFVEgiLCJuYW1lIjoid2VFVEgiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vcHJvZC1wZW5kbGUtYnVja2V0LWEvaW1hZ2VzL3VwbG9hZHMvZThjZmExMGEtZjVmYi00ZmI1LTkyNDktZmQ3MjJhMzYwZjMxLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4ZjE3NmZCNTFGNGVCODI2MTM2YTU0RkRjNzFDNTBmQ2QyMjAyRTI3MiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJTWS1yc0VUSCIsIm5hbWUiOiJyc0VUSCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9wcm9kLXBlbmRsZS1idWNrZXQtYS9pbWFnZXMvdXBsb2Fkcy8yYTRjYjRiNC04ZDhkLTQ0MjUtOGQ0NS01OTc2MzViNzFiNDQuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX1dLCJjdXJzb3IiOiJkNTQ0NzIxMC1mNTZiLTQxMzUtOWVlNi04N2Y4NzUyZWMyMWQiLCJjdXJyZW50UGFnZSI6NzIsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-73.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-73.json deleted file mode 100644 index 8ea32694..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-73.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.730Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "73" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1496", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5d8-EfCZG1bpAdnDOBRHiG90uddVglU\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDgwYzEyRDViNkNjNDk0NjMyQmYxMWIwM0YwOTQzNmM4QjYxQ2M1RGYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiU1ktd3N0RVRIIiwibmFtZSI6IndzdEVUSCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9wcm9kLXBlbmRsZS1idWNrZXQtYS9pbWFnZXMvdXBsb2Fkcy9hNjE4NjhhNS1hNWM3LTQyZWMtODhlZS02ZmZmMjEyMzAwYTYuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhjMENmNGIyNjZiRTVCMzIyOUM0OTU5MEI1OUU2N0EwOWMxNWIyMmY0IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlNZLXJFVEgiLCJuYW1lIjoickVUSCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9wcm9kLXBlbmRsZS1idWNrZXQtYS9pbWFnZXMvdXBsb2Fkcy82MGQzNmEwOC0wYjliLTRmNzQtOWM0Yi1mODM4YWQ3NDBjZTkuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg1QzQxMTBlRDc2MDQ3MGY3OUU0NjlhOTAxQmQ2ZmI0NWE2NUJFMEY0IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlNZLW1QZW5kbGUiLCJuYW1lIjoibVBFTkRMRSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9wcm9kLXBlbmRsZS1idWNrZXQtYS9pbWFnZXMvdXBsb2Fkcy9lMjE4Mjg1NS00NzRiLTQ5ZjctYmM5Mi1mMjZjODQ3MTdkNTgucG5nIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgyYjVGQTJDN2NiNGIwRjUxRUE3MjUwZjY2Q2EzZUQzNjkyNTNBRGRGIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6Im1QZW5kbGVfUFJUIiwibmFtZSI6Im1QZW5kbGUgUGVucGllIFJlY2VpcHQgVG9rZW4iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjpmYWxzZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhEMzAyZDdmRDJjOTM3NWE0MzMwMThmRGZBNTYxM0JlNkFkM2YxOEUzIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlNZLXN0ay1FUGVuZGxlIiwibmFtZSI6InN0ay1lUGVuZGxlIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3Byb2QtcGVuZGxlLWJ1Y2tldC1hL2ltYWdlcy91cGxvYWRzL2EwYmQ2MzFmLWRlNmQtNGNjYi04Y2UyLTM0ZmNiMzFiOWI4My5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo3MywidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-74.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-74.json deleted file mode 100644 index 4916ce2a..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-74.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.730Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "74" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1461", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5b5-sJpqlbqd/5hTE40aie4vFwxKh3o\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDVlZENCQzIwQ2FjNjdBZEMyZTcyNGQ0MzQ4RmY4NTEzMkIwODViODIiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiU1ktVVNEYWkiLCJuYW1lIjoiVVNEYWkiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vcHJvZC1wZW5kbGUtYnVja2V0LWEvaW1hZ2VzL3VwbG9hZHMvY2Q0NTU0MGYtNmJjZi00NDNkLThjY2ItOWMwZjYyM2ZkYzYyLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MEIyYjJCMjA3NmQ5NWRkYTc4MTdlNzg1OTg5ZkUzNTNmZTk1NWVmOSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJzVVNEYWkiLCJuYW1lIjoiU3Rha2VkIFVTRGFpIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6ZmFsc2V9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MzBDY2Y0QmJlZTMxM2ZDRDE5RjNlMjk1YjNiYTI5MjBBMjRlMmY2MiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJTWS1zVVNEYWkiLCJuYW1lIjoic1VTRGFpIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3Byb2QtcGVuZGxlLWJ1Y2tldC1hL2ltYWdlcy91cGxvYWRzLzE4Y2EzZjM0LTllMTAtNDlkZS1iN2M4LTM2YzBmMjVhYTAwMS5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGMzMmU5NkI0QzdFQjc5NTlCNkE5MmYzZjdlRDVkMjMyMWU2ZWQzRDQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiU1ktdGhCSUxMIiwibmFtZSI6InRoQklMTCIsImRlY2ltYWxzIjo2LCJpY29uVXJpIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3Byb2QtcGVuZGxlLWJ1Y2tldC1hL2ltYWdlcy91cGxvYWRzL2I3OGZkMjRlLTI2MDItNDQ4OC1hMjM5LTUzOThhOGIyY2YxZC5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDBhOWVENDU4RTZjMjgzRDFFODQyMzdlMzM0NzMzM0FhMDgyMjFkMDkiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiU1ktZ1VTREMiLCJuYW1lIjoiZ1VTREMiLCJkZWNpbWFscyI6NiwiaWNvblVyaSI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9wcm9kLXBlbmRsZS1idWNrZXQtYS9pbWFnZXMvdXBsb2Fkcy81MjlmNjIzMC05OWJmLTRkYTAtOTVhNS1mY2M2OTE5MThmMmIuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX1dLCJjdXJzb3IiOiJkNTQ0NzIxMC1mNTZiLTQxMzUtOWVlNi04N2Y4NzUyZWMyMWQiLCJjdXJyZW50UGFnZSI6NzQsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-75.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-75.json deleted file mode 100644 index 03c68bc0..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-75.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.731Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "75" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1619", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"653-kDlLX/AlgXScVDDWRSWO1aeIZS0\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDdiOEFFQzNkMTk4NmI0YkVjQmYxYzY1MUZGNmE5NTNDQzAxMTdiMDUiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUEVORExFLUxQVCIsIm5hbWUiOiJMUCB1bmlFVEggKEVUSCkiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vcHJvZC1wZW5kbGUtYnVja2V0LWEvaW1hZ2VzL3VwbG9hZHMvNDQ4ZWVhMWYtYTExMS00Y2JlLWI2NGEtZmU1ZDFjNmQ0Zjc2LnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4NDZkNjJhOGRFRGUxYmYyZDBEZTA0RjJFZDg2MzI0NWNCQmE1ZTUzOCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJQRU5ETEUtTFBUIiwibmFtZSI6IkxQIHdlRVRIIChlRVRIKSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9wcm9kLXBlbmRsZS1idWNrZXQtYS9pbWFnZXMvdXBsb2Fkcy82MTZiMTA0YS1hZmZiLTRlOTgtODM0Zi0zNmI1NzQ5ZGZlYWQuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg0MTM3NzA5OTA3RjMzMTkxMzQ0MzhmZDlDMTUzOWEzMDdlQzBhMWE1IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlBFTkRMRS1MUFQiLCJuYW1lIjoiTFAgcnNFVEggKEVUSCkiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vcHJvZC1wZW5kbGUtYnVja2V0LWEvaW1hZ2VzL3VwbG9hZHMvNTIxODRlNmEtMDZhMS00ODM3LWE1OGEtYmYyOTU3ZmQ5YTJjLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4Zjc4NDUyZTBmNUMwQjk1ZmM1ZEM4MzUzQjhDRDFlMDZFNTNmYTI1QiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJQRU5ETEUtTFBUIiwibmFtZSI6IkxQIHdzdEVUSCAoc3RFVEgpIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3Byb2QtcGVuZGxlLWJ1Y2tldC1hL2ltYWdlcy91cGxvYWRzL2U3ZmU5Y2Q5LTQyZjQtNGYwYS05ZjY4LTVmMTVlOWUwM2U5My5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGQ3RWFjNmM5MTA5RDhjMzk3N0VCQ2U0ZTdEQmYwQTVBOTUzMkUyNDAiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUEVORExFLUxQVCIsIm5hbWUiOiJMUCByRVRIIChFVEgpIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3Byb2QtcGVuZGxlLWJ1Y2tldC1hL2ltYWdlcy91cGxvYWRzLzMwYjE5OTI3LWY2ODUtNDk5Ni1hMDcxLTZlMTRhM2QyMzk2MS5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo3NSwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-76.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-76.json deleted file mode 100644 index 0da4c167..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-76.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.732Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "76" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1667", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"683-hJTQhuJ1PPoczPjpU3j0t2iqdkI\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGMyNEZGRUJkNEZEQkE3ODdkZjk0RjUwODlGMEZhQkMyNTIxMTZhYjciLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUEVORExFLUxQVCIsIm5hbWUiOiJMUCBtUEVORExFIChtUEVORExFKSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9wcm9kLXBlbmRsZS1idWNrZXQtYS9pbWFnZXMvdXBsb2Fkcy9kZjY4ZDIzYS03MTdmLTRhYTQtYTU2Mi0yODJhMTE3Nzg1NTgucG5nIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg0NDY4ODA0N0MwYThCQWI1NUJGMEIxOWY5ZDQ3RDU2N2IyQzMzMTlGIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlBFTkRMRS1MUFQiLCJuYW1lIjoiTFAgc3RrLWVQZW5kbGUgKGVQZW5kbGUpIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3Byb2QtcGVuZGxlLWJ1Y2tldC1hL2ltYWdlcy91cGxvYWRzL2U1ZDcwMmY2LWI0YzAtNGUwMy1hOGJlLTY3NjA5NDc2NzJkMC5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDMzMDg1NzQzNzBmMTllQTYzOWY0NjcxODM4ZTAxQ2ZiNzdkOGRiNzAiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUExQLVVTRGFpLTE5RkVCMjAyNiIsIm5hbWUiOiJMUCBVU0RhaSAoVVNEYWkpIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3Byb2QtcGVuZGxlLWJ1Y2tldC1hL2ltYWdlcy91cGxvYWRzL2VhYTJmOTY4LWYzYTgtNDdjYi05YjdlLWZmNDdhMjE1NjFlMS5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDIwOTJGYTVkMDIyNzZCMzEzNkE1MEYzQzJDM2E2RWQ0NTQxMzE4M0UiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUExQLXNVU0RhaS0xOUZFQjIwMjYiLCJuYW1lIjoiTFAgc1VTRGFpIChVU0RhaSkiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vcHJvZC1wZW5kbGUtYnVja2V0LWEvaW1hZ2VzL3VwbG9hZHMvMmNjZTQ0MTctYzU3YS00NzI1LTk0OWMtNTUwM2U0MzdjMjJiLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4ZkFENjNmMGEyRmY2MThFZERFMjM1NjFkZkYyMTJFRGZlZGRCRTg5ZCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJQTFAtdGhCSUxMLTE5RkVCMjAyNiIsIm5hbWUiOiJMUCB0aEJJTEwgKFVTREMpIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3Byb2QtcGVuZGxlLWJ1Y2tldC1hL2ltYWdlcy91cGxvYWRzLzNlOTVlM2IwLTEzMGQtNDVhOS1hZjQ5LWVhMDk3MjIwMjRmMC5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo3NiwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-77.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-77.json deleted file mode 100644 index 6e9f481f..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-77.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.732Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "77" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1557", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"615-FheWxWTeYZKeMstkFH9h5kN7h54\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDA5MzRFNTkyY0VlOTMyYjA0QjM5NjcxNjJiM0NENmM4NTc0OEM0NzAiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUExQLWdVU0RDLTI1SlVOMjAyNiIsIm5hbWUiOiJMUCBnVVNEQyAoVVNEQykiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vcHJvZC1wZW5kbGUtYnVja2V0LWEvaW1hZ2VzL3VwbG9hZHMvMWQyNjdjODctNTE5ZC00OTFlLWIxOGYtOWNmOTA1NzVjMTkxLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MzcyMjc3ODVhMWY0NTQ1ZWQ5MTQ2OTBlMzk1ZTRDRkU5NkI4MzE5ZiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJzdGstZVBlbmRsZSIsIm5hbWUiOiJzdGFrZWQgRXF1aWxpYnJpYSBQZW5kbGUiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjpmYWxzZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhEOGQ1ZmJCQUFEMWU4MEFBMDM1MkIyMDI5YTU5NGNhRWZmNmNGMUVjIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlBULXVuaUVUSC0yNUpVTjIwMjYiLCJuYW1lIjoiUFQgdW5pRVRIIChFVEgpIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3Byb2QtcGVuZGxlLWJ1Y2tldC1hL2ltYWdlcy91cGxvYWRzLzUwN2JmYjcwLTRjNmItNDQ4MC04ZWY4LWI3Y2MyNTBiODJlMi5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGFCN0YzODM3RTZlNzIxYWJCYzgyNjkyN0I2NTUxODBBZjZBMDQzODgiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUFQtd2VFVEgtMjVKVU4yMDI2IiwibmFtZSI6IlBUIHdlRVRIIChlRVRIKSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9wcm9kLXBlbmRsZS1idWNrZXQtYS9pbWFnZXMvdXBsb2Fkcy9kNWIxZjEyYy03Y2IzLTQ1NzItOWJiNy02ODg2NWMxMzhjZDYuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhDOUJGQzNhRkQ1OTJDYzVhMzMwNWFFYzA5YUFBQTZCOUJCNGMxMmQwIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlBULXJzRVRILTI1SlVOMjAyNiIsIm5hbWUiOiJQVCByc0VUSCAoRVRIKSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9wcm9kLXBlbmRsZS1idWNrZXQtYS9pbWFnZXMvdXBsb2Fkcy80ODUxNzg1Yy1kM2E5LTRhMjYtOTk0Yi1iMzQ1NDk2NDUwNjMuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX1dLCJjdXJzb3IiOiJkNTQ0NzIxMC1mNTZiLTQxMzUtOWVlNi04N2Y4NzUyZWMyMWQiLCJjdXJyZW50UGFnZSI6NzcsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-78.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-78.json deleted file mode 100644 index 16beabd9..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-78.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.733Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "78" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1683", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"693-L3OkainUMwnxSjP8+OnP8D9oIec\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDcxZkJGNDA2NTFFOUQ0Mjc4YTc0NTg2QWZDOTlGMzA3ZjM2OUNlOUEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUFQtd3N0RVRILTI1SlVOMjAyNiIsIm5hbWUiOiJQVCB3c3RFVEggKHN0RVRIKSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9wcm9kLXBlbmRsZS1idWNrZXQtYS9pbWFnZXMvdXBsb2Fkcy9hZTA3ODUwYS00MjFiLTRmZTEtODdlYy01YmE4ZmE2NWRhNjguc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgzMzYyQzEyNjVhMDUyMmYzMjEyNTM3MDhDOWZiMTc2RjIyNzRGYThkIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlBULXJFVEgtMjVKVU4yMDI2IiwibmFtZSI6IlBUIHJFVEggKEVUSCkiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vcHJvZC1wZW5kbGUtYnVja2V0LWEvaW1hZ2VzL3VwbG9hZHMvZGNhOTdhMzYtMzEyMS00NmRiLWEyMmYtMTU0ZDY4ZTRiNDY2LnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MmRCRTUzNDA4NjEzQkVGMjM1OTdCZTk0YzFGZDQ1M0FjMDE0NzU3NSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJQVC1tUGVuZGxlLTI2TUFSMjAyNiIsIm5hbWUiOiJQVCBtUEVORExFIChtUEVORExFKSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9wcm9kLXBlbmRsZS1idWNrZXQtYS9pbWFnZXMvdXBsb2Fkcy84NTkyYjU2ZC0wMDA0LTRiMzAtOTYwNC05ZjgyYmIzMmFiYWMucG5nIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg5M0RlMUE2OTMxOTk3MjQxMkI5NTZERTVmYzE4MTI4Y0Y4MkM2QkQ3IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlBULXN0ay1FUGVuZGxlLTI2TUFSMjAyNiIsIm5hbWUiOiJQVCBzdGstZVBlbmRsZSAoZVBlbmRsZSkiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vcHJvZC1wZW5kbGUtYnVja2V0LWEvaW1hZ2VzL3VwbG9hZHMvZTdhMDc4YjktM2JiNC00ZmRmLTkzMTktMTI0ZTAzODliNDYzLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4NUIyQzYxNUUyMjI3MjIzNEFBQ0YxODc2MzJhMDUzMWNBMTI0MzI3OSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJQVC1VU0RhaS0xOUZFQjIwMjYiLCJuYW1lIjoiUFQgVVNEYWkgKFVTRGFpKSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9wcm9kLXBlbmRsZS1idWNrZXQtYS9pbWFnZXMvdXBsb2Fkcy8zODRhMDJmMC1mYzdlLTRiYTEtYWFkNC1iMWFkYWVmY2JkODAuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX1dLCJjdXJzb3IiOiJkNTQ0NzIxMC1mNTZiLTQxMzUtOWVlNi04N2Y4NzUyZWMyMWQiLCJjdXJyZW50UGFnZSI6NzgsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-79.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-79.json deleted file mode 100644 index 70ad186e..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-79.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.733Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "79" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1664", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"680-019YKiov/h2DEsxtO04fmzTgYCA\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDFCRjEzMTFGQ0Y5MTRBNjlEZDU4MDVDOUIwNmI3MkY4MDUzOWNCM2YiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUFQtc1VTRGFpLTE5RkVCMjAyNiIsIm5hbWUiOiJQVCBzVVNEYWkgKFVTRGFpKSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9wcm9kLXBlbmRsZS1idWNrZXQtYS9pbWFnZXMvdXBsb2Fkcy8yMWY5YWQ0OC1lOGZjLTRjZGItOWEyYS1iMjg5MzIwZTAwNWEuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg5YjM5MjRmOTY1MmNhYmYzRGI0OEI3QjRDOTJFNDc0YzU3MUIzQWI0IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlBULXRoQklMTC0xOUZFQjIwMjYiLCJuYW1lIjoiUFQgdGhCSUxMIChVU0RDKSIsImRlY2ltYWxzIjo2LCJpY29uVXJpIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3Byb2QtcGVuZGxlLWJ1Y2tldC1hL2ltYWdlcy91cGxvYWRzLzZmYmQzMTk5LTRkNjQtNDYxMC1hMWI4LTI5ZmFhNTUxMzQwNC5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDk3YzFhNEFFM0UwREE4MDA5YUZmMTNlM2UzRUU3ZUE1ZWU0QWZlODQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUFQtZ1VTREMtMjVKVU4yMDI2IiwibmFtZSI6IlBUIGdVU0RDIChVU0RDKSIsImRlY2ltYWxzIjo2LCJpY29uVXJpIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3Byb2QtcGVuZGxlLWJ1Y2tldC1hL2ltYWdlcy91cGxvYWRzL2ZjNTA3ZTE4LWRkY2QtNDhjZS04NTE4LThmMzYxMDcxOWEyYi5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDBmYjk1RWM0MDg2YjMwMDdjODk0QUQ3ODcwM2JDNjM0MTUwQTFENTAiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiWVQtdW5pRVRILTI1SlVOMjAyNiIsIm5hbWUiOiJZVCB1bmlFVEggKEVUSCkiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vcHJvZC1wZW5kbGUtYnVja2V0LWEvaW1hZ2VzL3VwbG9hZHMvMDkwYWY4MTctZjU1NC00ZTU3LTk3OGYtYjY1N2ExNWM3MjVkLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4ZkY5ODI2QzM1OGE4MjJEMDAxODdCNDg3QzM0OUJDNUU3RjMwNzg4QSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJZVC13ZUVUSC0yNUpVTjIwMjYiLCJuYW1lIjoiWVQgd2VFVEggKGVFVEgpIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3Byb2QtcGVuZGxlLWJ1Y2tldC1hL2ltYWdlcy91cGxvYWRzL2VjYzc5MGI4LWU2NTMtNDRhYy1iYzcyLWYwNjk3MmZjN2EwYi5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo3OSwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-8.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-8.json deleted file mode 100644 index 6f678dfe..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-8.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.688Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "8" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1482", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5ca-Hxraf0OAQrJ9jGJy3MoVQGBq/iw\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweERBMTAwMDljQmQ1RDA3ZGQwQ2VDYzY2MTYxRkM5M0Q3YzkwMDBkYTEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiREFJIiwibmFtZSI6IkRBSSBTdGFibGVjb2luIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzB4c3F1aWQvYXNzZXRzL21haW4vaW1hZ2VzL3Rva2Vucy9kYWkuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhBQUE2QzFFMzJDNTVBN0JmYTgwNjZBNkZBRTliNDI2NTBGMjYyNDE4IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlJBTSIsIm5hbWUiOiJSYW1zZXMgRXhjaGFuZ2UiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vMHhzcXVpZC9hc3NldHMvbWFpbi9pbWFnZXMvdG9rZW5zL3JhbS5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGExYTAyMEQzQjM1NEQ2NDYwRUUzYzI3Mjk3NkYyMTMxNjBCRDZCMUMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiRlMiLCJuYW1lIjoiRmFudG9tU3RhcnRlciIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9mcy5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDUyODNhRjM3ZDQ3M2VGN2MxODVBMUY4YTIwNDJkNDI3Y0Q5QzgzYzQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiTVVOSVRZIiwibmFtZSI6Ik1ldGFob3JzZSBVbml0eSBUb2tlbiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9tdW5pdHkuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg0Zjc0Y2E0YTY4NjIwM2E1RDRlQkY2RTg4NjhjNWVCQzQ1MGJmMjgzIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6InNmcnhFVEgiLCJuYW1lIjoic2ZyeEVUSCAoQXhlbGFyKSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy9zZnJ4ZXRoLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjgsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-80.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-80.json deleted file mode 100644 index 8e3e6530..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-80.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.734Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "80" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1681", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"691-mkH/5byrlrQj46m/xxt5dj4ThkA\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDIxM2EzODIyMzc4YTkyQkZiNjVCM0JiZkRGMDE5NzExMzY0N0RmNjkiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiWVQtcnNFVEgtMjVKVU4yMDI2IiwibmFtZSI6IllUIHJzRVRIIChFVEgpIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3Byb2QtcGVuZGxlLWJ1Y2tldC1hL2ltYWdlcy91cGxvYWRzLzgwMGZjZjZmLWRmYzQtNDJjZS1hNGZhLWMxNWRkNTY2NWZlYy5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDI1QmRBMUVEZDZhRjE3QzYxMzk5YUEwZWI4NGI5M2RBQTMwNjk3NjQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiWVQtd3N0RVRILTI1SlVOMjAyNiIsIm5hbWUiOiJZVCB3c3RFVEggKHN0RVRIKSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9wcm9kLXBlbmRsZS1idWNrZXQtYS9pbWFnZXMvdXBsb2Fkcy8xMWNmOTAzMS01MWEzLTQ0ZTItODk4MS1lZmQ3NDgxNTU3MGYuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhlMDNDMjM2Y0E2RjA3NzU1QWQ2MzFhNDJEZDVkNjBFMjkzYjFiZjcxIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IllULXJFVEgtMjVKVU4yMDI2IiwibmFtZSI6IllUIHJFVEggKEVUSCkiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vcHJvZC1wZW5kbGUtYnVja2V0LWEvaW1hZ2VzL3VwbG9hZHMvZGJmMzlmOWUtZWU0My00ODNkLTg5OTYtYmVlN2U1YzExMTRlLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4YTcxZURmQzI1NTRCOTNjOEYyMzAzNDQwYmUzNzI0OGI2YjkwOUQzQSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJZVC1tUGVuZGxlLTI2TUFSMjAyNiIsIm5hbWUiOiJZVCBtUEVORExFIChtUEVORExFKSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9wcm9kLXBlbmRsZS1idWNrZXQtYS9pbWFnZXMvdXBsb2Fkcy8yN2QwMTRjOC1lYzY4LTRkMTYtOTc0OC05NGM3ZjYxNDRmOWEucG5nIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhjMkU2NzgxM0UwOTdlYWU5ODdCODM3ZjZGZUE4Q2ZiZkM2ODM0ZmE4IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IllULXN0ay1FUGVuZGxlLTI2TUFSMjAyNiIsIm5hbWUiOiJZVCBzdGstZVBlbmRsZSAoZVBlbmRsZSkiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vcHJvZC1wZW5kbGUtYnVja2V0LWEvaW1hZ2VzL3VwbG9hZHMvZDFhZGNjODQtZDZiNS00YjQ1LTk3ZWMtMmFkNGViODFkMjNmLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjgwLCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-81.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-81.json deleted file mode 100644 index 60555a24..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-81.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.734Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "81" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1612", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"64c-Tu7K6GA2b9Kc3Px3SDJrU2hgkzE\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGRCNzk1RGM1RTM1OWYzYzUzQjgzRjYwM2UxMEZkOTkwMUY4NTExOTAiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiWVQtVVNEYWktMTlGRUIyMDI2IiwibmFtZSI6IllUIFVTRGFpIChVU0RhaSkiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vcHJvZC1wZW5kbGUtYnVja2V0LWEvaW1hZ2VzL3VwbG9hZHMvYTkzZjYwNjYtY2RjYy00ODNiLWFlM2YtZTgwNTVmODU1ZThkLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MjE0RDE5NTAwMjc4NjNmNWUxZWM2MzY5Nzk3ZDlBNTFlRjFiYjY2RiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJZVC1zVVNEYWktMTlGRUIyMDI2IiwibmFtZSI6IllUIHNVU0RhaSAoVVNEYWkpIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3Byb2QtcGVuZGxlLWJ1Y2tldC1hL2ltYWdlcy91cGxvYWRzLzRjMjY0MjliLWVjY2YtNGJlNi04MjkwLWJlMTI1ZTk4ZTUyMC5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDEyZEEwNDkyMjI5NTNiNTU4MDA4Nzg5RDFiNTRBMDYzMGQ2ZUY1MUUiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiWVQtdGhCSUxMLTE5RkVCMjAyNiIsIm5hbWUiOiJZVCB0aEJJTEwgKFVTREMpIiwiZGVjaW1hbHMiOjYsImljb25VcmkiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vcHJvZC1wZW5kbGUtYnVja2V0LWEvaW1hZ2VzL3VwbG9hZHMvNTcwMjEzNzgtYjY2Ny00MWUzLTlkMzctYmQ5ZmYyOTE3ZGJmLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MDg3MDFkQjREMzFFMEU4OGJEMzM4RmRlQjM4RkYzOTFDQzc1QmNGOCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJZVC1nVVNEQy0yNUpVTjIwMjYiLCJuYW1lIjoiWVQgZ1VTREMgKFVTREMpIiwiZGVjaW1hbHMiOjYsImljb25VcmkiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vcHJvZC1wZW5kbGUtYnVja2V0LWEvaW1hZ2VzL3VwbG9hZHMvMjE1ODkwNjgtM2NkYy00YmMwLWFiOTEtMTQzYjZhNTNkN2E3LnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4M2Y4ZjBkQ0U0ZENFNGQwRDFkMDg3MTk0MWU3OUNEQTgyY0E1MGQwQiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJBUFQiLCJuYW1lIjoiQVBUIiwiZGVjaW1hbHMiOjgsImljb25VcmkiOiJodHRwczovL2Fzc2V0cy5jb2luZ2Vja28uY29tL2NvaW5zL2ltYWdlcy8yNjQ1NS9zdGFuZGFyZC9hcHRvc19yb3VuZC5wbmc/MTY5NjUyNTUyOCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjgxLCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-82.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-82.json deleted file mode 100644 index e0202fdc..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-82.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.735Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "82" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1403", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"57b-ZKikovp8zo2A8BHxekNz9QrC1ho\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDNFZWE1NkExY2NDZGJmQjcwQTI2YUQzODFDNzFFZTE3RTRjOEExNUYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQk9NRSIsIm5hbWUiOiJCT01FIiwiZGVjaW1hbHMiOjYsImljb25VcmkiOiJodHRwczovL2Fzc2V0cy5jb2luZ2Vja28uY29tL2NvaW5zL2ltYWdlcy8zNjA3MS9zdGFuZGFyZC9ib21lLnBuZz8xNzEwNDA3MjU1IiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhhRjc3MEYwMzUxODY4NmEzNjUzMDBhYjM1QUQ4NjBlOTk5NjdCMmYwIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6Ik1FTUUiLCJuYW1lIjoiTUVNRSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vYXNzZXRzLmNvaW5nZWNrby5jb20vY29pbnMvaW1hZ2VzLzMyNTI4L3N0YW5kYXJkL21lbWVjb2luXyUyODIlMjkucG5nPzE2OTg5MTIxNjgiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDY3OTJjNUI4OTYyZmZiREQwMjBjNmI2RkQwQmU3YjE4MmUwZTMzYTMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiRkxPS0kiLCJuYW1lIjoiRkxPS0kiLCJkZWNpbWFscyI6OSwiaWNvblVyaSI6Imh0dHBzOi8vYXNzZXRzLmNvaW5nZWNrby5jb20vY29pbnMvaW1hZ2VzLzE2NzQ2L3N0YW5kYXJkL1BOR19pbWFnZS5wbmc/MTY5NjUxNjMxOCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4NTUwM0NGNzJmNTRiNmQ2OTJkMzZCQkNEMzkxNTE2QTdkRTA2ODY4NyIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJNRVciLCJuYW1lIjoiTUVXIiwiZGVjaW1hbHMiOjUsImljb25VcmkiOiJodHRwczovL2Fzc2V0cy5jb2luZ2Vja28uY29tL2NvaW5zL2ltYWdlcy8zNjQ0MC9zdGFuZGFyZC9NRVcucG5nPzE3MTE0NDIyODYiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDkzOGFlZjM2Q0FhRmJjQjM3ODE1MjUxQjYwMjE2ODA4N2VDMTQ2NDgiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiVEFPIiwibmFtZSI6IlRBTyIsImRlY2ltYWxzIjo5LCJpY29uVXJpIjoiaHR0cHM6Ly9hc3NldHMuY29pbmdlY2tvLmNvbS9jb2lucy9pbWFnZXMvMjg0NTIvc3RhbmRhcmQvQVJVc1BlTlFfNDAweDQwMC5qcGVnPzE2OTY1Mjc0NDciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo4MiwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-83.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-83.json deleted file mode 100644 index a7cb4d54..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-83.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.735Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "83" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1383", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"567-R8YDLmCawixvH/B+ku9yC7PkoT0\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDFGRDEwRTc2NzE4N0E5MmYwQUIyQUJERUVGNDUwNWUzMTljQTA2QjIiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQk9OSyIsIm5hbWUiOiJCT05LIiwiZGVjaW1hbHMiOjUsImljb25VcmkiOiJodHRwczovL2Fzc2V0cy5jb2luZ2Vja28uY29tL2NvaW5zL2ltYWdlcy8yODYwMC9zdGFuZGFyZC9ib25rLmpwZz8xNjk2NTI3NTg3IiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg3NUI5QWREODczNjQxYjI1MzcxODgxMEU2YzY1ZEI2ZDcyMzExRkQwIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IldMRCIsIm5hbWUiOiJXTEQiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL2Fzc2V0cy5jb2luZ2Vja28uY29tL2NvaW5zL2ltYWdlcy8zMTA2OS9zdGFuZGFyZC93b3JsZGNvaW4uanBlZz8xNjk2NTI5OTAzIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg0NzkwNDk2M2ZjOGIyMzQwNDE0MjYyMTI1YUY3OThCOTY1NUU1OENkIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkJUQyIsIm5hbWUiOiJCaXRjb2luIiwiZGVjaW1hbHMiOjgsImljb25VcmkiOiJodHRwczovL2Fzc2V0cy5jb2luZ2Vja28uY29tL2NvaW5zL2ltYWdlcy8xL3NtYWxsL2JpdGNvaW4ucG5nPzE1NDcwMzM1NzkiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEM0ZGE0YzI0ZmQ1OTExMjVjM0Y0N2IzNDBiNmY0Zjc2MTExODgzZDgiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiRE9HRSIsIm5hbWUiOiJEb2dlY29pbiIsImRlY2ltYWxzIjo4LCJpY29uVXJpIjoiaHR0cHM6Ly9hc3NldHMuY29pbmdlY2tvLmNvbS9jb2lucy9pbWFnZXMvNS9zbWFsbC9kb2dlY29pbi5wbmc/MTU0Nzc5MjI1NiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4NjA2QzNlNTA3NWU1NTU1ZTc5QWExNUYxRTlGQUNCNzc2Rjk2QzI0OCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJFSUdFTiIsIm5hbWUiOiJFaWdlbiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vYXNzZXRzLmNvaW5nZWNrby5jb20vY29pbnMvaW1hZ2VzLzM3NDQxL3N0YW5kYXJkL2VpZ2VuLmpwZz8xNzI4MDIzOTc0IiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX1dLCJjdXJzb3IiOiJkNTQ0NzIxMC1mNTZiLTQxMzUtOWVlNi04N2Y4NzUyZWMyMWQiLCJjdXJyZW50UGFnZSI6ODMsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-84.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-84.json deleted file mode 100644 index 47c4e0cf..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-84.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.736Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "84" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1420", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"58c-TMIM7tFi5fxADU23WII3ojukeO0\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEI0NkEwOTRCYzRCMGFkQkQ4MDFFMTRiOURCOTVlMDVFMjg5NjI3NjQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiTFRDIiwibmFtZSI6IkxpdGVjb2luIiwiZGVjaW1hbHMiOjgsImljb25VcmkiOiJodHRwczovL2Fzc2V0cy5jb2luZ2Vja28uY29tL2NvaW5zL2ltYWdlcy8yL3NtYWxsL2xpdGVjb2luLnBuZz8xNTQ3MDMzNTgwIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgzRTU3RDAyZjlkMTk2ODczZTU1NzI3MzgyOTc0YjAyRWRlYkU2YmZkIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlNISUIiLCJuYW1lIjoiU2hpYmEgSW51IiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9hc3NldHMuY29pbmdlY2tvLmNvbS9jb2lucy9pbWFnZXMvMTE5Mzkvc3RhbmRhcmQvc2hpYmEucG5nPzE2OTY1MTE4MDAiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDE5N2FhMkRFMTMxM2M3QUQ1MDE4NDIzNDQ5MEUxMjQwOUIyYTFmOTUiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiU1VJIiwibmFtZSI6IlNVSSIsImRlY2ltYWxzIjo5LCJpY29uVXJpIjoiaHR0cHM6Ly9hc3NldHMuY29pbmdlY2tvLmNvbS9jb2lucy9pbWFnZXMvMjYzNzUvc3RhbmRhcmQvc3VpLW9jZWFuLXNxdWFyZS5wbmc/MTcyNzc5MTI5MCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4NTVlODVBMTQ3YTEwMjliOTg1Mzg0ODIyYzBCMjI2MmRGODAyMzQ1MiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJTRUkiLCJuYW1lIjoiU0VJIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9hc3NldHMuY29pbmdlY2tvLmNvbS9jb2lucy9pbWFnZXMvMjgyMDUvc3RhbmRhcmQvU2VpX0xvZ29fLV9UcmFuc3BhcmVudC5wbmc/MTY5NjUyNzIwNyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4QmFmMDdjRjkxRDQxM0MwYUNCMmI3NDQ0QjlCZjEzYjRlMDNjOUQ3MSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJTVFgiLCJuYW1lIjoiU3RhY2tzIiwiZGVjaW1hbHMiOjYsImljb25VcmkiOiJodHRwczovL2Fzc2V0cy5jb2luZ2Vja28uY29tL2NvaW5zL2ltYWdlcy8yMDY5L3N0YW5kYXJkL1N0YWNrc19Mb2dvX3BuZy5wbmc/MTcwOTk3OTMzMiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjg0LCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-85.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-85.json deleted file mode 100644 index 118d6714..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-85.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.736Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "85" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1443", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5a3-p8uRsZF3V4PqJb+iq/T5EoF4iUo\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGMxNGUwNjViMDA2N2RFOTE1MzRlMDMyODY4ZjVBYzZlY2YyYzY4NjgiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiWFJQIiwibmFtZSI6IlhSUCIsImRlY2ltYWxzIjo2LCJpY29uVXJpIjoiaHR0cHM6Ly9hc3NldHMuY29pbmdlY2tvLmNvbS9jb2lucy9pbWFnZXMvNDQvc21hbGwveHJwLXN5bWJvbC13aGl0ZS0xMjgucG5nPzE2MDU3Nzg3MzEiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGE5MDA0QTU0MjEzNzJFMUQ4M2ZCMWY4NWIwZmM5ODZjOTEyZjkxZjMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQk5CIiwibmFtZSI6IldyYXBwZWQgQk5CIChMYXllclplcm8pIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9hc3NldHMuY29pbmdlY2tvLmNvbS9jb2lucy9pbWFnZXMvODI1L3N0YW5kYXJkL2JuYi1pY29uMl8yeC5wbmc/MTY5NjUwMTk3MCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4N0Q3RjE3NjVhQ2JhRjg0N2I5QTFmNzEzN0ZFOEVkNDkzMUZiZkViQSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJBVE9NIiwibmFtZSI6IkNvc21vcyIsImRlY2ltYWxzIjo2LCJpY29uVXJpIjoiaHR0cHM6Ly9hc3NldHMuY29pbmdlY2tvLmNvbS9jb2lucy9pbWFnZXMvMTQ4MS9zdGFuZGFyZC9jb3Ntb3NfaHViLnBuZz8xNjk2NTAyNTI1IiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgxRkY3RjNFRkJiOTQ4MUNiZDdkYjRGOTMyY0JDRDQ0NjcxNDQyMzdDIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6Ik5FQVIiLCJuYW1lIjoiTmVhciIsImRlY2ltYWxzIjoyNCwiaWNvblVyaSI6Imh0dHBzOi8vYXNzZXRzLmNvaW5nZWNrby5jb20vY29pbnMvaW1hZ2VzLzEwMzY1L3N0YW5kYXJkL25lYXIuanBnPzE2OTY1MTAzNjciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDU2NTYwOWZBRjY1QjkyRjdiZTAyNDY4YWNGODZmODk3OTQyM2U1MTQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQVZBWCIsIm5hbWUiOiJXcmFwcGVkIEFWQVggKFdvcm1ob2xlKSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vYXNzZXRzLmNvaW5nZWNrby5jb20vY29pbnMvaW1hZ2VzLzEyNTU5L3NtYWxsL2NvaW4tcm91bmQtcmVkLnBuZz8xNjA0MDIxODE4IiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX1dLCJjdXJzb3IiOiJkNTQ0NzIxMC1mNTZiLTQxMzUtOWVlNi04N2Y4NzUyZWMyMWQiLCJjdXJyZW50UGFnZSI6ODUsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-86.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-86.json deleted file mode 100644 index 8cb83386..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-86.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.737Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "86" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1403", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"57b-M70lE3MnTHC2F8AvKa/VjvCTpNw\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGFDODAwRkQ2MTU5YzJhMkNCOGZDMzFFRjc0NjIxZUI0MzAyODdhNUEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiT1AiLCJuYW1lIjoiT3B0aW1pc20iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL2Fzc2V0cy5jb2luZ2Vja28uY29tL2NvaW5zL2ltYWdlcy8yNTI0NC9zdGFuZGFyZC9PcHRpbWlzbS5wbmc/MTY5NjUyNDM4NSIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MUUxNWQwOGYzQ0E0Njg1M0I2OTJFRTI4QUU5QzdhMGI4OGE5Yzk5NCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJPUkRJIiwibmFtZSI6Ik9SREkiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL2Fzc2V0cy5jb2luZ2Vja28uY29tL2NvaW5zL2ltYWdlcy8zMDE2Mi9zdGFuZGFyZC9vcmRpLnBuZz8xNjk2NTI5MDgyIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgzODY3NmY2MmQxNjZmNUNFN0RlODQzM0Y1MWM2QjNENkQ5ZDY2QzE5IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlRJQSIsIm5hbWUiOiJUSUEiLCJkZWNpbWFscyI6NiwiaWNvblVyaSI6Imh0dHBzOi8vYXNzZXRzLmNvaW5nZWNrby5jb20vY29pbnMvaW1hZ2VzLzMxOTY3L3N0YW5kYXJkL3RpYS5qcGc/MTY5NjUzMDc3MiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4YjA2YWE3RTRhZjkzN0MxMzBkRGFkZTY2ZjZlZDc2NDI3MTZmZTA3QSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJUUlgiLCJuYW1lIjoiVFJPTiIsImRlY2ltYWxzIjo2LCJpY29uVXJpIjoiaHR0cHM6Ly9hc3NldHMuY29pbmdlY2tvLmNvbS9jb2lucy9pbWFnZXMvMTA5NC9zdGFuZGFyZC90cm9uLWxvZ28ucG5nPzE2OTY1MDIxOTMiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEIyZjdjZWZhZUViMDhBYTM0NzcwNWFjODI5YTdiOGJFMkZCNTYwZjMiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiVE9OIiwibmFtZSI6IlRPTiIsImRlY2ltYWxzIjo5LCJpY29uVXJpIjoiaHR0cHM6Ly9hc3NldHMuY29pbmdlY2tvLmNvbS9jb2lucy9pbWFnZXMvMTc5ODAvc3RhbmRhcmQvcGhvdG9fMjAyNC0wOS0xMF8xNy4wOS4wMC5qcGVnPzE3MjU5NjM0NDYiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo4NiwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-87.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-87.json deleted file mode 100644 index 0200745b..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-87.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.737Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "87" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1417", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"589-8KWVX9Jq6BOrQtZU149mX254SVQ\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEExYjkxZmU5RkQ1MjE0MUZmOGNhYzM4OENlM0YxMEJGRGMxZEU3OWQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiV0lGIiwibmFtZSI6ImRvZ3dpZmhhdCIsImRlY2ltYWxzIjo2LCJpY29uVXJpIjoiaHR0cHM6Ly9hc3NldHMuY29pbmdlY2tvLmNvbS9jb2lucy9pbWFnZXMvMzM1NjYvc3RhbmRhcmQvZG9nd2lmaGF0LmpwZz8xNzAyNDk5NDI4IiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgyY0QyZUI2MUQxN2I3ODIzOUZjZDE5YWFmRjcyOTgxQjVENWVGMzE5IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlNBVFMiLCJuYW1lIjoiU2F0cyIsImRlY2ltYWxzIjo2LCJpY29uVXJpIjoiaHR0cHM6Ly9hc3NldHMuY29pbmdlY2tvLmNvbS9jb2lucy9pbWFnZXMvMzA2NjYvc3RhbmRhcmQvX2REOHFyM01fNDAweDQwMC5wbmc/MTcwMjkxMzAyMCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4OWM3NDc3MmI3MTNhMUIwMzJhRUIxNzNFMjg2ODNEOTM3RTUxOTIxYyIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJQT0wiLCJuYW1lIjoiUG9seWdvbiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vYXNzZXRzLmNvaW5nZWNrby5jb20vY29pbnMvaW1hZ2VzLzMyNDQwL3N0YW5kYXJkL3BvbHlnb24ucG5nPzE2OTgyMzM2ODQiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDUzMTg2Yzg0MTlCRUI4M2ZFNERhNzRGNzg3NTA0MWExMjg3MzM3RUQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQURBIiwibmFtZSI6IkFEQSIsImRlY2ltYWxzIjo2LCJpY29uVXJpIjoiaHR0cHM6Ly9hc3NldHMuY29pbmdlY2tvLmNvbS9jb2lucy9pbWFnZXMvOTc1L3N0YW5kYXJkL2NhcmRhbm8ucG5nPzE2OTY1MDIwOTAiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGM1ZGJENTJBZTVhOTI3Q2Y1ODVCODg0MDExZDBDNzYzMUM5OTc0YzYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiWExNIiwibmFtZSI6IlhMTSIsImRlY2ltYWxzIjo3LCJpY29uVXJpIjoiaHR0cHM6Ly9hc3NldHMuY29pbmdlY2tvLmNvbS9jb2lucy9pbWFnZXMvMTAwL3N0YW5kYXJkL1N0ZWxsYXJfc3ltYm9sX2JsYWNrX1JHQi5wbmc/MTY5NjUwMTQ4MiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjg3LCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-88.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-88.json deleted file mode 100644 index 4c077a72..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-88.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.738Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "88" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1446", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5a6-1n9bh2zavX7jFCMDU8giUiHOKXI\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGMzM0Q5QzA5NmU3NGFhNGY1NzFFOTQxN2I2OWExOUM0QTFlNzJlZjIiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQkNIIiwibmFtZSI6IkJDSCIsImRlY2ltYWxzIjo4LCJpY29uVXJpIjoiaHR0cHM6Ly9hc3NldHMuY29pbmdlY2tvLmNvbS9jb2lucy9pbWFnZXMvNzgwL3N0YW5kYXJkL2JpdGNvaW4tY2FzaC1jaXJjbGUucG5nPzE2OTY1MDE5MzIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEU5NThmMTA3YjQ2N2Q1MTcyNTczRjc2MWQyNjkzMUQ2NThDMWI0MzYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiRE9UIiwibmFtZSI6IkRPVCIsImRlY2ltYWxzIjoxMCwiaWNvblVyaSI6Imh0dHBzOi8vc3RhdGljLmNvaW5nZWNrby5jb20vcy9wb2xrYWRvdC03M2IwYzA1OGNhZTEwYTJmMDc2YTgyZGNhZGU1Y2JlMzg2MDFmYWQwNWQ1ZTYyMTExODhmMDllYjk2ZmE0NjE3LmdpZiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4ZGFmMEE3MTYwODkzOEY3NjJlMzdlQzVGNzJGNjcwQ2M0NDcwMzQ1NCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJJQ1AiLCJuYW1lIjoiSUNQIiwiZGVjaW1hbHMiOjgsImljb25VcmkiOiJodHRwczovL2Fzc2V0cy5jb2luZ2Vja28uY29tL2NvaW5zL2ltYWdlcy8xNDQ5NS9zdGFuZGFyZC9JbnRlcm5ldF9Db21wdXRlcl9sb2dvLnBuZz8xNjk2NTE0MTgwIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg4MkJCODlmY2M2NGM1ZDQwMTZDNUVkMUFCMDE2YkIwRDFDMjBENkMzIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IlJFTkRFUiIsIm5hbWUiOiJSRU5ERVIiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL2Fzc2V0cy5jb2luZ2Vja28uY29tL2NvaW5zL2ltYWdlcy8xMTYzNi9zdGFuZGFyZC9ybmRyLnBuZz8xNjk2NTExNTI5IiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgzQWVCYjk4ZjU3MDgxRGNCRWIwQjhFQTgyM0NmODQ5MDBBMzFlNUQ4IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkZJTCIsIm5hbWUiOiJGaWxlY29pbiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vYXNzZXRzLmNvaW5nZWNrby5jb20vY29pbnMvaW1hZ2VzLzEyODE3L3N0YW5kYXJkL2ZpbGVjb2luLnBuZz8xNjk2NTEyNjA5IiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX1dLCJjdXJzb3IiOiJkNTQ0NzIxMC1mNTZiLTQxMzUtOWVlNi04N2Y4NzUyZWMyMWQiLCJjdXJyZW50UGFnZSI6ODgsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-89.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-89.json deleted file mode 100644 index f5ff1d45..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-89.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.738Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "89" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1445", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5a5-eiPYMW5pc7xLOYqk1fvp8MU55Sc\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGZkRTczRWRkYkU2YzU3MTJBMTJCNzJjNDcwRjhGRTVjNzdBN2ZGMTciLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiSU5KIiwibmFtZSI6IkluamVjdGl2ZSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vYXNzZXRzLmNvaW5nZWNrby5jb20vY29pbnMvaW1hZ2VzLzEyODgyL3N0YW5kYXJkL1NlY29uZGFyeV9TeW1ib2wucG5nPzE2OTY1MTI2NzAiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDA3MzlBZDdBZUE2OWFEMzZFZEViOTFiMGU1NWNBQzE0MDQyN2M2MzIiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiRFlEWCIsIm5hbWUiOiJkWWRYIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9hc3NldHMuY29pbmdlY2tvLmNvbS9jb2lucy9pbWFnZXMvMzI1OTQvc3RhbmRhcmQvZHlkeC5wbmc/MTY5ODY3MzQ5NSIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MzAwMjFhRkE0NzY3QWQ2NmFBNTJBMDZkRjhhNUFCM2FjQTkzNzFmRCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJUUlVNUCIsIm5hbWUiOiJPZmZpY2lhbCBUcnVtcCIsImRlY2ltYWxzIjo2LCJpY29uVXJpIjoiaHR0cHM6Ly9hc3NldHMuY29pbmdlY2tvLmNvbS9jb2lucy9pbWFnZXMvNTM3NDYvc3RhbmRhcmQvdHJ1bXAucG5nPzE3MzcxNzE1NjEiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGZhNEY4RTU4MjIxNGVCQ2UxQTA4ZUIyYTY1ZTA4MDgyMDUzRTQ0MUYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiTUVMQU5JQSIsIm5hbWUiOiJNZWxhbmlhIE1lbWUiLCJkZWNpbWFscyI6NiwiaWNvblVyaSI6Imh0dHBzOi8vYXNzZXRzLmNvaW5nZWNrby5jb20vY29pbnMvaW1hZ2VzLzUzNzc1L3N0YW5kYXJkL21lbGFuaWEtbWVtZS5wbmc/MTczNzMyOTg4NSIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4ZmUxQWFjMkNEOUM1Y0M3N2I1OEVlQ2ZFNzU5ODE4NjZlZDBjOGI3YSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJFTkEiLCJuYW1lIjoiRXRoZW5hIEdvdmVybmFuY2UgVG9rZW4iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL2Fzc2V0cy5jb2luZ2Vja28uY29tL2NvaW5zL2ltYWdlcy8zNjUzMC9zdGFuZGFyZC9ldGhlbmEucG5nPzE3MTE3MDE0MzYiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo4OSwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-9.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-9.json deleted file mode 100644 index e4945000..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-9.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.690Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "9" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1480", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5c8-UCuhLL8igX3GP0riFNbUkj59QGw\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDgwOWM1NTkxNmJiNTQyYzE0MTk3MjQwMjJCM0YwMTYyMDg3RTNDODgiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiVE9SSSIsIm5hbWUiOiJUZXJpdG9yaSIsImRlY2ltYWxzIjo2LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL3Rvcmkuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgxYTM1RUU0NjQwYjBBM0I4NzcwNUIwQTRCNDVEMjI3QmE2MENhMmFkIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IldCVEMuYXhsIiwibmFtZSI6IldCVEMgKEF4ZWxhcikiLCJkZWNpbWFscyI6OCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9heGVsYXJuZXR3b3JrL2F4ZWxhci1jb25maWdzL21haW4vaW1hZ2VzL3Rva2Vucy93YnRjLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4NTk3OUQ3YjU0NkUzOEU0MTRGN0U5ODIyNTE0YmU0NDNBNDgwMDUyOSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJ3c3RFVEgiLCJuYW1lIjoiV3JhcHBlZCBsaXF1aWQgc3Rha2VkIEV0aGVyIDIuMCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8weHNxdWlkL2Fzc2V0cy9tYWluL2ltYWdlcy90b2tlbnMvd3N0ZXRoLnN2ZyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MEM0NjgxZTZDMDIzNTE3OWVjM0Q0RjRmYzRERjNkMTRGREQ5NjAxNyIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJSRE5UIiwibmFtZSI6IlJhZGlhbnQiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vMHhzcXVpZC9hc3NldHMvbWFpbi9pbWFnZXMvdG9rZW5zL3JkbnQuc3ZnIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgwMTBkRjlkMjlkMEI0NjAzYTU1NjE4NzJlZDEzNTQyYjUxMWUzNWI3IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IklNUCIsIm5hbWUiOiJJbXBlcmlhbCBPYmVsaXNrIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F4ZWxhcm5ldHdvcmsvYXhlbGFyLWNvbmZpZ3MvbWFpbi9pbWFnZXMvdG9rZW5zL2ltcC5zdmciLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo5LCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-90.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-90.json deleted file mode 100644 index cd18c3af..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-90.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.739Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "90" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1421", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"58d-C+Z0BTqsmqv/dTeF/g72HEtP4bI\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGFjYTM0MUU2MWFCNjE3N0IwYjBEZjQ2YTYxMmU0MzExRjhhNzYwNWYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiRkFSVENPSU4iLCJuYW1lIjoiRmFydGNvaW4iLCJkZWNpbWFscyI6NiwiaWNvblVyaSI6Imh0dHBzOi8vYXNzZXRzLmNvaW5nZWNrby5jb20vY29pbnMvaW1hZ2VzLzUwODkxL3N0YW5kYXJkL2ZhcnQuanBnPzE3Mjk1MDM5NzIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEJiNjliZDlkYzE1MkMyYzBGMDgzNTA3NjQxYTQ2MTkzZDJCNjFFQmIiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQUkxNloiLCJuYW1lIjoiYWkxNnoiLCJkZWNpbWFscyI6OSwiaWNvblVyaSI6Imh0dHBzOi8vYXNzZXRzLmNvaW5nZWNrby5jb20vY29pbnMvaW1hZ2VzLzUxMDkwL3N0YW5kYXJkL0FJMTZaLmpwZz8xNzMwMDI3MTc1IiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg5RDY3OEI0RGQzOGE2RTAxZGY4MDkwYUVCNzk3NGFENzExNDJiMDVmIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkxETyIsIm5hbWUiOiJMaWRvIERBTyIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vYXNzZXRzLmNvaW5nZWNrby5jb20vY29pbnMvaW1hZ2VzLzEzNTczL3N0YW5kYXJkL0xpZG9fREFPLnBuZz8xNjk2NTEzMzI2IiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg2N0FEQUJiQWQyMTFlQTliM0I0RTJmZDBGRDE2NUU1OTNEZTFlOTgzIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkJFUkEiLCJuYW1lIjoiQmVyYWNoYWluIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9hc3NldHMuY29pbmdlY2tvLmNvbS9jb2lucy9pbWFnZXMvMjUyMzUvc3RhbmRhcmQvQkVSQS5wbmc/MTczODgyMjAwOCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4QjY2NzI0OTYyMTRDOTAxMzRBOTIyMzg5NGU3MDlGMjZBNWVFRDM2MiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJWSVJUVUFMIiwibmFtZSI6IlZpcnR1YWxzIFByb3RvY29sIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9hc3NldHMuY29pbmdlY2tvLmNvbS9jb2lucy9pbWFnZXMvMzQwNTcvc3RhbmRhcmQvTE9HT01BUksucG5nPzE3MDgzNTYwNTQiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfV0sImN1cnNvciI6ImQ1NDQ3MjEwLWY1NmItNDEzNS05ZWU2LTg3Zjg3NTJlYzIxZCIsImN1cnJlbnRQYWdlIjo5MCwidG90YWxQYWdlcyI6OTQsInRvdGFsSXRlbXMiOjQ2N30=" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-91.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-91.json deleted file mode 100644 index 7698c45d..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-91.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.740Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "91" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1471", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"5bf-eosVZ6nb0iYCaTLm9Eh4+fYTkag\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDRDMWRhYzliNmVBZjEyMkZlM0RFODI0YzFDMjIyMDQxM0YzYUMxOTciLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUEVOR1UiLCJuYW1lIjoiUHVkZ3kgUGVuZ3VpbnMiLCJkZWNpbWFscyI6NiwiaWNvblVyaSI6Imh0dHBzOi8vYXNzZXRzLmNvaW5nZWNrby5jb20vY29pbnMvaW1hZ2VzLzUyNjIyL3N0YW5kYXJkL1BVREdZX1BFTkdVSU5TX1BFTkdVX1BGUC5wbmc/MTczMzgwOTExMCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4RWNGQjQ3MThhRDE5YjYyNkE3NzQ5MTg5NWEyZjk5ZWEwY2VkRWQwOCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJPTkRPIiwibmFtZSI6Ik9uZG8iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL2Fzc2V0cy5jb2luZ2Vja28uY29tL2NvaW5zL2ltYWdlcy8yNjU4MC9zdGFuZGFyZC9PTkRPLnBuZz8xNjk2NTI1NjU2IiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg4M0Q1OTQ0RTdmNUVGMWQ4NDMyMDAyZDNjYjA2MmUxMDEyZjZGOGU2IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkZFVCIsIm5hbWUiOiJBcnRpZmljaWFsIFN1cGVyaW50ZWxsaWdlbmNlIEFsbGlhbmNlIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9hc3NldHMuY29pbmdlY2tvLmNvbS9jb2lucy9pbWFnZXMvNTY4MS9zdGFuZGFyZC9BU0kucG5nPzE3MTk4MjcyODkiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGNBNTQzQ2I4YkNDNzZlNEUwQTAzNEY1NkVCNDBhMTAyOWJERmQ3MEUiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiQUlYQlQiLCJuYW1lIjoiQUlYQlQiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL2Fzc2V0cy5jb2luZ2Vja28uY29tL2NvaW5zL2ltYWdlcy81MTc4NC9zdGFuZGFyZC8zLnBuZz8xNzMxOTgxMTM4IiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg1ODBiMzczQWMxNjgwM0JCMDEzMzM1NkY0NzBmM2M3RUVGNTQxNTFCIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkNBS0UiLCJuYW1lIjoicGFuY2FrZXN3YXAiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL2Fzc2V0cy5jb2luZ2Vja28uY29tL2NvaW5zL2ltYWdlcy8xMjYzMi9zdGFuZGFyZC9wYW5jYWtlc3dhcC1jYWtlLWxvZ29fJTI4MSUyOS5wbmc/MTY5NjUxMjQ0MCIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjkxLCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-92.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-92.json deleted file mode 100644 index 56a5c17d..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-92.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.740Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "92" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1414", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"586-oEknSyymifjIN/p1o12P+lQlc6U\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDhGNmNDYjk5ZDRGZDBCNDA5NTkxNTE0N2I1YWUzYmJEYjgwNzUzOTQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUyIsIm5hbWUiOiJTb25pYyIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vYXNzZXRzLmNvaW5nZWNrby5jb20vY29pbnMvaW1hZ2VzLzM4MTA4L3N0YW5kYXJkLzIwMHgyMDBfU29uaWNfTG9nby5wbmc/MTczNDY3OTI1NiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4ZkVkNTAwRGYzNzk0MjdGYmM0OEJEYWYzYjUxMWI1MTljN2VDQ0QyNiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJKVVAiLCJuYW1lIjoiSnVwaXRlciIsImRlY2ltYWxzIjo2LCJpY29uVXJpIjoiaHR0cHM6Ly9hc3NldHMuY29pbmdlY2tvLmNvbS9jb2lucy9pbWFnZXMvMzQxODgvc3RhbmRhcmQvanVwLnBuZz8xNzA0MjY2NDg5IiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhmREZBMEE3NDlkQTNiQ2NlZTIwYUUwQjRBRDUwRTM5QjI2RjU4ZjdDIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkhZUEUiLCJuYW1lIjoiSHlwZXJsaXF1aWQiLCJkZWNpbWFscyI6OCwiaWNvblVyaSI6Imh0dHBzOi8vYXNzZXRzLmNvaW5nZWNrby5jb20vY29pbnMvaW1hZ2VzLzUwODgyL3N0YW5kYXJkL2h5cGVybGlxdWlkLmpwZz8xNzI5NDMxMzAwIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg4OTA0RGU4NGMzYkIzQjdEMjM4M0Y5MzRBZjQwRmNCM0VmODJGMjhiIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6Ik1LUiIsIm5hbWUiOiJNYWtlciIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vYXNzZXRzLmNvaW5nZWNrby5jb20vY29pbnMvaW1hZ2VzLzEzNjQvc3RhbmRhcmQvTWFya19NYWtlci5wbmc/MTY5NjUwMjQyMyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4MWYzNDA3RWEwNjdEZkJERjZkRWI2YkJGZEE0ODY5MjE1ZkIwYWI3NyIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJPTSIsIm5hbWUiOiJNQU5UUkEiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL2Fzc2V0cy5jb2luZ2Vja28uY29tL2NvaW5zL2ltYWdlcy8xMjE1MS9zdGFuZGFyZC9PTV9Ub2tlbi5wbmc/MTY5NjUxMTk5MSIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjkyLCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-93.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-93.json deleted file mode 100644 index 1a3864c8..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-93.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.741Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "93" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "1431", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"597-htRaHbH0+Ed7vGO1PXxdWZdZn/w\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDk3Q2UxRjMwOUI5NDlmN0ZCQzRmNThjNWNiNmFhNDE3QTVmZjg5NjQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiRE9MTyIsIm5hbWUiOiJEb2xvbWl0ZSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vYXNzZXRzLmNvaW5nZWNrby5jb20vY29pbnMvaW1hZ2VzLzU0NzEwL3N0YW5kYXJkL0RPTE8tc21hbGwucG5nPzE3NDUzOTg1MzUiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGE4MTkzQzU1QzM0RWQyMmUxRGJlNzNGRDVBZGM2NjhFNTE1NzhhNjciLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiWlJPIiwibmFtZSI6IkxheWVyWmVybyIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vYXNzZXRzLmNvaW5nZWNrby5jb20vY29pbnMvaW1hZ2VzLzI4MjA2L3N0YW5kYXJkL2Z0eEc5X1RKXzQwMHg0MDAuanBlZz8xNjk2NTI3MjA4IiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhlNWYwMWFlQWNjODI4OEU5ODM4QTYwMDE2QUIwMGQ3YjY2NzU5MDBiIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6IkNSViIsIm5hbWUiOiJDdXJ2ZSBEQU8gVG9rZW4iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiJodHRwczovL2Fzc2V0cy5jb2luZ2Vja28uY29tL2NvaW5zL2ltYWdlcy8xMjEyNC9zdGFuZGFyZC9DdXJ2ZS5wbmc/MTY5NjUxMTk2NyIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4ZDM4OThjNjU3MDk3NEFFY2EzOGE4QUNmMjJmZDYwNzM5ZTUyOEE5OSIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJNT09ERU5HIiwibmFtZSI6Ik1vb2RlbmciLCJkZWNpbWFscyI6NiwiaWNvblVyaSI6Imh0dHBzOi8vYXNzZXRzLmNvaW5nZWNrby5jb20vY29pbnMvaW1hZ2VzLzUwMjY0L3N0YW5kYXJkL01PT0RFTkcuanBnPzE3MjY3MjY5NzUiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDEzNjc0MTcyRTZFNDREMzFkNGJFNDg5ZDUxODRmMzQ1N2M0MDE1M0EiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiWE1SIiwibmFtZSI6Ik1vbmVybyIsImRlY2ltYWxzIjoxMiwiaWNvblVyaSI6Imh0dHBzOi8vYXNzZXRzLmNvaW5nZWNrby5jb20vY29pbnMvaW1hZ2VzLzY5L3N0YW5kYXJkL21vbmVyb19sb2dvLnBuZz8xNjk2NTAxNDYwIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6dHJ1ZX1dLCJjdXJzb3IiOiJkNTQ0NzIxMC1mNTZiLTQxMzUtOWVlNi04N2Y4NzUyZWMyMWQiLCJjdXJyZW50UGFnZSI6OTMsInRvdGFsUGFnZXMiOjk0LCJ0b3RhbEl0ZW1zIjo0Njd9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-94.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-94.json deleted file mode 100644 index fb653a03..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-94.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:11:31.741Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "d5447210-f56b-4135-9ee6-87f8752ec21d", - "page": "94" - } - }, - "response": { - "status": 200, - "headers": { - "connection": "keep-alive", - "content-length": "628", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:11:31 GMT", - "etag": "W/\"274-8d9SQJE5lgLGjKOody9TvwWYVXs\"", - "keep-alive": "timeout=5", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGQxNzM4ZDM3NDAxYTBBNzFmN0UzODJkMmNGZUNEM2FiNjk2ODcwMTciLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUEkiLCJuYW1lIjoiUGkgTmV0d29yayIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6Imh0dHBzOi8vYXNzZXRzLmNvaW5nZWNrby5jb20vY29pbnMvaW1hZ2VzLzU0MzQyL3N0YW5kYXJkL3BpX25ldHdvcmsuanBnPzE3MzkzNDc1NzYiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjp0cnVlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDljMDYwQjJmQTk1M2I1ZjY5ODc5YThCN0I4MWY2MkJGZkVGMzYwYmUiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiUFVNUCIsIm5hbWUiOiJQdW1wIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiaHR0cHM6Ly9hc3NldHMuY29pbmdlY2tvLmNvbS9jb2lucy9pbWFnZXMvNjcxNjQvc3RhbmRhcmQvcHVtcC5qcGc/MTc1MTk0OTM3NiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOnRydWV9XSwiY3Vyc29yIjoiZDU0NDcyMTAtZjU2Yi00MTM1LTllZTYtODdmODc1MmVjMjFkIiwiY3VycmVudFBhZ2UiOjk0LCJ0b3RhbFBhZ2VzIjo5NCwidG90YWxJdGVtcyI6NDY3fQ==" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-95.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-95.json deleted file mode 100644 index 32103e0d..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-95.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:08:24.806Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "571d8c02-cc68-45a2-8ef3-2bbebdc0b26c", - "page": "95" - } - }, - "response": { - "status": 200, - "headers": { - "alt-svc": "h3=\":443\"; ma=86400", - "cf-cache-status": "DYNAMIC", - "cf-ray": "9c945a5ad8790ba1-ATL", - "connection": "keep-alive", - "content-encoding": "br", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:08:24 GMT", - "etag": "W/\"435-sBWk7cC12+wyM9qB9TXw9G8OjxI\"", - "nel": "{\"report_to\":\"cf-nel\",\"success_fraction\":0.0,\"max_age\":604800}", - "report-to": "{\"group\":\"cf-nel\",\"max_age\":604800,\"endpoints\":[{\"url\":\"https://a.nel.cloudflare.com/report/v4?s=HX%2FdqRmjrZOmoOe9vzCJn5bbC2oKVU8iLJ8C5g5PGHMwE%2BHNUjTeyNqGa1qinHG%2Fl08A9uVCdRVOL%2BpclKoWBULJLAyZ2Pd%2FFm%2BuJKma6Q%3D%3D\"}]}", - "server": "cloudflare", - "transfer-encoding": "chunked", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEQyMmE1OGY3OWU5NDgxRDFhODhlMDBjMzQzODg1QTU4OGIzNGI2OEIiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiRVVSUyIsIm5hbWUiOiJTVEFTSVMgRVVSUyBUb2tlbiIsImRlY2ltYWxzIjoyLCJpY29uVXJpIjoiIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6ZmFsc2V9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4M0Y1NmUwYzM2ZDI3NTM2N2I4QzUwMjA5MEVERjM4Mjg5YjNkRWEwZCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJNQUkiLCJuYW1lIjoiTWFpIFN0YWJsZWNvaW4iLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjpmYWxzZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg4MkU2NGY0OUVkNUVDMWJDNmU0M0RBRDRGQzhBZjliYjNBMjMxMkVFIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6ImFBcmJEQUkiLCJuYW1lIjoiQWF2ZSBBcmJpdHJ1bSBEQUkiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjpmYWxzZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHgxOTFjMTBBYTRBRjdDMzBlODcxRTcwQzk1ZEIwRTRlYjc3MjM3NTMwIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6ImFBcmJMSU5LIiwibmFtZSI6IkFhdmUgQXJiaXRydW0gTElOSyIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDYyNUU3NzA4ZjMwY0E3NWJmZDkyNTg2ZTE3MDc3NTkwQzYwZWI0Y0QiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiYUFyYlVTREMiLCJuYW1lIjoiQWF2ZSBBcmJpdHJ1bSBVU0RDIiwiZGVjaW1hbHMiOjYsImljb25VcmkiOiIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjpmYWxzZX1dLCJjdXJzb3IiOiI1NzFkOGMwMi1jYzY4LTQ1YTItOGVmMy0yYmJlYmRjMGIyNmMiLCJjdXJyZW50UGFnZSI6OTUsInRvdGFsUGFnZXMiOjk5LCJ0b3RhbEl0ZW1zIjo0OTV9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-96.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-96.json deleted file mode 100644 index 383a5570..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-96.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:08:24.900Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "571d8c02-cc68-45a2-8ef3-2bbebdc0b26c", - "page": "96" - } - }, - "response": { - "status": 200, - "headers": { - "alt-svc": "h3=\":443\"; ma=86400", - "cf-cache-status": "DYNAMIC", - "cf-ray": "9c945a5b6a0d0ba1-ATL", - "connection": "keep-alive", - "content-encoding": "br", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:08:24 GMT", - "etag": "W/\"444-nOa9PZaIZxaZA6wh7OOdnKk5Xz4\"", - "nel": "{\"report_to\":\"cf-nel\",\"success_fraction\":0.0,\"max_age\":604800}", - "report-to": "{\"group\":\"cf-nel\",\"max_age\":604800,\"endpoints\":[{\"url\":\"https://a.nel.cloudflare.com/report/v4?s=qHbh1wxC2bHxSk%2BU7rUIHO2ApmJaLmVMqOZYoTrMxj7pU6as738dsrBLxE2S8NpbnWwRTua5N76sR3xiGjRAKQ22SJBRitDMo%2FTV%2BhhgoA%3D%3D\"}]}", - "server": "cloudflare", - "transfer-encoding": "chunked", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDA3OGYzNTgyMDg2ODUwNDZhMTFDODVlOGFkMzI4OTVERUQzM0EyNDkiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiYUFyYldCVEMiLCJuYW1lIjoiQWF2ZSBBcmJpdHJ1bSBXQlRDIiwiZGVjaW1hbHMiOjgsImljb25VcmkiOiIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjpmYWxzZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhlNTBmQTliM2M1NkZmQjE1OWNCMEZDQTYxRjVjOUQ3NTBlODEyOGM4IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6ImFBcmJXRVRIIiwibmFtZSI6IkFhdmUgQXJiaXRydW0gV0VUSCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDZhYjcwN0FjYTk1M2VEQWVGQmM0ZkQyM2JBNzMyOTQyNDE0OTA2MjAiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiYUFyYlVTRFQiLCJuYW1lIjoiQWF2ZSBBcmJpdHJ1bSBVU0RUIiwiZGVjaW1hbHMiOjYsImljb25VcmkiOiIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjpmYWxzZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHhmMzI5ZTM2QzdiRjZFNUU4NmNlMjE1MDg3NWE4NENlNzdmNDc3Mzc1IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6ImFBcmJBQVZFIiwibmFtZSI6IkFhdmUgQXJiaXRydW0gQUFWRSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDZkODAxMTNlNTMzYTJDMGZlODJFYUJEMzVmMTg3NURjRUE4OUVhOTciLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiYUFyYkVVUlMiLCJuYW1lIjoiQWF2ZSBBcmJpdHJ1bSBFVVJTIiwiZGVjaW1hbHMiOjIsImljb25VcmkiOiIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjpmYWxzZX1dLCJjdXJzb3IiOiI1NzFkOGMwMi1jYzY4LTQ1YTItOGVmMy0yYmJlYmRjMGIyNmMiLCJjdXJyZW50UGFnZSI6OTYsInRvdGFsUGFnZXMiOjk5LCJ0b3RhbEl0ZW1zIjo0OTV9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-97.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-97.json deleted file mode 100644 index 07dc0704..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-97.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:08:24.993Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "571d8c02-cc68-45a2-8ef3-2bbebdc0b26c", - "page": "97" - } - }, - "response": { - "status": 200, - "headers": { - "alt-svc": "h3=\":443\"; ma=86400", - "cf-cache-status": "DYNAMIC", - "cf-ray": "9c945a5c0bc80ba1-ATL", - "connection": "keep-alive", - "content-encoding": "br", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:08:25 GMT", - "etag": "W/\"44a-xVgwNSBVqb947GWKrz62jABaRPQ\"", - "nel": "{\"report_to\":\"cf-nel\",\"success_fraction\":0.0,\"max_age\":604800}", - "report-to": "{\"group\":\"cf-nel\",\"max_age\":604800,\"endpoints\":[{\"url\":\"https://a.nel.cloudflare.com/report/v4?s=baRx%2B40WlsEsduvSCGuC29bYGSTTaI5eShue4B4EOWuMVFLeaJ2aXYNUNOoaItIooAUSexwLuWDptibf6Bfds0x7CJMZLLU02Yw8eo004Q%3D%3D\"}]}", - "server": "cloudflare", - "transfer-encoding": "chunked", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDUxM2M3RTNhOWM2OWNBM2UyMjU1MGVGNThBQzFDMDA4OGU5MThGRmYiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiYUFyYndzdEVUSCIsIm5hbWUiOiJBYXZlIEFyYml0cnVtIHdzdEVUSCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGM0NUE0Nzk4NzdlMWU5RGZlOUZjRDQwNTZjNjk5NTc1YTEwNDVkQUEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiYUFyYk1BSSIsIm5hbWUiOiJBYXZlIEFyYml0cnVtIE1BSSIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDhFYjI3MGUyOTYwMjNFOUQ5MjA4MWZkRjk2N2REZDc4Nzg3MjQ0MjQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiYUFyYnJFVEgiLCJuYW1lIjoiQWF2ZSBBcmJpdHJ1bSByRVRIIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6ZmFsc2V9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4OGZmRGYyREU4MTIwOTViMUQxOUNCMTQ2RTRjMDA0NTg3QzBBMDY5MiIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJhQXJiTFVTRCIsIm5hbWUiOiJBYXZlIEFyYml0cnVtIExVU0QiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjpmYWxzZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg3MjRkYzgwN2IwNDU1NWI3MWVkNDhhNjg5NmI2RjQxNTkzYjhDNjM3IiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6ImFBcmJVU0RDbiIsIm5hbWUiOiJBYXZlIEFyYml0cnVtIFVTRENuIiwiZGVjaW1hbHMiOjYsImljb25VcmkiOiIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjpmYWxzZX1dLCJjdXJzb3IiOiI1NzFkOGMwMi1jYzY4LTQ1YTItOGVmMy0yYmJlYmRjMGIyNmMiLCJjdXJyZW50UGFnZSI6OTcsInRvdGFsUGFnZXMiOjk5LCJ0b3RhbEl0ZW1zIjo0OTV9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-98.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-98.json deleted file mode 100644 index 4157e852..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-98.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:08:25.085Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "571d8c02-cc68-45a2-8ef3-2bbebdc0b26c", - "page": "98" - } - }, - "response": { - "status": 200, - "headers": { - "alt-svc": "h3=\":443\"; ma=86400", - "cf-cache-status": "DYNAMIC", - "cf-ray": "9c945a5c9d740ba1-ATL", - "connection": "keep-alive", - "content-encoding": "br", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:08:25 GMT", - "etag": "W/\"447-fDseslih0AzkhdA2uxe6qobmJos\"", - "nel": "{\"report_to\":\"cf-nel\",\"success_fraction\":0.0,\"max_age\":604800}", - "report-to": "{\"group\":\"cf-nel\",\"max_age\":604800,\"endpoints\":[{\"url\":\"https://a.nel.cloudflare.com/report/v4?s=9%2FucVMdnfy2vMdn25sCN4Dvv6DNINgV70mrPoUSLYxV6xnF%2BcqsqOw4oYe%2FWIb7KXaDxGCdz8epW7MBZ%2B%2F4QUx6F%2FdaBX04X%2FGa6OaimHg%3D%3D\"}]}", - "server": "cloudflare", - "transfer-encoding": "chunked", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDM4ZDY5M2NFMWRGNUFhREY3YkM2MjU5NUEzN0Q2NjdhRDU3OTIyZTUiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiYUFyYkZSQVgiLCJuYW1lIjoiQWF2ZSBBcmJpdHJ1bSBGUkFYIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6ZmFsc2V9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4NjUzM2FmYWMyRTdCQ0NCMjBkY2ExNjE0NDlBMTNBMzJEMzkxZmIwMCIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJhQXJiQVJCIiwibmFtZSI6IkFhdmUgQXJiaXRydW0gQVJCIiwiZGVjaW1hbHMiOjE4LCJpY29uVXJpIjoiIiwiaXNOYXRpdmUiOmZhbHNlLCJpc1ZldHRlZCI6ZmFsc2V9LHsidG9rZW5VaWQiOnsiYWRkcmVzcyI6IjB4ODQzN2Q3QzE2N2RGQjgyRUQ0Q2I3OUNENDRCN2EzMkExZGQ5NWM3NyIsImNoYWluSWQiOiI0MjE2MSJ9LCJzeW1ib2wiOiJhQXJid2VFVEgiLCJuYW1lIjoiQWF2ZSBBcmJpdHJ1bSB3ZUVUSCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweGVCZTUxNzg0NmQwRjM2ZUNFZDk5QzczNWNiRjYxMzFlMWZFQjc3NUQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiYUFyYkdITyIsIm5hbWUiOiJBYXZlIEFyYml0cnVtIEdITyIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweEVBMTEzMjEyMGRkY0REQTJGMTE5ZTk5RmE3QTI3YTBkMDM2RjdBYzkiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiYUFyYmV6RVRIIiwibmFtZSI6IkFhdmUgQXJiaXRydW0gZXpFVEgiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjpmYWxzZX1dLCJjdXJzb3IiOiI1NzFkOGMwMi1jYzY4LTQ1YTItOGVmMy0yYmJlYmRjMGIyNmMiLCJjdXJyZW50UGFnZSI6OTgsInRvdGFsUGFnZXMiOjk5LCJ0b3RhbEl0ZW1zIjo0OTV9" - } -} diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-99.json b/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-99.json deleted file mode 100644 index 6a926763..00000000 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/tests/mocks/data/onchain-actions/tokens-page-99.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "metadata": { - "service": "onchain-actions", - "endpoint": "/tokens", - "method": "GET", - "recordedAt": "2026-02-05T18:08:25.178Z" - }, - "request": { - "params": { - "chainIds": "42161", - "cursor": "571d8c02-cc68-45a2-8ef3-2bbebdc0b26c", - "page": "99" - } - }, - "response": { - "status": 200, - "headers": { - "alt-svc": "h3=\":443\"; ma=86400", - "cf-cache-status": "DYNAMIC", - "cf-ray": "9c945a5d2f400ba1-ATL", - "connection": "keep-alive", - "content-encoding": "br", - "content-type": "application/json; charset=utf-8", - "date": "Thu, 05 Feb 2026 18:08:25 GMT", - "etag": "W/\"40a-pYawwqBhZH9gScd/G+Ih5rQPIj8\"", - "nel": "{\"report_to\":\"cf-nel\",\"success_fraction\":0.0,\"max_age\":604800}", - "report-to": "{\"group\":\"cf-nel\",\"max_age\":604800,\"endpoints\":[{\"url\":\"https://a.nel.cloudflare.com/report/v4?s=OMl6pD0eUyQsdNSxH6T3XALsUkhkBRLOKPvetbf1ZYfQERXuCCbqUvK%2Bl4Fjuy1ThJRnC8DPHg41MAfLT5BmW9N%2BTGefBJJ%2Fs1ioLtK69A%3D%3D\"}]}", - "server": "cloudflare", - "transfer-encoding": "chunked", - "x-powered-by": "Express" - }, - "rawBody": "eyJ0b2tlbnMiOlt7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDZiMDMwRmYzRkI5OTU2QjFCNjlmNDc1Qjc3YUUwZDNDZjJDQzVhRmEiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiYUFyYnJzRVRIIiwibmFtZSI6IkFhdmUgQXJiaXRydW0gcnNFVEgiLCJkZWNpbWFscyI6MTgsImljb25VcmkiOiIiLCJpc05hdGl2ZSI6ZmFsc2UsImlzVmV0dGVkIjpmYWxzZX0seyJ0b2tlblVpZCI6eyJhZGRyZXNzIjoiMHg2MmZDOTZiMjdhNTEwY0Y0OTc3QjU5RkY5NTJEYzMyMzc4Q2MyMjFkIiwiY2hhaW5JZCI6IjQyMTYxIn0sInN5bWJvbCI6ImFBcmJ0QlRDIiwibmFtZSI6IkFhdmUgQXJiaXRydW0gdEJUQyIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDRlMzUyY0YxNjRFNjRBRENCYWQzMThDM2ExZTIyMkU5RUJhNENlNDIiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiTUNCIiwibmFtZSI6Ik1VWCBQcm90b2NvbCIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDlDOWIzRDQ4YzgxM2YyNTNhOEZFNEQ3ODA0YzEyN2Q3MzA4QzFjMTQiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfSx7InRva2VuVWlkIjp7ImFkZHJlc3MiOiIweDdDY0NCQTM4RTJEOTU5ZmUxMzVlNzlBRUJCNTdDQ2IyN0IxMjgzNTgiLCJjaGFpbklkIjoiNDIxNjEifSwic3ltYm9sIjoiIiwibmFtZSI6IiIsImRlY2ltYWxzIjoxOCwiaWNvblVyaSI6IiIsImlzTmF0aXZlIjpmYWxzZSwiaXNWZXR0ZWQiOmZhbHNlfV0sImN1cnNvciI6IjU3MWQ4YzAyLWNjNjgtNDVhMi04ZWYzLTJiYmViZGMwYjI2YyIsImN1cnJlbnRQYWdlIjo5OSwidG90YWxQYWdlcyI6OTksInRvdGFsSXRlbXMiOjQ5NX0=" - } -} From 98ce13dfa51958a650259a5cb5b76987984e0de1 Mon Sep 17 00:00:00 2001 From: Tom Daniel <0xtomdaniel@gmail.com> Date: Thu, 12 Feb 2026 13:43:01 -0500 Subject: [PATCH 70/70] fix(web-ag-ui): unify arbitrum rpc env and require privy app id --- .../src/components/PrivyClientProvider.tsx | 8 +- .../apps/agent-clmm/src/clients/clients.ts | 6 +- .../agent-clmm/src/core/delegatedExecution.ts | 4 +- .../agent-gmx-allora/src/clients/clients.ts | 5 +- .../tests/smoke/gmx-allora-smoke.ts | 2 +- .../apps/agent-pendle/src/clients/clients.ts | 6 +- .../clients/web-ag-ui/apps/web/.env.example | 6 +- .../src/components/PrivyClientProvider.tsx | 21 +- typescript/clients/web-ag-ui/pnpm-lock.yaml | 507 +++++++++++++++++- .../src/agentToolHandlers.ts | 2 +- typescript/lib/test-utils/src/chains.ts | 2 +- typescript/test/chains.ts | 3 +- 12 files changed, 507 insertions(+), 65 deletions(-) diff --git a/typescript/clients/web-a2a/src/components/PrivyClientProvider.tsx b/typescript/clients/web-a2a/src/components/PrivyClientProvider.tsx index 91c2819e..bd7ef36a 100644 --- a/typescript/clients/web-a2a/src/components/PrivyClientProvider.tsx +++ b/typescript/clients/web-a2a/src/components/PrivyClientProvider.tsx @@ -3,16 +3,12 @@ import { PrivyProvider } from '@privy-io/react-auth'; import type React from 'react'; -function isPlaceholderAppId(appId: string): boolean { - return appId === 'your_privy_app_id_here'; -} - export function PrivyClientProvider({ children }: { children: React.ReactNode }) { const appId = process.env.NEXT_PUBLIC_PRIVY_APP_ID; - if (!appId || isPlaceholderAppId(appId)) { + if (!appId) { throw new Error( - 'Privy is not configured: set NEXT_PUBLIC_PRIVY_APP_ID to a valid Privy App ID (build can succeed without it, but the app cannot run without it).', + 'Privy is not configured. Set NEXT_PUBLIC_PRIVY_APP_ID to a valid Privy App ID and restart the dev server.', ); } diff --git a/typescript/clients/web-ag-ui/apps/agent-clmm/src/clients/clients.ts b/typescript/clients/web-ag-ui/apps/agent-clmm/src/clients/clients.ts index 60e72da2..c1a77aef 100644 --- a/typescript/clients/web-ag-ui/apps/agent-clmm/src/clients/clients.ts +++ b/typescript/clients/web-ag-ui/apps/agent-clmm/src/clients/clients.ts @@ -4,10 +4,8 @@ import { arbitrum } from 'viem/chains'; const DEFAULT_ARBITRUM_RPC_URL = 'https://arb1.arbitrum.io/rpc'; const ARBITRUM_RPC_URL = - // Allow either env var name; fall back to a public Arbitrum One RPC for local dev. - process.env['ARBITRUM_RPC_URL'] ?? - process.env['ARBITRUM_ONE_RPC_URL'] ?? - DEFAULT_ARBITRUM_RPC_URL; + // Default to a public Arbitrum One RPC for local dev; set ARBITRUM_RPC_URL to override. + process.env['ARBITRUM_RPC_URL'] ?? DEFAULT_ARBITRUM_RPC_URL; const RPC_RETRY_COUNT = 2; const RPC_TIMEOUT_MS = 8000; diff --git a/typescript/clients/web-ag-ui/apps/agent-clmm/src/core/delegatedExecution.ts b/typescript/clients/web-ag-ui/apps/agent-clmm/src/core/delegatedExecution.ts index 29f30d93..96223f72 100644 --- a/typescript/clients/web-ag-ui/apps/agent-clmm/src/core/delegatedExecution.ts +++ b/typescript/clients/web-ag-ui/apps/agent-clmm/src/core/delegatedExecution.ts @@ -153,9 +153,7 @@ export async function redeemDelegationsAndExecuteTransactions(params: { const resolvedRpcUrl = typeof rpcUrl === 'string' ? rpcUrl - : process.env['ARBITRUM_RPC_URL'] ?? - process.env['ARBITRUM_ONE_RPC_URL'] ?? - defaultArbitrumRpcUrl; + : process.env['ARBITRUM_RPC_URL'] ?? defaultArbitrumRpcUrl; const simulationClient = createClient({ account: params.clients.wallet.account, diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/clients.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/clients.ts index e374f227..c1a77aef 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/clients.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/src/clients/clients.ts @@ -4,9 +4,8 @@ import { arbitrum } from 'viem/chains'; const DEFAULT_ARBITRUM_RPC_URL = 'https://arb1.arbitrum.io/rpc'; const ARBITRUM_RPC_URL = - process.env['ARBITRUM_RPC_URL'] ?? - process.env['ARBITRUM_ONE_RPC_URL'] ?? - DEFAULT_ARBITRUM_RPC_URL; + // Default to a public Arbitrum One RPC for local dev; set ARBITRUM_RPC_URL to override. + process.env['ARBITRUM_RPC_URL'] ?? DEFAULT_ARBITRUM_RPC_URL; const RPC_RETRY_COUNT = 2; const RPC_TIMEOUT_MS = 8000; diff --git a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts index 9895b68f..7af52cee 100644 --- a/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts +++ b/typescript/clients/web-ag-ui/apps/agent-gmx-allora/tests/smoke/gmx-allora-smoke.ts @@ -47,7 +47,7 @@ const CLOSE_POSITION_SETTLE_TIMEOUT_MS = 180_000; const MAX_FULL_CYCLE_USDC_LOSS_BASE_UNITS = 1_000_000n; const resolveArbitrumRpcUrl = (): string => - process.env['ARBITRUM_RPC_URL'] ?? process.env['ARBITRUM_ONE_RPC_URL'] ?? 'https://arbitrum.gateway.tenderly.co'; + process.env['ARBITRUM_RPC_URL'] ?? 'https://arb1.arbitrum.io/rpc'; const resolveBaseUrl = (): string => resolveOnchainActionsApiUrl({ diff --git a/typescript/clients/web-ag-ui/apps/agent-pendle/src/clients/clients.ts b/typescript/clients/web-ag-ui/apps/agent-pendle/src/clients/clients.ts index 60e72da2..c1a77aef 100644 --- a/typescript/clients/web-ag-ui/apps/agent-pendle/src/clients/clients.ts +++ b/typescript/clients/web-ag-ui/apps/agent-pendle/src/clients/clients.ts @@ -4,10 +4,8 @@ import { arbitrum } from 'viem/chains'; const DEFAULT_ARBITRUM_RPC_URL = 'https://arb1.arbitrum.io/rpc'; const ARBITRUM_RPC_URL = - // Allow either env var name; fall back to a public Arbitrum One RPC for local dev. - process.env['ARBITRUM_RPC_URL'] ?? - process.env['ARBITRUM_ONE_RPC_URL'] ?? - DEFAULT_ARBITRUM_RPC_URL; + // Default to a public Arbitrum One RPC for local dev; set ARBITRUM_RPC_URL to override. + process.env['ARBITRUM_RPC_URL'] ?? DEFAULT_ARBITRUM_RPC_URL; const RPC_RETRY_COUNT = 2; const RPC_TIMEOUT_MS = 8000; diff --git a/typescript/clients/web-ag-ui/apps/web/.env.example b/typescript/clients/web-ag-ui/apps/web/.env.example index 43b67825..3020e51a 100644 --- a/typescript/clients/web-ag-ui/apps/web/.env.example +++ b/typescript/clients/web-ag-ui/apps/web/.env.example @@ -1,3 +1,6 @@ +# Required for wallet connection UX (Privy). +NEXT_PUBLIC_PRIVY_APP_ID= + # Optional: bypass delegation signing and allow wallet-less onboarding in the UI DELEGATIONS_BYPASS=false NEXT_PUBLIC_DELEGATIONS_BYPASS=false @@ -19,9 +22,6 @@ NEXT_PUBLIC_WALLET_BYPASS_ADDRESS=0x0000000000000000000000000000000000000000 # This is the EIP-7702 authorization `executor` address. # NEXT_PUBLIC_EXECUTOR_ADDRESS=0x0000000000000000000000000000000000000000 -# Required for wallet connection UX (Privy). -# NEXT_PUBLIC_PRIVY_APP_ID= - # Server-side: relayer wallet that broadcasts the EIP-7702 authorization transaction. # Never expose this key publicly. # FUNDING_WALLET_PRIVATE_KEY= diff --git a/typescript/clients/web-ag-ui/apps/web/src/components/PrivyClientProvider.tsx b/typescript/clients/web-ag-ui/apps/web/src/components/PrivyClientProvider.tsx index 4b47c607..bd7ef36a 100644 --- a/typescript/clients/web-ag-ui/apps/web/src/components/PrivyClientProvider.tsx +++ b/typescript/clients/web-ag-ui/apps/web/src/components/PrivyClientProvider.tsx @@ -3,27 +3,12 @@ import { PrivyProvider } from '@privy-io/react-auth'; import type React from 'react'; -function isPlaceholderAppId(appId: string): boolean { - return appId === 'your_privy_app_id_here'; -} - export function PrivyClientProvider({ children }: { children: React.ReactNode }) { const appId = process.env.NEXT_PUBLIC_PRIVY_APP_ID; - if (!appId || isPlaceholderAppId(appId)) { - return ( -
-
-
Privy is not configured
-
- Set NEXT_PUBLIC_PRIVY_APP_ID to a valid Privy App ID - and restart the dev server. -
-
- apps/web/.env.example → apps/web/.env.local -
-
-
+ if (!appId) { + throw new Error( + 'Privy is not configured. Set NEXT_PUBLIC_PRIVY_APP_ID to a valid Privy App ID and restart the dev server.', ); } diff --git a/typescript/clients/web-ag-ui/pnpm-lock.yaml b/typescript/clients/web-ag-ui/pnpm-lock.yaml index e4fe6c39..a9a82b65 100644 --- a/typescript/clients/web-ag-ui/pnpm-lock.yaml +++ b/typescript/clients/web-ag-ui/pnpm-lock.yaml @@ -21,7 +21,7 @@ patchedDependencies: hash: g3vb6i4qg2banxpgna3ko3w63m path: patches/@ag-ui__client@0.0.42.patch '@ag-ui/langgraph@0.0.20': - hash: c2o2k2psro7eonr2y3bgst37qm + hash: lnreli7n5lf7suj3445hz6ccf4 path: patches/@ag-ui__langgraph@0.0.20.patch '@copilotkit/react-core@1.50.1': hash: 2ttosfnlnojrtz6fvhfhzzzvly @@ -49,6 +49,9 @@ importers: eslint-config-next: specifier: ^16.0.8 version: 16.0.8(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + next: + specifier: 16.0.8 + version: 16.0.8(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) turbo: specifier: ^2.3.3 version: 2.8.1 @@ -115,7 +118,7 @@ importers: version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/coverage-v8': specifier: ^4.0.8 - version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.10(@types/node@22.19.7)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2)) eslint: specifier: ^9.39.1 version: 9.39.2(jiti@2.6.1) @@ -142,7 +145,7 @@ importers: version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) vitest: specifier: ^4.0.8 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.10(@types/node@22.19.7)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) apps/agent-clmm: dependencies: @@ -209,7 +212,7 @@ importers: version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/coverage-v8': specifier: ^4.0.8 - version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.10(@types/node@22.19.7)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2)) eslint: specifier: ^9.39.1 version: 9.39.2(jiti@2.6.1) @@ -236,7 +239,7 @@ importers: version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) vitest: specifier: ^4.0.8 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.10(@types/node@22.19.7)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) apps/agent-gmx-allora: dependencies: @@ -270,6 +273,9 @@ importers: node-cron: specifier: ^4.2.1 version: 4.2.1 + p-retry: + specifier: ^7.1.1 + version: 7.1.1 permissionless: specifier: ^0.2.57 version: 0.2.57(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6)) @@ -300,7 +306,7 @@ importers: version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/coverage-v8': specifier: ^4.0.8 - version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.10(@types/node@22.19.7)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2)) eslint: specifier: ^9.39.1 version: 9.39.2(jiti@2.6.1) @@ -313,6 +319,9 @@ importers: eslint-plugin-import: specifier: 2.32.0 version: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.2(jiti@2.6.1)) + msw: + specifier: ^2.12.8 + version: 2.12.10(@types/node@22.19.7)(typescript@5.9.3) prettier: specifier: 'catalog:' version: 3.8.1 @@ -327,7 +336,7 @@ importers: version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) vitest: specifier: ^4.0.8 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.10(@types/node@22.19.7)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) apps/agent-pendle: dependencies: @@ -361,6 +370,9 @@ importers: node-cron: specifier: ^4.2.1 version: 4.2.1 + p-retry: + specifier: ^7.1.1 + version: 7.1.1 permissionless: specifier: ^0.2.57 version: 0.2.57(viem@2.45.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6)) @@ -391,7 +403,7 @@ importers: version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/coverage-v8': specifier: ^4.0.8 - version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.10(@types/node@22.19.7)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2)) eslint: specifier: ^9.39.1 version: 9.39.2(jiti@2.6.1) @@ -404,6 +416,9 @@ importers: eslint-plugin-import: specifier: 2.32.0 version: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.2(jiti@2.6.1)) + msw: + specifier: ^2.12.8 + version: 2.12.10(@types/node@22.19.7)(typescript@5.9.3) prettier: specifier: 'catalog:' version: 3.8.1 @@ -418,7 +433,7 @@ importers: version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) vitest: specifier: ^4.0.8 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.10(@types/node@22.19.7)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) apps/web: dependencies: @@ -468,6 +483,9 @@ importers: specifier: ^3.24.4 version: 3.25.76 devDependencies: + '@ag-ui/client': + specifier: 0.0.42 + version: 0.0.42(patch_hash=g3vb6i4qg2banxpgna3ko3w63m) '@eslint/eslintrc': specifier: ^3 version: 3.3.3 @@ -483,18 +501,30 @@ importers: '@types/react-dom': specifier: ^19 version: 19.2.3(@types/react@19.2.10) + '@vitest/coverage-v8': + specifier: ^4.0.18 + version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@20.19.30)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.10(@types/node@20.19.30)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2)) eslint: specifier: ^9 version: 9.39.2(jiti@2.6.1) eslint-config-next: specifier: 16.0.8 version: 16.0.8(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + rxjs: + specifier: 7.8.1 + version: 7.8.1 tailwindcss: specifier: ^4 version: 4.1.18 typescript: specifier: ^5 version: 5.9.3 + vite-tsconfig-paths: + specifier: ^6.0.5 + version: 6.1.1(typescript@5.9.3)(vite@7.3.1(@types/node@20.19.30)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + vitest: + specifier: ^4.0.18 + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@20.19.30)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.10(@types/node@20.19.30)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) packages: @@ -1549,6 +1579,41 @@ packages: cpu: [x64] os: [win32] + '@inquirer/ansi@1.0.2': + resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} + engines: {node: '>=18'} + + '@inquirer/confirm@5.1.21': + resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.3.2': + resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.15': + resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} + engines: {node: '>=18'} + + '@inquirer/type@3.0.10': + resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@isaacs/fs-minipass@4.0.1': resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} @@ -2105,6 +2170,10 @@ packages: resolution: {integrity: sha512-JEW4DEtBzfe8HvUYecLU9e6+XJnKDlUAIve8FvPzF3Kzs6Xo/KuZkZJsDH0wJXl/qEZbeeE7edxDNY3kMs39hQ==} engines: {node: '>= 18'} + '@mswjs/interceptors@0.41.2': + resolution: {integrity: sha512-7G0Uf0yK3f2bjElBLGHIQzgRgMESczOMyYVasq1XK8P5HaXtlW4eQhz9MBL+TQILZLaruq+ClGId+hH0w4jvWw==} + engines: {node: '>=18'} + '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} @@ -2225,6 +2294,15 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} + '@open-draft/deferred-promise@2.2.0': + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + + '@open-draft/logger@0.3.0': + resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} + + '@open-draft/until@2.1.0': + resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + '@openrouter/ai-sdk-provider@1.5.4': resolution: {integrity: sha512-xrSQPUIH8n9zuyYZR0XK7Ba0h2KsjJcMkxnwaYfmv13pKs3sDkjPzVPPhlhzqBGddHb5cFEwJ9VFuFeDcxCDSw==} engines: {node: '>=18'} @@ -3881,6 +3959,9 @@ packages: '@types/semver@7.7.1': resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + '@types/statuses@2.0.6': + resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} + '@types/stylis@4.2.7': resolution: {integrity: sha512-VgDNokpBoKF+wrdvhAAfS55OMQpL6QRglwTwNC3kIgBrzZxA4WsFj+2eLfEA/uMUDzBcEhYmjSbwQakn/i3ajA==} @@ -4720,12 +4801,20 @@ packages: resolution: {integrity: sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==} engines: {node: '>=18.20'} + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + clsx@1.2.1: resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} engines: {node: '>=6'} @@ -4842,6 +4931,10 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} + copy-anything@4.0.5: resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} engines: {node: '>=18'} @@ -5846,6 +5939,9 @@ packages: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -5966,6 +6062,9 @@ packages: hastscript@9.0.1: resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + headers-polyfill@4.0.3: + resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + help-me@5.0.0: resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} @@ -6198,6 +6297,9 @@ packages: resolution: {integrity: sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==} engines: {node: '>=16'} + is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -7119,6 +7221,16 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + msw@2.12.10: + resolution: {integrity: sha512-G3VUymSE0/iegFnuipujpwyTM2GuZAKXNeerUSrG2+Eg391wW63xFs5ixWsK9MWzr1AGoSkYGmyAzNgbR3+urw==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + typescript: '>= 4.8.x' + peerDependenciesMeta: + typescript: + optional: true + multiformats@9.9.0: resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} @@ -7126,6 +7238,10 @@ packages: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -7339,6 +7455,9 @@ packages: resolution: {integrity: sha512-53uuLsXHOAJl5zLrUrzY9/kE+uIFEx7iaH4g2BIJQK4LZjY4LpCCYZVKDWIkL+F01wAaCg93duQ1whnK/AmY1A==} engines: {node: '>=20'} + outvariant@1.4.3: + resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} + own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} @@ -7479,6 +7598,9 @@ packages: path-to-regexp@0.1.12: resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + path-to-regexp@8.3.0: resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} @@ -7992,6 +8114,9 @@ packages: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} + rettime@0.10.1: + resolution: {integrity: sha512-uyDrIlUEH37cinabq0AX4QbgV4HbFZ/gqoiunWQ1UqBtRvTTytwhNYjE++pO/MjPTZL5KQCf2bEoJ/BJNVQ5Kw==} + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -8259,6 +8384,9 @@ packages: peerDependencies: react: ^18.0.0 || ^19.0.0 + strict-event-emitter@0.5.1: + resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} + strict-uri-encode@2.0.0: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} @@ -8393,6 +8521,10 @@ packages: tabbable@6.4.0: resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + tailwind-merge@3.4.0: resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} @@ -8441,6 +8573,13 @@ packages: resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} engines: {node: '>=14.0.0'} + tldts-core@7.0.23: + resolution: {integrity: sha512-0g9vrtDQLrNIiCj22HSe9d4mLVG3g5ph5DZ8zCKBr4OtrspmNB6ss7hVyzArAeE88ceZocIEGkyW1Ime7fxPtQ==} + + tldts@7.0.23: + resolution: {integrity: sha512-ASdhgQIBSay0R/eXggAkQ53G4nTJqTXqC2kbaBbdDwM7SkjyZyO0OaaN1/FH7U/yCeqOHDwFO5j8+Os/IS1dXw==} + hasBin: true + to-buffer@1.2.2: resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} engines: {node: '>= 0.4'} @@ -8453,6 +8592,10 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + tough-cookie@6.0.0: + resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} + engines: {node: '>=16'} + tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -8480,6 +8623,16 @@ packages: resolution: {integrity: sha512-Du/ZW2RfwV/D4cmA5rXafYjBQVuvu4qGiEEla4EmEHVHgRdx68Gftx7i66jn2bzHPwSVZY36Ae6OuDn9el4ZKA==} engines: {node: '>=14.13.1'} + tsconfck@3.1.6: + resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} @@ -8539,6 +8692,10 @@ packages: resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} engines: {node: '>=8'} + type-fest@5.4.4: + resolution: {integrity: sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw==} + engines: {node: '>=20'} + type-graphql@2.0.0-rc.1: resolution: {integrity: sha512-HCu4j3jR0tZvAAoO7DMBT3MRmah0DFRe5APymm9lXUghXA0sbhiMf6SLRafRYfk0R0KiUQYRduuGP3ap1RnF1Q==} engines: {node: '>= 18.12.0'} @@ -8733,6 +8890,9 @@ packages: uploadthing: optional: true + until-async@3.0.2: + resolution: {integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==} + untruncate-json@0.0.1: resolution: {integrity: sha512-4W9enDK4X1y1s2S/Rz7ysw6kDuMS3VmRjMFg7GZrNO+98OSe+x5Lh7PKYoVjy3lW/1wmhs6HW0lusnQRHgMarA==} @@ -8904,6 +9064,11 @@ packages: typescript: optional: true + vite-tsconfig-paths@6.1.1: + resolution: {integrity: sha512-2cihq7zliibCCZ8P9cKJrQBkfgdvcFkOOc3Y02o3GWUDLgqjWsZudaoiuOwO/gzTzy17cS5F7ZPo4bsnS4DGkg==} + peerDependencies: + vite: '*' + vite@7.3.1: resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -9079,6 +9244,10 @@ packages: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -9151,6 +9320,10 @@ packages: y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -9167,10 +9340,18 @@ packages: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} @@ -9178,6 +9359,10 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} + engines: {node: '>=18'} + yoctocolors@2.1.2: resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} engines: {node: '>=18'} @@ -9297,7 +9482,7 @@ snapshots: '@ag-ui/core': 0.0.42 '@ag-ui/proto': 0.0.42 - '@ag-ui/langgraph@0.0.20(patch_hash=c2o2k2psro7eonr2y3bgst37qm)(@ag-ui/client@0.0.42(patch_hash=g3vb6i4qg2banxpgna3ko3w63m))(@ag-ui/core@0.0.42)(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@ag-ui/langgraph@0.0.20(patch_hash=lnreli7n5lf7suj3445hz6ccf4)(@ag-ui/client@0.0.42(patch_hash=g3vb6i4qg2banxpgna3ko3w63m))(@ag-ui/core@0.0.42)(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@ag-ui/client': 0.0.42(patch_hash=g3vb6i4qg2banxpgna3ko3w63m) '@ag-ui/core': 0.0.42 @@ -9754,7 +9939,7 @@ snapshots: dependencies: '@ag-ui/client': 0.0.42(patch_hash=g3vb6i4qg2banxpgna3ko3w63m) '@ag-ui/core': 0.0.42 - '@ag-ui/langgraph': 0.0.20(patch_hash=c2o2k2psro7eonr2y3bgst37qm)(@ag-ui/client@0.0.42(patch_hash=g3vb6i4qg2banxpgna3ko3w63m))(@ag-ui/core@0.0.42)(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@ag-ui/langgraph': 0.0.20(patch_hash=lnreli7n5lf7suj3445hz6ccf4)(@ag-ui/client@0.0.42(patch_hash=g3vb6i4qg2banxpgna3ko3w63m))(@ag-ui/core@0.0.42)(@opentelemetry/api@1.9.0)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@copilotkit/shared': 1.50.1 '@copilotkitnext/agent': 0.0.33(@cfworker/json-schema@4.1.1)(hono@4.11.7) '@copilotkitnext/runtime': 0.0.33(patch_hash=dakc4qoohdmctvusr4pufvrn3e)(openai@6.17.0(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) @@ -10518,6 +10703,61 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true + '@inquirer/ansi@1.0.2': {} + + '@inquirer/confirm@5.1.21(@types/node@20.19.30)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@20.19.30) + '@inquirer/type': 3.0.10(@types/node@20.19.30) + optionalDependencies: + '@types/node': 20.19.30 + optional: true + + '@inquirer/confirm@5.1.21(@types/node@22.19.7)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.7) + '@inquirer/type': 3.0.10(@types/node@22.19.7) + optionalDependencies: + '@types/node': 22.19.7 + + '@inquirer/core@10.3.2(@types/node@20.19.30)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@20.19.30) + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 20.19.30 + optional: true + + '@inquirer/core@10.3.2(@types/node@22.19.7)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.19.7) + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.7 + + '@inquirer/figures@1.0.15': {} + + '@inquirer/type@3.0.10(@types/node@20.19.30)': + optionalDependencies: + '@types/node': 20.19.30 + optional: true + + '@inquirer/type@3.0.10(@types/node@22.19.7)': + optionalDependencies: + '@types/node': 22.19.7 + '@isaacs/fs-minipass@4.0.1': dependencies: minipass: 7.1.2 @@ -11226,7 +11466,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 '@types/debug': 4.1.12 - debug: 4.3.4 + debug: 4.4.3 pony-cause: 2.1.11 semver: 7.7.3 uuid: 9.0.1 @@ -11240,7 +11480,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 '@types/debug': 4.1.12 - debug: 4.3.4 + debug: 4.4.3 pony-cause: 2.1.11 semver: 7.7.3 uuid: 9.0.1 @@ -11297,6 +11537,15 @@ snapshots: '@msgpack/msgpack@3.1.2': {} + '@mswjs/interceptors@0.41.2': + dependencies: + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 + is-node-process: 1.2.0 + outvariant: 1.4.3 + strict-event-emitter: 0.5.1 + '@napi-rs/wasm-runtime@0.2.12': dependencies: '@emnapi/core': 1.8.1 @@ -11384,6 +11633,15 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} + '@open-draft/deferred-promise@2.2.0': {} + + '@open-draft/logger@0.3.0': + dependencies: + is-node-process: 1.2.0 + outvariant: 1.4.3 + + '@open-draft/until@2.1.0': {} + '@openrouter/ai-sdk-provider@1.5.4(ai@5.0.124(zod@4.3.6))(zod@4.3.6)': dependencies: '@openrouter/sdk': 0.1.27 @@ -13760,6 +14018,8 @@ snapshots: '@types/semver@7.7.1': {} + '@types/statuses@2.0.6': {} + '@types/stylis@4.2.7': {} '@types/triple-beam@1.3.5': {} @@ -13957,7 +14217,7 @@ snapshots: '@vercel/oidc@3.1.0': {} - '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@20.19.30)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.10(@types/node@20.19.30)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.18 @@ -13969,7 +14229,21 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@20.19.30)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.10(@types/node@20.19.30)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) + + '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.10(@types/node@22.19.7)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2))': + dependencies: + '@bcoe/v8-coverage': 1.0.2 + '@vitest/utils': 4.0.18 + ast-v8-to-istanbul: 0.3.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.2.0 + magicast: 0.5.1 + obug: 2.1.1 + std-env: 3.10.0 + tinyrainbow: 3.0.3 + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.10(@types/node@22.19.7)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) '@vitest/expect@4.0.18': dependencies: @@ -13980,12 +14254,22 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@4.0.18(msw@2.12.10(@types/node@20.19.30)(typescript@5.9.3))(vite@7.3.1(@types/node@20.19.30)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': + dependencies: + '@vitest/spy': 4.0.18 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + msw: 2.12.10(@types/node@20.19.30)(typescript@5.9.3) + vite: 7.3.1(@types/node@20.19.30)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + + '@vitest/mocker@4.0.18(msw@2.12.10(@types/node@22.19.7)(typescript@5.9.3))(vite@7.3.1(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: + msw: 2.12.10(@types/node@22.19.7)(typescript@5.9.3) vite: 7.3.1(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) '@vitest/pretty-format@4.0.18': @@ -15614,6 +15898,8 @@ snapshots: cli-spinners@3.4.0: {} + cli-width@4.1.0: {} + client-only@0.0.1: {} cliui@6.0.0: @@ -15622,6 +15908,12 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 6.2.0 + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + clsx@1.2.1: {} clsx@2.1.1: {} @@ -15701,6 +15993,8 @@ snapshots: cookie@0.7.2: {} + cookie@1.1.1: {} + copy-anything@4.0.5: dependencies: is-what: 5.5.0 @@ -17000,6 +17294,8 @@ snapshots: define-properties: 1.2.1 gopd: 1.2.0 + globrex@0.1.2: {} + gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -17215,6 +17511,8 @@ snapshots: property-information: 7.1.0 space-separated-tokens: 2.0.2 + headers-polyfill@4.0.3: {} + help-me@5.0.0: {} hermes-estree@0.25.1: {} @@ -17415,6 +17713,8 @@ snapshots: is-network-error@1.3.0: {} + is-node-process@1.2.0: {} + is-number-object@1.1.1: dependencies: call-bound: 1.0.4 @@ -18692,10 +18992,63 @@ snapshots: ms@2.1.3: {} + msw@2.12.10(@types/node@20.19.30)(typescript@5.9.3): + dependencies: + '@inquirer/confirm': 5.1.21(@types/node@20.19.30) + '@mswjs/interceptors': 0.41.2 + '@open-draft/deferred-promise': 2.2.0 + '@types/statuses': 2.0.6 + cookie: 1.1.1 + graphql: 16.12.0 + headers-polyfill: 4.0.3 + is-node-process: 1.2.0 + outvariant: 1.4.3 + path-to-regexp: 6.3.0 + picocolors: 1.1.1 + rettime: 0.10.1 + statuses: 2.0.2 + strict-event-emitter: 0.5.1 + tough-cookie: 6.0.0 + type-fest: 5.4.4 + until-async: 3.0.2 + yargs: 17.7.2 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@types/node' + optional: true + + msw@2.12.10(@types/node@22.19.7)(typescript@5.9.3): + dependencies: + '@inquirer/confirm': 5.1.21(@types/node@22.19.7) + '@mswjs/interceptors': 0.41.2 + '@open-draft/deferred-promise': 2.2.0 + '@types/statuses': 2.0.6 + cookie: 1.1.1 + graphql: 16.12.0 + headers-polyfill: 4.0.3 + is-node-process: 1.2.0 + outvariant: 1.4.3 + path-to-regexp: 6.3.0 + picocolors: 1.1.1 + rettime: 0.10.1 + statuses: 2.0.2 + strict-event-emitter: 0.5.1 + tough-cookie: 6.0.0 + type-fest: 5.4.4 + until-async: 3.0.2 + yargs: 17.7.2 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@types/node' + multiformats@9.9.0: {} mustache@4.2.0: {} + mute-stream@2.0.0: {} + nanoid@3.3.11: {} napi-postinstall@0.3.4: {} @@ -18931,6 +19284,8 @@ snapshots: stdin-discarder: 0.2.2 string-width: 8.1.1 + outvariant@1.4.3: {} + own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 @@ -19140,6 +19495,8 @@ snapshots: path-to-regexp@0.1.12: {} + path-to-regexp@6.3.0: {} + path-to-regexp@8.3.0: {} pathe@2.0.3: {} @@ -19788,6 +20145,8 @@ snapshots: retry@0.13.1: {} + rettime@0.10.1: {} + reusify@1.1.0: {} robust-predicates@3.0.2: {} @@ -19846,7 +20205,7 @@ snapshots: '@types/uuid': 8.3.4 '@types/ws': 8.18.1 buffer: 6.0.3 - eventemitter3: 5.0.1 + eventemitter3: 5.0.4 uuid: 8.3.2 ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) optionalDependencies: @@ -20193,6 +20552,8 @@ snapshots: - micromark-util-types - supports-color + strict-event-emitter@0.5.1: {} + strict-uri-encode@2.0.0: {} string-hash@1.1.3: {} @@ -20345,6 +20706,8 @@ snapshots: tabbable@6.4.0: {} + tagged-tag@1.0.0: {} + tailwind-merge@3.4.0: {} tailwindcss@4.1.18: {} @@ -20386,6 +20749,12 @@ snapshots: tinyrainbow@3.0.3: {} + tldts-core@7.0.23: {} + + tldts@7.0.23: + dependencies: + tldts-core: 7.0.23 + to-buffer@1.2.2: dependencies: isarray: 2.0.5 @@ -20398,6 +20767,10 @@ snapshots: toidentifier@1.0.1: {} + tough-cookie@6.0.0: + dependencies: + tldts: 7.0.23 + tr46@0.0.3: {} trim-lines@3.0.1: {} @@ -20414,6 +20787,10 @@ snapshots: ts-deepmerge@7.0.3: {} + tsconfck@3.1.6(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -20467,6 +20844,10 @@ snapshots: type-fest@0.7.1: {} + type-fest@5.4.4: + dependencies: + tagged-tag: 1.0.0 + type-graphql@2.0.0-rc.1(class-validator@0.14.3)(graphql-scalars@1.25.0(graphql@16.12.0))(graphql@16.12.0): dependencies: '@graphql-yoga/subscription': 5.0.5 @@ -20683,6 +21064,8 @@ snapshots: optionalDependencies: idb-keyval: 6.2.2 + until-async@3.0.2: {} + untruncate-json@0.0.1: {} update-browserslist-db@1.2.3(browserslist@4.28.1): @@ -20899,6 +21282,32 @@ snapshots: - utf-8-validate - zod + vite-tsconfig-paths@6.1.1(typescript@5.9.3)(vite@7.3.1(@types/node@20.19.30)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)): + dependencies: + debug: 4.4.3 + globrex: 0.1.2 + tsconfck: 3.1.6(typescript@5.9.3) + vite: 7.3.1(@types/node@20.19.30)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + transitivePeerDependencies: + - supports-color + - typescript + + vite@7.3.1(@types/node@20.19.30)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): + dependencies: + esbuild: 0.27.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.57.1 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 20.19.30 + fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.30.2 + tsx: 4.21.0 + yaml: 2.8.2 + vite@7.3.1(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.27.2 @@ -20915,10 +21324,48 @@ snapshots: tsx: 4.21.0 yaml: 2.8.2 - vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): + vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@20.19.30)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.10(@types/node@20.19.30)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 4.0.18(msw@2.12.10(@types/node@20.19.30)(typescript@5.9.3))(vite@7.3.1(@types/node@20.19.30)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/pretty-format': 4.0.18 + '@vitest/runner': 4.0.18 + '@vitest/snapshot': 4.0.18 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 + es-module-lexer: 1.7.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 7.3.1(@types/node@20.19.30)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + why-is-node-running: 2.3.0 + optionalDependencies: + '@opentelemetry/api': 1.9.0 + '@types/node': 20.19.30 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + + vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.10(@types/node@22.19.7)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2): + dependencies: + '@vitest/expect': 4.0.18 + '@vitest/mocker': 4.0.18(msw@2.12.10(@types/node@22.19.7)(typescript@5.9.3))(vite@7.3.1(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -21166,6 +21613,12 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrappy@1.0.2: {} ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10): @@ -21301,6 +21754,8 @@ snapshots: y18n@4.0.3: {} + y18n@5.0.8: {} + yallist@3.1.1: {} yallist@5.0.0: {} @@ -21312,6 +21767,8 @@ snapshots: camelcase: 5.3.1 decamelize: 1.2.0 + yargs-parser@21.1.1: {} + yargs@15.4.1: dependencies: cliui: 6.0.0 @@ -21326,6 +21783,16 @@ snapshots: y18n: 4.0.3 yargs-parser: 18.1.3 + 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 + yauzl@2.10.0: dependencies: buffer-crc32: 0.2.13 @@ -21333,6 +21800,8 @@ snapshots: yocto-queue@0.1.0: {} + yoctocolors-cjs@2.1.3: {} + yoctocolors@2.1.2: {} zod-to-json-schema@3.25.1(zod@3.25.76): diff --git a/typescript/community/agents/swapping-agent-no-wallet/src/agentToolHandlers.ts b/typescript/community/agents/swapping-agent-no-wallet/src/agentToolHandlers.ts index 5f5814d1..370d85ab 100644 --- a/typescript/community/agents/swapping-agent-no-wallet/src/agentToolHandlers.ts +++ b/typescript/community/agents/swapping-agent-no-wallet/src/agentToolHandlers.ts @@ -74,7 +74,7 @@ const RPC_ENV_VAR_BY_CHAIN_ID: Record = { '1': 'ETHEREUM_RPC_URL', '10': 'OPTIMISM_RPC_URL', '137': 'POLYGON_RPC_URL', - '42161': 'ARBITRUM_ONE_RPC_URL', + '42161': 'ARBITRUM_RPC_URL', '421614': 'ARBITRUM_SEPOLIA_RPC_URL', '8453': 'BASE_CHAIN_RPC_URL', '33139': 'APECHAIN_RPC_URL', diff --git a/typescript/lib/test-utils/src/chains.ts b/typescript/lib/test-utils/src/chains.ts index fc13080b..848cf80e 100644 --- a/typescript/lib/test-utils/src/chains.ts +++ b/typescript/lib/test-utils/src/chains.ts @@ -16,7 +16,7 @@ export type ChainConfig = { export const CHAIN_CONFIGS: Record = { 42161: { name: 'Arbitrum One', - rpcUrl: process.env.ARBITRUM_ONE_RPC_URL || 'https://arbitrum.gateway.tenderly.co', + rpcUrl: process.env.ARBITRUM_RPC_URL || 'https://arb1.arbitrum.io/rpc', varName: 'ARBITRUM_ONE', wrappedNativeToken: { name: 'WETH', diff --git a/typescript/test/chains.ts b/typescript/test/chains.ts index c6424a46..2393fbd8 100644 --- a/typescript/test/chains.ts +++ b/typescript/test/chains.ts @@ -17,8 +17,7 @@ export const CHAIN_CONFIGS: Record = { 42161: { name: "Arbitrum One", rpcUrl: - process.env.ARBITRUM_ONE_RPC_URL || - "https://arbitrum.gateway.tenderly.co", + process.env.ARBITRUM_RPC_URL || "https://arb1.arbitrum.io/rpc", varName: "ARBITRUM_ONE", wrappedNativeToken: { name: "WETH",