diff --git a/.env.example b/.env.example index 8a93fd4..3e33ff6 100644 --- a/.env.example +++ b/.env.example @@ -26,6 +26,7 @@ VOYAGE_EMBEDDING_MODEL=voyage-4-lite # --- Backend server --- PORT=8787 POD_ROOM=demo-pod +CLERK_SECRET_KEY= # --- Nudge cooldown (ms) — set to 0 during demo if needed --- NUDGE_COOLDOWN_MS=180000 @@ -34,6 +35,7 @@ RESEARCH_OVERLAP_THRESHOLD=0.6 # --- Frontend (Vite — must be VITE_ prefixed to reach the client) --- VITE_LIVEKIT_URL=wss://your-project.livekit.cloud VITE_BACKEND_URL=http://localhost:8787 +VITE_CLERK_PUBLISHABLE_KEY= # Keep off by default so users hear Gemini audio delivered through LiveKit. VITE_ENABLE_BROWSER_TTS_FALLBACK=false diff --git a/README.md b/README.md index 4c71d82..bc247c2 100644 --- a/README.md +++ b/README.md @@ -1,195 +1,263 @@ -# PodMan — A Pair Programmer for Engineering Teams +# PodMan -[LiveKit](https://livekit.io/) -[MongoDB](https://www.mongodb.com/) -[Gemini](https://ai.google.dev/) -[DigitalOcean](https://www.digitalocean.com/) +**An ambient pair programmer for engineering teams.** -## The bottleneck moved +PodMan watches the work happening inside a shared LiveKit room, understands what +each engineer is doing, remembers which interventions helped, and nudges the +team before duplicated work, merge collisions, or missed handoffs slow everyone +down. -Models keep getting better, and more people can build software than ever before. -Writing the code is no longer the hard part — engineering ability is not the -ceiling anymore. +[LiveKit](https://livekit.io/) · [MongoDB](https://www.mongodb.com/) · +[Gemini](https://ai.google.dev/) · [Hermes](https://hermes-agent.nousresearch.com/) · +[vLLM](https://vllm.ai/) · [DigitalOcean](https://www.digitalocean.com/) -What slows teams down now is everything *around* the code: manually checking each -other's work, re-planning when two people drift into the same change, and -constantly asking "what are you working on?" just to stay in sync. People -naturally want to build together — so as more people start coding, there will be -thousands of teams bottlenecked not by skill, but by the **speed of human -coordination.** +## Read This First -**PodMan is a pair programmer for the whole team.** It watches what every member -is doing in real time, learns your team's decisions and working dynamics, and -gives everyone a live picture of where the others are — without anyone having to -stop and ask. - -### The five-minute meeting that isn't - -image - - -> **What people assume:** "Quick question, five minutes." -> **What actually happens:** the interrupted developer loses their place and needs -> 15–25 minutes to climb back into deep focus. That five-minute ask quietly costs -> half an hour — for *two* people. - -Multiply that by every teammate, every day, and coordination overhead — not -engineering skill — becomes the real ceiling on how fast a team ships. - -PodMan removes the reason to interrupt. Because it already knows who is touching -which file, what's still unpushed, and what each person is in the middle of, any -teammate can see another's status instantly — no tap on the shoulder, no standup, -no recovery tax. And it gets better as it goes: every accept or dismiss teaches -it what your team actually cares about, so it nudges less and helps more over -time. - -> GitHub sees pushed work. PodMan sees work while it is still happening — and -> remembers what helped. +| Need | Use this | +| ----------------------- | --------------------------------------------------------------------------------------------- | +| Open the product | `https://podman.live` | +| Check the app | `curl https://podman.live/health` | +| Check pods and memory | `curl https://podman.live/api/pods && curl https://podman.live/api/memory/stats` | +| Use the LLM externally | Base URL `https://llm.alhinai.dev/v1`, model `gemma-4-31B-it` | +| Test Hermes | `hermes -z 'Reply with exactly: working' --provider gemma4-31b-vllm --model gemma-4-31B-it` | +| Start local development | API, vision agent, and frontend commands are in [Local Development](#local-development) | +| Debug production | Public checks first, then systemd services in [Production Operations](#production-operations) | --- +## Current Live System +| Surface | Running now | Purpose | +| ------------- | ---------------------------- | -------------------------------------- | +| Product | `https://podman.live` | Team room, screen context, cards | +| API | `https://podman.live/api/*` | Pods, tokens, outcomes, memory | +| Health | `https://podman.live/health` | Backend readiness | +| Local API | `127.0.0.1:8787` | Express service behind Caddy | +| Reasoning LLM | `https://llm.alhinai.dev/v1` | OpenAI-compatible Gemma/vLLM endpoint | +| API key | `not-needed` | Placeholder key for OpenAI clients | +| Hermes model | `gemma-4-31B-it` | 262K-context tool-using agent | +| Hermes config | `gemma4-31b-vllm` | Custom provider used by Hermes locally | -## How it learns +```mermaid +flowchart TB + Browser["Engineer Browser
React + Vite PWA"] + Room["LiveKit Room
screen share + audio + data messages"] -The learning loop is the product, not a side feature. It runs with almost no -extra work from anyone — the only human signal is a single accept/dismiss tap on -a card. + subgraph Droplet["DigitalOcean PodMan Droplet"] + Caddy["Caddy
static app + /api proxy"] + API["Express API
127.0.0.1:8787"] + Vision["Vision Agent
screen frame observer"] + Voice["Live Conversation Agent
Python + Gemini Live"] + Ops["Hermes Ops Timers
watchdog + sync deploy"] + end -``` -observe → detect → RECALL prior outcomes → policy gate → act → record outcome - └──────────────────────────── feeds next recall ───────────────────────────┘ + subgraph Memory["MongoDB Atlas"] + Observations["observations"] + State["engineer_states"] + Outcomes["interventions + outcomes"] + end + + subgraph Google["Google Gemini APIs"] + GeminiVision["Vision"] + GeminiVoice["Live voice + TTS"] + GeminiEmbed["Embeddings fallback"] + Lyria["Music"] + end + + subgraph Reasoning["External Reasoning Endpoint"] + Tunnel["Cloudflare Tunnel
llm.alhinai.dev"] + VLLM["vLLM OpenAI Server
gemma-4-31B-it
262144 context"] + Hermes["Hermes Agent
provider: gemma4-31b-vllm"] + end + + Browser --> Caddy --> API + Browser <-->|screen, audio, cards| Room + API --> Room + API --> Observations + API --> State + API --> Outcomes + Vision <-->|screen tracks| Room + Vision --> GeminiVision + Vision --> Observations + Vision --> Outcomes + Voice <-->|conversation| Room + Voice --> GeminiVoice + Vision --> GeminiEmbed + Voice --> GeminiEmbed + Ops --> Hermes --> Tunnel --> VLLM + API --> Hermes + Lyria --> Voice + + classDef user fill:#e8f1ff,stroke:#3366cc,color:#0b1f44; + classDef app fill:#eef8ee,stroke:#2f8a3a,color:#123915; + classDef data fill:#fff6df,stroke:#c47f00,color:#3d2b00; + classDef ai fill:#f4edff,stroke:#805ad5,color:#2d1857; + class Browser,Room user; + class Caddy,API,Vision,Voice,Ops app; + class Observations,State,Outcomes data; + class GeminiVision,GeminiVoice,GeminiEmbed,Lyria,Tunnel,VLLM,Hermes ai; ``` +## What It Does -| Stage | What happens | Code | -| ------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ----------------------------------- | -| **Observe** | Gemini Vision turns each screen frame into structured work context (file, symbol, activity, unpushed hints) | `backend/src/vision/gemini.ts` | -| **Detect** | Same file touched by 2+ engineers with unpushed work → a coordination event | `backend/src/collision/detector.ts` | -| **Recall (memory)** | Embed the event, query MongoDB Atlas `$vectorSearch` for similar past events, attach their prior intervention + outcome | `backend/src/memory/vectors.ts` | -| **Policy gate (adapt)** | A dismissed false alarm stays silent; a confirmed real catch escalates to critical; a per-pod cooldown prevents nagging | `backend/src/memory/policy.ts` | -| **Act (least intrusive)** | Reuse the action kind that was accepted before; default to a card, escalate to a Hermes message, voice only when urgent | `backend/src/action/hermes.ts` | -| **Record (feedback)** | Accept/dismiss + "was it real?" is written back to memory, closing the loop for next time | `backend/src/memory/store.ts` | +```mermaid +flowchart LR + A["Engineer shares screen"] --> B["Gemini extracts work context"] + B --> C["PodMan detects overlap
files, symbols, research, unpushed work"] + C --> D["MongoDB recalls
similar prior events"] + D --> E{"Policy gate"} + E -->|"seen false alarm"| F["stay quiet"] + E -->|"seen real collision"| G["raise urgency"] + E -->|"new useful signal"| H["show card or message"] + G --> I["Hermes / voice escalation"] + H --> J["teammate accepts or dismisses"] + I --> J + J --> K["outcome becomes future memory"] + K --> D +``` +PodMan removes the reason to interrupt. It gives the team a live picture of work +in progress, then improves from every accepted or dismissed intervention. -A few things make this real learning rather than a static prompt: - -- It adapts from real teammate behavior during a real session, not an offline -dataset. -- It gets more useful as the `outcomes` collection grows — better recall, fewer -false alarms. -- It needs one tap. No labeling, no config, no retraining. -- The mechanism is memory: Atlas vector recall plus an outcome-conditioned -policy, with an exact-signature fallback when vector search isn't available. - -In practice: a false alarm gets dismissed once, and the same pattern stays quiet -next time. A real conflict gets accepted once, and when it recurs PodMan recalls -it and escalates straight to a spoken "seen before" cue. +> GitHub sees pushed work. PodMan sees work while it is still happening. --- +## The Model Stack - -## Architecture - -A browser PWA, an HTTP API service, LiveKit agent workers, and a -memory/action layer. The screen signal flows through LiveKit, never a manual -screenshot upload. - -### Infrastructure: LiveKit · Hermes · MongoDB · DigitalOcean - -How the real-time, action, memory, and hosting layers wire together. Everything -under the droplet boundary is one systemd-supervised DigitalOcean box; LiveKit -and Mongo Atlas are managed clouds it talks to. +PodMan uses multiple AI surfaces. They are intentionally split by job. ```mermaid flowchart LR - Dev["Engineer browser
React PWA + screen share"] + Work["Screen + room activity"] --> VisionRoute["Perception route"] + VoiceInput["Engineer speech"] --> ConversationRoute["Conversation route"] + OpsNeed["Ops / autonomous task"] --> HermesRoute["Reasoning route"] + MemoryNeed["Similarity search"] --> EmbedRoute["Memory route"] + Ambient["Session atmosphere"] --> MusicRoute["Audio route"] - subgraph DO["DigitalOcean droplet — systemd-supervised"] - WebApi["Caddy + API service
static app · /api · LiveKit tokens"] - Agent["Vision agent worker
Gemini reads each screen frame"] - Coord["Hermes coordinator
detects clashes · intervenes"] - PyAgent["Live conversation agent
(Python)"] - end + VisionRoute --> Gemini20["gemini-2.0-flash
screen understanding"] + ConversationRoute --> GeminiLive["gemini-3.1-flash-live-preview
live Q&A"] + ConversationRoute --> GeminiTTS["gemini-3.1-flash-tts-preview
urgent speech"] + HermesRoute --> Gemma["gemma-4-31B-it
Hermes + vLLM + tools"] + EmbedRoute --> Voyage["voyage-4-lite
primary embeddings"] + EmbedRoute --> GeminiEmbed["gemini-embedding-001
fallback embeddings"] + MusicRoute --> Lyria["lyria-3-clip-preview
background music"] - LK["LiveKit room
managed cloud"] - Mongo[("MongoDB Atlas
team memory")] - - Dev -->|"open app · get token"| WebApi - Dev <-->|"screens & voice out · cards & alerts in"| LK - LK -->|"pre-commit work signal"| Agent --> Coord - Coord -->|"nudge before duplicate work / clash"| LK - PyAgent <-->|"answer questions by voice"| LK - Coord -->|"learn from every outcome"| Mongo - PyAgent -->|"recall team context"| Mongo - WebApi <-->|"pods + outcomes"| Mongo + classDef signal fill:#e8f1ff,stroke:#3366cc,color:#0b1f44; + classDef route fill:#eef8ee,stroke:#2f8a3a,color:#123915; + classDef model fill:#f4edff,stroke:#805ad5,color:#2d1857; + class Work,VoiceInput,OpsNeed,MemoryNeed,Ambient signal; + class VisionRoute,ConversationRoute,HermesRoute,EmbedRoute,MusicRoute route; + class Gemini20,GeminiLive,GeminiTTS,Gemma,Voyage,GeminiEmbed,Lyria model; ``` -> Mongo connectivity is **required at boot** — the API and both agents ping Atlas -> on startup and exit loudly rather than degrade silently. +### Gemma 4 31B via vLLM -### Gemini: roles, models, and triggers +Hermes uses the external OpenAI-compatible endpoint: -Five distinct Gemini surfaces, each fired by a specific event in the pod and -mapped to the file that calls it. - -```mermaid -flowchart LR - subgraph Triggers["Trigger (event in the pod)"] - Frame["Sampled IDE frame
from LiveKit screen track"] - NewEvent["New observation
or collision"] - Talk["Engineer speaks
in the room"] - Urgent["Hermes raises an
urgent intervention"] - Session["Pod session
active"] - end - - subgraph G["Gemini surface · model · code"] - Vision["Vision
gemini-2.0-flash
backend/src/vision/gemini.ts"] - Embed["Embeddings
gemini-embedding-001
backend/src/memory/vectors.ts"] - Live["Live voice agent
gemini-3.1-flash-live-preview
agents/podman-live-conversation/agent.py"] - TTS["Urgent TTS
gemini-3.1-flash-tts-preview
backend/src/voice/live.ts"] - Lyria["Background music
lyria-3-clip-preview
backend/src/voice/music.ts"] - end - - subgraph Out["Output"] - Ctx["Structured work context
{file, symbol, activity, mode, research}"] - Recall["$vectorSearch recall
prior intervention + outcome"] - Answer["Spoken answer over
repo / git / memory tools"] - Voice["Spoken alert
in the room"] - Score["Per-pod ambient
score"] - end - - Frame --> Vision --> Ctx - NewEvent --> Embed --> Recall - Talk --> Live --> Answer - Urgent --> TTS --> Voice - Session --> Lyria --> Score +```text +Base URL: https://llm.alhinai.dev/v1 +API key: not-needed +Model: gemma-4-31B-it +Context: 262144 tokens ``` +The vLLM server is configured for Hermes-style tool use: +```text +--max-model-len 262144 +--max-num-seqs 1 +--max-num-batched-tokens 16384 +--gpu-memory-utilization 0.85 +--kv-cache-dtype fp8 +--enable-auto-tool-choice +--tool-call-parser gemma4 +--enable-chunked-prefill +``` +Hermes should point at that endpoint with this provider shape: +```yaml +model: + default: gemma-4-31B-it + provider: gemma4-31b-vllm -### Runtime shape +providers: + gemma4-31b-vllm: + name: Gemma 4 31B vLLM (256K) + api: https://llm.alhinai.dev/v1 + api_key: not-needed + transport: chat_completions + default_model: gemma-4-31B-it + discover_models: true + models: + gemma-4-31B-it: + context_length: 262144 +agent: + tool_use_enforcement: auto +``` -| Layer | Runtime | Responsibility | -| ----------------------- | ----------------------------------------- | --------------------------------------------------------------------------------------- | -| Frontend PWA | React + Vite | Join pods, publish screen share, render interventions, play audio | -| Backend API | Express | Mint LiveKit tokens, manage pods, record outcomes, expose memory stats, create sync PRs | -| Vision agent | `@livekit/rtc-node` | Subscribe to screen-share tracks, sample frames, publish intervention data | -| Live conversation agent | LiveKit Agents (Python) + Gemini Live API | Real-time voice Q&A with function tools over repo, git, and memory | -| Perception | Gemini Vision (`gemini-2.0-flash`) | Sampled IDE frames → structured work context | -| Team memory | MongoDB Atlas | Observations, collisions, interventions, outcomes, vector embeddings | -| Git watcher | Node script | Report each laptop's dirty/unpushed state as ground truth | -| Action layer | Hermes | Cards, teammate messages, Gemini TTS urgent voice, Lyria background score | -| Deployment | DigitalOcean | Static frontend, API service, agent workers | +Why this matters: Hermes sends OpenAI tool schemas and `tool_choice: "auto"`. +Without `--enable-auto-tool-choice` and `--tool-call-parser gemma4`, vLLM returns +HTTP 400 before Hermes can initialize an agent. +### Gemini Surfaces +Gemini remains the realtime perception and voice layer inside PodMan. +| Use | Model | Code | +| -------------------------- | ------------------------------- | ------------------------------------------ | +| Screen understanding | `gemini-2.0-flash` | `backend/src/vision/gemini.ts` | +| Urgent spoken alerts | `gemini-3.1-flash-tts-preview` | `backend/src/voice/live.ts` | +| Live room conversation | `gemini-3.1-flash-live-preview` | `agents/podman-live-conversation/agent.py` | +| Memory embeddings fallback | `gemini-embedding-001` | `backend/src/memory/vectors.ts` | +| Ambient background music | `lyria-3-clip-preview` | `backend/src/voice/music.ts` | -### Data flow +Voyage embeddings can be used first when `VOYAGE_API_KEY` is set. Gemini +embeddings remain the fallback. If no embedding provider is available, PodMan +falls back to exact-signature matching. + +--- + +## How The Learning Loop Works + +The learning loop is the product. A teammate only has to accept or dismiss an +intervention; the rest is captured automatically. + +```text +observe -> detect -> recall prior outcomes -> policy gate -> act -> record outcome + ^ | + +-------------------------- next recall -----------------------------+ +``` + +| Stage | What happens | Code | +| ------- | --------------------------------------------------------------------------- | ----------------------------------- | +| Observe | Gemini Vision turns sampled screen frames into structured work context. | `backend/src/vision/gemini.ts` | +| Detect | PodMan detects overlapping files, symbols, research, and unpushed work. | `backend/src/collision/detector.ts` | +| Recall | MongoDB Atlas recalls similar prior events and outcomes. | `backend/src/memory/vectors.ts` | +| Gate | Policy suppresses dismissed false alarms and escalates recurring real ones. | `backend/src/memory/policy.ts` | +| Act | PodMan publishes a card, Hermes message, or urgent voice cue. | `backend/src/action/hermes.ts` | +| Learn | Accept/dismiss feedback is written back to memory. | `backend/src/memory/store.ts` | + +--- + +## Runtime Components + +| Layer | Runtime | Responsibility | +| ------------------ | ----------------------------------- | -------------------------------------------------------------------- | +| Frontend | React + Vite | Pod rooms, screen share, cards, voice controls, member state | +| Backend API | Express on `:8787` | LiveKit tokens, pod CRUD, outcomes, memory stats, sync PRs | +| Vision agent | Node + `@livekit/rtc-node` | Subscribes to screen tracks, samples frames, publishes interventions | +| Live voice agent | Python LiveKit Agents + Gemini Live | Real-time voice Q&A in a pod room | +| Memory | MongoDB Atlas | Observations, engineer state, collisions, interventions, outcomes | +| Reasoning agent | Hermes + Gemma vLLM | Tool-using autonomous assistant and ops layer | +| Realtime transport | LiveKit Cloud | Screen tracks, audio tracks, data messages | +| Hosting | DigitalOcean + Caddy + systemd | Static frontend, API, workers, watchdog timers | + +--- + +## Data Flow ```mermaid sequenceDiagram @@ -197,161 +265,106 @@ sequenceDiagram participant Dev as Engineer PWA participant API as Backend API participant LK as LiveKit Room - participant Agent as PodMan Agent - participant Gemini as Gemini Vision - participant Mongo as MongoDB Memory - participant Hermes as Hermes / Action Layer + participant Agent as Vision Agent + participant Gemini as Gemini APIs + participant Mongo as MongoDB Atlas + participant Hermes as Hermes/Gemma Dev->>API: POST /api/token API-->>Dev: LiveKit URL + JWT Dev->>LK: Join pod room + publish screen share Agent->>LK: Subscribe to screen-share video - Agent->>Gemini: Sampled JPEG frame + Agent->>Gemini: Sampled frame Gemini-->>Agent: Structured work context - Agent->>Mongo: Record observation - Agent->>Mongo: Recall prior patterns (vector search) - Mongo-->>Agent: Prior intervention + outcome - Agent->>Hermes: Create intervention (gated by policy) - Hermes->>LK: Publish card / message / Gemini TTS voice - LK-->>Dev: Render intervention - Dev->>API: POST /api/outcome (accept / dismiss) - API->>Mongo: Store learning signal + Agent->>Mongo: Store observation + Agent->>Mongo: Recall similar prior events + Mongo-->>Agent: Prior outcome + policy hints + Agent->>Hermes: Escalate when autonomous help is useful + Agent->>LK: Publish card / message / voice cue + Dev->>API: POST /api/outcome + API->>Mongo: Store accept/dismiss feedback ``` +--- +## Public Interfaces + +| Interface | Purpose | +| ----------------------------------------------------------- | ---------------------------------------------- | +| `GET /health` | API health check | +| `POST /api/token` | Mint LiveKit room tokens | +| `GET /api/pods` | List pods | +| `GET/POST/PATCH/DELETE /api/pods` | Pod CRUD | +| `POST/DELETE /api/pods/:id/members` | Pod membership | +| `GET /api/pods/:id/members/:name/history` | Recent member work history | +| `POST /api/outcome` | Store accepted/dismissed intervention outcomes | +| `GET /api/memory/stats` | Live memory collection counts | +| `POST /api/sync-pr` | Create a visible sync PR artifact | +| LiveKit topic `podman.intervention` | Intervention data channel | +| Wire messages `COLLISION`, `ACK`, `GIT_REPORT`, `VOICE_CUE` | Agent/PWA contract | --- +## Monorepo Layout - -## Built with - -Everything below maps to code in this repo. - -**Gemini** does the perception, the voice, and the memory: - - -| Use | Model | Where | -| --------------------------------------------------------------------------- | ------------------------------- | ------------------------------------------ | -| Real-time voice agent (talk to PodMan, answered with repo/git/memory tools) | `gemini-3.1-flash-live-preview` | `agents/podman-live-conversation/agent.py` | -| Spoken urgent alerts over LiveKit | `gemini-3.1-flash-tts-preview` | `backend/src/voice/live.ts` | -| Screen understanding → structured work context | `gemini-2.0-flash` | `backend/src/vision/gemini.ts` | -| Per-pod background music (Interactions API) | `lyria-3-clip-preview` | `backend/src/voice/music.ts` | -| Embeddings for memory recall | `gemini-embedding-001` | `backend/src/memory/vectors.ts` | - - -**LiveKit** is the real-time layer: screen-share tracks are the input, a typed -data channel (`podman.intervention`) carries cards and messages, audio tracks -carry the spoken alerts and music, and a Python LiveKit Agents worker runs the -live conversation agent in the room. - -**MongoDB Atlas** is the memory: `$vectorSearch` recalls similar past events -(exact-signature fallback when needed), and the `outcomes` collection drives the -policy that decides whether and how to act. - -**DigitalOcean** hosts it: a static frontend, the API service, and the agent -workers, supervised by systemd. Mongo connectivity is required at boot — services -fail loudly rather than degrade silently. +| Folder | Purpose | +| ----------- | ----------------------------------------------------------------------- | +| `frontend/` | React + Vite PWA | +| `backend/` | Express API, vision agent, memory, collision detection, Hermes job APIs | +| `agents/` | Python LiveKit conversation agent | +| `shared/` | Shared TypeScript contracts | +| `database/` | MongoDB setup and seed utilities | +| `infra/` | Caddy, Docker, DigitalOcean, systemd units | +| `scripts/` | Git watcher, deploy doctor, watchdog, verification tooling | +| `docs/` | Demo, deployment, learning, graph, and architecture notes | --- +## Local Development +Run the core app in three terminals: -## How it works +```mermaid +flowchart LR + Env["1. Configure .env"] --> Install["2. pnpm install"] + Install --> API["Terminal A
backend API :8787"] + Install --> Agent["Terminal B
vision agent"] + Install --> UI["Terminal C
frontend :5173"] + Install --> Voice["Optional
conversation agent"] + API --> Browser["Open local PWA"] + Agent --> Browser + UI --> Browser + Voice --> Browser -1. Engineers open the PWA and join a pod room. -2. The API mints a LiveKit token via `POST /api/token`. -3. The PWA publishes screen share into the room on "Share my screen". -4. The PodMan vision agent subscribes to the screen-share tracks. -5. The agent samples frames, sends them to Gemini Vision, records structured - observations in MongoDB. -6. Each engineer runs the git watcher so PodMan has deterministic - dirty/unpushed truth. -7. The detector fuses live screen context, git truth, GitHub state, and recalled - memory. -8. The policy gate decides whether and how to act — card, Hermes message, or - urgent voice — reusing what worked before. -9. Urgent escalations are spoken via Gemini TTS over a LiveKit audio track. -10. The teammate's accept/dismiss is saved as an outcome, closing the - continual-learning loop. - -Separately, any teammate can start a **live voice conversation** with PodMan -(Gemini Live API) to ask about current work, git state, or where something lives -in the repo — answered with real tool calls, not guesses. - ---- - - - -## Public interfaces - - -| Interface | Purpose | -| ----------------------------------------------------------- | ------------------------------------------------- | -| `GET /health` | API health check | -| `POST /api/token` | Mint LiveKit room tokens | -| `POST /api/sync-pr` | Create a visible sync PR artifact | -| `POST /api/outcome` | Store accepted/dismissed intervention outcomes | -| `GET /api/memory/stats` | Memory collection counts (live learning evidence) | -| `GET/POST/PATCH/DELETE /api/pods` | Pod CRUD | -| `POST/DELETE /api/pods/:id/members` | Pod membership | -| LiveKit topic `podman.intervention` | Intervention data channel | -| Wire messages `COLLISION`, `ACK`, `GIT_REPORT`, `VOICE_CUE` | Agent/PWA contract | - - ---- - - - -## Monorepo layout - - -| Folder | What | -| ----------- | -------------------------------------------------------------------------- | -| `frontend/` | React + Vite PWA — pods, LiveKit room UI, screen share, intervention cards | -| `backend/` | Express API plus the LiveKit vision agent worker | -| `agents/` | Python LiveKit Agents worker for the Gemini Live conversation agent | -| `shared/` | Shared TypeScript types and LiveKit data message contracts | -| `database/` | MongoDB setup and seed utilities | -| `infra/` | DigitalOcean specs, Caddyfile, systemd units | -| `scripts/` | Local git watcher + deploy/verify tooling | -| `docs/` | Integration specs and the demo script | - - ---- - - - -## Quick start + classDef step fill:#eef8ee,stroke:#2f8a3a,color:#123915; + classDef run fill:#e8f1ff,stroke:#3366cc,color:#0b1f44; + class Env,Install step; + class API,Agent,UI,Voice,Browser run; +``` ```bash cp .env.example .env -# fill in LIVEKIT_*, GEMINI_*, GITHUB_*, MONGODB_URI +# Fill LIVEKIT_*, GEMINI_*, GITHUB_*, MONGODB_URI. pnpm install pnpm --filter @podman/backend dev # API on :8787 -pnpm --filter @podman/backend dev:agent # PodMan LiveKit vision agent +pnpm --filter @podman/backend dev:agent # LiveKit vision agent pnpm --filter @podman/frontend dev # PWA on :5173 ``` -The live conversation agent (Gemini Live API) runs from `agents/podman-live-conversation/`. - ---- - - - -## Git watcher — run on every demo laptop - -Each engineer runs this before the demo. It polls the local git working tree -every 15 seconds and writes git state to MongoDB so PodMan has deterministic -dirty/unpushed truth that vision alone cannot reliably infer. +Run the Python live conversation agent: ```bash -# from the repo root -node scripts/podman-agent.mjs --name --pod +pnpm livekit:conversation:agent ``` -**Demo setup:** +Run the local git watcher on each demo laptop: + +```bash +node scripts/podman-agent.mjs --name --pod +``` + +Demo identities: ```bash node scripts/podman-agent.mjs --name alice --pod demo-pod @@ -359,5 +372,184 @@ node scripts/podman-agent.mjs --name bob --pod demo-pod node scripts/podman-agent.mjs --name carol --pod demo-pod ``` -**Requirements:** `MONGODB_URI` exported (or in `backend/.env`), `pnpm install` -run first, launched from the repo root. +--- + +## Production Operations + +The production droplet is systemd-supervised. Caddy serves the built frontend +and proxies `/api/*` to the backend on `127.0.0.1:8787`. + +```mermaid +flowchart LR + Public["https://podman.live"] --> Caddy["caddy.service"] + Caddy --> Static["/var/www/podman"] + Caddy --> API["podman-platform-api.service
:8787"] + API --> Agent["podman-platform-agent.service"] + API --> Voice["podman-live-conversation-agent.service"] + Watchdog["podman-hermes-watchdog.timer"] --> Public + Sync["podman-hermes-sync-deploy.timer"] --> API + + classDef public fill:#e8f1ff,stroke:#3366cc,color:#0b1f44; + classDef service fill:#eef8ee,stroke:#2f8a3a,color:#123915; + classDef timer fill:#fff6df,stroke:#c47f00,color:#3d2b00; + class Public public; + class Caddy,Static,API,Agent,Voice service; + class Watchdog,Sync timer; +``` + +| Service / timer | Purpose | +| ---------------------------------------- | -------------------------------------------------------------- | +| `podman-platform-api.service` | Built backend API on port `8787` | +| `podman-platform-agent.service` | Node LiveKit vision agent | +| `podman-live-conversation-agent.service` | Python Gemini Live conversation agent | +| `podman-hermes-watchdog.timer` | Periodic public health and remediation | +| `podman-hermes-sync-deploy.timer` | Clean-tree fast-forward deploy loop | +| `caddy.service` | Serves `/var/www/podman`, proxies `/api/*` to `127.0.0.1:8787` | + +Check the app from the outside first: + +```bash +curl https://podman.live/ +curl https://podman.live/health +curl https://podman.live/api/pods +curl https://podman.live/api/presence +curl https://podman.live/api/memory/stats +``` + +Then check the droplet services: + +```bash +systemctl is-active podman-platform-api podman-platform-agent +systemctl is-active podman-live-conversation-agent +systemctl is-active podman-hermes-watchdog.timer podman-hermes-sync-deploy.timer +``` + +Hermes operations scripts: + +```bash +pnpm hermes:watchdog +pnpm hermes:watchdog:strict +pnpm hermes:sync-deploy +pnpm deploy:doctor:strict +``` + +Gemma/vLLM endpoint checks: + +```bash +curl https://llm.alhinai.dev/v1/models \ + -H "Authorization: Bearer not-needed" + +curl https://llm.alhinai.dev/v1/chat/completions \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer not-needed" \ + -d '{ + "model": "gemma-4-31B-it", + "messages": [{"role": "user", "content": "Reply with exactly: working"}], + "temperature": 0, + "max_tokens": 512 + }' +``` + +--- + +## Required Environment + +```bash +LIVEKIT_URL=wss://your-livekit-server.livekit.cloud +LIVEKIT_API_KEY=... +LIVEKIT_API_SECRET=... +LIVEKIT_CONVERSATION_AGENT_NAME=podman-live-conversation + +GEMINI_API_KEY=... +GEMINI_VISION_MODEL=gemini-2.0-flash +GEMINI_LIVE_MODEL=gemini-3.1-flash-tts-preview +GEMINI_CONVERSATION_MODEL=gemini-3.1-flash-live-preview +GEMINI_EMBEDDING_MODEL=gemini-embedding-001 +GEMINI_TTS_VOICE=Charon + +GITHUB_TOKEN=... +GITHUB_REPO=karti-ai/podman + +MONGODB_URI=mongodb+srv://... +VOYAGE_API_KEY=... +VOYAGE_EMBEDDING_MODEL=voyage-4-lite + +PORT=8787 +POD_ROOM=demo-pod +``` + +Gemma/Hermes provider values live in Hermes config, not PodMan `.env`: + +```text +provider: gemma4-31b-vllm +model: gemma-4-31B-it +base_url: https://llm.alhinai.dev/v1 +api_key: not-needed +``` + +--- + +## Verification + +Before calling a deployment healthy: + +```bash +pnpm verify +pnpm verify:infra +pnpm deploy:doctor:strict +pnpm hermes:watchdog:strict +``` + +For the public site: + +```bash +curl https://podman.live/ +curl https://podman.live/health +curl https://podman.live/api/pods +curl https://podman.live/api/presence +curl https://podman.live/api/memory/stats +``` + +For Hermes/Gemma: + +```bash +hermes -z 'Reply with exactly: working' \ + --provider gemma4-31b-vllm \ + --model gemma-4-31B-it +``` + +Expected output: + +```text +working +``` + +--- + +## Troubleshooting + +| Symptom | Likely cause | Check | +| ---------------------------------------- | ---------------------------------------------- | ------------------------------------------------------------ | +| Frontend loads but API fails | Backend or Caddy proxy issue | `systemctl status podman-platform-api caddy` | +| `/api/*` returns 502 | API not listening on `8787` | `ss -ltnp`, `curl http://127.0.0.1:8787/health` | +| No screen observations | Vision agent not in LiveKit room | `journalctl -u podman-platform-agent -n 80` | +| Live voice missing | Python conversation agent down | `journalctl -u podman-live-conversation-agent -n 80` | +| Memory empty | MongoDB unavailable or env missing | `curl /api/memory/stats`, backend logs | +| Hermes says tool auto-choice is disabled | vLLM missing tool flags | verify `--enable-auto-tool-choice --tool-call-parser gemma4` | +| `llm.alhinai.dev` returns 502 | Gemma vLLM still loading or tunnel target down | `curl /v1/models`, vLLM logs on Gemma host | + +--- + +## Why It Gets Better + +PodMan is not a static alert system. It remembers what actually helped. + +- A dismissed false alarm lowers future urgency. +- An accepted real collision raises future urgency for similar work. +- Exact-signature recall catches repeats even without vector search. +- MongoDB outcomes become the policy signal for the next session. +- Hermes and Gemma give the system a tool-using agent when the coordination + problem needs active investigation instead of a passive card. + +The goal is simple: fewer interruptions, fewer duplicate branches, and a team +that can move fast without constantly asking what everyone else is doing. diff --git a/agents/podman-live-conversation/agent.py b/agents/podman-live-conversation/agent.py index 2ba1857..9916ac9 100644 --- a/agents/podman-live-conversation/agent.py +++ b/agents/podman-live-conversation/agent.py @@ -52,6 +52,8 @@ You are in a private 1:1 voice conversation with one developer. Use PodMan tools before making claims about current work, git state, collisions, blockers, team memory, or recent decisions. Keep spoken answers short. Prefer one useful next step. +For questions about a person's style, goals, past work, collaboration habits, personal context, +or what they know across pods/sessions, call get_user_learning_profile before answering. If a critical collision event arrives, stop the current turn and state the alert immediately. To find code, files, symbols, or how something is implemented in the repository, call search_repo. For git commit history, authorship, recent changes, or which commit introduced something, call @@ -130,6 +132,20 @@ class PodManLiveAgent(Agent): ) return json.dumps(data, ensure_ascii=True)[:12000] + @function_tool() + async def get_user_learning_profile(self, context: RunContext) -> str: + """Get persistent cross-pod, cross-session knowledge about this developer: + collaboration style, goals, known work, recent activity, and Hermes history. + """ + data = await asyncio.to_thread( + request_json, + f"/api/internal/pods/{self.pod_id}/live-context?identity={self.identity}", + ) + profile = data.get("userLearningProfile") + if not profile: + return "No persistent user learning profile has been built for this developer yet." + return json.dumps(profile, ensure_ascii=True)[:10000] + @function_tool() async def record_conversation_note(self, context: RunContext, note: str, kind: str = "summary") -> str: """Store a useful decision, outcome, or preference learned during this conversation.""" diff --git a/backend/package.json b/backend/package.json index 3cd759e..c4b84a1 100644 --- a/backend/package.json +++ b/backend/package.json @@ -17,6 +17,7 @@ "typecheck": "tsc -p tsconfig.json --noEmit" }, "dependencies": { + "@clerk/express": "^2.1.32", "@google/genai": "^2.10.0", "@livekit/rtc-node": "^0.13.29", "@podman/shared": "workspace:*", diff --git a/backend/src/auth.ts b/backend/src/auth.ts new file mode 100644 index 0000000..8326298 --- /dev/null +++ b/backend/src/auth.ts @@ -0,0 +1,30 @@ +import { clerkMiddleware, getAuth } from '@clerk/express'; +import type { Request, RequestHandler, Response } from 'express'; +import { env } from './env.js'; + +export interface RequestUserContext { + clerkUserId: string; +} + +export const clerkAuthMiddleware: RequestHandler = env.CLERK_SECRET_KEY + ? clerkMiddleware() + : (_req, _res, next) => next(); + +export function requestUser(req: Request): RequestUserContext | null { + if (!env.CLERK_SECRET_KEY) return null; + try { + const auth = getAuth(req); + return auth.isAuthenticated && auth.userId ? { clerkUserId: auth.userId } : null; + } catch { + return null; + } +} + +export function requireRequestUser(req: Request, res: Response): RequestUserContext | null { + const user = requestUser(req); + if (!user) { + res.status(401).json({ error: 'sign in required' }); + return null; + } + return user; +} diff --git a/backend/src/env.ts b/backend/src/env.ts index 0867551..caaa73a 100644 --- a/backend/src/env.ts +++ b/backend/src/env.ts @@ -1,4 +1,6 @@ -import 'dotenv/config'; +import { config } from 'dotenv'; + +config({ path: ['.env.local', '../.env.local', '.env', '../.env'] }); function req(name: string): string { const v = process.env[name]; @@ -42,6 +44,7 @@ export const env = { VOYAGE_EMBEDDING_MODEL: opt('VOYAGE_EMBEDDING_MODEL', 'voyage-4-lite'), // Server PORT: Number(opt('PORT', '8787')), + CLERK_SECRET_KEY: opt('CLERK_SECRET_KEY'), NUDGE_COOLDOWN_MS: Number(opt('NUDGE_COOLDOWN_MS', '180000')), RESEARCH_OVERLAP_THRESHOLD: Number(opt('RESEARCH_OVERLAP_THRESHOLD', '0.6')), INTERNAL_AGENT_TOKEN: opt('INTERNAL_AGENT_TOKEN'), diff --git a/backend/src/live-conversation/context.ts b/backend/src/live-conversation/context.ts index 3a007dc..12c5ba8 100644 --- a/backend/src/live-conversation/context.ts +++ b/backend/src/live-conversation/context.ts @@ -1,5 +1,9 @@ import { getDb } from '../memory/db.js'; import { getMemberWorkHistory } from '../activity/member-history.js'; +import { + buildUserLearningProfile, + getUserLearningProfileByIdentity, +} from '../memory/user-learning.js'; const DEFAULT_LIMIT = 8; @@ -10,7 +14,8 @@ function sinceIso(hours: number): string { export async function getLiveConversationContext(podId: string, identity: string) { const db = await getDb(); const since = sinceIso(12); - const [pod, history, gitState, collisions, interventions, outcomes] = await Promise.all([ + const [pod, history, gitState, collisions, interventions, outcomes, userLearningProfile] = + await Promise.all([ db.collection('pods').findOne({ id: podId }, { projection: { _id: 0 } }), getMemberWorkHistory(podId, identity, { hours: 24, limit: 30 }).catch(() => null), db.collection('engineer_states').findOne( @@ -44,6 +49,7 @@ export async function getLiveConversationContext(podId: string, identity: string .sort({ recordedAt: -1 }) .limit(DEFAULT_LIMIT) .toArray(), + getUserLearningProfileByIdentity(identity).catch(() => null), ]); return { @@ -51,6 +57,7 @@ export async function getLiveConversationContext(podId: string, identity: string identity, generatedAt: new Date().toISOString(), currentGitState: gitState, + userLearningProfile, memberHistory: history, recentCollisions: collisions, recentInterventions: interventions, @@ -76,5 +83,13 @@ export async function recordLiveConversationNote(input: { createdAt: new Date().toISOString(), }; await (await getDb()).collection('conversation_notes').insertOne(doc); + if (input.identity) { + const profile = await getUserLearningProfileByIdentity(input.identity); + if (profile) { + void buildUserLearningProfile(profile.clerkUserId).catch((err) => + console.warn(`[memory] note user learning refresh failed: ${(err as Error).message}`), + ); + } + } return { ...doc, _id: undefined }; } diff --git a/backend/src/memory/db.ts b/backend/src/memory/db.ts index 75c467f..93f2e06 100644 --- a/backend/src/memory/db.ts +++ b/backend/src/memory/db.ts @@ -56,6 +56,17 @@ export interface PodCollections { suppressions: Collection; } +export interface UserPodContextDoc { + id: string; + clerkUserId: string; + podId: string; + memberName?: string; + action: string; + source: 'clerk'; + observedAt: string; + metadata?: Record; +} + export async function collections(): Promise { const db = await getDb(); return { @@ -142,6 +153,26 @@ export async function initMemory(): Promise { 'hermes_job_events.job', () => db.collection('hermes_job_events').createIndex({ jobId: 1, createdAt: 1 }), ], + [ + 'user_pod_context.user', + () => db.collection('user_pod_context').createIndex({ clerkUserId: 1, observedAt: -1 }), + ], + [ + 'user_pod_context.pod', + () => db.collection('user_pod_context').createIndex({ podId: 1, observedAt: -1 }), + ], + [ + 'user_learning_profiles.user', + () => db.collection('user_learning_profiles').createIndex({ clerkUserId: 1 }, { unique: true }), + ], + [ + 'user_learning_profiles.updated', + () => db.collection('user_learning_profiles').createIndex({ updatedAt: -1 }), + ], + [ + 'conversation_notes.identity', + () => db.collection('conversation_notes').createIndex({ identity: 1, createdAt: -1 }), + ], ]; for (const [name, make] of indexes) { try { diff --git a/backend/src/memory/store.ts b/backend/src/memory/store.ts index 2325725..52c12fc 100644 --- a/backend/src/memory/store.ts +++ b/backend/src/memory/store.ts @@ -5,16 +5,19 @@ import type { InterventionOutcome, InterventionStatus, } from '@podman/shared'; -import { collections, getGitStates } from './db.js'; +import { collections, getDb, getGitStates, type UserPodContextDoc } from './db.js'; import { enrichCollisionMemory } from './vectors.js'; +import { buildUserLearningProfile } from './user-learning.js'; function comparableFile(raw?: string): string { - return (raw ?? '') - .trim() - .replace(/^(\?\?|[MADRCU!]{1,2})\s+/, '') - .split(/[\\/]/) - .pop() - ?.toLowerCase() ?? ''; + return ( + (raw ?? '') + .trim() + .replace(/^(\?\?|[MADRCU!]{1,2})\s+/, '') + .split(/[\\/]/) + .pop() + ?.toLowerCase() ?? '' + ); } /** @@ -38,6 +41,30 @@ export async function recordObservation(ctx: EngineerContext): Promise { ); } +export async function recordUserPodContext(input: { + clerkUserId: string; + podId: string; + memberName?: string; + action: string; + metadata?: UserPodContextDoc['metadata']; +}): Promise { + await persist('user pod context', async () => + (await getDb()).collection('user_pod_context').insertOne({ + id: `upc_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`, + clerkUserId: input.clerkUserId, + podId: input.podId, + memberName: input.memberName, + action: input.action, + source: 'clerk', + observedAt: new Date().toISOString(), + metadata: input.metadata, + }), + ); + void buildUserLearningProfile(input.clerkUserId).catch((err) => + console.warn(`[memory] user learning refresh failed: ${(err as Error).message}`), + ); +} + export async function recordCollision(collision: Collision): Promise { await persist('collision', async () => (await collections()).collisions.insertOne(await enrichCollisionMemory(collision)), @@ -163,12 +190,31 @@ export async function recordOutcome(outcome: InterventionOutcome): Promise /** Document counts per collection — used by the /api/memory/stats endpoint. */ export async function memoryStats(): Promise> { const c = await collections(); - const [observations, collisions, interventions, outcomes, suppressions] = await Promise.all([ + const db = await getDb(); + const [ + observations, + collisions, + interventions, + outcomes, + suppressions, + userPodContext, + userLearningProfiles, + ] = await Promise.all([ c.observations.estimatedDocumentCount(), c.collisions.estimatedDocumentCount(), c.interventions.estimatedDocumentCount(), c.outcomes.estimatedDocumentCount(), c.suppressions.estimatedDocumentCount(), + db.collection('user_pod_context').estimatedDocumentCount(), + db.collection('user_learning_profiles').estimatedDocumentCount(), ]); - return { observations, collisions, interventions, outcomes, suppressions }; + return { + observations, + collisions, + interventions, + outcomes, + suppressions, + userPodContext, + userLearningProfiles, + }; } diff --git a/backend/src/memory/user-learning.ts b/backend/src/memory/user-learning.ts new file mode 100644 index 0000000..74916d1 --- /dev/null +++ b/backend/src/memory/user-learning.ts @@ -0,0 +1,282 @@ +import type { Collision, EngineerContext, HermesJob, Pod, UserLearningProfile } from '@podman/shared'; +import { getDb, type UserPodContextDoc } from './db.js'; + +interface EngineerStateDoc { + podId: string; + name: string; + changedFiles?: string[]; + branch?: string | null; + recentCommit?: string | null; + gitUpdatedAt?: Date | string; +} + +interface ConversationNoteDoc { + podId: string; + identity?: string; + kind?: string; + note?: string; + createdAt?: string; +} + +function clean(value: unknown): string | undefined { + return typeof value === 'string' && value.trim() ? value.trim() : undefined; +} + +function toIso(value: unknown): string { + if (value instanceof Date) return value.toISOString(); + if (typeof value === 'string' && !Number.isNaN(Date.parse(value))) return new Date(value).toISOString(); + return new Date().toISOString(); +} + +function uniq(values: Array): string[] { + const seen = new Set(); + const out: string[] = []; + for (const value of values) { + const item = value?.trim(); + if (!item) continue; + const key = item.toLowerCase(); + if (seen.has(key)) continue; + seen.add(key); + out.push(item); + } + return out; +} + +function top(values: string[], limit: number): string[] { + const counts = new Map(); + for (const value of values) { + const item = value.trim(); + if (!item) continue; + counts.set(item, (counts.get(item) ?? 0) + 1); + } + return [...counts.entries()] + .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0])) + .slice(0, limit) + .map(([value]) => value); +} + +function lowerRegex(values: string[]): RegExp[] { + return values.map((value) => new RegExp(`^${value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}$`, 'i')); +} + +function noteGoals(notes: ConversationNoteDoc[]): string[] { + const goalNotes = notes + .filter((note) => /goal|plan|todo|next|preference|prefers|likes|wants|needs/i.test(`${note.kind} ${note.note}`)) + .map((note) => clean(note.note)?.slice(0, 180)) + .filter(Boolean) as string[]; + return uniq(goalNotes).slice(0, 8); +} + +function inferCollaborationStyle(input: { + contexts: UserPodContextDoc[]; + observations: EngineerContext[]; + collisions: Collision[]; + outcomes: Array<{ accepted?: boolean; wasRealCollision?: boolean }>; + notes: ConversationNoteDoc[]; + jobs: HermesJob[]; +}): string[] { + const style: string[] = []; + const actions = input.contexts.map((ctx) => ctx.action); + const pods = new Set(input.contexts.map((ctx) => ctx.podId)); + if (pods.size > 1) style.push(`Works across ${pods.size} pods and carries context between rooms.`); + if (actions.filter((action) => action === 'joined_pod').length >= 3) + style.push('Frequently joins live rooms and collaborates synchronously.'); + if (input.collisions.length > 0) + style.push(`Has been involved in ${input.collisions.length} coordination risk signals.`); + const accepted = input.outcomes.filter((outcome) => outcome.accepted).length; + if (accepted > 0) style.push(`Accepts Hermes help when useful (${accepted} accepted outcomes).`); + if (input.jobs.length > 0) style.push(`Delegates complex work to Hermes (${input.jobs.length} jobs).`); + if (input.notes.some((note) => /concise|short|brief/i.test(note.note ?? ''))) + style.push('Prefers concise coordination.'); + return style.slice(0, 8); +} + +function inferWorkingStyle(input: { + observations: EngineerContext[]; + gitStates: EngineerStateDoc[]; +}): string[] { + const style: string[] = []; + const modes = top(input.observations.map((obs) => obs.mode ?? '').filter(Boolean), 2); + const activities = top(input.observations.map((obs) => obs.activity ?? '').filter(Boolean), 5); + const files = top( + [ + ...input.observations.map((obs) => obs.currentFile ?? ''), + ...input.gitStates.flatMap((state) => state.changedFiles ?? []), + ].filter(Boolean), + 6, + ); + if (modes.length) style.push(`Usually seen in ${modes.join(' and ')} mode.`); + if (activities.length) style.push(`Common work patterns: ${activities.join(', ')}.`); + if (files.length) style.push(`Frequently touches ${files.join(', ')}.`); + return style.slice(0, 8); +} + +function inferKnowledge(input: { + observations: EngineerContext[]; + gitStates: EngineerStateDoc[]; + notes: ConversationNoteDoc[]; +}): string[] { + const topics = top( + [ + ...input.observations.map((obs) => obs.researchTopic ?? ''), + ...input.observations.map((obs) => obs.researchSource ?? ''), + ...input.observations.map((obs) => obs.currentSymbol ?? ''), + ...input.gitStates.flatMap((state) => state.changedFiles ?? []), + ...input.notes + .filter((note) => /learn|knows|expert|worked on|decision/i.test(note.note ?? '')) + .map((note) => note.note?.slice(0, 120) ?? ''), + ].filter(Boolean), + 10, + ); + return topics; +} + +export async function buildUserLearningProfile(clerkUserId: string): Promise { + const db = await getDb(); + const contexts = await db + .collection('user_pod_context') + .find({ clerkUserId }, { projection: { _id: 0 } }) + .sort({ observedAt: -1 }) + .limit(500) + .toArray(); + if (!contexts.length) return null; + + const latest = contexts[0]; + const identities = uniq([ + ...contexts.map((ctx) => ctx.memberName), + ...contexts.map((ctx) => clean(ctx.metadata?.identity)), + ...contexts.map((ctx) => clean(ctx.metadata?.email)), + ]); + const email = clean(latest?.metadata?.email) ?? identities.find((item) => item.includes('@')); + const displayName = latest?.memberName ?? identities.find((item) => !item.includes('@')) ?? email; + const imageUrl = clean(latest?.metadata?.imageUrl); + const identityRegex = lowerRegex(identities); + + const podIds = uniq(contexts.map((ctx) => ctx.podId)); + const [pods, observations, gitStates, collisions, outcomes, notes, jobs] = await Promise.all([ + db + .collection('pods') + .find({ id: { $in: podIds } }, { projection: { _id: 0 } }) + .toArray(), + db + .collection('observations') + .find({ engineerId: { $in: identities } }, { projection: { _id: 0, screenshotDataUrl: 0 } }) + .sort({ observedAt: -1 }) + .limit(500) + .toArray(), + db + .collection('engineer_states') + .find({ name: { $in: identityRegex } }, { projection: { _id: 0 } }) + .limit(100) + .toArray(), + db + .collection('collisions') + .find({ engineers: { $in: identities } }, { projection: { _id: 0, embedding: 0 } }) + .sort({ detectedAt: -1 }) + .limit(100) + .toArray(), + db + .collection<{ podId: string; accepted?: boolean; wasRealCollision?: boolean }>('outcomes') + .find({ podId: { $in: podIds } }, { projection: { _id: 0 } }) + .sort({ recordedAt: -1 }) + .limit(100) + .toArray(), + db + .collection('conversation_notes') + .find({ identity: { $in: identities } }, { projection: { _id: 0 } }) + .sort({ createdAt: -1 }) + .limit(100) + .toArray(), + db + .collection('hermes_jobs') + .find({ identity: { $in: identities } }, { projection: { _id: 0 } }) + .sort({ createdAt: -1 }) + .limit(100) + .toArray(), + ]); + + const podById = new Map(pods.map((pod) => [pod.id, pod])); + const podsSummary = podIds.map((podId) => { + const rows = contexts.filter((ctx) => ctx.podId === podId); + const sorted = [...rows].sort((a, b) => Date.parse(a.observedAt) - Date.parse(b.observedAt)); + return { + podId, + podName: podById.get(podId)?.name, + visits: rows.filter((row) => row.action === 'joined_pod').length, + actions: top(rows.map((row) => row.action), 6), + firstSeenAt: toIso(sorted[0]?.observedAt), + lastSeenAt: toIso(sorted.at(-1)?.observedAt), + }; + }); + + const profile: UserLearningProfile = { + clerkUserId, + displayName, + email, + imageUrl, + identities, + pods: podsSummary, + recentWork: observations.slice(0, 20).map((obs) => ({ + podId: obs.podId, + file: obs.currentFile, + activity: obs.activity ?? obs.researchTopic, + at: obs.observedAt, + })), + collaborationStyle: inferCollaborationStyle({ contexts, observations, collisions, outcomes, notes, jobs }), + workingStyle: inferWorkingStyle({ observations, gitStates }), + goals: noteGoals(notes), + knowledge: inferKnowledge({ observations, gitStates, notes }), + counts: { + podActions: contexts.length, + observations: observations.length, + gitStates: gitStates.length, + collisionsInvolved: collisions.length, + outcomes: outcomes.length, + conversationNotes: notes.length, + hermesJobs: jobs.length, + }, + updatedAt: new Date().toISOString(), + }; + + await db + .collection('user_learning_profiles') + .updateOne({ clerkUserId }, { $set: profile }, { upsert: true }); + return profile; +} + +export async function refreshUserLearningProfiles(): Promise { + const db = await getDb(); + const ids = await db.collection('user_pod_context').distinct('clerkUserId'); + const profiles = await Promise.all(ids.map((id) => buildUserLearningProfile(String(id)))); + return profiles.filter(Boolean) as UserLearningProfile[]; +} + +export async function getUserLearningProfileByIdentity(identity: string): Promise { + const db = await getDb(); + const direct = await db + .collection('user_learning_profiles') + .findOne({ identities: { $regex: `^${identity.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}$`, $options: 'i' } }, { projection: { _id: 0 } }); + if (direct) return direct; + + const context = await db + .collection('user_pod_context') + .findOne( + { + $or: [ + { memberName: { $regex: `^${identity.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}$`, $options: 'i' } }, + { 'metadata.identity': { $regex: `^${identity.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}$`, $options: 'i' } }, + ], + }, + { sort: { observedAt: -1 }, projection: { _id: 0 } }, + ); + return context ? buildUserLearningProfile(context.clerkUserId) : null; +} + +export async function listUserLearningProfiles(): Promise { + const db = await getDb(); + return db + .collection('user_learning_profiles') + .find({}, { projection: { _id: 0 } }) + .sort({ updatedAt: -1 }) + .toArray(); +} diff --git a/backend/src/pods/store.ts b/backend/src/pods/store.ts index 3c70be1..249d646 100644 --- a/backend/src/pods/store.ts +++ b/backend/src/pods/store.ts @@ -1,5 +1,5 @@ import type { Pod, PodInput } from '@podman/shared'; -import { collections } from '../memory/db.js'; +import { collections, getDb, type UserPodContextDoc } from '../memory/db.js'; const NO_ID = { projection: { _id: 0 } } as const; @@ -59,14 +59,67 @@ function now(): string { return new Date().toISOString(); } +function regexExact(value: string): RegExp { + return new RegExp(`^${value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}$`, 'i'); +} + +function profileString(value: unknown): string | undefined { + return typeof value === 'string' && value.trim() ? value.trim() : undefined; +} + +function matchesMember(doc: UserPodContextDoc, member: string): boolean { + const key = member.trim().toLowerCase(); + return [doc.memberName, doc.metadata?.identity, doc.metadata?.email] + .filter(Boolean) + .some((value) => String(value).trim().toLowerCase() === key); +} + +async function hydrateMemberProfiles(pod: Pod): Promise { + if (!pod.members.length) return pod; + const db = await getDb(); + const matchers = pod.members.map(regexExact); + const docs = await db + .collection('user_pod_context') + .find( + { + $or: [ + { memberName: { $in: matchers } }, + { 'metadata.identity': { $in: matchers } }, + { 'metadata.email': { $in: matchers } }, + ], + }, + { projection: { _id: 0 } }, + ) + .sort({ observedAt: -1 }) + .limit(500) + .toArray(); + const memberProfiles: NonNullable = {}; + for (const member of pod.members) { + const doc = docs.find((row) => matchesMember(row, member)); + const imageUrl = profileString(doc?.metadata?.imageUrl); + if (!doc || !imageUrl) continue; + memberProfiles[member] = { + displayName: doc.memberName ?? member, + email: profileString(doc.metadata?.email), + imageUrl, + }; + } + return Object.keys(memberProfiles).length ? { ...pod, memberProfiles } : pod; +} + +async function hydratePods(pods: Pod[]): Promise { + return Promise.all(pods.map((pod) => hydrateMemberProfiles(pod))); +} + export async function listPods(): Promise { const c = await collections(); - return c.pods.find({}, NO_ID).sort({ createdAt: 1 }).toArray(); + return hydratePods(await c.pods.find({}, NO_ID).sort({ createdAt: 1 }).toArray()); } export async function getPod(id: string): Promise { const c = await collections(); - return c.pods.findOne({ id }, NO_ID); + const pod = await c.pods.findOne({ id }, NO_ID); + return pod ? hydrateMemberProfiles(pod) : null; } export async function createPod(input: PodInput): Promise { @@ -92,7 +145,7 @@ export async function createPod(input: PodInput): Promise { }; try { await c.pods.insertOne({ ...pod }); - return pod; + return hydrateMemberProfiles(pod); } catch (err) { if (isDuplicateKey(err)) continue; throw err; @@ -119,7 +172,7 @@ export async function updatePod(id: string, patch: PodInput): Promise { @@ -135,7 +188,7 @@ async function setMembers(id: string, members: string[]): Promise { { $set: { members, updatedAt: now() } }, { returnDocument: 'after', projection: { _id: 0 } }, ); - return updated ?? null; + return updated ? hydrateMemberProfiles(updated) : null; } export async function addMember(id: string, rawName: unknown): Promise { diff --git a/backend/src/server.ts b/backend/src/server.ts index 0a66791..473bf23 100644 --- a/backend/src/server.ts +++ b/backend/src/server.ts @@ -12,7 +12,9 @@ import { recordOutcome, hasRecentInterventionForCollision, memoryStats, + recordUserPodContext, } from './memory/store.js'; +import { clerkAuthMiddleware, requestUser } from './auth.js'; import { closeMemory, initMemory } from './memory/db.js'; import { listPods, @@ -40,6 +42,10 @@ import { getLiveConversationContext, recordLiveConversationNote, } from './live-conversation/context.js'; +import { + listUserLearningProfiles, + refreshUserLearningProfiles, +} from './memory/user-learning.js'; import { abortHermesJob, appendHermesJobEvent, @@ -60,6 +66,7 @@ import type { const app = express(); app.use(cors()); app.use(express.json()); +app.use(clerkAuthMiddleware); app.get('/health', (_req, res) => res.json({ ok: true })); function stringArray(value: unknown): string[] { @@ -72,6 +79,10 @@ function suggestedAction(value: unknown): SuggestedActionKind { : 'ping_teammate'; } +function stringMeta(value: unknown): string | undefined { + return typeof value === 'string' && value.trim() ? value.trim() : undefined; +} + function hermesJobEventType(value: unknown): HermesJobEventType | null { return value === 'accepted' || value === 'heartbeat' || @@ -90,11 +101,16 @@ function hermesJobEventType(value: unknown): HermesJobEventType | null { app.post('/api/token', async (req, res) => { const { room, identity, name, githubLogin } = req.body ?? {}; if (!room || !identity) return res.status(400).json({ error: 'room+identity required' }); + const user = requestUser(req); const at = new AccessToken(env.LIVEKIT_API_KEY, env.LIVEKIT_API_SECRET, { identity, name, ttl: '4h', - metadata: JSON.stringify({ githubLogin: githubLogin ?? name }), + metadata: JSON.stringify({ + githubLogin: githubLogin ?? name, + email: stringMeta(req.body?.profile?.email), + imageUrl: stringMeta(req.body?.profile?.imageUrl), + }), }); at.addGrant({ roomJoin: true, room, canPublish: true, canSubscribe: true, canPublishData: true }); const agents = env.LIVEKIT_AGENT_NAME @@ -113,6 +129,19 @@ app.post('/api/token', async (req, res) => { departureTimeout: 20, agents, }); + if (user) { + await recordUserPodContext({ + clerkUserId: user.clerkUserId, + podId: String(room), + memberName: typeof name === 'string' ? name : String(identity), + action: 'joined_pod', + metadata: { + identity: String(identity), + email: stringMeta(req.body?.profile?.email) ?? null, + imageUrl: stringMeta(req.body?.profile?.imageUrl) ?? null, + }, + }); + } res.json({ token: await at.toJwt(), url: env.LIVEKIT_URL }); }); @@ -150,6 +179,22 @@ app.get('/api/memory/stats', async (_req, res) => { } }); +app.get('/api/memory/users', async (_req, res) => { + try { + res.json(await listUserLearningProfiles()); + } catch (e) { + res.status(500).json({ error: (e as Error).message }); + } +}); + +app.post('/api/memory/users/refresh', async (_req, res) => { + try { + res.json({ profiles: await refreshUserLearningProfiles() }); + } catch (e) { + res.status(500).json({ error: (e as Error).message }); + } +}); + // Live presence: who is currently connected in each pod's LiveKit room. app.get('/api/presence', async (_req, res) => { try { @@ -170,7 +215,24 @@ app.get('/api/pods', async (_req, res) => { app.post('/api/pods', async (req, res) => { try { - res.status(201).json(await createPod(req.body ?? {})); + const pod = await createPod(req.body ?? {}); + const user = requestUser(req); + if (user) { + await recordUserPodContext({ + clerkUserId: user.clerkUserId, + podId: pod.id, + memberName: stringMeta(req.body?.profile?.displayName), + action: 'created_pod', + metadata: { + podName: pod.name, + repo: pod.repo, + identity: stringMeta(req.body?.profile?.displayName) ?? null, + email: stringMeta(req.body?.profile?.email) ?? null, + imageUrl: stringMeta(req.body?.profile?.imageUrl) ?? null, + }, + }); + } + res.status(201).json(await getPod(pod.id)); } catch (e) { res.status(400).json({ error: (e as Error).message }); } @@ -186,6 +248,15 @@ app.patch('/api/pods/:id', async (req, res) => { try { const pod = await updatePod(req.params.id, req.body ?? {}); if (!pod) return res.status(404).json({ error: 'pod not found' }); + const user = requestUser(req); + if (user) { + await recordUserPodContext({ + clerkUserId: user.clerkUserId, + podId: pod.id, + action: 'updated_pod', + metadata: { podName: pod.name, repo: pod.repo }, + }); + } res.json(pod); } catch (e) { res.status(400).json({ error: (e as Error).message }); @@ -203,7 +274,21 @@ app.post('/api/pods/:id/members', async (req, res) => { try { const pod = await addMember(req.params.id, req.body?.name ?? ''); if (!pod) return res.status(404).json({ error: 'pod not found' }); - res.json(pod); + const user = requestUser(req); + if (user) { + await recordUserPodContext({ + clerkUserId: user.clerkUserId, + podId: pod.id, + memberName: typeof req.body?.name === 'string' ? req.body.name.trim() : undefined, + action: 'added_member', + metadata: { + identity: typeof req.body?.name === 'string' ? req.body.name.trim() : null, + email: stringMeta(req.body?.profile?.email) ?? null, + imageUrl: stringMeta(req.body?.profile?.imageUrl) ?? null, + }, + }); + } + res.json(await getPod(pod.id)); } catch (e) { res.status(400).json({ error: (e as Error).message }); } @@ -306,15 +391,14 @@ app.post('/api/internal/pods/:id/live-conversation/:sessionId/note', async (req, const note = typeof req.body?.note === 'string' ? req.body.note : ''; const identity = typeof req.body?.identity === 'string' ? req.body.identity : undefined; const kind = typeof req.body?.kind === 'string' ? req.body.kind : undefined; - res.status(201).json( - await recordLiveConversationNote({ + const saved = await recordLiveConversationNote({ podId: req.params.id, sessionId: req.params.sessionId, identity, kind, note, - }), - ); + }); + res.status(201).json(saved); } catch (e) { res.status(400).json({ error: (e as Error).message }); } diff --git a/frontend/package.json b/frontend/package.json index 298bf68..2921914 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -11,6 +11,8 @@ }, "dependencies": { "@base-ui/react": "^1.6.0", + "@clerk/react": "^6.11.1", + "@clerk/ui": "^1.23.0", "@fontsource-variable/geist": "^5.2.9", "@podman/shared": "workspace:*", "@shadcn/react": "^0.1.0", diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 684192c..02960d1 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,4 +1,13 @@ import { useEffect, useState } from 'react'; +import { + Show, + SignUp, + SignInButton, + SignUpButton, + UserButton, + useAuth, + useUser, +} from '@clerk/react'; import type { Room } from 'livekit-client'; import { AlertCircleIcon, @@ -54,7 +63,13 @@ function replacePath(path: string): void { window.history.replaceState({}, '', path || '/'); } +function firstNameFrom(value: string | null | undefined): string { + return value?.trim().split(/\s+/).filter(Boolean)[0] ?? ''; +} + export default function App() { + const { getToken, isLoaded, isSignedIn } = useAuth(); + const { user } = useUser(); const [pods, setPods] = useState([]); const [loading, setLoading] = useState(true); const [pending, setPending] = useState>(new Set()); @@ -68,6 +83,21 @@ export default function App() { const [graphPodId, setGraphPodId] = useState(null); const joinedPod = joinedPodId ? (pods.find((p) => p.id === joinedPodId) ?? null) : null; + const userEmail = user?.primaryEmailAddress?.emailAddress; + const defaultMemberName = + user?.firstName?.trim() || + firstNameFrom(user?.fullName) || + firstNameFrom(userEmail?.split('@')[0]); + const currentUserProfile = { + displayName: defaultMemberName, + email: userEmail, + imageUrl: user?.imageUrl, + }; + + useEffect(() => { + api.setAuthTokenGetter(isSignedIn ? getToken : null); + return () => api.setAuthTokenGetter(null); + }, [getToken, isSignedIn]); async function refresh() { setLoading(true); @@ -98,7 +128,13 @@ export default function App() { const previousPath = window.location.pathname; setPodPath(podId, replaceRoute); try { - const result = await joinPod(podId, who, who); + const result = await joinPod( + podId, + who, + who, + isSignedIn ? getToken : undefined, + currentUserProfile, + ); setRoom(result.room); setDevMode(result.mode === 'dev'); setMember(who); @@ -111,11 +147,15 @@ export default function App() { } useEffect(() => { + if (!isSignedIn) { + setLoading(false); + return; + } void refresh(); - }, []); + }, [isSignedIn]); useEffect(() => { - if (joinedPodId) return; + if (!isSignedIn || joinedPodId) return; let alive = true; const tick = async () => { try { @@ -133,15 +173,13 @@ export default function App() { alive = false; window.clearInterval(id); }; - }, [joinedPodId]); + }, [isSignedIn, joinedPodId]); useEffect(() => { + if (!isSignedIn) return; const routedPodId = pathPodId(); const raw = sessionStorage.getItem(SESSION_KEY); if (!raw) { - if (routedPodId) { - setError(`Enter your name to join ${routedPodId}.`); - } return; } let saved: { podId: string; member: string }; @@ -162,10 +200,11 @@ export default function App() { setRestoring(false); } })(); - }, []); + }, [isSignedIn]); useEffect(() => { const onPopState = () => { + if (!isSignedIn) return; const routedPodId = pathPodId(); if (!routedPodId) { room?.disconnect(); @@ -186,7 +225,7 @@ export default function App() { }; window.addEventListener('popstate', onPopState); return () => window.removeEventListener('popstate', onPopState); - }, [joinedPodId, room]); + }, [isSignedIn, joinedPodId, room]); async function run(key: string, fn: () => Promise) { startPending(key); @@ -206,7 +245,7 @@ export default function App() { startPending('new'); setError(null); try { - const created = await api.createPod(input); + const created = await api.createPod(input, currentUserProfile); setPods((cur) => [...cur, created]); } catch (e) { setError((e as Error).message); @@ -225,7 +264,7 @@ export default function App() { if (pathPodId() === id) setHomePath(); }); const handleAddMember = (id: string, name: string) => - run(id, async () => upsert(await api.addMember(id, name))); + run(id, async () => upsert(await api.addMember(id, name, currentUserProfile))); const handleRemoveMember = (id: string, name: string) => run(id, async () => upsert(await api.removeMember(id, name))); @@ -241,12 +280,15 @@ export default function App() { } } - async function handleAddAndJoin(pod: Pod, name: string) { + async function handleAddAndJoin(pod: Pod) { startPending(pod.id); setError(null); try { - upsert(await api.addMember(pod.id, name)); - await connectToPod(pod.id, name); + if (!defaultMemberName) { + throw new Error('Sign in with Clerk before joining a pod.'); + } + upsert(await api.addMember(pod.id, defaultMemberName, currentUserProfile)); + await connectToPod(pod.id, defaultMemberName); } catch (e) { setError((e as Error).message); } finally { @@ -265,9 +307,28 @@ export default function App() { const showReconnecting = restoring || (joinedPodId !== null && joinedPod === null); + if (!isLoaded) { + return ( +
+ +
+ ); + } + + if (!isSignedIn) { + return ; + } + if (joinedPod) { return ( - + ); } @@ -289,10 +350,23 @@ export default function App() { - +
+ + + + + + + + + + + + +
@@ -342,6 +416,7 @@ export default function App() { pod={pod} busy={pending.has(pod.id)} presence={presence[pod.id] ?? []} + currentUserProfile={currentUserProfile} onJoin={handleJoin} onAddAndJoin={handleAddAndJoin} onAddMember={handleAddMember} @@ -362,14 +437,23 @@ export default function App() { Create the first room for this team. - + )} )} @@ -378,6 +462,43 @@ export default function App() { ); } +function AuthGate() { + return ( +
+
+
+
+
+ PM +
+

PodMan

+
+ + + +
+ +
+
+

Team memory

+

+ Create your account to enter PodMan +

+

+ PodMan saves your context across pods so agents can learn from your work in every + room you join. +

+
+ +
+ +
+
+
+
+ ); +} + function PodSkeleton() { return ( diff --git a/frontend/src/components/CreatePodForm.tsx b/frontend/src/components/CreatePodForm.tsx index a3746ef..a9daf13 100644 --- a/frontend/src/components/CreatePodForm.tsx +++ b/frontend/src/components/CreatePodForm.tsx @@ -17,17 +17,19 @@ import { cn } from '@/lib/utils'; export function CreatePodForm({ busy, onCreate, + defaultMemberName = '', compact = false, }: { busy: boolean; onCreate: (input: PodInput) => Promise; + defaultMemberName?: string; compact?: boolean; }) { const [open, setOpen] = useState(compact); const [name, setName] = useState(''); const [repo, setRepo] = useState('karti-ai/podman'); const [description, setDescription] = useState(''); - const [firstMember, setFirstMember] = useState(''); + const [firstMember, setFirstMember] = useState(defaultMemberName); async function submit() { if (!name.trim()) return; @@ -40,7 +42,7 @@ export function CreatePodForm({ }); setName(''); setDescription(''); - setFirstMember(''); + setFirstMember(defaultMemberName); if (!compact) setOpen(false); } catch { /* parent owns the visible error */ diff --git a/frontend/src/components/PodCard.tsx b/frontend/src/components/PodCard.tsx index 8cb7783..535ec97 100644 --- a/frontend/src/components/PodCard.tsx +++ b/frontend/src/components/PodCard.tsx @@ -7,7 +7,13 @@ import { VideoIcon, } from 'lucide-react'; import type { Pod, PodInput } from '@podman/shared'; -import { Avatar, AvatarBadge, AvatarFallback, AvatarGroup } from '@/components/ui/avatar'; +import { + Avatar, + AvatarBadge, + AvatarFallback, + AvatarGroup, + AvatarImage, +} from '@/components/ui/avatar'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { @@ -41,6 +47,7 @@ export function PodCard({ pod, busy, presence, + currentUserProfile, onJoin: _onJoin, onAddAndJoin, onAddMember: _onAddMember, @@ -52,15 +59,19 @@ export function PodCard({ pod: Pod; busy: boolean; presence: string[]; + currentUserProfile?: { + displayName: string; + email?: string; + imageUrl?: string; + }; onJoin: (pod: Pod, member: string) => void; - onAddAndJoin: (pod: Pod, name: string) => void; + onAddAndJoin: (pod: Pod) => void; onAddMember: (id: string, name: string) => void; onRemoveMember: (id: string, name: string) => void; onUpdate: (id: string, patch: PodInput) => void; onDelete: (id: string) => void; onOpenGraph: (id: string) => void; }) { - const [newMember, setNewMember] = useState(''); const [editing, setEditing] = useState(false); const [draft, setDraft] = useState({ name: pod.name, @@ -69,6 +80,13 @@ export function PodCard({ }); const inRoom = (name: string) => presence.some((p) => p.toLowerCase() === name.toLowerCase()); + const profileForMember = (name: string) => + pod.memberProfiles?.[name] ?? + ([currentUserProfile?.displayName, currentUserProfile?.email] + .filter(Boolean) + .some((value) => value?.toLowerCase() === name.toLowerCase()) + ? currentUserProfile + : undefined); const active = presence.length > 0; function saveEdit() { @@ -80,13 +98,8 @@ export function PodCard({ setEditing(false); } - // One action: enter your name, hit Join → added to the roster (deduped - // server-side) and connected to the room in a single step. function join() { - const name = newMember.trim(); - if (!name) return; - onAddAndJoin(pod, name); - setNewMember(''); + onAddAndJoin(pod); } return ( @@ -143,12 +156,16 @@ export function PodCard({
- {pod.members.slice(0, 4).map((member) => ( - - {initials(member)} - {inRoom(member) && } - - ))} + {pod.members.slice(0, 4).map((member) => { + const profile = profileForMember(member); + return ( + + {profile?.imageUrl && } + {initials(member)} + {inRoom(member) && } + + ); + })} {pod.members.length > 4 && +}
@@ -157,16 +174,8 @@ export function PodCard({
-
- setNewMember(e.target.value)} - onKeyDown={(e) => { - if (e.key === 'Enter') join(); - }} - /> - diff --git a/frontend/src/components/PodView.tsx b/frontend/src/components/PodView.tsx index 2b5273d..119234d 100644 --- a/frontend/src/components/PodView.tsx +++ b/frontend/src/components/PodView.tsx @@ -56,7 +56,7 @@ import { import { useInterventions, primeSpeech } from '../livekit/useInterventions.js'; import { usePodActivity } from '../hooks/use-pod-activity.js'; import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; -import { Avatar, AvatarBadge, AvatarFallback } from '@/components/ui/avatar'; +import { Avatar, AvatarBadge, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { @@ -100,24 +100,46 @@ const STREAM_RAIL_WIDTH = '4rem'; interface PInfo { id: string; name: string; + email?: string; + imageUrl?: string; isLocal: boolean; speaking: boolean; } +function profileFromMetadata(metadata?: string): { email?: string; imageUrl?: string } { + try { + const parsed = JSON.parse(metadata || '{}') as { email?: unknown; imageUrl?: unknown }; + return { + email: typeof parsed.email === 'string' ? parsed.email : undefined, + imageUrl: typeof parsed.imageUrl === 'string' ? parsed.imageUrl : undefined, + }; + } catch { + return {}; + } +} + function snapshot(room: Room, fallbackName: string): PInfo[] { const lp = room.localParticipant; + const localProfile = profileFromMetadata(lp.metadata); const local: PInfo = { id: lp.identity, name: lp.name || fallbackName, + email: localProfile.email, + imageUrl: localProfile.imageUrl, isLocal: true, speaking: lp.isSpeaking, }; - const remotes = Array.from(room.remoteParticipants.values()).map((p) => ({ - id: p.identity, - name: p.name || p.identity, - isLocal: false, - speaking: p.isSpeaking, - })); + const remotes = Array.from(room.remoteParticipants.values()).map((p) => { + const profile = profileFromMetadata(p.metadata); + return { + id: p.identity, + name: p.name || p.identity, + email: profile.email, + imageUrl: profile.imageUrl, + isLocal: false, + speaking: p.isSpeaking, + }; + }); return [local, ...remotes]; } @@ -136,11 +158,17 @@ export function PodView({ room, devMode, onLeave, + currentUserProfile, }: { team: Pod; me: string; room: Room | null; devMode: boolean; + currentUserProfile?: { + displayName: string; + email?: string; + imageUrl?: string; + }; onLeave: () => void; }) { const [participants, setParticipants] = useState([]); @@ -241,6 +269,7 @@ export function PodView({ room .on(RoomEvent.ParticipantConnected, refresh) .on(RoomEvent.ParticipantDisconnected, refresh) + .on(RoomEvent.ParticipantMetadataChanged, refresh) .on(RoomEvent.ActiveSpeakersChanged, refresh) .on(RoomEvent.TrackSubscribed, onAudio) .on(RoomEvent.TrackUnsubscribed, onAudioGone) @@ -252,6 +281,7 @@ export function PodView({ room .off(RoomEvent.ParticipantConnected, refresh) .off(RoomEvent.ParticipantDisconnected, refresh) + .off(RoomEvent.ParticipantMetadataChanged, refresh) .off(RoomEvent.ActiveSpeakersChanged, refresh) .off(RoomEvent.TrackSubscribed, onAudio) .off(RoomEvent.TrackUnsubscribed, onAudioGone) @@ -738,6 +768,8 @@ export function PodView({ ))} @@ -969,11 +1001,28 @@ export function PodView({ function Participant({ participant, + rosterProfile, + currentUserProfile, onOpenHistory, }: { participant: PInfo; + rosterProfile?: { + displayName: string; + email?: string; + imageUrl?: string; + }; + currentUserProfile?: { + displayName: string; + email?: string; + imageUrl?: string; + }; onOpenHistory: (member: string) => void; }) { + const localProfile = participant.isLocal ? currentUserProfile : undefined; + const profile = { + email: participant.email ?? localProfile?.email ?? rosterProfile?.email, + imageUrl: participant.imageUrl ?? localProfile?.imageUrl ?? rosterProfile?.imageUrl, + }; return (
+ {profile.imageUrl && } {initials(participant.name)} {participant.speaking && }

{participant.name}

-

{participant.isLocal ? 'you' : 'remote'}

+

+ {profile.email ?? (participant.isLocal ? 'you' : 'remote')} +

diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api.ts index 37bc135..801ab0a 100644 --- a/frontend/src/lib/api.ts +++ b/frontend/src/lib/api.ts @@ -14,11 +14,34 @@ const BACKEND_URL = ? 'http://localhost:8787' : ''); +type AuthTokenGetter = () => Promise; + +let authTokenGetter: AuthTokenGetter | null = null; + +export function setAuthTokenGetter(getter: AuthTokenGetter | null): void { + authTokenGetter = getter; +} + +async function requestHeaders(init?: HeadersInit): Promise { + const next = new Headers(init); + const token = await authTokenGetter?.(); + if (token) next.set('authorization', `Bearer ${token}`); + return next; +} + +async function apiFetch(input: string, init: RequestInit = {}): Promise { + return fetch(input, { + ...init, + headers: await requestHeaders(init.headers), + }); +} + export interface MemoryStats { observations: number; collisions: number; interventions: number; outcomes: number; + userPodContext?: number; } export interface LiveConversationSession { @@ -34,6 +57,12 @@ export interface LiveConversationSession { endedAt?: string; } +export interface UserProfilePayload { + displayName?: string; + email?: string; + imageUrl?: string; +} + async function json(res: Response): Promise { if (!res.ok) { const body = (await res.json().catch(() => ({}))) as { error?: string }; @@ -42,16 +71,19 @@ async function json(res: Response): Promise { return res.json() as Promise; } +const JSON_HEADERS = { 'content-type': 'application/json' } as const; + /** Mint a LiveKit token from the backend. */ export async function fetchToken(params: { room: string; identity: string; name: string; githubLogin?: string; + profile?: UserProfilePayload; }): Promise<{ token: string; url: string }> { - const res = await fetch(`${BACKEND_URL}/api/token`, { + const res = await apiFetch(`${BACKEND_URL}/api/token`, { method: 'POST', - headers: { 'content-type': 'application/json' }, + headers: JSON_HEADERS, body: JSON.stringify(params), }); return json(res); @@ -59,9 +91,9 @@ export async function fetchToken(params: { /** Record an intervention outcome for the policy learning loop. */ export async function postOutcome(outcome: InterventionOutcome): Promise { - const res = await fetch(`${BACKEND_URL}/api/outcome`, { + const res = await apiFetch(`${BACKEND_URL}/api/outcome`, { method: 'POST', - headers: { 'content-type': 'application/json' }, + headers: JSON_HEADERS, body: JSON.stringify(outcome), }); if (!res.ok) throw new Error(`outcome post failed: ${res.status}`); @@ -73,9 +105,9 @@ export async function createSyncPr(input: { summary?: string; }): Promise<{ url: string; number: number }> { return json( - await fetch(`${BACKEND_URL}/api/sync-pr`, { + await apiFetch(`${BACKEND_URL}/api/sync-pr`, { method: 'POST', - headers: { 'content-type': 'application/json' }, + headers: JSON_HEADERS, body: JSON.stringify(input), }), ); @@ -84,21 +116,21 @@ export async function createSyncPr(input: { // --- Pods CRUD --- export async function listPods(): Promise { - return json(await fetch(`${BACKEND_URL}/api/pods`)); + return json(await apiFetch(`${BACKEND_URL}/api/pods`)); } /** Display names currently connected per pod id (= LiveKit room name). */ export async function getPresence(): Promise> { - return json(await fetch(`${BACKEND_URL}/api/presence`)); + return json(await apiFetch(`${BACKEND_URL}/api/presence`)); } export async function getMemoryStats(): Promise { - return json(await fetch(`${BACKEND_URL}/api/memory/stats`)); + return json(await apiFetch(`${BACKEND_URL}/api/memory/stats`)); } export async function getPodActivity(id: string, limit = 80): Promise { return json( - await fetch(`${BACKEND_URL}/api/pods/${encodeURIComponent(id)}/activity?limit=${limit}`), + await apiFetch(`${BACKEND_URL}/api/pods/${encodeURIComponent(id)}/activity?limit=${limit}`), ); } @@ -116,7 +148,7 @@ export async function getMemberWorkHistory( member: string, ): Promise { return json( - await fetch( + await apiFetch( `${BACKEND_URL}/api/pods/${encodeURIComponent(podId)}/members/${encodeURIComponent( member, )}/history?hours=24&limit=80`, @@ -124,47 +156,51 @@ export async function getMemberWorkHistory( ); } -export async function createPod(input: PodInput): Promise { +export async function createPod(input: PodInput, profile?: UserProfilePayload): Promise { return json( - await fetch(`${BACKEND_URL}/api/pods`, { + await apiFetch(`${BACKEND_URL}/api/pods`, { method: 'POST', - headers: { 'content-type': 'application/json' }, - body: JSON.stringify(input), + headers: JSON_HEADERS, + body: JSON.stringify({ ...input, profile }), }), ); } export async function updatePod(id: string, patch: PodInput): Promise { return json( - await fetch(`${BACKEND_URL}/api/pods/${encodeURIComponent(id)}`, { + await apiFetch(`${BACKEND_URL}/api/pods/${encodeURIComponent(id)}`, { method: 'PATCH', - headers: { 'content-type': 'application/json' }, + headers: JSON_HEADERS, body: JSON.stringify(patch), }), ); } export async function deletePod(id: string): Promise { - const res = await fetch(`${BACKEND_URL}/api/pods/${encodeURIComponent(id)}`, { + const res = await apiFetch(`${BACKEND_URL}/api/pods/${encodeURIComponent(id)}`, { method: 'DELETE', }); if (!res.ok) throw new Error(`delete pod failed: ${res.status}`); } -export async function addMember(id: string, name: string): Promise { +export async function addMember( + id: string, + name: string, + profile?: UserProfilePayload, +): Promise { return json( - await fetch(`${BACKEND_URL}/api/pods/${encodeURIComponent(id)}/members`, { + await apiFetch(`${BACKEND_URL}/api/pods/${encodeURIComponent(id)}/members`, { method: 'POST', - headers: { 'content-type': 'application/json' }, - body: JSON.stringify({ name }), + headers: JSON_HEADERS, + body: JSON.stringify({ name, profile }), }), ); } export async function testPodVoice(id: string): Promise { - const res = await fetch(`${BACKEND_URL}/api/pods/${encodeURIComponent(id)}/voice-test`, { + const res = await apiFetch(`${BACKEND_URL}/api/pods/${encodeURIComponent(id)}/voice-test`, { method: 'POST', - headers: { 'content-type': 'application/json' }, + headers: JSON_HEADERS, body: JSON.stringify({ message: 'PodMan voice test. Gemini TTS is playing through LiveKit.', }), @@ -177,16 +213,16 @@ export async function startLiveConversation( input: { identity: string; displayName?: string }, ): Promise { return json( - await fetch(`${BACKEND_URL}/api/pods/${encodeURIComponent(podId)}/live-conversation/start`, { + await apiFetch(`${BACKEND_URL}/api/pods/${encodeURIComponent(podId)}/live-conversation/start`, { method: 'POST', - headers: { 'content-type': 'application/json' }, + headers: JSON_HEADERS, body: JSON.stringify(input), }), ); } export async function stopLiveConversation(podId: string, sessionId: string): Promise { - const res = await fetch( + const res = await apiFetch( `${BACKEND_URL}/api/pods/${encodeURIComponent( podId, )}/live-conversation/${encodeURIComponent(sessionId)}/stop`, @@ -200,7 +236,7 @@ export async function getLiveConversationHermesJob( sessionId: string, ): Promise<{ job: HermesJob | null; events: HermesJobEvent[] }> { return json( - await fetch( + await apiFetch( `${BACKEND_URL}/api/pods/${encodeURIComponent( podId, )}/live-conversation/${encodeURIComponent(sessionId)}/hermes-job`, @@ -213,7 +249,7 @@ export async function abortLiveConversationHermesJob( sessionId: string, ): Promise<{ job: HermesJob | null }> { return json( - await fetch( + await apiFetch( `${BACKEND_URL}/api/pods/${encodeURIComponent( podId, )}/live-conversation/${encodeURIComponent(sessionId)}/hermes-job/abort`, @@ -224,7 +260,7 @@ export async function abortLiveConversationHermesJob( export async function removeMember(id: string, name: string): Promise { return json( - await fetch( + await apiFetch( `${BACKEND_URL}/api/pods/${encodeURIComponent(id)}/members/${encodeURIComponent(name)}`, { method: 'DELETE' }, ), diff --git a/frontend/src/lib/pod.ts b/frontend/src/lib/pod.ts index 9d2d5ea..a9f1e0b 100644 --- a/frontend/src/lib/pod.ts +++ b/frontend/src/lib/pod.ts @@ -11,11 +11,17 @@ export async function fetchPodToken( podId: string, identity: string, name: string, + getToken?: () => Promise, + profile?: { displayName?: string; email?: string; imageUrl?: string }, ): Promise<{ token: string; url: string }> { + const clerkToken = await getToken?.(); const res = await fetch(`${BACKEND_URL}/api/token`, { method: 'POST', - headers: { 'content-type': 'application/json' }, - body: JSON.stringify({ room: podId, identity, name }), + headers: { + 'content-type': 'application/json', + ...(clerkToken ? { authorization: `Bearer ${clerkToken}` } : {}), + }, + body: JSON.stringify({ room: podId, identity, name, profile }), }); if (!res.ok) throw new Error(`token request failed: ${res.status}`); return res.json(); @@ -33,8 +39,14 @@ export type JoinResult = { mode: 'live'; room: Room } | { mode: 'dev'; room: nul * connected — screen sharing is a separate, deliberate action (see PodView) so * a denied/slow screen prompt never blocks or fails the join. */ -export async function joinPod(podId: string, identity: string, name: string): Promise { - const { token, url } = await fetchPodToken(podId, identity, name); +export async function joinPod( + podId: string, + identity: string, + name: string, + getToken?: () => Promise, + profile?: { displayName?: string; email?: string; imageUrl?: string }, +): Promise { + const { token, url } = await fetchPodToken(podId, identity, name, getToken, profile); if (!isLiveKitConfigured(url)) { console.warn('[podman] LiveKit not configured — dev mock join'); diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index c8bd0ca..e2082d5 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -1,13 +1,24 @@ import { StrictMode } from 'react'; import { createRoot } from 'react-dom/client'; +import { ClerkProvider } from '@clerk/react'; +import { shadcn } from '@clerk/ui/themes'; import App from './App.js'; import './index.css'; +import '@clerk/ui/themes/shadcn.css'; import { TooltipProvider } from '@/components/ui/tooltip'; +const clerkPublishableKey = import.meta.env.VITE_CLERK_PUBLISHABLE_KEY; + +if (!clerkPublishableKey) { + throw new Error('Missing VITE_CLERK_PUBLISHABLE_KEY'); +} + createRoot(document.getElementById('root')!).render( - - - + + + + + , ); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bfe00c3..ffdb34b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42,9 +42,12 @@ importers: backend: dependencies: + '@clerk/express': + specifier: ^2.1.32 + version: 2.1.32(express@5.2.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@google/genai': specifier: ^2.10.0 - version: 2.10.0(@modelcontextprotocol/sdk@1.29.0(zod@3.25.76)) + version: 2.10.0(@modelcontextprotocol/sdk@1.29.0(zod@3.25.76))(bufferutil@4.1.0)(utf-8-validate@6.0.6) '@livekit/rtc-node': specifier: ^0.13.29 version: 0.13.29 @@ -74,7 +77,7 @@ importers: version: 0.35.2 ws: specifier: ^8.21.0 - version: 8.21.0 + version: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) devDependencies: '@types/cors': specifier: ^2.8.19 @@ -94,6 +97,12 @@ importers: '@base-ui/react': specifier: ^1.6.0 version: 1.6.0(@date-fns/tz@1.5.0)(@types/react@19.2.17)(date-fns@4.4.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@clerk/react': + specifier: ^6.11.1 + version: 6.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@clerk/ui': + specifier: ^1.23.0 + version: 1.23.0(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6))(@types/react@19.2.17)(bs58@6.0.0)(bufferutil@4.1.0)(react-dom@19.2.7(react@19.2.7))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.7)(utf-8-validate@6.0.6))(react@19.2.7)(typescript@6.0.3)(utf-8-validate@6.0.6) '@fontsource-variable/geist': specifier: ^5.2.9 version: 5.2.9 @@ -150,7 +159,7 @@ importers: version: 3.8.0(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@19.2.7)(react@19.2.7)(redux@5.0.1) shadcn: specifier: ^4.12.0 - version: 4.12.0(typescript@6.0.3) + version: 4.12.0(babel-plugin-macros@3.1.0)(typescript@6.0.3) sonner: specifier: ^2.0.7 version: 2.0.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7) @@ -166,7 +175,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.3.1 - version: 4.3.1(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4)) + version: 4.3.1(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) '@types/react': specifier: ^19.2.17 version: 19.2.17 @@ -175,16 +184,16 @@ importers: version: 19.2.3(@types/react@19.2.17) '@vitejs/plugin-react': specifier: ^6.0.3 - version: 6.0.3(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4)) + version: 6.0.3(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0)) tailwindcss: specifier: ^4.3.1 version: 4.3.1 vite: specifier: ^8.1.0 - version: 8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4) + version: 8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) vite-plugin-pwa: specifier: ^1.3.0 - version: 1.3.0(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4))(workbox-build@7.4.1)(workbox-window@7.4.1) + version: 1.3.0(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(workbox-build@7.4.1)(workbox-window@7.4.1) shared: {} @@ -751,6 +760,46 @@ packages: '@bufbuild/protobuf@1.10.1': resolution: {integrity: sha512-wJ8ReQbHxsAfXhrf9ixl0aYbZorRuOWpBNzm8pL8ftmSxQx/wnJD5Eg861NwJU/czy2VXFIebCeZnZrI9rktIQ==} + '@clerk/backend@3.8.4': + resolution: {integrity: sha512-3G+kEu8kalqQokJ/n0IynhBh2i6TtiilRzuAg5UWMburkK658/elrG0Uqsapd5yKhmkNuvizHwOPWwKAMxP2EQ==} + engines: {node: '>=20.9.0'} + + '@clerk/express@2.1.32': + resolution: {integrity: sha512-chRYrGqugF6ABZCsnr5724yzLK08HHb0QSo+6wrgFMTId/FjOJ/7diUqYsan1vnO5o84Jp8rsD9v5t4BpVkAfA==} + engines: {node: '>=20.9.0'} + peerDependencies: + express: ^4.17.0 || ^5.0.0 + + '@clerk/localizations@4.11.0': + resolution: {integrity: sha512-Sm2Ms54PqikwKcHxPcDnhsqHJfCjmrWuCvLlB2UIqfYk0ADrlsHruZD+6ke75YD89h7G3+1V7Y8/soWYD4HHTQ==} + engines: {node: '>=20.9.0'} + + '@clerk/react@6.11.1': + resolution: {integrity: sha512-iEWckisZa/V3siCFlvGTNg7Yj+kndRx7HKBZ/QMSd6uEU9kd2tZ8Ymvd4GFPCpClwcki4h7jC750FujN656Jqg==} + engines: {node: '>=20.9.0'} + peerDependencies: + react: ^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0 + react-dom: ^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0 + + '@clerk/shared@4.22.0': + resolution: {integrity: sha512-GZ56kzUB2UBb8MCF+Eo8WIey+W4RP1tAkyOL+geiHxrQxJlUcgD+xalY2YPJLH8WVFwtOnfIl8KPEo0M0e/DRg==} + engines: {node: '>=20.9.0'} + peerDependencies: + react: ^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0 + react-dom: ^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@clerk/ui@1.23.0': + resolution: {integrity: sha512-fcFhQ6MguttDbmjpPKZSsjvy8wWpG2uoMym49ztz2GOuMfNFFkxA5aL653Jdnd4vFlZMGBZIbieSqbawdN8gtA==} + engines: {node: '>=20.9.0'} + peerDependencies: + react: ^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0 + react-dom: ^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0 + '@datastructures-js/deque@1.0.8': resolution: {integrity: sha512-PSBhJ2/SmeRPRHuBv7i/fHWIdSC3JTyq56qb+Rq0wjOagi0/fdV5/B/3Md5zFZus/W6OkSPMaxMKKMNMrSmubg==} @@ -773,6 +822,50 @@ packages: '@emnapi/wasi-threads@1.2.2': resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + '@emotion/babel-plugin@11.13.5': + resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} + + '@emotion/cache@11.11.0': + resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@emotion/memoize@0.8.1': + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + + '@emotion/react@11.11.1': + resolution: {integrity: sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.3.3': + resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} + + '@emotion/sheet@1.4.0': + resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} + + '@emotion/unitless@0.10.0': + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + + '@emotion/use-insertion-effect-with-fallbacks@1.2.0': + resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/utils@1.4.2': + resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} + + '@emotion/weak-memoize@0.3.1': + resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + '@esbuild/aix-ppc64@0.28.1': resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} engines: {node: '>=18'} @@ -980,12 +1073,21 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' + '@floating-ui/react@0.27.12': + resolution: {integrity: sha512-kKlWNrpIQxF1B/a2MZvE0/uyKby4960yjO91W7nVyNKmmfNi62xU9HCjL1M1eWzx/LFj/VPSwJVbwQk9Pq/68A==} + peerDependencies: + react: '>=17.0.0' + react-dom: '>=17.0.0' + '@floating-ui/utils@0.2.11': resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} '@fontsource-variable/geist@5.2.9': resolution: {integrity: sha512-TP+QSBG3wxKGPE33CbMy/L0Nu3qvJ6Fy81Yc4LnQ95xH+i+cfEp8fyU8/kfV14YwszxIFPhnoMTbjL71waVpyQ==} + '@formkit/auto-animate@0.8.4': + resolution: {integrity: sha512-DHHC01EJ1p70Q0z/ZFRBIY8NDnmfKccQoyoM84Tgb6omLMat6jivCdf272Y8k3nf4Lzdin/Y4R9q8uFtU0GbnA==} + '@google/genai@2.10.0': resolution: {integrity: sha512-e4cFxj3tiuMtsgOT4G9c1hXyGJhg7/Buj7VVeBacRY3fRtkRZZ59Q3nuVp2xbq8BGQXLXCDB253qMhklMOeUDg==} engines: {node: '>=20.0.0'} @@ -1187,6 +1289,18 @@ packages: resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} engines: {node: '>=18'} + '@isaacs/ttlcache@1.4.1': + resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} + engines: {node: '>=12'} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1277,6 +1391,14 @@ packages: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 + '@noble/curves@1.9.7': + resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} + 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'} @@ -2119,6 +2241,67 @@ packages: '@radix-ui/rect@1.1.2': resolution: {integrity: sha512-xnXE7wG13PI+cxieVssYXlQJuYVRhH9NBoxt3KNwzghDIA69GMm7d4wXRouHIYjE+KvS6U/MsMO73NdS2MH9ZA==} + '@react-native-async-storage/async-storage@1.24.0': + resolution: {integrity: sha512-W4/vbwUOYOjco0x3toB8QCr7EjIP6nE9G7o8PMguvvjYT5Awg09lyV4enACRx4s++PPulBiBSjL0KTFx2u0Z/g==} + peerDependencies: + react-native: ^0.0.0-0 || >=0.60 <1.0 + + '@react-native/assets-registry@0.86.0': + resolution: {integrity: sha512-nIaXbm2jX1OTYp0qbviJ3O6KZivoE8z3BnhUQ2LsqfZSWRoOK/n1qsiAr6oALiNKWnXY3j2KPwtYORnZzp8xew==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + '@react-native/codegen@0.86.0': + resolution: {integrity: sha512-uTs9DBo3+/lUqinsGZK0FKJRBVClrwMXoZToaDxE1Q2SL2e55vs2GwyZfIKzPl5uJnbu4PfFMIp0/mLXLWUMuA==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + peerDependencies: + '@babel/core': '*' + + '@react-native/community-cli-plugin@0.86.0': + resolution: {integrity: sha512-Jv8p1ebEPfTzs8gmrjsdT2XMXFfeAg45Pman+XPLFGaSeGAZkutRFRyX9Cs9aGTSOyIA9YPJ6vDNb1ayTf1FKQ==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + peerDependencies: + '@react-native-community/cli': '*' + '@react-native/metro-config': 0.86.0 + peerDependenciesMeta: + '@react-native-community/cli': + optional: true + '@react-native/metro-config': + optional: true + + '@react-native/debugger-frontend@0.86.0': + resolution: {integrity: sha512-7Mb3nDfyJeys+ELF75Ageu7VKERlnIMoO+aNPoXqTXvz+b41L6l2CqMyLpDHxkBSlenij6gEepPNgaIyWHbJZw==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + '@react-native/debugger-shell@0.86.0': + resolution: {integrity: sha512-Y0zEkZzLz8ou6o/VLml1A31X/rMgc6DRjwxwzPMa94qRTMY070WeBCNTITQo4kKTBAUgbxh07oXPQqp0Tpja8w==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + '@react-native/dev-middleware@0.86.0': + resolution: {integrity: sha512-20pTO6yTybmvXvro520H6C7jydIQnLKOl5qFtVEcHSdFrY63r3OGei+Rx9bILgSRmH6jgnfEcijcMx7pwWuQtw==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + '@react-native/gradle-plugin@0.86.0': + resolution: {integrity: sha512-a1RcfaEDqWExCGfCwadIxt4l8FvKYgFqeMf2uzeKyAOnb+vTGNIeCvifFL2MqvgaeYxlER437HbMIajGcuJ1pQ==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + '@react-native/js-polyfills@0.86.0': + resolution: {integrity: sha512-zYy/Cjd1VTnZ2iCNaG9bDF9C3l2ntESiPRscjIlI5FKugu6aeTwsDSv1aI8Bc4Kp3vEdoVg+UQhLAhE4svREaQ==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + '@react-native/normalize-colors@0.86.0': + resolution: {integrity: sha512-kG0wfCGghUKlfxkJyyHCDVutWVYWK7/DG58ojA/4v9EfulgF+osuSQmlbNb3rcKX58qutm7JcldSeVLgGFha9g==} + + '@react-native/virtualized-lists@0.86.0': + resolution: {integrity: sha512-4/ZLXdf/OSpPDVO0AsQ1SJdRIzt5t9BNQ46QwGgxvX7/cirYR5k8KXctNGGgW8lQo2gZChEfY2zFCZg9nM/jiw==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + peerDependencies: + '@types/react': ^19.2.0 + react: '*' + react-native: 0.86.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@reduxjs/toolkit@2.12.0': resolution: {integrity: sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw==} peerDependencies: @@ -2429,16 +2612,506 @@ packages: react: optional: true + '@sinclair/typebox@0.27.10': + resolution: {integrity: sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==} + '@sindresorhus/merge-streams@4.0.0': resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} + '@solana-mobile/mobile-wallet-adapter-protocol-web3js@2.2.9': + resolution: {integrity: sha512-TAMItAuOb7duwYQ+PZ6JNqw/6TEhCWLObHF5uOBGV9tjCozHGVunxa7lTeuHAWIgO68IAo86MZdE5kethDATpw==} + peerDependencies: + '@solana/web3.js': ^1.98.4 + + '@solana-mobile/mobile-wallet-adapter-protocol@2.2.9': + resolution: {integrity: sha512-qtWJq0hzKgngVG0So2ViBRPYDculaxgj40WDSP1nzgdg85MXyAmTEjQqV10uSVbZRm9b1hl601HDJX1sHTgeiw==} + peerDependencies: + react-native: '>0.74' + + '@solana-mobile/wallet-adapter-mobile@2.2.9': + resolution: {integrity: sha512-IWzI2pUmEqBsTNo+XqMTY38NL5TSdMetES59N0Cmuf+zYqiS56rHdMwD/R2IOy7E4yKa1CsuHfCh6CE6zk4ViQ==} + peerDependencies: + '@solana/web3.js': ^1.98.4 + react-native: '>0.74' + + '@solana-mobile/wallet-standard-mobile@0.5.3': + resolution: {integrity: sha512-/Ea/CNIWHExpXsA6syVy7fUUhONtYob+VMsmF8flm8GEAZQyzX6UtKSy4NQMMTGBTAGlmmmbBVrZF+Tp5/fDxQ==} + + '@solana/accounts@6.10.0': + resolution: {integrity: sha512-+FxfDOrnifoPlBkF+fr8eeQdgM6xtIgAg9xKMu3WnIz60oZd4Xnry6+ff6t+ePPoZZp397FSg9ZJet68VCWm5Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/addresses@6.10.0': + resolution: {integrity: sha512-vEoCGBTxG0HCERAn84KXkrJjl+pDaNzOpZ0qbgcPS98fYxP5yzbKB8SNOY2bzrbkRUmmw5Q3hqTRERemUN2Gcw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/assertions@6.10.0': + resolution: {integrity: sha512-lKSAdVo+P/6Lp4vs6shstXmFOpvxrABwn4o1462tb7sKkNapk6o9pPFVPGw4DUgPS3WqWRs1j2tmpuVjhQRntg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.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@6.10.0': + resolution: {integrity: sha512-nfAl9OMGo4HanIMxGsQoVB7BxMoqBCYEUxl8oEAZZ09pDxnaXQZkTRXEwPPccag37XfW1ciPd1vWPKwB2b0HHQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/codecs-data-structures@6.10.0': + resolution: {integrity: sha512-CNasJW3bq5u+632Zt5aJ8rOjAjv2HyenpV8o9kAIqdmV4CBpjCCoBnKn8LkuR/sbeREZxJYfhKTXO/9ruAkw7A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.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@6.10.0': + resolution: {integrity: sha512-CcM+wX4zOiA9zkh8A7t1787A0Ehgmu5+6Z2tKoHew6cNw/dkaUTPa8JnNHbvfsLC8dfHC1BhAEJl86sKmRsfkQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/codecs-strings@6.10.0': + resolution: {integrity: sha512-zlaqkg7K6F6IN4V/Ec8TWkTn054gxv7ZLagvGkuEyAdPQ6BzzsehOm2TqCuyXgJJTCGPLY1bEk6yH9NxANe0kA==} + engines: {node: '>=20.18.0'} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: '>=5.4.0' + peerDependenciesMeta: + fastestsmallesttextencoderdecoder: + optional: true + typescript: + optional: true + + '@solana/codecs@6.10.0': + resolution: {integrity: sha512-lLVuxod4ChWp9i7OvpgIykYG8Q9OGPVXKnHM9VlzDDLylsx7Y1FoQL00sHa7PqFkJVmkBufaA6dcGbQ7FU+lAQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.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@6.10.0': + resolution: {integrity: sha512-KBLAxCtAXr357JNhCyIDQXWbuSj5vN6w+28FSfcYY6OOSiphmXLAV3V58jgV0C6iNbIzFJFi6yatFyDTdeJsNg==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/fast-stable-stringify@6.10.0': + resolution: {integrity: sha512-iCNed27wk6PKSS3QUtHovRfMWF/jbVWogs2vB4tukKUCsqG4rDfDInIwZ6ur/nY6XTrgi2gMMdZq9GAUlWsbfw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/fixed-points@6.10.0': + resolution: {integrity: sha512-ZkKL0alXH3L7/wMiVG8YUuG8qBKunlM810+YBD7nUPRhifiGsX1zwADViHLYNqLr/jUk0mTYFUcKznTpB/K+Gg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/functional@6.10.0': + resolution: {integrity: sha512-P8cevu4mAqHTXC37h1TVoOh8zhWB2tlOI/R9vWjYPpcLwcyWf8p2qq4LEGHl5kY+1C+4PNX39HsmCocXOPCDkQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/instruction-plans@6.10.0': + resolution: {integrity: sha512-YG7mo4zykzdc6ZTV0BuN6pveK9qeBySzlYYerq578A4eQu3xcypMAYRGAvhMZtWTanjjmD6CKtM0M7kVp0TNxg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/instructions@6.10.0': + resolution: {integrity: sha512-0TToYF+8LXQ3ofPMx+yF6yaM9l4YJvcAPMy0qV5JsrBUFlWXBSANRuudKBQLHMvb+a3OiUTq5X7omuorKMBB3A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/keys@6.10.0': + resolution: {integrity: sha512-26IRfdm/hTUCmM7MeEeX0ULSbCM6OzkZTkfkrPircqmRM7xyNqP4hq7u0P7wjb9dl7NfgyG6K7cdvUxrj2e3mA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/kit@6.10.0': + resolution: {integrity: sha512-/WnnQp3uARh2JCFSfAakejTAqwmXVuMVTcRn5r2yDwY2yzZ4R6mt/Cl59VPimVLNSoTyN/KsEwhv9omr3ERazQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/nominal-types@6.10.0': + resolution: {integrity: sha512-9ykyBBvnkInH7fCacjJi7zu2PJyd+OCt+VTjIISv070fHzKIMFqZqJJ/dJ0SRH2aHwfB3n86iVsmtBtuxi4KKA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/offchain-messages@6.10.0': + resolution: {integrity: sha512-RiEgAueeMkFMC1suOXBIcmCZgtXRxy24yk0DldPB37bB4zwOF1SAaRjNRPjIkGK8RhCYrEpPosnzLyavw9ueRg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/options@6.10.0': + resolution: {integrity: sha512-RO9UT3UYD8/Cu2uM6ZXbKvLeMnVD42+g9JRds7Pfs4AhiOyg4R4TJrQUAppTgavPTO3PBRlWtWOC05ZH/yAIbg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/plugin-core@6.10.0': + resolution: {integrity: sha512-JE70YTQOfFACVFGvoJon4Scc/eHUWjMu8Ovo35CcV2kHTAHYMCd4UkBd2gmlhK0vRMMomsQi1ZLPlAlTq0OoUQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/plugin-interfaces@6.10.0': + resolution: {integrity: sha512-vr0/l9wcM4orwGr8cjkFWaJ9A4HvzuAv00jMFNMg0Spd0GZqnwnpW+D/fXa1lIJnTRaF3EeEjLh4VjKU037T0Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/program-client-core@6.10.0': + resolution: {integrity: sha512-4PPbTLdC1ylHIuvhOFDP8RnSkXPCFjNFWGslzc+UFKnoR4ajzBcByX94jmaruDMk5ncxgj7tr9pzJTvfGHIaMA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/programs@6.10.0': + resolution: {integrity: sha512-qn/HeLP5KGUJXVub3fyGe69/rWaLX4jzwm6V/1pNxJDbdF+MBdgn18hP6F+VmhfdNmwK0lue3J/1HQ1UTMuQeQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/promises@6.10.0': + resolution: {integrity: sha512-oJSIn+VBBMWDo8oqw7RV3tI6Jih+Ieup6FcQLYLDUriaeo7+8l1Zdezl8zh7SIfeU4lOfAbRg6mR0huaS/Lltg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-api@6.10.0': + resolution: {integrity: sha512-RjPIVsAb/85P1ptoO3WpC0x7QG6gG/e4q/3lo6gbSznUZOcoM+8sSBnCX7BwP1ZkCDS6NK/ClXLnhhhYZx+OGg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-parsed-types@6.10.0': + resolution: {integrity: sha512-5275mvSV1mxhwvrMVa+K7BU/nAetpHfcb+8Ql9rtA8RRf6DyiimFQFZUukE4Ez6XJihEpCHNy98yhkgai9wytQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-spec-types@6.10.0': + resolution: {integrity: sha512-NDZrKyZrJk4HaMFhTE/lAiMB824cWAodKqDHyKi0UteHU9pyRmil3BN1jt7e+j08mwMWwfklSgyrTaq52g6DIQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-spec@6.10.0': + resolution: {integrity: sha512-yQdbWw5mZEWrwsunHR9NHkuhMXIB9sPOObwm18D53v5tAJnxTB0IcHvO647XqFDLTK/yQ4AdDtlYD1vsY07AMQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions-api@6.10.0': + resolution: {integrity: sha512-CRPQoTtT1cOwOQUsqS7jgo7wYdAj7jB5ab/UmMPWVpecf2FNMhWhgvxP2s82M7VkDGTGl13qaQ0WySmi7Egrlg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions-channel-websocket@6.10.0': + resolution: {integrity: sha512-KkqP1186HELPlJftA88SNAT2znR8knCVzsUipXVzY4zfW8sN3LOa0ePMzh9VZ/V+J+raTt55laR87ovAO0n+zw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions-spec@6.10.0': + resolution: {integrity: sha512-nWMwGaG4ulzeX2sskY5TywXF3cwEd8FDmUpLe2JBWxE8XDAOGOKcsYPYFcBgb8ee9KqfPT2PTNdcz9jOhJf34w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions@6.10.0': + resolution: {integrity: sha512-6mfuHp/K7unFKCOTCCBC9ziEGnxe2tyJ74EbR51QUnBeCUdYD7Hhdpxic1WRSJ3UeNW/mG4OzFM6z8Wi64Eh9Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-transformers@6.10.0': + resolution: {integrity: sha512-2nFUrVTiE720pJOY4XKx3HuYmishw0of/4oScu76YGm6O8wsmvFvPNAkrEinmieWXQkfpBfRvLZmpl8PaAy+ug==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-transport-http@6.10.0': + resolution: {integrity: sha512-JrdNuYi0nBbD3X8JUtgX1dQJwIwz/WJvmigDdELysXfGB2bTJpfjqGDLhCLOz2sRl66FASIEqgG/LVa2C9VXcA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-types@6.10.0': + resolution: {integrity: sha512-zaSecTfCPvz/vcoAmKD6XoRstGHTr1EKJBD8T9UcpEFFB6CtF6DxerDB+wrzkamuT6msmnR2DWXMrYOGDAsgIg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc@6.10.0': + resolution: {integrity: sha512-EwxsqoD+NXV+m+iobnWNtATD93gTgaNsOiQOzYB1/2e+8S6fl6obdNPB55yfXgtl4jt6GV6/ae4xuPhLv76vvg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/signers@6.10.0': + resolution: {integrity: sha512-+vtCc+mT1FpGxrA5oL2aaMxSHiMJ2hH5PcDIfjo2XJkHz2klZiCZyT5F9+zpltc9vdi1QTElQq59Sfplmtd33A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/subscribable@6.10.0': + resolution: {integrity: sha512-VsR6XMwkiDBkZJUcoGkEOhf397pOV75gKCL9Bx8bpi2T3Bbs0CxUpMn4yaUgAnRba3eXmjbXMNCXjttfa6sKbw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/sysvars@6.10.0': + resolution: {integrity: sha512-cG13p1+onxz+20iWjwWQr1Z1jQwPm0fnjoW75fqZq7p4rVCie3L2sXvaJsYPjWKrUvpOzOIEHnqZGkG05rCpjg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/transaction-confirmation@6.10.0': + resolution: {integrity: sha512-ULvtg65qfenh4T/GYcIlKSUv5EqDcng9UN0dxbHU4kuZdR2e0B8HN2xDC4WhcFQVeFJSbTZmaYFkeTY/Y4gfGQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/transaction-messages@6.10.0': + resolution: {integrity: sha512-s7v8G3BTxGlKYIj3eWCG0g1296v+1LBt16mVnlRH5FuyaJ5AdhlhtRho5HUDpdwE8EXun+y1c48V6uhcZ8wdbQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/transactions@6.10.0': + resolution: {integrity: sha512-VADSqP9OTYmhrox4pcgDd4+RjVmednXSE0+8Y7SPK4PN1pK5Az2RJ0nSsy0xcTnaOr8mF/crwFktqPrRQwSbQA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/wallet-adapter-base@0.9.27': + resolution: {integrity: sha512-kXjeNfNFVs/NE9GPmysBRKQ/nf+foSaq3kfVSeMcO/iVgigyRmB551OjU3WyAolLG/1jeEfKLqF9fKwMCRkUqg==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-react@0.15.39': + resolution: {integrity: sha512-WXtlo88ith5m22qB+qiGw301/Zb9r5pYr4QdXWmlXnRNqwST5MGmJWhG+/RVrzc+OG7kSb3z1gkVNv+2X/Y0Gg==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + react: '*' + + '@solana/wallet-standard-chains@1.1.2': + resolution: {integrity: sha512-EZobEGclDBAFplpJC5F3d/s8Xnlqc5isNKuPrd5o9ZPZ7tWN84O0e68yIZ8MAOj9V7ieRadNiHtql7uIXCTyXg==} + engines: {node: '>=22'} + + '@solana/wallet-standard-core@1.1.3': + resolution: {integrity: sha512-ZD0seJHb3A7QWOlwMECzq3vJR1Dg75+ZoW68lMyO1UfqH+AHMx0j5B6jdjbH3PFoqauU2q3RexWMcD4Jc7D9xA==} + engines: {node: '>=22'} + + '@solana/wallet-standard-features@1.4.0': + resolution: {integrity: sha512-f0tAdqwM2aL6CiFbIgt9h5zKFp+mgY/iNGwoxPMTj9VSTeQj7d1GGSmWhZw0XWoZ4N/1tnKTKmYFq+Dyq08jRw==} + engines: {node: '>=22'} + + '@solana/wallet-standard-util@1.1.3': + resolution: {integrity: sha512-aweR5y5FjYaeS9TkoqAWERFpGUj2MJepsDhcekCuoPLcNCquJL85Nsnuy01tBybspN5+Y09SWkxwsODOFGSfkg==} + engines: {node: '>=22'} + + '@solana/wallet-standard-wallet-adapter-base@1.1.5': + resolution: {integrity: sha512-dbk+4mJAsZ1a2R/v5/Qvp6SleviuSNWd9LnuQ0ekH0HRRJTOWyTBJsdQsVDdAymdPnLAaIN5J10ni1CT2Z+ERg==} + engines: {node: '>=22'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + bs58: ^6.0.0 + + '@solana/wallet-standard-wallet-adapter-react@1.1.5': + resolution: {integrity: sha512-JfKBU2Mc332pR+9xhxjr5U/Q2aL03mMmSbrcnvfvAjML6zUEzAQ/bV6DchRsdtAT8Rx0zEg8h4OhsXbmteu0Yg==} + engines: {node: '>=22'} + peerDependencies: + '@solana/wallet-adapter-base': '*' + react: '*' + + '@solana/wallet-standard-wallet-adapter@1.1.5': + resolution: {integrity: sha512-6EMRyXzLcXQY9P5Bo8XWh8It6lb4rUbwO+RDdSpEySz/v+ric0W9H3Yzlqted4AIXQMJgxZifgyFxTp6g/bfZA==} + engines: {node: '>=22'} + + '@solana/wallet-standard@1.1.4': + resolution: {integrity: sha512-NF+MI5tOxyvfTU4A+O5idh/gJFmjm52bMwsPpFGRSL79GECSN0XLmpVOO/jqTKJgac2uIeYDpQw/eMaQuWuUXw==} + engines: {node: '>=16'} + + '@solana/web3.js@1.98.4': + resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} + + '@stablelib/base64@1.0.1': + resolution: {integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==} + '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} + '@swc/helpers@0.5.21': + resolution: {integrity: sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==} + + '@swc/helpers@0.5.23': + resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==} + '@tailwindcss/node@4.3.1': resolution: {integrity: sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A==} @@ -2533,6 +3206,9 @@ packages: peerDependencies: vite: ^5.2.0 || ^6 || ^7 || ^8 + '@tanstack/query-core@5.101.2': + resolution: {integrity: sha512-hH5MLoJhF7KaIGd7q3xTXGXvslI+GYlM1Z/35aSHHWaCJWB7XvTSHYuV3eM7tw+aE0mT/xMro4M4Q9rCGHT0lw==} + '@trickfilm400/rollup-plugin-off-main-thread@3.0.0-pre1': resolution: {integrity: sha512-/67zpWDBLV+oYAEL682s1ktXL0HgqX76f6gaVGkGnVZlBbm1zd0v4Bz8MFF2GGhoX9rvfq3KSQHubFHwa6w6/Q==} engines: {node: '>=12'} @@ -2600,12 +3276,27 @@ packages: '@types/http-errors@2.0.5': resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + '@types/node@26.0.1': resolution: {integrity: sha512-fc3KiUoBt6kie0N9bIW3E47vZsuaMf0PM2AaUpLCLT0s/LvX1nxAim6Fc049cNxODPpGm6qRAuUOB86SkRuPQw==} + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + '@types/qs@6.15.1': resolution: {integrity: sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==} @@ -2638,6 +3329,9 @@ packages: '@types/use-sync-external-store@0.0.6': resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} + '@types/uuid@10.0.0': + resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + '@types/validate-npm-package-name@4.0.2': resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==} @@ -2647,9 +3341,18 @@ packages: '@types/whatwg-url@13.0.0': resolution: {integrity: sha512-N8WXpbE6Wgri7KUSvrmQcqrMllKZ9uxkYWMt+mCSGwNc0Hsw9VQTW7ApqI4XNrx6/SaM2QQJCzMPDEXE058s+Q==} + '@types/ws@7.4.7': + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.35': + resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} + '@typescript-eslint/eslint-plugin@8.62.0': resolution: {integrity: sha512-o+mpz7EYiMzXoySXiKmzlabIvTVqUuK5yLrAedRPRDA0IpPFMUV1IXt6OqljIxX/kumN6EjUYp41Hqelh6p/Dw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2722,6 +3425,35 @@ packages: babel-plugin-react-compiler: optional: true + '@wallet-standard/app@1.1.1': + resolution: {integrity: sha512-WDGwoByhP5gwHH01r5EaLgQdLVkACPCdOMQhmhn8rsm10h/siSgTorShzBxrn0ExSPof+Lu+C3TfgqBrPa1xoQ==} + engines: {node: '>=22'} + + '@wallet-standard/base@1.1.1': + resolution: {integrity: sha512-gggIHTtxicF9XFMQ12DkfS6NAG92Ak795JeSA7f2whAQ6Y3AkMWWuCMxSZXG2NIPN42kEaZSNVjqMsJRaJRxMQ==} + engines: {node: '>=22'} + + '@wallet-standard/core@1.1.2': + resolution: {integrity: sha512-QcVLGDkFtsWjTpkej2jx4FyP2cu+qOAW/lVnvlWjyhCkSEje6z+vEKURV5v+7L6IXjbze5pyFBe24yrPyoUuyw==} + engines: {node: '>=22'} + + '@wallet-standard/errors@0.1.2': + resolution: {integrity: sha512-oEzKUqJefKby6wcIvaJgrSEe/uNn/rnqkJ0P/85K+h0i5Tdo9E3L22VWq/j5K1e8hHMnZd6LgaIr8m/Wn7X/Ng==} + engines: {node: '>=22'} + hasBin: true + + '@wallet-standard/features@1.1.1': + resolution: {integrity: sha512-aCWYmVeSCGViyEU5k7GMoW8zxE4Gs+C1s1Pp2XLesvSNlnZ4PMES9HUnTB3hl0b3RVj7C61yze3IWyrncqg4MA==} + engines: {node: '>=22'} + + '@wallet-standard/wallet@1.1.1': + resolution: {integrity: sha512-8WiRPaKk/wNNRZhB2eVhpR/JW7/aqTCMoZhgVUCujuzDmxxmGvsosMxdCG4NAdYkoyozAHCX8/xLtlWUn5mNdQ==} + engines: {node: '>=22'} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + accepts@2.0.0: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} @@ -2740,6 +3472,10 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -2762,6 +3498,9 @@ packages: ajv@8.20.0: resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + anser@1.4.10: + resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -2774,6 +3513,14 @@ packages: 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'} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -2789,6 +3536,9 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + ast-types@0.16.1: resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} engines: {node: '>=4'} @@ -2816,6 +3566,10 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + babel-plugin-polyfill-corejs2@0.4.17: resolution: {integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==} peerDependencies: @@ -2831,6 +3585,9 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-syntax-hermes-parser@0.36.0: + resolution: {integrity: sha512-LhD0xdoedDw7ansQgXbB2DADLZIK/LRXuWNBPuVzMc5S2WK5GyT89tCM+cQzxFGO0mGyLK6D5TrVOJJzAoDy8Q==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -2838,6 +3595,12 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} + 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==} @@ -2852,10 +3615,16 @@ packages: bignumber.js@9.3.1: resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + bn.js@5.2.4: + resolution: {integrity: sha512-QL7sb18rJ1PbdsKsqPA0guxL563vIMwRHgzNrW/uzQuRGN1Cjqd/wonUBAVqHox9KwzHA6vCbM0lXx3k4iQMow==} + body-parser@2.3.0: resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} engines: {node: '>=18'} + borsh@0.7.0: + resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} + bottleneck@2.19.5: resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} @@ -2875,6 +3644,15 @@ packages: 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==} + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + bson@7.3.1: resolution: {integrity: sha512-h/C0qe6857pQhcSJHLfsR1uYGj98Ge3wKAD3Ed9KqH3wcVh+BM4Jq4xISD7vs9OPuT07n+q3QQVjslJ286j6ag==} engines: {node: '>=20.19.0'} @@ -2885,6 +3663,13 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + 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'} @@ -2913,6 +3698,14 @@ packages: resolution: {integrity: sha512-Rircqi9ch8AnZscQcsA1C47NFdaO3wukpmIRzYcDOrmvgt78hM/sj5pZhZNec2NM12uk5vTwRHZ4anGcrC4ZTg==} engines: {node: '>=16'} + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + camelcase@8.0.0: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} @@ -2920,10 +3713,29 @@ packages: caniuse-lite@1.0.30001799: resolution: {integrity: sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==} + 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} + chrome-launcher@0.15.2: + resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==} + engines: {node: '>=12.13.0'} + hasBin: true + + chromium-edge-launcher@0.3.0: + resolution: {integrity: sha512-p03azHlGjtyRvFEee3cyvtsRYdniSkwjkzmM/KmVnqT5d7QkkwpJBhis/zCLMYdQMVJ5tt140TBNqqrZPaWeFA==} + + ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} @@ -2935,6 +3747,13 @@ packages: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} + 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@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -2948,6 +3767,13 @@ packages: code-block-writer@13.0.3: resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -2955,10 +3781,22 @@ packages: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + commander@14.0.3: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} + commander@15.0.0: + resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==} + engines: {node: '>=22.12.0'} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -2970,6 +3808,10 @@ packages: resolution: {integrity: sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==} engines: {node: '>=12'} + connect@3.7.0: + resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} + engines: {node: '>= 0.10.0'} + content-disposition@1.1.0: resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} engines: {node: '>=18'} @@ -2982,6 +3824,9 @@ packages: resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==} engines: {node: '>=18'} + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -2993,13 +3838,23 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} + copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + core-js-compat@3.49.0: resolution: {integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==} + core-js@3.47.0: + resolution: {integrity: sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==} + cors@2.8.6: resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} engines: {node: '>= 0.10'} + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + cosmiconfig@9.0.2: resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==} engines: {node: '>=14'} @@ -3022,6 +3877,9 @@ packages: engines: {node: '>=4'} hasBin: true + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} @@ -3095,6 +3953,14 @@ packages: resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==} engines: {node: '>=10'} + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -3104,6 +3970,10 @@ packages: supports-color: optional: true + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + decimal.js-light@2.5.1: resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} @@ -3146,10 +4016,22 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + delay@5.0.0: + resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} + engines: {node: '>=10'} + 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'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -3161,6 +4043,9 @@ packages: resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} engines: {node: '>=0.3.1'} + dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + dot-prop@6.0.1: resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} engines: {node: '>=10'} @@ -3203,6 +4088,13 @@ packages: emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} @@ -3225,6 +4117,9 @@ packages: error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + es-abstract-get@1.0.0: resolution: {integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==} engines: {node: '>= 0.4'} @@ -3256,6 +4151,12 @@ packages: es-toolkit@1.49.0: resolution: {integrity: sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==} + 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@0.28.1: resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} engines: {node: '>=18'} @@ -3330,6 +4231,10 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} @@ -3353,6 +4258,9 @@ packages: resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} engines: {node: ^18.19.0 || >=20.5.0} + exponential-backoff@3.1.3: + resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} + express-rate-limit@8.5.2: resolution: {integrity: sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==} engines: {node: '>= 16'} @@ -3366,6 +4274,10 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + eyes@0.1.8: + resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} + engines: {node: '> 0.1.90'} + fast-copy@4.0.3: resolution: {integrity: sha512-58apWr0GUiDFM8+3afrO6eYwJBn9ZAhDOzG3L+/9llab/haCARS2UIfffmOurYLwbgDRs8n0rfr6qAAPEAuAQw==} @@ -3385,12 +4297,26 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fast-sha256@1.3.0: + resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==} + + fast-stable-stringify@1.0.0: + resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} + fast-uri@3.1.2: resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + fb-dotslash@0.5.8: + resolution: {integrity: sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==} + engines: {node: '>=20'} + hasBin: true + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -3419,14 +4345,25 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + finalhandler@1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} + finalhandler@2.1.1: resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} engines: {node: '>= 18.0.0'} + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} + 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'} @@ -3438,6 +4375,9 @@ packages: flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + flow-enums-runtime@0.0.6: + resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} + for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} @@ -3454,6 +4394,10 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} + 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'} @@ -3505,6 +4449,10 @@ packages: 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.6.0: resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} engines: {node: '>=18'} @@ -3548,6 +4496,9 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + glob@11.1.0: resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} engines: {node: 20 || >=22} @@ -3577,6 +4528,10 @@ packages: 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==} @@ -3599,6 +4554,24 @@ packages: help-me@5.0.0: resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + hermes-compiler@250829098.0.14: + resolution: {integrity: sha512-5meXwsZxgiqFaJjNzwjzI9IyUkuGGBisu+z9BvQWmGVpjH6nz11hgqkyxe4dl8UAdyIV4lTbz91+Dlnjz0VxqA==} + + hermes-estree@0.35.0: + resolution: {integrity: sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==} + + hermes-estree@0.36.0: + resolution: {integrity: sha512-A1+8zn5oss2CFP7pKsOaxorQG6FNIz1WU1VDqruLPPZl3LVgeE2C5xfFg8Ow6/Ow4mSslLLtYP1J3n38eKyW9w==} + + hermes-parser@0.35.0: + resolution: {integrity: sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==} + + hermes-parser@0.36.0: + resolution: {integrity: sha512-GdpwMmH5x6IpC1cijvcvYnlPB60Mh6kTSF/NFdYV/j56gYdi+0RIakYs+eqOV+bbO0SW7mgVVGSsTJxyPQfo3w==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + hono@4.12.27: resolution: {integrity: sha512-1yrb/+w6HWQJrUCLkJ2IF5jNIPvvFkblV5RNOYl6bV+OA6p9GLcMpHFFGTosSvHvcAUibuUukRqhlYI4z32C7Q==} engines: {node: '>=16.9.0'} @@ -3619,6 +4592,9 @@ packages: 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.7.2: resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} @@ -3626,6 +4602,9 @@ packages: idb@7.1.1: resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + 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'} @@ -3634,6 +4613,11 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} + image-size@1.2.1: + resolution: {integrity: sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==} + engines: {node: '>=16.x'} + hasBin: true + immer@10.2.0: resolution: {integrity: sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==} @@ -3665,6 +4649,9 @@ packages: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + ip-address@10.2.0: resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==} engines: {node: '>= 12'} @@ -3730,6 +4717,10 @@ packages: 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'} @@ -3782,6 +4773,10 @@ packages: resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} engines: {node: '>=12'} + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -3867,6 +4862,11 @@ packages: resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} engines: {node: '>=18'} + isomorphic-ws@4.0.1: + resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} + peerDependencies: + ws: '*' + jackspeak@4.2.3: resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} engines: {node: 20 || >=22} @@ -3876,6 +4876,27 @@ packages: engines: {node: '>=10'} hasBin: true + jayson@4.3.0: + resolution: {integrity: sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==} + engines: {node: '>=8'} + hasBin: true + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jiti@2.7.0: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true @@ -3890,6 +4911,10 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} + js-cookie@3.0.7: + resolution: {integrity: sha512-z/wZZgDrkNV1eA0ULjM/F9/50Ya8fbzgKneSpoPsXSGd0KnpdtHfOZWK+GcwLk+EZbS4F9RBhU+K2RgzuDaItw==} + engines: {node: '>=20'} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3897,6 +4922,9 @@ packages: resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} hasBin: true + jsc-safe-url@0.2.4: + resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -3926,6 +4954,9 @@ packages: 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==} + json-with-bigint@3.5.8: resolution: {integrity: sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==} @@ -3966,6 +4997,9 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lighthouse-logger@1.4.2: + resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} + lightningcss-android-arm64@1.32.0: resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} @@ -4056,6 +5090,10 @@ packages: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} + 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'} @@ -4066,6 +5104,9 @@ packages: lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + log-symbols@6.0.0: resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} engines: {node: '>=18'} @@ -4077,6 +5118,10 @@ packages: long@5.3.2: resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + lru-cache@11.5.1: resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} engines: {node: 20 || >=22} @@ -4092,10 +5137,16 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + map-obj@5.0.0: resolution: {integrity: sha512-2L3MIgJynYrZ3TYMriLDLWocz15okFakV6J12HXvMXDHui2x/zgChzg1u9mFFGbbGWE+GsLpQByt4POb9Or+uA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + marky@1.3.0: + resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -4104,6 +5155,9 @@ packages: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} + memoize-one@5.2.1: + resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + memory-pager@1.5.0: resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} @@ -4111,6 +5165,10 @@ packages: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} engines: {node: '>=18'} + merge-options@3.0.4: + resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} + engines: {node: '>=10'} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -4118,6 +5176,64 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + metro-babel-transformer@0.84.4: + resolution: {integrity: sha512-rvCfz8snl9h20VcvpOHxZuHP1SlAkv4HXbzw7nyyVwu6Eqo5PRerbakQ9XmUCOsRy70spJ37O+G1TK8oMzo48g==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-cache-key@0.84.4: + resolution: {integrity: sha512-wVO79aGrkYImpnaVS4+d5RrRBRPX31QtvKB3wKGBuiNSznduZTQHzsrJZRroFJSwnygrzdsGUtDQPuqqFjFdvw==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-cache@0.84.4: + resolution: {integrity: sha512-gpcFQdSLUwUCk71saKoE64jLFbx2nwTfVCcPSULMNT8QYq0p1eZZE29Jvd0HtT/UlhC3ZOutLxJME5xqD2JUZg==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-config@0.84.4: + resolution: {integrity: sha512-PMotGDjXcXLWo2TMRH+VR99phFNgYTwqh4OoieIKK3yTJa1Jmkl+fZJxDO0jfBvNF+WESHciHvpNuBtXaF3B0Q==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-core@0.84.4: + resolution: {integrity: sha512-HONpWC5LGXZn3ffkd4Hu6AIrfE7j4Z0g0wMo/goV24WOB3lhuFZ40KgvaDiSw8iyQHloMYay5N/wPX+z8oN/PQ==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-file-map@0.84.4: + resolution: {integrity: sha512-KSVDi/u60hKPx++NLu3MTIvyjzNoJnFAF8PQFxaj1jiSka/wjw+Ua6sNuJ0TDHQv+7AAoFQxeMgaRAe8Yic5wQ==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-minify-terser@0.84.4: + resolution: {integrity: sha512-5qpbaVOMC7CPitIpuewzVeGw7E+C3ykbv2mqTjQLl85Z3annSVGlSCTcsZjqXZzjupfK4Ztj3dDc4kc44NZwtQ==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-resolver@0.84.4: + resolution: {integrity: sha512-1qLgbxQ5ZGhhutuPot1Yp348ofDsATL2WkrHF65TobqTT9K3P9qJXw38bomk7ncp5B7OYMfWwtyBZo1lCV792A==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-runtime@0.84.4: + resolution: {integrity: sha512-Jibypds4g7AhzdRKY+kDoj51s5EXMwgyp5ddtlreDAsWefMdOx+agWqgm0H2XSZ/ueanHHVM89fnf5OJnlxa8Q==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-source-map@0.84.4: + resolution: {integrity: sha512-jbWkPxIesVuo1IWkvezmMJld6iu8nD62GsrZiV6jP37AOdbo4OBq1FJ+qkOg8sV05wAHB//jAbziuW0SlJfW4g==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-symbolicate@0.84.4: + resolution: {integrity: sha512-OnfpacxUqGPZQ27t8qK9mFa7uqHIlVWeqRqkCbvMvreEBiamEeOn8krKtcwgP5M4cYDPwuSmCTopHMVthqG4zA==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + hasBin: true + + metro-transform-plugins@0.84.4: + resolution: {integrity: sha512-kehr6HbAecqD0/a3xLXobELdPaAmRAl8bel0qagPF4vhZtux93nS8S4eq2kgKt6J2GnQpVjSoW1PXdst04mwow==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-transform-worker@0.84.4: + resolution: {integrity: sha512-W1IYMvvXTu4MxYr7d9h7CeG2vpIr3bmLLIavkPY4O1ilzDrvS8z/NEe6y+pC44Ff7raMXQgYSfdqDUwN/i39gg==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro@0.84.4: + resolution: {integrity: sha512-8ETTubqfD6ornDy2zYDvRcKnVDOXdFJsjetYDBsY4oAsb6NJkiwFR+FaMESyGppFmQUyBQA4H4sFGxzcQSGtFA==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + hasBin: true + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -4130,6 +5246,11 @@ packages: resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} engines: {node: '>=18'} + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -4157,6 +5278,11 @@ packages: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + mongodb-connection-string-url@7.0.1: resolution: {integrity: sha512-h0AZ9A7IDVwwHyMxmdMXKy+9oNlF0zFoahHiX3vQ8e3KFcSP3VmsmfvtRSuLPxmyv2vjIDxqty8smTgie/SNRQ==} engines: {node: '>=20.19.0'} @@ -4188,6 +5314,9 @@ packages: socks: optional: true + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -4214,10 +5343,26 @@ packages: engines: {node: '>=10.5.0'} deprecated: Use your platform's native DOMException instead + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + node-fetch@3.3.2: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + node-releases@2.0.50: resolution: {integrity: sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==} engines: {node: '>=18'} @@ -4230,6 +5375,13 @@ packages: resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} engines: {node: '>=18'} + nullthrows@1.1.1: + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + + ob1@0.84.4: + resolution: {integrity: sha512-eJXMpz4aQHXF/YBB9ddqZDIS+ooO91hObo9FoW/xBkr54/zCwYYCDqT/O54vNo8kOkWs5Ou/y28NgdrV0edQNA==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -4258,6 +5410,10 @@ packages: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} + on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -4277,6 +5433,10 @@ packages: resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} engines: {node: '>=20'} + open@7.4.2: + resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} + engines: {node: '>=8'} + open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -4305,6 +5465,10 @@ packages: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} + 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'} @@ -4365,6 +5529,10 @@ packages: path-to-regexp@8.4.2: resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -4411,6 +5579,10 @@ packages: engines: {node: '>=18'} hasBin: true + pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -4444,6 +5616,10 @@ packages: resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} engines: {node: ^14.13.1 || >=16.0.0} + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-ms@9.3.0: resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} @@ -4451,6 +5627,9 @@ packages: process-warning@5.0.0: resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + promise@8.3.0: + resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -4470,6 +5649,16 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + qrcode.react@4.2.0: + resolution: {integrity: sha512-QpgqWi8rD9DsS9EP3z7BT+5lY5SFhsqGjpgW5DY/i3mK4M9DTBNz3ErMi8BWYEfI3L0d8GIbGmcdFAS1uIRGjA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + qrcode@1.5.4: + resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} + engines: {node: '>=10.13.0'} + hasBin: true + qs@6.15.3: resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} engines: {node: '>=0.6'} @@ -4477,6 +5666,9 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} @@ -4497,6 +5689,10 @@ packages: '@types/react-dom': optional: true + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + range-parser@1.3.0: resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} engines: {node: '>= 0.6'} @@ -4515,14 +5711,37 @@ packages: '@types/react': optional: true + react-devtools-core@6.1.5: + resolution: {integrity: sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==} + react-dom@19.2.7: resolution: {integrity: sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==} peerDependencies: react: ^19.2.7 + 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-is@19.2.7: resolution: {integrity: sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==} + react-native@0.86.0: + resolution: {integrity: sha512-17ALh/dd6AO4pgOVmOO5Axll5PbErEo3XFyLokyzW6usyi+OShIEPwUW26wLPlhVifgSOIfECCH0WN+0IqtJ1w==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + hasBin: true + peerDependencies: + '@react-native/jest-preset': 0.86.0 + '@types/react': ^19.1.1 + react: ^19.2.3 + peerDependenciesMeta: + '@react-native/jest-preset': + optional: true + '@types/react': + optional: true + react-redux@9.3.0: resolution: {integrity: sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==} peerDependencies: @@ -4535,6 +5754,10 @@ packages: redux: optional: true + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + react-remove-scroll-bar@2.3.8: resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} @@ -4610,6 +5833,9 @@ packages: regenerate@1.4.2: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -4625,10 +5851,17 @@ packages: resolution: {integrity: sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==} hasBin: true + 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==} + reselect@5.1.1: resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} @@ -4670,6 +5903,9 @@ packages: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} + rpc-websockets@9.3.9: + resolution: {integrity: sha512-2iQDaTB4g5fDB2ihrTFSJSibCEuxaRi1q7qTW7ZO9/M5/TC+ToHA4D9/ffNLEbAoHNNrcdeP05oATNk44SKZXA==} + run-applescript@7.1.0: resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} @@ -4724,18 +5960,33 @@ packages: 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'} + serialize-error@2.1.0: + resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} + engines: {node: '>=0.10.0'} + serialize-javascript@7.0.6: resolution: {integrity: sha512-ATTK5Q4gFVg0YDp1my2vqygyvhcklD/UV5GIlYHooGTn/NogJqIzpetkD6E5kmuVULqz/S9inUL25XcAgDRJQg==} engines: {node: '>=20.0.0'} + 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-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -4768,6 +6019,10 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shell-quote@1.9.0: + resolution: {integrity: sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==} + engines: {node: '>= 0.4'} + side-channel-list@1.0.1: resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} engines: {node: '>= 0.4'} @@ -4814,6 +6069,10 @@ packages: source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -4830,6 +6089,20 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} + stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + + stacktrace-parser@0.1.11: + resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} + engines: {node: '>=6'} + + standardwebhooks@1.0.0: + resolution: {integrity: sha512-BbHGOQK9olHPMvQNHWul6MYlrRTAOKn03rOe4A8O3CLWhNf4YHBqq2HJKKC+sfqpxiBY52pNeesD6jIiLDz8jg==} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + statuses@2.0.2: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} @@ -4842,6 +6115,16 @@ packages: 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==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + string-width@7.2.0: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} @@ -4898,6 +6181,21 @@ packages: resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} engines: {node: '>=14.16'} + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + + 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-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -4908,6 +6206,9 @@ packages: os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] hasBin: true + tabbable@6.5.0: + resolution: {integrity: sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==} + tailwind-merge@3.6.0: resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==} @@ -4931,9 +6232,15 @@ packages: engines: {node: '>=10'} hasBin: true + text-encoding-utf-8@1.0.2: + resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} + thread-stream@3.2.0: resolution: {integrity: sha512-zLBvqpwr4Esa0kRjcrzGU6zL25lePWaCLMx0RQFrmteozIfeNdaMLpG5U7PeHzvlFkAWaRKA9/KVW4F60iB+qw==} + throat@5.0.0: + resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} + tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} @@ -4941,6 +6248,9 @@ packages: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -4949,10 +6259,16 @@ packages: resolution: {integrity: sha512-5DXWzE4Vz7xNHsv+xQ+MGfJYyC78Aok3tEr0MNwHoRf7vZnga1mQXZ4/Nsodld4VR6Wd+VhfmqnNrsRJyYPfrQ==} engines: {node: '>=20'} + toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + 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==} + tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} @@ -4992,6 +6308,10 @@ packages: resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} engines: {node: '>=10'} + type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + type-fest@4.41.0: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} @@ -5038,6 +6358,9 @@ packages: undici-types@8.3.0: resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} + undici-types@8.5.0: + resolution: {integrity: sha512-+FxhD+5RUdCZHlVPt+pd0DaYYHBPsgoHovxhMnFq9R1SOejHGE4ma0swzuRoKhOisEzsjFWdFedyD0JQmftrHg==} + undici@7.28.0: resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} engines: {node: '>=20.18.1'} @@ -5118,9 +6441,26 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + utf-8-validate@6.0.6: + resolution: {integrity: sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA==} + engines: {node: '>=6.14.2'} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@14.0.1: + resolution: {integrity: sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==} + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). + hasBin: true + validate-npm-package-name@7.0.2: resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==} engines: {node: ^20.17.0 || >=22.9.0} @@ -5193,10 +6533,19 @@ packages: yaml: optional: true + vlq@1.0.1: + resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + web-streams-polyfill@3.3.3: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} @@ -5208,10 +6557,16 @@ packages: resolution: {integrity: sha512-U9vjByy/sK2OMXu5mmfuZFKTMIUQe34c0JXRO+oDrxJTsntdYT2iIFwYMOV7HhMTuktcZLGf2W1N/OcSf9ssWg==} engines: {node: '>=6.0.0', npm: '>=3.10.0'} + whatwg-fetch@3.6.20: + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + whatwg-url@14.2.0: resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} engines: {node: '>=18'} + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} @@ -5227,6 +6582,9 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + which-typed-array@1.1.22: resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} engines: {node: '>= 0.4'} @@ -5294,9 +6652,29 @@ packages: workbox-window@7.4.1: resolution: {integrity: sha512-notZDH2u8VXaqyuD7xaqIfEFi6SRM4SUSd7ewe9PDsVqADuepxX2ZMY3uvuZGxzY5ZOsGC/vD3A/3smFtJt4/A==} + wrap-ansi@6.2.0: + 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==} + ws@7.5.11: + resolution: {integrity: sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==} + 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.21.0: resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} engines: {node: '>=10.0.0'} @@ -5313,9 +6691,41 @@ packages: resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} engines: {node: '>=20'} + 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==} + yaml@1.10.3: + resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==} + engines: {node: '>= 6'} + + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@18.1.3: + 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.3: + resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} + engines: {node: '>=12'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -6066,6 +7476,80 @@ snapshots: '@bufbuild/protobuf@1.10.1': {} + '@clerk/backend@3.8.4(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@clerk/shared': 4.22.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + standardwebhooks: 1.0.0 + tslib: 2.8.1 + transitivePeerDependencies: + - react + - react-dom + + '@clerk/express@2.1.32(express@5.2.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@clerk/backend': 3.8.4(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@clerk/shared': 4.22.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + express: 5.2.1 + tslib: 2.8.1 + transitivePeerDependencies: + - react + - react-dom + + '@clerk/localizations@4.11.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@clerk/shared': 4.22.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + transitivePeerDependencies: + - react + - react-dom + + '@clerk/react@6.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@clerk/shared': 4.22.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + tslib: 2.8.1 + + '@clerk/shared@4.22.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@tanstack/query-core': 5.101.2 + dequal: 2.0.3 + glob-to-regexp: 0.4.1 + js-cookie: 3.0.7 + optionalDependencies: + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + + '@clerk/ui@1.23.0(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6))(@types/react@19.2.17)(bs58@6.0.0)(bufferutil@4.1.0)(react-dom@19.2.7(react@19.2.7))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.7)(utf-8-validate@6.0.6))(react@19.2.7)(typescript@6.0.3)(utf-8-validate@6.0.6)': + dependencies: + '@clerk/localizations': 4.11.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@clerk/shared': 4.22.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@emotion/cache': 11.11.0 + '@emotion/react': 11.11.1(@types/react@19.2.17)(react@19.2.7) + '@floating-ui/react': 0.27.12(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@formkit/auto-animate': 0.8.4 + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-react': 0.15.39(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6))(bs58@6.0.0)(bufferutil@4.1.0)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.7)(utf-8-validate@6.0.6))(react@19.2.7)(typescript@6.0.3)(utf-8-validate@6.0.6) + '@solana/wallet-standard': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6))(bs58@6.0.0)(react@19.2.7) + '@swc/helpers': 0.5.21 + copy-to-clipboard: 3.3.3 + core-js: 3.47.0 + csstype: 3.1.3 + dequal: 2.0.3 + input-otp: 1.4.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + qrcode.react: 4.2.0(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + transitivePeerDependencies: + - '@solana/web3.js' + - '@types/react' + - bs58 + - bufferutil + - fastestsmallesttextencoderdecoder + - react-native + - supports-color + - typescript + - utf-8-validate + '@datastructures-js/deque@1.0.8': {} '@date-fns/tz@1.5.0': {} @@ -6107,6 +7591,72 @@ snapshots: tslib: 2.8.1 optional: true + '@emotion/babel-plugin@11.13.5': + dependencies: + '@babel/helper-module-imports': 7.29.7 + '@babel/runtime': 7.29.7 + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/serialize': 1.3.3 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + transitivePeerDependencies: + - supports-color + + '@emotion/cache@11.11.0': + dependencies: + '@emotion/memoize': 0.8.1 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.3.1 + stylis: 4.2.0 + + '@emotion/hash@0.9.2': {} + + '@emotion/memoize@0.8.1': {} + + '@emotion/memoize@0.9.0': {} + + '@emotion/react@11.11.1(@types/react@19.2.17)(react@19.2.7)': + dependencies: + '@babel/runtime': 7.29.7 + '@emotion/babel-plugin': 11.13.5 + '@emotion/cache': 11.11.0 + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.7) + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.3.1 + hoist-non-react-statics: 3.3.2 + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.17 + transitivePeerDependencies: + - supports-color + + '@emotion/serialize@1.3.3': + dependencies: + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/unitless': 0.10.0 + '@emotion/utils': 1.4.2 + csstype: 3.2.3 + + '@emotion/sheet@1.4.0': {} + + '@emotion/unitless@0.10.0': {} + + '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.2.7)': + dependencies: + react: 19.2.7 + + '@emotion/utils@1.4.2': {} + + '@emotion/weak-memoize@0.3.1': {} + '@esbuild/aix-ppc64@0.28.1': optional: true @@ -6234,16 +7784,26 @@ snapshots: react: 19.2.7 react-dom: 19.2.7(react@19.2.7) + '@floating-ui/react@0.27.12(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@floating-ui/react-dom': 2.1.8(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@floating-ui/utils': 0.2.11 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + tabbable: 6.5.0 + '@floating-ui/utils@0.2.11': {} '@fontsource-variable/geist@5.2.9': {} - '@google/genai@2.10.0(@modelcontextprotocol/sdk@1.29.0(zod@3.25.76))': + '@formkit/auto-animate@0.8.4': {} + + '@google/genai@2.10.0(@modelcontextprotocol/sdk@1.29.0(zod@3.25.76))(bufferutil@4.1.0)(utf-8-validate@6.0.6)': dependencies: google-auth-library: 10.9.0 p-retry: 4.6.2 protobufjs: 7.6.4 - ws: 8.21.0 + ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) optionalDependencies: '@modelcontextprotocol/sdk': 1.29.0(zod@3.25.76) transitivePeerDependencies: @@ -6379,6 +7939,21 @@ snapshots: '@isaacs/cliui@9.0.0': {} + '@isaacs/ttlcache@1.4.1': {} + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.10 + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 26.0.1 + '@types/yargs': 17.0.35 + chalk: 4.1.2 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -6482,6 +8057,12 @@ snapshots: '@tybys/wasm-util': 0.10.3 optional: true + '@noble/curves@1.9.7': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/hashes@1.8.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -7410,6 +8991,82 @@ snapshots: '@radix-ui/rect@1.1.2': {} + '@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.7)(utf-8-validate@6.0.6))': + dependencies: + merge-options: 3.0.4 + react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.7)(utf-8-validate@6.0.6) + optional: true + + '@react-native/assets-registry@0.86.0': {} + + '@react-native/codegen@0.86.0(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/parser': 7.29.7 + hermes-parser: 0.36.0 + invariant: 2.2.4 + nullthrows: 1.1.1 + tinyglobby: 0.2.17 + yargs: 17.7.3 + + '@react-native/community-cli-plugin@0.86.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)': + dependencies: + '@react-native/dev-middleware': 0.86.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + debug: 4.4.3 + invariant: 2.2.4 + metro: 0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) + metro-config: 0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) + metro-core: 0.84.4 + semver: 7.8.5 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@react-native/debugger-frontend@0.86.0': {} + + '@react-native/debugger-shell@0.86.0': + dependencies: + cross-spawn: 7.0.6 + debug: 4.4.3 + fb-dotslash: 0.5.8 + transitivePeerDependencies: + - supports-color + + '@react-native/dev-middleware@0.86.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)': + dependencies: + '@isaacs/ttlcache': 1.4.1 + '@react-native/debugger-frontend': 0.86.0 + '@react-native/debugger-shell': 0.86.0 + chrome-launcher: 0.15.2 + chromium-edge-launcher: 0.3.0 + connect: 3.7.0 + debug: 4.4.3 + invariant: 2.2.4 + nullthrows: 1.1.1 + open: 7.4.2 + serve-static: 1.16.3 + ws: 7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@react-native/gradle-plugin@0.86.0': {} + + '@react-native/js-polyfills@0.86.0': {} + + '@react-native/normalize-colors@0.86.0': {} + + '@react-native/virtualized-lists@0.86.0(@types/react@19.2.17)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.7)(utf-8-validate@6.0.6))(react@19.2.7)': + dependencies: + invariant: 2.2.4 + nullthrows: 1.1.1 + react: 19.2.7 + react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.7)(utf-8-validate@6.0.6) + optionalDependencies: + '@types/react': 19.2.17 + '@reduxjs/toolkit@2.12.0(react-redux@9.3.0(@types/react@19.2.17)(react@19.2.7)(redux@5.0.1))(react@19.2.7)': dependencies: '@standard-schema/spec': 1.1.0 @@ -7598,12 +9255,689 @@ snapshots: '@types/react': 19.2.17 react: 19.2.7 + '@sinclair/typebox@0.27.10': {} + '@sindresorhus/merge-streams@4.0.0': {} + '@solana-mobile/mobile-wallet-adapter-protocol-web3js@2.2.9(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.7)(utf-8-validate@6.0.6))(typescript@6.0.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana-mobile/mobile-wallet-adapter-protocol': 2.2.9(bufferutil@4.1.0)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.7)(utf-8-validate@6.0.6))(typescript@6.0.3)(utf-8-validate@6.0.6) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6) + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - react-native + - typescript + - utf-8-validate + + '@solana-mobile/mobile-wallet-adapter-protocol@2.2.9(bufferutil@4.1.0)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.7)(utf-8-validate@6.0.6))(typescript@6.0.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana/kit': 6.10.0(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6) + '@solana/wallet-standard-features': 1.4.0 + '@solana/wallet-standard-util': 1.1.3 + '@wallet-standard/core': 1.1.2 + react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.7)(utf-8-validate@6.0.6) + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + + '@solana-mobile/wallet-adapter-mobile@2.2.9(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.7)(utf-8-validate@6.0.6))(typescript@6.0.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana-mobile/mobile-wallet-adapter-protocol': 2.2.9(bufferutil@4.1.0)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.7)(utf-8-validate@6.0.6))(typescript@6.0.3)(utf-8-validate@6.0.6) + '@solana-mobile/mobile-wallet-adapter-protocol-web3js': 2.2.9(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.7)(utf-8-validate@6.0.6))(typescript@6.0.3)(utf-8-validate@6.0.6) + '@solana-mobile/wallet-standard-mobile': 0.5.3(bufferutil@4.1.0)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.7)(utf-8-validate@6.0.6))(typescript@6.0.3)(utf-8-validate@6.0.6) + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6)) + '@solana/wallet-standard-features': 1.4.0 + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6) + '@wallet-standard/core': 1.1.2 + react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.7)(utf-8-validate@6.0.6) + tslib: 2.8.1 + optionalDependencies: + '@react-native-async-storage/async-storage': 1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.7)(utf-8-validate@6.0.6)) + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + + '@solana-mobile/wallet-standard-mobile@0.5.3(bufferutil@4.1.0)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.7)(utf-8-validate@6.0.6))(typescript@6.0.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana-mobile/mobile-wallet-adapter-protocol': 2.2.9(bufferutil@4.1.0)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.7)(utf-8-validate@6.0.6))(typescript@6.0.3)(utf-8-validate@6.0.6) + '@solana/wallet-standard-chains': 1.1.2 + '@solana/wallet-standard-features': 1.4.0 + '@wallet-standard/base': 1.1.1 + '@wallet-standard/features': 1.1.1 + '@wallet-standard/wallet': 1.1.1 + qrcode: 1.5.4 + tslib: 2.8.1 + optionalDependencies: + '@react-native-async-storage/async-storage': 1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.7)(utf-8-validate@6.0.6)) + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - react-native + - typescript + - utf-8-validate + + '@solana/accounts@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/addresses': 6.10.0(typescript@6.0.3) + '@solana/codecs-core': 6.10.0(typescript@6.0.3) + '@solana/codecs-strings': 6.10.0(typescript@6.0.3) + '@solana/errors': 6.10.0(typescript@6.0.3) + '@solana/rpc-spec': 6.10.0(typescript@6.0.3) + '@solana/rpc-types': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/addresses@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/assertions': 6.10.0(typescript@6.0.3) + '@solana/codecs-core': 6.10.0(typescript@6.0.3) + '@solana/codecs-strings': 6.10.0(typescript@6.0.3) + '@solana/errors': 6.10.0(typescript@6.0.3) + '@solana/nominal-types': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/assertions@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/errors': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + + '@solana/buffer-layout@4.0.1': + dependencies: + buffer: 6.0.3 + + '@solana/codecs-core@2.3.0(typescript@6.0.3)': + dependencies: + '@solana/errors': 2.3.0(typescript@6.0.3) + typescript: 6.0.3 + + '@solana/codecs-core@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/errors': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + + '@solana/codecs-data-structures@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/codecs-core': 6.10.0(typescript@6.0.3) + '@solana/codecs-numbers': 6.10.0(typescript@6.0.3) + '@solana/errors': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + + '@solana/codecs-numbers@2.3.0(typescript@6.0.3)': + dependencies: + '@solana/codecs-core': 2.3.0(typescript@6.0.3) + '@solana/errors': 2.3.0(typescript@6.0.3) + typescript: 6.0.3 + + '@solana/codecs-numbers@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/codecs-core': 6.10.0(typescript@6.0.3) + '@solana/errors': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + + '@solana/codecs-strings@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/codecs-core': 6.10.0(typescript@6.0.3) + '@solana/codecs-numbers': 6.10.0(typescript@6.0.3) + '@solana/errors': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + + '@solana/codecs@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/codecs-core': 6.10.0(typescript@6.0.3) + '@solana/codecs-data-structures': 6.10.0(typescript@6.0.3) + '@solana/codecs-numbers': 6.10.0(typescript@6.0.3) + '@solana/codecs-strings': 6.10.0(typescript@6.0.3) + '@solana/fixed-points': 6.10.0(typescript@6.0.3) + '@solana/options': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/errors@2.3.0(typescript@6.0.3)': + dependencies: + chalk: 5.6.2 + commander: 14.0.3 + typescript: 6.0.3 + + '@solana/errors@6.10.0(typescript@6.0.3)': + dependencies: + chalk: 5.6.2 + commander: 15.0.0 + optionalDependencies: + typescript: 6.0.3 + + '@solana/fast-stable-stringify@6.10.0(typescript@6.0.3)': + optionalDependencies: + typescript: 6.0.3 + + '@solana/fixed-points@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/codecs-core': 6.10.0(typescript@6.0.3) + '@solana/errors': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + + '@solana/functional@6.10.0(typescript@6.0.3)': + optionalDependencies: + typescript: 6.0.3 + + '@solana/instruction-plans@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/errors': 6.10.0(typescript@6.0.3) + '@solana/instructions': 6.10.0(typescript@6.0.3) + '@solana/keys': 6.10.0(typescript@6.0.3) + '@solana/promises': 6.10.0(typescript@6.0.3) + '@solana/transaction-messages': 6.10.0(typescript@6.0.3) + '@solana/transactions': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/instructions@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/codecs-core': 6.10.0(typescript@6.0.3) + '@solana/errors': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + + '@solana/keys@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/assertions': 6.10.0(typescript@6.0.3) + '@solana/codecs-core': 6.10.0(typescript@6.0.3) + '@solana/codecs-strings': 6.10.0(typescript@6.0.3) + '@solana/errors': 6.10.0(typescript@6.0.3) + '@solana/nominal-types': 6.10.0(typescript@6.0.3) + '@solana/promises': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/kit@6.10.0(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana/accounts': 6.10.0(typescript@6.0.3) + '@solana/addresses': 6.10.0(typescript@6.0.3) + '@solana/codecs': 6.10.0(typescript@6.0.3) + '@solana/errors': 6.10.0(typescript@6.0.3) + '@solana/functional': 6.10.0(typescript@6.0.3) + '@solana/instruction-plans': 6.10.0(typescript@6.0.3) + '@solana/instructions': 6.10.0(typescript@6.0.3) + '@solana/keys': 6.10.0(typescript@6.0.3) + '@solana/offchain-messages': 6.10.0(typescript@6.0.3) + '@solana/plugin-core': 6.10.0(typescript@6.0.3) + '@solana/plugin-interfaces': 6.10.0(typescript@6.0.3) + '@solana/program-client-core': 6.10.0(typescript@6.0.3) + '@solana/programs': 6.10.0(typescript@6.0.3) + '@solana/rpc': 6.10.0(typescript@6.0.3) + '@solana/rpc-api': 6.10.0(typescript@6.0.3) + '@solana/rpc-parsed-types': 6.10.0(typescript@6.0.3) + '@solana/rpc-spec-types': 6.10.0(typescript@6.0.3) + '@solana/rpc-subscriptions': 6.10.0(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6) + '@solana/rpc-types': 6.10.0(typescript@6.0.3) + '@solana/signers': 6.10.0(typescript@6.0.3) + '@solana/subscribable': 6.10.0(typescript@6.0.3) + '@solana/sysvars': 6.10.0(typescript@6.0.3) + '@solana/transaction-confirmation': 6.10.0(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6) + '@solana/transaction-messages': 6.10.0(typescript@6.0.3) + '@solana/transactions': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + + '@solana/nominal-types@6.10.0(typescript@6.0.3)': + optionalDependencies: + typescript: 6.0.3 + + '@solana/offchain-messages@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/addresses': 6.10.0(typescript@6.0.3) + '@solana/codecs-core': 6.10.0(typescript@6.0.3) + '@solana/codecs-data-structures': 6.10.0(typescript@6.0.3) + '@solana/codecs-numbers': 6.10.0(typescript@6.0.3) + '@solana/codecs-strings': 6.10.0(typescript@6.0.3) + '@solana/errors': 6.10.0(typescript@6.0.3) + '@solana/keys': 6.10.0(typescript@6.0.3) + '@solana/nominal-types': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/options@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/codecs-core': 6.10.0(typescript@6.0.3) + '@solana/codecs-data-structures': 6.10.0(typescript@6.0.3) + '@solana/codecs-numbers': 6.10.0(typescript@6.0.3) + '@solana/codecs-strings': 6.10.0(typescript@6.0.3) + '@solana/errors': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/plugin-core@6.10.0(typescript@6.0.3)': + optionalDependencies: + typescript: 6.0.3 + + '@solana/plugin-interfaces@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/addresses': 6.10.0(typescript@6.0.3) + '@solana/instruction-plans': 6.10.0(typescript@6.0.3) + '@solana/keys': 6.10.0(typescript@6.0.3) + '@solana/rpc-spec': 6.10.0(typescript@6.0.3) + '@solana/rpc-subscriptions-spec': 6.10.0(typescript@6.0.3) + '@solana/rpc-types': 6.10.0(typescript@6.0.3) + '@solana/signers': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/program-client-core@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/accounts': 6.10.0(typescript@6.0.3) + '@solana/addresses': 6.10.0(typescript@6.0.3) + '@solana/codecs-core': 6.10.0(typescript@6.0.3) + '@solana/errors': 6.10.0(typescript@6.0.3) + '@solana/instruction-plans': 6.10.0(typescript@6.0.3) + '@solana/instructions': 6.10.0(typescript@6.0.3) + '@solana/plugin-interfaces': 6.10.0(typescript@6.0.3) + '@solana/rpc-api': 6.10.0(typescript@6.0.3) + '@solana/signers': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/programs@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/addresses': 6.10.0(typescript@6.0.3) + '@solana/errors': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/promises@6.10.0(typescript@6.0.3)': + optionalDependencies: + typescript: 6.0.3 + + '@solana/rpc-api@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/addresses': 6.10.0(typescript@6.0.3) + '@solana/codecs-core': 6.10.0(typescript@6.0.3) + '@solana/codecs-strings': 6.10.0(typescript@6.0.3) + '@solana/errors': 6.10.0(typescript@6.0.3) + '@solana/keys': 6.10.0(typescript@6.0.3) + '@solana/rpc-parsed-types': 6.10.0(typescript@6.0.3) + '@solana/rpc-spec': 6.10.0(typescript@6.0.3) + '@solana/rpc-transformers': 6.10.0(typescript@6.0.3) + '@solana/rpc-types': 6.10.0(typescript@6.0.3) + '@solana/transaction-messages': 6.10.0(typescript@6.0.3) + '@solana/transactions': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-parsed-types@6.10.0(typescript@6.0.3)': + optionalDependencies: + typescript: 6.0.3 + + '@solana/rpc-spec-types@6.10.0(typescript@6.0.3)': + optionalDependencies: + typescript: 6.0.3 + + '@solana/rpc-spec@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/errors': 6.10.0(typescript@6.0.3) + '@solana/rpc-spec-types': 6.10.0(typescript@6.0.3) + '@solana/subscribable': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + + '@solana/rpc-subscriptions-api@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/addresses': 6.10.0(typescript@6.0.3) + '@solana/keys': 6.10.0(typescript@6.0.3) + '@solana/rpc-subscriptions-spec': 6.10.0(typescript@6.0.3) + '@solana/rpc-transformers': 6.10.0(typescript@6.0.3) + '@solana/rpc-types': 6.10.0(typescript@6.0.3) + '@solana/transaction-messages': 6.10.0(typescript@6.0.3) + '@solana/transactions': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-subscriptions-channel-websocket@6.10.0(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana/errors': 6.10.0(typescript@6.0.3) + '@solana/functional': 6.10.0(typescript@6.0.3) + '@solana/rpc-subscriptions-spec': 6.10.0(typescript@6.0.3) + '@solana/subscribable': 6.10.0(typescript@6.0.3) + ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@solana/rpc-subscriptions-spec@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/errors': 6.10.0(typescript@6.0.3) + '@solana/promises': 6.10.0(typescript@6.0.3) + '@solana/rpc-spec-types': 6.10.0(typescript@6.0.3) + '@solana/subscribable': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + + '@solana/rpc-subscriptions@6.10.0(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana/errors': 6.10.0(typescript@6.0.3) + '@solana/fast-stable-stringify': 6.10.0(typescript@6.0.3) + '@solana/functional': 6.10.0(typescript@6.0.3) + '@solana/promises': 6.10.0(typescript@6.0.3) + '@solana/rpc-spec-types': 6.10.0(typescript@6.0.3) + '@solana/rpc-subscriptions-api': 6.10.0(typescript@6.0.3) + '@solana/rpc-subscriptions-channel-websocket': 6.10.0(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6) + '@solana/rpc-subscriptions-spec': 6.10.0(typescript@6.0.3) + '@solana/rpc-transformers': 6.10.0(typescript@6.0.3) + '@solana/rpc-types': 6.10.0(typescript@6.0.3) + '@solana/subscribable': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + + '@solana/rpc-transformers@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/errors': 6.10.0(typescript@6.0.3) + '@solana/functional': 6.10.0(typescript@6.0.3) + '@solana/nominal-types': 6.10.0(typescript@6.0.3) + '@solana/rpc-spec-types': 6.10.0(typescript@6.0.3) + '@solana/rpc-types': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-transport-http@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/errors': 6.10.0(typescript@6.0.3) + '@solana/rpc-spec': 6.10.0(typescript@6.0.3) + '@solana/rpc-spec-types': 6.10.0(typescript@6.0.3) + undici-types: 8.5.0 + optionalDependencies: + typescript: 6.0.3 + + '@solana/rpc-types@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/addresses': 6.10.0(typescript@6.0.3) + '@solana/codecs-core': 6.10.0(typescript@6.0.3) + '@solana/codecs-numbers': 6.10.0(typescript@6.0.3) + '@solana/codecs-strings': 6.10.0(typescript@6.0.3) + '@solana/errors': 6.10.0(typescript@6.0.3) + '@solana/fixed-points': 6.10.0(typescript@6.0.3) + '@solana/nominal-types': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/errors': 6.10.0(typescript@6.0.3) + '@solana/fast-stable-stringify': 6.10.0(typescript@6.0.3) + '@solana/functional': 6.10.0(typescript@6.0.3) + '@solana/rpc-api': 6.10.0(typescript@6.0.3) + '@solana/rpc-spec': 6.10.0(typescript@6.0.3) + '@solana/rpc-spec-types': 6.10.0(typescript@6.0.3) + '@solana/rpc-transformers': 6.10.0(typescript@6.0.3) + '@solana/rpc-transport-http': 6.10.0(typescript@6.0.3) + '@solana/rpc-types': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/signers@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/addresses': 6.10.0(typescript@6.0.3) + '@solana/codecs-core': 6.10.0(typescript@6.0.3) + '@solana/errors': 6.10.0(typescript@6.0.3) + '@solana/instructions': 6.10.0(typescript@6.0.3) + '@solana/keys': 6.10.0(typescript@6.0.3) + '@solana/nominal-types': 6.10.0(typescript@6.0.3) + '@solana/offchain-messages': 6.10.0(typescript@6.0.3) + '@solana/transaction-messages': 6.10.0(typescript@6.0.3) + '@solana/transactions': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/subscribable@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/errors': 6.10.0(typescript@6.0.3) + '@solana/promises': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + + '@solana/sysvars@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/accounts': 6.10.0(typescript@6.0.3) + '@solana/codecs-core': 6.10.0(typescript@6.0.3) + '@solana/codecs-data-structures': 6.10.0(typescript@6.0.3) + '@solana/codecs-numbers': 6.10.0(typescript@6.0.3) + '@solana/errors': 6.10.0(typescript@6.0.3) + '@solana/rpc-types': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transaction-confirmation@6.10.0(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana/addresses': 6.10.0(typescript@6.0.3) + '@solana/codecs-strings': 6.10.0(typescript@6.0.3) + '@solana/errors': 6.10.0(typescript@6.0.3) + '@solana/keys': 6.10.0(typescript@6.0.3) + '@solana/promises': 6.10.0(typescript@6.0.3) + '@solana/rpc': 6.10.0(typescript@6.0.3) + '@solana/rpc-subscriptions': 6.10.0(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6) + '@solana/rpc-types': 6.10.0(typescript@6.0.3) + '@solana/transaction-messages': 6.10.0(typescript@6.0.3) + '@solana/transactions': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + + '@solana/transaction-messages@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/addresses': 6.10.0(typescript@6.0.3) + '@solana/codecs-core': 6.10.0(typescript@6.0.3) + '@solana/codecs-data-structures': 6.10.0(typescript@6.0.3) + '@solana/codecs-numbers': 6.10.0(typescript@6.0.3) + '@solana/errors': 6.10.0(typescript@6.0.3) + '@solana/functional': 6.10.0(typescript@6.0.3) + '@solana/instructions': 6.10.0(typescript@6.0.3) + '@solana/nominal-types': 6.10.0(typescript@6.0.3) + '@solana/rpc-types': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transactions@6.10.0(typescript@6.0.3)': + dependencies: + '@solana/addresses': 6.10.0(typescript@6.0.3) + '@solana/codecs-core': 6.10.0(typescript@6.0.3) + '@solana/codecs-data-structures': 6.10.0(typescript@6.0.3) + '@solana/codecs-numbers': 6.10.0(typescript@6.0.3) + '@solana/codecs-strings': 6.10.0(typescript@6.0.3) + '@solana/errors': 6.10.0(typescript@6.0.3) + '@solana/functional': 6.10.0(typescript@6.0.3) + '@solana/instructions': 6.10.0(typescript@6.0.3) + '@solana/keys': 6.10.0(typescript@6.0.3) + '@solana/nominal-types': 6.10.0(typescript@6.0.3) + '@solana/rpc-types': 6.10.0(typescript@6.0.3) + '@solana/transaction-messages': 6.10.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-standard-features': 1.4.0 + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6) + '@wallet-standard/base': 1.1.1 + '@wallet-standard/features': 1.1.1 + eventemitter3: 5.0.4 + + '@solana/wallet-adapter-react@0.15.39(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6))(bs58@6.0.0)(bufferutil@4.1.0)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.7)(utf-8-validate@6.0.6))(react@19.2.7)(typescript@6.0.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana-mobile/wallet-adapter-mobile': 2.2.9(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.7)(utf-8-validate@6.0.6))(typescript@6.0.3)(utf-8-validate@6.0.6) + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6)) + '@solana/wallet-standard-wallet-adapter-react': 1.1.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6))(bs58@6.0.0)(react@19.2.7) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6) + react: 19.2.7 + transitivePeerDependencies: + - bs58 + - bufferutil + - fastestsmallesttextencoderdecoder + - react-native + - typescript + - utf-8-validate + + '@solana/wallet-standard-chains@1.1.2': + dependencies: + '@wallet-standard/base': 1.1.1 + + '@solana/wallet-standard-core@1.1.3': + dependencies: + '@solana/wallet-standard-chains': 1.1.2 + '@solana/wallet-standard-features': 1.4.0 + '@solana/wallet-standard-util': 1.1.3 + + '@solana/wallet-standard-features@1.4.0': + dependencies: + '@wallet-standard/base': 1.1.1 + '@wallet-standard/features': 1.1.1 + + '@solana/wallet-standard-util@1.1.3': + dependencies: + '@noble/curves': 1.9.7 + '@solana/wallet-standard-chains': 1.1.2 + '@solana/wallet-standard-features': 1.4.0 + + '@solana/wallet-standard-wallet-adapter-base@1.1.5(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6))(bs58@6.0.0)': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6)) + '@solana/wallet-standard-chains': 1.1.2 + '@solana/wallet-standard-features': 1.4.0 + '@solana/wallet-standard-util': 1.1.3 + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6) + '@wallet-standard/app': 1.1.1 + '@wallet-standard/base': 1.1.1 + '@wallet-standard/features': 1.1.1 + '@wallet-standard/wallet': 1.1.1 + bs58: 6.0.0 + + '@solana/wallet-standard-wallet-adapter-react@1.1.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6))(bs58@6.0.0)(react@19.2.7)': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6)) + '@solana/wallet-standard-wallet-adapter-base': 1.1.5(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6))(bs58@6.0.0) + '@wallet-standard/app': 1.1.1 + '@wallet-standard/base': 1.1.1 + react: 19.2.7 + transitivePeerDependencies: + - '@solana/web3.js' + - bs58 + + '@solana/wallet-standard-wallet-adapter@1.1.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6))(bs58@6.0.0)(react@19.2.7)': + dependencies: + '@solana/wallet-standard-wallet-adapter-base': 1.1.5(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6))(bs58@6.0.0) + '@solana/wallet-standard-wallet-adapter-react': 1.1.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6))(bs58@6.0.0)(react@19.2.7) + transitivePeerDependencies: + - '@solana/wallet-adapter-base' + - '@solana/web3.js' + - bs58 + - react + + '@solana/wallet-standard@1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6))(bs58@6.0.0)(react@19.2.7)': + dependencies: + '@solana/wallet-standard-core': 1.1.3 + '@solana/wallet-standard-wallet-adapter': 1.1.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6))(bs58@6.0.0)(react@19.2.7) + transitivePeerDependencies: + - '@solana/wallet-adapter-base' + - '@solana/web3.js' + - bs58 + - react + + '@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6)': + dependencies: + '@babel/runtime': 7.29.7 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@solana/buffer-layout': 4.0.1 + '@solana/codecs-numbers': 2.3.0(typescript@6.0.3) + agentkeepalive: 4.6.0 + bn.js: 5.2.4 + 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@6.0.6) + node-fetch: 2.7.0 + rpc-websockets: 9.3.9 + superstruct: 2.0.2 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + + '@stablelib/base64@1.0.1': {} + '@standard-schema/spec@1.1.0': {} '@standard-schema/utils@0.3.0': {} + '@swc/helpers@0.5.21': + dependencies: + tslib: 2.8.1 + + '@swc/helpers@0.5.23': + dependencies: + tslib: 2.8.1 + '@tailwindcss/node@4.3.1': dependencies: '@jridgewell/remapping': 2.3.5 @@ -7665,12 +9999,14 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.3.1 '@tailwindcss/oxide-win32-x64-msvc': 4.3.1 - '@tailwindcss/vite@4.3.1(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4))': + '@tailwindcss/vite@4.3.1(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))': dependencies: '@tailwindcss/node': 4.3.1 '@tailwindcss/oxide': 4.3.1 tailwindcss: 4.3.1 - vite: 8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4) + vite: 8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) + + '@tanstack/query-core@5.101.2': {} '@trickfilm400/rollup-plugin-off-main-thread@3.0.0-pre1': dependencies: @@ -7750,12 +10086,26 @@ snapshots: '@types/http-errors@2.0.5': {} + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + '@types/json-schema@7.0.15': {} + '@types/node@12.20.55': {} + '@types/node@26.0.1': dependencies: undici-types: 8.3.0 + '@types/parse-json@4.0.2': {} + '@types/qs@6.15.1': {} '@types/range-parser@1.2.7': {} @@ -7785,6 +10135,8 @@ snapshots: '@types/use-sync-external-store@0.0.6': {} + '@types/uuid@10.0.0': {} + '@types/validate-npm-package-name@4.0.2': {} '@types/webidl-conversions@7.0.3': {} @@ -7793,10 +10145,20 @@ snapshots: dependencies: '@types/webidl-conversions': 7.0.3 + '@types/ws@7.4.7': + dependencies: + '@types/node': 26.0.1 + '@types/ws@8.18.1': dependencies: '@types/node': 26.0.1 + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.35': + dependencies: + '@types/yargs-parser': 21.0.3 + '@typescript-eslint/eslint-plugin@8.62.0(@typescript-eslint/parser@8.62.0(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -7888,10 +10250,41 @@ snapshots: '@typescript-eslint/types': 8.62.0 eslint-visitor-keys: 5.0.1 - '@vitejs/plugin-react@6.0.3(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4))': + '@vitejs/plugin-react@6.0.3(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4) + vite: 8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) + + '@wallet-standard/app@1.1.1': + dependencies: + '@wallet-standard/base': 1.1.1 + + '@wallet-standard/base@1.1.1': {} + + '@wallet-standard/core@1.1.2': + dependencies: + '@wallet-standard/app': 1.1.1 + '@wallet-standard/base': 1.1.1 + '@wallet-standard/errors': 0.1.2 + '@wallet-standard/features': 1.1.1 + '@wallet-standard/wallet': 1.1.1 + + '@wallet-standard/errors@0.1.2': + dependencies: + chalk: 5.6.2 + commander: 13.1.0 + + '@wallet-standard/features@1.1.1': + dependencies: + '@wallet-standard/base': 1.1.1 + + '@wallet-standard/wallet@1.1.1': + dependencies: + '@wallet-standard/base': 1.1.1 + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 accepts@2.0.0: dependencies: @@ -7906,6 +10299,10 @@ snapshots: agent-base@7.1.4: {} + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 + ajv-formats@2.1.1(ajv@8.20.0): optionalDependencies: ajv: 8.20.0 @@ -7928,12 +10325,20 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + anser@1.4.10: {} + ansi-colors@4.1.3: {} 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: {} + argparse@2.0.1: {} aria-hidden@1.2.6: @@ -7955,6 +10360,8 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 + asap@2.0.6: {} + ast-types@0.16.1: dependencies: tslib: 2.8.1 @@ -7973,6 +10380,12 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.29.7 + cosmiconfig: 7.1.0 + resolve: 1.22.12 + babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.7): dependencies: '@babel/compat-data': 7.29.7 @@ -7997,10 +10410,20 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-syntax-hermes-parser@0.36.0: + dependencies: + hermes-parser: 0.36.0 + balanced-match@1.0.2: {} balanced-match@4.0.4: {} + 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.10.40: {} @@ -8009,6 +10432,8 @@ snapshots: bignumber.js@9.3.1: {} + bn.js@5.2.4: {} + body-parser@2.3.0: dependencies: bytes: 3.1.2 @@ -8023,6 +10448,12 @@ snapshots: transitivePeerDependencies: - supports-color + borsh@0.7.0: + dependencies: + bn.js: 5.2.4 + bs58: 4.0.1 + text-encoding-utf-8: 1.0.2 + bottleneck@2.19.5: {} brace-expansion@2.1.1: @@ -8045,12 +10476,34 @@ snapshots: node-releases: 2.0.50 update-browserslist-db: 1.2.3(browserslist@4.28.4) + bs58@4.0.1: + dependencies: + base-x: 3.0.11 + + bs58@6.0.0: + dependencies: + base-x: 5.0.1 + + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + bson@7.3.1: {} buffer-equal-constant-time@1.0.1: {} buffer-from@1.1.2: {} + 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 + optional: true + bundle-name@4.1.0: dependencies: run-applescript: 7.1.0 @@ -8083,12 +10536,44 @@ snapshots: quick-lru: 6.1.2 type-fest: 4.41.0 + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + camelcase@8.0.0: {} caniuse-lite@1.0.30001799: {} + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + chalk@5.6.2: {} + chrome-launcher@0.15.2: + dependencies: + '@types/node': 26.0.1 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2 + transitivePeerDependencies: + - supports-color + + chromium-edge-launcher@0.3.0: + dependencies: + '@types/node': 26.0.1 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2 + mkdirp: 1.0.4 + transitivePeerDependencies: + - supports-color + + ci-info@2.0.0: {} + + ci-info@3.9.0: {} + class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 @@ -8099,6 +10584,18 @@ snapshots: cli-spinners@2.9.2: {} + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + 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@2.1.1: {} cmdk@1.1.1(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): @@ -8115,12 +10612,24 @@ snapshots: code-block-writer@13.0.3: {} + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + colorette@2.0.20: {} commander@11.1.0: {} + commander@12.1.0: {} + + commander@13.1.0: {} + commander@14.0.3: {} + commander@15.0.0: {} + commander@2.20.3: {} common-tags@1.8.2: {} @@ -8138,27 +10647,52 @@ snapshots: pkg-up: 3.1.0 semver: 7.8.5 + connect@3.7.0: + dependencies: + debug: 2.6.9 + finalhandler: 1.1.2 + parseurl: 1.3.3 + utils-merge: 1.0.1 + transitivePeerDependencies: + - supports-color + content-disposition@1.1.0: {} content-type@1.0.5: {} content-type@2.0.0: {} + convert-source-map@1.9.0: {} + convert-source-map@2.0.0: {} cookie-signature@1.2.2: {} cookie@0.7.2: {} + copy-to-clipboard@3.3.3: + dependencies: + toggle-selection: 1.0.6 + core-js-compat@3.49.0: dependencies: browserslist: 4.28.4 + core-js@3.47.0: {} + cors@2.8.6: dependencies: object-assign: 4.1.1 vary: 1.1.2 + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.1 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.3 + cosmiconfig@9.0.2(typescript@6.0.3): dependencies: env-paths: 2.2.1 @@ -8178,6 +10712,8 @@ snapshots: cssesc@3.0.0: {} + csstype@3.1.3: {} + csstype@3.2.3: {} d3-array@3.2.4: @@ -8246,13 +10782,21 @@ snapshots: dependencies: mimic-fn: 3.1.0 + debug@2.6.9: + dependencies: + ms: 2.0.0 + debug@4.4.3: dependencies: ms: 2.1.3 + decamelize@1.2.0: {} + decimal.js-light@2.5.1: {} - dedent@1.7.2: {} + dedent@1.7.2(babel-plugin-macros@3.1.0): + optionalDependencies: + babel-plugin-macros: 3.1.0 deep-is@0.1.4: {} @@ -8281,14 +10825,22 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + delay@5.0.0: {} + depd@2.0.0: {} + dequal@2.0.3: {} + + destroy@1.2.0: {} + detect-libc@2.1.2: {} detect-node-es@1.1.0: {} diff@8.0.4: {} + dijkstrajs@1.0.3: {} + dot-prop@6.0.1: dependencies: is-obj: 2.0.0 @@ -8327,6 +10879,10 @@ snapshots: emoji-regex@10.6.0: {} + emoji-regex@8.0.0: {} + + encodeurl@1.0.2: {} + encodeurl@2.0.0: {} end-of-stream@1.4.5: @@ -8349,6 +10905,10 @@ snapshots: dependencies: is-arrayish: 0.2.1 + error-stack-parser@2.1.4: + dependencies: + stackframe: 1.3.4 + es-abstract-get@1.0.0: dependencies: es-errors: 1.3.0 @@ -8439,6 +10999,12 @@ snapshots: es-toolkit@1.49.0: {} + es6-promise@4.2.8: {} + + es6-promisify@5.0.0: + dependencies: + es6-promise: 4.2.8 + esbuild@0.28.1: optionalDependencies: '@esbuild/aix-ppc64': 0.28.1 @@ -8548,6 +11114,8 @@ snapshots: etag@1.8.1: {} + event-target-shim@5.0.1: {} + eventemitter3@5.0.4: {} events@3.3.0: {} @@ -8585,6 +11153,8 @@ snapshots: strip-final-newline: 4.0.0 yoctocolors: 2.1.2 + exponential-backoff@3.1.3: {} + express-rate-limit@8.5.2(express@5.2.1): dependencies: express: 5.2.1 @@ -8625,6 +11195,8 @@ snapshots: extend@3.0.2: {} + eyes@0.1.8: {} + fast-copy@4.0.3: {} fast-deep-equal@3.1.3: {} @@ -8643,12 +11215,22 @@ snapshots: fast-safe-stringify@2.1.1: {} + fast-sha256@1.3.0: {} + + fast-stable-stringify@1.0.0: {} + fast-uri@3.1.2: {} fastq@1.20.1: dependencies: reusify: 1.1.0 + fb-dotslash@0.5.8: {} + + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + fdir@6.5.0(picomatch@4.0.4): optionalDependencies: picomatch: 4.0.4 @@ -8674,6 +11256,18 @@ snapshots: dependencies: to-regex-range: 5.0.1 + finalhandler@1.1.2: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + finalhandler@2.1.1: dependencies: debug: 4.4.3 @@ -8685,10 +11279,17 @@ snapshots: transitivePeerDependencies: - supports-color + find-root@1.1.0: {} + find-up@3.0.0: dependencies: locate-path: 3.0.0 + 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 @@ -8701,6 +11302,8 @@ snapshots: flatted@3.4.2: {} + flow-enums-runtime@0.0.6: {} + for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -8716,6 +11319,8 @@ snapshots: forwarded@0.2.0: {} + fresh@0.5.2: {} + fresh@2.0.0: {} fs-extra@11.3.5: @@ -8775,6 +11380,8 @@ snapshots: gensync@1.0.0-beta.2: {} + get-caller-file@2.0.5: {} + get-east-asian-width@1.6.0: {} get-intrinsic@1.3.0: @@ -8822,6 +11429,8 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-to-regexp@0.4.1: {} + glob@11.1.0: dependencies: foreground-child: 3.3.1 @@ -8855,6 +11464,8 @@ snapshots: has-bigints@1.1.0: {} + has-flag@4.0.0: {} + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.1 @@ -8875,6 +11486,24 @@ snapshots: help-me@5.0.0: {} + hermes-compiler@250829098.0.14: {} + + hermes-estree@0.35.0: {} + + hermes-estree@0.36.0: {} + + hermes-parser@0.35.0: + dependencies: + hermes-estree: 0.35.0 + + hermes-parser@0.36.0: + dependencies: + hermes-estree: 0.36.0 + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + hono@4.12.27: {} http-errors@2.0.1: @@ -8896,16 +11525,26 @@ snapshots: human-signals@8.0.1: {} + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + iconv-lite@0.7.2: dependencies: safer-buffer: 2.1.2 idb@7.1.1: {} + ieee754@1.2.1: {} + ignore@5.3.2: {} ignore@7.0.5: {} + image-size@1.2.1: + dependencies: + queue: 6.0.2 + immer@10.2.0: {} immer@11.1.8: {} @@ -8932,6 +11571,10 @@ snapshots: internmap@2.0.3: {} + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + ip-address@10.2.0: {} ipaddr.js@1.9.1: {} @@ -8992,6 +11635,8 @@ snapshots: 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 @@ -9031,6 +11676,9 @@ snapshots: is-obj@3.0.0: {} + is-plain-obj@2.1.0: + optional: true + is-plain-obj@4.1.0: {} is-promise@4.0.0: {} @@ -9100,6 +11748,10 @@ snapshots: isexe@3.1.5: {} + isomorphic-ws@4.0.1(ws@7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6)): + dependencies: + ws: 7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6) + jackspeak@4.2.3: dependencies: '@isaacs/cliui': 9.0.0 @@ -9110,6 +11762,51 @@ snapshots: filelist: 1.0.6 picocolors: 1.1.1 + jayson@4.3.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): + 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.11(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + json-stringify-safe: 5.0.1 + stream-json: 1.9.1 + uuid: 8.3.2 + ws: 7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + jest-get-type@29.6.3: {} + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 26.0.1 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.2 + + jest-validate@29.7.0: + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + + jest-worker@29.7.0: + dependencies: + '@types/node': 26.0.1 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + jiti@2.7.0: {} jose@5.10.0: {} @@ -9118,12 +11815,16 @@ snapshots: joycon@3.1.1: {} + js-cookie@3.0.7: {} + js-tokens@4.0.0: {} js-yaml@4.3.0: dependencies: argparse: 2.0.1 + jsc-safe-url@0.2.4: {} + jsesc@3.1.0: {} json-bigint@1.0.0: @@ -9144,6 +11845,8 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} + json-stringify-safe@5.0.1: {} + json-with-bigint@3.5.8: {} json5@2.2.3: {} @@ -9182,6 +11885,13 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lighthouse-logger@1.4.2: + dependencies: + debug: 2.6.9 + marky: 1.3.0 + transitivePeerDependencies: + - supports-color + lightningcss-android-arm64@1.32.0: optional: true @@ -9258,6 +11968,10 @@ snapshots: p-locate: 3.0.0 path-exists: 3.0.0 + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -9266,6 +11980,8 @@ snapshots: lodash.sortby@4.7.0: {} + lodash.throttle@4.1.1: {} + log-symbols@6.0.0: dependencies: chalk: 5.6.2 @@ -9275,6 +11991,10 @@ snapshots: long@5.3.2: {} + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + lru-cache@11.5.1: {} lru-cache@5.1.1: @@ -9289,20 +12009,207 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + map-obj@5.0.0: {} + marky@1.3.0: {} + math-intrinsics@1.1.0: {} media-typer@1.1.0: {} + memoize-one@5.2.1: {} + memory-pager@1.5.0: {} merge-descriptors@2.0.0: {} + merge-options@3.0.4: + dependencies: + is-plain-obj: 2.1.0 + optional: true + merge-stream@2.0.0: {} merge2@1.4.1: {} + metro-babel-transformer@0.84.4: + dependencies: + '@babel/core': 7.29.7 + flow-enums-runtime: 0.0.6 + hermes-parser: 0.35.0 + metro-cache-key: 0.84.4 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + metro-cache-key@0.84.4: + dependencies: + flow-enums-runtime: 0.0.6 + + metro-cache@0.84.4: + dependencies: + exponential-backoff: 3.1.3 + flow-enums-runtime: 0.0.6 + https-proxy-agent: 7.0.6 + metro-core: 0.84.4 + transitivePeerDependencies: + - supports-color + + metro-config@0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6): + dependencies: + connect: 3.7.0 + flow-enums-runtime: 0.0.6 + jest-validate: 29.7.0 + metro: 0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) + metro-cache: 0.84.4 + metro-core: 0.84.4 + metro-runtime: 0.84.4 + yaml: 2.9.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + metro-core@0.84.4: + dependencies: + flow-enums-runtime: 0.0.6 + lodash.throttle: 4.1.1 + metro-resolver: 0.84.4 + + metro-file-map@0.84.4: + dependencies: + debug: 4.4.3 + fb-watchman: 2.0.2 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + invariant: 2.2.4 + jest-worker: 29.7.0 + micromatch: 4.0.8 + nullthrows: 1.1.1 + walker: 1.0.8 + transitivePeerDependencies: + - supports-color + + metro-minify-terser@0.84.4: + dependencies: + flow-enums-runtime: 0.0.6 + terser: 5.48.0 + + metro-resolver@0.84.4: + dependencies: + flow-enums-runtime: 0.0.6 + + metro-runtime@0.84.4: + dependencies: + '@babel/runtime': 7.29.7 + flow-enums-runtime: 0.0.6 + + metro-source-map@0.84.4: + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + metro-symbolicate: 0.84.4 + nullthrows: 1.1.1 + ob1: 0.84.4 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + + metro-symbolicate@0.84.4: + dependencies: + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + metro-source-map: 0.84.4 + nullthrows: 1.1.1 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + + metro-transform-plugins@0.84.4: + dependencies: + '@babel/core': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + flow-enums-runtime: 0.0.6 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + metro-transform-worker@0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6): + dependencies: + '@babel/core': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + flow-enums-runtime: 0.0.6 + metro: 0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) + metro-babel-transformer: 0.84.4 + metro-cache: 0.84.4 + metro-cache-key: 0.84.4 + metro-minify-terser: 0.84.4 + metro-source-map: 0.84.4 + metro-transform-plugins: 0.84.4 + nullthrows: 1.1.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + metro@0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6): + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/core': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + accepts: 2.0.0 + ci-info: 2.0.0 + connect: 3.7.0 + debug: 4.4.3 + error-stack-parser: 2.1.4 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + hermes-parser: 0.35.0 + image-size: 1.2.1 + invariant: 2.2.4 + jest-worker: 29.7.0 + jsc-safe-url: 0.2.4 + lodash.throttle: 4.1.1 + metro-babel-transformer: 0.84.4 + metro-cache: 0.84.4 + metro-cache-key: 0.84.4 + metro-config: 0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) + metro-core: 0.84.4 + metro-file-map: 0.84.4 + metro-resolver: 0.84.4 + metro-runtime: 0.84.4 + metro-source-map: 0.84.4 + metro-symbolicate: 0.84.4 + metro-transform-plugins: 0.84.4 + metro-transform-worker: 0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) + mime-types: 3.0.2 + nullthrows: 1.1.1 + serialize-error: 2.1.0 + source-map: 0.5.7 + throat: 5.0.0 + ws: 7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6) + yargs: 17.7.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -9314,6 +12221,8 @@ snapshots: dependencies: mime-db: 1.54.0 + mime@1.6.0: {} + mimic-fn@2.1.0: {} mimic-fn@3.1.0: {} @@ -9332,6 +12241,8 @@ snapshots: minipass@7.1.3: {} + mkdirp@1.0.4: {} + mongodb-connection-string-url@7.0.1: dependencies: '@types/whatwg-url': 13.0.0 @@ -9343,6 +12254,8 @@ snapshots: bson: 7.3.1 mongodb-connection-string-url: 7.0.1 + ms@2.0.0: {} + ms@2.1.3: {} nanoid@3.3.15: {} @@ -9358,12 +12271,21 @@ snapshots: node-domexception@1.0.0: {} + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + node-fetch@3.3.2: dependencies: data-uri-to-buffer: 4.0.1 fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 + node-gyp-build@4.8.4: + optional: true + + node-int64@0.4.0: {} + node-releases@2.0.50: {} npm-run-path@4.0.1: @@ -9375,6 +12297,12 @@ snapshots: path-key: 4.0.0 unicorn-magic: 0.3.0 + nullthrows@1.1.1: {} + + ob1@0.84.4: + dependencies: + flow-enums-runtime: 0.0.6 + object-assign@4.1.1: {} object-inspect@1.13.4: {} @@ -9408,6 +12336,10 @@ snapshots: on-exit-leak-free@2.1.2: {} + on-finished@2.3.0: + dependencies: + ee-first: 1.1.1 + on-finished@2.4.1: dependencies: ee-first: 1.1.1 @@ -9433,6 +12365,11 @@ snapshots: powershell-utils: 0.1.0 wsl-utils: 0.3.1 + open@7.4.2: + dependencies: + is-docker: 2.2.1 + is-wsl: 2.2.0 + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 @@ -9478,6 +12415,10 @@ snapshots: dependencies: p-limit: 2.3.0 + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + p-locate@5.0.0: dependencies: p-limit: 3.1.0 @@ -9525,6 +12466,8 @@ snapshots: path-to-regexp@8.4.2: {} + path-type@4.0.0: {} + picocolors@1.1.1: {} picomatch@2.3.2: {} @@ -9585,6 +12528,8 @@ snapshots: optionalDependencies: fsevents: 2.3.2 + pngjs@5.0.0: {} + possible-typed-array-names@1.1.0: {} postcss-selector-parser@7.1.4: @@ -9608,12 +12553,22 @@ snapshots: pretty-bytes@6.1.1: {} + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + pretty-ms@9.3.0: dependencies: parse-ms: 4.0.0 process-warning@5.0.0: {} + promise@8.3.0: + dependencies: + asap: 2.0.6 + prompts@2.4.2: dependencies: kleur: 3.0.3 @@ -9645,6 +12600,16 @@ snapshots: punycode@2.3.1: {} + qrcode.react@4.2.0(react@19.2.7): + dependencies: + react: 19.2.7 + + qrcode@1.5.4: + dependencies: + dijkstrajs: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + qs@6.15.3: dependencies: es-define-property: 1.0.1 @@ -9652,6 +12617,10 @@ snapshots: queue-microtask@1.2.3: {} + queue@6.0.2: + dependencies: + inherits: 2.0.4 + quick-format-unescaped@4.0.4: {} quick-lru@6.1.2: {} @@ -9719,6 +12688,8 @@ snapshots: '@types/react': 19.2.17 '@types/react-dom': 19.2.3(@types/react@19.2.17) + range-parser@1.2.1: {} + range-parser@1.3.0: {} raw-body@3.0.2: @@ -9736,13 +12707,70 @@ snapshots: optionalDependencies: '@types/react': 19.2.17 + react-devtools-core@6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6): + dependencies: + shell-quote: 1.9.0 + ws: 7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + react-dom@19.2.7(react@19.2.7): dependencies: react: 19.2.7 scheduler: 0.27.0 + react-is@16.13.1: {} + + react-is@18.3.1: {} + react-is@19.2.7: {} + react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.7)(utf-8-validate@6.0.6): + dependencies: + '@react-native/assets-registry': 0.86.0 + '@react-native/codegen': 0.86.0(@babel/core@7.29.7) + '@react-native/community-cli-plugin': 0.86.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + '@react-native/gradle-plugin': 0.86.0 + '@react-native/js-polyfills': 0.86.0 + '@react-native/normalize-colors': 0.86.0 + '@react-native/virtualized-lists': 0.86.0(@types/react@19.2.17)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.7)(utf-8-validate@6.0.6))(react@19.2.7) + abort-controller: 3.0.0 + anser: 1.4.10 + ansi-regex: 5.0.1 + babel-plugin-syntax-hermes-parser: 0.36.0 + base64-js: 1.5.1 + commander: 12.1.0 + flow-enums-runtime: 0.0.6 + hermes-compiler: 250829098.0.14 + invariant: 2.2.4 + memoize-one: 5.2.1 + metro-runtime: 0.84.4 + metro-source-map: 0.84.4 + nullthrows: 1.1.1 + pretty-format: 29.7.0 + promise: 8.3.0 + react: 19.2.7 + react-devtools-core: 6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6) + react-refresh: 0.14.2 + regenerator-runtime: 0.13.11 + scheduler: 0.27.0 + semver: 7.8.5 + stacktrace-parser: 0.1.11 + tinyglobby: 0.2.17 + whatwg-fetch: 3.6.20 + ws: 7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6) + yargs: 17.7.3 + optionalDependencies: + '@types/react': 19.2.17 + transitivePeerDependencies: + - '@babel/core' + - '@react-native-community/cli' + - '@react-native/metro-config' + - bufferutil + - supports-color + - utf-8-validate + react-redux@9.3.0(@types/react@19.2.17)(react@19.2.7)(redux@5.0.1): dependencies: '@types/use-sync-external-store': 0.0.6 @@ -9752,6 +12780,8 @@ snapshots: '@types/react': 19.2.17 redux: 5.0.1 + react-refresh@0.14.2: {} + react-remove-scroll-bar@2.3.8(@types/react@19.2.17)(react@19.2.7): dependencies: react: 19.2.7 @@ -9839,6 +12869,8 @@ snapshots: regenerate@1.4.2: {} + regenerator-runtime@0.13.11: {} + regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.9 @@ -9863,8 +12895,12 @@ snapshots: dependencies: jsesc: 3.1.0 + require-directory@2.1.1: {} + require-from-string@2.0.2: {} + require-main-filename@2.0.0: {} + reselect@5.1.1: {} reselect@5.2.0: {} @@ -9949,6 +12985,19 @@ snapshots: transitivePeerDependencies: - supports-color + rpc-websockets@9.3.9: + dependencies: + '@swc/helpers': 0.5.23 + '@types/uuid': 10.0.0 + '@types/ws': 8.18.1 + buffer: 6.0.3 + eventemitter3: 5.0.4 + uuid: 14.0.1 + ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 6.0.6 + run-applescript@7.1.0: {} run-parallel@1.2.0: @@ -9997,6 +13046,24 @@ snapshots: semver@7.8.5: {} + 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 @@ -10013,8 +13080,19 @@ snapshots: transitivePeerDependencies: - supports-color + serialize-error@2.1.0: {} + serialize-javascript@7.0.6: {} + 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 @@ -10024,6 +13102,8 @@ snapshots: transitivePeerDependencies: - supports-color + set-blocking@2.0.0: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -10048,7 +13128,7 @@ snapshots: setprototypeof@1.2.0: {} - shadcn@4.12.0(typescript@6.0.3): + shadcn@4.12.0(babel-plugin-macros@3.1.0)(typescript@6.0.3): dependencies: '@babel/core': 7.29.7 '@babel/parser': 7.29.7 @@ -10060,7 +13140,7 @@ snapshots: browserslist: 4.28.4 commander: 14.0.3 cosmiconfig: 9.0.2(typescript@6.0.3) - dedent: 1.7.2 + dedent: 1.7.2(babel-plugin-macros@3.1.0) deepmerge: 4.3.1 diff: 8.0.4 execa: 9.6.1 @@ -10126,6 +13206,8 @@ snapshots: shebang-regex@3.0.0: {} + shell-quote@1.9.0: {} + side-channel-list@1.0.1: dependencies: es-errors: 1.3.0 @@ -10178,6 +13260,8 @@ snapshots: buffer-from: 1.1.2 source-map: 0.6.1 + source-map@0.5.7: {} + source-map@0.6.1: {} source-map@0.8.0-beta.0: @@ -10190,6 +13274,19 @@ snapshots: split2@4.2.0: {} + stackframe@1.3.4: {} + + stacktrace-parser@0.1.11: + dependencies: + type-fest: 0.7.1 + + standardwebhooks@1.0.0: + dependencies: + '@stablelib/base64': 1.0.1 + fast-sha256: 1.3.0 + + statuses@1.5.0: {} + statuses@2.0.2: {} stdin-discarder@0.2.2: {} @@ -10199,6 +13296,18 @@ snapshots: 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 + + 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@7.2.0: dependencies: emoji-regex: 10.6.0 @@ -10275,10 +13384,24 @@ snapshots: strip-json-comments@5.0.3: {} + stylis@4.2.0: {} + + superstruct@2.0.2: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + supports-preserve-symlinks-flag@1.0.0: {} systeminformation@5.31.11: {} + tabbable@6.5.0: {} + tailwind-merge@3.6.0: {} tailwindcss@4.3.1: {} @@ -10301,10 +13424,14 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 + text-encoding-utf-8@1.0.2: {} + thread-stream@3.2.0: dependencies: real-require: 0.2.0 + throat@5.0.0: {} + tiny-invariant@1.3.3: {} tinyglobby@0.2.17: @@ -10312,14 +13439,20 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 + tmpl@1.0.5: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 toad-cache@3.7.1: {} + toggle-selection@1.0.6: {} + toidentifier@1.0.1: {} + tr46@0.0.3: {} + tr46@1.0.1: dependencies: punycode: 2.3.1 @@ -10359,6 +13492,8 @@ snapshots: type-fest@0.16.0: {} + type-fest@0.7.1: {} + type-fest@4.41.0: {} type-is@2.1.0: @@ -10426,6 +13561,8 @@ snapshots: undici-types@8.3.0: {} + undici-types@8.5.0: {} + undici@7.28.0: {} unicode-canonical-property-names-ecmascript@2.0.1: {} @@ -10484,8 +13621,19 @@ snapshots: dependencies: react: 19.2.7 + utf-8-validate@6.0.6: + dependencies: + node-gyp-build: 4.8.4 + optional: true + util-deprecate@1.0.2: {} + utils-merge@1.0.1: {} + + uuid@14.0.1: {} + + uuid@8.3.2: {} + validate-npm-package-name@7.0.2: {} vary@1.1.2: {} @@ -10516,18 +13664,18 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vite-plugin-pwa@1.3.0(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4))(workbox-build@7.4.1)(workbox-window@7.4.1): + vite-plugin-pwa@1.3.0(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(workbox-build@7.4.1)(workbox-window@7.4.1): dependencies: debug: 4.4.3 pretty-bytes: 6.1.1 tinyglobby: 0.2.17 - vite: 8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4) + vite: 8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0) workbox-build: 7.4.1 workbox-window: 7.4.1 transitivePeerDependencies: - supports-color - vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4): + vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -10541,9 +13689,18 @@ snapshots: jiti: 2.7.0 terser: 5.48.0 tsx: 4.22.4 + yaml: 2.9.0 + + vlq@1.0.1: {} + + walker@1.0.8: + dependencies: + makeerror: 1.0.12 web-streams-polyfill@3.3.3: {} + webidl-conversions@3.0.1: {} + webidl-conversions@4.0.2: {} webidl-conversions@7.0.0: {} @@ -10552,11 +13709,18 @@ snapshots: dependencies: sdp: 3.2.2 + whatwg-fetch@3.6.20: {} + whatwg-url@14.2.0: dependencies: tr46: 5.1.1 webidl-conversions: 7.0.0 + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 @@ -10594,6 +13758,8 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 + which-module@2.0.1: {} + which-typed-array@1.1.22: dependencies: available-typed-arrays: 1.0.7 @@ -10727,17 +13893,76 @@ snapshots: '@types/trusted-types': 2.0.7 workbox-core: 7.4.1 + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + 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@8.21.0: {} + ws@7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 6.0.6 + + ws@8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 6.0.6 wsl-utils@0.3.1: dependencies: is-wsl: 3.1.1 powershell-utils: 0.1.0 + y18n@4.0.3: {} + + y18n@5.0.8: {} + yallist@3.1.1: {} + yaml@1.10.3: {} + + yaml@2.9.0: {} + + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs-parser@21.1.1: {} + + 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 + + yargs@17.7.3: + 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 + yocto-queue@0.1.0: {} yocto-spinner@1.2.0: diff --git a/shared/src/index.ts b/shared/src/index.ts index 919832a..9195083 100644 --- a/shared/src/index.ts +++ b/shared/src/index.ts @@ -1,5 +1,6 @@ export type { Pod, PodInput, Engineer } from './pod.js'; export type { EngineerContext } from './engineer.js'; +export type { UserLearningPodSummary, UserLearningProfile } from './user-learning.js'; export type { PodActivityEvent, PodActivityKind, diff --git a/shared/src/pod.ts b/shared/src/pod.ts index 1070b15..0c692ea 100644 --- a/shared/src/pod.ts +++ b/shared/src/pod.ts @@ -11,6 +11,15 @@ export interface Pod { description?: string; /** Engineer display names PodMan uses when it speaks. */ members: string[]; + /** Latest known Clerk/Gmail profile data per member display name. */ + memberProfiles?: Record< + string, + { + displayName: string; + email?: string; + imageUrl?: string; + } + >; createdAt: string; updatedAt: string; } diff --git a/shared/src/user-learning.ts b/shared/src/user-learning.ts new file mode 100644 index 0000000..56566e1 --- /dev/null +++ b/shared/src/user-learning.ts @@ -0,0 +1,37 @@ +export interface UserLearningPodSummary { + podId: string; + podName?: string; + visits: number; + actions: string[]; + firstSeenAt: string; + lastSeenAt: string; +} + +export interface UserLearningProfile { + clerkUserId: string; + displayName?: string; + email?: string; + imageUrl?: string; + identities: string[]; + pods: UserLearningPodSummary[]; + recentWork: Array<{ + podId: string; + file?: string; + activity?: string; + at: string; + }>; + collaborationStyle: string[]; + workingStyle: string[]; + goals: string[]; + knowledge: string[]; + counts: { + podActions: number; + observations: number; + gitStates: number; + collisionsInvolved: number; + outcomes: number; + conversationNotes: number; + hermesJobs: number; + }; + updatedAt: string; +}