From c9e28915e9e120dc30b61b8532ac75e5b30c99ed Mon Sep 17 00:00:00 2001 From: Dheeraj-Manwani Date: Thu, 30 Apr 2026 17:21:46 +0530 Subject: [PATCH 1/5] New theme --- dashboard/app/globals.css | 46 +- .../incidents/[id]/incident-detail-view.tsx | 40 +- dashboard/components/auth/siws-sign-in.tsx | 62 +- dashboard/components/close-policy-button.tsx | 2 +- .../CreatePolicyWizard.tsx | 23 +- dashboard/components/dashboard-ui.tsx | 387 +- dashboard/components/edit-policy-form.tsx | 29 +- dashboard/components/kill-switch-button.tsx | 40 +- dashboard/components/providers.tsx | 25 + dashboard/components/report-markdown.tsx | 36 +- .../components/rotate-agent-key-button.tsx | 2 +- dashboard/package-lock.json | 36 + dashboard/package.json | 2 + dashboard/tailwind.config.ts | 49 +- server/package-lock.json | 3953 +++++++++++++++++ 15 files changed, 4428 insertions(+), 304 deletions(-) create mode 100644 server/package-lock.json diff --git a/dashboard/app/globals.css b/dashboard/app/globals.css index f016cfe..8178edf 100644 --- a/dashboard/app/globals.css +++ b/dashboard/app/globals.css @@ -3,16 +3,48 @@ @tailwind utilities; @layer base { + :root, + .dark { + --background: 214 30% 5%; + --foreground: 210 40% 98%; + --card: 215 18% 13%; + --card-foreground: 210 40% 98%; + --card-border: 218 21% 21%; + --popover: 215 18% 13%; + --popover-foreground: 210 40% 98%; + --popover-border: 218 21% 21%; + --primary: 169 100% 50%; + --primary-foreground: 214 30% 5%; + --secondary: 215 18% 13%; + --secondary-foreground: 210 40% 98%; + --muted: 215 18% 13%; + --muted-foreground: 215 14% 65%; + --accent: 215 18% 20%; + --accent-foreground: 210 40% 98%; + --destructive: 350 100% 62%; + --destructive-foreground: 210 40% 98%; + --border: 218 21% 21%; + --input: 218 21% 21%; + --ring: 169 100% 50%; + --teal: 169 100% 50%; + --amber: 39 100% 59%; + --crimson: 350 100% 62%; + } + + * { + @apply border-border; + } + html, body { @apply min-h-full overflow-x-hidden; } body { - @apply bg-zinc-950 text-zinc-100 antialiased; + @apply bg-background text-foreground antialiased; background-image: - radial-gradient(circle at 10% -10%, rgba(59, 130, 246, 0.18), transparent 45%), - radial-gradient(circle at 100% 0%, rgba(14, 165, 233, 0.12), transparent 35%); + radial-gradient(circle at 10% -10%, hsl(var(--teal) / 0.16), transparent 45%), + radial-gradient(circle at 100% 0%, hsl(var(--teal) / 0.08), transparent 35%); } } @@ -22,19 +54,19 @@ } .button-primary { - @apply border border-blue-500 bg-gradient-to-r from-blue-600 to-blue-500 text-white shadow-[0_0_0_1px_rgba(59,130,246,0.85),0_0_24px_rgba(59,130,246,0.32)] hover:from-blue-500 hover:to-blue-400 hover:shadow-[0_0_0_1px_rgba(59,130,246,0.95),0_0_30px_rgba(59,130,246,0.42)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-400 focus-visible:ring-offset-2 focus-visible:ring-offset-zinc-950; + @apply border border-primary bg-primary text-primary-foreground shadow-[0_0_0_1px_hsl(var(--primary)/0.75),0_0_24px_hsl(var(--primary)/0.25)] hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background; } .button-secondary { - @apply border border-[#2a3142] bg-[#10131c] text-zinc-100 hover:border-[#384056] hover:bg-[#151925] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-400/70 focus-visible:ring-offset-2 focus-visible:ring-offset-zinc-950; + @apply border border-input bg-secondary text-secondary-foreground hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/70 focus-visible:ring-offset-2 focus-visible:ring-offset-background; } .panel-glow { - @apply rounded-xl border border-[#1e2433] bg-[#0b0d14] shadow-[0_12px_36px_-22px_rgba(59,130,246,0.35)] transition-all duration-300; + @apply rounded-xl border border-card-border bg-card shadow-[0_12px_36px_-22px_hsl(var(--primary)/0.2)] transition-all duration-300; } .panel-glow-hover { - @apply hover:border-[#2a3142] hover:shadow-[0_0_0_1px_rgba(59,130,246,0.25),0_0_24px_rgba(59,130,246,0.08)]; + @apply hover:border-primary/35 hover:shadow-[0_0_0_1px_hsl(var(--primary)/0.2),0_0_24px_hsl(var(--primary)/0.08)]; } } diff --git a/dashboard/app/incidents/[id]/incident-detail-view.tsx b/dashboard/app/incidents/[id]/incident-detail-view.tsx index c581294..e32c588 100644 --- a/dashboard/app/incidents/[id]/incident-detail-view.tsx +++ b/dashboard/app/incidents/[id]/incident-detail-view.tsx @@ -68,48 +68,48 @@ export function IncidentDetailView({ id }: { id: string }) { return ( -
+
-

+

{incident.policy.label ?? shortAddress(incident.policy.pubkey)}

{isResolved ? ( - + RESOLVED ) : ( - + ACTIVE )} - + Incident #{incident.id.slice(-4)}
-
{incident.policy.pubkey}
-
+
{incident.policy.pubkey}
+
- Paused at + Paused at {new Date(incident.pausedAt).toLocaleString()}
- Paused by + Paused by {pausedByType} · {shortAddress(incident.pausedBy, 4, 4)}
{incident.resolvedAt ? (
- Resolved + Resolved {new Date(incident.resolvedAt).toLocaleString()}
) : null}
- + View agent
@@ -123,16 +123,16 @@ export function IncidentDetailView({ id }: { id: string }) {
-
-
Timeline
+
+
Timeline
-
-
+
+
Guardian postmortem {incident.fullReport ? ( - + guardian ) : null} @@ -140,12 +140,12 @@ export function IncidentDetailView({ id }: { id: string }) { {incident.fullReport ? ( ) : ( -
+
No AI postmortem generated for this incident. {incident.resolution ? ( -
-
Resolution
-
{incident.resolution}
+
+
Resolution
+
{incident.resolution}
) : null}
diff --git a/dashboard/components/auth/siws-sign-in.tsx b/dashboard/components/auth/siws-sign-in.tsx index 655ae8e..67b6b51 100644 --- a/dashboard/components/auth/siws-sign-in.tsx +++ b/dashboard/components/auth/siws-sign-in.tsx @@ -1,7 +1,9 @@ "use client"; import { useWallet } from "@solana/wallet-adapter-react"; -import { useRouter } from "next/navigation"; +import { useRouter } from "nextjs-toploader/app"; +import { useSearchParams } from "next/navigation"; +import { useQueryClient } from "@tanstack/react-query"; import { useCallback, useState } from "react"; import { ApiClientError, @@ -19,6 +21,33 @@ function uint8ArrayToBase64(bytes: Uint8Array): string { return btoa(binary); } +function WalletIcon({ size = 14 }: { size?: number }) { + return ( + + ); +} + +function resolveRedirectTarget(from: string | null): string { + if (from && from.startsWith("/") && !from.startsWith("//")) { + return from; + } + return "/agents"; +} + export function SiwsSignIn() { const router = useRouter(); const { publicKey, signMessage, connecting, connected } = useWallet(); @@ -54,32 +83,27 @@ export function SiwsSignIn() { } }, [markSignedIn, publicKey, router, signMessage]); - return ( -
-

- Connect a wallet, then sign the one-time message from the Guardrails API to create a session. -

- -

- Use the global wallet button in the top bar to connect your wallet before signing in. -

- - {connected && !signMessage ? ( -

This wallet does not support message signing.

- ) : null} + if (!connected) { + return null; + } - {connected && signMessage ? ( + return ( +
+ {signMessage ? ( - ) : null} + ) : ( +

This wallet does not support message signing.

+ )} - {error ?

{error}

: null} + {error ?

{error}

: null}
); } diff --git a/dashboard/components/close-policy-button.tsx b/dashboard/components/close-policy-button.tsx index 33cfac6..a718d00 100644 --- a/dashboard/components/close-policy-button.tsx +++ b/dashboard/components/close-policy-button.tsx @@ -1,7 +1,7 @@ "use client"; import { useState } from "react"; -import { useRouter } from "next/navigation"; +import { useRouter } from "nextjs-toploader/app"; import { useQueryClient } from "@tanstack/react-query"; import { useWallet } from "@solana/wallet-adapter-react"; import { PublicKey } from "@solana/web3.js"; diff --git a/dashboard/components/create-policy-wizard/CreatePolicyWizard.tsx b/dashboard/components/create-policy-wizard/CreatePolicyWizard.tsx index 369e3a0..b9dc8b4 100644 --- a/dashboard/components/create-policy-wizard/CreatePolicyWizard.tsx +++ b/dashboard/components/create-policy-wizard/CreatePolicyWizard.tsx @@ -1,9 +1,10 @@ "use client"; -import { useCallback, useEffect, useState } from "react"; -import { useRouter } from "next/navigation"; +import { useCallback, useState } from "react"; +import { useRouter } from "nextjs-toploader/app"; import { useWallet } from "@solana/wallet-adapter-react"; import { Keypair } from "@solana/web3.js"; +import { toast } from "sonner"; import { WizardStepPanels } from "@/components/create-policy-wizard/wizard-step-panels"; import { AgentSecretBackupModal } from "@/components/create-policy-wizard/agent-secret-backup-modal"; import { getErrorMessage } from "@/lib/api/client"; @@ -42,17 +43,10 @@ export function CreatePolicyWizard() { const [agentKeypair, setAgentKeypair] = useState(null); const [submitting, setSubmitting] = useState(false); const [submitError, setSubmitError] = useState(null); - const [toastError, setToastError] = useState(null); - - useEffect(() => { - if (!toastError) return; - const timeout = window.setTimeout(() => setToastError(null), 5000); - return () => window.clearTimeout(timeout); - }, [toastError]); const publishError = useCallback((message: string) => { setSubmitError(message); - setToastError(message); + toast.error(message); }, []); const runCreate = useCallback( @@ -153,15 +147,6 @@ export function CreatePolicyWizard() { return (
- {toastError ? ( -
- {toastError} -
- ) : null} {agentKeypair ? ( +
+
+ ); + } + + let connected = false; + let publicKey: { toBase58(): string } | null = null; + try { + connected = Boolean(walletAdapter.connected); + publicKey = walletAdapter.publicKey ?? null; + } catch { + // Graceful fallback when WalletProvider is not mounted (e.g. tests). + } + const walletAddress = publicKey ? shortAddress(publicKey.toBase58(), 4, 4) : "Not connected"; - const monitorLinks = [ - { href: "/agents", label: "Agents", icon: navIconPaths.agents, count: "5" }, - { href: "/activity", label: "Activity", icon: navIconPaths.activity, count: "21" }, - { href: "/incidents", label: "Incidents", icon: navIconPaths.incidents, count: "2" }, - ]; const currentPath = pathname ?? ""; - const isLinkActive = (href: string, nested = true) => - href === "/" ? currentPath === "/" : currentPath === href || (nested && currentPath.startsWith(`${href}/`)); + const isLinkActive = (href: string, nested: boolean | undefined) => + href === "/" + ? currentPath === "/" + : currentPath === href || (nested !== false && currentPath.startsWith(`${href}/`)); + + const collapsed = sidebarCollapsed; + const sidebarWidth = collapsed ? "w-[60px]" : "w-60"; + + const renderNavItem = (link: NavLink) => { + const active = isLinkActive(link.href, link.nested); + return ( + setSidebarOpen(false)} + className={`group relative flex items-center rounded-md text-[13px] transition-[background,color] duration-150 ${collapsed ? "h-9 w-9 mx-auto justify-center" : "gap-2.5 px-2.5 py-[7px]" + } ${active + ? "bg-primary/12 text-primary shadow-[inset_0_0_0_1px_hsl(var(--primary)/0.32)]" + : "text-muted-foreground hover:bg-secondary hover:text-foreground" + }`} + > + + {!collapsed ? {link.label} : null} + + ); + }; return ( -
+
{/* Mobile backdrop */} {sidebarOpen ? ( + + +
+ Dashboard + / + {title}
-
+ +
+ -
+

{title}

- {subtitle ?

{subtitle}

: null} + {subtitle ?

{subtitle}

: null}
{actions}
@@ -203,9 +270,9 @@ export function AppShell({ export function StatusChip({ tone, children }: { tone: "green" | "amber" | "red"; children: ReactNode }) { const toneClasses = { - green: "bg-emerald-500/20 text-emerald-300 border border-emerald-500/30 shadow-emerald-500/10", - amber: "bg-amber-500/20 text-amber-300 border border-amber-500/30 shadow-amber-500/10", - red: "bg-red-500/20 text-red-300 border border-red-500/30 shadow-red-500/10", + green: "bg-teal-500/15 text-teal-500 border border-teal-500/30 shadow-teal-500/10", + amber: "bg-amber-500/15 text-amber-500 border border-amber-500/30 shadow-amber-500/10", + red: "bg-crimson-500/15 text-crimson-500 border border-crimson-500/30 shadow-crimson-500/10", }; return {children}; } @@ -215,39 +282,39 @@ export function PolicyCard({ policy }: { policy: PolicySummary }) { const budget = lamportsToSol(policy.dailyBudgetLamports); const displayBudget = budget > 0 && budget < 1 ? budget.toFixed(2) : budget.toFixed(0); const spendPct = budget > 0 ? Math.min((spent / budget) * 100, 100) : 0; - const progressTone = spendPct >= 90 ? "bg-red-500" : spendPct >= 66 ? "bg-amber-400" : "bg-emerald-400"; + const progressTone = spendPct >= 90 ? "bg-crimson-500" : spendPct >= 66 ? "bg-amber-500" : "bg-teal-500"; const sessionExpired = new Date(policy.sessionExpiry).getTime() < Date.now(); return (
-
+
{policy.label ?? "Unlabeled agent"}
-
+
{shortAddress(policy.pubkey, 6, 6)}
{!policy.isActive ? ( - + PAUSED ) : sessionExpired ? ( - + SESSION EXPIRED ) : ( - + ACTIVE )} {policy.squadsMultisig ? ( - + SQUADS ) : null} @@ -255,29 +322,29 @@ export function PolicyCard({ policy }: { policy: PolicySummary }) {
-
+
Daily spend - - {spent.toFixed(2)} / {displayBudget} SOL + + {spent.toFixed(2)} / {displayBudget} SOL
-
+
-
+
-
Session
-
{formatRelativeTime(policy.sessionExpiry)}
+
Session
+
{formatRelativeTime(policy.sessionExpiry)}
-
Per tx cap
-
{lamportsToSol(policy.maxTxLamports)} SOL
+
Per tx cap
+
{lamportsToSol(policy.maxTxLamports)} SOL
-
+
Programs: {policy.allowedPrograms.slice(0, 3).map(programLabel).join(", ")} {policy.allowedPrograms.length > 3 ? ` +${policy.allowedPrograms.length - 3}` : ""}
@@ -288,8 +355,8 @@ export function PolicyCard({ policy }: { policy: PolicySummary }) { export function Metric({ label, value }: { label: string; value: ReactNode }) { return (
-
{label}
-
{value}
+
{label}
+
{value}
); } @@ -299,11 +366,11 @@ export function SpendGauge({ spentLamports, budgetLamports }: { spentLamports: s const budget = lamportsToSol(budgetLamports); const ratio = budget === 0 ? 0 : (spent / budget) * 100; const clampedRatio = Math.min(ratio, 100); - const tone = ratio >= 90 ? "#ff6b6b" : ratio >= 66 ? "#ffb84d" : "#29c780"; + const tone = ratio >= 90 ? "hsl(var(--crimson))" : ratio >= 66 ? "hsl(var(--amber))" : "hsl(var(--teal))"; if (budget <= 0) { return ( -
+
No budget set.
); @@ -326,17 +393,17 @@ export function SpendGauge({ spentLamports, budgetLamports }: { spentLamports: s
{ratio > 100 ? ( <> -
+
OVER BUDGET
-
+
{spent.toFixed(1)} / {budget.toFixed(1)} SOL
) : ( <> -
{spent.toFixed(1)} SOL
-
of {budget.toFixed(1)} SOL budget
+
{spent.toFixed(1)} SOL
+
of {budget.toFixed(1)} SOL budget
)}
@@ -354,27 +421,27 @@ export function TransactionRow({ const verdict = effectiveVerdict(transaction.verdict?.verdict); const tone = verdictTone(verdict); return ( -
+
{verdict.toUpperCase()} {programLabel(transaction.targetProgram)} - {showAgent ? {policyLabel(transaction.policyPubkey)} : null} + {showAgent ? {policyLabel(transaction.policyPubkey)} : null}
-
+
{transaction.verdict?.reasoning ?? "No anomaly reasoning stored for this transaction."}
-
+
{transaction.amountLamports ? `${lamportsToSol(transaction.amountLamports).toFixed(2)} SOL` : "—"}
-
{formatRelativeTime(transaction.blockTime)}
+
{formatRelativeTime(transaction.blockTime)}
-
- {shortAddress(transaction.txnSig, 10, 8)} +
+ {shortAddress(transaction.txnSig, 10, 8)} {formatDateTime(transaction.blockTime)}
@@ -387,20 +454,20 @@ export function IncidentTimeline({ items: Array<{ time: string; title: string; detail: string; tone: "green" | "amber" | "red" | "blue" }>; }) { const toneClasses: Record<"green" | "amber" | "red" | "blue", string> = { - green: "bg-emerald-500 shadow-[0_0_0_1px_#22c55e,0_0_12px_rgba(34,197,94,0.5)]", - amber: "bg-amber-500 shadow-[0_0_0_1px_#f59e0b,0_0_12px_rgba(245,158,11,0.5)]", - red: "bg-red-500 shadow-[0_0_0_1px_#ef4444,0_0_12px_rgba(239,68,68,0.5)]", - blue: "bg-blue-500 shadow-[0_0_0_1px_#3b82f6,0_0_12px_rgba(59,130,246,0.5)]", + green: "bg-teal-500 shadow-[0_0_0_1px_hsl(var(--teal)),0_0_12px_hsl(var(--teal)/0.45)]", + amber: "bg-amber-500 shadow-[0_0_0_1px_hsl(var(--amber)),0_0_12px_hsl(var(--amber)/0.45)]", + red: "bg-crimson-500 shadow-[0_0_0_1px_hsl(var(--crimson)),0_0_12px_hsl(var(--crimson)/0.45)]", + blue: "bg-primary shadow-[0_0_0_1px_hsl(var(--primary)),0_0_12px_hsl(var(--primary)/0.45)]", }; return ( -
+
{items.map((item) => (
- -
{item.time}
-
{item.title}
-
{item.detail}
+ +
{item.time}
+
{item.title}
+
{item.detail}
))}
@@ -409,32 +476,32 @@ export function IncidentTimeline({ export function IncidentTable({ incidents }: { incidents: IncidentSummary[] }) { if (!incidents.length) { - return
No incidents yet.
; + return
No incidents yet.
; } return ( -
+
- - - - + + + + {incidents.map((incident) => ( - - + - - - + + diff --git a/dashboard/components/edit-policy-form.tsx b/dashboard/components/edit-policy-form.tsx index 2e4fa26..7ff0571 100644 --- a/dashboard/components/edit-policy-form.tsx +++ b/dashboard/components/edit-policy-form.tsx @@ -4,6 +4,7 @@ import { useEffect, useRef, useState } from "react"; import { useQueryClient } from "@tanstack/react-query"; import { useWallet } from "@solana/wallet-adapter-react"; import { PublicKey } from "@solana/web3.js"; +import { toast } from "sonner"; import { getErrorMessage } from "@/lib/api/client"; import { queryKeys } from "@/lib/api/query-keys"; import { usePolicyQuery } from "@/lib/api/use-policy-query"; @@ -56,16 +57,8 @@ export function EditPolicyForm({ policyPubkey }: { policyPubkey: string }) { const [pasteError, setPasteError] = useState(null); const [saving, setSaving] = useState(false); const [saveError, setSaveError] = useState(null); - const [saveBanner, setSaveBanner] = useState(null); - const [toastError, setToastError] = useState<{ id: number; message: string } | null>(null); const initializedDraftForPubkeyRef = useRef(null); - useEffect(() => { - if (!toastError) return; - const timeout = window.setTimeout(() => setToastError(null), 5000); - return () => window.clearTimeout(timeout); - }, [toastError]); - useEffect(() => { if (policyQuery.data && initializedDraftForPubkeyRef.current !== policyPubkey) { setDraft(policySummaryToDraft(policyQuery.data)); @@ -105,7 +98,6 @@ export function EditPolicyForm({ policyPubkey }: { policyPubkey: string }) { const updateDraft = (partial: Partial) => { setDraft((d) => (d ? { ...d, ...partial } : d)); setFieldErrors({}); - setSaveBanner(null); }; const addProgram = (pubkey: string) => { @@ -121,7 +113,6 @@ export function EditPolicyForm({ policyPubkey }: { policyPubkey: string }) { const onSave = async () => { setSaveError(null); - setSaveBanner(null); const { ok, errors } = validateFullDraft(draft); if (!ok) { setFieldErrors(errors); @@ -157,11 +148,11 @@ export function EditPolicyForm({ policyPubkey }: { policyPubkey: string }) { }); setDraft(policySummaryToDraft(summary)); - setSaveBanner("Policy updated on-chain. Cache refreshed."); + toast.success("Policy updated on-chain. Cache refreshed."); } catch (e) { const message = getErrorMessage(e); setSaveError(message); - setToastError({ id: Date.now(), message }); + toast.error(message); } finally { setSaving(false); } @@ -169,20 +160,6 @@ export function EditPolicyForm({ policyPubkey }: { policyPubkey: string }) { return (
- {toastError ? ( -
- {toastError.message} -
- ) : null} - {saveBanner ? ( -
- {saveBanner} -
- ) : null} {saveError ? (
{saveError} diff --git a/dashboard/components/kill-switch-button.tsx b/dashboard/components/kill-switch-button.tsx index a7f3807..4448214 100644 --- a/dashboard/components/kill-switch-button.tsx +++ b/dashboard/components/kill-switch-button.tsx @@ -1,9 +1,10 @@ "use client"; -import { useEffect, useState } from "react"; +import { useState } from "react"; import { useQueryClient } from "@tanstack/react-query"; import { useWallet } from "@solana/wallet-adapter-react"; import { PublicKey } from "@solana/web3.js"; +import { toast } from "sonner"; import { getErrorMessage } from "@/lib/api/client"; import { queryKeys } from "@/lib/api/query-keys"; import { GuardrailsClient } from "@/lib/sdk/client"; @@ -22,14 +23,6 @@ export function KillSwitchButton({ policy }: { policy: PolicySummary }) { const [reason, setReason] = useState(""); const [busy, setBusy] = useState(false); const [error, setError] = useState(null); - const [banner, setBanner] = useState(null); - const [toastError, setToastError] = useState(null); - - useEffect(() => { - if (!toastError) return; - const timeout = window.setTimeout(() => setToastError(null), 5000); - return () => window.clearTimeout(timeout); - }, [toastError]); const isOwner = Boolean(publicKey && publicKey.toBase58() === policy.owner); const walletReady = Boolean(provider && programId); @@ -68,24 +61,23 @@ export function KillSwitchButton({ policy }: { policy: PolicySummary }) { if (!reasonOk || !provider || !programId || busy) return; setBusy(true); setError(null); - setBanner(null); try { const client = new GuardrailsClient(provider, programId); await client.pauseAgent(new PublicKey(policy.pubkey), trimmedReason); updateCache(false); - setBanner("Agent paused on-chain."); + toast.success("Agent paused on-chain."); setOpen(false); setReason(""); } catch (e) { if (isAlreadyInState(e, true)) { updateCache(false); - setBanner("Agent is paused on-chain."); + toast.success("Agent is paused on-chain."); setOpen(false); setReason(""); } else { const message = getErrorMessage(e); setError(message); - setToastError(message); + toast.error(message); } } finally { setBusy(false); @@ -96,20 +88,19 @@ export function KillSwitchButton({ policy }: { policy: PolicySummary }) { if (!provider || !programId || busy) return; setBusy(true); setError(null); - setBanner(null); try { const client = new GuardrailsClient(provider, programId); await client.resumeAgent(new PublicKey(policy.pubkey)); updateCache(true); - setBanner("Agent resumed on-chain."); + toast.success("Agent resumed on-chain."); } catch (e) { if (isAlreadyInState(e, false)) { updateCache(true); - setBanner("Agent is active on-chain."); + toast.success("Agent is active on-chain."); } else { const message = getErrorMessage(e); setError(message); - setToastError(message); + toast.error(message); } } finally { setBusy(false); @@ -118,21 +109,6 @@ export function KillSwitchButton({ policy }: { policy: PolicySummary }) { return (
- {toastError ? ( -
- {toastError} -
- ) : null} - {banner ? ( -
- {banner} -
- ) : null} - {policy.isActive ? (
AgentReasonPaused atStatusAgentReasonPaused atStatus
- +
+ {policyLabel(incident.policyPubkey)} {incident.reason}{formatDateTime(incident.pausedAt)} + {incident.reason}{formatDateTime(incident.pausedAt)} {incident.resolvedAt ? "Resolved" : "Active"}
{children}
), - thead: ({ children }) => {children}, + thead: ({ children }) => {children}, tbody: ({ children }) => {children}, - tr: ({ children }) => {children}, - th: ({ children }) => {children}, - td: ({ children }) => {children}, + tr: ({ children }) => {children}, + th: ({ children }) => {children}, + td: ({ children }) => {children}, }; export function ReportMarkdown({ markdown }: { markdown: string }) { diff --git a/dashboard/components/rotate-agent-key-button.tsx b/dashboard/components/rotate-agent-key-button.tsx index 2cb35f4..5cbc03c 100644 --- a/dashboard/components/rotate-agent-key-button.tsx +++ b/dashboard/components/rotate-agent-key-button.tsx @@ -1,7 +1,7 @@ "use client"; import { useState } from "react"; -import { useRouter } from "next/navigation"; +import { useRouter } from "nextjs-toploader/app"; import { useQueryClient } from "@tanstack/react-query"; import { useWallet } from "@solana/wallet-adapter-react"; import { Keypair, PublicKey } from "@solana/web3.js"; diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json index e819528..8b02430 100644 --- a/dashboard/package-lock.json +++ b/dashboard/package-lock.json @@ -19,12 +19,14 @@ "@tanstack/react-query": "^5.50.0", "dotenv": "^17.4.2", "next": "^14.2.35", + "nextjs-toploader": "^3.9.17", "prisma": "^6.19.3", "react": "^18.3.0", "react-dom": "^18.3.0", "react-markdown": "^10.1.0", "recharts": "^2.12.0", "remark-gfm": "^4.0.1", + "sonner": "^2.0.7", "zustand": "^4.5.0" }, "devDependencies": { @@ -18871,6 +18873,24 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/nextjs-toploader": { + "version": "3.9.17", + "resolved": "https://registry.npmjs.org/nextjs-toploader/-/nextjs-toploader-3.9.17.tgz", + "integrity": "sha512-9OF0KSSLtoSAuNg2LZ3aTl4hR9mBDj5L9s9DZiFCbMlXehyICGjkIz5dVGzuATU2bheJZoBdFgq9w07AKSuQQw==", + "license": "MIT", + "dependencies": { + "nprogress": "^0.2.0", + "prop-types": "^15.8.1" + }, + "funding": { + "url": "https://buymeacoffee.com/thesgj" + }, + "peerDependencies": { + "next": ">= 6.0.0", + "react": ">= 16.0.0", + "react-dom": ">= 16.0.0" + } + }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -18990,6 +19010,12 @@ "node": ">=0.10.0" } }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", + "license": "MIT" + }, "node_modules/nullthrows": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", @@ -21584,6 +21610,16 @@ "atomic-sleep": "^1.0.0" } }, + "node_modules/sonner": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz", + "integrity": "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==", + "license": "MIT", + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", diff --git a/dashboard/package.json b/dashboard/package.json index 4208072..43418ce 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -27,12 +27,14 @@ "@tanstack/react-query": "^5.50.0", "dotenv": "^17.4.2", "next": "^14.2.35", + "nextjs-toploader": "^3.9.17", "prisma": "^6.19.3", "react": "^18.3.0", "react-dom": "^18.3.0", "react-markdown": "^10.1.0", "recharts": "^2.12.0", "remark-gfm": "^4.0.1", + "sonner": "^2.0.7", "zustand": "^4.5.0" }, "devDependencies": { diff --git a/dashboard/tailwind.config.ts b/dashboard/tailwind.config.ts index 23b2ccf..6e48635 100644 --- a/dashboard/tailwind.config.ts +++ b/dashboard/tailwind.config.ts @@ -7,7 +7,54 @@ const config: Config = { "./components/**/*.{ts,tsx}", ], theme: { - extend: {}, + extend: { + colors: { + border: "hsl(var(--border) / )", + input: "hsl(var(--input) / )", + ring: "hsl(var(--ring) / )", + background: "hsl(var(--background) / )", + foreground: "hsl(var(--foreground) / )", + primary: { + DEFAULT: "hsl(var(--primary) / )", + foreground: "hsl(var(--primary-foreground) / )", + }, + secondary: { + DEFAULT: "hsl(var(--secondary) / )", + foreground: "hsl(var(--secondary-foreground) / )", + }, + destructive: { + DEFAULT: "hsl(var(--destructive) / )", + foreground: "hsl(var(--destructive-foreground) / )", + }, + muted: { + DEFAULT: "hsl(var(--muted) / )", + foreground: "hsl(var(--muted-foreground) / )", + }, + accent: { + DEFAULT: "hsl(var(--accent) / )", + foreground: "hsl(var(--accent-foreground) / )", + }, + card: { + DEFAULT: "hsl(var(--card) / )", + foreground: "hsl(var(--card-foreground) / )", + border: "hsl(var(--card-border) / )", + }, + popover: { + DEFAULT: "hsl(var(--popover) / )", + foreground: "hsl(var(--popover-foreground) / )", + border: "hsl(var(--popover-border) / )", + }, + teal: { + 500: "hsl(var(--teal) / )", + }, + amber: { + 500: "hsl(var(--amber) / )", + }, + crimson: { + 500: "hsl(var(--crimson) / )", + }, + }, + }, }, plugins: [], }; diff --git a/server/package-lock.json b/server/package-lock.json new file mode 100644 index 0000000..302cf0c --- /dev/null +++ b/server/package-lock.json @@ -0,0 +1,3953 @@ +{ + "name": "guardrails-server", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "guardrails-server", + "version": "0.1.0", + "dependencies": { + "@anthropic-ai/sdk": "^0.30.1", + "@coral-xyz/anchor": "^0.30.1", + "@prisma/client": "^6.19.3", + "@solana/web3.js": "^1.98.4", + "cookie-parser": "^1.4.7", + "cors": "^2.8.6", + "dotenv": "^17.4.2", + "express": "^4.22.1", + "express-rate-limit": "^8.4.1", + "jsonwebtoken": "^9.0.3", + "tweetnacl": "^1.0.3" + }, + "devDependencies": { + "@types/cookie-parser": "^1.4.10", + "@types/cors": "^2.8.19", + "@types/express": "^5.0.6", + "@types/jsonwebtoken": "^9.0.10", + "@types/node": "^20.19.39", + "@types/supertest": "^7.2.0", + "prisma": "^6.19.3", + "supertest": "^7.2.2", + "tsx": "^4.21.0", + "typescript": "^5.9.3", + "vitest": "^4.1.5" + } + }, + "node_modules/@anthropic-ai/sdk": { + "version": "0.30.1", + "license": "MIT", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + } + }, + "node_modules/@anthropic-ai/sdk/node_modules/@types/node": { + "version": "18.19.130", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@anthropic-ai/sdk/node_modules/undici-types": { + "version": "5.26.5", + "license": "MIT" + }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@coral-xyz/anchor": { + "version": "0.30.1", + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "@coral-xyz/anchor-errors": "^0.30.1", + "@coral-xyz/borsh": "^0.30.1", + "@noble/hashes": "^1.3.1", + "@solana/web3.js": "^1.68.0", + "bn.js": "^5.1.2", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.2", + "camelcase": "^6.3.0", + "cross-fetch": "^3.1.5", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "superstruct": "^0.15.4", + "toml": "^3.0.0" + }, + "engines": { + "node": ">=11" + } + }, + "node_modules/@coral-xyz/anchor-errors": { + "version": "0.30.1", + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/@coral-xyz/borsh": { + "version": "0.30.1", + "license": "Apache-2.0", + "dependencies": { + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.68.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.7", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@noble/curves": { + "version": "1.9.7", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.127.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@paralleldrive/cuid2": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, + "node_modules/@prisma/client": { + "version": "6.19.3", + "hasInstallScript": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "peerDependencies": { + "prisma": "*", + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@prisma/config": { + "version": "6.19.3", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "c12": "3.1.0", + "deepmerge-ts": "7.1.5", + "effect": "3.21.0", + "empathic": "2.0.0" + } + }, + "node_modules/@prisma/debug": { + "version": "6.19.3", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/engines": { + "version": "6.19.3", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.19.3", + "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", + "@prisma/fetch-engine": "6.19.3", + "@prisma/get-platform": "6.19.3" + } + }, + "node_modules/@prisma/engines-version": { + "version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/fetch-engine": { + "version": "6.19.3", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.19.3", + "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", + "@prisma/get-platform": "6.19.3" + } + }, + "node_modules/@prisma/get-platform": { + "version": "6.19.3", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.19.3" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.17.tgz", + "integrity": "sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.17.tgz", + "integrity": "sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.17.tgz", + "integrity": "sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.17.tgz", + "integrity": "sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.17.tgz", + "integrity": "sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.17.tgz", + "integrity": "sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.17.tgz", + "integrity": "sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.17.tgz", + "integrity": "sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.17.tgz", + "integrity": "sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.17.tgz", + "integrity": "sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.17.tgz", + "integrity": "sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.17.tgz", + "integrity": "sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.17.tgz", + "integrity": "sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.17.tgz", + "integrity": "sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.17", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.17", + "dev": true, + "license": "MIT" + }, + "node_modules/@solana/buffer-layout": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "buffer": "~6.0.3" + }, + "engines": { + "node": ">=5.10" + } + }, + "node_modules/@solana/codecs-core": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@solana/codecs-numbers": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "2.3.0", + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@solana/errors": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "chalk": "^5.4.1", + "commander": "^14.0.0" + }, + "bin": { + "errors": "bin/cli.mjs" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" + } + }, + "node_modules/@solana/web3.js": { + "version": "1.98.4", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.0", + "@noble/curves": "^1.4.2", + "@noble/hashes": "^1.4.0", + "@solana/buffer-layout": "^4.0.1", + "@solana/codecs-numbers": "^2.1.0", + "agentkeepalive": "^4.5.0", + "bn.js": "^5.2.1", + "borsh": "^0.7.0", + "bs58": "^4.0.1", + "buffer": "6.0.3", + "fast-stable-stringify": "^1.0.0", + "jayson": "^4.1.1", + "node-fetch": "^2.7.0", + "rpc-websockets": "^9.0.2", + "superstruct": "^2.0.2" + } + }, + "node_modules/@solana/web3.js/node_modules/superstruct": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@swc/helpers": { + "version": "0.5.21", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cookie-parser": { + "version": "1.4.10", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/cookiejar": { + "version": "2.1.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/cors": { + "version": "2.8.19", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "5.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*", + "@types/node": "*" + } + }, + "node_modules/@types/methods": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.39", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.13", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.4" + } + }, + "node_modules/@types/qs": { + "version": "6.15.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, + "node_modules/@types/superagent": { + "version": "8.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/cookiejar": "^2.1.5", + "@types/methods": "^1.1.4", + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/supertest": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/methods": "^1.1.4", + "@types/superagent": "^8.1.0" + } + }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "7.4.7", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vitest/expect": { + "version": "4.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.5", + "@vitest/utils": "4.1.5", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.5", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.5", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.5", + "@vitest/utils": "4.1.5", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.5", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.5", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agentkeepalive": { + "version": "4.6.0", + "license": "MIT", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/asap": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/base-x": { + "version": "3.0.11", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bn.js": { + "version": "5.2.3", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.5", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.15.1", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/borsh": { + "version": "0.7.0", + "license": "Apache-2.0", + "dependencies": { + "bn.js": "^5.2.0", + "bs58": "^4.0.0", + "text-encoding-utf-8": "^1.0.2" + } + }, + "node_modules/bs58": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "license": "BSD-3-Clause" + }, + "node_modules/buffer-layout": { + "version": "1.2.2", + "license": "MIT", + "engines": { + "node": ">=4.5" + } + }, + "node_modules/bufferutil": { + "version": "4.1.0", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/c12": { + "version": "3.1.0", + "devOptional": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.3", + "confbox": "^0.2.2", + "defu": "^6.1.4", + "dotenv": "^16.6.1", + "exsolve": "^1.0.7", + "giget": "^2.0.0", + "jiti": "^2.4.2", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^1.0.0", + "pkg-types": "^2.2.0", + "rc9": "^2.1.2" + }, + "peerDependencies": { + "magicast": "^0.3.5" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, + "node_modules/c12/node_modules/dotenv": { + "version": "16.6.1", + "devOptional": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chai": { + "version": "6.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "devOptional": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/citty": { + "version": "0.1.6", + "devOptional": true, + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "14.0.3", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/confbox": { + "version": "0.2.4", + "devOptional": true, + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.4.2", + "devOptional": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.7", + "license": "MIT", + "dependencies": { + "cookie": "0.7.2", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "license": "MIT" + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.6", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-fetch": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, + "node_modules/crypto-hash": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/deepmerge-ts": { + "version": "7.1.5", + "devOptional": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/defu": { + "version": "6.1.7", + "devOptional": true, + "license": "MIT" + }, + "node_modules/delay": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "devOptional": true, + "license": "MIT" + }, + "node_modules/destroy": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dotenv": { + "version": "17.4.2", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/effect": { + "version": "3.21.0", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "fast-check": "^3.23.1" + } + }, + "node_modules/empathic": { + "version": "2.0.0", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "license": "MIT" + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "es6-promise": "^4.0.3" + } + }, + "node_modules/esbuild": { + "version": "0.27.7", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "license": "MIT" + }, + "node_modules/expect-type": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/express": { + "version": "4.22.1", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "8.4.1", + "license": "MIT", + "dependencies": { + "ip-address": "10.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/exsolve": { + "version": "1.0.8", + "devOptional": true, + "license": "MIT" + }, + "node_modules/eyes": { + "version": "0.1.8", + "engines": { + "node": "> 0.1.90" + } + }, + "node_modules/fast-check": { + "version": "3.23.2", + "devOptional": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT", + "dependencies": { + "pure-rand": "^6.1.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-stable-stringify": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "1.7.2", + "license": "MIT" + }, + "node_modules/formdata-node": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" + } + }, + "node_modules/formidable": { + "version": "3.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", + "dezalgo": "^1.0.4", + "once": "^1.4.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-tsconfig": { + "version": "4.14.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/giget": { + "version": "2.0.0", + "devOptional": true, + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.0", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.6", + "nypm": "^0.6.0", + "pathe": "^2.0.3" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ip-address": { + "version": "10.1.0", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/isomorphic-ws": { + "version": "4.0.1", + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/jayson": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "@types/connect": "^3.4.33", + "@types/node": "^12.12.54", + "@types/ws": "^7.4.4", + "commander": "^2.20.3", + "delay": "^5.0.0", + "es6-promisify": "^5.0.0", + "eyes": "^0.1.8", + "isomorphic-ws": "^4.0.1", + "json-stringify-safe": "^5.0.1", + "stream-json": "^1.9.1", + "uuid": "^8.3.2", + "ws": "^7.5.10" + }, + "bin": { + "jayson": "bin/jayson.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jayson/node_modules/@types/node": { + "version": "12.20.55", + "license": "MIT" + }, + "node_modules/jayson/node_modules/commander": { + "version": "2.20.3", + "license": "MIT" + }, + "node_modules/jayson/node_modules/ws": { + "version": "7.5.10", + "license": "MIT", + "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 + } + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "devOptional": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "license": "ISC" + }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/jwa": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "license": "MIT" + }, + "node_modules/lower-case": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "devOptional": true, + "license": "MIT" + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "license": "MIT", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/nypm": { + "version": "0.6.6", + "devOptional": true, + "license": "MIT", + "dependencies": { + "citty": "^0.2.2", + "pathe": "^2.0.3", + "tinyexec": "^1.1.1" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/nypm/node_modules/citty": { + "version": "0.2.2", + "devOptional": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obug": { + "version": "2.1.1", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/ohash": { + "version": "2.0.11", + "devOptional": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/pako": { + "version": "2.1.0", + "license": "(MIT AND Zlib)" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.13", + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "devOptional": true, + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "devOptional": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "devOptional": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/postcss": { + "version": "8.5.12", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prisma": { + "version": "6.19.3", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/config": "6.19.3", + "@prisma/engines": "6.19.3" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "devOptional": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.14.2", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc9": { + "version": "2.1.2", + "devOptional": true, + "license": "MIT", + "dependencies": { + "defu": "^6.1.4", + "destr": "^2.0.3" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/rolldown": { + "version": "1.0.0-rc.17", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.127.0", + "@rolldown/pluginutils": "1.0.0-rc.17" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.17", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.17", + "@rolldown/binding-darwin-x64": "1.0.0-rc.17", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.17", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.17", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.17", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.17", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.17", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.17", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.17", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.17", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.17", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.17", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.17", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.17" + } + }, + "node_modules/rpc-websockets": { + "version": "9.3.8", + "license": "LGPL-3.0-only", + "dependencies": { + "@swc/helpers": "^0.5.11", + "@types/uuid": "^10.0.0", + "@types/ws": "^8.2.2", + "buffer": "^6.0.3", + "eventemitter3": "^5.0.1", + "uuid": "^11.0.0", + "ws": "^8.5.0" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/kozjak" + }, + "optionalDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^6.0.0" + } + }, + "node_modules/rpc-websockets/node_modules/@types/ws": { + "version": "8.18.1", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/rpc-websockets/node_modules/eventemitter3": { + "version": "5.0.4", + "license": "MIT" + }, + "node_modules/rpc-websockets/node_modules/uuid": { + "version": "11.1.0", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.2", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.3", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/snake-case": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "4.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/stream-chain": { + "version": "2.2.5", + "license": "BSD-3-Clause" + }, + "node_modules/stream-json": { + "version": "1.9.1", + "license": "BSD-3-Clause", + "dependencies": { + "stream-chain": "^2.2.5" + } + }, + "node_modules/superagent": { + "version": "10.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "component-emitter": "^1.3.1", + "cookiejar": "^2.1.4", + "debug": "^4.3.7", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.5", + "formidable": "^3.5.4", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.14.1" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/superagent/node_modules/debug": { + "version": "4.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/superagent/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/superstruct": { + "version": "0.15.5", + "license": "MIT" + }, + "node_modules/supertest": { + "version": "7.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cookie-signature": "^1.2.2", + "methods": "^1.1.2", + "superagent": "^10.3.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/supertest/node_modules/cookie-signature": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/text-encoding-utf-8": { + "version": "1.0.2" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.1.1", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toml": { + "version": "3.0.0", + "license": "MIT" + }, + "node_modules/tr46": { + "version": "0.0.3", + "license": "MIT" + }, + "node_modules/tslib": { + "version": "2.8.1", + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "license": "Unlicense" + }, + "node_modules/type-is": { + "version": "1.6.18", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utf-8-validate": { + "version": "6.0.6", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "8.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.10", + "rolldown": "1.0.0-rc.17", + "tinyglobby": "^0.2.16" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "4.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.5", + "@vitest/mocker": "4.1.5", + "@vitest/pretty-format": "4.1.5", + "@vitest/runner": "4.1.5", + "@vitest/snapshot": "4.1.5", + "@vitest/spy": "4.1.5", + "@vitest/utils": "4.1.5", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.5", + "@vitest/browser-preview": "4.1.5", + "@vitest/browser-webdriverio": "4.1.5", + "@vitest/coverage-istanbul": "4.1.5", + "@vitest/coverage-v8": "4.1.5", + "@vitest/ui": "4.1.5", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.20.0", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } +} From 7c11cd0956f166eed39949b341634116ad399476 Mon Sep 17 00:00:00 2001 From: Dheeraj-Manwani Date: Thu, 30 Apr 2026 19:13:00 +0530 Subject: [PATCH 2/5] Auth and dashboard layout ui revamp --- dashboard/__tests__/dashboard-ui.test.tsx | 14 +- dashboard/__tests__/providers-auth.test.ts | 6 +- dashboard/__tests__/routes-smoke.test.tsx | 11 +- dashboard/app/(auth)/signin/page.tsx | 21 +- dashboard/app/globals.css | 86 +- dashboard/app/layout.tsx | 26 +- dashboard/app/page.tsx | 122 +- dashboard/components.json | 25 + dashboard/components/auth/require-session.tsx | 102 + dashboard/components/auth/siws-sign-in.tsx | 23 +- dashboard/components/dashboard-ui.tsx | 274 +- dashboard/components/landing-auth-screen.tsx | 180 + .../landing-connect-wallet-button.tsx | 45 - dashboard/components/providers.tsx | 9 +- dashboard/components/shell-navbar-actions.tsx | 131 + dashboard/components/ui/button.tsx | 67 + dashboard/components/wallet-controls.tsx | 10 +- dashboard/lib/auth/siws-session.ts | 7 +- dashboard/lib/utils.ts | 6 + dashboard/package-lock.json | 5124 +++++++++++++++-- dashboard/package.json | 7 + dashboard/public/android-chrome-192x192.png | Bin 0 -> 54737 bytes dashboard/public/android-chrome-512x512.png | Bin 0 -> 311497 bytes dashboard/public/apple-touch-icon.png | Bin 0 -> 49303 bytes dashboard/public/favicon-16x16.png | Bin 0 -> 796 bytes dashboard/public/favicon-32x32.png | Bin 0 -> 2310 bytes dashboard/public/favicon.ico | Bin 0 -> 15406 bytes dashboard/public/logo.png | Bin 0 -> 270288 bytes dashboard/public/site.webmanifest | 1 + 29 files changed, 5587 insertions(+), 710 deletions(-) create mode 100644 dashboard/components.json create mode 100644 dashboard/components/auth/require-session.tsx create mode 100644 dashboard/components/landing-auth-screen.tsx delete mode 100644 dashboard/components/landing-connect-wallet-button.tsx create mode 100644 dashboard/components/shell-navbar-actions.tsx create mode 100644 dashboard/components/ui/button.tsx create mode 100644 dashboard/public/android-chrome-192x192.png create mode 100644 dashboard/public/android-chrome-512x512.png create mode 100644 dashboard/public/apple-touch-icon.png create mode 100644 dashboard/public/favicon-16x16.png create mode 100644 dashboard/public/favicon-32x32.png create mode 100644 dashboard/public/favicon.ico create mode 100644 dashboard/public/logo.png create mode 100644 dashboard/public/site.webmanifest diff --git a/dashboard/__tests__/dashboard-ui.test.tsx b/dashboard/__tests__/dashboard-ui.test.tsx index 589ba21..779f47d 100644 --- a/dashboard/__tests__/dashboard-ui.test.tsx +++ b/dashboard/__tests__/dashboard-ui.test.tsx @@ -14,8 +14,16 @@ vi.mock("next/navigation", () => ({ usePathname: () => "/agents", })); -vi.mock("@/components/wallet-controls", () => ({ - WalletControls: () => createElement("div", undefined, "Wallet controls"), +vi.mock("@solana/wallet-adapter-react", () => ({ + useWallet: () => ({ + connected: true, + publicKey: { toBase58: () => "WalletPub1111111111111111111111111111111" }, + disconnect: vi.fn(), + }), +})); + +vi.mock("@/components/shell-navbar-actions", () => ({ + ShellNavbarActions: () => createElement("div", undefined, "Navbar actions"), })); describe("dashboard-ui", () => { @@ -31,7 +39,7 @@ describe("dashboard-ui", () => { expect(screen.getByText("Guardrails")).toBeInTheDocument(); expect(screen.getAllByText("Guardrails overview").length).toBeGreaterThan(0); expect(screen.getByText("Body content")).toBeInTheDocument(); - expect(screen.getByText("Wallet controls")).toBeInTheDocument(); + expect(screen.getByText("Navbar actions")).toBeInTheDocument(); }); it("renders policy card details", () => { diff --git a/dashboard/__tests__/providers-auth.test.ts b/dashboard/__tests__/providers-auth.test.ts index 1946a94..8ef2f15 100644 --- a/dashboard/__tests__/providers-auth.test.ts +++ b/dashboard/__tests__/providers-auth.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; -import { clearSiwsAndRedirectToSignin } from "@/lib/auth/siws-session"; +import { clearSiwsAndRedirectHome } from "@/lib/auth/siws-session"; import { useSiwsAuthStore } from "@/lib/stores/siws-auth"; describe("providers auth redirect helper", () => { @@ -12,10 +12,10 @@ describe("providers auth redirect helper", () => { useSiwsAuthStore.getState().markSignedIn("Wallet11111111111111111111111111111111"); const redirectMock = vi.fn(); - clearSiwsAndRedirectToSignin(redirectMock); + clearSiwsAndRedirectHome(redirectMock); expect(useSiwsAuthStore.getState().siwsWallet).toBeNull(); expect(useSiwsAuthStore.getState().siwsSignedInAt).toBeNull(); - expect(redirectMock).toHaveBeenCalledWith("/signin"); + expect(redirectMock).toHaveBeenCalledWith("/"); }); }); diff --git a/dashboard/__tests__/routes-smoke.test.tsx b/dashboard/__tests__/routes-smoke.test.tsx index c3750ad..470c7a5 100644 --- a/dashboard/__tests__/routes-smoke.test.tsx +++ b/dashboard/__tests__/routes-smoke.test.tsx @@ -28,7 +28,7 @@ vi.mock("next/link", () => ({ })); vi.mock("next/navigation", () => ({ - useRouter: () => ({ push: pushMock }), + useRouter: () => ({ push: pushMock, replace: pushMock }), })); vi.mock("@solana/wallet-adapter-react", () => ({ @@ -37,6 +37,11 @@ vi.mock("@solana/wallet-adapter-react", () => ({ signMessage: vi.fn(async () => new Uint8Array([1, 2, 3])), signTransaction: vi.fn(), signAllTransactions: vi.fn(), + connected: true, + connecting: false, + disconnect: vi.fn(), + connect: vi.fn().mockResolvedValue(undefined), + wallet: { adapter: {} }, }), })); @@ -109,7 +114,7 @@ describe("phase 1 route smoke tests", () => { it("renders landing and agents routes", async () => { const Home = (await import("@/app/page")).default; render(createElement(Home)); - expect(screen.getByText("Sign in with Solana")).toBeTruthy(); + expect(screen.getByText("Agent Guardrails")).toBeTruthy(); cleanup(); const AgentsPage = (await import("@/app/agents/page")).default; @@ -155,7 +160,7 @@ describe("phase 1 route smoke tests", () => { it("renders signin, agent detail, policy edit, and incident detail routes", async () => { const SignInPage = (await import("@/app/(auth)/signin/page")).default; render(createElement(SignInPage)); - expect(screen.getByRole("heading", { name: "Sign In" })).toBeTruthy(); + expect(screen.getByText("Redirecting…")).toBeTruthy(); cleanup(); const AgentDetailPage = (await import("@/app/agents/[pubkey]/page")).default; diff --git a/dashboard/app/(auth)/signin/page.tsx b/dashboard/app/(auth)/signin/page.tsx index 335d0c2..e13265c 100644 --- a/dashboard/app/(auth)/signin/page.tsx +++ b/dashboard/app/(auth)/signin/page.tsx @@ -1,13 +1,18 @@ -import { AppShell } from "@/components/dashboard-ui"; -import { SiwsSignIn } from "@/components/auth/siws-sign-in"; +"use client"; + +import { useEffect } from "react"; +import { useRouter } from "next/navigation"; export default function SignInPage() { + const router = useRouter(); + + useEffect(() => { + router.replace("/"); + }, [router]); + return ( - - - +
+

Redirecting…

+
); } diff --git a/dashboard/app/globals.css b/dashboard/app/globals.css index 8178edf..7716f27 100644 --- a/dashboard/app/globals.css +++ b/dashboard/app/globals.css @@ -1,3 +1,5 @@ +@import "tw-animate-css"; +@import "shadcn/tailwind.css"; @tailwind base; @tailwind components; @tailwind utilities; @@ -32,7 +34,7 @@ } * { - @apply border-border; + @apply border-border outline-ring/50; } html, @@ -41,11 +43,89 @@ } body { - @apply bg-background text-foreground antialiased; + @apply antialiased bg-background text-foreground; background-image: radial-gradient(circle at 10% -10%, hsl(var(--teal) / 0.16), transparent 45%), radial-gradient(circle at 100% 0%, hsl(var(--teal) / 0.08), transparent 35%); } + .theme { + --font-heading: var(--font-sans); + --font-sans: var(--font-sans); + } + :root { + --background: oklch(1 0 0); + --foreground: oklch(0.145 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.205 0 0); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted: oklch(0.97 0 0); + --muted-foreground: oklch(0.556 0 0); + --accent: oklch(0.97 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --input: oklch(0.922 0 0); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.87 0 0); + --chart-2: oklch(0.556 0 0); + --chart-3: oklch(0.439 0 0); + --chart-4: oklch(0.371 0 0); + --chart-5: oklch(0.269 0 0); + --radius: 0.625rem; + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); + } + .dark { + --background: oklch(0.145 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.205 0 0); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.205 0 0); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.922 0 0); + --primary-foreground: oklch(0.205 0 0); + --secondary: oklch(0.269 0 0); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.556 0 0); + --chart-1: oklch(0.87 0 0); + --chart-2: oklch(0.556 0 0); + --chart-3: oklch(0.439 0 0); + --chart-4: oklch(0.371 0 0); + --chart-5: oklch(0.269 0 0); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.556 0 0); + } + html { + @apply font-sans; + } + + .font-brand { + font-family: var(--font-brand), var(--font-sans), sans-serif; + } } @layer components { @@ -85,4 +165,4 @@ opacity: 1; transform: translateY(0); } -} +} \ No newline at end of file diff --git a/dashboard/app/layout.tsx b/dashboard/app/layout.tsx index 0389a6c..b66d853 100644 --- a/dashboard/app/layout.tsx +++ b/dashboard/app/layout.tsx @@ -1,11 +1,35 @@ import "@solana/wallet-adapter-react-ui/styles.css"; import "./globals.css"; import type { ReactNode } from "react"; +import type { Metadata } from "next"; import { AppProviders } from "@/components/providers"; +import { Inter, Michroma } from "next/font/google"; +import { cn } from "@/lib/utils"; + +const inter = Inter({ subsets: ['latin'], variable: '--font-sans' }); +const michroma = Michroma({ subsets: ["latin"], weight: "400", variable: "--font-brand" }); + +export const metadata: Metadata = { + title: "Agent Guardrails Dashboard", + icons: { + icon: [ + { url: "/favicon.ico", sizes: "any" }, + { url: "/favicon-16x16.png", sizes: "16x16", type: "image/png" }, + { url: "/favicon-32x32.png", sizes: "32x32", type: "image/png" }, + ], + apple: [{ url: "/apple-touch-icon.png", sizes: "180x180" }], + other: [ + { rel: "android-chrome", url: "/android-chrome-192x192.png", sizes: "192x192" }, + { rel: "android-chrome", url: "/android-chrome-512x512.png", sizes: "512x512" }, + ], + }, + manifest: "/site.webmanifest", +}; + export default function RootLayout({ children }: { children: ReactNode }) { return ( - + {children} diff --git a/dashboard/app/page.tsx b/dashboard/app/page.tsx index 6f16e48..47914be 100644 --- a/dashboard/app/page.tsx +++ b/dashboard/app/page.tsx @@ -1,123 +1,5 @@ -import Link from "next/link"; -import { LandingConnectWalletButton } from "@/components/landing-connect-wallet-button"; -import { WalletControls } from "@/components/wallet-controls"; +import { LandingAuthScreen } from "@/components/landing-auth-screen"; export default function Home() { - return ( -
-
-
-
Home
- -
-
- -

Agent Guardrails landing page

- -
-
-
- -
-

- - Live on Solana devnet -

- -

- On-chain{" "} - - guardrails - -
- for AI agents -

- -

- A programmable policy layer that sits between your agent's session key and the blockchain. - Allow-list programs, cap spend, and stop compromised agents the moment they misbehave. -

- -
- - - Sign in with Solana - - - View demo incident - -
- -
- - - -
-
-
- -
- - - -
-
- ); -} - -function StatCard({ - number, - label, - tone = "text-zinc-100", -}: { - number: string; - label: string; - tone?: string; -}) { - return ( -
-
{number}
-

{label}

-
- ); -} - -function FeatureCard({ - title, - description, - iconPath, -}: { - title: string; - description: string; - iconPath: string; -}) { - return ( -
-
- - - -
-

{title}

-

{description}

-
- ); + return ; } diff --git a/dashboard/components.json b/dashboard/components.json new file mode 100644 index 0000000..3412eb4 --- /dev/null +++ b/dashboard/components.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "radix-nova", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "app/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "iconLibrary": "lucide", + "rtl": false, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "menuColor": "default", + "menuAccent": "subtle", + "registries": {} +} diff --git a/dashboard/components/auth/require-session.tsx b/dashboard/components/auth/require-session.tsx new file mode 100644 index 0000000..0c20d7d --- /dev/null +++ b/dashboard/components/auth/require-session.tsx @@ -0,0 +1,102 @@ +"use client"; + +import { useWallet } from "@solana/wallet-adapter-react"; +import { usePathname, useRouter } from "next/navigation"; +import { type ReactNode, useEffect, useState } from "react"; +import { useSiwsAuthStore } from "@/lib/stores/siws-auth"; + +/** Routes that require wallet connect + SIWS; everything else (e.g. 404) stays reachable. */ +function isProtectedDashboardPath(path: string): boolean { + return ( + path.startsWith("/agents") || + path.startsWith("/activity") || + path.startsWith("/incidents") + ); +} + +function readConnectedPubkey(adapter: ReturnType): string | null { + try { + if (adapter.connected && adapter.publicKey) { + return adapter.publicKey.toBase58(); + } + } catch { + /* WalletProvider missing in tests */ + } + return null; +} + +export function RequireSession({ children }: { children: ReactNode }) { + const pathname = usePathname() ?? ""; + const router = useRouter(); + const walletAdapter = useWallet(); + const siwsWallet = useSiwsAuthStore((s) => s.siwsWallet); + const siwsSignedInAt = useSiwsAuthStore((s) => s.siwsSignedInAt); + + const [hydrated, setHydrated] = useState(false); + + useEffect(() => { + const unsub = useSiwsAuthStore.persist.onFinishHydration(() => setHydrated(true)); + void useSiwsAuthStore.persist.rehydrate(); + setHydrated(useSiwsAuthStore.persist.hasHydrated()); + return unsub; + }, []); + + const connectedPk = readConnectedPubkey(walletAdapter); + const hasSiwsRecord = Boolean(siwsSignedInAt && siwsWallet); + const walletReady = Boolean(walletAdapter.connected && connectedPk); + const siwsOk = hasSiwsRecord && walletReady && connectedPk === siwsWallet; + const waitingForWallet = hasSiwsRecord && !walletReady; + const wrongWallet = hasSiwsRecord && walletReady && connectedPk !== siwsWallet; + + useEffect(() => { + if (!hydrated || !wrongWallet) return; + useSiwsAuthStore.getState().clearSignedIn(); + router.replace("/"); + }, [hydrated, router, wrongWallet]); + + useEffect(() => { + if (!hydrated) return; + if (siwsOk && (pathname === "/" || pathname === "/signin")) { + router.replace("/agents"); + } + }, [hydrated, pathname, router, siwsOk]); + + useEffect(() => { + if (!hydrated) return; + if (!isProtectedDashboardPath(pathname)) return; + if (siwsOk || waitingForWallet) return; + router.replace("/"); + }, [hydrated, pathname, router, siwsOk, waitingForWallet]); + + const protectedPath = isProtectedDashboardPath(pathname); + + if (!hydrated || (protectedPath && waitingForWallet)) { + return ( +
+
+
+ ); + } + + if ( + protectedPath && + !siwsOk && + !waitingForWallet + ) { + return ( +
+
+
+ ); + } + + return <>{children}; +} diff --git a/dashboard/components/auth/siws-sign-in.tsx b/dashboard/components/auth/siws-sign-in.tsx index 67b6b51..e39597f 100644 --- a/dashboard/components/auth/siws-sign-in.tsx +++ b/dashboard/components/auth/siws-sign-in.tsx @@ -4,6 +4,7 @@ import { useWallet } from "@solana/wallet-adapter-react"; import { useRouter } from "nextjs-toploader/app"; import { useSearchParams } from "next/navigation"; import { useQueryClient } from "@tanstack/react-query"; +import { Wallet } from "lucide-react"; import { useCallback, useState } from "react"; import { ApiClientError, @@ -21,26 +22,6 @@ function uint8ArrayToBase64(bytes: Uint8Array): string { return btoa(binary); } -function WalletIcon({ size = 14 }: { size?: number }) { - return ( - - ); -} - function resolveRedirectTarget(from: string | null): string { if (from && from.startsWith("/") && !from.startsWith("//")) { return from; @@ -96,7 +77,7 @@ export function SiwsSignIn() { disabled={busy || connecting} onClick={() => void onSignIn()} > - + {busy || connecting ? "Signing…" : "Sign in with Solana"} ) : ( diff --git a/dashboard/components/dashboard-ui.tsx b/dashboard/components/dashboard-ui.tsx index 22178ef..108945c 100644 --- a/dashboard/components/dashboard-ui.tsx +++ b/dashboard/components/dashboard-ui.tsx @@ -1,8 +1,20 @@ "use client"; import Link from "next/link"; +import Image from "next/image"; import { usePathname, useRouter } from "next/navigation"; import { useWallet } from "@solana/wallet-adapter-react"; +import type { LucideIcon } from "lucide-react"; +import { + Activity, + Compass, + Home, + LayoutPanelLeft, + LogOut, + Plus, + TriangleAlert, + Users, +} from "lucide-react"; import { RadialBar, RadialBarChart, ResponsiveContainer } from "recharts"; import { useEffect, type ReactNode } from "react"; import { @@ -17,53 +29,24 @@ import { } from "@/lib/utils"; import type { IncidentSummary, PolicySummary, TransactionSummary } from "@/lib/types/dashboard"; import { useLayoutStore } from "@/lib/stores/layout"; -import { WalletControls } from "./wallet-controls"; - -/* ── SVG icon paths (matching design reference) ── */ -const navIconPaths = { - home: "M3 11.5L12 4l9 7.5M5 10v10a1 1 0 001 1h4v-6h4v6h4a1 1 0 001-1V10", - agents: "M16 11a4 4 0 10-8 0 4 4 0 008 0zM3 21v-1a5 5 0 015-5h8a5 5 0 015 5v1", - activity: "M3 12h4l3-8 4 16 3-8h4", - incidents: "M12 9v4m0 4h.01M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z", - plus: "M12 5v14M5 12h14", - panelToggle: "M4 5h16v14H4zM9 5v14", - bell: "M15 17h5l-1.4-1.4A2 2 0 0118 14.2V11a6 6 0 00-4-5.7V5a2 2 0 10-4 0v.3C7.7 6.2 6 8.4 6 11v3.2c0 .5-.2 1.1-.6 1.4L4 17h5m6 0v1a3 3 0 11-6 0v-1", - chevronUpDown: "M7 9l5-5 5 5M7 15l5 5 5-5", -} as const; - -function NavIcon({ d, size = 16 }: { d: string; size?: number }) { - return ( - - - - ); -} +import { useSiwsAuthStore } from "@/lib/stores/siws-auth"; +import { ShellNavbarActions } from "./shell-navbar-actions"; type NavLink = { href: string; label: string; - icon: string; + icon: LucideIcon; nested?: boolean; }; const navGroups: NavLink[][] = [ - [{ href: "/", label: "Home", icon: navIconPaths.home, nested: false }], + [{ href: "/", label: "Home", icon: Home, nested: false }], [ - { href: "/agents", label: "Agents", icon: navIconPaths.agents }, - { href: "/activity", label: "Activity", icon: navIconPaths.activity }, - { href: "/incidents", label: "Incidents", icon: navIconPaths.incidents }, + { href: "/agents", label: "Agents", icon: Users }, + { href: "/activity", label: "Activity", icon: Activity }, + { href: "/incidents", label: "Incidents", icon: TriangleAlert }, ], - [{ href: "/agents/new", label: "New agent", icon: navIconPaths.plus, nested: false }], + [{ href: "/agents/new", label: "New agent", icon: Plus, nested: false }], ]; export function AppShell({ @@ -95,27 +78,27 @@ export function AppShell({ ); } - let connected = false; - let publicKey: { toBase58(): string } | null = null; - try { - connected = Boolean(walletAdapter.connected); - publicKey = walletAdapter.publicKey ?? null; - } catch { - // Graceful fallback when WalletProvider is not mounted (e.g. tests). - } - - const walletAddress = publicKey ? shortAddress(publicKey.toBase58(), 4, 4) : "Not connected"; const currentPath = pathname ?? ""; - const isLinkActive = (href: string, nested: boolean | undefined) => - href === "/" - ? currentPath === "/" - : currentPath === href || (nested !== false && currentPath.startsWith(`${href}/`)); + const isLinkActive = (href: string, nested: boolean | undefined) => { + if (href === "/") { + return currentPath === "/"; + } + if (href === "/agents") { + return ( + currentPath === "/agents" || + (currentPath.startsWith("/agents/") && !currentPath.startsWith("/agents/new")) + ); + } + return currentPath === href || (nested !== false && currentPath.startsWith(`${href}/`)); + }; const collapsed = sidebarCollapsed; const sidebarWidth = collapsed ? "w-[60px]" : "w-60"; const renderNavItem = (link: NavLink) => { const active = isLinkActive(link.href, link.nested); + const Icon = link.icon; + const iconSize = collapsed ? 18 : 16; return ( setSidebarOpen(false)} - className={`group relative flex items-center rounded-md text-[13px] transition-[background,color] duration-150 ${collapsed ? "h-9 w-9 mx-auto justify-center" : "gap-2.5 px-2.5 py-[7px]" + className={`group relative flex items-center rounded-md text-sm transition-[background,color] duration-150 ${collapsed ? "h-10 w-10 mx-auto justify-center" : "gap-3 px-3 py-2" } ${active - ? "bg-primary/12 text-primary shadow-[inset_0_0_0_1px_hsl(var(--primary)/0.32)]" - : "text-muted-foreground hover:bg-secondary hover:text-foreground" + ? "bg-white/[0.1] text-zinc-50 shadow-[inset_0_0_0_1px_rgba(255,255,255,0.22)]" + : "text-zinc-300 hover:bg-white/[0.06] hover:text-zinc-100" }`} > - + {!collapsed ? {link.label} : null} ); }; + const mainCanvasClass = "flex min-h-0 flex-1 flex-col bg-[#111114] text-foreground"; + const onSignOut = () => { + useSiwsAuthStore.getState().clearSignedIn(); + void walletAdapter.disconnect().catch(() => { + /* wallet may already be disconnected */ + }); + }; + return ( -
+
{/* Mobile backdrop */} {sidebarOpen ? ( + +
+
+ +
- {/* ── Main content ── */} -
-
- {/* Sidebar toggle (desktop = collapse, mobile = open) */} - - - -
- Dashboard - / - {title} -
- -
- + {/* ── Main: black top inset (sidebar chroma), then canvas for header + body ── */} +
+
+
+
+ {/* Sidebar toggle (desktop = collapse, mobile = open) */} + -
-
-
-
-
-

{title}

- {subtitle ?

{subtitle}

: null} +
+ {/*

Agent Guardrails

*/} +

+ {title} +

+
+ +
+
-
{actions}
-
{children}
+ +
+ {subtitle || actions ? ( +
+ {subtitle ? ( +

{subtitle}

+ ) : ( + + )} +
{actions}
+
+ ) : null} +
{children}
+
diff --git a/dashboard/components/landing-auth-screen.tsx b/dashboard/components/landing-auth-screen.tsx new file mode 100644 index 0000000..cdc77c8 --- /dev/null +++ b/dashboard/components/landing-auth-screen.tsx @@ -0,0 +1,180 @@ +"use client"; + +import { useWallet } from "@solana/wallet-adapter-react"; +import { useWalletModal } from "@solana/wallet-adapter-react-ui"; +import { ChevronLeft, PenLine, Wallet } from "lucide-react"; +import { useCallback, useState } from "react"; +import { Button } from "@/components/ui/button"; +import { + ApiClientError, + getErrorMessage, + requestSiwsNonce, + verifySiwsSignature, +} from "@/lib/api/client"; +import { useSiwsAuthStore } from "@/lib/stores/siws-auth"; +import { shortAddress } from "@/lib/utils"; + +function uint8ArrayToBase64(bytes: Uint8Array): string { + let binary = ""; + for (let i = 0; i < bytes.length; i += 1) { + binary += String.fromCharCode(bytes[i]!); + } + return btoa(binary); +} + +function BrandMark() { + return ( +
+ + + + Agent Guardrails +
+ ); +} + +export function LandingAuthScreen() { + const walletAdapter = useWallet(); + const { setVisible } = useWalletModal(); + const markSignedIn = useSiwsAuthStore((s) => s.markSignedIn); + const { publicKey, signMessage, connecting, connected, disconnect } = walletAdapter; + const [busy, setBusy] = useState(false); + const [error, setError] = useState(null); + + const openConnect = useCallback(() => { + if (!walletAdapter.wallet) { + setVisible(true); + return; + } + void walletAdapter.connect().catch(() => { + /* user cancelled */ + }); + }, [setVisible, walletAdapter]); + + const onSignIn = useCallback(async () => { + setError(null); + if (!publicKey || !signMessage) { + setError("This wallet cannot sign messages. Try another wallet."); + return; + } + + const pubkey = publicKey.toBase58(); + setBusy(true); + try { + const { message } = await requestSiwsNonce(pubkey); + const encoded = new TextEncoder().encode(message); + const signatureBytes = await signMessage(encoded); + const signature = uint8ArrayToBase64(signatureBytes); + await verifySiwsSignature({ pubkey, message, signature }); + markSignedIn(pubkey, new Date().toISOString()); + } catch (err) { + if (err instanceof ApiClientError) { + setError(err.message); + } else { + setError(getErrorMessage(err)); + } + } finally { + setBusy(false); + } + }, [markSignedIn, publicKey, signMessage]); + + const onBackToStepOne = useCallback(() => { + setError(null); + useSiwsAuthStore.getState().clearSignedIn(); + void disconnect().catch(() => { + /* wallet disconnect cancelled/failed */ + }); + }, [disconnect]); + + let connectedLabel = "Connect"; + try { + if (walletAdapter.connected && walletAdapter.publicKey) { + const a = shortAddress(walletAdapter.publicKey.toBase58(), 4, 4); + connectedLabel = a; + } + } catch { + /* ok */ + } + + return ( +
+
+ +
+ +
+
+ + {!connected ? ( +
+ + Step 1 of 2 + +

+ Connect your wallet +

+

+ After you connect, you'll sign a short message off-chain to unlock the dashboard. +

+ +
+ ) : ( +
+ +
+ + Step 2 of 2 + +
+

+ Sign in with Solana +

+

+ Approve the signature request in your wallet. This confirms you own the address. +

+

+ Connected + {connectedLabel} +

+ + {signMessage ? ( + + ) : ( +

This wallet does not support message signing.

+ )} + + {error ?

{error}

: null} +
+ )} +
+
+
+ ); +} diff --git a/dashboard/components/landing-connect-wallet-button.tsx b/dashboard/components/landing-connect-wallet-button.tsx deleted file mode 100644 index 632eb9e..0000000 --- a/dashboard/components/landing-connect-wallet-button.tsx +++ /dev/null @@ -1,45 +0,0 @@ -"use client"; - -import { useWallet } from "@solana/wallet-adapter-react"; -import { useWalletModal } from "@solana/wallet-adapter-react-ui"; -import { shortAddress } from "@/lib/utils"; - -export function LandingConnectWalletButton() { - const walletAdapter = useWallet(); - const { setVisible } = useWalletModal(); - - let connected = false; - let wallet = "Connect wallet"; - - try { - connected = Boolean(walletAdapter.connected); - if (walletAdapter.publicKey) { - wallet = shortAddress(walletAdapter.publicKey.toBase58(), 4, 4); - } - } catch { - // Graceful fallback when wallet providers are unavailable. - } - - return ( - - ); -} diff --git a/dashboard/components/providers.tsx b/dashboard/components/providers.tsx index dd41435..1b4551d 100644 --- a/dashboard/components/providers.tsx +++ b/dashboard/components/providers.tsx @@ -11,8 +11,9 @@ import { PhantomWalletAdapter, SolflareWalletAdapter } from "@solana/wallet-adap import { BackpackWalletAdapter } from "@solana/wallet-adapter-backpack"; import NextTopLoader from "nextjs-toploader"; import { Toaster } from "sonner"; +import { RequireSession } from "@/components/auth/require-session"; import { ApiClientError, isUnauthorizedError } from "@/lib/api/client"; -import { clearSiwsAndRedirectToSignin } from "@/lib/auth/siws-session"; +import { clearSiwsAndRedirectHome } from "@/lib/auth/siws-session"; import { useSSE } from "@/lib/sse/useSSE"; const RPC_ENDPOINT = process.env.NEXT_PUBLIC_SOLANA_RPC_URL ?? "https://api.devnet.solana.com"; @@ -46,9 +47,9 @@ export function AppProviders({ children }: { children: ReactNode }) { queryCache: new QueryCache({ onError: (error) => { if (typeof window === "undefined") return; - if (window.location.pathname === "/signin") return; + if (window.location.pathname === "/") return; if (isUnauthorizedError(error)) { - clearSiwsAndRedirectToSignin(); + clearSiwsAndRedirectHome(); } }, }), @@ -101,7 +102,7 @@ export function AppProviders({ children }: { children: ReactNode }) { }, }} /> - {children} + {children} diff --git a/dashboard/components/shell-navbar-actions.tsx b/dashboard/components/shell-navbar-actions.tsx new file mode 100644 index 0000000..1d4bd47 --- /dev/null +++ b/dashboard/components/shell-navbar-actions.tsx @@ -0,0 +1,131 @@ +"use client"; + +import { useWallet } from "@solana/wallet-adapter-react"; +import { Bell, Check, Copy, LogOut, UserCircle } from "lucide-react"; +import { useRouter } from "next/navigation"; +import { useCallback, useEffect, useRef, useState } from "react"; +import { toast } from "sonner"; +import { useSiwsAuthStore } from "@/lib/stores/siws-auth"; + +export function ShellNavbarActions() { + const router = useRouter(); + const walletAdapter = useWallet(); + const [menuOpen, setMenuOpen] = useState(false); + const [copied, setCopied] = useState(false); + const wrapRef = useRef(null); + const copyResetRef = useRef | null>(null); + + let pubkey = ""; + try { + pubkey = walletAdapter.publicKey?.toBase58() ?? ""; + } catch { + /* WalletProvider missing */ + } + + useEffect(() => { + if (!menuOpen) return; + const onPointerDown = (e: PointerEvent) => { + if (wrapRef.current?.contains(e.target as Node)) return; + setMenuOpen(false); + }; + const onKeyDown = (e: KeyboardEvent) => { + if (e.key === "Escape") setMenuOpen(false); + }; + document.addEventListener("pointerdown", onPointerDown); + document.addEventListener("keydown", onKeyDown); + return () => { + document.removeEventListener("pointerdown", onPointerDown); + document.removeEventListener("keydown", onKeyDown); + }; + }, [menuOpen]); + + useEffect(() => { + return () => { + if (copyResetRef.current) clearTimeout(copyResetRef.current); + }; + }, []); + + const copyAddress = useCallback(async () => { + if (!pubkey || typeof navigator === "undefined" || !navigator.clipboard?.writeText) { + toast.error("Clipboard unavailable"); + return; + } + try { + await navigator.clipboard.writeText(pubkey); + setCopied(true); + toast.success("Wallet address copied"); + if (copyResetRef.current) clearTimeout(copyResetRef.current); + copyResetRef.current = setTimeout(() => setCopied(false), 2000); + } catch { + toast.error("Could not copy address"); + } + }, [pubkey]); + + const signOut = useCallback(() => { + useSiwsAuthStore.getState().clearSignedIn(); + void walletAdapter.disconnect(); + setMenuOpen(false); + router.push("/"); + }, [router, walletAdapter]); + + return ( +
+ + +
+ + + {menuOpen ? ( +
+

Connected wallet

+

+ {pubkey || "—"} +

+
+ + +
+
+ ) : null} +
+
+ ); +} diff --git a/dashboard/components/ui/button.tsx b/dashboard/components/ui/button.tsx new file mode 100644 index 0000000..6138844 --- /dev/null +++ b/dashboard/components/ui/button.tsx @@ -0,0 +1,67 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" +import { Slot } from "radix-ui" + +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80", + outline: + "border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50", + secondary: + "bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground", + ghost: + "hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50", + destructive: + "bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: + "h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2", + xs: "h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3", + sm: "h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5", + lg: "h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2", + icon: "size-8", + "icon-xs": + "size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3", + "icon-sm": + "size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg", + "icon-lg": "size-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +function Button({ + className, + variant = "default", + size = "default", + asChild = false, + ...props +}: React.ComponentProps<"button"> & + VariantProps & { + asChild?: boolean + }) { + const Comp = asChild ? Slot.Root : "button" + + return ( + + ) +} + +export { Button, buttonVariants } diff --git a/dashboard/components/wallet-controls.tsx b/dashboard/components/wallet-controls.tsx index 9c3321c..e5824e2 100644 --- a/dashboard/components/wallet-controls.tsx +++ b/dashboard/components/wallet-controls.tsx @@ -16,7 +16,7 @@ export function WalletControls() { const siwsWallet = useSiwsAuthStore((s) => s.siwsWallet); const siwsSignedInAt = useSiwsAuthStore((s) => s.siwsSignedInAt); const [connectError, setConnectError] = useState(null); - const isSigninPage = pathname === "/signin"; + const isHome = pathname === "/"; let connectedWalletPubkey: string | null = null; let wallet = "Not connected"; let connected = false; @@ -67,9 +67,9 @@ export function WalletControls() { > Disconnect - {!isSigninPage && !isSiwsSignedIn ? ( + {!isHome && !isSiwsSignedIn ? ( Connect wallet + Sign in @@ -88,8 +88,8 @@ export function WalletControls() { void walletAdapter .connect() .then(() => { - if (pathname !== "/signin") { - router.push("/signin"); + if (!isHome) { + router.push("/"); } }) .catch((error: unknown) => { diff --git a/dashboard/lib/auth/siws-session.ts b/dashboard/lib/auth/siws-session.ts index 2cb10ab..24bc743 100644 --- a/dashboard/lib/auth/siws-session.ts +++ b/dashboard/lib/auth/siws-session.ts @@ -1,7 +1,10 @@ import { useSiwsAuthStore } from "@/lib/stores/siws-auth"; -export function clearSiwsAndRedirectToSignin(redirect: (url: string) => void = (url) => window.location.assign(url)): void { +export function clearSiwsAndRedirectHome(redirect: (url: string) => void = (url) => window.location.assign(url)): void { if (typeof window === "undefined") return; useSiwsAuthStore.getState().clearSignedIn(); - redirect("/signin"); + redirect("/"); } + +/** @deprecated Use clearSiwsAndRedirectHome */ +export const clearSiwsAndRedirectToSignin = clearSiwsAndRedirectHome; diff --git a/dashboard/lib/utils.ts b/dashboard/lib/utils.ts index 9187598..52e5953 100644 --- a/dashboard/lib/utils.ts +++ b/dashboard/lib/utils.ts @@ -1,5 +1,7 @@ import { PROGRAM_LABELS } from "@/lib/mock/policies"; import type { PolicySummary } from "@/lib/types/dashboard"; +import { clsx, type ClassValue } from "clsx" +import { twMerge } from "tailwind-merge" export function shortAddress(value: string, start = 4, end = 4): string { if (!value) return ""; @@ -54,3 +56,7 @@ export function effectiveVerdict(verdict?: string | null): "allow" | "flag" | "p if (verdict === "flag" || verdict === "pause") return verdict; return "allow"; } + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json index 8b02430..463ae68 100644 --- a/dashboard/package-lock.json +++ b/dashboard/package-lock.json @@ -17,16 +17,23 @@ "@solana/web3.js": "^1.95.0", "@sqds/multisig": "^2.1.4", "@tanstack/react-query": "^5.50.0", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", "dotenv": "^17.4.2", + "lucide-react": "^0.454.0", "next": "^14.2.35", "nextjs-toploader": "^3.9.17", "prisma": "^6.19.3", + "radix-ui": "^1.4.3", "react": "^18.3.0", "react-dom": "^18.3.0", "react-markdown": "^10.1.0", "recharts": "^2.12.0", "remark-gfm": "^4.0.1", + "shadcn": "^4.6.0", "sonner": "^2.0.7", + "tailwind-merge": "^3.5.0", + "tw-animate-css": "^1.4.0", "zustand": "^4.5.0" }, "devDependencies": { @@ -130,7 +137,6 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", @@ -145,7 +151,6 @@ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6.9.0" } @@ -155,7 +160,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -186,7 +190,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" } @@ -196,7 +199,6 @@ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", @@ -208,12 +210,23 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-compilation-targets": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", @@ -230,7 +243,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "license": "ISC", - "peer": true, "dependencies": { "yallist": "^3.0.2" } @@ -240,7 +252,36 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", - "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -250,7 +291,19 @@ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "license": "MIT", - "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, "engines": { "node": ">=6.9.0" } @@ -260,7 +313,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" @@ -274,7 +326,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", @@ -287,12 +338,62 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "license": "MIT", - "peer": true, "engines": { "node": ">=6.9.0" } @@ -302,7 +403,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=6.9.0" } @@ -312,7 +412,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6.9.0" } @@ -322,7 +421,6 @@ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.29.0" @@ -336,7 +434,6 @@ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/types": "^7.29.0" }, @@ -347,6 +444,90 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", + "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/runtime": { "version": "7.29.2", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", @@ -361,7 +542,6 @@ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", @@ -376,7 +556,6 @@ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -395,7 +574,6 @@ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" @@ -608,106 +786,304 @@ "node": ">=20.19.0" } }, - "node_modules/@emnapi/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", - "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", - "dev": true, - "license": "MIT", - "optional": true, + "node_modules/@dotenvx/dotenvx": { + "version": "1.64.0", + "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.64.0.tgz", + "integrity": "sha512-6+xRpZaWuHXEqnhBjae+VmQI9Uaqw5Uzu/ScpO+W7ww9Zp3lHSNBoNjFcUxhrCyc7pRGQzyDjhKzloqrPHERiQ==", + "license": "BSD-3-Clause", "dependencies": { - "@emnapi/wasi-threads": "1.2.1", - "tslib": "^2.4.0" + "commander": "^11.1.0", + "dotenv": "^17.2.1", + "eciesjs": "^0.4.10", + "execa": "^5.1.1", + "fdir": "^6.2.0", + "ignore": "^5.3.0", + "object-treeify": "1.1.33", + "picomatch": "^4.0.4", + "which": "^4.0.0", + "yocto-spinner": "^1.1.0" + }, + "bin": { + "dotenvx": "src/cli/dotenvx.js" + }, + "funding": { + "url": "https://dotenvx.com" } }, - "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", - "dev": true, + "node_modules/@dotenvx/dotenvx/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" + "engines": { + "node": ">=16" } }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", - "dev": true, + "node_modules/@dotenvx/dotenvx/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "license": "MIT", - "optional": true, "dependencies": { - "tslib": "^2.4.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/@emurgo/cardano-serialization-lib-browser": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-browser/-/cardano-serialization-lib-browser-13.2.1.tgz", - "integrity": "sha512-7RfX1gI16Vj2DgCp/ZoXqyLAakWo6+X95ku/rYGbVzuS/1etrlSiJmdbmdm+eYmszMlGQjrtOJQeVLXoj4L/Ag==", - "license": "MIT" - }, - "node_modules/@emurgo/cardano-serialization-lib-nodejs": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-nodejs/-/cardano-serialization-lib-nodejs-13.2.0.tgz", - "integrity": "sha512-Bz1zLGEqBQ0BVkqt1OgMxdBOE3BdUWUd7Ly9Ecr/aUwkA8AV1w1XzBMe4xblmJHnB1XXNlPH4SraXCvO+q0Mig==", - "license": "MIT" - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", - "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", - "cpu": [ - "ppc64" - ], - "dev": true, + "node_modules/@dotenvx/dotenvx/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "license": "MIT", - "optional": true, - "os": [ - "aix" - ], "engines": { - "node": ">=18" + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", - "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/@dotenvx/dotenvx/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=18" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", - "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "node_modules/@dotenvx/dotenvx/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": ">=10.17.0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "node_modules/@dotenvx/dotenvx/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/@dotenvx/dotenvx/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@ecies/ciphers": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@ecies/ciphers/-/ciphers-0.2.6.tgz", + "integrity": "sha512-patgsRPKGkhhoBjETV4XxD0En4ui5fbX0hzayqI3M8tvNMGUoUvmyYAIWwlxBc1KX5cturfqByYdj5bYGRpN9g==", + "license": "MIT", + "engines": { + "bun": ">=1", + "deno": ">=2.7.10", + "node": ">=16" + }, + "peerDependencies": { + "@noble/ciphers": "^1.0.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emurgo/cardano-serialization-lib-browser": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-browser/-/cardano-serialization-lib-browser-13.2.1.tgz", + "integrity": "sha512-7RfX1gI16Vj2DgCp/ZoXqyLAakWo6+X95ku/rYGbVzuS/1etrlSiJmdbmdm+eYmszMlGQjrtOJQeVLXoj4L/Ag==", + "license": "MIT" + }, + "node_modules/@emurgo/cardano-serialization-lib-nodejs": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-nodejs/-/cardano-serialization-lib-nodejs-13.2.0.tgz", + "integrity": "sha512-Bz1zLGEqBQ0BVkqt1OgMxdBOE3BdUWUd7Ly9Ecr/aUwkA8AV1w1XzBMe4xblmJHnB1XXNlPH4SraXCvO+q0Mig==", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", "cpu": [ "x64" @@ -1350,6 +1726,44 @@ "@emurgo/cardano-serialization-lib-nodejs": "13.2.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", + "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.6" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "license": "MIT" + }, "node_modules/@fractalwagmi/popup-connection": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@fractalwagmi/popup-connection/-/popup-connection-1.1.1.tgz", @@ -1386,6 +1800,18 @@ "base-x": "^4.0.0" } }, + "node_modules/@hono/node-server": { + "version": "1.19.14", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.14.tgz", + "integrity": "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==", + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", @@ -1424,6 +1850,88 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/@inquirer/ansi": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.5.tgz", + "integrity": "sha512-doc2sWgJpbFQ64UflSVd17ibMGDuxO1yKgOgLMwavzESnXjFWJqUeG8saYosqKpHp4kWiM5x1nXvEjbpx90gzw==", + "license": "MIT", + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + } + }, + "node_modules/@inquirer/confirm": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.0.12.tgz", + "integrity": "sha512-h9FgGun3QwVYNj5TWIZZ+slii73bMoBFjPfVIGtnFuL4t8gBiNDV9PcSfIzkuxvgquJKt9nr1QzszpBzTbH8Og==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.1.9", + "@inquirer/type": "^4.0.5" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "11.1.9", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.1.9.tgz", + "integrity": "sha512-BDE4fG22uYh1bGSifcj7JSx119TVYNViMhMu85usp4Fswrzh6M0DV3yld64jA98uOAa2GSQ4Bg4bZRm2d2cwSg==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.5", + "@inquirer/figures": "^2.0.5", + "@inquirer/type": "^4.0.5", + "cli-width": "^4.1.0", + "fast-wrap-ansi": "^0.2.0", + "mute-stream": "^3.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.5.tgz", + "integrity": "sha512-NsSs4kzfm12lNetHwAn3GEuH317IzpwrMCbOuMIVytpjnJ90YYHNwdRgYGuKmVxwuIqSgqk3M5qqQt1cDk0tGQ==", + "license": "MIT", + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + } + }, + "node_modules/@inquirer/type": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-4.0.5.tgz", + "integrity": "sha512-aetVUNeKNc/VriqXlw1NRSW0zhMBB0W4bNbWRJgzRl/3d0QNDQFfk0GO5SDdtjMZVg6o8ZKEiadd7SCCzoOn5Q==", + "license": "MIT", + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -1620,7 +2128,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "license": "MIT", - "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -1901,23 +2408,138 @@ "node": ">= 10.*" } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", - "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", - "dev": true, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", + "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==", "license": "MIT", - "optional": true, "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" - } - }, - "node_modules/@next/env": { - "version": "14.2.35", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", - "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==", + "@hono/node-server": "^1.19.9", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.2.1", + "express-rate-limit": "^8.2.1", + "hono": "^4.11.4", + "jose": "^6.1.3", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/zod": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.1.tgz", + "integrity": "sha512-a6ENMBBGZBsnlSebQ/eKCguSBeGKSf4O7BPnqVPmYGtpBYI7VSqoVqw+QcB7kPRjbqPwhYTpFbVj/RqNz/CT0Q==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/zod-to-json-schema": { + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", + "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25.28 || ^4" + } + }, + "node_modules/@mswjs/interceptors": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.41.7.tgz", + "integrity": "sha512-D0nkS5+sx87mYpxFqASImCineYoEl9wGlUPrzkuS0ohzG8wfophLpE+I76qGJ0slLAVI19do5SI9pWJNCVf4fg==", + "license": "MIT", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@mswjs/interceptors/node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "license": "MIT" + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@next/env": { + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { @@ -2132,7 +2754,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -2146,7 +2767,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -2156,7 +2776,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -2176,6 +2795,28 @@ "node": ">=12.4.0" } }, + "node_modules/@open-draft/deferred-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-3.0.0.tgz", + "integrity": "sha512-XW375UK8/9SqUVNVa6M0yEy8+iTi4QN5VZ7aZuRFQmy76LRwI9wy5F4YIBU6T+eTe2/DNDo8tqu8RHlwLHM6RA==", + "license": "MIT" + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "license": "MIT", + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "license": "MIT" + }, "node_modules/@oxc-project/types": { "version": "0.127.0", "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz", @@ -2231,182 +2872,1689 @@ "integrity": "sha512-KviKVP87OtWq813y8IumM3rIQMNkTjHBaQmCUbTWGebz3csFOv54JIoy1r+3J3NnA+mBxBdZeRedZ5g+07v75w==", "license": "Apache-2.0", "dependencies": { - "@particle-network/auth": "^1.3.1" + "@particle-network/auth": "^1.3.1" + }, + "peerDependencies": { + "@solana/web3.js": "^1.50.1", + "bs58": "^4.0.1" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@prisma/client": { + "version": "6.19.3", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.3.tgz", + "integrity": "sha512-mKq3jQFhjvko5LTJFHGilsuQs+W+T3Gm451NzuTDGQxwCzwXHYnIu2zGkRoW+Exq3Rob7yp2MfzSrdIiZVhrBg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "peerDependencies": { + "prisma": "*", + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@prisma/config": { + "version": "6.19.3", + "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.19.3.tgz", + "integrity": "sha512-CBPT44BjlQxEt8kiMEauji2WHTDoVBOKl7UlewXmUgBPnr/oPRZC3psci5chJnYmH0ivEIog2OU9PGWoki3DLQ==", + "license": "Apache-2.0", + "dependencies": { + "c12": "3.1.0", + "deepmerge-ts": "7.1.5", + "effect": "3.21.0", + "empathic": "2.0.0" + } + }, + "node_modules/@prisma/debug": { + "version": "6.19.3", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.19.3.tgz", + "integrity": "sha512-ljkJ+SgpXNktLG0Q/n4JGYCkKf0f8oYLyjImS2I8e2q2WCfdRRtWER062ZV/ixaNP2M2VKlWXVJiGzZaUgbKZw==", + "license": "Apache-2.0" + }, + "node_modules/@prisma/engines": { + "version": "6.19.3", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.19.3.tgz", + "integrity": "sha512-RSYxtlYFl5pJ8ZePgMv0lZ9IzVCOdTPOegrs2qcbAEFrBI1G33h6wyC9kjQvo0DnYEhEVY0X4LsuFHXLKQk88g==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.19.3", + "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", + "@prisma/fetch-engine": "6.19.3", + "@prisma/get-platform": "6.19.3" + } + }, + "node_modules/@prisma/engines-version": { + "version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7.tgz", + "integrity": "sha512-03bgb1VD5gvuumNf+7fVGBzfpJPjmqV423l/WxsWk2cNQ42JD0/SsFBPhN6z8iAvdHs07/7ei77SKu7aZfq8bA==", + "license": "Apache-2.0" + }, + "node_modules/@prisma/fetch-engine": { + "version": "6.19.3", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.19.3.tgz", + "integrity": "sha512-tKtl/qco9Nt7LU5iKhpultD8O4vMCZcU2CHjNTnRrL1QvSUr5W/GcyFPjNL87GtRrwBc7ubXXD9xy4EvLvt8JA==", + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.19.3", + "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", + "@prisma/get-platform": "6.19.3" + } + }, + "node_modules/@prisma/get-platform": { + "version": "6.19.3", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.19.3.tgz", + "integrity": "sha512-xFj1VcJ1N3MKooOQAGO0W5tsd0W2QzIvW7DD7c/8H14Zmp4jseeWAITm+w2LLoLrlhoHdPPh0NMZ8mfL6puoHA==", + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.19.3" + } + }, + "node_modules/@project-serum/sol-wallet-adapter": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@project-serum/sol-wallet-adapter/-/sol-wallet-adapter-0.2.6.tgz", + "integrity": "sha512-cpIb13aWPW8y4KzkZAPDgw+Kb+DXjCC6rZoH74MGm3I/6e/zKyGnfAuW5olb2zxonFqsYgnv7ev8MQnvSgJ3/g==", + "license": "Apache-2.0", + "dependencies": { + "bs58": "^4.0.1", + "eventemitter3": "^4.0.7" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.5.0" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, + "node_modules/@radix-ui/number": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-accessible-icon": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.1.7.tgz", + "integrity": "sha512-XM+E4WXl0OqUJFovy6GjmxxFyx9opfCAIUku4dlKRd5YEPqt4kALOkQOp0Of6reHuUkJuiPBEc5k0o4z4lTC8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz", + "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collapsible": "1.1.12", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-alert-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz", + "integrity": "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dialog": "1.1.15", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-aspect-ratio": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.7.tgz", + "integrity": "sha512-Yq6lvO9HQyPwev1onK1daHCHqXVLzPhSVjmsNjCa2Zcxy2f7uJD2itDtxknv6FzAKCwD1qQkeVDmX/cev13n/g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-avatar": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.10.tgz", + "integrity": "sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-is-hydrated": "0.1.0", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", + "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", + "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu": { + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.16.tgz", + "integrity": "sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz", + "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-form": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.1.8.tgz", + "integrity": "sha512-QM70k4Zwjttifr5a4sZFts9fn8FzHYvQ5PiB19O2HsYibaHSVt9fH9rzB0XZo/YcM+b7t/p7lYCT/F5eOeF5yQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-label": "2.1.7", + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-hover-card": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.15.tgz", + "integrity": "sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz", + "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", + "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menubar": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.16.tgz", + "integrity": "sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-navigation-menu": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.14.tgz", + "integrity": "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-one-time-password-field": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-one-time-password-field/-/react-one-time-password-field-0.1.8.tgz", + "integrity": "sha512-ycS4rbwURavDPVjCb5iS3aG4lURFDILi6sKI/WITUMZ13gMmn/xGjpLoqBAalhJaDk8I3UbCM5GzKHrnzwHbvg==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-is-hydrated": "0.1.0", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-password-toggle-field": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-password-toggle-field/-/react-password-toggle-field-0.1.3.tgz", + "integrity": "sha512-/UuCrDBWravcaMix4TdT+qlNdVwOM1Nck9kWx/vafXsdfj1ChfhOdfi3cy9SGBpWgTXwYCuboT/oYpJy3clqfw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-is-hydrated": "0.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", + "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", + "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-progress": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.7.tgz", + "integrity": "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.3.8.tgz", + "integrity": "sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz", + "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", + "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz", + "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slider": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.3.6.tgz", + "integrity": "sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz", + "integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", + "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toast": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.15.tgz", + "integrity": "sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz", + "integrity": "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle-group": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.11.tgz", + "integrity": "sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-toggle": "1.1.10", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toolbar": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.11.tgz", + "integrity": "sha512-4ol06/1bLoFu1nwUqzdD4Y5RZ9oDdKeiHIsntug54Hcr1pgaHiPqHFEaXI1IFP/EsOfROQZ8Mig9VTIRza6Tjg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-separator": "1.1.7", + "@radix-ui/react-toggle-group": "1.1.11" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz", + "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { - "@solana/web3.js": "^1.50.1", - "bs58": "^4.0.1" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, + "node_modules/@radix-ui/react-use-is-hydrated": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz", + "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==", "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@prisma/client": { - "version": "6.19.3", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.3.tgz", - "integrity": "sha512-mKq3jQFhjvko5LTJFHGilsuQs+W+T3Gm451NzuTDGQxwCzwXHYnIu2zGkRoW+Exq3Rob7yp2MfzSrdIiZVhrBg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" + "dependencies": { + "use-sync-external-store": "^1.5.0" }, "peerDependencies": { - "prisma": "*", - "typescript": ">=5.1.0" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { - "prisma": { - "optional": true - }, - "typescript": { + "@types/react": { "optional": true } } }, - "node_modules/@prisma/config": { - "version": "6.19.3", - "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.19.3.tgz", - "integrity": "sha512-CBPT44BjlQxEt8kiMEauji2WHTDoVBOKl7UlewXmUgBPnr/oPRZC3psci5chJnYmH0ivEIog2OU9PGWoki3DLQ==", - "license": "Apache-2.0", - "dependencies": { - "c12": "3.1.0", - "deepmerge-ts": "7.1.5", - "effect": "3.21.0", - "empathic": "2.0.0" + "node_modules/@radix-ui/react-use-is-hydrated/node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/@prisma/debug": { - "version": "6.19.3", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.19.3.tgz", - "integrity": "sha512-ljkJ+SgpXNktLG0Q/n4JGYCkKf0f8oYLyjImS2I8e2q2WCfdRRtWER062ZV/ixaNP2M2VKlWXVJiGzZaUgbKZw==", - "license": "Apache-2.0" - }, - "node_modules/@prisma/engines": { - "version": "6.19.3", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.19.3.tgz", - "integrity": "sha512-RSYxtlYFl5pJ8ZePgMv0lZ9IzVCOdTPOegrs2qcbAEFrBI1G33h6wyC9kjQvo0DnYEhEVY0X4LsuFHXLKQk88g==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "6.19.3", - "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", - "@prisma/fetch-engine": "6.19.3", - "@prisma/get-platform": "6.19.3" + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@prisma/engines-version": { - "version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7.tgz", - "integrity": "sha512-03bgb1VD5gvuumNf+7fVGBzfpJPjmqV423l/WxsWk2cNQ42JD0/SsFBPhN6z8iAvdHs07/7ei77SKu7aZfq8bA==", - "license": "Apache-2.0" - }, - "node_modules/@prisma/fetch-engine": { - "version": "6.19.3", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.19.3.tgz", - "integrity": "sha512-tKtl/qco9Nt7LU5iKhpultD8O4vMCZcU2CHjNTnRrL1QvSUr5W/GcyFPjNL87GtRrwBc7ubXXD9xy4EvLvt8JA==", - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "6.19.3", - "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", - "@prisma/get-platform": "6.19.3" + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", + "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@prisma/get-platform": { - "version": "6.19.3", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.19.3.tgz", - "integrity": "sha512-xFj1VcJ1N3MKooOQAGO0W5tsd0W2QzIvW7DD7c/8H14Zmp4jseeWAITm+w2LLoLrlhoHdPPh0NMZ8mfL6puoHA==", - "license": "Apache-2.0", + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "license": "MIT", "dependencies": { - "@prisma/debug": "6.19.3" + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@project-serum/sol-wallet-adapter": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@project-serum/sol-wallet-adapter/-/sol-wallet-adapter-0.2.6.tgz", - "integrity": "sha512-cpIb13aWPW8y4KzkZAPDgw+Kb+DXjCC6rZoH74MGm3I/6e/zKyGnfAuW5olb2zxonFqsYgnv7ev8MQnvSgJ3/g==", - "license": "Apache-2.0", + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "license": "MIT", "dependencies": { - "bs58": "^4.0.1", - "eventemitter3": "^4.0.7" - }, - "engines": { - "node": ">=10" + "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { - "@solana/web3.js": "^1.5.0" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "license": "BSD-3-Clause", + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", + "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", + "license": "MIT", "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "license": "BSD-3-Clause" + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "license": "MIT" }, "node_modules/@react-native/assets-registry": { "version": "0.85.2", @@ -4399,12 +6547,30 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "license": "MIT" + }, "node_modules/@sinclair/typebox": { "version": "0.33.22", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.33.22.tgz", "integrity": "sha512-auUj4k+f4pyrIVf4GW5UKquSZFHJWri06QgARy9C0t9ZTjJLIuNIrr1yl9bWcJWJ1Gz1vOvYN1D+QPaIlNMVkQ==", "license": "MIT" }, + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@socket.io/component-emitter": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", @@ -8293,8 +10459,55 @@ "@trezor/utils": "9.5.0", "ws": "^8.18.0" }, - "peerDependencies": { - "tslib": "^2.6.2" + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@ts-morph/common": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.27.0.tgz", + "integrity": "sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==", + "license": "MIT", + "dependencies": { + "fast-glob": "^3.3.3", + "minimatch": "^10.0.1", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@ts-morph/common/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@ts-morph/common/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@tybys/wasm-util": { @@ -8532,12 +10745,27 @@ "version": "18.3.7", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", - "dev": true, + "devOptional": true, "license": "MIT", "peerDependencies": { "@types/react": "^18.0.0" } }, + "node_modules/@types/set-cookie-parser": { + "version": "2.4.10", + "resolved": "https://registry.npmjs.org/@types/set-cookie-parser/-/set-cookie-parser-2.4.10.tgz", + "integrity": "sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/statuses": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", + "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", + "license": "MIT" + }, "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", @@ -8556,6 +10784,12 @@ "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", "license": "MIT" }, + "node_modules/@types/validate-npm-package-name": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/validate-npm-package-name/-/validate-npm-package-name-4.0.2.tgz", + "integrity": "sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==", + "license": "MIT" + }, "node_modules/@types/w3c-web-usb": { "version": "1.0.14", "resolved": "https://registry.npmjs.org/@types/w3c-web-usb/-/w3c-web-usb-1.0.14.tgz", @@ -10780,7 +13014,6 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", - "peer": true, "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" @@ -10794,7 +13027,6 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -10804,7 +13036,6 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", - "peer": true, "dependencies": { "mime-db": "^1.54.0" }, @@ -10876,6 +13107,45 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, "node_modules/anser": { "version": "1.4.10", "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", @@ -10944,9 +13214,20 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, "license": "Python-2.0" }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/aria-query": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", @@ -11164,6 +13445,18 @@ "node": ">=12" } }, + "node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/ast-types-flow": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", @@ -11509,6 +13802,42 @@ "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", "license": "MIT" }, + "node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/body-parser/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/borsh": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", @@ -11797,6 +14126,21 @@ "node": ">=6.14.2" } }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -11808,6 +14152,15 @@ "node": ">=10.16.0" } }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/c12": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/c12/-/c12-3.1.0.tgz", @@ -11936,7 +14289,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -12184,6 +14536,54 @@ "consola": "^3.2.3" } }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", @@ -12210,6 +14610,12 @@ "node": ">=6" } }, + "node_modules/code-block-writer": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", + "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", + "license": "MIT" + }, "node_modules/color": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", @@ -12344,24 +14750,107 @@ "node": "^14.18.0 || >=16.10.0" } }, + "node_modules/content-disposition": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", + "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "license": "MIT" }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/cookie-es": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.3.tgz", "integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==", "license": "MIT" }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "license": "MIT" }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cosmiconfig": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", + "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/crc": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", @@ -12539,7 +15028,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, "license": "MIT", "bin": { "cssesc": "bin/cssesc" @@ -12682,6 +15170,15 @@ "dev": true, "license": "BSD-2-Clause" }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/data-urls": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", @@ -12865,6 +15362,20 @@ "node": ">=0.10" } }, + "node_modules/dedent": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -12872,6 +15383,15 @@ "dev": true, "license": "MIT" }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/deepmerge-ts": { "version": "7.1.5", "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", @@ -12881,6 +15401,34 @@ "node": ">=16.0.0" } }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -12898,6 +15446,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/define-properties": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", @@ -12947,7 +15507,6 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -13033,6 +15592,12 @@ "node": ">=8" } }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, "node_modules/devlop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", @@ -13053,6 +15618,15 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/diff": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", + "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -13202,12 +15776,40 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/eciesjs": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.18.tgz", + "integrity": "sha512-wG99Zcfcys9fZux7Cft8BAX/YrOJLJSZ3jyYPfhZHqN2E+Ffx+QXBDsv3gubEgPtV6dTzJMSQUwk1H98/t/0wQ==", + "license": "MIT", + "dependencies": { + "@ecies/ciphers": "^0.2.5", + "@noble/ciphers": "^1.3.0", + "@noble/curves": "^1.9.7", + "@noble/hashes": "^1.8.0" + }, + "engines": { + "bun": ">=1", + "deno": ">=2", + "node": ">=16" + } + }, + "node_modules/eciesjs/node_modules/@noble/ciphers": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", + "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/effect": { "version": "3.21.0", @@ -13342,6 +15944,30 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-ex/node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, "node_modules/error-stack-parser": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", @@ -13612,8 +16238,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", @@ -14148,6 +16773,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/esquery": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", @@ -14219,7 +16857,6 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -14330,6 +16967,15 @@ "node": ">=12.0.0" } }, + "node_modules/eventsource-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.8.tgz", + "integrity": "sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", @@ -14340,6 +16986,44 @@ "safe-buffer": "^5.1.1" } }, + "node_modules/execa": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", + "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.6", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.1", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/exenv": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", @@ -14363,6 +17047,197 @@ "license": "Apache-2.0", "peer": true }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.4.1.tgz", + "integrity": "sha512-NGVYwQSAyEQgzxX1iCM978PP9AdO/hW93gMcF6ZwQCm+rFvLsBH6w4xcXWTcliS8La5EPRN3p9wzItqBwJrfNw==", + "license": "MIT", + "dependencies": { + "ip-address": "10.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/express/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/exsolve": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", @@ -14431,7 +17306,6 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -14448,7 +17322,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -14491,6 +17364,46 @@ "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==", "license": "MIT" }, + "node_modules/fast-string-truncated-width": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", + "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", + "license": "MIT" + }, + "node_modules/fast-string-width": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz", + "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", + "license": "MIT", + "dependencies": { + "fast-string-truncated-width": "^3.0.2" + } + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fast-wrap-ansi": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.0.tgz", + "integrity": "sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w==", + "license": "MIT", + "dependencies": { + "fast-string-width": "^3.0.2" + } + }, "node_modules/fastestsmallesttextencoderdecoder": { "version": "1.0.22", "resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz", @@ -14502,7 +17415,6 @@ "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "dev": true, "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -14540,6 +17452,44 @@ "is-retry-allowed": "^3.0.0" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -14726,6 +17676,27 @@ "node": ">= 6" } }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fraction.js": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", @@ -14750,6 +17721,20 @@ "node": ">= 0.6" } }, + "node_modules/fs-extra": { + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -14812,6 +17797,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/fuzzysort": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fuzzysort/-/fuzzysort-3.1.0.tgz", + "integrity": "sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==", + "license": "MIT" + }, "node_modules/generator-function": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", @@ -14826,7 +17817,6 @@ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6.9.0" } @@ -14840,6 +17830,18 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-east-asian-width": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -14864,6 +17866,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-own-enumerable-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-own-enumerable-keys/-/get-own-enumerable-keys-1.0.0.tgz", + "integrity": "sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", @@ -14883,6 +17906,22 @@ "integrity": "sha512-Y8aiXLq4leR7807UY0yuKEwif5s3kbVp1nTv+i4jBeoUzByTLKkLWu/HorS6/pB+7gsB0o7OTogC8AoOOeT0Hw==", "license": "MIT" }, + "node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-symbol-description": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", @@ -15065,6 +18104,15 @@ "dev": true, "license": "MIT" }, + "node_modules/graphql": { + "version": "16.13.2", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.13.2.tgz", + "integrity": "sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, "node_modules/h3": { "version": "1.15.11", "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.11.tgz", @@ -15234,6 +18282,16 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/headers-polyfill": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-5.0.1.tgz", + "integrity": "sha512-1TJ6Fih/b8h5TIcv+1+Hw0PDQWJTKDKzFZzcKOiW1wJza3XoAQlkCuXLbymPYB8+ZQyw8mHvdw560e8zVFIWyA==", + "license": "MIT", + "dependencies": { + "@types/set-cookie-parser": "^2.4.10", + "set-cookie-parser": "^3.0.1" + } + }, "node_modules/help-me": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", @@ -15276,6 +18334,15 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "node_modules/hono": { + "version": "4.12.16", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.16.tgz", + "integrity": "sha512-jN0ZewiNAWSe5khM3EyCmBb250+b40wWbwNILNfEvq84VREWwOIkuUsFONk/3i3nqkz7Oe1PcpM2mwQEK2L9Kg==", + "license": "MIT", + "engines": { + "node": ">=16.9.0" + } + }, "node_modules/html-encoding-sniffer": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", @@ -15304,7 +18371,6 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", - "peer": true, "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", @@ -15325,7 +18391,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -15335,7 +18400,6 @@ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "license": "MIT", - "peer": true, "dependencies": { "agent-base": "^7.1.2", "debug": "4" @@ -15344,6 +18408,15 @@ "node": ">= 14" } }, + "node_modules/human-signals": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, "node_modules/humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", @@ -15353,6 +18426,22 @@ "ms": "^2.0.0" } }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/idb-keyval": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.2.tgz", @@ -15383,7 +18472,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 4" @@ -15409,7 +18497,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -15514,6 +18601,15 @@ "node": ">= 12" } }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/iron-webcrypto": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", @@ -15756,7 +18852,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -15810,7 +18905,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -15829,6 +18923,63 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-in-ssh": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", + "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -15871,6 +19022,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "license": "MIT" + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -15897,6 +19054,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-3.0.0.tgz", + "integrity": "sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -15924,6 +19093,12 @@ "dev": true, "license": "MIT" }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -15942,6 +19117,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-regexp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-3.1.0.tgz", + "integrity": "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-retry-allowed": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-3.0.0.tgz", @@ -16003,6 +19190,18 @@ ], "license": "MIT" }, + "node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-string": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", @@ -16053,6 +19252,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", @@ -16392,6 +19603,15 @@ "jiti": "bin/jiti.js" } }, + "node_modules/jose": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz", + "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/joycon": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", @@ -16418,7 +19638,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -16524,7 +19743,6 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "license": "MIT", - "peer": true, "bin": { "jsesc": "bin/jsesc" }, @@ -16539,6 +19757,12 @@ "dev": true, "license": "MIT" }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -16546,6 +19770,12 @@ "dev": true, "license": "MIT" }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "license": "BSD-2-Clause" + }, "node_modules/json-stable-stringify": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz", @@ -16583,7 +19813,6 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "license": "MIT", - "peer": true, "bin": { "json5": "lib/cli.js" }, @@ -16591,6 +19820,18 @@ "node": ">=6" } }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/jsonify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", @@ -16668,6 +19909,15 @@ "integrity": "sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==", "license": "MIT" }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/language-subtag-registry": { "version": "0.3.23", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", @@ -17018,7 +20268,6 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, "license": "MIT" }, "node_modules/lit": { @@ -17096,6 +20345,34 @@ "license": "MIT", "peer": true }, + "node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/loglevel": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", @@ -17155,6 +20432,15 @@ "node": "20 || >=22" } }, + "node_modules/lucide-react": { + "version": "0.454.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.454.0.tgz", + "integrity": "sha512-hw7zMDwykCLnEzgncEEjHeA6+45aeEzRYuKHuyRSOPkhko+J3ySGjGIzu+mmMfDFG1vazHepMaYFYHbTFAZAAQ==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" + } + }, "node_modules/lz-string": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", @@ -17512,6 +20798,15 @@ "dev": true, "license": "CC0-1.0" }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/memoize-one": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", @@ -17519,6 +20814,18 @@ "license": "MIT", "peer": true }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge-options": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", @@ -17536,14 +20843,12 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -18639,11 +21944,32 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/min-indent": { @@ -18685,7 +22011,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -18720,12 +22045,169 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/msw": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.14.2.tgz", + "integrity": "sha512-D2bTe0tpuf9nw4DA39wFaqUD/hRPKj0DKpo2lAqu+A47Ifg4+h0hbfn6QxVOsiUY2uhgEN6TTpGSHDsc+ysYNg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@inquirer/confirm": "^6.0.11", + "@mswjs/interceptors": "^0.41.3", + "@open-draft/deferred-promise": "^3.0.0", + "@types/statuses": "^2.0.6", + "cookie": "^1.1.1", + "graphql": "^16.13.2", + "headers-polyfill": "^5.0.1", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "path-to-regexp": "^6.3.0", + "picocolors": "^1.1.1", + "rettime": "^0.11.7", + "statuses": "^2.0.2", + "strict-event-emitter": "^0.5.1", + "tough-cookie": "^6.0.1", + "type-fest": "^5.5.0", + "until-async": "^3.0.2", + "yargs": "^17.7.2" + }, + "bin": { + "msw": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mswjs" + }, + "peerDependencies": { + "typescript": ">= 4.8.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/msw/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/msw/node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/msw/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/msw/node_modules/type-fest": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.6.0.tgz", + "integrity": "sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA==", + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/msw/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/msw/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/msw/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/msw/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/multiformats": { "version": "9.9.0", "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", "license": "(Apache-2.0 AND MIT)" }, + "node_modules/mute-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz", + "integrity": "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==", + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -18790,7 +22272,6 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -18907,6 +22388,26 @@ "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", "license": "MIT" }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-exports-info": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", @@ -19010,6 +22511,34 @@ "node": ">=0.10.0" } }, + "node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/nprogress": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", @@ -19082,7 +22611,6 @@ "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -19116,6 +22644,15 @@ "node": ">= 0.4" } }, + "node_modules/object-treeify": { + "version": "1.1.33", + "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", + "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/object.assign": { "version": "4.1.7", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", @@ -19270,6 +22807,21 @@ "wrappy": "1" } }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/open": { "version": "7.4.2", "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", @@ -19305,6 +22857,85 @@ "node": ">= 0.8.0" } }, + "node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ora/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/ora/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "license": "MIT" + }, "node_modules/own-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", @@ -19446,7 +23077,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -19496,6 +23126,36 @@ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", "license": "MIT" }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parse5": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", @@ -19514,11 +23174,16 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "license": "MIT" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -19578,6 +23243,12 @@ "dev": true, "license": "ISC" }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "license": "MIT" + }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -19751,6 +23422,15 @@ "node": ">= 6" } }, + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, "node_modules/pkg-types": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", @@ -19784,7 +23464,6 @@ "version": "8.5.10", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -19943,6 +23622,18 @@ "dev": true, "license": "MIT" }, + "node_modules/powershell-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", + "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -19988,6 +23679,21 @@ "license": "MIT", "peer": true }, + "node_modules/pretty-ms": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", + "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", + "license": "MIT", + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/prisma": { "version": "6.19.3", "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.3.tgz", @@ -20044,6 +23750,28 @@ "asap": "~2.0.6" } }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -20089,6 +23817,19 @@ "node": ">=12.0.0" } }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/proxy-compare": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-2.6.0.tgz", @@ -20193,6 +23934,21 @@ "node": ">=10.13.0" } }, + "node_modules/qs": { + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/query-string": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", @@ -20225,7 +23981,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -20248,6 +24003,83 @@ "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", "license": "MIT" }, + "node_modules/radix-ui": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.4.3.tgz", + "integrity": "sha512-aWizCQiyeAenIdUbqEpXgRA1ya65P13NKn/W8rWkcN0OPkRDxdBVLWnIEDsS2RpwCK2nobI7oMUSmexzTDyAmA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-accessible-icon": "1.1.7", + "@radix-ui/react-accordion": "1.2.12", + "@radix-ui/react-alert-dialog": "1.1.15", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-aspect-ratio": "1.1.7", + "@radix-ui/react-avatar": "1.1.10", + "@radix-ui/react-checkbox": "1.3.3", + "@radix-ui/react-collapsible": "1.1.12", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-context-menu": "2.2.16", + "@radix-ui/react-dialog": "1.1.15", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-dropdown-menu": "2.1.16", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-form": "0.1.8", + "@radix-ui/react-hover-card": "1.1.15", + "@radix-ui/react-label": "2.1.7", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-menubar": "1.1.16", + "@radix-ui/react-navigation-menu": "1.2.14", + "@radix-ui/react-one-time-password-field": "0.1.8", + "@radix-ui/react-password-toggle-field": "0.1.3", + "@radix-ui/react-popover": "1.1.15", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-progress": "1.1.7", + "@radix-ui/react-radio-group": "1.3.8", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-scroll-area": "1.2.10", + "@radix-ui/react-select": "2.2.6", + "@radix-ui/react-separator": "1.1.7", + "@radix-ui/react-slider": "1.3.6", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-switch": "1.2.6", + "@radix-ui/react-tabs": "1.1.13", + "@radix-ui/react-toast": "1.2.15", + "@radix-ui/react-toggle": "1.1.10", + "@radix-ui/react-toggle-group": "1.1.11", + "@radix-ui/react-toolbar": "1.1.11", + "@radix-ui/react-tooltip": "1.2.8", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-escape-keydown": "1.1.1", + "@radix-ui/react-use-is-hydrated": "0.1.0", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/radix3": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", @@ -20278,11 +24110,25 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/rc9": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", @@ -20416,6 +24262,53 @@ "node": ">=0.10.0" } }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-smooth": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz", @@ -20431,6 +24324,28 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -20495,6 +24410,31 @@ "node": ">= 12.13.0" } }, + "node_modules/recast": { + "version": "0.23.11", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz", + "integrity": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==", + "license": "MIT", + "dependencies": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/recast/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/recharts": { "version": "2.15.4", "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.4.tgz", @@ -20677,7 +24617,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -20715,7 +24654,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -20731,11 +24669,32 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rettime": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/rettime/-/rettime-0.11.8.tgz", + "integrity": "sha512-0fERGXktJTyJ+h8fBEiPxHPEFOu0h15JY7JtwrOVqR5K+vb99ho6IyOo7ekLS3h4sJCzIDy4VWKIbZUfe9njmg==", + "license": "MIT" + }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -20926,6 +24885,32 @@ "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.17" } }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/router/node_modules/path-to-regexp": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/rpc-websockets": { "version": "9.3.8", "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-9.3.8.tgz", @@ -20999,11 +24984,22 @@ "npm": ">=3.10.0" } }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -21124,6 +25120,12 @@ "node": ">=10" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, "node_modules/salmon-adapter-sdk": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/salmon-adapter-sdk/-/salmon-adapter-sdk-1.1.1.tgz", @@ -21311,6 +25313,12 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "license": "ISC" }, + "node_modules/set-cookie-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.1.0.tgz", + "integrity": "sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw==", + "license": "MIT" + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -21344,46 +25352,173 @@ "node": ">= 0.4" } }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/sha.js": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" + }, + "bin": { + "sha.js": "bin.js" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shadcn": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/shadcn/-/shadcn-4.6.0.tgz", + "integrity": "sha512-4XeMwFf8ZZxmqQQp+U+Nsq2M+cY4Da8Joo/EaMdHVc4uVuWSTJoeidlZ3gDjyxXCjYB1FLcxYwR4lYQAH8emOg==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/parser": "^7.28.0", + "@babel/plugin-transform-typescript": "^7.28.0", + "@babel/preset-typescript": "^7.27.1", + "@dotenvx/dotenvx": "^1.48.4", + "@modelcontextprotocol/sdk": "^1.26.0", + "@types/validate-npm-package-name": "^4.0.2", + "browserslist": "^4.26.2", + "commander": "^14.0.0", + "cosmiconfig": "^9.0.0", + "dedent": "^1.6.0", + "deepmerge": "^4.3.1", + "diff": "^8.0.2", + "execa": "^9.6.0", + "fast-glob": "^3.3.3", + "fs-extra": "^11.3.1", + "fuzzysort": "^3.1.0", + "https-proxy-agent": "^7.0.6", + "kleur": "^4.1.5", + "msw": "^2.10.4", + "node-fetch": "^3.3.2", + "open": "^11.0.0", + "ora": "^8.2.0", + "postcss": "^8.5.6", + "postcss-selector-parser": "^7.1.0", + "prompts": "^2.4.2", + "recast": "^0.23.11", + "stringify-object": "^5.0.0", + "tailwind-merge": "^3.0.1", + "ts-morph": "^26.0.0", + "tsconfig-paths": "^4.2.0", + "validate-npm-package-name": "^7.0.1", + "zod": "^3.24.1", + "zod-to-json-schema": "^3.24.6" + }, + "bin": { + "shadcn": "dist/index.js" + } + }, + "node_modules/shadcn/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/shadcn/node_modules/open": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz", + "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==", + "license": "MIT", + "dependencies": { + "default-browser": "^5.4.0", + "define-lazy-prop": "^3.0.0", + "is-in-ssh": "^1.0.0", + "is-inside-container": "^1.0.0", + "powershell-utils": "^0.1.0", + "wsl-utils": "^0.3.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">= 0.4" + "node": ">=4" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC", - "peer": true - }, - "node_modules/sha.js": { - "version": "2.4.12", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", - "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", - "license": "(MIT AND BSD-3-Clause)", + "node_modules/shadcn/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "license": "MIT", "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.0" - }, - "bin": { - "sha.js": "bin.js" + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" }, "engines": { - "node": ">= 0.10" - }, + "node": ">=6" + } + }, + "node_modules/shadcn/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/shadcn/node_modules/zod-to-json-schema": { + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", + "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25.28 || ^4" } }, "node_modules/shebang-command": { @@ -21424,7 +25559,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -21444,7 +25578,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -21461,7 +25594,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -21480,7 +25612,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -21507,7 +25638,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, "license": "ISC", "engines": { "node": ">=14" @@ -21525,6 +25655,12 @@ "is-arrayish": "^0.3.1" } }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -21739,6 +25875,18 @@ "dev": true, "license": "MIT" }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/stop-iteration-iterator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", @@ -21806,6 +25954,12 @@ "node": ">=10.0.0" } }, + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "license": "MIT" + }, "node_modules/strict-uri-encode": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", @@ -21981,6 +26135,23 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/stringify-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-5.0.0.tgz", + "integrity": "sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-keys": "^1.0.0", + "is-obj": "^3.0.0", + "is-regexp": "^3.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/stringify-object?sponsor=1" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -22011,12 +26182,23 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, + "node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/strip-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", @@ -22159,6 +26341,28 @@ "dev": true, "license": "MIT" }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tailwind-merge": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.5.0.tgz", + "integrity": "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, "node_modules/tailwindcss": { "version": "3.4.19", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", @@ -22378,7 +26582,6 @@ "version": "7.0.28", "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.28.tgz", "integrity": "sha512-+Zg3vWhRUv8B1maGSTFdev9mjoo8Etn2Ayfs4cnjlD3CsGkxXX4QyW3j2WJ0wdjYcYmy7Lx2RDsZMhgCWafKIw==", - "dev": true, "license": "MIT", "dependencies": { "tldts-core": "^7.0.28" @@ -22391,7 +26594,6 @@ "version": "7.0.28", "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.28.tgz", "integrity": "sha512-7W5Efjhsc3chVdFhqtaU0KtK32J37Zcr9RKtID54nG+tIpcY79CQK/veYPODxtD/LJ4Lue66jvrQzIX2Z2/pUQ==", - "dev": true, "license": "MIT" }, "node_modules/tmpl": { @@ -22432,7 +26634,6 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.6" } @@ -22447,7 +26648,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", - "dev": true, "license": "BSD-3-Clause", "dependencies": { "tldts": "^7.0.5" @@ -22508,6 +26708,16 @@ "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==", "license": "MIT" }, + "node_modules/ts-morph": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-26.0.0.tgz", + "integrity": "sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==", + "license": "MIT", + "dependencies": { + "@ts-morph/common": "~0.27.0", + "code-block-writer": "^13.0.3" + } + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -22560,6 +26770,15 @@ "fsevents": "~2.3.3" } }, + "node_modules/tw-animate-css": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz", + "integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Wombosvideo" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -22583,6 +26802,45 @@ "node": ">=8" } }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", @@ -22795,6 +27053,18 @@ "integrity": "sha512-AXNgS1Byr27fTI+2bsPEkV9CxkT8H6xNyRI68b3TatlZo3RkzlqQBLL+w7SmGPVpokjHbcuNVQUWE7FRTg+LRA==", "license": "MIT" }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/unidragger": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/unidragger/-/unidragger-3.0.1.tgz", @@ -22903,6 +27173,15 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/unload": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/unload/-/unload-2.4.1.tgz", @@ -22917,7 +27196,6 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -22957,6 +27235,15 @@ "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" } }, + "node_modules/until-async": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/until-async/-/until-async-3.0.2.tgz", + "integrity": "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/kettanaito" + } + }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", @@ -23027,6 +27314,49 @@ "node": "^18 || ^20 || >= 21" } }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/use-sync-external-store": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", @@ -23105,6 +27435,15 @@ "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", "license": "MIT" }, + "node_modules/validate-npm-package-name": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz", + "integrity": "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==", + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/valtio": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/valtio/-/valtio-1.13.2.tgz", @@ -23140,6 +27479,15 @@ "uint8array-tools": "^0.0.8" } }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/vfile": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", @@ -23503,6 +27851,15 @@ "loose-envify": "^1.0.0" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -23780,6 +28137,37 @@ } } }, + "node_modules/wsl-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.1.tgz", + "integrity": "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0", + "powershell-utils": "^0.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wsl-utils/node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/xml-name-validator": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", @@ -23842,8 +28230,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/yaml": { "version": "2.8.3", @@ -23918,6 +28305,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yocto-spinner": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/yocto-spinner/-/yocto-spinner-1.1.0.tgz", + "integrity": "sha512-/BY0AUXnS7IKO354uLLA2eRcWiqDifEbd6unXCsOxkFDAkhgUL3PH9X2bFoaU0YchnDXsF+iKleeTLJGckbXfA==", + "license": "MIT", + "dependencies": { + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18.19" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zod": { "version": "3.22.4", "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", diff --git a/dashboard/package.json b/dashboard/package.json index 43418ce..60040ef 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -25,16 +25,23 @@ "@solana/web3.js": "^1.95.0", "@sqds/multisig": "^2.1.4", "@tanstack/react-query": "^5.50.0", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", "dotenv": "^17.4.2", + "lucide-react": "^0.454.0", "next": "^14.2.35", "nextjs-toploader": "^3.9.17", "prisma": "^6.19.3", + "radix-ui": "^1.4.3", "react": "^18.3.0", "react-dom": "^18.3.0", "react-markdown": "^10.1.0", "recharts": "^2.12.0", "remark-gfm": "^4.0.1", + "shadcn": "^4.6.0", "sonner": "^2.0.7", + "tailwind-merge": "^3.5.0", + "tw-animate-css": "^1.4.0", "zustand": "^4.5.0" }, "devDependencies": { diff --git a/dashboard/public/android-chrome-192x192.png b/dashboard/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..48e341b41a4f9f912ee1ebee9f92e6bac496e22b GIT binary patch literal 54737 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

C?Xu6CL#Z@Ag5*L66;1A6=Uqh2v&aKBPb> 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

!x^0fRnC-{)B;G2Op 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 U;nR$|KN{meDy1&Uy|l+Blb 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 z zYyG|c*Z-~R|9r0MH$IfV7N}4CagDG1YYl(Gemfuh{6t!LhtW2#nD;^-^ZUb}p83$n z`o%}Hr2Wz(cTJ2<;P4m*dvAs}Z+r=wn5O{gbky@xV=*A5xb5FSSz}Y_Xqx`>o%>s>!rKlYC?|#2(_{{;Y2<6jX_lxSE{A*o<9kByOM6s^3 z>BFjb;SFO!Sv303qVL2q(~~De=;Jy97N(8bnUv({sbl78jP-m1`~fC7$8A(cO|5I? zHDa;%#=b&{xaQ@J!)H1oodZebFb}F7xv{%IZGT%R4#R=hXVSeA?mP0xAkGnu;o%Ut z7Ume&HI6M@3zqVpqE5M3iaIw^xh%>1i6}ny$zVS|!`{`p!9!wAZmON|7dLUH8}cSd z`F-D`=1%&MgcCQHn~5M(H!`=8uQKGgfr^-;FvQfp^hIJE`|A5f-1Wp{x&!ru>~}c? zM-IjIq0#JFt#8`}L>{_OLD+l0?vq}{UPcWhjj0b;V2s6KCW>?1Mkn9iUb7>XJ?_yu zK?XzHa~S<|Uy6k>mSO3>#~it-z+@bHU=0QC z{qRm$9D1@ohGpBqXL!<>9z07O^Fiw3(LU681Lt49QT3@m=bL~Jg7;Vb;h)s_SH2M# zXx~Pj?*+1sANusk7w-7vwS0(`HaR{fW7o2-HSxpYFlzZRq?EKt64xHxd(c zl2bp4C)xeiJV@%{q3Xp8KfoXBD}3;O@{^ye|Nh_qNBzW)|788@ul#C#0M9@$zvgqF zt#7~n9jac`9ItV^5B120e(|ASzPRI|=Jtz=rgIK9Rh8qw)fN{iv^Wgt%%cYO9OIez zma~g`@1$xBvZE@`1C~))oRwNBBcL6)qxw%#D`h9Ovxeb;iDxdfseoykA?Y|=9Y8vI zbN3)ErG)Kqmc3IsT*$biBMl7{bRwh)JT{SSw2-Z znst7iQgwxDFu_G{6oikL$xtL%6MqFDHCd#ur^-=^5um_6NGeXILj*$`YcOzyf>LtgJW-% zn!!A(nAwT<1w4nkUM$LRnG1Xg#Z`!JGt6_tRKOm_7{zEH9_o1%VrQaV&dQFb`qQ<|^8ejTKjo;_D z0PlH!joB6s|{qF~is=%td5~!@2R!jdm)*2z>dB0{Icq!%Uh^iH@zcW`;msh&;y09m{Q_#V za%Gbv2y;xxsxsAEUax4;btHEiEn&8&EfyGpz|Y0~8giQDHJA?Ij4^7A0ed&75A#ea z{GQBPAG^u6O^q6c_S-NH%ry9RSVvZs_7dwtGfZ^Dc-INh7DPdOO+WG9DsMp_UryIh z_%Niu!3D?KaJF9YGF<_0++b!vQSi(lcf%s|oYTmM_a^xt4DwZ)hSxGfapi7qd?ygy z>}?0|k?h!D`y<;9b5e%;xoki4$ecI$v+I-IJ#cRZ=W>%;t@;zImC0u!CeOg>A$@>e z&8{tyxN3LK8#{O$WZAX0OxC)ZSb;qy=2cM%=u!JxzD8{N#wOvHXYojC0!aTuLVy1+ zRUiAqs&~J?=5PEqe@*b2s&9O~_zbG?+F&{Kej~6@>l=aM86R}Ho||DnE_P1}MdHKB z85jxg)-Oi(E!W_ifdSY+1^GaHs0YP>5xVxpEin?g`~evf>UEz(e}JqE+H7oDbH>^$ zuHOW_l*eF{E!1$_ZpJ-71dAeg?bE zj^!FMqWbZ;YjqcTy!FVDZcR3)ci{wAnHS#Nc9tG80!U*nx>%%oZ`xjOJ_U+0y0dMQKUhx69f7NX# z&y5ziEbKvH5@)&z!t6a5m>oLnjE)a~)^MGn^&0{ED&$@V-vm7HoyiLtJs1Pr)rI>) z%i!L&&ngi4K#a>|FDm4S&=x;+Z+#K#YsL1l>~rg_edN>ojh8e3(4OB6Jg~R%FzRbx z=Y#(bK2<;c(?47P^+$fRe#M{o|Lo7}Ti^P2dKVjhr0(U*DnXm_8uSVB1 zeNZouo4tYj@p{|f$g=;N_(;S_9ewMHQGIcKoJ9M~yUmky9zt2MghwswZ)&9p&q32I z-D#-jZZS13wRItm36^AfEzUme;xSNkX!om7mP0llIORM{fN1+ZEQL8nq({`J#Zt|X zWVD~zj7Y#Ufi)CqJkPfksi*=b+5i9$07*naRAadQ>}Z(|o}E$bMR9K>5b1?I9+q3h z5!vI4mB{nBe2o(A4YI}!Q#sCyc)RSR%H$@>>n4z>hp{)@6(P$)a6{EI7cVZdYTP#W zjVH5FUh1*oXdb&`a{UdqjXs@yyHVwJ=r==42VFpFdZ0KUc6GXfv+eT^-hl#3$SfU==XOFIJ2y8jVsQjTu+j@0b zEiYAbg|4_F#4?sUaJ?;03AZN17$f=tAut(~gg*ksG9=WAUb$c)3wT!5mu?^rj-Aez z?DdVB`LN|f{(Ja;|K*y$^YME8<^NUlw?0($mtWwo48B+6ZLigM?KK+qYE|f2ZHVk! zuZRH4=ianc#}~B9zAIPM#%i)Toc)2HnBP2<9I(PQzyo*z9>znBV3=(n^@|fGvDQ`w zeb0Cy%(NeVhpeaDNCpunOAVuhgloLy(|fYthldyCUcUadZ{#QbpLxeS>;LmZ|E2!t zFaJ{g`JeT#`d?Q6YM);e@V(8tuf1)WPQWU*uEC!QDwlgH;?`8*)^V8>5`#%#j$v+t zd%NKY_8o3(`37k!EQaBA(wkU$Ut6u5R-n3U&8UueM(6|>#p~yDuWHn&eQj@BHn3As z9XzaUFz}!{CRN{Xa1g~pThwbv5%as+k@SZ@qG-~-y{O3aESSA!Y~QhYmkyJo~~ zW<@487IheVZ)|eKDPh^r263451#Y>o@;V6ixr#Kx^wuGJs03!fdKh^<>bRf}pMt}G zE9Xv|Hl7Z3N9u4OZx*fI6?yA?;k0#JB=B!Jh_@ORh_}-1{Mv8AENSszZ(tO*QMn+r zzF^ubNcj+*RGRVP$molrAHwSEsdq9_bV=NEQZv%$oX>2$OWnmys;3dtxt>EDlibJ} z#r!-f*G#_FT;)hE*vP^3q zr1<)&)_hxkviB$bNSN&BulsS!|9}ra^z(Q8|60HId%ssd{Zl_xKm1?*Oa1aM{X+fu zXFgls{T|;m`EORRDSPC@pYyS{_?^Q5#mS$@ZVGwW;_|*QYYg^>YXcL*iTE7`#W2g@-P~einLH1(7hGyC>=QS#)x+e)HGBddfjf?h9(VlzyKr6)gce!v z?pc}euNtq+t;8~S<=nsxv*KHGIs273njKEM@b1Gl*E1pG!Qcwp2y*8*2->U%WhbrO z{$UTzDqJEXp>9#S7r-(?#AZr(xzjpc51NgU32s@Fo6|o~c_LBa#Em`DCXTvJ-OT2_ zFSn$>l6e@GU)FE`&PHdQNX|yW;2;fpbEX8$Eb_CQ4=5UA)EFn^YF)fi92rG5VD6C3 zKs&A}<6x5p^jM)iW%zQV0WvF3bPhPriXHTxCc6-YEw0s&XtI9+iMsn`rhY<_uH&~< z#l({WY}VFFF03VsQufFlv5vo0Iv@+zU-0RI zkE(>4e98fsLPCm@+ zH`AL|TJB@-K`Y!_{-H$HY;CVU`8{}pT5{QkJxFIi`eW8=S;If0oNEjnP*sCJ#g)C# z$2Cr$JDdWR9I_0{zzOIGxZZc z_J7y^`t@I}zx>O;sMo*yy?S`@8rvTA_{Ph6eB`$({Dvhx?cmxQti_J_4G9aI8%|=y z>wcuOPo0(49b?oO3pL10I#R0(2Hfz_VMj2~u;M_Yr`aIxY6*hqwdkcp%2Bz0@??r7 z8g;qUno#drTGAtX!AUJvU3!fgV-!;|(&=pkU0^cJIxp`>&2g?Pg%srqVyLor*ugwt z1;*j}3-`T}W}4KCF-GdonIy~vMb7Ou9)*MxYg(%)(HF z_|z1=N~xrl%5yYf2MUU>N~SD)70h>$UfCJxm8r}1l)q&tbzLfMc}`>Tq$0u|L#;T7 z;vHV)Ug{OsrN_lR*GSo2&v0)tDfdvf#CSK?-~4~X^5W&*Q?r{TxSi}zni09-tzbvI zw2E>zt?DgH0)o8Jad*YNHHC~01CaG8l*G;AS_E!gm!}(}z_qo6YurY6$FJrPxYm$q zT-@qi)Nvg(&72`c*%X#k=1c?(btl*>+?n1PNQa@8wGYj~C2>xkPonPGGUts)jtFpg zlivmu-v|_cHIUy3{Qjr-ZNP6={m$?6R|9`l|eCX$c zn`(a3@Bse(d*7|U{oB8-4}IuEeDJ@s-tm(^S-0{1Nj zHTQ}itg!ZLK1T6}MZC`(0H3Y=@__G;=K>|O za*fPu%I08_b85Idu~ac;?Cmpfk4OH_UXe9Ie}nGrveu&?{4`<9%(K4rt#8$5__h9T z{^oDi&%Waw^-l1C_rACO>hphH|MvQK(L8WxetDuRAN;f^Ode_X;Gt^e8|*R;OR~tM zno9aG!%yfQdhRSw9&HBa)EQ^gbwi9gFG?95!~2^T^>Sjc<`|>%&KH-B$ebYO4sHnQ z3k;Dy-97hN_g7R^=zI=}Yk)l_fqU99VGaHi`YKl*x%W~?9L^jVV}$Xrvo_~fHd7lE zwcs*_K6NGZUjf^^BK16-#-y?bsu|e})N{l4y8L7xO7#!yUI%e;$lbr5xk>u;Y0YX| z*vgeH;Z0DRMeo{$O?{mgOH^ZE?_rmXOXa4p!&XlA7Idkg^+<9wku1KBOO^o9E}c-k z%a~=Ayjo7J%4KwePR2c^ys{=PuueoYdEd@Hi5vrd zY?7GkZlbNU$hrH%WiNw%V;ySidLHn_Gg(}tp?+an z?|-0XyhbfQ>i-+x2>k7rYX1Ho)}#NR;BSAl%K!7=H@;DPuTaDP#PHkEzTnG{AO4`y zi`HxOHvw#V3fi`*VtGGGip$5KVUq6_&^`)s`C`9bQ^IElRZ&oq4`e>q%MbTH6G{*; zmWEXkvV6UG@qljf_xoS1KmOxCs$cunU#XvY$4}S)^K(B}zw_Y_*WdA5fba0D{>d*T zC%^i5eE_+TIU3-%w+)O3*YB2he_b06}pjgIy!xBrD`NU)F>$XhhSlyy;%w z1ehzg%>xcJ^JO4nlnp$cNx-;lvd)Wyc?n#NWwsQPU_x%-!Z4fMAiNohA$;vIJ(gC} z#O*u=8HQ|^SFgjI*h$pWD`op0NE`R_N$?*XDQ4RH!F|$Vt(EO$Dt4)GqsniLnb%Mx zE+G}g^A`g>>jJ%-Pc3o|3JWX*gdq`gc%r1A@G$ST<8Z-CgGHsOT;{`*e3F zPQCj~8cHAYWX$`19CTBz0cgON1*qAz8qpDafeEmOb`W1N>$rRs2T|@_yAg5)7zh1w zU#5sPg68fL_}VmvVIQd54J8#tZ;y=~=#GlmT zdw-|q2l+tH?W?IXq_vFXw zN8qp5*I!c5!3tqjvAa4i>g^Lyr_DDI$n`fYczE%G5B?YBukHW&pZ}>o@rh5=FaE+W z^3(oL*Z=&*U#L%h;^Xy?|M=zl?)P6-dH<|Ln|z&q?S9$ym8J<5{M}RWobwr-Ito*v_l%mP{lYa_Nu5ZIw;Wc;E9g_f@5|I z=hp=!Kj2^sQBLM7q<#7S}=G%WV+8=}@-?J~-R|0qu2JUL@bFR{8};>tVIzx=u1oW`uW3cp3A!uSHJn zZ4ap|Y3dHi!5#J}?Rz}<`*ql`4-lnm9EB@xvsu?~<}&jzU7{Pe>v{$EP_Ex(+pBouLpBzqxHE}ZSsN46PC(8t2M7O8gUQ3UNfuv`g>}BSIke~FwH*5UkS89Ih zPwVlwK2neG{YcGE|5?>nzE-~M<3GKYU;p)A>y0;F()WS4@?bj;<%j;vihIAe*0tP% zte6HsA9FKyj-8e*&p4-4UXwzRhmhyCHIOEQ_H%@ZnGnf}?gRnNjX0l>Zqbq%h^u6{ zwJa|?oPebm#%6FC^1>oB0=mZvrpYIpX-RLSqNuxT-o+iBtnKA;p6S1GJ3-e0)EpRf zFiTxtp1II}Gg#B>ohn+M!Sd8C_hP!zoVX;GYbUY7XUxcbnz+;5gipKQq%8-V+ZO5= zPdgl`(|NA&$X=7|`sQ$VcQnhL>s5i_TkHgbd4V@}?t9XG0EZ2YlaMGLT9V;vT?Q;p zr|COJn6aN0sKA_q7Ral%wzv?b1e@iy?Nlh-9tcPAC-sBp+x0tj%v+=GAltEZduyhJ zCz41XOpw@#f+@jzn&T0hBfsT*a!{g_He&(CnuRf&AJ7L@H>lKZ-e8sS1z!=hnCO@$dn@7D zO_rm8yM>yvJa6^a1 z8dX7Y(E|+)@Vfmk_lIDpDEX=QoZDT|X1RemEdU#s!`s`|&TR(yg2wU6~K_gI6U`Ul%~B{M+x9?)#7dVd5CG?RLYp(jRE zjWL26b?Bp$AXnJo3s7E)urYJ#m)#u)F<@pLgw}#7=r`$C_b*fO-}f~qCDEGf5j{QZElBn- zu9)ocQG216@lL`KnQD67=9V0PUQ!f(4pX3hMTvu}#vH&Fd?; z$|EsnE0P@>Z0stM>NH@k^(KBTzuxS!o%wAkWXMoG>$vAIl~^uvo$709GUN-UEyJD!-~QUf`4GU;6LEO`h9T||hysPSOi zcJ)Yb&U!++6?Ih9(+lbO{B+tXkw^zk*&}-((8^cIu7j-FLB9zr*OJ9Qgw}^4>pR2e z&bHxNMMf5eL_96w-59-S*whT%^u(^wya@;c%rT6?1af1vZqRo~gy)X553g0d95w#s z>s5dBnW}exu;wqkyXJ>}x5nT89p5B;x5nE>O~Ic1ZGc}W(q?d9_I?tyf?qs5)FZFOUS)C!jBKkX)^I2Ym>5zn zwA~@G0{@!G@WA4acqOP_wH+Ubv6KZ#l`EX$GH={`RKOUmaRkzcEg=dzhrKvBOUgrF6DJxI^>@02hNo6`A^8i zkP_{(3j1N^v=`e60v(XvS||qI%@&NI!$oQ!Yb!S6qw6duAX?KGVu?j?g}sjC}Ep*AudK_Uz`^@7fLfXoWlM*F4@*upncXp7u)O zr$yWB#dzZ^%98F+3bh6(#5m%f8L413o$U5J{+U$4HHymy0DbNS7n0$tzh=x)|X;%>Tj!N2Ki%&l|o?0`CAKBV(OHQvUWuhsbGcdI`8g_nlSqI%XJ_|Kz@)Z}EZui1nxOob@AhLgBiVhcRl5 zLA^P8awh&meQ)D853j%e?fTqbe6D`uH~v@s*B|+j{1^Lv;eY&(`t+wiU0?kge_iqL zqF%g>5B`S-KKMtyF<8!}!Ei0h_RQL&Ttpfy0pRAhXk;K(IMZ2F)2mRplNcB}16`XXuUOeueXtCY4PZ~m}4x7OOv3sK6j)Li=jv(?8 zxRd2rX7)*@2TF%e3WV;$T=r_hMdk$d&1l6ElfjFcHMJLz^bwTFR#4uYIQa)~&=DGO zNBNE#n_ojAx_Q8eXFB3!Gg#wEvA{e#ZgK_}4J6`M>pT|NZ^9RXx1DKlESHgZ`7loY~Do%`s}yb2?!isNgOH+7f8%{)#M9XGWDW zOdS{L<0$c6Yt~v9(cDOaNby2{9h#^IC@_lyVSmo{5KxXROpKi9Q9!=~sA-;=0H$ysUL~aJ@?9G8^ZZ$kKbD z9&oPK)ptshVn(uM&HixG?*?M^(R1aLTK#v(MaK&y0uG+K!%^t!uv5^7-dWM^nsap5SI& zGI#D65DewrwQ7asmHyrjnEdQK>m{Gr0KXpiMqq&NzESlL|5EkoKdt$}->v#>@JD}A z4`2FHjqkl)`L_r7M!>I-exaoSw>vSc$TtKNJaQO(M)Rxr0y|grFdpjR#Y6V=?Qegp zKF8nVf8YZjsCWJB&(@Fs_>b2w|KiWrAAI8X>&yS}rTYH&|DA#tRqTn+{PG{}|NbLi z_Bg1S4t0Bt(eZ3^Gq2Ra-Nh+6rZ|UmFLjiVW~}__Eh6U19(B7>6m^MI&%|o)Q8(8l zx`Oa#SlvWCCe_VU*5IWnFH(uMwaE5YbS<<%>@(JX1xC77&!ckLN+e*q`h-2yijLNN zAuJMRw$*R2f?%Z7X7d3<9PD^>TV+^F;nt2g4 z8zGvu$7~Y)5nr8ddu5*W@9**~>%ElyPqO;T!tFAfe!%9?_J_ZuaMvxjArgf0e#etT zOOi>F+?x&$X6q<%Z_&$j3+3sIhX;9GSFBA(ia}4g5rXwZ&F0ZkVw$_LC=vI_DzntD$U1XCvkW42>QNu zJaAB!tWZH=QBut}Q;SgJJQ~GNsyj|rS=BJ<(>+5fXd|xMKr3Iiz|0m&(8e%o+WCI2ef?f z{yTrC|K+dM{6BxeZv#G2kMH|v)$jjd)#txZKTc3D=+5vACZGEL^zR3@ z{}lft-wcc~>VaR`^XXsT`}gnF7x_lw_dfpd`sH8xrTXc2{3IX#KU432-+SwGpZQ#U z?d#txYX{$qRQdD7tjEVkP)NJIF8}}#07*naR7LB&m2(E!XjSzM;`A7!U$f%eirf&R zbGP%TF&1i&vhKc}91U1Y&n&KOE6;G@%-Kv{E&@kaRbdh4oUy!UrHZc{ByjIXSPnp~LhFO8a4nWR zw|7n5hc~$uxQ4jx%LBFYr&+sb6FP2+36DSrFkpM2;f%8cZfsATE(7&|QMnFbqEfPZ z=$AopsmqO0$*2lZ6}$b8>e-7TMp9d@6(R4Yt%cUj@$0Z&mn0~{?8?_gjW2rT^6|kr zWk^>5eT)=bcwM1jTm7u!>vcmGO)G0NJ9=+2!f4b!Li557;+hyF1cs3;mZ2LkF{;M; zgExw6-6t#oBO)wGT|u;mq39Toky}eWHP}$Piekf5c_T+$Rr+%6RAGG$%In|@R-xws zIB(u+g$MSm%Ni{s&F4UR+-+FLW)$zBqTN*04n!fv%Md3`b(zK}N4@uVg+HQWiC zwC#jC`Wp}$i{oH?SQ8WfhV6HR83sJe)r{}h5 zxK`mX^noI~(WdS}x*Mz(49@^2V7(J8BGYfuuP3X2Dm0c5e2PajcAQ3{LbH40$P;6 zd7*+aS!YtviCOL*8Vgf;lNnJ#1rw){kVxC=;@TaG%oxKts9d86D%Z@+-MPvF=}Jvi z+^X1utLH96-3EsdNfUA1%NT?5k@!q?EEx^EkO@vvHYKM{dY073O6d3x;U9S8Z|BvF8%Ua(mgkz z1+6Ae!;zXnz*zx#4c{(9i$hd*AAANu{8fAD|czEt)4>s5T z)!X^-|L%9bQ-AX}e^Vd+@Q3UF`MLjAKk=hKTKa0l=M``6^`gyI>x9m1}p=sMtBIL2ISdK zexG9!Os&9Sn2&l)DhJRuyW{6F3hXjosvgIYEY?Vsgz@ym}{;DrY2@6+{dKySquXLEYxh!gxw4R`J9obyf({vd;Ija=Z zTVJ*iD&62whr?J4nqBS|H?`;KCJd~(0&ZS_yOgqLl;*o`Da?wktSj$cIS@-v4m-&wf zJ$~k|>+xfMSTFhOftMfQ8-oA+*?Rr2{-*x;lm1uwe!hO<$9}xt!B6|Y^2@(mpZe6N z>Yx7UpX$5+{ziVf_ow_f9$%Drnf?c>!kg1e0DfJ3QiHh8VbY;?@gB|0NDpt z5r(0+fRbV0OP9??ut*b6PcUpx5#yeEKky))AIiifYlmzx>vYmN`?=`CCDy}PCS^3a z*Q4lh)kWMyX6jnBXIMr@I=(I)8`A=VqhNQ|)@f;=x+w_)ijlxZ~C zer9VWMTobU)CubZazjjp{-P6m4?#zn&5Hz1m%w@{;A4MNy6^Qjmli$QBNj;bd51o@ghrmM}}9ZV=YFuKg(n> z51_5%8hAmbO1_?4B-fhVa6a7=HQs|Cys_!jb@T8kqmS`KpW{-3?+E8p29Q-_VCmRN z8Zfvq?j9BMAVxR~C$Q7PTo$GKrVL`B8nIMj6@g8`IMfRLXFNb!k)=nsK5X2dh3I_XX)TBG~vF}l-DmXz{*_G!Y zBw<{>T3NMiYPzCwbyt2kukt5%o%~kdA8UT{f7j#tK2o3mg$v_OUqV+(mMF zaYpHyqgmA;-YER?QdmUeKo^ZFm|g{sIvLdhriy%dkt^Y1*^i2+u)Z=`)UZrykO)TM zRW6RijDolpkYPXmrVpKy8RwjAa7J(9EusB% z(<;+ha|!2plbyF_KXJ_*QBsTBW-jN*N%%k<#1dT1{rRcC<}dzpZCv6axpO<)^GYSi zlzZ`cnz`?l-^Rs`z08V4uAW|GYri-3TQO78{?n(pW@q}PAz0^tmy|XN9YLU(be%W8 zn-WcWKX^4B_`Cmyx7T>d+y5J{*EhfL_w^5d{de{4Z-1xec&+N;ZG8AY)Eh4!`LLfn ze&Ugh@{K_D!YZR!t#VDg8E;L4ByMICg7_HsF^Q8(70lDIHSDJ1XKJ0U=!mVNxW?hr zI#a?YlPPf|48Xdd8=C$%F|v-=s@5z{w{vS=k`={-Vp=8P^hE-4u?LapcG{ZFUbKVP zXwz?M(_^#*|H586)mykm3C z9P>^c1kUa`YkQDC!0>CpRhH^Zu-Kd9b1$Hu^NHXUgSzWBqLh1uoHz1S9@WDwV|Ci_ z4#KjDsMeI5P_p9v9yq=hh99>rmWAw47}?r|iaaZ=0VD{LK-dGQJNF=Ek40HvO*AY_>Hkzn`KPXrjw zL7ub&PP1`_?VU3oBf69ufcQ+FQ<8EEiF<-+=Q2}uiP)nAxX}`KYuV?KJi0XV2IDX( z$I!XBX}_Vb+Y5nuu@g|Xns9UbiTdhI{e01vOdy&m|+ zVDdTt_()IId*rtTkJLO)0{%XKf;u24Xt)N_5{8{&^-;y~GgTG-f#PZrj)@{QK;2yv zu3=(2fdOXqAAP^L5u&X?zt)xfCOTM|t0A#Bk6Uh9tHk@)7sT#CY5#OsbcRtQ$X6|4 zT`nmBrMUviCb;6uG~hZD#B#9 zN*fNxww0-hkSTNZrO%4#gO$YhCwX5r!|JN?8b|~;)b~y-AJ__KqMz7fthJ9=hc(Xr zMMd=me;jZ#ub#7>lTfx+H3SUF-e)`}B?7my>Q)(QSc}{Hi{pd}(=$#wYL|?}q(}K;1f9E? z(>N2a!MsT&NUC|~gh?>5V>v;T;WBZaOjM%J&SF~t8^<2L1PL4B z^=_yYb-73<(uxGvsbA+S(|)hq{+e^}`ZMdZB?p+2fy9zwb!!NS- z(iZtC=v#MJG~xAxf`NLU8g^9TF>s2j4;bfukY_}kl&i*B)5ICAXo_8qp|fa&qs9u_B!chg>72Z@&W7=Gxc0gFciQ`uZMWp= zZ_bDNgO$QLy1v4`j+ECLso=x+2Qa=ulKyM5*L zNVCcn_iT20$!6MIq+#wS6ehWMO=sb<`HMXc748(a-1*?h8$XAYI;78OvhFhpiv&Fw z5e&{_#M|dXz&9Y>Vyob8hP+i`C*T-eCudHgiestkHOm~#1dL^B)0GQ0vP>{LuE?%E z$yBZ_)gl)lBeG4NyT>-~I42&Zgf(I%JKG44fiV($Y zN%bXNlZO;ELw-5SOzf*b>Sj!;MUxZ5!^Vxzg(4q#Y6oQ82tZe&E|)Q>+PI{2@9AE( z&sKkH+R6Y%O)3Qmc3BPUPLEVC%O1u+pGcMl?4QS-0H10OarsNPdPA0Fs){RFCfkYB z5vw8X1{SDbjRd&K-ApH`m*r?UXf$qg9c)fJ#;7qyF$J@{6JqQDkmuJubYqOF@RjW_ zXUxpz;;e~S{l;Qr4$k$$^yGbl7S5N>pBg zy1&?uFDt@o4D3c#bJV-W<-P`q4eNKC-oqqIDKFLlb$~3wr~hDCANQ)Fa5U&LYv-sf zBVr6~^4j4xO9}G3B-tg*nkyVwfjG4(JvbI*$YD6Mk+#D?&5rOHsm~JRjqRC@CAMnP zqiPI%FhS`uje%3QS2I1Qmn*mc`VvXaN={xEegH@Y1Ow-0bbd5PUN4A0x|)8TvZBE> zUt}Joio$|Xr8BVy$_v8#+aTFhrM$eLG$+swN%sM=C|NpjhEz`iv5fAt<_dDr zuT@6ufMrmyJc7$uq(+$W9Qv8TV=t8YN?f|3WZk;Jy%eq_bg!aK?%l6oiOFsnMdX_&#NvMv(m@jKtyD(ypg>4{Jh_ee6?_RQ-68Z%4W;#m?2dgi-cbsO*6ZL2Q% z3t4sWva5CV#ldhq`jg3AG*k=#^~y1>nH4NU#%`F5!5c}ZxuI)soG`vB;he(g1Vh~h zo67^teh1mSX|aUPF;-9X6Xt9iHOw=Xo+Zj$^*&Qv&s@(ZHrpMZDT6X6aBqh9lZ~5n zA0XVFYOp_nNoFtyV{VG4e!@1AqjC4@h~(0uVHmgR+4xj;WUO~8i~tF?+74aKH<)wq zOQ1*>mgf>}3bu+os#uxjwW19iQuBOZWz ztQJ?@*g7s{M-b;^^d_8Vq`x1HO0UZ05^4<0tIN4>(!>SH8;`0>8yUhQn;4?)p4~{A zSB;_e0yk2|_4JY!J45Zcy}7C;&rD;CvAA8JCFj}$nV|}NUCoI>1`IOvnV^EIP}P^W zVn?IcolGEmLFy4`FSPEKPtxtKf-w9m$K+8hYz2{`rou z?nU_E2&i>(s}ghVV;<^ujH4vdab~kqUmPiuz~$zuP`aTc@Lh`I7v|KvuK+S*-rk&? zO|)CLVw7QAlcM6Q5vaJGz;`Ir2CmvTg-LXXt6bpTj2kXNrYzM$Hs)rUUZ>ERi>Qfc z+($2)urti`p*lyaiw~I=R(N&>)&x!pB)6qFM@^2A%w=ok2X&-o6ch_F;&y@=!n|0; z<|o=o|B1r=cnAGq0mFdK(A@}O9~`@47@;vV*k^#c%@K;<^&)Me;f#0Ta4YLxT9YU&0h4d*x6= zQnTUK^r3s$GmYG>R0y4?NMWYVd9$J;T9YHrGq-xKRFSM)NbXbN@0Pv2Z;HsvVIpUl zetk%VU>XXr^H_`^i)lA@2kew{68f)zY4If8PqG_1JtM%gl0Dw+Wi?>w<-N6WUG;!* z>TiOR-kxQ-b#(D}B34EuxSgc$K#LpAT=(P?<7<5Y)dc4t@(>P~+1<3}i*8zw4R2dq z_}1dx3`-%F!9&MClG$oQ?qAq8GdszMd*H{f*BY2ZWd$X^UAYhcZYSx=D)LxFDWfBByY)&>{%5j(w z>O8!sir)g(1f{oaGw}LS#i*4-zGy_7&;ob}+(cF;J zC{uENv6i_(H>4#x{oM#3Ci~Dz-_+d&Gb`MY*N}c4PK>}D96m!fUqW<f?j$?Q7fKC!zV zIUcP3yO?I2g?~qLUz_v1k`Y4CgSiI}NNudVMu~WG;Cn+>E5t5?$2bCovz%c$OlBHR zOphbe;dMSmVO5GFz&Rym00a7VC;|iY25!?kN_qzu`&`SUO&rh(`()agZTV8daXLSd zJ|T8Z623lhoXm*I+0L6>ofl_aQK%J_%X>8nUR9eq<*KpKQK7}aaGc~A`ZM~$Jd3IJ zb@M?oUfFJYqi+5Xa|o2tUCmH++oAVUsYB=} zuk=B0-X46##!wGemwl@h>O_CV8P%Fv7j?@!jC}~q9Iy-yQyVOrJ?(gvp{g2V)bZ!) z!;+D3Km;8={w3yy%kw|@dh=_46X2OzbEtQq-PlQW1uM5y1C?Or6jmXUV{A^^A32TbDi|?0Cr6dckJl2Zt#q_>1%NMR;IJ} zy`Gwlfxi7XZhYTtdC^Nw7YxBo`5f7={}}+t=Z4~gPamgdPOszZe9h^LX|-3PfW z%IYMRo1Mat+=C4H9cf`SRrKyJ8ddt0Yxmx&ZIgUD?cVE+Fn7F_JC4m%S!=n)_3R3g z_T*4?F;&(G1NI)byrR%C6YF%cMki87GVRZ%OF$ytAT#g;hOslpBK@$ha28ua#W+g{ z)_`M_I9?xuxzZZnH@57CMzR8-<{lJ})iEjJ*vmBV586P$)lnz0QEz^EU`MlB9j>+d zb$h87i@msEjAuGMQ!D=*-3MegFjRJ8G=HoRhhv{O{e0^YFb3E|R&=blv--_C-$(sg z$qE$*?upefbo_DID^*Eg9r{9lVT@6=QC#{Me@JK;T;OYV37>Q6xajTmqCKzFD~uob zp8tW`JuU^i(cbGNwcR}T1ozdJ9=O&^qOY6v4zkXRj@LR8Q8AGrx*LlmeU~tVU3sH( zX-RUB&O(Op9FTkiFsYf4K7`sjzU$5}uk-)_5CBO;K~$^j#c517y>X>}H~Qf+5v2hWd1eSkij4q# zKdk!XFw8wxkBOBQ?&J0?CfmE8Wk#r~oAaF2TrB+vZ-`_Z z*Zq&Z!=YlqJV?Q^yr3M<%J%}JO%;jwY!Dd@=}j3SN2F75jn220ShfW2lYtD5 z*PxwJZx6_)Lk%|^Lsok(29e@Q58bTkv{6Ma8J6I+BBC8F?9_auRTaxL2D~UNRfy|) zSy{=A8l$*YUp(##IWvneQ>|K5DoDbu(`Suj(AIHwJ-R%JF#r4x6gx`_Q##BL<*}CF)_-2fOw-qRK?c1=(W5y zSxC3V^CEU@H}aO$MZ$U1&6OJVdDe}Ro2afJ?0*PQ(qJR8lh~vk#tu%~k4c>ir~%5$ z3x6A3VZ3oHaZOzPB@Bhw7hzG}B5pE$22g^)uN8IKL?$=VfW8@~uLS*bKigh& zYQ;4dACl2K=-r)XI@qhIoCh;wfGQG|i?HoDsHdCFLe+xhXQS2EXp_7?lI#JyGCAfB zTi|}@QP3(g@o;7wCj8#d!9Y5a(CM_HkU69hM_}e=#q2Tcp3pueJ83JuZ7+UGDBYBg zfWB`ZZIC*qojl2SP9wY16RY8N3HKLP*UL8z<^(y7FG-(kABpr+j7T$?#BobLIk;5@ zb9Y?44@}PVhB2u_*Zk_pUOMg<`}9Zj!(whC7C*Zrj^%;u z@75<;83cG0(2pY8uZXyAF~+DdHVPlmQ7y4tW-$p~=z$#wHYUCg z-;ie=Z73R<6XuJY{1YJXH4C5f!8@$JJF}}m?CY_5lTF*O109ev*1jqB8moqCSX z_bZA3isUf{+!%wH*Vg^SW8!>@oN}}J6`hQz<4VNDto<%A+H!$| zPXILW9X{_ z)9%nv44m5`CuET>anY}Gg^Sly;@lV>mQm9Nt{K}p=N+OfcG9pQ|8ENw#X19MTUD3K zjQ44O%eLa^g|<0WfIUo5bR=Tdo7fY%L0$k~uTndTYc}A0Eu&$#kZULcj1sc3OqLpN zK-t!Cr;NuKHAds1hUo>!<(+0K5GUmqbQ_B7El%g7-0`+9qHiy4OP`<3iznH8@)Bp! zOTi^|VdMJ7aL@N8N#0CL@g}`)hkMacbvHVhXUGC^ zQJCHEEQAuF%m-Y1V$>MmB;wh_+5{u>ng~`BuL7IWV+oc~Bn+d{IU!|)grS#Sah!I3 zS&d6*O>f-CKEI_$!{cmA(r*waBBziaU9*9Wpn=e9;~Iy>Li- zY>tv9-eTVREwc{zMcexiI5%&5OX{WuF^QgWo*lbDD-_M=+L)*$wk$zan}g)#o0V&s z<2@FV>5y&#oa5kEkQexd%u)w)IO-eSvFBzGF>+?u+J~jzg0($r7&+7M2pA<2GjY~O zOrJ5%WJ-}ZhN34Ac*)iec3r!jJ34E};SReh9|x5J!xMU;Thw9u&&@ke-|fCqra&NA zrt-28-wvAH5G&qA+d?xArT$Lk4m|UdsQg<1iZ;yMV&)r>{6xWvqV4XgisK_+3$wBY zB+lJ%VRRADho>CZ0(9L9r*2EtS!X_AN{m&R^5q|V<+3!(5vjmjhJ_0z#dBFC3|1P! zDaqSmw@=RX)NXPpW*TI5UkTq7yJ(A^Gz!sK7een2{ANa5_iIG%1Q?_0P!QJ5#kq}S z2Q*)PHT3uOAu7_Kt7ggc%jVi@h-xaLy2v{kX@q1dDX%;`Xko&8EAc5%Euv%6570B{ z(RVtVtO}VRIT|`@U)^^{RZ(U^GnMP~3{_y$S6iuZa^*(#wKW~FKF;oq&3$55q6+=I zpl&YKbt4Ce(JH~?y*DcsLR%|WMKp^goV2>^l67SS42eBtrd6B3qOaLj6OSr;EO@A6 z4(b4FkAX$!u;c~=j6&R~b&X|7&}s)*)GIg0Rp1QIzIu1(JgRDp%xn@%vtw`QeL7!_ zDvGPB>tgHfO7D|HsXD~5BOHz<+*n!P3&C((2_Vp2QF2Kv*so-?Z1NNXn2C~-m~WM3o9ITvwf%0_#_b~y0v z0rg}YJy?U5&cRh^pE8+^5ov2*#5<=IzF7B&d}-ATS0>&%xeGiQQBw^thxT}%>(_(@ zq!}JRaTdxUAn~nqg46^q9X<7xijHpmy1gvSUZC|cjxh!uhVJTSlAZ6xlW{`B(0k^; z10a2(TjU;2G7A-p)tg?{-Uz6>i4E39u5KtdEty-1Q(2JYlfL!p3;CJcg`2$YXLDP9 zXh|@#HaU*-x}(r7W!`(nJw(33sBA&`8e5=+x=9)cct<2VPLLO4Gsiltq5Qy-9x;wz z9MxOvwgUJrO_qp41Ppw}x+m|OsHHYB5KHLun5Q1aqR6(lYax)(|5}e;J~!1)&%QRI zqdH`DcipvH+ij7#_IkedQ<%IHaI4AV5T08!=<;KJ1tmQO^+BtNdh6kg;PJ;;KH)hQ zXQPwkXih?JrZ(P1HF_PH;Usi6j2BWbzhX>Yea{5Hj!tTl={;o0el>OLdTqjz&C4Zb za!pK9`@!3>Iulx&w){MSz=PM>;?pMco7+}SY{3n`Nd^%7NmNRVd&q`5*H}BN7j@~p^mTk zrD(gPa{h@Uj#uz;uoreyIo7d619rq8cn&HUddH`If}Ky$XMr1OCW1YTH#V0wj^K3E zol!-$xMk|NB*Z4z(nIeAmXU+oNvsrx(O%DlH-j!F1a7$lUtCdrg>JWMJ$TCNa@}Z1 z-o#6HX&GjrDDi>+A zaeE@gz-MNpJ<%3H87)xFSV7D+AOBo5`C}q!@4NEe>}7xb+9Ey*+Zp4wa@0s7uYG%& zox(kBLFzfuKD>rU${6YD?@tRd!Tr5uPb11#_HmE2pWxyydQ)`2uQOsjpnULfoTW%I&YNQ|Fvy zuNKLXITP``kGuNTPl|zc%Rm@4!r4JwsJL>x*7(Q1rHCCze}lbt$creso{k<_Q|?Yj zcxX%?I)lcMM=Nt9IfCtMtMY`;sOb03;-8n^9Mw|pJKf=F*PafdUwnFW^Q1GOkOI%X z$4O^wZ33p7c(RY#y=}tNw9~LfvW_bR(u25j%u~$hGWtoKsw2ZH-N#$=wNNLvwv{7& z#wM3QbA|bho5s5i8$FA;7UA8XTEP<*UXD7A;2Qu;#7=-W%v>leLxZRXigQm;_BuEm zH-w3X^Fq=HHM`wuQ8{9?>SBS9zaA1a}Oj%x++dp zYTI;&YZ*}M83h;6Aekkw4D{%5Xjfy5y8bERJ_9txg{}*hKd^h~ zlV_X~0!A0>?0eibSZPex5HJj%VkflE^f?OLhmg<;eQR5NYMthzaRhr5CBO;K~%$;SAiFeIjLCUK3MY$o{O*9 zhO}ECE-*#{*o(D>uJ-JHdIA~aq9pB(Av3Oi2qx6h!pQY5luL>J1^_{ZA{=zgcjH+S z&9nR_*XqdLYCNxmW!%?3LvbJs@917k{H(tA9uer@g|dyV?ipsCktK2hHp4GV@&?a6 z6Gd`@y18aYtj}nld9irU5Az%4lW*`u3dwjv-w;c%jH$Sn&GaKE3vPJSP|S?O!RNKe z{LG|GTv9nVS10ytGIcfuB!I;>}wT2)9S;6(b|;gf*~~ko4Pjm+U=L%hHkyE04n_{JUjl|FhuMRa zZrJ5(MBo3U_f&Es$xJ7gHRbNK7sZY1GezecZU?qWzfHKi)pwbliM?|AB8fHaIDO^r zK%Q~4q6#@}e(;IY)4_L`W4g9BzY)oLZ+I7pk7>PcjV-_~gXg%7WEzWKrgDzw4#r(v zxkl#Pq-QUhdG&ns$64h!V(6RL0G+fj6i}LDS3_?JG$MlMrprEC=PaIz$D*EQXZ1e= zU^B6V8jFN}xiO(e)b*mR!hp#L2S4qYRz4g7VY^r=66O=08eF3~$`>eecznjUr zc6a*UI{S3XgVk)xbJ`yeRFV4)D3i9{f8wa$hP9hlFLpTQ5Za^FujbE43f?_-^kLe_ zb8dK!15*L@g^;NM3)HW;E_(#!SS;KLYw6CiSIJK_orSFOzvE<8H;dmFk*j47ePQew z(C=rJpEvjqA!W`i4c^GY>?QT9-dI0i#zPukoZ(@J-x*V>9 zwmK-*@&f7|t?S~8(g*g#FqakBcaD_RKH^(J>Y*-w(PFSjA9Qth6?4@LT%L1n6u$rr z|Evoy;KlfZs;sV`qorKjKtD(&o)(kZhztg%=v}c~uXZy3+xlCbTiGT35ikw^2=v`9 zoC6bGEQQQ-#ym!ntCYw6S{AXuP&zQ6)2{%bn4X>CuCoMxYLOfROn0j+O`gOYT+aHNCWTDdA2;4>OB+aOA7T+je0C zY3ix-3=N&1n&$EZAruuYoq@}hnUb0vFsal&3|kocE?-R6KIS4}-`pb|=Cy<+t!lCD z!lzChnkB>8SJ)y#Ppo&ah!+B86^b&hiCo1F>x^&&*0CEChKWfXY3SbrRC^bo-1>{y*Mmr38=1XdaHO-w<0 ztrZ$cb$895|HH0mT@NIhMPPWW?ICF3lld;pJ&42wMDt{juj=kWbrn8LRW*NH>lsV0 zT|j~==qmH`4C;!HGD;lh`gD1Bj{X^m;_^Ker7 zQh@VHQ}M4M;i@5AVbJBgfs?h0tn60?lP~ z)qTL19aQ<>?akRi)EPW*dZSbGqN=YyPsI7U$#iAdYmhEH$xe`cJ$D8QZxYS-RPur7 zT@Jn~q&LN*uu0`TagcgOGW2Rb{D+&YJf0uQF~{vCxUa28E7Z zOpd`D#PMtm-{qewrPb(ImcXx!?X0oel$K5uEL7%1S$VCa?LGFEHcG82DOR=fL#YP^*nRlhOI#eD z;+hvhdM6G!R{o$kczq9&%y0IMy*wfx9rH1Bc3x6m-baSLXFja&!Qi*Okp6Zu->W4- z{#W+bMxQlCkzI;PPc!bVt&j2BNf1PsWe3~$IbnXxeLp{Vf3o}}pJ&S5ebsu-9QsGy zMR*)>DExI5t;2uZ1Y{B}g7}_L=kaj!d*;n6&1J6I{#5 zOS$(!aj$DvEs_GmRDs#ksJCuYRUh~L`HAkD5u0V=e_4N(|3-%M#Dn~@=q2UF-#bk{ zj5Xo}$5#?=7F(FQQ3j^Jv{E;e-AIme9j<6}TFBKsZesgKd+aSA|Cfx^u4lUn>K#d) z_owz-@JjKb#yW4`7^I%B;z?=6o5K5LawiXa`yt)o zF;6`92LYX?>{#G4Z${=|ei+v0Fu9rkY&&KrnzqGZx*MLB+)%#kM9+jvbJB!Ms zuaj@JmlP?YMT&{%)C2Az(EFFl0G>EkMUOHMtQThIpGcY%D1R6>O$FvmYK}X0jdAr* zT97JIOrmQhLA=kf*heZ@m0!|w2RUol964bXYM`!Wc=nJJX5Cf0SE!UzHo*}XLFOpi zN_}iNL}d@3J++Ff!d=f?_lOqpu@NJnG>5@GbKZ}M!(gq$WS-Q`CGnSqt<7$eEo~#_ z`OFFw%uh~U<(zDC#^aeiNNJu;4=D3av`2Je(siC8+~OTAnzD~EdLQd9T&`&z5%)SH|S4x*JqgR~3Fx391{*Ra{U_Hw-g9y(>ZN?BcuHdVqdD`_xch`#j`LJReTxi5%tifQEHM5Je(WQn12bHf zkKla`$<31Q#rnSqTY0n-tjubQsicXb$IDH>F#A-a=C0yx8I7LlKsH1{E)MbTK^yn=hS|1 z5*zYyABRZ4vG1wQQ%Jr*qcntnk?1_{%HSZMlpRn(-43>a!*oYFE`AN1x?pUw?j4BEB@b2V`cRJ1{ZKU)EQ|Q$D)Go;^<-o8^)Ibo`6rx99y< z-Wz`B{t$m|{YJ013+){;OI;tOa+vlDFxgp$GYg>R8e#G4YG62+wf0DqWfR-bp|0|B z{QUn4m_p`{5BhtLiynY(a!q8TgFa4pqi>AhoArA$==tp!S&LOaIu!#tXY?Ht&XgQ) zRvV1R%9qcZ1b&!K%HOE`+rZzc%4YVsaC9`N;(?c_sB2{SIJBkBD$?kx@(|^#6${Tv zHv|h~L;;4J#dsEAL9}ZrtfE0T1d}G^m@AMl8qjha zI+*EdVu8tAtYRBoz@*}R%Cl9azB1I7qEKoc%pr*Tvx&Jo+_51MURg(i#UJ2_O{wsdc z7o+==kqvAl68z)xLw^x*_kNnhyRQxwv$6mH4Ejk#K~%on4n4fo35~^hK}rWpIyhSS z_~*l!U@zX}b~S4Iu3oY=%=Xi!_>vJbYh698ZF2cMVV%ZW5xvfIte6PQ)YnL&qAA7> z>o+OszfDV0j>8=3;}GVdAhd1}3;z!@egCMVXL4Kh+?BCN@?D^qZ+vu;~A6^nCiS)KEuQ_Wmni)hRwQIIp6*F1Ps#z zkBE2XqIe}>W#-bcpZ^IUg1wL|ii**o;_Hce2Rh~(e|Ttpz{4SA?&$S4@ptoA`JKe) zQl4gnIr>A)#YkUNEsi?z1?f5g*xs9C?l zyNkX!!XrKJXg!xQia)OB;n%lfI%fUKojvN*KBcIcPl)qX3iHlibH9?i=GxC~0v2Wk z)H1gi!@DgqS6MmcyR66iLbJXFlgfJc8-G?R$sZs0mrrrCw;9naO)PMKmP0luG*0c? z-HebehQ7dk=BQ_t#AE6m7>aY$H5;9@{|3OO3u1%I;Tu@dky_iqEyr>R7pKlW%HODJ z{;<-otNgpPasvcQBznK-i$(z_l})e1p-%&PrN?xp!%Vf~u||uf&uGb}?n#&o`svfe zd?hhUz*F^H1IcL>=P!%rbzk?h0ljEd0gF^Iv`TOby6!PKZ{T~&WJY@W62&E@Et=t0 zhQt%V+&(%OCggJvLeG9+z0?8Hq==tXI2L-yiQ*1~{te1bc|AN1lLw`Tg8zzJm&#Pk zmQCLS=x^zWs#{G}*NnVx0&iS!nB<_gV9dvAQXF#kG<4g5g(;POm6f7LOO|_cKjGd7 z#`(ODyd0==e~(6j1QOPJ%3NT-6e3BaMGj3Cgi`8qZxek`Kb--S{H`J)%cL_%X>%okjaOPaQ(jd0_mRVXC_a)zEiriFIeOQ7A8?< zyR!H(mlj3b-562W3ym+TsvD=yNM(XmUK5YE5)##5%iW7?ov|iMr~r670_LQaexSFY zzd_RT059LmqZ7Ic>KcbP5$$<1Xv|?U7ppNXtGny`nX{Wk@HLzG0Cy&}6jx9`hkASF zMbBH^QZwwM`9>5MnLUWL$yq15x?fc7cT?9Oe?^6)-a!w}~6;LKC!(!lj{6LbG9(0K{`i41@<^JbW>dy)xM`9+2 zXuwu^z2!l~6r&-@T8Zr{>Kg0K>^k=l?=N#b8XmBFd>bs5JewAfV&!x?jk~c8#LxNU zXg1G~oolhWIG{2@u zFh2^S%kt7{0v4wG4-B?!yNl;2lRK^q`-ucBjbcFX&VJqhTzZfoE-NmdXIKX}9$3BH_H`t~e7GgEOfz(WUQKx2zS)r~E$8cHI z$0_y&#NV~`FXOi&HkE#`W82~8Jo=TLi%Z?WWGad?i+$q3Gvhwo)$M1aNV8a%8W&)k z#K!{5J$z8V1=Qb1|B#q_2>R*!Ak zQ11^y0+RwaQ<*TpKB?<@x=ENn*dkefY-mqv9_~aVG@t*Wq0UKNwkZ-1)m7hH)*htD zxfZs*2KzC;$h^y&KK}LTpk#XbX*nKbW?~nxiX|+|`V4l zI3fA1iTS=nMB#HIXr0%0eLW{L(H~Kz*D|qj`|yscOyX`eikCmRd=^hI zBG%F2aD*tZ6XhHyy)FL+z~tcRrQ_v+tsB7=C@GG-F0LHZXaaLStO2|=A0S|IKn{w- z#LqFU*p6(m(~DxzE?V4~BOBk<*!}f`9ekQQ6W_&B?ZGaodY+{|$8QBs5z^$d5HRVp z>K4E);Pk;_U4FyV9oZ--4uOT373U9gI{cFSW1{wHFTw2|KWC_~;c3K0Cp<;_HFGDI z0{6`mjL15`rzO<+06WBN+mD)$@KH?$f2ucLBcYt9I5%smV|1`C4h1$^|&NRw< zx$gi~l7C#L>P;KJ(Wm#BOOylNDhT&)eyoY?4|hxSEzWc4R9RBU-sdldxeZJ!XlN!O zD^n+Z@Xc%f2^K0mR$r{?vb^Ql>|Q_5r~VJ{Oh>H$$Y^}NG;%f<$JcI1A3P=Wvcs0d z_{&_JER(g)a6T`1($wPlV1pBE@kxii7hcYm+-%K7)sJx=`#JMb*yP}F-5Lw0U{wLuDBdo;O0;XSx7hk~w3witwa)g!}%c&9XAJ~eN$>OTwG z7d1y)Rb0XxtukQ7_VwPvsDiAn?hW_`&l6dEAO1-oiV%C})k8U@4P$31HVV2aX3mLF zF%5qJzRpN83(T$2{k$ML`6 zjK_KjbkkcJ?V^V$Z0!LZZ?QgrWX@kOo=cD~&fDG9_($t&Fcy^z9-6ua%oW`(8Kym6 zwyV2~rOwD+EF2?Jveo{9JDLv*Z$4bJf^HVvnFz+&ubr6mNPKrgA4zvt_l6{LrXE5) zz|7%zUscU)R&eUDkRvI|$W~DAu*Vzy#k+*M;#T(^Z2!{u*$V5KL;}uq`Q_P+pI+N( z8Ug=_IvRCCI!{;cK=%fvs@NqH=d}rH=j$3YJ(1hzJUCi;)8gz)N_rX_2n8S?p2Z$( zBxm(6cd*RRcZuVd|M$%Vp9y(T$k^TwUHveiqqmi<^C%BG1^x z&lLcHTi+v(@)WL9@qL!A2PT;M*YIsqB|cC N002ovPDHLkV1jjCG7FVnd+a!*Q*H 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 bK~w_(T?hRr9_^i;00000NkvXXu0mjff48#6 literal 0 HcmV?d00001 diff --git a/dashboard/public/favicon-16x16.png b/dashboard/public/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..f6900f92f7bf5f2df8e65b9bdcbe64220280a65f GIT binary patch literal 796 zcmV+%1LOROP)mhR|EL{h;9>AE< z5V9o3aVb1;t3kpMxO@#cbP}m+M*o-{?FWb6D73aAm+~MZgrsFcUlcW-r)nJ-G!jN4 z5j5P7I+D5P&P$={#ZziuRZv@1MoncIwUy7QDS1R7#^z-_&!2@AA{<8h6;U$`vyx^~ zn0tk=C9ZF1puVBe$Io9sNF1MtU)YLxq70DQJ0X4)W)h!}K*80^l$4f{GH($ZGq$oZ z(_p&fNh$3eokXL3V9^8H=+f0RB9kWKrkfBSPu!rvOr0{B)|Mtde|+aBGzPPiW>8)A z+Hc$~p19RomZFC+av0bdXliO^Yt~MVpFBg(nX}}aKF95%dn6e-aohxQ^9oQmeHC|* zFcEn3!M3mzRxLxuk0rn02FFgEGUWKEt83)wk!;EoIt|5TkeY(-+d<)->m1JB zPi0j#E7R8Uy}KJDnDPJ}()CTCLuMtU)A z2m;f1PLlyLGaP9hMffNWoOq%Mk7%=Zk{g&0kwK)%NMj*Fnkfgdl7W$uNnpdM6wH|g z$(LDS9?`886b$GK1$od(I+l%!6V1yPbG@uHtt!5G&QHmEeKUCvRYFlAE?>+@wnA9)PIPdd zoBp>B30Q)Gm78o&RW0VIC?8i=O8!F+P_St|nGI`bx}!h7r5OaiS-7p8O!so)Weef8 zmtfKu+%09e{Cu#^(0B$nb3Sh3 zRM@c>nv#yl8QeV-|LeK9Kd;BHsD+86ah8MvJAsYJrUb-N<$lggvcvBpTT~EQOluol z_&03W3{{Wf9(@A#G~kbnZh(~y$Fk4_F3UXXalS0Mlc_eo5);Y`ts*nv`r_^5Y}pRh^Hx%E?DJanvqi_WK^k) z2$03gsZ~f&R$vVyd-Uo-ZOyN!)1j?fyNbFsDXd<_y45SS{=L9>&r&DeAJ?oTzn~!G zjvgl`5eh6?zO}SK7Cb<#!(;80f=baW9g8gO$kBH|KMw8P!MxeOV9KQG1SShlo*>#l z^u&pxg-!k=(Gw?-r$d-}QFy0A7*=v`*xF?su*&V|+FHS-8Mt03WZ;6o z;rD%?Scf`R2adk|j=X?#5D1|p0b__`2ZenH!7dX8;(J4(xHCxZBtO;INLF3S#2Jc; zI#W?mK{r*`t-OK?LAk2^a(Ou=CB;|-?JU*f$Ai^yzndg8P4+K7!{~ucNTAfTc^GR`876#H@O5HCc5bILb|GL!^iy zSjZ?$lAb*W+jgRUgB`AU`U2{w#F0F)_A}NtnZsD`cPz)T*0FF_7;V!tOKa)XyLWi? zPMmCHc%9upf|`<#6SS&Vw!w9WH(|7w#A& zGmW4xMUBLxa(U)!5PO*|m+K!-mnSAClCjYoDUC zZoD?hKl$_%rqB2}n>N4l`F>kWxg-RXbBzc+_6FEHo3zpxiJdcs8D04g)UJR(sT%ze zp`TLp)4{MIOq)B4if-NYTDFMY&Vl_08S}_^>g)H*Q97KkfskT$%$7&^A24Q+he>i9 zqK$8)fzxSs+xNhtWpLy@obCYHTWQg|->Uz{lZ~gC`LkI}oi>Aiombb)=!(+@C|RVZ}%RiKQWW)>M5VE+MKEgLkVc1VNFdy z-ZVl7EKXo1lk_Fg9JW9>3^UGwF)m$(?fY1|XmPmV?61k#9bmfV#&9@lT4#E zjt-yM z1qEqRB=jbsg@lBX5JKohq^$jZzdbYOJKvXh-+J%gceB=BbG|tvaEWTZx= z042%(u36bVyZ2h}+SkxF0s63?B^}4LZPC<7k9z|d{=pz=bM@ts@jWkBYJ1C<W(rZS3nEaLGZdi+P21~3hw9K=?;dLaLL$;gN=jNIJWNNN>}|IV8` z$eNYQW!Cg*a$4PtP(CZKlNECJebUId2}Ulx5d9!Kb))*h*ylBGCaW>V#4pE6tvJ0{ z9b9xlAX8=qa`Vjw?~U~AcDFqDbUzsYdhV%ya?hQ&NxL@J$*vv6a!dPm5uMxi|9qaj z14*rF8o+$6!+{|Gvw=WW7Sp`TOcWrbHZdJ&-6Ev0^Vmd z%95Qsi{<-C6D7TRWy=fo)X|IocuuwyZjQ5A8hHM)+{k_Rv%i(Q{f*bi!2<_m{=7Nz z*~m}ivk{i~`}g0E0%vll$Fx(7EX^@;f3HB&sz4q`w{~nROBO9uy{%fYTu7@yE0!;p z)M}M%fAC8?)yS{8f%JLENP11^;FQ3Q0nF583dSSGv}$+<|EOD=_JKT3Ci35~#YpxF zBQL{euDrrXMlIWx?Q2&za=|%99)8rwC!>vgHx0glKHk?k{!M=kR*^ovt4L-o+mCjpJ}h7B+fhAO zEViCLO1ZQT_^8jK&hxQj7^!ek_+M0VooNcX7R2@GkN!fO#IHoT-Lump^+Nf)PAyi~ zPIVR4n|lu1TiL=n>t!Vm-`73s_>QO5gPp_Lj%_?e`z6*z-|-pm=>yu=zw>Kpw4Tr5 z``EL`l=!Y`JtG~lmc9P!GjjcvmsvX|_V;6=RR8e5(XRZs5q+{9sGPomyHOpx9=!fm zAg{h1$g(BVBxluf`S$B^(ysNj70M8&H#c@zrO^cv&1VObs%O{PRU4!?8vT`^?D4 zBY|PKkuG-ya(}lwW!{|GQn-1OUy@z1E|jO6t4_wKU&PtO;cJflatP%8 zY`l?CV~vai_3Rx;-85?>Vy#srNxI*4r>w$0RG7a>3N~$kPS#5IzulSOckE;3)V0QA zi0C=QfOpLrL0-uG#l%29{~9>3_g>NpW6;mSzV0{b8fK)**fFDJTVa800gim&=yGeP zifw`RIxjeuCqE|2OssQ5pyRK;H}d6oM&5zF8^iZPeCQMUG}`-m>f+7UUXh}0TVyNt zv)m0i@?RI88_$D$JbB)}boGz-#achr$iyi|J{)1BK77FM3n53s$~B%UrKfqNlDRm>D8laj7NyWj~nC7dG^Xc^2fPlCg%Em(5=Ip zRxL^1dGmGIwxv*ZU`$eR(KeNnWzjas3%x(_$U|z6zg%^>l$Gw3T|0MRomdRKI2(9< zq4YNMwxB&5Wg7W;k&zkLQz!mlqz?8?`yOYg4(;^(vv<#K*#}~&v>WB_GTF0xm+anE zD$hREHyrz?sXxl@vR$$V)cWcxVz#185xbFhO4UHR++k$SQX{h#7OkJYdHLkDlG{k$rpjDh+()rLaEAo6nX%bdPh& zJn*LuuDvqm6mEm*KYda=Dd74a^$dVDcEfJlQ+rn*YTk%p1o$wHL`dO&PFI}sC2=;w1Q8Dn)J^lja8Un> z!TF`0WobX+^MrS)n9JJUVfVPhb=JuqwLvD%;mhHB8@CymJ|Fv8y+E??O~G%5+OQ43 zNBG?k^1&E>TrI($JeAOn-z)TKeur=j?wy|gNG!`y1XPQ0+wwK3-L_G-rS*mAea9+kP)97S--_d&SuyxA2!?s zoxzXadLL)j&Ve+@#JI4F`XhK$B)|7ds|V{dv~?!Vd5!A_(xZE2nLfL!lpaWyB78q? zE5kQrsnrYdD?!grtq0e`YmkZeTCn8%A4{!nXNA*=mPI_O;o=E7WfRm zQEB_m9jnURdDW%tP?GFCV5E3oAlspvg)1sax30-LXSt5h=jr<@GsX+~M(zGb&kmda zR`v6VewGfI>cTd?AE+(`+p0_P?rJh%z$wzGF8q({CG^aFO#3)p`|n3Db9nA>zUS-X z=Y`dY?@Rog_Z(OK9lV-1O_Gbwt76w_uV=JjyKr5gEQ#dh_VxI!=Rp4U=Rn^kf{_>$ z2TEOoXdh3WuWO_J9C;39L|xn&fWNiQmrib951$F&drWxev9RPfg_e{9zxl20f2&T} zCeqhFTRwjj7x@2D&o~J}w5A8>-^NKIeo&!K)ehc<5q&$G(1xK+eA|CFrni?rFZyw` zbUu+VrjF0CUE7dfI938aZEO7?^bgNC^kMeT$ zetw2nSnvBppNYfQOV@)CgO?+MU2(eKQT$Op;Tm0$T#>$UdS$)G zPyg}H31uqQ%9hQsH{Tq{Q~d*ZabO_7{4!p$=l?82-+No`zWru7y?!0|UBVcCd|!Hf z@b~{jiR-!_!}YT|N#K`&n>-lzxd(ZWSKcu4=DUdhy%WelPNm6*f4jPh^v=Ec8l2JId@s;=*83kL zhKKXoTZ4_fJtUCj%fHop&c=0XG>*4EXO*naSuG=ne<&B9+YY3V~oW= zoH5K%cpiiEcJDx1Hp5w_Nj>S-yittA>ihV5UphJHd;FeheZ9r3vCnZf_W9}O7W)gY26FCM2|kE% zQctNYk3aNxS-Nj*XI^Yi%+N`NA_A)r(<>;&J@rWI$b1mN@Lh9oZj!KbGy< zS)89wFf!&V#BaZ}1?T2+#9u52lT-WVtaoAVGi$ya+6 zKo4b=4kLu82^0+v5 zXakSkm#!b*^Gtl{h0ryyGj7Vb@p#Gr{Ezkp9(-SixIK?3UyfOB+(2$>^A}mMbcx1t z8B?Y`@^d%H^8=p7_jJ`bJNo##j^oEm7}I0WHP-V-$-VUTLH0YH_>~ZUe()j0;?fha z`+kl`Mf&%AxQ{U&wrufYDca7waUo*3n}u__L)+HnbrQwxpFO{5sqd`MkU#Upj9D{o z{taRc6M(%RVyKMe$FM|n%>Hh?IQ#yA54XAYDvf(GuFm*AX#wJqbyI7q-NHS~V~&(@ z`iaz&Ki{2whLN8TbNp^PWI*hVG7NeTF(BB)+cLW5>Dd4{S!zs&CE^$1vwLUzvK{;r zx$UR=KCbI)33B*55Hlw|Kj2yPON#j(@i|z`wzs55I^v3 z**B|375Qr17s%@rXkNkQ7D{Z6p|nKv45cMIP?kt3at=Fjr-Jx+uc6gBEtNlIpdal) z?tpoTGW4TAJ@)qp)s|6y`b-%-_QJ!1_IVSY~k1vC$L0pLTEp#QV5r~0u}c8t-d zS5G;xe;;xIdyuy%Lk^=XE`Pxs#@;dz@)*ozl$DhNU#XN7Z^wRcc6cUWKIYqr6Evq$ zhJ43vv>W&N7_1Q~F&%rXUf=u;@^i%FXHM;dVMb;zLhPL~Anw^8x>vvPa--yZfl1#? z)cgzYpeR9({d@52@*9-PQ<$ScZiYFiD1Pdt^G$7`|DBMPxtrZOug^R4^iXHkZ`^sz zVYhWLzvo;#|4it74ste&AwzZ`KLP(`@Tbsb;H9!6FE)S9&zc80cwj&5uwVUV3C;n3&ePut3j!E zJ5Um*U5`*I9=ld^%sQ#nWyJ7dRv*l1K_>%Wec9rVVz1y?@nC#@|2^>pVy?i?dqT`x zF?U$6w%v=pkFg~F_HD1zd3WUSVIlp7oKViMtEE%BHX(Me->@Wq^!K*+Hel}aUjv>| z+=ro$!-o&b)E}qB+Okgt{n+2*VT^L5j>vDn9npNEo*%r- z?CYOdI_zHm#5r*i?j`|0h8gvgOZXG?a#6HV*aP${H>T3xAQlLo%KGS zM*T9rJq>F;EyLl$fKe&tl{@84+mn)I;Sq>TI!+&nSo&F!qRX8~yPfh5b{>{0- z{--xem&xBvR6jZi?20!b=NRTCfmid9e4o(9=P!>Q{axy%r^fIn=sxsgtcT34Wg+)7 zcR?VlnRCgtbC~{uXdPwh{@zh6uch`4)BJUr(zlS_@#zIKa|wUB{x_^!XVe%XQH;i*xm+Q z2kT;=U9bpwzapEn=3Uh8SpOR!Z%rApkf*hBSbH!BscVyBv9hTCh&kd@e71Ur+-!?j z4E05yRN^?;do&-1XXg7ZJTH)2uy&-NT?~K3kBB`&s(<8fvvF?QTw-Nd2Ok=WxZn+l zKU~-+=tnUyr@d6`p<2~({4m&cxO`V+92 zC4t^0@HSx%GnP9iMvK$S<8{pMI^G+g>`j6BM(E|y$Bn%I5x!ILoz1iQG=4K-4`n`@ z->h|jiT9Y|@OvL}vM7GYmS%&=W9^|%nBk#Y<=GwhIa<>~j z#CSmlbilbo9mnB!*!>*vHlWT%SvdmeKB-?0y(QivOL+Z zip*b7O$v&WrDQ+uf;b=JeBm7o&X-*H7E2O+Ef=(@nD_(r^VbI2HHSXOyA(X5_Qdm??b{!04 z$3EBvJ{Hb@*r$*-0&Uu!B;QO^|WdtZUys=qkg`h6VYu3+wZ{A}Z&6H7mq>csk$-9N28=v!Wn#to9> zseZL&-Nu@-=SU^leK<+-wpNpO->o5Mo}Q%t%cA#pxUN#?+#~4Y&c^EJ;7^^a-aU4A z&Qy#ZYhp>Bfp%y!L;K06zr&mYN=IJU||93)~=Id~@EH*pfaWs-F* zp==>;=vwC`FsZ)L*PkCPCd;2=hx$&$gx_)Ry?nl1)Lu^ap-c&FybNj&%0XWsQ65je z4(}~yyQZ*jBE?~j;_^6r8RCe@n^0E{b96l47Ildj!r$0SLVr`N<#Cte!ErrCUq*O^ z?{vHfc8|^XL0OSqLw*&s=erPlPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D|D{PpK~#8Nto`@9 zWXW+Iimu#M=XB2iGXO|sA-If9}G9UMW?dqSea z6@URiU}n1eoZ9(*h*%LTVrTUL`V=!=wKIG~y4YE}>I~ezW)1+D6Vu-Z01Q|g1AyV? z9M)8r#sxU5Ud{niEa3jPQ2^Uq~_s?wk4*I_F$? zTrHX_(^F@>6VutK*KHwv&k&3^wTeCVPeArbjc0nVwfLk9t0vE_yc(7mjghfMOQK4i zE~z>)jYl7W>@UJ7!HKOJ^cn_?F_caWPXzmAppI>3Z;B%+t+9FDyz|`qB2it_JjNs| zC}y+-DC6546PkKPcBO`_Vo~@}_zb#hfXts^y_pe`+up0}F^5=qpTJzMJaC*3K?C)r zDpU4h=KhlLnpXb0chvLX*3;>JvtmahcaDqK#3;nf(-pBMKe13!s)bt4p`$k_*xAPS0dzite(AWLt~oAxl^I*3p7 zQOe1Nb7SkU8hB3Up$s@0X&agDyA7$~R`wVgHz^YknCF+&*vd#+>kyU=D!yvQbUBG9wvx%q~xi zwSr-KCmaV+t`Q+KMs&s@84}8zs{!a1>OSfe1J$V~25~6^q43JJI2-w@%#1gIe3n@n!t+F3w6U0x&YW%vWjq1yc zQ{1XxHkBGnr}An-^t6Rk^VAflh@e*ycbr0xwfF?{E9A@REpd)0YfyD+BF9CXNC>UN z!QUtna~(}M<`bGVnYW~9Y{pZ_fUakbG_>pKebsEJZ1L6yR~biSzbW9>TIk~x6y&NhITi?1wU;eed>HY#*%A^y_bB1?9n?+#7UIm3}X(A zk&)%69U9dN9GfZ1xE2ytQ&j(YpF&usj*M1IOo%-;fQ8-c?_)0oM~vuHZd^|TYVZ>t z%F|8li>9dNpg@vD4`Hlity)c=MPeFlIT89~QJ6gmslQ4U#sfxqd1DYve!&gBK;O5n zLgN~Iu@$SUJuDFPOTd~(zNhEw8f~>$;HZDiR3KP9t{xk()>BbSDF>%5bXYo>(5LBe zKD$^bd%A1|${xqpT1`jV$D+gM^nfiuaUe%%V%ntK62>cx35UvZEZ+=^^&IWa35-FR zXx`a_l4V+ku{%|9!pm zYfW|Ut7fCe5wTr&A6StOz8iG?Plu=M0hqPe`Co*ChVJ%6j>OLFYkm3GA330p%Y1Z& zv|qI*7eCfi(4JD02EB+o(2gDMLOAIf4R(yrd740?q61XVWW`nBayO4kZ2{%9WtDsfy~hUo$}w7zYQZp7zoQwqp~Tm?V{)uAx^Klh z<^U4&Fub+W&upNx&xP^xDGJLT0y6 z%2bcb?$TQE%4dfZW^_ey!up%G zIL{mp&66MTmZ35Yr?!e8iwpCkB&d$(20cqqzG){1<4S+>GUm^aJI(N;S?GPE0kgSq ziYUGH>1@aN^q%#2(r`R|5gn4Z)%<1eJ-wt8`y;bh{A^A~etpd8$rN*Z71G2i^D&21 zkFCpsFZ>CehNJ5Rf?smSt9lAcwyuq1Dx{1x*vw(mwDPV(A6FxgY<2sVqkc zrAAwOWp}g58Bli<(;suSj5)p?hU&X%nKoJQe8N3Z9L^Gqt-8pqx*u@f|jpI$zpS=s7~+>f=~-%xkA7bAjzgrmqB^hgXDEj?2Y2q$S|!WtBb* z3$~T5gGU)8- zS`&JTj)M}-(P2T#uJE(bk`7bl9*n#$Aoi61X|Up0;Q|I3Di{4t$}#65vFJDQr&cYT z7jPg|f4HVxkA(#=w~q!I5Zl+AX-NzoZj2UcSNIkEn}%0XB7PoNop!)K4Lb8;d{?+~ z(zAeTn#!6W_H_FVj;H7c+=v<~Mpr$#h{* z+>5Tmc5@Kn=K37OAwW4D^L$4dQg-P0ju)&ZhPNxpW}j@v zF-KCS#~hcu@cs$=x)#WZks~RUF-U$D%(D^wi15Yzbz6hJ#JWgdBo>7f4%DFJq0n}o z+4Pk@v$0A!k3PqtJU0~i4kOg>`U1a52=eqM#+|Z-IpHhw&pmQ~s=tIdjtWfiWKPrR zLitTAZySqUi2+lWnL(@}y0-BfwFjpP98XN@`gvSuA#=!R8h`r50L(ww&`T}}a$v+M z1(2sj_S)^s7YPFqAls0D2paf8v_Sd%GdGGk>IS^hbMQpnk>;EWI zHXVPLxpg=(E&iJAN#FcJqD&a{);82w{Mv$(aUmTV#uuiA?-~Sc&d5Vw^a_uBTdPI9 zgp`%E1vPC2ZnOpXnw>EY6x}F}5$I{5!?X?5!d_W18}=W;cmAS^`FF0SD*MS>L{!2N zI3-mdzcF&9i zTmM|yaYvBNu~8H(XPThoKHBMs4#_}`fti(V;O#)$MX`HuVhwf&(XrZ93!<2=_Y7^6 zmxkuwuKKfO329wnb(bZ?*5CdvH!3x!RYzBMfGYztyP)@xfZ93ek#R~_CmUrX1eDDI zz`R=G6BxhPDHNmD_q=|(?nQ5n5g(IUx2!Y>Zha}x#uevwVYU8Lt)+T{SVN z%Da{4WNwSgbpq8ndwlRB8fkB|RNK#5G3bKWGf94}RyUW3?4YQ@<%731i!vxrTO+Y`FEY zfQdM=%}vQ=>2E-uLL6YV82NxSlcp!eSKd6-kBc0R$JyNzm+|q(2s$63XG5WS{Ysjg zf$42 zM9h8yA~e-&X8Q(1$d5EDmKP=9yuJpbE&3zn!dJ+mqYs4Znj$d4aarduTM=0sP@(8PUccM92K`w08m!C^ zG}i~d1%AZ8xn{Tqng&J7T|lzT7^Le6TgMQ?3m! zMU9}DNmA;E6^RE-U#A$Dp{KbQaE&Ih4|w6uMu&)%38K%}y)!jcS+owxx(-k0(o8-D zt|{SsDv2~4qtl2B7j-(pdXkH88suI9N%=&*Nitl{0m7l6b+Gich)WDd^tBWukR!*Z z#^2=^9#!0^Co3u+*WciJmLU8CW|2Eo*z=n#+UB~Pk_Q-A`LbA%l&9ZFOici{*WRN9 zYOXewmpLCZwXHz;04;X>qK}j6W}I{#iHdXNbvFz=KUS!>1WkF)vZqUM`X2B~cAo+V zU9SjzUr<`Yp=ZB=6y+Q@X7*i5t+L|40!5OTTCRY`5p3#cm9-zJB>DEasDsV=(V*$b z`vOelT>@>7q6P4;;R)F<xLGb{0e>OBgNMX zy*qaLbU8rp4%Hv?CV0%a>#)4$Trj+e<{Y0vf9uX`3!`7v0!z=qXRCG ztqmE6W3ktkbo!i>Q+th%$c#qTuT&!QttxTLE?{q->_p8xTuD1DBDJrN{-E1%IIjDd z$t`fR?S`}IA-(gUc|gzsPiUQf5Icy}1RkKKq8~WVkr6LRXHsy*A z`UtWgcr*M3tWi3@2jM(G8XI!0(8bKDUhH|GiY$HP$x-#w@$FR^kKU{t5)fKySdX{5 z+&xXN5hP1T7&v_E!)(?vFr_6~l7|BnpQX_+W5CpyMojnxT+_|=T-yx2kQ_>1=Yl6R znM;w$WyppcpbxZfi*`TVo#0)U+|3W6xWI`PXndbd^fB&?BU-a>%MnQ#t{=O)(E(88Za+4MFD#ALz-pX`ZLS1uDq{1 z2`f7&dU?(Nl6xfwv2O1&&aOdsm!M7 z!*E5`>4!8gHvVj6D_oU&G(O4@t~i8J8C`L?-PA@!IbTThvSkX9% ztKN`r`nB;(;h{_nmQj#Rz9vqXV9{i@%_2L}akL$=j+z6Hh>wuMZ64 zPTwZ&M&7$E9~W|ZWJ?;g`exjn#@Q=|e*KfPaDY~7tT9J8^K zt2Z6Z%2k66QJSew4(y2O%+<@@nD#GMACt{?_4l|MIM6JYBUwKQ{?Kyr2LXO$D~?SH z>!L^MNCl-&R|5>NaLA{>KG@T4XLAKhM_u} zE&~JlaRHIe;Q7qvA^IbDtrdOJ`=iWjM>s~q(`-;_L@92VPWfmpVEwU0@AH^%lEQ1- zv#?ZL%s1On264*sjR19^8EL?b^7pw~8n2Y+2Jx}`l{tv!ukw>G=pJ|EP+p5pU+)Vr z;g+leZIx?8zAH|Dr9FI;KIhmdeoJf!_M9j^JHnYXUn+<0is45}m=5{9BMrbWi7|cI z$hoR}l+6eIeK5)%l2hia$BmqX^kw& zu+C^dZCV)wUCowGY|w%|#4{H`9@;WwI9acVVvyDOY5&03;mDu^JgydT28|bu=Rg-A z>Og8m(}C`o(e+3CD@a003#J(H22T+JCvEvl(}dCNUv(!=50Z%s_VgPN(gy2XY1atM zr@lv~NCmDm3)JjYoPzEfj4x11jM|4d zJNsF=(9^zTI&k&2_`=QbDX{Xn$6Ip2pCHep3g&{B$5iym3)3J{uKQrA;Xc+8M3Bu*!T-ZZ9H zd9QP*bn~v;_UYPl+OkfSJBc8)UuAXB2WS)7E~X{5L-9gbd+y8r2ALc~)aqj3w49W@ z&c4~%CC(EG9a~0xV;t|(^4Md^YI!JOI)`;q(6=$vB%_>0X|M>6L8_UK1ftQ z(S9vl=bgZW=u$tK4=)&crsBDfP-+~yuv;RXD$eQMlPAx3kaLodcg-Gv=qbbX3YZJ> zz%>2w_l(#5GHlaYeFAI@X#5lGMCPsWhb@bJUg;0_mTabP_}E=NA4VOqmJN?X3>@9Z z81^w^!~s|ohxL~(YoAeNL%68U1w@LNCjp&DkhPKAElJrsZj5-pG?}!o{cZT}lU}4h zQMe{0{pNTaIRJyEW4Cv%j^iS8xB!Z6zv{WL0qtW-$A$ZDPRh)!>ziGql%A^3!enx( z#}moa@{-%B8MxrqW#NKkGZSJ`l z5gCdc148xQL~FYQj6iq{f-x}nHF>Y|ZS%NqM7iXFf=DvpKju;GprG31Vn^51{zMpySjG-!^V8!dOd9opc|RD))Pa8 z)8}J;JdcaDDBNayQS3;14QO}7WQqKhe}}+}mLu8ihTjE7>O4U2mQ*BP7p?vbtVlQZk2;ualj%!D_8;A8F~<-a#t2 z%d@{wJw

`Q}&sS6hKoOb-*Y|7mmEAFg#nD8%C1Z(Cnl`-U= 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 Date: Fri, 1 May 2026 22:38:19 +0530 Subject: [PATCH 3/5] Ui revamp --- dashboard/__tests__/api-client.test.ts | 39 +- dashboard/__tests__/query-keys.test.ts | 13 +- dashboard/__tests__/routes-smoke.test.tsx | 2 +- .../__tests__/sse-cache-updaters.test.ts | 10 +- dashboard/app/activity/activity-view.tsx | 78 +-- .../app/agents/[pubkey]/agent-detail-view.tsx | 102 +++- .../[pubkey]/proposals/proposals-view.tsx | 5 +- dashboard/app/agents/agents-overview.tsx | 49 +- dashboard/app/agents/agents-page-client.tsx | 64 +++ dashboard/app/agents/page.tsx | 28 +- dashboard/app/audit/audit-view.tsx | 262 +++++++++ dashboard/app/audit/page.tsx | 5 + .../[id]/escalation-detail-view.tsx | 182 ++++++ dashboard/app/escalations/[id]/page.tsx | 5 + dashboard/app/globals.css | 124 ++--- dashboard/app/home/fleet-dashboard.tsx | 456 +++++++++++++++ dashboard/app/home/page.tsx | 5 + .../incidents/[id]/incident-detail-view.tsx | 5 +- dashboard/app/incidents/incidents-view.tsx | 18 +- dashboard/app/layout.tsx | 2 +- dashboard/app/playground/page.tsx | 5 + dashboard/app/playground/playground-view.tsx | 66 +++ dashboard/app/settings/page.tsx | 5 + dashboard/app/settings/settings-view.tsx | 253 +++++++++ dashboard/app/transactions/[sig]/page.tsx | 5 + .../[sig]/transaction-detail-view.tsx | 336 +++++++++++ dashboard/components/EmptyState.tsx | 30 + dashboard/components/PageErrorBoundary.tsx | 47 ++ dashboard/components/auth/require-session.tsx | 8 +- dashboard/components/close-policy-button.tsx | 11 +- .../CreatePolicyWizard.tsx | 12 +- .../wizard-step-panels.tsx | 24 +- dashboard/components/dashboard-ui.tsx | 521 +----------------- .../dashboard-ui/anomaly-risk-label.tsx | 19 + .../components/dashboard-ui/app-shell.tsx | 263 +++++++++ .../dashboard-ui/incident-table.tsx | 51 ++ .../dashboard-ui/incident-timeline.tsx | 25 + dashboard/components/dashboard-ui/metric.tsx | 10 + .../components/dashboard-ui/policy-card.tsx | 90 +++ .../components/dashboard-ui/spend-gauge.tsx | 60 ++ .../components/dashboard-ui/status-chip.tsx | 10 + .../dashboard-ui/transaction-row.tsx | 56 ++ dashboard/components/edit-policy-form.tsx | 15 +- dashboard/components/fund-agent-button.tsx | 7 +- dashboard/components/kill-switch-button.tsx | 2 +- dashboard/components/landing-auth-screen.tsx | 16 +- .../playground/attack-simulator.tsx | 180 ++++++ .../components/playground/danger-gauge.tsx | 30 + .../playground/kill-switch-demo.tsx | 100 ++++ .../components/playground/policy-sandbox.tsx | 150 +++++ .../components/playground/progress-bar.tsx | 22 + .../playground/signal-inspector.tsx | 96 ++++ .../playground/transaction-crafter.tsx | 255 +++++++++ .../components/playground/verdict-panel.tsx | 102 ++++ dashboard/components/proposal-card.tsx | 48 +- dashboard/components/providers.tsx | 4 + dashboard/components/query-states.tsx | 8 +- .../components/rotate-agent-key-button.tsx | 18 +- dashboard/components/shell-navbar-actions.tsx | 28 +- .../skeletons/activity-view-skeleton.tsx | 47 ++ .../skeletons/agent-detail-skeleton.tsx | 43 ++ .../skeletons/agents-overview-skeleton.tsx | 36 ++ .../skeletons/edit-policy-form-skeleton.tsx | 16 + .../skeletons/fleet-dashboard-skeleton.tsx | 27 + .../skeletons/incident-detail-skeleton.tsx | 39 ++ .../skeletons/incidents-view-skeleton.tsx | 31 ++ dashboard/components/skeletons/index.ts | 10 + dashboard/components/skeletons/primitives.tsx | 37 ++ .../skeletons/proposals-view-skeleton.tsx | 18 + .../components/skeletons/skeleton-block.tsx | 14 + dashboard/components/ui/select.tsx | 142 +++++ dashboard/lib/api/client.ts | 427 +++++++++++++- dashboard/lib/api/query-keys.ts | 22 +- dashboard/lib/api/use-audit-log-query.ts | 13 + dashboard/lib/api/use-escalation-query.ts | 13 + dashboard/lib/api/use-fleet-summary-query.ts | 14 + dashboard/lib/api/use-incident-query.ts | 4 +- dashboard/lib/api/use-incidents-query.ts | 8 +- dashboard/lib/api/use-llm-settings-query.ts | 12 + .../lib/api/use-operator-session-query.ts | 12 + dashboard/lib/api/use-policies-query.ts | 6 +- dashboard/lib/api/use-policy-query.ts | 4 +- .../lib/api/use-recent-incidents-query.ts | 8 + dashboard/lib/api/use-spend-trackers-query.ts | 14 + dashboard/lib/api/use-transaction-query.ts | 13 + dashboard/lib/api/use-webhook-status-query.ts | 12 + dashboard/lib/playground/constants.ts | 31 ++ dashboard/lib/playground/engine.ts | 134 +++++ dashboard/lib/playground/scenarios.ts | 82 +++ dashboard/lib/playground/types.ts | 49 ++ dashboard/lib/sse/query-cache-helpers.ts | 22 +- dashboard/lib/sse/useSSE.ts | 70 ++- dashboard/lib/stores/playground.ts | 103 ++++ dashboard/lib/stores/sse-event-log.ts | 32 ++ dashboard/lib/types/dashboard.ts | 93 ++++ dashboard/lib/utils.ts | 17 +- dashboard/lib/utils/escalation-display.ts | 33 ++ dashboard/lib/utils/format.ts | 18 + dashboard/lib/utils/time.ts | 29 + dashboard/package-lock.json | 42 +- dashboard/package.json | 1 + .../api/routes/fleet-spend-trackers.test.ts | 127 +++++ .../__tests__/api/routes/transactions.test.ts | 47 +- server/src/api/index.ts | 10 + server/src/api/routes/audit.ts | 225 ++++++++ server/src/api/routes/auth.ts | 50 +- server/src/api/routes/escalations.ts | 2 +- server/src/api/routes/fleet.ts | 84 +++ server/src/api/routes/session.ts | 29 + server/src/api/routes/settings.ts | 37 ++ server/src/api/routes/spend-trackers.ts | 66 +++ server/src/api/routes/transactions.ts | 100 ++++ server/src/config/env.ts | 2 + server/src/config/llm.ts | 15 + server/src/worker/routes/webhook.ts | 2 + server/src/worker/webhook-metrics.ts | 35 ++ 116 files changed, 6241 insertions(+), 830 deletions(-) create mode 100644 dashboard/app/agents/agents-page-client.tsx create mode 100644 dashboard/app/audit/audit-view.tsx create mode 100644 dashboard/app/audit/page.tsx create mode 100644 dashboard/app/escalations/[id]/escalation-detail-view.tsx create mode 100644 dashboard/app/escalations/[id]/page.tsx create mode 100644 dashboard/app/home/fleet-dashboard.tsx create mode 100644 dashboard/app/home/page.tsx create mode 100644 dashboard/app/playground/page.tsx create mode 100644 dashboard/app/playground/playground-view.tsx create mode 100644 dashboard/app/settings/page.tsx create mode 100644 dashboard/app/settings/settings-view.tsx create mode 100644 dashboard/app/transactions/[sig]/page.tsx create mode 100644 dashboard/app/transactions/[sig]/transaction-detail-view.tsx create mode 100644 dashboard/components/EmptyState.tsx create mode 100644 dashboard/components/PageErrorBoundary.tsx create mode 100644 dashboard/components/dashboard-ui/anomaly-risk-label.tsx create mode 100644 dashboard/components/dashboard-ui/app-shell.tsx create mode 100644 dashboard/components/dashboard-ui/incident-table.tsx create mode 100644 dashboard/components/dashboard-ui/incident-timeline.tsx create mode 100644 dashboard/components/dashboard-ui/metric.tsx create mode 100644 dashboard/components/dashboard-ui/policy-card.tsx create mode 100644 dashboard/components/dashboard-ui/spend-gauge.tsx create mode 100644 dashboard/components/dashboard-ui/status-chip.tsx create mode 100644 dashboard/components/dashboard-ui/transaction-row.tsx create mode 100644 dashboard/components/playground/attack-simulator.tsx create mode 100644 dashboard/components/playground/danger-gauge.tsx create mode 100644 dashboard/components/playground/kill-switch-demo.tsx create mode 100644 dashboard/components/playground/policy-sandbox.tsx create mode 100644 dashboard/components/playground/progress-bar.tsx create mode 100644 dashboard/components/playground/signal-inspector.tsx create mode 100644 dashboard/components/playground/transaction-crafter.tsx create mode 100644 dashboard/components/playground/verdict-panel.tsx create mode 100644 dashboard/components/skeletons/activity-view-skeleton.tsx create mode 100644 dashboard/components/skeletons/agent-detail-skeleton.tsx create mode 100644 dashboard/components/skeletons/agents-overview-skeleton.tsx create mode 100644 dashboard/components/skeletons/edit-policy-form-skeleton.tsx create mode 100644 dashboard/components/skeletons/fleet-dashboard-skeleton.tsx create mode 100644 dashboard/components/skeletons/incident-detail-skeleton.tsx create mode 100644 dashboard/components/skeletons/incidents-view-skeleton.tsx create mode 100644 dashboard/components/skeletons/index.ts create mode 100644 dashboard/components/skeletons/primitives.tsx create mode 100644 dashboard/components/skeletons/proposals-view-skeleton.tsx create mode 100644 dashboard/components/skeletons/skeleton-block.tsx create mode 100644 dashboard/components/ui/select.tsx create mode 100644 dashboard/lib/api/use-audit-log-query.ts create mode 100644 dashboard/lib/api/use-escalation-query.ts create mode 100644 dashboard/lib/api/use-fleet-summary-query.ts create mode 100644 dashboard/lib/api/use-llm-settings-query.ts create mode 100644 dashboard/lib/api/use-operator-session-query.ts create mode 100644 dashboard/lib/api/use-recent-incidents-query.ts create mode 100644 dashboard/lib/api/use-spend-trackers-query.ts create mode 100644 dashboard/lib/api/use-transaction-query.ts create mode 100644 dashboard/lib/api/use-webhook-status-query.ts create mode 100644 dashboard/lib/playground/constants.ts create mode 100644 dashboard/lib/playground/engine.ts create mode 100644 dashboard/lib/playground/scenarios.ts create mode 100644 dashboard/lib/playground/types.ts create mode 100644 dashboard/lib/stores/playground.ts create mode 100644 dashboard/lib/stores/sse-event-log.ts create mode 100644 dashboard/lib/utils/escalation-display.ts create mode 100644 dashboard/lib/utils/format.ts create mode 100644 dashboard/lib/utils/time.ts create mode 100644 server/src/__tests__/api/routes/fleet-spend-trackers.test.ts create mode 100644 server/src/api/routes/audit.ts create mode 100644 server/src/api/routes/fleet.ts create mode 100644 server/src/api/routes/session.ts create mode 100644 server/src/api/routes/settings.ts create mode 100644 server/src/api/routes/spend-trackers.ts create mode 100644 server/src/worker/webhook-metrics.ts diff --git a/dashboard/__tests__/api-client.test.ts b/dashboard/__tests__/api-client.test.ts index 3348fe7..7d8a376 100644 --- a/dashboard/__tests__/api-client.test.ts +++ b/dashboard/__tests__/api-client.test.ts @@ -3,23 +3,34 @@ import { ApiClientError, apiMode, buildApiRequestInit, + fetchFleetSummary, fetchIncident, fetchIncidents, fetchPolicies, fetchPolicy, + fetchSpendTrackers, fetchTransactions, getErrorMessage, isUnauthorizedError, } from "@/lib/api/client"; -import { INCIDENTS, POLICIES } from "@/lib/mock"; +import { MOCK_DEMO_OWNER_WALLET, INCIDENTS, POLICIES } from "@/lib/mock"; describe("api client mock data", () => { it("runs in mock mode during tests", () => { expect(apiMode).toBe("mock"); }); + it("scopes mock fleet data to the viewer wallet pubkey", async () => { + const stranger = "Stranger11111111111111111111111111111111"; + expect(await fetchPolicies(stranger)).toHaveLength(0); + await expect(fetchPolicy(POLICIES[0].pubkey, stranger)).rejects.toThrow("Policy not found"); + const summary = await fetchFleetSummary(stranger); + expect(summary.activeAgents).toBe(0); + expect((await fetchIncidents(undefined, undefined, 50, stranger)).items).toHaveLength(0); + }); + it("returns policies sorted by most recently updated", async () => { - const policies = await fetchPolicies(); + const policies = await fetchPolicies(MOCK_DEMO_OWNER_WALLET); expect(policies).toHaveLength(POLICIES.length); for (let index = 1; index < policies.length; index += 1) { @@ -52,12 +63,12 @@ describe("api client mock data", () => { const txns = await fetchTransactions(undefined, undefined, 0); expect(txns.items.length).toBeGreaterThan(0); - const incidents = await fetchIncidents(undefined, undefined, -10); + const incidents = await fetchIncidents(undefined, undefined, -10, MOCK_DEMO_OWNER_WALLET); expect(incidents.items.length).toBeGreaterThan(0); }); it("returns incident detail and rejects unknown incident ids", async () => { - const incident = await fetchIncident(INCIDENTS[0].id); + const incident = await fetchIncident(INCIDENTS[0].id, MOCK_DEMO_OWNER_WALLET); expect(incident.id).toBe(INCIDENTS[0].id); expect(incident.policy.pubkey).toBe(INCIDENTS[0].policyPubkey); expect(Array.isArray(incident.judgeVerdict?.signals ?? [])).toBe(true); @@ -65,11 +76,27 @@ describe("api client mock data", () => { await expect(fetchIncident("does-not-exist")).rejects.toThrow("Incident not found"); }); + it("returns fleet summary and spend trackers in mock mode", async () => { + const summary = await fetchFleetSummary(MOCK_DEMO_OWNER_WALLET); + expect(summary.totalLamportsSpent24h).toMatch(/^\d+$/); + expect(summary.incidentsLast24h).toBeGreaterThanOrEqual(0); + + const trackers = await fetchSpendTrackers(MOCK_DEMO_OWNER_WALLET); + expect(trackers.length).toBe(POLICIES.length); + expect(trackers[0]).toMatchObject({ + policyPubkey: expect.any(String), + lamportsSpent24h: expect.any(String), + policy: { + dailyBudgetLamports: expect.any(String), + }, + }); + }); + it("supports incident pagination", async () => { - const firstPage = await fetchIncidents(undefined, undefined, 1); + const firstPage = await fetchIncidents(undefined, undefined, 1, MOCK_DEMO_OWNER_WALLET); expect(firstPage.items).toHaveLength(1); if (firstPage.nextCursor) { - const secondPage = await fetchIncidents(undefined, firstPage.nextCursor, 1); + const secondPage = await fetchIncidents(undefined, firstPage.nextCursor, 1, MOCK_DEMO_OWNER_WALLET); expect(secondPage.items[0]?.id).not.toEqual(firstPage.items[0].id); } }); diff --git a/dashboard/__tests__/query-keys.test.ts b/dashboard/__tests__/query-keys.test.ts index c54052e..20c5193 100644 --- a/dashboard/__tests__/query-keys.test.ts +++ b/dashboard/__tests__/query-keys.test.ts @@ -3,15 +3,24 @@ import { queryKeys } from "@/lib/api/query-keys"; describe("query keys", () => { it("builds canonical dashboard query keys", () => { - expect(queryKeys.policies()).toEqual(["policies"]); + expect(queryKeys.policies("W1")).toEqual(["policies", "W1"]); + expect(queryKeys.policies(undefined)).toEqual(["policies", ""]); expect(queryKeys.policy("abc")).toEqual(["policy", "abc"]); expect(queryKeys.transactions()).toEqual(["transactions"]); expect(queryKeys.transactionsByPolicy("policy-1")).toEqual(["transactions", "policy-1"]); expect(queryKeys.transactionsInfinite(undefined, 50)).toEqual(["transactions", "infinite", "all", 50]); expect(queryKeys.transactionsInfinite("abc", 25)).toEqual(["transactions", "infinite", "abc", 25]); - expect(queryKeys.incidents()).toEqual(["incidents"]); + expect(queryKeys.incidents("W1")).toEqual(["incidents", "W1"]); expect(queryKeys.incidentsByPolicy("policy-1")).toEqual(["incidents", "policy-1"]); expect(queryKeys.incident("incident-1")).toEqual(["incident", "incident-1"]); + expect(queryKeys.fleetSummary("W1")).toEqual(["fleet", "summary", "W1"]); + expect(queryKeys.spendTrackers("W1")).toEqual(["spend-trackers", "W1"]); + expect(queryKeys.transactionBySig("sig1")).toEqual(["transactions", "detail", "sig1"]); + expect(queryKeys.webhookStatus()).toEqual(["settings", "webhook-status"]); + expect(queryKeys.operatorSession()).toEqual(["session"]); + expect(queryKeys.llmSettings()).toEqual(["settings", "llm"]); + expect(queryKeys.auditLog({})).toEqual(["audit", "all", "", "", ""]); + expect(queryKeys.escalation("e1")).toEqual(["escalation", "e1"]); }); it("keeps backward compatible alias for policy key", () => { diff --git a/dashboard/__tests__/routes-smoke.test.tsx b/dashboard/__tests__/routes-smoke.test.tsx index 470c7a5..f4249a7 100644 --- a/dashboard/__tests__/routes-smoke.test.tsx +++ b/dashboard/__tests__/routes-smoke.test.tsx @@ -114,7 +114,7 @@ describe("phase 1 route smoke tests", () => { it("renders landing and agents routes", async () => { const Home = (await import("@/app/page")).default; render(createElement(Home)); - expect(screen.getByText("Agent Guardrails")).toBeTruthy(); + expect(screen.getByText("Guardrails")).toBeTruthy(); cleanup(); const AgentsPage = (await import("@/app/agents/page")).default; diff --git a/dashboard/__tests__/sse-cache-updaters.test.ts b/dashboard/__tests__/sse-cache-updaters.test.ts index 66aef23..0833979 100644 --- a/dashboard/__tests__/sse-cache-updaters.test.ts +++ b/dashboard/__tests__/sse-cache-updaters.test.ts @@ -194,7 +194,8 @@ describe("applyVerdictEvent", () => { }); describe("applyAgentPausedEvent", () => { - const incidentsListKey = [...queryKeys.incidents(), 50] as const; + const viewer = "demo-viewer"; + const incidentsListKey = [...queryKeys.incidents(viewer), 50] as const; const incidentsPolicyKey = [...queryKeys.incidentsByPolicy("P1"), 50] as const; it("prepends incident and marks policy inactive in caches", () => { @@ -217,7 +218,7 @@ describe("applyAgentPausedEvent", () => { createdAt: "2026-01-01T00:00:00.000Z", updatedAt: "2026-01-01T00:00:00.000Z", }; - qc.setQueryData(queryKeys.policies(), [policy]); + qc.setQueryData(queryKeys.policies(viewer), [policy]); qc.setQueryData(queryKeys.policy("P1"), policy); const detail: IncidentDetail = { @@ -251,7 +252,7 @@ describe("applyAgentPausedEvent", () => { createdAt: "2026-04-02T00:00:01.000Z", }); - const policies = qc.getQueryData(queryKeys.policies()); + const policies = qc.getQueryData(queryKeys.policies(viewer)); expect(policies?.[0]?.isActive).toBe(false); const one = qc.getQueryData(queryKeys.policy("P1")); expect(one?.isActive).toBe(false); @@ -261,7 +262,8 @@ describe("applyAgentPausedEvent", () => { }); describe("applyReportReadyEvent", () => { - const incidentsListKey = [...queryKeys.incidents(), 50] as const; + const viewer = "demo-viewer"; + const incidentsListKey = [...queryKeys.incidents(viewer), 50] as const; it("patches fullReport on list and detail caches", () => { const qc = new QueryClient(); diff --git a/dashboard/app/activity/activity-view.tsx b/dashboard/app/activity/activity-view.tsx index f59485f..ed18d1e 100644 --- a/dashboard/app/activity/activity-view.tsx +++ b/dashboard/app/activity/activity-view.tsx @@ -1,7 +1,11 @@ "use client"; import { AppShell, TransactionRow } from "@/components/dashboard-ui"; -import { QueryEmpty, QueryError, QueryLoading } from "@/components/query-states"; +import { EmptyState } from "@/components/EmptyState"; +import { QueryError } from "@/components/query-states"; +import { ActivityViewSkeleton } from "@/components/skeletons"; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; +import { Activity } from "lucide-react"; import { getErrorMessage } from "@/lib/api/client"; import { useInfiniteTransactionsQuery } from "@/lib/api/use-infinite-transactions-query"; import { usePoliciesQuery } from "@/lib/api/use-policies-query"; @@ -16,7 +20,7 @@ export function ActivityView() { if (transactionsQuery.isLoading) { return ( - + ); } @@ -48,31 +52,40 @@ export function ActivityView() {

) : null} -
- - +
+
+
+

Policy

+ +
+ +
+

Verdict

+ +
+

@@ -87,10 +100,13 @@ export function ActivityView() { ))}

) : ( - +
+ +
)} {transactionsQuery.hasNextPage ? ( diff --git a/dashboard/app/agents/[pubkey]/agent-detail-view.tsx b/dashboard/app/agents/[pubkey]/agent-detail-view.tsx index 7ee2dd2..7c4f8b1 100644 --- a/dashboard/app/agents/[pubkey]/agent-detail-view.tsx +++ b/dashboard/app/agents/[pubkey]/agent-detail-view.tsx @@ -1,34 +1,67 @@ "use client"; import Link from "next/link"; -import { AppShell, IncidentTable, Metric, SpendGauge, TransactionRow } from "@/components/dashboard-ui"; +import { ChevronLeft } from "lucide-react"; +import { + AnomalyRiskLabel, + anomalyBarClass, + AppShell, + IncidentTable, + Metric, + SpendGauge, + TransactionRow, +} from "@/components/dashboard-ui"; import { ClosePolicyButton } from "@/components/close-policy-button"; import { FundAgentButton } from "@/components/fund-agent-button"; import { KillSwitchButton } from "@/components/kill-switch-button"; import { RotateAgentKeyButton } from "@/components/rotate-agent-key-button"; -import { QueryEmpty, QueryError, QueryLoading } from "@/components/query-states"; +import { QueryEmpty, QueryError } from "@/components/query-states"; +import { AgentDetailSkeleton, IncidentsViewSkeleton } from "@/components/skeletons"; import { useInfiniteTransactionsQuery } from "@/lib/api/use-infinite-transactions-query"; import { useIncidentsQuery } from "@/lib/api/use-incidents-query"; import { useEscalationsQuery } from "@/lib/api/use-escalations-query"; import { usePolicyQuery } from "@/lib/api/use-policy-query"; +import { useAllSpendTrackersQuery } from "@/lib/api/use-spend-trackers-query"; +import { formatSol } from "@/lib/utils"; + +function BackToAgentsLink() { + return ( + + + Back to agents + + ); +} export function AgentDetailView({ pubkey }: { pubkey: string }) { const policyQuery = usePolicyQuery(pubkey); const transactionsQuery = useInfiniteTransactionsQuery(pubkey, 10); const incidentsQuery = useIncidentsQuery(pubkey, 10); const escalationsQuery = useEscalationsQuery(pubkey); + const spendTrackersQuery = useAllSpendTrackersQuery(); if (policyQuery.isLoading) { return ( - - + } + > + ); } if (policyQuery.isError || !policyQuery.data) { return ( - + } + > row.policyPubkey === policy.pubkey); const transactions = transactionsQuery.data?.items ?? []; const incidents = incidentsQuery.data?.items ?? []; const shortenedPolicyPubkey = @@ -48,12 +82,28 @@ export function AgentDetailView({ pubkey }: { pubkey: string }) { } >
+
+
+ Anomaly +
+ {policy.anomalyScore}/100 + +
+
+
+
+
+
@@ -87,18 +137,46 @@ export function AgentDetailView({ pubkey }: { pubkey: string }) { ); })() : null} -
+
Daily spend
- +
+
+ +
+
+
+

24h Transactions

+

{spendTracker?.txnCount24h ?? 0}

+
+
+

1h Spend

+

{formatSol(spendTracker?.lamportsSpent1h ?? "0")}

+
+
+

Budget remaining

+

+ {formatSol( + BigInt(policy.dailyBudgetLamports ?? "0") - + BigInt(spendTracker?.lamportsSpent24h ?? policy.dailySpentLamports ?? "0"), + )} +

+
+
+
Recent transactions
{transactionsQuery.isLoading ? ( - +
+ {Array.from({ length: 3 }).map((_, idx) => ( +
+ ))} +
) : transactionsQuery.isError ? (
Related incidents
{incidentsQuery.isLoading ? ( - + ) : incidentsQuery.isError ? ( void incidentsQuery.refetch()} /> ) : ( diff --git a/dashboard/app/agents/[pubkey]/proposals/proposals-view.tsx b/dashboard/app/agents/[pubkey]/proposals/proposals-view.tsx index eb73872..9b628fa 100644 --- a/dashboard/app/agents/[pubkey]/proposals/proposals-view.tsx +++ b/dashboard/app/agents/[pubkey]/proposals/proposals-view.tsx @@ -2,7 +2,8 @@ import { useQueryClient } from "@tanstack/react-query"; import { AppShell } from "@/components/dashboard-ui"; -import { QueryLoading, QueryError, QueryEmpty } from "@/components/query-states"; +import { QueryError, QueryEmpty } from "@/components/query-states"; +import { ProposalsViewSkeleton } from "@/components/skeletons"; import { ProposalCard } from "@/components/proposal-card"; import { usePolicyQuery } from "@/lib/api/use-policy-query"; import { useEscalationsQuery } from "@/lib/api/use-escalations-query"; @@ -33,7 +34,7 @@ export function ProposalsView({ pubkey }: { pubkey: string }) { subtitle={`Squads multisig escalation proposals for ${shortAddress(pubkey)}`} > {escalationsQuery.isLoading ? ( - + ) : escalationsQuery.isError ? ( ) : escalations.length === 0 ? ( diff --git a/dashboard/app/agents/agents-overview.tsx b/dashboard/app/agents/agents-overview.tsx index 5867cf8..f7b872a 100644 --- a/dashboard/app/agents/agents-overview.tsx +++ b/dashboard/app/agents/agents-overview.tsx @@ -1,20 +1,27 @@ "use client"; -import Link from "next/link"; +import { Bot, Plus } from "lucide-react"; +import { EmptyState } from "@/components/EmptyState"; import { PolicyCard } from "@/components/dashboard-ui"; -import { QueryEmpty, QueryError, QueryLoading } from "@/components/query-states"; -import { getErrorMessage } from "@/lib/api/client"; +import { QueryError } from "@/components/query-states"; +import { SkeletonCard } from "@/components/skeletons"; import { usePoliciesQuery } from "@/lib/api/use-policies-query"; import { usePendingLabels } from "@/lib/hooks/use-pending-labels"; -export function AgentsOverview() { +export function AgentsOverview({ onNewAgent }: { onNewAgent?: () => void }) { const { data, isLoading, isError, error, refetch } = usePoliciesQuery(); // Process pending labels from the create-policy wizard usePendingLabels(data); if (isLoading) { - return ; + return ( +
+ {Array.from({ length: 3 }).map((_, idx) => ( + + ))} +
+ ); } if (isError) { @@ -29,18 +36,26 @@ export function AgentsOverview() { if (!data?.length) { return ( - - New policy - - } - /> +
+ + {onNewAgent ? ( +
+ +
+ ) : null} +
); } diff --git a/dashboard/app/agents/agents-page-client.tsx b/dashboard/app/agents/agents-page-client.tsx new file mode 100644 index 0000000..6f055cc --- /dev/null +++ b/dashboard/app/agents/agents-page-client.tsx @@ -0,0 +1,64 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { X } from "lucide-react"; +import { AppShell } from "@/components/dashboard-ui"; +import { CreatePolicyWizard } from "@/components/create-policy-wizard/CreatePolicyWizard"; +import { AgentsOverview } from "@/app/agents/agents-overview"; + +export function AgentsPageClient({ startWithNewAgentOpen }: { startWithNewAgentOpen: boolean }) { + const [isNewAgentOpen, setIsNewAgentOpen] = useState(startWithNewAgentOpen); + + useEffect(() => { + if (startWithNewAgentOpen) { + setIsNewAgentOpen(true); + } + }, [startWithNewAgentOpen]); + + return ( + <> + setIsNewAgentOpen(true)} + className="button button-primary px-3.5 py-2" + > + New Agent + + } + > + setIsNewAgentOpen(true)} /> + + + {isNewAgentOpen ? ( +
+
+ + +
+

Create Policy

+

+ Define program allow-lists, spend limits, and escalation controls. +

+
+ +
+ setIsNewAgentOpen(false)} /> +
+
+
+ ) : null} + + ); +} + diff --git a/dashboard/app/agents/page.tsx b/dashboard/app/agents/page.tsx index 5807a08..f308d54 100644 --- a/dashboard/app/agents/page.tsx +++ b/dashboard/app/agents/page.tsx @@ -1,22 +1,10 @@ -import { AppShell } from "@/components/dashboard-ui"; -import { AgentsOverview } from "@/app/agents/agents-overview"; -import Link from "next/link"; +import { AgentsPageClient } from "@/app/agents/agents-page-client"; -export default function AgentsPage() { - return ( - - New Agent - - )} - > - - - ); +export default function AgentsPage({ + searchParams, +}: { + searchParams?: { new?: string }; +}) { + const startWithNewAgentOpen = searchParams?.new === "1"; + return ; } diff --git a/dashboard/app/audit/audit-view.tsx b/dashboard/app/audit/audit-view.tsx new file mode 100644 index 0000000..3b9f431 --- /dev/null +++ b/dashboard/app/audit/audit-view.tsx @@ -0,0 +1,262 @@ +"use client"; + +import Link from "next/link"; +import { useRouter } from "next/navigation"; +import { useMemo, useState } from "react"; +import type { ReactNode } from "react"; +import { ArrowUpCircle, ClipboardList, RefreshCw, RotateCcw, ShieldCheck, ShieldOff, XCircle } from "lucide-react"; +import { EmptyState } from "@/components/EmptyState"; +import { AppShell } from "@/components/dashboard-ui"; +import { QueryError } from "@/components/query-states"; +import { SkeletonRow } from "@/components/skeletons"; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; +import { useAuditLogQuery } from "@/lib/api/use-audit-log-query"; +import { usePoliciesQuery } from "@/lib/api/use-policies-query"; +import type { AuditActionType, AuditLogFilters } from "@/lib/types/dashboard"; +import { formatRelativeTime, formatRelativeTooltip, shortAddress } from "@/lib/utils"; + +const ACTION_OPTIONS: Array<{ value: string; label: string }> = [ + { value: "all", label: "All actions" }, + { value: "pause", label: "Pause" }, + { value: "resume", label: "Resume" }, + { value: "rotate_key", label: "Rotate key" }, + { value: "close_policy", label: "Close policy" }, + { value: "escalation_created", label: "Escalation created" }, + { value: "escalation_updated", label: "Escalation updated" }, +]; + +const ACTION_ICONS: Record = { + agent_paused: , + pause: , + resume: , + rotate_key: , + policy_closed: , + close_policy: , + escalation_created: , + escalation_updated: , +}; + +export function AuditView() { + const router = useRouter(); + const policiesQuery = usePoliciesQuery(); + const [type, setType] = useState("all"); + const [policyPubkey, setPolicyPubkey] = useState(""); + const [range, setRange] = useState<"24h" | "7d" | "30d" | "all">("24h"); + + const filters: AuditLogFilters = useMemo(() => { + const f: AuditLogFilters = {}; + if (type !== "all") f.type = type; + if (policyPubkey) f.policyPubkey = policyPubkey; + if (range !== "all") { + const now = Date.now(); + const ms = + range === "24h" ? 86_400_000 : range === "7d" ? 7 * 86_400_000 : 30 * 86_400_000; + f.from = new Date(now - ms).toISOString(); + f.to = new Date(now).toISOString(); + } + return f; + }, [type, policyPubkey, range]); + + const auditQ = useAuditLogQuery(filters); + + if (policiesQuery.isLoading) { + return ( + +
+ + + {Array.from({ length: 5 }).map((_, idx) => ( + + ))} + +
+
+
+ ); + } + + if (policiesQuery.isError) { + return ( + + void policiesQuery.refetch()} /> + + ); + } + + return ( + +
+
+
+

Action type

+ +
+ +
+

Policy

+ +
+ +
+

Date range

+ +
+
+
+ + {auditQ.isLoading ? ( +
+ + + {Array.from({ length: 5 }).map((_, idx) => ( + + ))} + +
+
+ ) : auditQ.isError ? ( + void auditQ.refetch()} /> + ) : auditQ.data?.items.length === 0 ? ( +
+ +
+ ) : ( +
+
+ + + + + + + + + + + + + {auditQ.data!.items.map((row) => ( + { + const linkHref = row.relatedIncidentId + ? `/incidents/${row.relatedIncidentId}` + : row.relatedTxnSig + ? `/transactions/${row.relatedTxnSig}` + : row.relatedProposalId + ? `/agents/${row.policyPubkey}/proposals` + : `/agents/${row.policyPubkey}`; + router.push(linkHref); + }} + className="cursor-pointer border-b border-zinc-800/60 transition-colors duration-100 hover:bg-zinc-800/40 last:border-0" + > + + + + + + + + ))} + +
+ Time + + Action + + Policy + + Actor + + Details + + Link +
+ + {formatRelativeTime(row.timestamp)} + + +
+ {ACTION_ICONS[row.actionType] ?? } + {row.actionType.replace(/_/g, " ")} +
+
+ + {row.policyLabel ?? shortAddress(row.policyPubkey, 5)} + + + {shortAddress(row.actor, 6)} + {row.details} + {(() => { + const linkHref = row.relatedIncidentId + ? `/incidents/${row.relatedIncidentId}` + : row.relatedTxnSig + ? `/transactions/${row.relatedTxnSig}` + : row.relatedProposalId + ? `/agents/${row.policyPubkey}/proposals` + : null; + const linkLabel = row.relatedIncidentId + ? "Incident" + : row.relatedTxnSig + ? "Txn" + : row.relatedProposalId + ? "Proposals" + : null; + return linkHref ? ( + + {linkLabel ?? "View"} + + ) : ( + + ); + })()} +
+
+
+ )} +
+ ); +} diff --git a/dashboard/app/audit/page.tsx b/dashboard/app/audit/page.tsx new file mode 100644 index 0000000..4345876 --- /dev/null +++ b/dashboard/app/audit/page.tsx @@ -0,0 +1,5 @@ +import { AuditView } from "@/app/audit/audit-view"; + +export default function AuditPage() { + return ; +} diff --git a/dashboard/app/escalations/[id]/escalation-detail-view.tsx b/dashboard/app/escalations/[id]/escalation-detail-view.tsx new file mode 100644 index 0000000..10c77d1 --- /dev/null +++ b/dashboard/app/escalations/[id]/escalation-detail-view.tsx @@ -0,0 +1,182 @@ +"use client"; + +import Link from "next/link"; +import { AppShell, StatusChip } from "@/components/dashboard-ui"; +import { QueryEmpty, QueryError } from "@/components/query-states"; +import { useEscalationQuery } from "@/lib/api/use-escalation-query"; +import { escalationLabel, escalationTone } from "@/lib/utils/escalation-display"; +import { formatRelativeTime, formatRelativeTooltip, formatSol, programLabel, shortAddress } from "@/lib/utils"; + +export function EscalationDetailView({ id }: { id: string }) { + const query = useEscalationQuery(id); + + if (query.isLoading) { + return ( + +
+
+
+ + ); + } + + if (query.isError) { + return ( + + void query.refetch()} /> + + ); + } + + const esc = query.data; + if (!esc) { + return ( + + + + ); + } + + const txn = esc.txn; + + return ( + + All proposals + + } + > +
+
+
+ {shortAddress(id, 12, 10)} + + Policy{" "} + + {shortAddress(esc.policyPubkey, 8, 6)} + + +
+ {escalationLabel(esc.status)} +
+ +
+

Guarded transaction

+
+
+ Signature +
+ + {txn.txnSig} + +
+
+
+ Recorded +
+ {formatRelativeTime(txn.blockTime)} +
+
+
+ Amount +
+ {txn.amountLamports ? formatSol(txn.amountLamports) : "—"} +
+
+
+ Status +
{txn.status}
+
+
+ {txn.verdict ? ( +
+ AI verdict: {txn.verdict.verdict.toUpperCase()} ( + {txn.verdict.confidence}%) — {txn.verdict.reasoning} +
+ ) : null} +
+ +
+

Squads multisig

+

{esc.squadsMultisig}

+
+
+ Proposal PDA:{" "} + {esc.proposalPda ?? "—"} +
+
+ Transaction index:{" "} + {esc.transactionIndex ?? "—"} +
+
+
+ + {(esc.approvals?.length ?? 0) > 0 || (esc.rejections?.length ?? 0) > 0 ? ( +
+

Votes

+
+ {(esc.approvals ?? []).map((a) => ( + + ✓ {shortAddress(a.member)} + + ))} + {(esc.rejections ?? []).map((r) => ( + + ✗ {shortAddress(r.member)} + + ))} +
+
+ ) : null} + + {esc.executedTxnSig ? ( +
+ Executed on-chain:{" "} + + {esc.executedTxnSig} + +
+ ) : null} + +
+

Reconstructed instruction

+

+ CPI payload used when creating the Squads proposal (decoded server-side). +

+ {esc.instruction ? ( +
+              {JSON.stringify(esc.instruction, null, 2)}
+            
+ ) : ( +

No instruction payload available.

+ )} +
+
+
+ ); +} diff --git a/dashboard/app/escalations/[id]/page.tsx b/dashboard/app/escalations/[id]/page.tsx new file mode 100644 index 0000000..cbc13cf --- /dev/null +++ b/dashboard/app/escalations/[id]/page.tsx @@ -0,0 +1,5 @@ +import { EscalationDetailView } from "@/app/escalations/[id]/escalation-detail-view"; + +export default function EscalationDetailPage({ params }: { params: { id: string } }) { + return ; +} diff --git a/dashboard/app/globals.css b/dashboard/app/globals.css index 7716f27..17a50a8 100644 --- a/dashboard/app/globals.css +++ b/dashboard/app/globals.css @@ -35,6 +35,12 @@ * { @apply border-border outline-ring/50; + scrollbar-width: thin; + scrollbar-color: hsl(var(--teal) / 0.42) hsl(var(--background)); + } + + html { + @apply font-sans; } html, @@ -42,86 +48,56 @@ @apply min-h-full overflow-x-hidden; } + *::-webkit-scrollbar { + width: 9px; + height: 9px; + } + + *::-webkit-scrollbar-corner { + background: hsl(var(--background)); + } + + *::-webkit-scrollbar-track { + background: hsl(var(--background)); + } + + *::-webkit-scrollbar-thumb { + background-color: hsl(var(--teal) / 0.38); + border-radius: 9999px; + border: 2px solid hsl(var(--background)); + } + + *::-webkit-scrollbar-thumb:hover { + background-color: hsl(var(--teal) / 0.58); + } + body { - @apply antialiased bg-background text-foreground; + @apply bg-background text-foreground antialiased; + font-family: + Inter, + -apple-system, + BlinkMacSystemFont, + "Segoe UI", + system-ui, + sans-serif; + font-weight: 400; + line-height: 1.6; background-image: - radial-gradient(circle at 10% -10%, hsl(var(--teal) / 0.16), transparent 45%), - radial-gradient(circle at 100% 0%, hsl(var(--teal) / 0.08), transparent 35%); + radial-gradient( + circle at 10% -10%, + hsl(var(--teal) / 0.16), + transparent 45% + ), + radial-gradient( + circle at 100% 0%, + hsl(var(--teal) / 0.08), + transparent 35% + ); } .theme { --font-heading: var(--font-sans); --font-sans: var(--font-sans); } - :root { - --background: oklch(1 0 0); - --foreground: oklch(0.145 0 0); - --card: oklch(1 0 0); - --card-foreground: oklch(0.145 0 0); - --popover: oklch(1 0 0); - --popover-foreground: oklch(0.145 0 0); - --primary: oklch(0.205 0 0); - --primary-foreground: oklch(0.985 0 0); - --secondary: oklch(0.97 0 0); - --secondary-foreground: oklch(0.205 0 0); - --muted: oklch(0.97 0 0); - --muted-foreground: oklch(0.556 0 0); - --accent: oklch(0.97 0 0); - --accent-foreground: oklch(0.205 0 0); - --destructive: oklch(0.577 0.245 27.325); - --border: oklch(0.922 0 0); - --input: oklch(0.922 0 0); - --ring: oklch(0.708 0 0); - --chart-1: oklch(0.87 0 0); - --chart-2: oklch(0.556 0 0); - --chart-3: oklch(0.439 0 0); - --chart-4: oklch(0.371 0 0); - --chart-5: oklch(0.269 0 0); - --radius: 0.625rem; - --sidebar: oklch(0.985 0 0); - --sidebar-foreground: oklch(0.145 0 0); - --sidebar-primary: oklch(0.205 0 0); - --sidebar-primary-foreground: oklch(0.985 0 0); - --sidebar-accent: oklch(0.97 0 0); - --sidebar-accent-foreground: oklch(0.205 0 0); - --sidebar-border: oklch(0.922 0 0); - --sidebar-ring: oklch(0.708 0 0); - } - .dark { - --background: oklch(0.145 0 0); - --foreground: oklch(0.985 0 0); - --card: oklch(0.205 0 0); - --card-foreground: oklch(0.985 0 0); - --popover: oklch(0.205 0 0); - --popover-foreground: oklch(0.985 0 0); - --primary: oklch(0.922 0 0); - --primary-foreground: oklch(0.205 0 0); - --secondary: oklch(0.269 0 0); - --secondary-foreground: oklch(0.985 0 0); - --muted: oklch(0.269 0 0); - --muted-foreground: oklch(0.708 0 0); - --accent: oklch(0.269 0 0); - --accent-foreground: oklch(0.985 0 0); - --destructive: oklch(0.704 0.191 22.216); - --border: oklch(1 0 0 / 10%); - --input: oklch(1 0 0 / 15%); - --ring: oklch(0.556 0 0); - --chart-1: oklch(0.87 0 0); - --chart-2: oklch(0.556 0 0); - --chart-3: oklch(0.439 0 0); - --chart-4: oklch(0.371 0 0); - --chart-5: oklch(0.269 0 0); - --sidebar: oklch(0.205 0 0); - --sidebar-foreground: oklch(0.985 0 0); - --sidebar-primary: oklch(0.488 0.243 264.376); - --sidebar-primary-foreground: oklch(0.985 0 0); - --sidebar-accent: oklch(0.269 0 0); - --sidebar-accent-foreground: oklch(0.985 0 0); - --sidebar-border: oklch(1 0 0 / 10%); - --sidebar-ring: oklch(0.556 0 0); - } - html { - @apply font-sans; - } .font-brand { font-family: var(--font-brand), var(--font-sans), sans-serif; @@ -165,4 +141,4 @@ opacity: 1; transform: translateY(0); } -} \ No newline at end of file +} diff --git a/dashboard/app/home/fleet-dashboard.tsx b/dashboard/app/home/fleet-dashboard.tsx new file mode 100644 index 0000000..6994f19 --- /dev/null +++ b/dashboard/app/home/fleet-dashboard.tsx @@ -0,0 +1,456 @@ +"use client"; + +import Link from "next/link"; +import { useEffect, useMemo, useRef, useState } from "react"; +import { ShieldCheck } from "lucide-react"; +import { Bar, BarChart, Cell, ResponsiveContainer, Tooltip, XAxis, YAxis } from "recharts"; +import { AnomalyRiskLabel, anomalyBarClass, AppShell, StatusChip } from "@/components/dashboard-ui"; +import { EmptyState } from "@/components/EmptyState"; +import { QueryError } from "@/components/query-states"; +import { IncidentsViewSkeleton, SkeletonStatCard } from "@/components/skeletons"; +import { useFleetSummaryQuery } from "@/lib/api/use-fleet-summary-query"; +import { useAllSpendTrackersQuery } from "@/lib/api/use-spend-trackers-query"; +import { usePoliciesQuery } from "@/lib/api/use-policies-query"; +import { useRecentIncidentsQuery } from "@/lib/api/use-recent-incidents-query"; +import type { IncidentSummary, PolicySummary, SpendTrackerRow } from "@/lib/types/dashboard"; +import { useSSEEventLogStore } from "@/lib/stores/sse-event-log"; +import { + formatRelativeTime, + formatRelativeTooltip, + formatSol, + lamportsToSol, + policyLabel, + shortAddress, +} from "@/lib/utils"; + +function truncateText(text: string, max = 72): string { + if (text.length <= max) return text; + return `${text.slice(0, max - 1)}…`; +} + +function budgetBurnPct(spentLamports: string, budgetLamports: string): number { + const spent = lamportsToSol(spentLamports); + const budget = lamportsToSol(budgetLamports); + if (budget <= 0) return 0; + return (spent / budget) * 100; +} + +function burnBarFill(pct: number): string { + if (pct >= 90) return "hsl(var(--crimson))"; + if (pct >= 70) return "hsl(var(--amber))"; + return "hsl(var(--teal))"; +} + +function agentHealthTone(policy: PolicySummary): "green" | "amber" | "red" { + if (!policy.isActive) return "amber"; + if (policy.anomalyScore >= 61) return "red"; + if (policy.anomalyScore >= 31) return "amber"; + return "green"; +} + +function healthDotClass(tone: "green" | "amber" | "red"): string { + if (tone === "red") return "bg-[hsl(var(--crimson))] shadow-[0_0_10px_hsl(var(--crimson)/0.45)]"; + if (tone === "amber") return "bg-[hsl(var(--amber))] shadow-[0_0_10px_hsl(var(--amber)/0.35)]"; + return "bg-[hsl(var(--teal))] shadow-[0_0_10px_hsl(var(--teal)/0.35)]"; +} + +function sseRowAccent(type: string, payload: unknown): string { + if (type === "agent_paused") return "border-l-amber-500 text-amber-200/95"; + if (type === "new_transaction") return "border-l-teal-500/80 text-teal-100/80"; + if (type === "escalation_created" || type === "escalation_updated") { + return "border-l-purple-500 text-purple-200/95"; + } + if (type === "verdict") { + const o = payload && typeof payload === "object" ? (payload as Record) : null; + const v = o?.verdict != null ? String(o.verdict) : ""; + if (v === "pause") return "border-l-[hsl(var(--crimson))] text-red-200/95"; + } + return "border-l-zinc-600 text-zinc-300/95"; +} + +function FleetStatCard({ + label, + value, + delta, + deltaInverted, +}: { + label: string; + value: string | number; + /** When set (including 0), shows comparison vs prior 24h where applicable */ + delta?: number; + deltaInverted?: boolean; +}) { + const hasComparison = delta !== undefined; + + let deltaTone = "text-teal-400/90"; + if (hasComparison && delta !== 0) { + const worse = deltaInverted ? delta > 0 : delta < 0; + const better = deltaInverted ? delta < 0 : delta > 0; + if (worse) deltaTone = "text-amber-400/95"; + else if (better) deltaTone = "text-teal-400/90"; + } + + const deltaStr = + !hasComparison || delta === 0 + ? null + : `${delta > 0 ? "+" : ""}${delta} vs prior 24h`; + + return ( +
+
{label}
+
{value}
+ {hasComparison ? ( + deltaStr ? ( +
{deltaStr}
+ ) : ( +
Flat vs prior 24h
+ ) + ) : null} +
+ ); +} + +export default function FleetDashboard() { + const fleetQuery = useFleetSummaryQuery(); + const policiesQuery = usePoliciesQuery(); + const spendQuery = useAllSpendTrackersQuery(); + const incidentsQuery = useRecentIncidentsQuery(10); + + const sseEntries = useSSEEventLogStore((s) => s.entries); + const logViewportRef = useRef(null); + const [logPaused, setLogPaused] = useState(false); + + const logLines = useMemo(() => sseEntries.slice(-15), [sseEntries]); + + useEffect(() => { + if (logPaused || !logViewportRef.current) return; + logViewportRef.current.scrollTop = logViewportRef.current.scrollHeight; + }, [logLines, logPaused]); + + const policies = policiesQuery.data ?? []; + const spendRows = spendQuery.data ?? []; + + const trackerByPubkey = useMemo(() => { + const m = new Map(); + for (const row of spendRows) { + m.set(row.policyPubkey, row); + } + return m; + }, [spendRows]); + + const healthRows = useMemo(() => { + return [...policies] + .sort((a, b) => b.anomalyScore - a.anomalyScore) + .map((policy) => ({ + policy, + tracker: trackerByPubkey.get(policy.pubkey) ?? null, + })); + }, [policies, trackerByPubkey]); + + const chartRows = useMemo(() => { + return policies.map((policy) => { + const tracker = trackerByPubkey.get(policy.pubkey); + const spent = tracker?.lamportsSpent24h ?? "0"; + const pct = budgetBurnPct(spent, policy.dailyBudgetLamports); + const labelShort = policy.label ?? shortAddress(policy.pubkey, 4); + return { + name: labelShort.length > 14 ? `${labelShort.slice(0, 12)}…` : labelShort, + pubkey: policy.pubkey, + pctDisplay: Math.min(pct, 100), + pctFull: pct, + spent, + budget: policy.dailyBudgetLamports, + fill: burnBarFill(pct), + }; + }); + }, [policies, trackerByPubkey]); + const chartHeight = Math.max(160, policies.length * 48); + + const incidents = incidentsQuery.data?.items ?? []; + + if (fleetQuery.isLoading || policiesQuery.isLoading) { + return ( + +
+ {Array.from({ length: 4 }).map((_, idx) => ( + + ))} +
+
+ ); + } + + if (fleetQuery.isError || policiesQuery.isError) { + const err = fleetQuery.error ?? policiesQuery.error; + return ( + + { + void fleetQuery.refetch(); + void policiesQuery.refetch(); + void spendQuery.refetch(); + void incidentsQuery.refetch(); + }} + /> + + ); + } + + const summary = fleetQuery.data; + if (!summary) { + return null; + } + + const incidentDelta = summary.incidentsLast24h - summary.incidentsPrev24h; + + return ( + +
+
+ + + + +
+ +
+
+
+
+

+ Recent incidents +

+ + View all + +
+ {incidentsQuery.isLoading ? ( + + ) : incidentsQuery.isError ? ( + void incidentsQuery.refetch()} /> + ) : incidents.length === 0 ? ( +
+ +
+ ) : ( +
+ + + + + + + + + + + {incidents.map((inc: IncidentSummary) => ( + + + + + + + ))} + +
+ Agent + + When + + Reason + + Status +
+ + {inc.policyPubkey.slice(0, 4)}…{inc.policyPubkey.slice(-4)} + + {policyLabel(inc.policyPubkey)} + + + + + {formatRelativeTime(inc.pausedAt)} + + + {truncateText(inc.reason)} + + + {inc.resolvedAt ? "Resolved" : "Open"} + +
+
+ )} +
+ +
+
+

Live events

+ + Hover to pause scroll + +
+
setLogPaused(true)} + onMouseLeave={() => setLogPaused(false)} + > + {logLines.length === 0 ? ( +
+

— waiting for events —

+
+ ) : ( + logLines.map((line) => ( +
+ {new Date(line.receivedAt).toLocaleTimeString()} + {line.type} +
+                        {truncateText(JSON.stringify(line.payload), 280)}
+                      
+
+ )) + )} +
+
+
+ + +
+
+
+ ); +} diff --git a/dashboard/app/home/page.tsx b/dashboard/app/home/page.tsx new file mode 100644 index 0000000..f700b9c --- /dev/null +++ b/dashboard/app/home/page.tsx @@ -0,0 +1,5 @@ +import FleetDashboard from "@/app/home/fleet-dashboard"; + +export default function HomePage() { + return ; +} diff --git a/dashboard/app/incidents/[id]/incident-detail-view.tsx b/dashboard/app/incidents/[id]/incident-detail-view.tsx index e32c588..06b0590 100644 --- a/dashboard/app/incidents/[id]/incident-detail-view.tsx +++ b/dashboard/app/incidents/[id]/incident-detail-view.tsx @@ -3,7 +3,8 @@ import Link from "next/link"; import { AppShell, IncidentTimeline, Metric, StatusChip } from "@/components/dashboard-ui"; import { ReportMarkdown } from "@/components/report-markdown"; -import { QueryError, QueryLoading } from "@/components/query-states"; +import { QueryError } from "@/components/query-states"; +import { IncidentDetailSkeleton } from "@/components/skeletons"; import { useIncidentQuery } from "@/lib/api/use-incident-query"; import { shortAddress } from "@/lib/utils"; @@ -13,7 +14,7 @@ export function IncidentDetailView({ id }: { id: string }) { if (incidentQuery.isLoading) { return ( - + ); } diff --git a/dashboard/app/incidents/incidents-view.tsx b/dashboard/app/incidents/incidents-view.tsx index 4d4ac87..62639b8 100644 --- a/dashboard/app/incidents/incidents-view.tsx +++ b/dashboard/app/incidents/incidents-view.tsx @@ -1,8 +1,11 @@ "use client"; import { AppShell, IncidentTable } from "@/components/dashboard-ui"; -import { QueryEmpty, QueryError, QueryLoading } from "@/components/query-states"; +import { EmptyState } from "@/components/EmptyState"; +import { QueryError } from "@/components/query-states"; +import { IncidentsViewSkeleton } from "@/components/skeletons"; import { useIncidentsQuery } from "@/lib/api/use-incidents-query"; +import { ShieldCheck } from "lucide-react"; export function IncidentsView() { const incidentsQuery = useIncidentsQuery(undefined, 50); @@ -10,7 +13,7 @@ export function IncidentsView() { if (incidentsQuery.isLoading) { return ( - + ); } @@ -30,10 +33,13 @@ export function IncidentsView() { {incidents.length ? ( ) : ( - +
+ +
)} ); diff --git a/dashboard/app/layout.tsx b/dashboard/app/layout.tsx index b66d853..a1c42d3 100644 --- a/dashboard/app/layout.tsx +++ b/dashboard/app/layout.tsx @@ -10,7 +10,7 @@ const inter = Inter({ subsets: ['latin'], variable: '--font-sans' }); const michroma = Michroma({ subsets: ["latin"], weight: "400", variable: "--font-brand" }); export const metadata: Metadata = { - title: "Agent Guardrails Dashboard", + title: "Guardrails Dashboard", icons: { icon: [ { url: "/favicon.ico", sizes: "any" }, diff --git a/dashboard/app/playground/page.tsx b/dashboard/app/playground/page.tsx new file mode 100644 index 0000000..1808306 --- /dev/null +++ b/dashboard/app/playground/page.tsx @@ -0,0 +1,5 @@ +import { PlaygroundView } from "./playground-view"; + +export default function PlaygroundPage() { + return ; +} diff --git a/dashboard/app/playground/playground-view.tsx b/dashboard/app/playground/playground-view.tsx new file mode 100644 index 0000000..11b47c5 --- /dev/null +++ b/dashboard/app/playground/playground-view.tsx @@ -0,0 +1,66 @@ +"use client"; + +import { AppShell } from "@/components/dashboard-ui"; +import { TransactionCrafter } from "@/components/playground/transaction-crafter"; +import { AttackSimulator } from "@/components/playground/attack-simulator"; +import { SignalInspector } from "@/components/playground/signal-inspector"; +import { KillSwitchDemo } from "@/components/playground/kill-switch-demo"; +import { PolicySandbox } from "@/components/playground/policy-sandbox"; +import type { PlaygroundTab } from "@/lib/playground/types"; +import { usePlaygroundStore } from "@/lib/stores/playground"; + +const tabs: { id: PlaygroundTab; label: string }[] = [ + { id: "simulate", label: "Simulate" }, + { id: "inspect", label: "Signal inspector" }, + { id: "learn", label: "Reference" }, +]; + +export function PlaygroundView() { + const activeTab = usePlaygroundStore((s) => s.activeTab); + const setActiveTab = usePlaygroundStore((s) => s.setActiveTab); + + return ( + +
+ {tabs.map((t) => ( + + ))} +
+ + {activeTab === "simulate" ? ( +
+ +
+

+ Attack sequences +

+ +
+
+ ) : null} + {activeTab === "inspect" ? : null} + {activeTab === "learn" ? ( +
+ +
+ +
+
+ ) : null} +
+ ); +} diff --git a/dashboard/app/settings/page.tsx b/dashboard/app/settings/page.tsx new file mode 100644 index 0000000..f3ca557 --- /dev/null +++ b/dashboard/app/settings/page.tsx @@ -0,0 +1,5 @@ +import { SettingsView } from "@/app/settings/settings-view"; + +export default function SettingsPage() { + return ; +} diff --git a/dashboard/app/settings/settings-view.tsx b/dashboard/app/settings/settings-view.tsx new file mode 100644 index 0000000..679fbd3 --- /dev/null +++ b/dashboard/app/settings/settings-view.tsx @@ -0,0 +1,253 @@ +"use client"; + +import { useWallet } from "@solana/wallet-adapter-react"; +import Link from "next/link"; +import { useRouter } from "next/navigation"; +import { Copy } from "lucide-react"; +import { toast } from "sonner"; +import { AppShell } from "@/components/dashboard-ui"; +import { QueryError } from "@/components/query-states"; +import { SkeletonStatCard } from "@/components/skeletons"; +import { + deleteAuthSessions, +} from "@/lib/api/client"; +import { useLlmSettingsQuery } from "@/lib/api/use-llm-settings-query"; +import { useOperatorSessionQuery } from "@/lib/api/use-operator-session-query"; +import { useWebhookStatusQuery } from "@/lib/api/use-webhook-status-query"; +import { clearSiwsAndRedirectHome } from "@/lib/auth/siws-session"; +import { useSiwsAuthStore } from "@/lib/stores/siws-auth"; +import { formatDateTime } from "@/lib/utils"; + +export function SettingsView() { + const router = useRouter(); + const wallet = useWallet(); + const webhookQ = useWebhookStatusQuery(); + const sessionQ = useOperatorSessionQuery(); + const llmQ = useLlmSettingsQuery(); + + const loading = webhookQ.isLoading || sessionQ.isLoading || llmQ.isLoading; + const error = webhookQ.error ?? sessionQ.error ?? llmQ.error; + + const onSignOutSession = () => { + useSiwsAuthStore.getState().clearSignedIn(); + void wallet.disconnect().catch(() => {}); + clearSiwsAndRedirectHome((path) => router.replace(path)); + }; + + const onKillAllSessions = async () => { + try { + await deleteAuthSessions(); + useSiwsAuthStore.getState().clearSignedIn(); + await wallet.disconnect().catch(() => {}); + toast.success("Signed out of all sessions"); + router.replace("/"); + } catch (e) { + toast.error("Could not revoke sessions"); + console.error(e); + } + }; + + const connectedPk = wallet.publicKey?.toBase58() ?? "—"; + + if (loading) { + return ( + +
+ {Array.from({ length: 4 }).map((_, idx) => ( + + ))} +
+
+ ); + } + + if (error) { + return ( + + { + void webhookQ.refetch(); + void sessionQ.refetch(); + void llmQ.refetch(); + }} + /> + + ); + } + + const webhook = webhookQ.data!; + const session = sessionQ.data!; + const llm = llmQ.data!; + + return ( + +
+
+

+ Webhook status +

+
+
+ {webhook.webhookUrl} + +
+
+ + Last webhook:{" "} + + {webhook.lastWebhookReceivedAt ? formatDateTime(webhook.lastWebhookReceivedAt) : "never"} + + + + Events (1h):{" "} + {webhook.eventsReceivedLastHour} + +
+
+ Configure this URL in your Helius dashboard under webhook settings for Enhanced Transactions. +
+
+
+ +
+

Active session

+
+
+
Connected wallet
+
+
+ {connectedPk} + {connectedPk !== "—" ? ( + + ) : null} +
+
+
+
+
JWT wallet
+
+
+ {session.walletPubkey} + +
+
+
+
+
Session expires
+
+ {session.expiresAt ? formatDateTime(session.expiresAt) : "—"} +
+
+
+ +
+ +
+

+ LLM judge configuration +

+

Read-only — server-side configuration.

+
+
+
Fast tier (judge)
+
{llm.judgeModel}
+
+
+
Report model
+
{llm.reportModel}
+
+
+ {llm.fallbackActive ? ( +
+ Rule-based fallback active — no Anthropic API key configured on the server. +
+ ) : ( +
Anthropic API configured — LLM judge enabled.
+ )} +
+ +
+
+ + Coming soon + +
+

+ Notification preferences +

+
    +
  • + Email on agent pause + +
  • +
  • + Email on escalation created + +
  • +
  • + Daily spend summary + +
  • +
+
+ +
+

Danger zone

+

+ Revokes server-side SIWS sessions for your wallet and clears the JWT cookie. +

+ +
+ +

+ Looking for agents? Go to{" "} + + Agents + + . +

+
+
+ ); +} diff --git a/dashboard/app/transactions/[sig]/page.tsx b/dashboard/app/transactions/[sig]/page.tsx new file mode 100644 index 0000000..686a6b8 --- /dev/null +++ b/dashboard/app/transactions/[sig]/page.tsx @@ -0,0 +1,5 @@ +import { TransactionDetailView } from "@/app/transactions/[sig]/transaction-detail-view"; + +export default function TransactionDetailPage({ params }: { params: { sig: string } }) { + return ; +} diff --git a/dashboard/app/transactions/[sig]/transaction-detail-view.tsx b/dashboard/app/transactions/[sig]/transaction-detail-view.tsx new file mode 100644 index 0000000..1d5052a --- /dev/null +++ b/dashboard/app/transactions/[sig]/transaction-detail-view.tsx @@ -0,0 +1,336 @@ +"use client"; + +import Link from "next/link"; +import { useMemo, useState } from "react"; +import { ChevronDown, ChevronRight, ExternalLink } from "lucide-react"; +import { toast } from "sonner"; +import { AppShell, StatusChip } from "@/components/dashboard-ui"; +import { QueryError } from "@/components/query-states"; +import { SkeletonStatCard } from "@/components/skeletons"; +import { useTransactionQuery } from "@/lib/api/use-transaction-query"; +import type { TransactionDetail } from "@/lib/types/dashboard"; +import { + formatDateTime, + formatRelativeTime, + formatRelativeTooltip, + formatSol, + shortAddress, + verdictTone, +} from "@/lib/utils"; + +const EXPLORER_CLUSTER = process.env.NEXT_PUBLIC_SOLANA_CLUSTER ?? "devnet"; + +function explorerTxUrl(sig: string): string { + const q = EXPLORER_CLUSTER === "mainnet-beta" ? "" : `?cluster=${EXPLORER_CLUSTER}`; + return `https://explorer.solana.com/tx/${sig}${q}`; +} + +function CopyBtn({ text, label = "Copy" }: { text: string; label?: string }) { + return ( + + ); +} + +function deriveUiStatus(txn: TransactionDetail): { + label: string; + tone: "green" | "amber" | "red"; +} { + if (txn.status === "escalated") return { label: "Escalated", tone: "amber" }; + if (txn.status === "rejected") return { label: "Rejected", tone: "red" }; + const v = txn.verdict?.verdict; + if (v === "pause") return { label: "Paused", tone: "red" }; + if (v === "flag") return { label: "Flagged", tone: "amber" }; + return { label: "Allowed", tone: "green" }; +} + +function confidenceColor(confidence: number): string { + if (confidence >= 80) return "bg-teal-500"; + if (confidence >= 50) return "bg-amber-500"; + return "bg-red-500"; +} + +export function TransactionDetailView({ sig }: { sig: string }) { + const q = useTransactionQuery(sig); + const [rawOpen, setRawOpen] = useState(false); + + const uiStatus = useMemo(() => { + if (!q.data?.transaction) return null; + return deriveUiStatus(q.data.transaction); + }, [q.data?.transaction]); + + if (q.isLoading) { + return ( + +
+ + +
+
+ ); + } + + if (q.isError || !q.data) { + return ( + + void q.refetch()} /> + + ); + } + + const { transaction: txn, incident, prevTxnSig, nextTxnSig } = q.data; + const verdict = txn.verdict; + const esc = txn.escalation; + const explorerUrl = explorerTxUrl(txn.txnSig); + const lamports = txn.amountLamports ?? "0"; + + return ( + +
+ +
+ +
+
+
+

+ Transaction details +

+
+
+
Target program
+
+ {txn.targetProgram} + +
+
+
+
Amount
+
+ {txn.amountLamports ?? "0"} lamports · {formatSol(lamports)} +
+
+ {txn.destination ? ( +
+
Destination
+
+ {txn.destination} + +
+
+ ) : null} +
+
Policy
+
+ + {shortAddress(txn.policyPubkey, 8)} + +
+
+ {txn.rejectReason ? ( +
+ + Reject reason + +

{txn.rejectReason}

+
+ ) : null} +
+
+ +
+ + {rawOpen ? ( +
+
+ +
+
+                  {JSON.stringify(txn.rawEvent, null, 2)}
+                
+
+ ) : null} +
+
+ +
+ {verdict ? ( +
+

AI verdict

+
+
+ {verdict.verdict.toUpperCase()} + + {verdict.model} · {verdict.latencyMs != null ? `${verdict.latencyMs}ms` : "latency —"} + +
+
+
+ Confidence + {verdict.confidence}% +
+
+
+
+
+
+ {verdict.prefilterSkipped ? ( + + Prefilter skipped + + ) : null} + {(verdict.promptTokens != null || verdict.completionTokens != null) && ( +
+ {verdict.promptTokens != null && ( + + prompt {verdict.promptTokens} tok + + )} + {verdict.completionTokens != null && ( + + completion {verdict.completionTokens} tok + + )} +
+ )} +
+ {verdict.reasoning} +
+
+
+
+ ) : ( +
+ No AI verdict recorded for this transaction. +
+ )} + + {esc ? ( +
+

Escalation

+
+
+ Status + {esc.status} +
+
+ Multisig {shortAddress(esc.squadsMultisig, 8)}{" "} + +
+

+ Approvals {esc.approvals.length} · Rejections {esc.rejections.length} +

+ {esc.proposalPda ? ( +

+ PDA {esc.proposalPda} +

+ ) : null} + + Open proposals → + + + Proposal detail → + +
+
+ ) : null} + + {incident ? ( +
+

+ Related incident +

+

{incident.reason}

+

+ Paused {formatDateTime(incident.pausedAt)} +

+

+ {incident.resolvedAt ? `Resolved ${formatDateTime(incident.resolvedAt)}` : "Open"} +

+ + Incident detail → + +
+ ) : null} +
+
+ + + + ); +} diff --git a/dashboard/components/EmptyState.tsx b/dashboard/components/EmptyState.tsx new file mode 100644 index 0000000..b177211 --- /dev/null +++ b/dashboard/components/EmptyState.tsx @@ -0,0 +1,30 @@ +import Link from "next/link"; +import type { ComponentType } from "react"; + +interface EmptyStateProps { + icon: ComponentType<{ className?: string }>; + title: string; + description?: string; + action?: { label: string; href: string }; +} + +export function EmptyState({ icon: Icon, title, description, action }: EmptyStateProps) { + return ( +
+
+ +
+
+

{title}

+ {description ? ( +

{description}

+ ) : null} +
+ {action ? ( + + {action.label} → + + ) : null} +
+ ); +} diff --git a/dashboard/components/PageErrorBoundary.tsx b/dashboard/components/PageErrorBoundary.tsx new file mode 100644 index 0000000..3cddeb4 --- /dev/null +++ b/dashboard/components/PageErrorBoundary.tsx @@ -0,0 +1,47 @@ +"use client"; + +import { Component, type ReactNode } from "react"; +import { AlertTriangle } from "lucide-react"; + +interface Props { + children: ReactNode; +} + +interface State { + hasError: boolean; + error?: Error; +} + +export class PageErrorBoundary extends Component { + constructor(props: Props) { + super(props); + this.state = { hasError: false }; + } + + static getDerivedStateFromError(error: Error): State { + return { hasError: true, error }; + } + + render() { + if (this.state.hasError) { + return ( +
+
+ +
+
+

Something went wrong

+

{this.state.error?.message}

+
+ +
+ ); + } + return this.props.children; + } +} diff --git a/dashboard/components/auth/require-session.tsx b/dashboard/components/auth/require-session.tsx index 0c20d7d..2e6f3be 100644 --- a/dashboard/components/auth/require-session.tsx +++ b/dashboard/components/auth/require-session.tsx @@ -8,9 +8,15 @@ import { useSiwsAuthStore } from "@/lib/stores/siws-auth"; /** Routes that require wallet connect + SIWS; everything else (e.g. 404) stays reachable. */ function isProtectedDashboardPath(path: string): boolean { return ( + path.startsWith("/home") || path.startsWith("/agents") || path.startsWith("/activity") || - path.startsWith("/incidents") + path.startsWith("/incidents") || + path.startsWith("/transactions") || + path.startsWith("/audit") || + path.startsWith("/escalations") || + path.startsWith("/playground") || + path.startsWith("/settings") ); } diff --git a/dashboard/components/close-policy-button.tsx b/dashboard/components/close-policy-button.tsx index a718d00..3789ad7 100644 --- a/dashboard/components/close-policy-button.tsx +++ b/dashboard/components/close-policy-button.tsx @@ -5,6 +5,7 @@ import { useRouter } from "nextjs-toploader/app"; import { useQueryClient } from "@tanstack/react-query"; import { useWallet } from "@solana/wallet-adapter-react"; import { PublicKey } from "@solana/web3.js"; +import { toast } from "sonner"; import { getErrorMessage } from "@/lib/api/client"; import { queryKeys } from "@/lib/api/query-keys"; import { GuardrailsClient } from "@/lib/sdk/client"; @@ -38,18 +39,22 @@ export function ClosePolicyButton({ policy }: { policy: PolicySummary }) { await client.closePolicy(new PublicKey(policy.pubkey)); queryClient.removeQueries({ queryKey: queryKeys.policy(policy.pubkey) }); - queryClient.invalidateQueries({ queryKey: queryKeys.policies() }); + queryClient.invalidateQueries({ queryKey: ["policies"] }); setOpen(false); + toast.success("Policy closed and refunded."); router.push("/agents"); } catch (e) { const msg = getErrorMessage(e).toLowerCase(); if (msg.includes("already been processed") || msg.includes("already processed")) { queryClient.removeQueries({ queryKey: queryKeys.policy(policy.pubkey) }); - queryClient.invalidateQueries({ queryKey: queryKeys.policies() }); + queryClient.invalidateQueries({ queryKey: ["policies"] }); + toast.success("Policy close was already processed."); router.push("/agents"); } else { - setError(getErrorMessage(e)); + const message = getErrorMessage(e); + setError(message); + toast.error(message); } } finally { setBusy(false); diff --git a/dashboard/components/create-policy-wizard/CreatePolicyWizard.tsx b/dashboard/components/create-policy-wizard/CreatePolicyWizard.tsx index b9dc8b4..7756511 100644 --- a/dashboard/components/create-policy-wizard/CreatePolicyWizard.tsx +++ b/dashboard/components/create-policy-wizard/CreatePolicyWizard.tsx @@ -28,7 +28,7 @@ function isIdempotentCreateError(error: unknown) { ); } -export function CreatePolicyWizard() { +export function CreatePolicyWizard({ onCreated }: { onCreated?: () => void }) { const router = useRouter(); const { publicKey } = useWallet(); const provider = useAnchorProvider(); @@ -101,14 +101,20 @@ export function CreatePolicyWizard() { setAgentKeypair(null); resetWizard(); - router.push("/agents"); + toast.success("Policy created on-chain."); + if (onCreated) { + onCreated(); + router.refresh(); + } else { + router.push("/agents"); + } } catch (e) { publishError(getErrorMessage(e)); } finally { setSubmitting(false); } }, - [programId, provider, publicKey, publishError, resetWizard, router], + [onCreated, programId, provider, publicKey, publishError, resetWizard, router], ); const onCreateClick = () => { diff --git a/dashboard/components/create-policy-wizard/wizard-step-panels.tsx b/dashboard/components/create-policy-wizard/wizard-step-panels.tsx index 6cb6bf8..e619ac2 100644 --- a/dashboard/components/create-policy-wizard/wizard-step-panels.tsx +++ b/dashboard/components/create-policy-wizard/wizard-step-panels.tsx @@ -92,9 +92,9 @@ function ProgramsStep({ fieldErrors }: { fieldErrors: Record }) Choose preset programs or paste custom program IDs. Up to 10 allow-listed programs.

{fieldErrors.allowedPrograms ? ( -

{fieldErrors.allowedPrograms}

+

{fieldErrors.allowedPrograms}

) : null} - {pasteError ?

{pasteError}

: null} + {pasteError ?

{pasteError}

: null}
{Object.entries(PROGRAM_LABELS).map(([pubkey, label]) => { @@ -199,7 +199,7 @@ function LimitsStep({ fieldErrors }: { fieldErrors: Record }) { onBlur={maxTxInput.commitValue} onChange={(e) => maxTxInput.setInputValue(e.target.value)} /> - {fieldErrors.maxTxSol ? {fieldErrors.maxTxSol} : null} + {fieldErrors.maxTxSol ?

{fieldErrors.maxTxSol}

: null}
@@ -255,7 +257,7 @@ function SessionStep({ fieldErrors }: { fieldErrors: Record }) { onBlur={sessionDaysInput.commitValue} onChange={(e) => sessionDaysInput.setInputValue(e.target.value)} /> - {fieldErrors.sessionDays ? {fieldErrors.sessionDays} : null} + {fieldErrors.sessionDays ?

{fieldErrors.sessionDays}

: null}

Expires on {dateStr} (relative to now, ~{sessionDays} days). @@ -330,7 +332,7 @@ function EscalationStep({ fieldErrors }: { fieldErrors: Record }

{multisigMode === "create" ? ( - <> +
{/* Member list */}
@@ -376,7 +378,7 @@ function EscalationStep({ fieldErrors }: { fieldErrors: Record }
{fieldErrors.multisigMembers ? ( - {fieldErrors.multisigMembers} +

{fieldErrors.multisigMembers}

) : null}
@@ -398,10 +400,10 @@ function EscalationStep({ fieldErrors }: { fieldErrors: Record } ))} {fieldErrors.multisigThreshold ? ( - {fieldErrors.multisigThreshold} +

{fieldErrors.multisigThreshold}

) : null} - +
) : ( )} @@ -430,7 +432,7 @@ function EscalationStep({ fieldErrors }: { fieldErrors: Record } onChange={(e) => escalationThresholdInput.setInputValue(e.target.value)} /> {fieldErrors.escalationThresholdSol ? ( - {fieldErrors.escalationThresholdSol} +

{fieldErrors.escalationThresholdSol}

) : null} diff --git a/dashboard/components/dashboard-ui.tsx b/dashboard/components/dashboard-ui.tsx index 108945c..f436475 100644 --- a/dashboard/components/dashboard-ui.tsx +++ b/dashboard/components/dashboard-ui.tsx @@ -1,515 +1,12 @@ "use client"; -import Link from "next/link"; -import Image from "next/image"; -import { usePathname, useRouter } from "next/navigation"; -import { useWallet } from "@solana/wallet-adapter-react"; -import type { LucideIcon } from "lucide-react"; -import { - Activity, - Compass, - Home, - LayoutPanelLeft, - LogOut, - Plus, - TriangleAlert, - Users, -} from "lucide-react"; -import { RadialBar, RadialBarChart, ResponsiveContainer } from "recharts"; -import { useEffect, type ReactNode } from "react"; -import { - effectiveVerdict, - policyLabel, - programLabel, - shortAddress, - formatDateTime, - formatRelativeTime, - lamportsToSol, - verdictTone, -} from "@/lib/utils"; -import type { IncidentSummary, PolicySummary, TransactionSummary } from "@/lib/types/dashboard"; -import { useLayoutStore } from "@/lib/stores/layout"; -import { useSiwsAuthStore } from "@/lib/stores/siws-auth"; -import { ShellNavbarActions } from "./shell-navbar-actions"; - -type NavLink = { - href: string; - label: string; - icon: LucideIcon; - nested?: boolean; -}; - -const navGroups: NavLink[][] = [ - [{ href: "/", label: "Home", icon: Home, nested: false }], - [ - { href: "/agents", label: "Agents", icon: Users }, - { href: "/activity", label: "Activity", icon: Activity }, - { href: "/incidents", label: "Incidents", icon: TriangleAlert }, - ], - [{ href: "/agents/new", label: "New agent", icon: Plus, nested: false }], -]; - -export function AppShell({ - title, - subtitle, - actions, - children, -}: { - title: string; - subtitle?: string; - actions?: ReactNode; - children: ReactNode; -}) { - const pathname = usePathname(); - const router = useRouter(); - const walletAdapter = useWallet(); - const { sidebarOpen, sidebarCollapsed, toggleSidebar, toggleSidebarCollapsed, setSidebarOpen } = - useLayoutStore(); - - if (!walletAdapter.connected) { - return ( -
-
-
- ); - } - - const currentPath = pathname ?? ""; - const isLinkActive = (href: string, nested: boolean | undefined) => { - if (href === "/") { - return currentPath === "/"; - } - if (href === "/agents") { - return ( - currentPath === "/agents" || - (currentPath.startsWith("/agents/") && !currentPath.startsWith("/agents/new")) - ); - } - return currentPath === href || (nested !== false && currentPath.startsWith(`${href}/`)); - }; - - const collapsed = sidebarCollapsed; - const sidebarWidth = collapsed ? "w-[60px]" : "w-60"; - - const renderNavItem = (link: NavLink) => { - const active = isLinkActive(link.href, link.nested); - const Icon = link.icon; - const iconSize = collapsed ? 18 : 16; - return ( - setSidebarOpen(false)} - className={`group relative flex items-center rounded-md text-sm transition-[background,color] duration-150 ${collapsed ? "h-10 w-10 mx-auto justify-center" : "gap-3 px-3 py-2" - } ${active - ? "bg-white/[0.1] text-zinc-50 shadow-[inset_0_0_0_1px_rgba(255,255,255,0.22)]" - : "text-zinc-300 hover:bg-white/[0.06] hover:text-zinc-100" - }`} - > - - {!collapsed ? {link.label} : null} - - ); - }; - - const mainCanvasClass = "flex min-h-0 flex-1 flex-col bg-[#111114] text-foreground"; - const onSignOut = () => { - useSiwsAuthStore.getState().clearSignedIn(); - void walletAdapter.disconnect().catch(() => { - /* wallet may already be disconnected */ - }); - }; - - return ( -
- {/* Mobile backdrop */} - {sidebarOpen ? ( - - -
-
- -
-
- - - {/* ── Main: black top inset (sidebar chroma), then canvas for header + body ── */} -
-
-
-
- {/* Sidebar toggle (desktop = collapse, mobile = open) */} - - - -
- {/*

Agent Guardrails

*/} -

- {title} -

-
- -
- -
-
- -
- {subtitle || actions ? ( -
- {subtitle ? ( -

{subtitle}

- ) : ( - - )} -
{actions}
-
- ) : null} -
{children}
-
-
-
-
- ); -} - -export function StatusChip({ tone, children }: { tone: "green" | "amber" | "red"; children: ReactNode }) { - const toneClasses = { - green: "bg-teal-500/15 text-teal-500 border border-teal-500/30 shadow-teal-500/10", - amber: "bg-amber-500/15 text-amber-500 border border-amber-500/30 shadow-amber-500/10", - red: "bg-crimson-500/15 text-crimson-500 border border-crimson-500/30 shadow-crimson-500/10", - }; - return {children}; -} - -export function PolicyCard({ policy }: { policy: PolicySummary }) { - const spent = lamportsToSol(policy.dailySpentLamports ?? "0"); - const budget = lamportsToSol(policy.dailyBudgetLamports); - const displayBudget = budget > 0 && budget < 1 ? budget.toFixed(2) : budget.toFixed(0); - const spendPct = budget > 0 ? Math.min((spent / budget) * 100, 100) : 0; - const progressTone = spendPct >= 90 ? "bg-crimson-500" : spendPct >= 66 ? "bg-amber-500" : "bg-teal-500"; - const sessionExpired = new Date(policy.sessionExpiry).getTime() < Date.now(); - - return ( - -
-
-
- {policy.label ?? "Unlabeled agent"} -
-
- {shortAddress(policy.pubkey, 6, 6)} -
-
-
- {!policy.isActive ? ( - - PAUSED - - ) : sessionExpired ? ( - - SESSION EXPIRED - - ) : ( - - ACTIVE - - )} - {policy.squadsMultisig ? ( - - SQUADS - - ) : null} -
-
- -
-
- Daily spend - - {spent.toFixed(2)} / {displayBudget} SOL - -
-
-
-
-
- -
-
-
Session
-
{formatRelativeTime(policy.sessionExpiry)}
-
-
-
Per tx cap
-
{lamportsToSol(policy.maxTxLamports)} SOL
-
-
- -
- Programs: {policy.allowedPrograms.slice(0, 3).map(programLabel).join(", ")} - {policy.allowedPrograms.length > 3 ? ` +${policy.allowedPrograms.length - 3}` : ""} -
- - ); -} - -export function Metric({ label, value }: { label: string; value: ReactNode }) { - return ( -
-
{label}
-
{value}
-
- ); -} - -export function SpendGauge({ spentLamports, budgetLamports }: { spentLamports: string; budgetLamports: string }) { - const spent = lamportsToSol(spentLamports); - const budget = lamportsToSol(budgetLamports); - const ratio = budget === 0 ? 0 : (spent / budget) * 100; - const clampedRatio = Math.min(ratio, 100); - const tone = ratio >= 90 ? "hsl(var(--crimson))" : ratio >= 66 ? "hsl(var(--amber))" : "hsl(var(--teal))"; - - if (budget <= 0) { - return ( -
- No budget set. -
- ); - } - - return ( -
- - - - - -
- {ratio > 100 ? ( - <> -
- OVER BUDGET -
-
- {spent.toFixed(1)} / {budget.toFixed(1)} SOL -
- - ) : ( - <> -
{spent.toFixed(1)} SOL
-
of {budget.toFixed(1)} SOL budget
- - )} -
-
- ); -} - -export function TransactionRow({ - transaction, - showAgent = false, -}: { - transaction: TransactionSummary; - showAgent?: boolean; -}) { - const verdict = effectiveVerdict(transaction.verdict?.verdict); - const tone = verdictTone(verdict); - return ( -
-
-
-
- {verdict.toUpperCase()} - {programLabel(transaction.targetProgram)} - {showAgent ? {policyLabel(transaction.policyPubkey)} : null} -
-
- {transaction.verdict?.reasoning ?? "No anomaly reasoning stored for this transaction."} -
-
-
-
- {transaction.amountLamports ? `${lamportsToSol(transaction.amountLamports).toFixed(2)} SOL` : "—"} -
-
{formatRelativeTime(transaction.blockTime)}
-
-
-
- {shortAddress(transaction.txnSig, 10, 8)} - {formatDateTime(transaction.blockTime)} -
-
- ); -} - -export function IncidentTimeline({ - items, -}: { - items: Array<{ time: string; title: string; detail: string; tone: "green" | "amber" | "red" | "blue" }>; -}) { - const toneClasses: Record<"green" | "amber" | "red" | "blue", string> = { - green: "bg-teal-500 shadow-[0_0_0_1px_hsl(var(--teal)),0_0_12px_hsl(var(--teal)/0.45)]", - amber: "bg-amber-500 shadow-[0_0_0_1px_hsl(var(--amber)),0_0_12px_hsl(var(--amber)/0.45)]", - red: "bg-crimson-500 shadow-[0_0_0_1px_hsl(var(--crimson)),0_0_12px_hsl(var(--crimson)/0.45)]", - blue: "bg-primary shadow-[0_0_0_1px_hsl(var(--primary)),0_0_12px_hsl(var(--primary)/0.45)]", - }; - - return ( -
- {items.map((item) => ( -
- -
{item.time}
-
{item.title}
-
{item.detail}
-
- ))} -
- ); -} - -export function IncidentTable({ incidents }: { incidents: IncidentSummary[] }) { - if (!incidents.length) { - return
No incidents yet.
; - } - - return ( -
-
- - - - - - - - - - - {incidents.map((incident) => ( - - - - - - - ))} - -
AgentReasonPaused atStatus
- - {policyLabel(incident.policyPubkey)} - - {incident.reason}{formatDateTime(incident.pausedAt)} - {incident.resolvedAt ? "Resolved" : "Active"} -
-
-
- ); -} +export { AppShell } from "./dashboard-ui/app-shell"; +export { StatusChip } from "./dashboard-ui/status-chip"; +export { PolicyCard } from "./dashboard-ui/policy-card"; +export { Metric } from "./dashboard-ui/metric"; +export { SpendGauge } from "./dashboard-ui/spend-gauge"; +export { TransactionRow } from "./dashboard-ui/transaction-row"; +export { IncidentTimeline } from "./dashboard-ui/incident-timeline"; +export { IncidentTable } from "./dashboard-ui/incident-table"; +export { AnomalyRiskLabel, anomalyBarClass } from "./dashboard-ui/anomaly-risk-label"; diff --git a/dashboard/components/dashboard-ui/anomaly-risk-label.tsx b/dashboard/components/dashboard-ui/anomaly-risk-label.tsx new file mode 100644 index 0000000..cf71c93 --- /dev/null +++ b/dashboard/components/dashboard-ui/anomaly-risk-label.tsx @@ -0,0 +1,19 @@ +export function anomalyTone(score: number): "teal" | "amber" | "red" { + if (score <= 30) return "teal"; + if (score <= 60) return "amber"; + return "red"; +} + +export function anomalyBarClass(score: number): string { + const tone = anomalyTone(score); + if (tone === "teal") return "bg-teal-500"; + if (tone === "amber") return "bg-amber-500"; + return "bg-red-500"; +} + +export function AnomalyRiskLabel({ score }: { score: number }) { + const tone = anomalyTone(score); + if (tone === "teal") return normal; + if (tone === "amber") return elevated; + return critical; +} diff --git a/dashboard/components/dashboard-ui/app-shell.tsx b/dashboard/components/dashboard-ui/app-shell.tsx new file mode 100644 index 0000000..657e9c2 --- /dev/null +++ b/dashboard/components/dashboard-ui/app-shell.tsx @@ -0,0 +1,263 @@ +"use client"; + +import Link from "next/link"; +import Image from "next/image"; +import { usePathname } from "next/navigation"; +import { useWallet } from "@solana/wallet-adapter-react"; +import type { LucideIcon } from "lucide-react"; +import { + Activity, + FlaskConical, + Home, + LayoutPanelLeft, + LogOut, + ScrollText, + Settings, + TriangleAlert, + Users, +} from "lucide-react"; +import type { ReactNode } from "react"; +import { PageErrorBoundary } from "@/components/PageErrorBoundary"; +import { cn } from "@/lib/utils"; +import { useLayoutStore } from "@/lib/stores/layout"; +import { useSiwsAuthStore } from "@/lib/stores/siws-auth"; +import { ShellNavbarActions } from "../shell-navbar-actions"; + +type NavLink = { + href: string; + label: string; + icon: LucideIcon; + nested?: boolean; +}; + +const navGroups: NavLink[][] = [ + [{ href: "/home", label: "Home", icon: Home, nested: false }], + [ + { href: "/agents", label: "Agents", icon: Users }, + { href: "/activity", label: "Activity", icon: Activity }, + { href: "/incidents", label: "Incidents", icon: TriangleAlert }, + ], + [{ href: "/audit", label: "Audit", icon: ScrollText, nested: false }], + [{ href: "/playground", label: "Playground", icon: FlaskConical, nested: false }], + [{ href: "/settings", label: "Settings", icon: Settings, nested: false }], +]; + +export function AppShell({ + title, + subtitle, + actions, + brandedHeader = false, + children, +}: { + title: string; + subtitle?: string; + actions?: ReactNode; + /** When true, shows wordmark logo + Guardrails with `title` as the page subtitle line. */ + brandedHeader?: boolean; + children: ReactNode; +}) { + const pathname = usePathname(); + const walletAdapter = useWallet(); + const { sidebarOpen, sidebarCollapsed, toggleSidebar, toggleSidebarCollapsed, setSidebarOpen } = + useLayoutStore(); + + if (!walletAdapter.connected) { + return ( +
+
+
+ ); + } + + const currentPath = pathname ?? ""; + const isLinkActive = (href: string, nested: boolean | undefined) => { + if (href === "/agents?new=1") { + return currentPath === "/agents"; + } + return currentPath === href || (nested !== false && currentPath.startsWith(`${href}/`)); + }; + + const collapsed = sidebarCollapsed; + const sidebarWidth = collapsed ? "w-[60px]" : "w-60"; + + const renderNavItem = (link: NavLink) => { + const active = isLinkActive(link.href, link.nested); + const Icon = link.icon; + const iconSize = collapsed ? 18 : 16; + return ( + setSidebarOpen(false)} + className={cn( + "group relative flex items-center rounded-md text-sm transition-all duration-100", + collapsed ? "mx-auto h-10 w-10 justify-center" : "gap-2.5 px-3 py-2", + active + ? "bg-zinc-800 text-white font-medium [&_svg]:text-teal-400" + : "text-zinc-400 hover:text-zinc-200 hover:bg-zinc-800/50 [&_svg]:text-zinc-500", + )} + > + + {!collapsed ? {link.label} : null} + + ); + }; + + const onSignOut = () => { + useSiwsAuthStore.getState().clearSignedIn(); + void walletAdapter.disconnect().catch(() => { + /* wallet may already be disconnected */ + }); + }; + + return ( +
+ {sidebarOpen ? ( + +
+ {/*
+ +
*/} +
+ + +
+
+
+ + + +
+ {/* {brandedHeader ? ( +

+ + + + Guardrails + + + {title} + + +

+ ) : ( */} +

+ {title} +

+ {/* )} */} +
+ +
+ +
+
+ +
+ {subtitle || actions ? ( +
+ {subtitle ? ( +

{subtitle}

+ ) : ( + + )} +
{actions}
+
+ ) : null} + +
{children}
+
+
+
+
+
+ ); +} diff --git a/dashboard/components/dashboard-ui/incident-table.tsx b/dashboard/components/dashboard-ui/incident-table.tsx new file mode 100644 index 0000000..8d7a993 --- /dev/null +++ b/dashboard/components/dashboard-ui/incident-table.tsx @@ -0,0 +1,51 @@ +"use client"; + +import Link from "next/link"; +import { useRouter } from "next/navigation"; +import { formatDateTime, policyLabel } from "@/lib/utils"; +import type { IncidentSummary } from "@/lib/types/dashboard"; +import { StatusChip } from "./status-chip"; + +export function IncidentTable({ incidents }: { incidents: IncidentSummary[] }) { + const router = useRouter(); + if (!incidents.length) { + return
No incidents yet.
; + } + + return ( +
+
+ + + + + + + + + + + {incidents.map((incident) => ( + router.push(`/incidents/${incident.id}`)} + className="cursor-pointer border-b border-zinc-800/60 transition-colors duration-100 hover:bg-zinc-800/40 last:border-0" + > + + + + + + ))} + +
AgentReasonPaused atStatus
+ + {policyLabel(incident.policyPubkey)} + + {incident.reason}{formatDateTime(incident.pausedAt)} + {incident.resolvedAt ? "Resolved" : "Active"} +
+
+
+ ); +} diff --git a/dashboard/components/dashboard-ui/incident-timeline.tsx b/dashboard/components/dashboard-ui/incident-timeline.tsx new file mode 100644 index 0000000..f1e4613 --- /dev/null +++ b/dashboard/components/dashboard-ui/incident-timeline.tsx @@ -0,0 +1,25 @@ +export function IncidentTimeline({ + items, +}: { + items: Array<{ time: string; title: string; detail: string; tone: "green" | "amber" | "red" | "blue" }>; +}) { + const toneClasses: Record<"green" | "amber" | "red" | "blue", string> = { + green: "bg-teal-500 shadow-[0_0_0_1px_hsl(var(--teal)),0_0_12px_hsl(var(--teal)/0.45)]", + amber: "bg-amber-500 shadow-[0_0_0_1px_hsl(var(--amber)),0_0_12px_hsl(var(--amber)/0.45)]", + red: "bg-crimson-500 shadow-[0_0_0_1px_hsl(var(--crimson)),0_0_12px_hsl(var(--crimson)/0.45)]", + blue: "bg-primary shadow-[0_0_0_1px_hsl(var(--primary)),0_0_12px_hsl(var(--primary)/0.45)]", + }; + + return ( +
+ {items.map((item) => ( +
+ +
{item.time}
+
{item.title}
+
{item.detail}
+
+ ))} +
+ ); +} diff --git a/dashboard/components/dashboard-ui/metric.tsx b/dashboard/components/dashboard-ui/metric.tsx new file mode 100644 index 0000000..93773c2 --- /dev/null +++ b/dashboard/components/dashboard-ui/metric.tsx @@ -0,0 +1,10 @@ +import type { ReactNode } from "react"; + +export function Metric({ label, value }: { label: string; value: ReactNode }) { + return ( +
+
{label}
+
{value}
+
+ ); +} diff --git a/dashboard/components/dashboard-ui/policy-card.tsx b/dashboard/components/dashboard-ui/policy-card.tsx new file mode 100644 index 0000000..566877f --- /dev/null +++ b/dashboard/components/dashboard-ui/policy-card.tsx @@ -0,0 +1,90 @@ +import Link from "next/link"; +import { + formatRelativeTime, + formatRelativeTooltip, + formatSol, + lamportsToSol, + programLabel, + shortAddress, +} from "@/lib/utils"; +import type { PolicySummary } from "@/lib/types/dashboard"; + +export function PolicyCard({ policy }: { policy: PolicySummary }) { + const MAX_VISIBLE = 3; + const visiblePrograms = policy.allowedPrograms.slice(0, MAX_VISIBLE); + const overflow = policy.allowedPrograms.length - MAX_VISIBLE; + const spent = lamportsToSol(policy.dailySpentLamports ?? "0"); + const budget = lamportsToSol(policy.dailyBudgetLamports); + const spendPct = budget > 0 ? Math.min((spent / budget) * 100, 100) : 0; + const progressTone = spendPct >= 90 ? "bg-crimson-500" : spendPct >= 66 ? "bg-amber-500" : "bg-teal-500"; + const sessionExpired = new Date(policy.sessionExpiry).getTime() < Date.now(); + + return ( + +
+
+
+ {policy.label ?? "Unlabeled agent"} +
+
+ {shortAddress(policy.pubkey, 6, 6)} +
+
+
+ {!policy.isActive ? ( + + PAUSED + + ) : sessionExpired ? ( + + SESSION EXPIRED + + ) : ( + + ACTIVE + + )} + {policy.squadsMultisig ? ( + + SQUADS + + ) : null} +
+
+ +
+
+ Daily spend + + {formatSol(policy.dailySpentLamports ?? "0")}{" "} + / {formatSol(policy.dailyBudgetLamports)} + +
+
+
+
+
+ +
+
+
Session
+
+ {formatRelativeTime(policy.sessionExpiry)} +
+
+
+
Per tx cap
+
{formatSol(policy.maxTxLamports)}
+
+
+ +

+ Programs: {visiblePrograms.map((p) => programLabel(p)).join(", ")} + {overflow > 0 && +{overflow} more} +

+ + ); +} diff --git a/dashboard/components/dashboard-ui/spend-gauge.tsx b/dashboard/components/dashboard-ui/spend-gauge.tsx new file mode 100644 index 0000000..ee1e8f1 --- /dev/null +++ b/dashboard/components/dashboard-ui/spend-gauge.tsx @@ -0,0 +1,60 @@ +import { RadialBar, RadialBarChart, ResponsiveContainer } from "recharts"; +import { lamportsToSol } from "@/lib/utils"; + +export function SpendGauge({ + spentLamports, + budgetLamports, + size = 220, +}: { + spentLamports: string; + budgetLamports: string; + size?: number; +}) { + const spent = lamportsToSol(spentLamports); + const budget = lamportsToSol(budgetLamports); + const ratio = budget === 0 ? 0 : (spent / budget) * 100; + const clampedRatio = Math.min(ratio, 100); + const tone = ratio >= 90 ? "hsl(var(--crimson))" : ratio >= 66 ? "hsl(var(--amber))" : "hsl(var(--teal))"; + + if (budget <= 0) { + return ( +
+ No budget set. +
+ ); + } + + return ( +
+ + + + + +
+ {ratio > 100 ? ( + <> +
+ OVER BUDGET +
+
+ {spent.toFixed(1)} / {budget.toFixed(1)} SOL +
+ + ) : ( + <> +
{spent.toFixed(1)} SOL
+
of {budget.toFixed(1)} SOL budget
+ + )} +
+
+ ); +} diff --git a/dashboard/components/dashboard-ui/status-chip.tsx b/dashboard/components/dashboard-ui/status-chip.tsx new file mode 100644 index 0000000..0ddb2a4 --- /dev/null +++ b/dashboard/components/dashboard-ui/status-chip.tsx @@ -0,0 +1,10 @@ +import type { ReactNode } from "react"; + +export function StatusChip({ tone, children }: { tone: "green" | "amber" | "red"; children: ReactNode }) { + const toneClasses = { + green: "bg-teal-500/15 text-teal-400 border border-teal-500/30 shadow-teal-500/10", + amber: "bg-amber-500/15 text-amber-400 border border-amber-500/30 shadow-amber-500/10", + red: "bg-red-500/15 text-red-400 border border-red-500/30 shadow-red-500/10", + }; + return {children}; +} diff --git a/dashboard/components/dashboard-ui/transaction-row.tsx b/dashboard/components/dashboard-ui/transaction-row.tsx new file mode 100644 index 0000000..3c3f309 --- /dev/null +++ b/dashboard/components/dashboard-ui/transaction-row.tsx @@ -0,0 +1,56 @@ +import Link from "next/link"; +import { + effectiveVerdict, + formatDateTime, + formatRelativeTime, + formatRelativeTooltip, + formatSol, + policyLabel, + programLabel, + shortAddress, + verdictTone, +} from "@/lib/utils"; +import type { TransactionSummary } from "@/lib/types/dashboard"; +import { StatusChip } from "./status-chip"; + +export function TransactionRow({ + transaction, + showAgent = false, +}: { + transaction: TransactionSummary; + showAgent?: boolean; +}) { + const verdict = effectiveVerdict(transaction.verdict?.verdict); + const tone = verdictTone(verdict); + return ( + +
+
+
+ {verdict.toUpperCase()} + {programLabel(transaction.targetProgram)} + {showAgent ? {policyLabel(transaction.policyPubkey)} : null} +
+
+ {transaction.verdict?.reasoning ?? "No anomaly reasoning stored for this transaction."} +
+
+
+
+ {transaction.amountLamports ? formatSol(transaction.amountLamports) : "—"} +
+
+ {formatRelativeTime(transaction.blockTime)} +
+
+
+
+ {shortAddress(transaction.txnSig, 10, 8)} + {formatDateTime(transaction.blockTime)} +
+ + ); +} diff --git a/dashboard/components/edit-policy-form.tsx b/dashboard/components/edit-policy-form.tsx index 7ff0571..05ac30a 100644 --- a/dashboard/components/edit-policy-form.tsx +++ b/dashboard/components/edit-policy-form.tsx @@ -8,6 +8,7 @@ import { toast } from "sonner"; import { getErrorMessage } from "@/lib/api/client"; import { queryKeys } from "@/lib/api/query-keys"; import { usePolicyQuery } from "@/lib/api/use-policy-query"; +import { EditPolicyFormSkeleton } from "@/components/skeletons"; import { buildUpdatePolicyFullReplace } from "@/lib/create-policy/build-update-args"; import { permissionPolicyToSummary } from "@/lib/create-policy/map-permission-policy"; import { policySummaryToDraft } from "@/lib/create-policy/policy-to-draft"; @@ -71,11 +72,7 @@ export function EditPolicyForm({ policyPubkey }: { policyPubkey: string }) { const walletReady = Boolean(publicKey && provider && programId); if (policyQuery.isLoading) { - return ( -
- Loading policy… -
- ); + return ; } if (policyQuery.isError || !policy) { @@ -88,11 +85,7 @@ export function EditPolicyForm({ policyPubkey }: { policyPubkey: string }) { } if (!draft) { - return ( -
- Preparing form… -
- ); + return ; } const updateDraft = (partial: Partial) => { @@ -136,7 +129,7 @@ export function EditPolicyForm({ policyPubkey }: { policyPubkey: string }) { }); queryClient.setQueryData(queryKeys.policy(policyPubkey), summary); - queryClient.setQueryData(queryKeys.policies(), (old: PolicySummary[] | undefined) => { + queryClient.setQueriesData({ queryKey: ["policies"] }, (old: PolicySummary[] | undefined) => { if (!old?.length) return [summary]; let found = false; const next = old.map((row) => { diff --git a/dashboard/components/fund-agent-button.tsx b/dashboard/components/fund-agent-button.tsx index 30bac9a..1bfae5c 100644 --- a/dashboard/components/fund-agent-button.tsx +++ b/dashboard/components/fund-agent-button.tsx @@ -8,6 +8,7 @@ import { SystemProgram, Transaction, } from "@solana/web3.js"; +import { toast } from "sonner"; import { getErrorMessage } from "@/lib/api/client"; import type { PolicySummary } from "@/lib/types/dashboard"; @@ -44,14 +45,18 @@ export function FundAgentButton({ policy }: { policy: PolicySummary }) { const sig = await sendTransaction(tx, connection); await connection.confirmTransaction(sig, "confirmed"); setBanner(`Funded ${parsedAmount} SOL to policy PDA.`); + toast.success(`Funded ${parsedAmount} SOL.`); setOpen(false); } catch (e) { const msg = getErrorMessage(e).toLowerCase(); if (msg.includes("already been processed") || msg.includes("already processed")) { setBanner(`Funded ${parsedAmount} SOL to policy PDA.`); + toast.success(`Funding transaction already processed (${parsedAmount} SOL).`); setOpen(false); } else { - setError(getErrorMessage(e)); + const message = getErrorMessage(e); + setError(message); + toast.error(message); } } finally { setBusy(false); diff --git a/dashboard/components/kill-switch-button.tsx b/dashboard/components/kill-switch-button.tsx index 4448214..89b94c5 100644 --- a/dashboard/components/kill-switch-button.tsx +++ b/dashboard/components/kill-switch-button.tsx @@ -38,7 +38,7 @@ export function KillSwitchButton({ policy }: { policy: PolicySummary }) { queryClient.setQueryData(queryKeys.policy(policy.pubkey), (prev: PolicySummary | undefined) => prev ? { ...prev, isActive, updatedAt: now } : prev, ); - queryClient.setQueryData(queryKeys.policies(), (old: PolicySummary[] | undefined) => { + queryClient.setQueriesData({ queryKey: ["policies"] }, (old: PolicySummary[] | undefined) => { if (!old) return old; return old.map((row) => row.pubkey === policy.pubkey ? { ...row, isActive, updatedAt: now } : row, diff --git a/dashboard/components/landing-auth-screen.tsx b/dashboard/components/landing-auth-screen.tsx index cdc77c8..6ef6653 100644 --- a/dashboard/components/landing-auth-screen.tsx +++ b/dashboard/components/landing-auth-screen.tsx @@ -1,5 +1,6 @@ "use client"; +import Image from "next/image"; import { useWallet } from "@solana/wallet-adapter-react"; import { useWalletModal } from "@solana/wallet-adapter-react-ui"; import { ChevronLeft, PenLine, Wallet } from "lucide-react"; @@ -24,11 +25,18 @@ function uint8ArrayToBase64(bytes: Uint8Array): string { function BrandMark() { return ( -
- - +
+ Guardrails logo + + Guardrails - Agent Guardrails
); } diff --git a/dashboard/components/playground/attack-simulator.tsx b/dashboard/components/playground/attack-simulator.tsx new file mode 100644 index 0000000..9c8cd0c --- /dev/null +++ b/dashboard/components/playground/attack-simulator.tsx @@ -0,0 +1,180 @@ +"use client"; + +import { useEffect, useMemo, useRef, useState } from "react"; +import { POLICIES } from "@/lib/mock/policies"; +import { mergeScenarioStep, SCENARIOS } from "@/lib/playground/scenarios"; +import { runSimulation } from "@/lib/playground/engine"; +import type { CrafterParams, PlaygroundPolicySlice, SimulationResult } from "@/lib/playground/types"; +import { usePoliciesQuery } from "@/lib/api/use-policies-query"; +import type { PolicySummary } from "@/lib/types/dashboard"; +import { usePlaygroundStore } from "@/lib/stores/playground"; +import { StatusChip } from "@/components/dashboard-ui"; +import { programLabel } from "@/lib/utils"; + +function resolvePolicies(remote: PolicySummary[] | undefined): PlaygroundPolicySlice[] { + const list = remote?.length ? remote : POLICIES; + return list.map((p) => ({ + pubkey: p.pubkey, + maxTxLamports: p.maxTxLamports, + dailyBudgetLamports: p.dailyBudgetLamports, + allowedPrograms: p.allowedPrograms, + })); +} + +const STEP_DELAY_MS = 1600; + +export function AttackSimulator() { + const policiesQuery = usePoliciesQuery(); + const policies = useMemo(() => resolvePolicies(policiesQuery.data), [policiesQuery.data]); + const crafterPolicyPubkey = usePlaygroundStore((s) => s.crafterParams.policyPubkey); + const playback = usePlaygroundStore((s) => s.playback); + const setPlayback = usePlaygroundStore((s) => s.setPlayback); + + const [scenarioId, setScenarioId] = useState(SCENARIOS[0]!.id); + const timerRef = useRef | null>(null); + + const scenario = SCENARIOS.find((s) => s.id === scenarioId) ?? SCENARIOS[0]!; + + const effectivePolicy = + policies.find((p) => p.pubkey === crafterPolicyPubkey) ?? policies[0] ?? POLICIES[0]; + + useEffect(() => { + return () => { + if (timerRef.current) clearTimeout(timerRef.current); + }; + }, []); + + const stopPlayback = () => { + if (timerRef.current) clearTimeout(timerRef.current); + timerRef.current = null; + setPlayback(null); + }; + + const runScenario = () => { + stopPlayback(); + + const base: CrafterParams = { + ...mergeScenarioStep({}), + policyPubkey: crafterPolicyPubkey ?? effectivePolicy.pubkey, + }; + + const runStep = (idx: number, acc: SimulationResult[], prev: CrafterParams) => { + const stepPartial = scenario.steps[idx]; + if (stepPartial === undefined) { + setPlayback({ + scenarioId: scenario.id, + stepIndex: idx, + stepResults: acc, + isPlaying: false, + }); + return; + } + + const merged: CrafterParams = { + ...prev, + ...stepPartial, + policyPubkey: prev.policyPubkey ?? effectivePolicy.pubkey, + }; + + const policy = + policies.find((p) => p.pubkey === (merged.policyPubkey ?? effectivePolicy.pubkey)) ?? + effectivePolicy; + + const result = runSimulation(merged, policy); + const nextAcc = [...acc, result]; + + const done = idx + 1 >= scenario.steps.length; + + setPlayback({ + scenarioId: scenario.id, + stepIndex: idx, + stepResults: nextAcc, + isPlaying: !done, + }); + + if (done) return; + + timerRef.current = setTimeout(() => runStep(idx + 1, nextAcc, merged), STEP_DELAY_MS); + }; + + runStep(0, [], base); + }; + + const replay = () => { + stopPlayback(); + runScenario(); + }; + + const results = playback?.scenarioId === scenario.id ? playback.stepResults : []; + + return ( +
+
+

Attack simulator

+

+ Scripted sequences stepped over ~{STEP_DELAY_MS / 1000}s. Uses the crafter policy selection when set. +

+ +
+ + + +
+

{scenario.description}

+
+ +
+ {results.map((r, i) => { + const stepMerge = mergeScenarioStep(scenario.steps[i] ?? {}); + return ( +
+
+ + Step {i + 1} / {scenario.steps.length} + + + {r.verdict.toUpperCase()} + +
+

+ {programLabel(stepMerge.targetProgram)} + + · {stepMerge.amountSol.toFixed(1)} SOL · {stepMerge.velocityPerMin} tx/min + + + score {Math.round(r.dangerScore)} + +

+

{r.reasoning}

+ {r.verdict === "pause" ? ( +
+ Incident card (mock): autonomous pause engaged — synthetic report snippet would render here. +
+ ) : null} +
+ ); + })} +
+
+ ); +} diff --git a/dashboard/components/playground/danger-gauge.tsx b/dashboard/components/playground/danger-gauge.tsx new file mode 100644 index 0000000..8062ab8 --- /dev/null +++ b/dashboard/components/playground/danger-gauge.tsx @@ -0,0 +1,30 @@ +"use client"; + +import { RadialBar, RadialBarChart, ResponsiveContainer } from "recharts"; + +export function DangerGauge({ score }: { score: number }) { + const clamped = Math.min(100, Math.max(0, score)); + const fill = + clamped <= 30 ? "hsl(var(--teal))" : clamped <= 50 ? "hsl(var(--amber))" : "hsl(var(--crimson))"; + + return ( +
+ + + + + +
+
{Math.round(clamped)}
+
danger score
+
+
+ ); +} diff --git a/dashboard/components/playground/kill-switch-demo.tsx b/dashboard/components/playground/kill-switch-demo.tsx new file mode 100644 index 0000000..8e608e1 --- /dev/null +++ b/dashboard/components/playground/kill-switch-demo.tsx @@ -0,0 +1,100 @@ +"use client"; + +import { usePlaygroundStore } from "@/lib/stores/playground"; + +export function KillSwitchDemo() { + const killSwitchState = usePlaygroundStore((s) => s.killSwitchState); + const setKillSwitchState = usePlaygroundStore((s) => s.setKillSwitchState); + + const paused = killSwitchState === "paused"; + + return ( +
+

Kill switch demo

+

+ Lightweight state machine illustrating pause semantics — no chain transactions. +

+ +
+
+ + {paused ? "Paused" : "Active"} + + +
+ [Active] —pause→ [Paused] —resume→ [Active] +
+ + {paused ? ( +
+

Guarded executes return PolicyPaused.

+

An incident record is opened and an Opus-style report can be generated asynchronously.

+
+ ) : ( +

+ Agent sessions within policy limits proceed through guarded execution as usual. +

+ )} +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
RolePauseResume
OwnerYesYes
MonitorYesNo
AgentNoNo
+
+ +
+ + +
+
+ ); +} diff --git a/dashboard/components/playground/policy-sandbox.tsx b/dashboard/components/playground/policy-sandbox.tsx new file mode 100644 index 0000000..6b100e9 --- /dev/null +++ b/dashboard/components/playground/policy-sandbox.tsx @@ -0,0 +1,150 @@ +"use client"; + +import { useMemo } from "react"; +import { POLICIES } from "@/lib/mock/policies"; +import { runSimulation } from "@/lib/playground/engine"; +import type { CrafterParams, PlaygroundPolicySlice } from "@/lib/playground/types"; +import { usePoliciesQuery } from "@/lib/api/use-policies-query"; +import type { PolicySummary } from "@/lib/types/dashboard"; +import { usePlaygroundStore } from "@/lib/stores/playground"; +import { formatSol } from "@/lib/utils"; +import { VerdictPanel } from "./verdict-panel"; + +function resolvePolicies(remote: PolicySummary[] | undefined): PlaygroundPolicySlice[] { + const list = remote?.length ? remote : POLICIES; + return list.map((p) => ({ + pubkey: p.pubkey, + maxTxLamports: p.maxTxLamports, + dailyBudgetLamports: p.dailyBudgetLamports, + allowedPrograms: p.allowedPrograms, + })); +} + +export function PolicySandbox() { + const policiesQuery = usePoliciesQuery(); + const policies = useMemo(() => resolvePolicies(policiesQuery.data), [policiesQuery.data]); + const crafterParams = usePlaygroundStore((s) => s.crafterParams); + const sandboxOverrides = usePlaygroundStore((s) => s.sandboxOverrides); + const setSandboxOverrides = usePlaygroundStore((s) => s.setSandboxOverrides); + + const basePolicy = + policies.find((p) => p.pubkey === crafterParams.policyPubkey) ?? policies[0] ?? POLICIES[0]; + + const baselinePolicy: PlaygroundPolicySlice = basePolicy; + + const tweakedPolicy: PlaygroundPolicySlice = { + ...baselinePolicy, + maxTxLamports: String(Math.round(sandboxOverrides.maxTxSol * 1e9)), + dailyBudgetLamports: String(Math.round(sandboxOverrides.dailyBudgetSol * 1e9)), + }; + + const txnParams: CrafterParams = { + ...crafterParams, + policyPubkey: baselinePolicy.pubkey, + }; + + const baselineResult = useMemo( + () => runSimulation(txnParams, baselinePolicy), + [ + baselinePolicy.pubkey, + baselinePolicy.maxTxLamports, + baselinePolicy.dailyBudgetLamports, + baselinePolicy.allowedPrograms.join(","), + crafterParams.amountSol, + crafterParams.velocityPerMin, + crafterParams.budgetConsumedPercent, + crafterParams.sessionRemaining, + crafterParams.targetProgram, + crafterParams.isProgramNew, + crafterParams.outsideActiveHours, + ], + ); + + const tweakedResult = useMemo( + () => runSimulation(txnParams, tweakedPolicy), + [ + tweakedPolicy.pubkey, + tweakedPolicy.maxTxLamports, + tweakedPolicy.dailyBudgetLamports, + tweakedPolicy.allowedPrograms.join(","), + crafterParams.amountSol, + crafterParams.velocityPerMin, + crafterParams.budgetConsumedPercent, + crafterParams.sessionRemaining, + crafterParams.targetProgram, + crafterParams.isProgramNew, + crafterParams.outsideActiveHours, + ], + ); + + const verdictChanged = baselineResult.verdict !== tweakedResult.verdict; + + return ( +
+
+

Policy sandbox

+

+ Same simulated transaction as the crafter tab against live policy caps vs adjusted caps — purely hypothetical. +

+ +
+ + +
+ +
+ Baseline caps from chain/API mirror:{" "} + + {formatSol(baselinePolicy.maxTxLamports)} tx / {formatSol(baselinePolicy.dailyBudgetLamports)} day + + {verdictChanged ? ( + + Verdict differs under tweaked caps ({baselineResult.verdict} → {tweakedResult.verdict}). + + ) : ( + Verdict unchanged for this hypothetical tweak. + )} +
+
+ +
+
+

+ Current policy mirror +

+ +
+
+

+ Sandbox caps +

+ +
+
+
+ ); +} diff --git a/dashboard/components/playground/progress-bar.tsx b/dashboard/components/playground/progress-bar.tsx new file mode 100644 index 0000000..21daea9 --- /dev/null +++ b/dashboard/components/playground/progress-bar.tsx @@ -0,0 +1,22 @@ +"use client"; + +export function PlaygroundProgressBar({ + progress, + durationMs, +}: { + progress: number; + durationMs: number; +}) { + const pct = Math.min(100, Math.max(0, progress)); + return ( +
+
+
+ ); +} diff --git a/dashboard/components/playground/signal-inspector.tsx b/dashboard/components/playground/signal-inspector.tsx new file mode 100644 index 0000000..e9a9fbd --- /dev/null +++ b/dashboard/components/playground/signal-inspector.tsx @@ -0,0 +1,96 @@ +"use client"; + +import { useMemo } from "react"; +import { SIGNAL_WEIGHTS } from "@/lib/playground/constants"; +import { + computeDangerScore, + determineVerdict, + generateReasoning, + simulateLatency, +} from "@/lib/playground/engine"; +import type { PrefilterSignal, SimulationResult } from "@/lib/playground/types"; +import { usePlaygroundStore, inspectorSignalsToList } from "@/lib/stores/playground"; +import { VerdictPanel } from "./verdict-panel"; + +const ORDER: PrefilterSignal[] = [ + "burst_detected", + "elevated_frequency", + "high_amount", + "budget_nearly_exhausted", + "new_or_uncommon_program", + "outside_active_hours", + "session_expiring_soon", +]; + +export function SignalInspector() { + const inspectorSignals = usePlaygroundStore((s) => s.inspectorSignals); + const toggleInspectorSignal = usePlaygroundStore((s) => s.toggleInspectorSignal); + const resetInspector = usePlaygroundStore((s) => s.resetInspector); + + const result: SimulationResult | null = useMemo(() => { + const signals = inspectorSignalsToList(inspectorSignals); + const dangerScore = computeDangerScore(signals); + const sessionRemaining = "gt24h"; + const { verdict, confidence } = determineVerdict(signals, dangerScore, sessionRemaining); + const prefilterSkipped = signals.length === 0; + const reasoning = prefilterSkipped + ? "Prefilter skipped the LLM judge — no anomaly signals matched configured thresholds." + : generateReasoning(signals, verdict); + + return { + signals, + dangerScore, + verdict, + confidence, + reasoning, + prefilterSkipped, + latencyMs: simulateLatency(), + model: "guardian", + }; + }, [inspectorSignals]); + + return ( +
+
+
+
+

Signal inspector

+

+ Toggle synthetic signals — weights sum into the danger score (session assumed healthy). +

+
+ +
+ +
    + {ORDER.map((sig) => ( +
  • + + w{SIGNAL_WEIGHTS[sig]} +
  • + ))} +
+ +

+ Override rules still apply when combining burst + high amount (forced pause). Danger bands: 0–30 allow bias, + 31–50 flag, 51+ pause unless refined by overrides. +

+
+ + +
+ ); +} diff --git a/dashboard/components/playground/transaction-crafter.tsx b/dashboard/components/playground/transaction-crafter.tsx new file mode 100644 index 0000000..0ea1048 --- /dev/null +++ b/dashboard/components/playground/transaction-crafter.tsx @@ -0,0 +1,255 @@ +"use client"; + +import { useMemo } from "react"; +import { POLICIES, PROGRAM_LABELS } from "@/lib/mock/policies"; +import { PLAYGROUND_PROGRAM_OPTIONS } from "@/lib/playground/constants"; +import { runSimulation } from "@/lib/playground/engine"; +import type { CrafterParams, PlaygroundPolicySlice, SessionRemainingBucket } from "@/lib/playground/types"; +import { usePoliciesQuery } from "@/lib/api/use-policies-query"; +import type { PolicySummary } from "@/lib/types/dashboard"; +import { usePlaygroundStore } from "@/lib/stores/playground"; +import { VerdictPanel } from "./verdict-panel"; +import { PlaygroundProgressBar } from "./progress-bar"; + +function resolvePolicies(remote: PolicySummary[] | undefined): PlaygroundPolicySlice[] { + const list = remote?.length ? remote : POLICIES; + return list.map((p) => ({ + pubkey: p.pubkey, + maxTxLamports: p.maxTxLamports, + dailyBudgetLamports: p.dailyBudgetLamports, + allowedPrograms: p.allowedPrograms, + })); +} + +function policyLabel(p: PlaygroundPolicySlice): string { + const full = POLICIES.find((x) => x.pubkey === p.pubkey); + const lbl = full?.label; + return lbl ? `${lbl}` : `${p.pubkey.slice(0, 4)}…${p.pubkey.slice(-4)}`; +} + +function SessionSelect({ + value, + onChange, +}: { + value: SessionRemainingBucket; + onChange: (v: SessionRemainingBucket) => void; +}) { + const opts: { value: SessionRemainingBucket; label: string }[] = [ + { value: "gt24h", label: "> 24h remaining" }, + { value: "h1to6", label: "1–6 hours" }, + { value: "m30", label: "~30 minutes" }, + { value: "lt10min", label: "< 10 minutes" }, + { value: "expired", label: "Expired" }, + ]; + return ( + + ); +} + +function shortProg(pk: string): string { + return `${pk.slice(0, 4)}…`; +} + +function SliderBlock({ + label, + min, + max, + step, + value, + onChange, + display, +}: { + label: string; + min: number; + max: number; + step: number; + value: number; + onChange: (v: number) => void; + display: (v: number) => string; +}) { + return ( + + ); +} + +export function TransactionCrafter() { + const policiesQuery = usePoliciesQuery(); + const policies = useMemo(() => resolvePolicies(policiesQuery.data), [policiesQuery.data]); + + const crafterParams = usePlaygroundStore((s) => s.crafterParams); + const crafterResult = usePlaygroundStore((s) => s.crafterResult); + const crafterRunning = usePlaygroundStore((s) => s.crafterRunning); + const crafterProgress = usePlaygroundStore((s) => s.crafterProgress); + const setCrafterParams = usePlaygroundStore((s) => s.setCrafterParams); + const setCrafterResult = usePlaygroundStore((s) => s.setCrafterResult); + const setCrafterRunning = usePlaygroundStore((s) => s.setCrafterRunning); + const setCrafterProgress = usePlaygroundStore((s) => s.setCrafterProgress); + + const selectedPolicy = + policies.find((p) => p.pubkey === crafterParams.policyPubkey) ?? policies[0] ?? POLICIES[0]; + + const effectivePubkey = crafterParams.policyPubkey ?? selectedPolicy?.pubkey ?? POLICIES[0]!.pubkey; + + const runJudge = async () => { + const policy = policies.find((p) => p.pubkey === effectivePubkey) ?? policies[0]; + if (!policy) return; + + setCrafterRunning(true); + setCrafterProgress(0); + setCrafterResult(null); + + const params: CrafterParams = { ...crafterParams, policyPubkey: effectivePubkey }; + const duration = 900 + Math.floor(Math.random() * 400); + const steps = 24; + for (let i = 1; i <= steps; i++) { + await new Promise((r) => setTimeout(r, duration / steps)); + setCrafterProgress((i / steps) * 100); + } + + const result = runSimulation(params, policy); + setCrafterResult(result); + setCrafterRunning(false); + setCrafterProgress(100); + }; + + return ( +
+
+
+

Transaction parameters

+

+ Tune inputs — simulation uses PLAYGROUND signal weights (frontend-only). +

+
+ + + + + + setCrafterParams({ amountSol })} + display={(v) => `${v.toFixed(1)} SOL`} + /> + + setCrafterParams({ velocityPerMin })} + display={(v) => String(v)} + /> + + setCrafterParams({ budgetConsumedPercent })} + display={(v) => `${v}%`} + /> + + + + + + + +
+ + {crafterRunning ? ( + + ) : null} +
+
+ + +
+ ); +} diff --git a/dashboard/components/playground/verdict-panel.tsx b/dashboard/components/playground/verdict-panel.tsx new file mode 100644 index 0000000..85da185 --- /dev/null +++ b/dashboard/components/playground/verdict-panel.tsx @@ -0,0 +1,102 @@ +"use client"; + +import { StatusChip } from "@/components/dashboard-ui"; +import type { SimulationResult } from "@/lib/playground/types"; +import { Play } from "lucide-react"; +import { DangerGauge } from "./danger-gauge"; + +function verdictTone(v: SimulationResult["verdict"]): "green" | "amber" | "red" { + if (v === "allow") return "green"; + if (v === "flag") return "amber"; + return "red"; +} + +export function VerdictPanel({ + result, + latencyDisplay, +}: { + result: SimulationResult | null; + latencyDisplay?: number | null; +}) { + if (!result) { + return ( +
+
+
+ +
+

Run a simulation to see verdict output

+

+ Configure parameters on the left and click Run Judge +

+
+
+ ); + } + + return ( +
+
+
+ Verdict + {result.verdict.toUpperCase()} + + Model · {result.model} + +
+ +
+ +
+
+ Confidence + {result.confidence}% +
+
+
+
+
+ +
+ {result.reasoning} +
+ +
+ Prefilter:{" "} + {result.prefilterSkipped ? ( + skipped LLM — safe path + ) : ( + judge invoked + )} + {latencyDisplay != null ? ( + <> + {" "} + · Simulated latency{" "} + {latencyDisplay}ms + + ) : null} +
+ + {result.signals.length > 0 ? ( +
+ Active signals +
    + {result.signals.map((s) => ( +
  • + {s} +
  • + ))} +
+
+ ) : ( +

No anomaly signals for this run.

+ )} +
+ ); +} diff --git a/dashboard/components/proposal-card.tsx b/dashboard/components/proposal-card.tsx index 21b2c2b..1e24ceb 100644 --- a/dashboard/components/proposal-card.tsx +++ b/dashboard/components/proposal-card.tsx @@ -1,45 +1,15 @@ "use client"; +import Link from "next/link"; import { useState } from "react"; import { useConnection, useWallet } from "@solana/wallet-adapter-react"; import { useAnchorWallet } from "@solana/wallet-adapter-react"; import { StatusChip } from "@/components/dashboard-ui"; -import { shortAddress, lamportsToSol, formatRelativeTime, programLabel } from "@/lib/utils"; +import { shortAddress, formatRelativeTime, formatRelativeTooltip, formatSol, programLabel } from "@/lib/utils"; import { approveProposal, executeProposal, createEscalationProposal } from "@/lib/squads/create-proposal"; import { getErrorMessage } from "@/lib/api/client"; import type { EscalationSummary } from "@/lib/types/dashboard"; - -function escalationTone(status: string): "green" | "amber" | "red" { - switch (status) { - case "executed": - return "green"; - case "pending": - case "approved": - case "awaiting_proposal": - return "amber"; - default: - return "red"; - } -} - -function escalationLabel(status: string): string { - switch (status) { - case "awaiting_proposal": - return "AWAITING PROPOSAL"; - case "pending": - return "PENDING APPROVAL"; - case "approved": - return "APPROVED"; - case "executed": - return "EXECUTED"; - case "rejected": - return "REJECTED"; - case "cancelled": - return "CANCELLED"; - default: - return status.toUpperCase(); - } -} +import { escalationLabel, escalationTone } from "@/lib/utils/escalation-display"; export function ProposalCard({ escalation, @@ -55,7 +25,6 @@ export function ProposalCard({ const [busy, setBusy] = useState(false); const [error, setError] = useState(null); - const amountSol = lamportsToSol(escalation.amountLamports); const approvals = escalation.approvals ?? []; const rejections = escalation.rejections ?? []; @@ -120,7 +89,7 @@ export function ProposalCard({
- {amountSol.toFixed(4)} SOL to {programLabel(escalation.targetProgram)} + {formatSol(escalation.amountLamports)} to {programLabel(escalation.targetProgram)} Multisig: {shortAddress(escalation.squadsMultisig)} @@ -131,6 +100,13 @@ export function ProposalCard({
+ + Proposal detail → + + {/* Approval progress */} {approvals.length > 0 || rejections.length > 0 ? (
@@ -167,7 +143,7 @@ export function ProposalCard({ ) : null} {/* Time */} - + Created {formatRelativeTime(escalation.createdAt)} diff --git a/dashboard/components/providers.tsx b/dashboard/components/providers.tsx index 1b4551d..61f92c7 100644 --- a/dashboard/components/providers.tsx +++ b/dashboard/components/providers.tsx @@ -4,6 +4,7 @@ import React, { type ComponentType, useMemo, useState, type ReactNode } from "re import { AnchorProvider } from "@coral-xyz/anchor"; import { Connection, PublicKey } from "@solana/web3.js"; import { QueryCache, QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; import { ConnectionProvider, WalletProvider, useWallet } from "@solana/wallet-adapter-react"; import { WalletModalProvider } from "@solana/wallet-adapter-react-ui"; import type { Adapter } from "@solana/wallet-adapter-base"; @@ -103,6 +104,9 @@ export function AppProviders({ children }: { children: ReactNode }) { }} /> {children} + {process.env.NODE_ENV === "development" ? ( + + ) : null} diff --git a/dashboard/components/query-states.tsx b/dashboard/components/query-states.tsx index ecb3412..5be2889 100644 --- a/dashboard/components/query-states.tsx +++ b/dashboard/components/query-states.tsx @@ -60,10 +60,10 @@ export function QueryEmpty({ action?: ReactNode; }) { return ( -
-

{title}

- {description ?

{description}

: null} - {action ?
{action}
: null} +
+

{title}

+ {description ?

{description}

: null} + {action ?
{action}
: null}
); } diff --git a/dashboard/components/rotate-agent-key-button.tsx b/dashboard/components/rotate-agent-key-button.tsx index 5cbc03c..abbc0c0 100644 --- a/dashboard/components/rotate-agent-key-button.tsx +++ b/dashboard/components/rotate-agent-key-button.tsx @@ -5,6 +5,7 @@ import { useRouter } from "nextjs-toploader/app"; import { useQueryClient } from "@tanstack/react-query"; import { useWallet } from "@solana/wallet-adapter-react"; import { Keypair, PublicKey } from "@solana/web3.js"; +import { toast } from "sonner"; import { getErrorMessage } from "@/lib/api/client"; import { queryKeys } from "@/lib/api/query-keys"; import { GuardrailsClient } from "@/lib/sdk/client"; @@ -58,20 +59,24 @@ export function RotateAgentKeyButton({ policy }: { policy: PolicySummary }) { newKeypair.publicKey, ); queryClient.removeQueries({ queryKey: queryKeys.policy(policy.pubkey) }); - queryClient.invalidateQueries({ queryKey: queryKeys.policies() }); + queryClient.invalidateQueries({ queryKey: ["policies"] }); + toast.success("Agent key rotated successfully."); router.push(`/agents/${newPolicyPda.toBase58()}`); } catch (e) { // "Already processed" means the first click succeeded — treat as success const msg = getErrorMessage(e).toLowerCase(); if (msg.includes("already been processed") || msg.includes("already processed")) { queryClient.removeQueries({ queryKey: queryKeys.policy(policy.pubkey) }); - queryClient.invalidateQueries({ queryKey: queryKeys.policies() }); + queryClient.invalidateQueries({ queryKey: ["policies"] }); + toast.success("Agent key rotation already processed."); // Derive the new PDA to redirect const client = new GuardrailsClient(provider, programId); const [newPda] = client.findPolicyPda(new PublicKey(policy.owner), newKeypair.publicKey); router.push(`/agents/${newPda.toBase58()}`); } else { - setError(getErrorMessage(e)); + const message = getErrorMessage(e); + setError(message); + toast.error(message); } } finally { setBusy(false); @@ -125,7 +130,12 @@ export function RotateAgentKeyButton({ policy }: { policy: PolicySummary }) { diff --git a/dashboard/components/shell-navbar-actions.tsx b/dashboard/components/shell-navbar-actions.tsx index 1d4bd47..f8ed659 100644 --- a/dashboard/components/shell-navbar-actions.tsx +++ b/dashboard/components/shell-navbar-actions.tsx @@ -6,12 +6,14 @@ import { useRouter } from "next/navigation"; import { useCallback, useEffect, useRef, useState } from "react"; import { toast } from "sonner"; import { useSiwsAuthStore } from "@/lib/stores/siws-auth"; +import { subscribeSSEEvents } from "@/lib/sse/useSSE"; export function ShellNavbarActions() { const router = useRouter(); const walletAdapter = useWallet(); const [menuOpen, setMenuOpen] = useState(false); const [copied, setCopied] = useState(false); + const [unreadCount, setUnreadCount] = useState(0); const wrapRef = useRef(null); const copyResetRef = useRef | null>(null); @@ -39,6 +41,14 @@ export function ShellNavbarActions() { }; }, [menuOpen]); + useEffect(() => { + return subscribeSSEEvents(({ type }) => { + if (type === "agent_paused" || type === "escalation_created") { + setUnreadCount((count) => count + 1); + } + }); + }, []); + useEffect(() => { return () => { if (copyResetRef.current) clearTimeout(copyResetRef.current); @@ -69,13 +79,23 @@ export function ShellNavbarActions() { }, [router, walletAdapter]); return ( -
+
@@ -85,7 +105,7 @@ export function ShellNavbarActions() { aria-expanded={menuOpen} aria-haspopup="dialog" onClick={() => setMenuOpen((o) => !o)} - className="inline-flex h-9 w-9 items-center justify-center rounded-full border border-white/[0.1] bg-white/[0.06] text-zinc-300 transition-colors hover:border-white/[0.16] hover:bg-white/[0.1] hover:text-zinc-100" + className="inline-flex h-10 w-10 items-center justify-center rounded-full border border-white/[0.1] bg-white/[0.06] text-zinc-300 transition-colors duration-150 hover:border-white/[0.16] hover:bg-white/[0.1] hover:text-zinc-100" > diff --git a/dashboard/components/skeletons/activity-view-skeleton.tsx b/dashboard/components/skeletons/activity-view-skeleton.tsx new file mode 100644 index 0000000..be243b7 --- /dev/null +++ b/dashboard/components/skeletons/activity-view-skeleton.tsx @@ -0,0 +1,47 @@ +import { SkeletonBlock } from "./skeleton-block"; + +export function ActivityViewSkeleton() { + return ( +
+
+
+
+ + +
+
+ + +
+
+
+ + + +
+ {Array.from({ length: 5 }).map((_, idx) => ( +
+
+
+
+ + + +
+ +
+
+ + +
+
+
+ + +
+
+ ))} +
+
+ ); +} diff --git a/dashboard/components/skeletons/agent-detail-skeleton.tsx b/dashboard/components/skeletons/agent-detail-skeleton.tsx new file mode 100644 index 0000000..4c61e7c --- /dev/null +++ b/dashboard/components/skeletons/agent-detail-skeleton.tsx @@ -0,0 +1,43 @@ +import { SkeletonBlock } from "./skeleton-block"; + +export function AgentDetailSkeleton() { + return ( +
+
+ {Array.from({ length: 3 }).map((_, idx) => ( +
+ + +
+ ))} +
+ +
+ {Array.from({ length: 4 }).map((_, idx) => ( + + ))} +
+ +
+ +
+ +
+
+ +
+ +
+ {Array.from({ length: 3 }).map((_, idx) => ( + + ))} +
+
+ +
+ + +
+
+ ); +} diff --git a/dashboard/components/skeletons/agents-overview-skeleton.tsx b/dashboard/components/skeletons/agents-overview-skeleton.tsx new file mode 100644 index 0000000..1476cc9 --- /dev/null +++ b/dashboard/components/skeletons/agents-overview-skeleton.tsx @@ -0,0 +1,36 @@ +import { SkeletonBlock } from "./skeleton-block"; + +export function AgentsOverviewSkeleton() { + return ( +
+ {Array.from({ length: 6 }).map((_, idx) => ( +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+
+ + +
+
+
+ ))} +
+ ); +} diff --git a/dashboard/components/skeletons/edit-policy-form-skeleton.tsx b/dashboard/components/skeletons/edit-policy-form-skeleton.tsx new file mode 100644 index 0000000..2090764 --- /dev/null +++ b/dashboard/components/skeletons/edit-policy-form-skeleton.tsx @@ -0,0 +1,16 @@ +import { SkeletonBlock } from "./skeleton-block"; + +export function EditPolicyFormSkeleton() { + return ( +
+ + +
+ + +
+ + +
+ ); +} diff --git a/dashboard/components/skeletons/fleet-dashboard-skeleton.tsx b/dashboard/components/skeletons/fleet-dashboard-skeleton.tsx new file mode 100644 index 0000000..26002c9 --- /dev/null +++ b/dashboard/components/skeletons/fleet-dashboard-skeleton.tsx @@ -0,0 +1,27 @@ +import { SkeletonBlock } from "./skeleton-block"; + +export function FleetDashboardSkeleton() { + return ( +
+
+ {Array.from({ length: 4 }).map((_, idx) => ( +
+ + + +
+ ))} +
+
+
+ + +
+
+ + +
+
+
+ ); +} diff --git a/dashboard/components/skeletons/incident-detail-skeleton.tsx b/dashboard/components/skeletons/incident-detail-skeleton.tsx new file mode 100644 index 0000000..a0436c9 --- /dev/null +++ b/dashboard/components/skeletons/incident-detail-skeleton.tsx @@ -0,0 +1,39 @@ +import { SkeletonBlock } from "./skeleton-block"; + +export function IncidentDetailSkeleton() { + return ( +
+
+
+ + + +
+
+ +
+ {Array.from({ length: 3 }).map((_, idx) => ( +
+ + +
+ ))} +
+ +
+
+ + {Array.from({ length: 4 }).map((_, idx) => ( + + ))} +
+
+ + {Array.from({ length: 6 }).map((_, idx) => ( + + ))} +
+
+
+ ); +} diff --git a/dashboard/components/skeletons/incidents-view-skeleton.tsx b/dashboard/components/skeletons/incidents-view-skeleton.tsx new file mode 100644 index 0000000..b48607c --- /dev/null +++ b/dashboard/components/skeletons/incidents-view-skeleton.tsx @@ -0,0 +1,31 @@ +import { SkeletonBlock } from "./skeleton-block"; + +export function IncidentsViewSkeleton() { + return ( +
+
+ + + + {Array.from({ length: 4 }).map((_, idx) => ( + + ))} + + + + {Array.from({ length: 6 }).map((_, idx) => ( + + + + + + + ))} + +
+ +
+
+
+ ); +} diff --git a/dashboard/components/skeletons/index.ts b/dashboard/components/skeletons/index.ts new file mode 100644 index 0000000..b48991e --- /dev/null +++ b/dashboard/components/skeletons/index.ts @@ -0,0 +1,10 @@ +export { SkeletonBlock } from "./skeleton-block"; +export { AgentsOverviewSkeleton } from "./agents-overview-skeleton"; +export { ActivityViewSkeleton } from "./activity-view-skeleton"; +export { IncidentsViewSkeleton } from "./incidents-view-skeleton"; +export { IncidentDetailSkeleton } from "./incident-detail-skeleton"; +export { AgentDetailSkeleton } from "./agent-detail-skeleton"; +export { ProposalsViewSkeleton } from "./proposals-view-skeleton"; +export { FleetDashboardSkeleton } from "./fleet-dashboard-skeleton"; +export { EditPolicyFormSkeleton } from "./edit-policy-form-skeleton"; +export { SkeletonCard, SkeletonRow, SkeletonStatCard } from "./primitives"; diff --git a/dashboard/components/skeletons/primitives.tsx b/dashboard/components/skeletons/primitives.tsx new file mode 100644 index 0000000..b637be4 --- /dev/null +++ b/dashboard/components/skeletons/primitives.tsx @@ -0,0 +1,37 @@ +export function SkeletonRow({ cols = 4 }: { cols?: number }) { + return ( + + {Array.from({ length: cols }).map((_, i) => ( + +
+ + ))} + + ); +} + +export function SkeletonCard() { + return ( +
+
+
+
+
+
+
+
+
+ ); +} + +export function SkeletonStatCard() { + return ( +
+
+
+
+ ); +} diff --git a/dashboard/components/skeletons/proposals-view-skeleton.tsx b/dashboard/components/skeletons/proposals-view-skeleton.tsx new file mode 100644 index 0000000..7007e8e --- /dev/null +++ b/dashboard/components/skeletons/proposals-view-skeleton.tsx @@ -0,0 +1,18 @@ +import { SkeletonBlock } from "./skeleton-block"; + +export function ProposalsViewSkeleton() { + return ( +
+
+ + {Array.from({ length: 2 }).map((_, idx) => ( + + ))} +
+
+ + +
+
+ ); +} diff --git a/dashboard/components/skeletons/skeleton-block.tsx b/dashboard/components/skeletons/skeleton-block.tsx new file mode 100644 index 0000000..f422d23 --- /dev/null +++ b/dashboard/components/skeletons/skeleton-block.tsx @@ -0,0 +1,14 @@ +import type { HTMLAttributes } from "react"; + +export function SkeletonBlock({ + className = "", + ...props +}: HTMLAttributes) { + return ( +
+ ); +} diff --git a/dashboard/components/ui/select.tsx b/dashboard/components/ui/select.tsx new file mode 100644 index 0000000..7a0624b --- /dev/null +++ b/dashboard/components/ui/select.tsx @@ -0,0 +1,142 @@ +import * as React from "react"; +import * as SelectPrimitive from "@radix-ui/react-select"; +import { Check, ChevronDown, ChevronUp } from "lucide-react"; + +import { cn } from "@/lib/utils"; + +const Select = SelectPrimitive.Root; + +const SelectGroup = SelectPrimitive.Group; + +const SelectValue = SelectPrimitive.Value; + +const SelectTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + span]:line-clamp-1", + className, + )} + {...props} + > + {children} + + + + +)); +SelectTrigger.displayName = SelectPrimitive.Trigger.displayName; + +const SelectScrollUpButton = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)); +SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName; + +const SelectScrollDownButton = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)); +SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName; + +const SelectContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, position = "popper", ...props }, ref) => ( + + + + + {children} + + + + +)); +SelectContent.displayName = SelectPrimitive.Content.displayName; + +const SelectLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +SelectLabel.displayName = SelectPrimitive.Label.displayName; + +const SelectItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)); +SelectItem.displayName = SelectPrimitive.Item.displayName; + +const SelectSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +SelectSeparator.displayName = SelectPrimitive.Separator.displayName; + +export { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectLabel, + SelectScrollDownButton, + SelectScrollUpButton, + SelectSeparator, + SelectTrigger, + SelectValue, +}; diff --git a/dashboard/lib/api/client.ts b/dashboard/lib/api/client.ts index 5185a06..7b931a0 100644 --- a/dashboard/lib/api/client.ts +++ b/dashboard/lib/api/client.ts @@ -1,14 +1,23 @@ import { INCIDENTS, POLICIES, TRANSACTIONS, VERDICTS } from "@/lib/mock"; import type { ApiErrorPayload, + AuditLogFilters, + AuditRow, EscalationDetail, EscalationSummary, + FleetSummary, IncidentDetail, IncidentSummary, + LLMSettingsInfo, + OperatorSession, PaginatedResponse, PolicySummary, + SpendTrackerRow, + TransactionDetail, + TransactionDetailResponse, TransactionSummary, VerdictSummary, + WebhookStatus, } from "@/lib/types/dashboard"; const API_URL = process.env.NEXT_PUBLIC_API_URL?.replace(/\/$/, ""); const USE_MOCK_API = @@ -136,6 +145,20 @@ async function patchJson(path: string, body: unknown): Promise { return response.json() as Promise; } +async function deleteJson(path: string): Promise { + if (!API_URL) { + throw new Error("NEXT_PUBLIC_API_URL is not configured"); + } + + const response = await safeFetch(`${API_URL}${path}`, buildApiRequestInit({ method: "DELETE" })); + + if (!response.ok) { + await throwIfNotOk(response); + } + + return response.json() as Promise; +} + export class ApiClientError extends Error { status: number; payload: ApiErrorPayload | null; @@ -317,6 +340,37 @@ function mapApiIncidentRow(row: ApiIncidentRow): IncidentSummary { }; } +function normalizeApprovalJson(raw: unknown): EscalationSummary["approvals"] { + if (!Array.isArray(raw)) return []; + return raw.map((entry) => { + const o = entry as Record; + return { + member: String(o.member ?? ""), + timestamp: toIsoString(o.timestamp ?? new Date().toISOString()), + }; + }); +} + +function mapApiEscalationRow(raw: Record): EscalationSummary { + return { + id: String(raw.id ?? ""), + policyPubkey: String(raw.policyPubkey ?? ""), + txnId: String(raw.txnId ?? ""), + squadsMultisig: String(raw.squadsMultisig ?? ""), + targetProgram: String(raw.targetProgram ?? ""), + amountLamports: String(raw.amountLamports ?? "0"), + proposalPda: raw.proposalPda == null ? null : String(raw.proposalPda), + transactionIndex: raw.transactionIndex == null ? null : String(raw.transactionIndex), + status: String(raw.status ?? ""), + approvals: normalizeApprovalJson(raw.approvals), + rejections: normalizeApprovalJson(raw.rejections), + executedTxnSig: raw.executedTxnSig == null ? null : String(raw.executedTxnSig), + expiresAt: raw.expiresAt == null ? null : toIsoString(raw.expiresAt), + createdAt: toIsoString(raw.createdAt ?? new Date().toISOString()), + updatedAt: toIsoString(raw.updatedAt ?? new Date().toISOString()), + }; +} + function buildVerdictMap(): Map { return new Map( VERDICTS.map((verdict) => [ @@ -344,6 +398,12 @@ function sortPolicies(items: PolicySummary[]): PolicySummary[] { ); } +/** Mock policies for the authenticated viewer (aligned with SIWS pubkey). Empty when unknown. */ +function mockPoliciesOwnedBy(walletPubkey: string | undefined | null): PolicySummary[] { + if (!walletPubkey) return []; + return sortPolicies(POLICIES.filter((p) => p.owner === walletPubkey)); +} + function sortTransactions(items: TransactionSummary[]): TransactionSummary[] { return [...items].sort( (left, right) => new Date(right.blockTime).getTime() - new Date(left.blockTime).getTime(), @@ -387,7 +447,7 @@ export async function requestSiwsNonce(pubkey: string): Promise<{ nonce: string; return { nonce, message: [ - "Agent Guardrails Dashboard", + "Guardrails Dashboard", "", `Wallet: ${pubkey}`, `Nonce: ${nonce}`, @@ -414,7 +474,7 @@ export async function verifySiwsSignature(payload: { return { ok: true }; } -export async function fetchPolicies(): Promise { +export async function fetchPolicies(walletPubkey?: string | null): Promise { if (!USE_MOCK_API) { try { const { policies } = await getJson<{ policies: ApiPolicyRow[] }>("/api/policies"); @@ -423,10 +483,10 @@ export async function fetchPolicies(): Promise { if (!isNetworkApiError(error)) throw error; } } - return sortPolicies(POLICIES); + return mockPoliciesOwnedBy(walletPubkey); } -export async function fetchPolicy(pubkey: string): Promise { +export async function fetchPolicy(pubkey: string, viewerWalletPubkey?: string | null): Promise { if (!USE_MOCK_API) { const policies = await fetchPolicies(); const policy = policies.find((item) => item.pubkey === pubkey); @@ -440,6 +500,9 @@ export async function fetchPolicy(pubkey: string): Promise { if (!policy) { throw new Error("Policy not found"); } + if (viewerWalletPubkey && policy.owner !== viewerWalletPubkey) { + throw new Error("Policy not found"); + } return policy; } @@ -478,6 +541,7 @@ export async function fetchIncidents( policyPubkey?: string, before?: string, limit = DEFAULT_INCIDENTS_LIMIT, + viewerWalletPubkey?: string | null, ): Promise> { const safeLimit = normalizeLimit(limit, DEFAULT_INCIDENTS_LIMIT); if (!USE_MOCK_API) { @@ -499,13 +563,17 @@ export async function fetchIncidents( } } - const filtered = sortIncidents(INCIDENTS).filter((incident) => - policyPubkey ? incident.policyPubkey === policyPubkey : true, + const ownedPubkeys = new Set( + mockPoliciesOwnedBy(viewerWalletPubkey).map((p) => p.pubkey), ); + const filtered = sortIncidents(INCIDENTS).filter((incident) => { + if (!ownedPubkeys.has(incident.policyPubkey)) return false; + return policyPubkey ? incident.policyPubkey === policyPubkey : true; + }); return paginate(filtered, before, safeLimit); } -export async function fetchIncident(id: string): Promise { +export async function fetchIncident(id: string, viewerWalletPubkey?: string | null): Promise { if (!USE_MOCK_API) { try { const row = await getJson(`/api/incidents/${id}`); @@ -530,6 +598,14 @@ export async function fetchIncident(id: string): Promise { } const policy = POLICIES.find((item) => item.pubkey === incident.policyPubkey); + if ( + viewerWalletPubkey && + policy && + policy.owner !== viewerWalletPubkey + ) { + throw new Error("Incident not found"); + } + const judgeVerdict = incident.judgeVerdictId ? VERDICTS.find((item) => item.id === incident.judgeVerdictId) ?? null : null; @@ -550,6 +626,284 @@ export async function fetchIncident(id: string): Promise { }); } +// --------------------------------------------------------------------------- +// Fleet / spend trackers +// --------------------------------------------------------------------------- + +function buildMockSpendTrackers(forPolicies: PolicySummary[]): SpendTrackerRow[] { + const iso = new Date().toISOString(); + return forPolicies.map((p) => { + const budget = BigInt(p.dailyBudgetLamports); + const spentRatio = + p.pubkey === "CsZ5LZkDS7h9TDKjt4zMJSiP8bZzYLkWsa4bGMQKDqeE" ? BigInt(92) : BigInt(35); + const spent = (budget * spentRatio) / BigInt(100); + return { + policyPubkey: p.pubkey, + windowStart: iso, + txnCount24h: 14, + lamportsSpent24h: spent.toString(), + lastTxnTs: iso, + lastTxnProgram: p.allowedPrograms[0] ?? "11111111111111111111111111111111", + uniqueDestinations24h: 3, + maxSingleTxnLamports: (budget / BigInt(50)).toString(), + failedTxnCount24h: p.pubkey === "CsZ5LZkDS7h9TDKjt4zMJSiP8bZzYLkWsa4bGMQKDqeE" ? 2 : 0, + uniquePrograms24h: 2, + lamportsSpent1h: (spent / BigInt(8)).toString(), + windowStart1h: iso, + consecutiveHighAmountCount: p.anomalyScore > 60 ? 4 : 0, + updatedAt: iso, + policy: { + label: p.label, + isActive: p.isActive, + anomalyScore: p.anomalyScore, + dailyBudgetLamports: p.dailyBudgetLamports, + }, + }; + }); +} + +function mockFleetSummary(walletPubkey: string | undefined | null): FleetSummary { + const policiesList = walletPubkey ? POLICIES.filter((p) => p.owner === walletPubkey) : []; + const activeAgents = policiesList.filter((p) => p.isActive).length; + const pausedAgents = policiesList.filter((p) => !p.isActive).length; + const now = Date.now(); + const ms24h = 24 * 60 * 60 * 1000; + const boundary24h = now - ms24h; + const boundary48h = now - 2 * ms24h; + const pkSet = new Set(policiesList.map((p) => p.pubkey)); + const incidentsLast24h = INCIDENTS.filter((i) => { + const t = new Date(i.pausedAt).getTime(); + return pkSet.has(i.policyPubkey) && t >= boundary24h; + }).length; + const incidentsPrev24h = INCIDENTS.filter((i) => { + const t = new Date(i.pausedAt).getTime(); + return pkSet.has(i.policyPubkey) && t >= boundary48h && t < boundary24h; + }).length; + const policiesForSpend = walletPubkey ? mockPoliciesOwnedBy(walletPubkey) : []; + const trackers = buildMockSpendTrackers(policiesForSpend); + let total = BigInt(0); + for (const t of trackers) { + total += BigInt(t.lamportsSpent24h); + } + return { + activeAgents, + pausedAgents, + incidentsLast24h, + incidentsPrev24h, + totalLamportsSpent24h: total.toString(), + totalLamportsSpentPrev24h: null, + }; +} + +export async function fetchFleetSummary(walletPubkey?: string | null): Promise { + if (!USE_MOCK_API) { + try { + return await getJson("/api/fleet/summary"); + } catch (error) { + if (!isNetworkApiError(error)) throw error; + } + } + return mockFleetSummary(walletPubkey); +} + +export async function fetchSpendTrackers(walletPubkey?: string | null): Promise { + if (!USE_MOCK_API) { + try { + const { spendTrackers } = await getJson<{ spendTrackers: SpendTrackerRow[] }>("/api/spend-trackers"); + return spendTrackers; + } catch (error) { + if (!isNetworkApiError(error)) throw error; + } + } + return buildMockSpendTrackers(mockPoliciesOwnedBy(walletPubkey)); +} + +// --------------------------------------------------------------------------- +// Transaction detail / settings / audit / auth sessions +// --------------------------------------------------------------------------- + +function mockTransactionDetail(sig: string): TransactionDetailResponse { + const txn = TRANSACTIONS.find((t) => t.txnSig === sig); + if (!txn) { + throw new Error("Transaction not found"); + } + const verdict = verdictByTxnId.get(txn.id) ?? null; + const transaction: TransactionDetail = { + ...txn, + verdict, + escalation: null, + }; + const incident = INCIDENTS.find((i) => i.triggeringTxnSig === sig) ?? null; + const chain = [...TRANSACTIONS] + .filter((t) => t.policyPubkey === txn.policyPubkey) + .sort((a, b) => new Date(a.blockTime).getTime() - new Date(b.blockTime).getTime()); + const idx = chain.findIndex((t) => t.txnSig === sig); + const prevTxnSig = idx > 0 ? chain[idx - 1]?.txnSig ?? null : null; + const nextTxnSig = + idx >= 0 && idx < chain.length - 1 ? chain[idx + 1]?.txnSig ?? null : null; + return { transaction, incident, prevTxnSig, nextTxnSig }; +} + +export async function fetchTransactionDetail(sig: string): Promise { + if (!USE_MOCK_API) { + try { + const raw = await getJson<{ + transaction: ApiGuardedTxnRow & { escalation: Record | null }; + incident: ApiIncidentRow | null; + prevTxnSig: string | null; + nextTxnSig: string | null; + }>(`/api/transactions/${encodeURIComponent(sig)}`); + + const { escalation: escRaw, ...txnRest } = raw.transaction; + const transaction: TransactionDetail = { + ...mapApiTxnRow(txnRest), + escalation: + escRaw && typeof escRaw === "object" + ? mapApiEscalationRow(escRaw as Record) + : null, + }; + + return { + transaction, + incident: raw.incident ? mapApiIncidentRow(raw.incident) : null, + prevTxnSig: raw.prevTxnSig, + nextTxnSig: raw.nextTxnSig, + }; + } catch (error) { + if (!isNetworkApiError(error)) throw error; + } + } + return mockTransactionDetail(sig); +} + +function mockWebhookStatus(): WebhookStatus { + const base = API_URL ?? "http://localhost:8080"; + return { + webhookUrl: `${base.replace(/\/$/, "")}/webhook`, + lastWebhookReceivedAt: null, + eventsReceivedLastHour: 0, + }; +} + +export async function fetchWebhookStatus(): Promise { + if (!USE_MOCK_API) { + try { + return await getJson("/api/settings/webhook-status"); + } catch (error) { + if (!isNetworkApiError(error)) throw error; + } + } + return mockWebhookStatus(); +} + +export async function fetchOperatorSession(): Promise { + if (!USE_MOCK_API) { + try { + return await getJson("/api/session"); + } catch (error) { + if (!isNetworkApiError(error)) throw error; + } + } + const owner = POLICIES[0]?.owner ?? ""; + return { + walletPubkey: owner, + expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(), + }; +} + +export async function fetchLlmSettings(): Promise { + if (!USE_MOCK_API) { + try { + return await getJson("/api/settings/llm"); + } catch (error) { + if (!isNetworkApiError(error)) throw error; + } + } + return { + judgeModel: "claude-haiku-4-5-20251001", + reportModel: "claude-haiku-4-5-20251001", + anthropicConfigured: false, + fallbackActive: true, + }; +} + +function mockAuditRows(): AuditRow[] { + const labelMap = new Map(POLICIES.map((p) => [p.pubkey, p.label])); + const ownerMap = new Map(POLICIES.map((p) => [p.pubkey, p.owner])); + const rows: AuditRow[] = []; + for (const inc of INCIDENTS) { + rows.push({ + id: `inc-pause-${inc.id}`, + timestamp: inc.pausedAt, + actionType: "pause", + policyPubkey: inc.policyPubkey, + policyLabel: labelMap.get(inc.policyPubkey) ?? null, + actor: inc.pausedBy, + details: inc.reason.length > 220 ? `${inc.reason.slice(0, 219)}…` : inc.reason, + relatedIncidentId: inc.id, + relatedTxnSig: inc.triggeringTxnSig, + relatedProposalId: null, + }); + if (inc.resolvedAt) { + rows.push({ + id: `inc-resume-${inc.id}`, + timestamp: inc.resolvedAt, + actionType: "resume", + policyPubkey: inc.policyPubkey, + policyLabel: labelMap.get(inc.policyPubkey) ?? null, + actor: ownerMap.get(inc.policyPubkey) ?? inc.pausedBy, + details: inc.resolution && inc.resolution.length > 0 ? inc.resolution : "Incident resolved", + relatedIncidentId: inc.id, + relatedTxnSig: inc.triggeringTxnSig, + relatedProposalId: null, + }); + } + } + rows.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()); + return rows; +} + +export async function fetchAuditLog(filters: AuditLogFilters): Promise<{ items: AuditRow[] }> { + if (!USE_MOCK_API) { + try { + const params = new URLSearchParams(); + if (filters.type && filters.type !== "all") params.set("type", filters.type); + if (filters.policyPubkey) params.set("policyPubkey", filters.policyPubkey); + if (filters.from) params.set("from", filters.from); + if (filters.to) params.set("to", filters.to); + const q = params.toString(); + return await getJson<{ items: AuditRow[] }>(`/api/audit${q ? `?${q}` : ""}`); + } catch (error) { + if (!isNetworkApiError(error)) throw error; + } + } + + let items = mockAuditRows(); + if (filters.type && filters.type !== "all") { + const allow = new Set(filters.type.split(",").map((s) => s.trim()).filter(Boolean)); + items = items.filter((r) => allow.has(r.actionType)); + } + if (filters.policyPubkey) { + items = items.filter((r) => r.policyPubkey === filters.policyPubkey); + } + if (filters.from) { + const t = new Date(filters.from).getTime(); + items = items.filter((r) => new Date(r.timestamp).getTime() >= t); + } + if (filters.to) { + const t = new Date(filters.to).getTime(); + items = items.filter((r) => new Date(r.timestamp).getTime() <= t); + } + return { items }; +} + +export async function deleteAuthSessions(): Promise<{ ok: true }> { + if (!USE_MOCK_API) { + return deleteJson<{ ok: true }>("/api/auth/sessions"); + } + return { ok: true }; +} + // --------------------------------------------------------------------------- // Policy label // --------------------------------------------------------------------------- @@ -583,8 +937,65 @@ export async function fetchEscalations( return escalations; } +function mockEscalationDetail(id: string): EscalationDetail { + const txnRow = TRANSACTIONS.find((t) => t.id === "d4e5f6a7-1001-4000-8000-000000000002"); + if (!txnRow) { + throw new Error("Mock escalation transaction missing"); + } + const verdict = verdictByTxnId.get(txnRow.id) ?? null; + const txn: TransactionSummary = { ...txnRow, verdict }; + const treasury = POLICIES.find((p) => p.pubkey === txn.policyPubkey); + if (!treasury) { + throw new Error("Mock treasury policy missing"); + } + const squads = treasury.squadsMultisig ?? "SMPLecH534Ngo6KPUV3GRbGN8D4BUXy4JUPq2YTJ1f"; + + return { + id, + policyPubkey: treasury.pubkey, + txnId: txn.id, + squadsMultisig: squads, + targetProgram: txn.targetProgram, + amountLamports: txn.amountLamports ?? "0", + proposalPda: null, + transactionIndex: null, + status: "awaiting_proposal", + approvals: [], + rejections: [], + executedTxnSig: null, + expiresAt: null, + createdAt: txn.createdAt, + updatedAt: txn.createdAt, + txn, + instruction: { + programId: txn.targetProgram, + data: "AQIDBAUGBwgJCgsMDQ4PEA==", + accounts: [ + { pubkey: treasury.agent, isSigner: false, isWritable: true }, + { pubkey: treasury.owner, isSigner: true, isWritable: false }, + ], + amountLamports: txn.amountLamports ?? "0", + }, + }; +} + export async function fetchEscalation(id: string): Promise { - return getJson(`/api/escalations/${id}`); + if (!USE_MOCK_API) { + try { + const raw = await getJson>(`/api/escalations/${encodeURIComponent(id)}`); + const txnRaw = raw.txn as ApiGuardedTxnRow; + const instruction = raw.instruction as EscalationDetail["instruction"]; + const summary = mapApiEscalationRow(raw); + return { + ...summary, + txn: mapApiTxnRow(txnRaw), + instruction, + }; + } catch (error) { + if (!isNetworkApiError(error)) throw error; + } + } + return mockEscalationDetail(id); } export async function updateEscalationProposal( diff --git a/dashboard/lib/api/query-keys.ts b/dashboard/lib/api/query-keys.ts index 756ded2..6f47feb 100644 --- a/dashboard/lib/api/query-keys.ts +++ b/dashboard/lib/api/query-keys.ts @@ -1,6 +1,11 @@ +/** Segments caches per SIWS-verified viewer (mock + wallet switch isolation). Empty string before hydration. */ +function viewerSegment(walletPubkey?: string | null): string { + return walletPubkey ?? ""; +} + export const queryKeys = { // Policy reads - policies: () => ["policies"] as const, + policies: (walletPubkey?: string | null) => ["policies", viewerSegment(walletPubkey)] as const, policy: (pubkey: string) => ["policy", pubkey] as const, // Backward-compatible alias while migrating existing callers. policyByPubkey: (pubkey: string) => ["policy", pubkey] as const, @@ -13,7 +18,8 @@ export const queryKeys = { ["transactions", "infinite", policyPubkey ?? "all", pageSize] as const, // Incident reads - incidents: () => ["incidents"] as const, + /** Fleet-wide incident list scoping — pair with pagination segment in hooks. */ + incidents: (walletPubkey?: string | null) => ["incidents", viewerSegment(walletPubkey)] as const, incidentsByPolicy: (policyPubkey: string) => ["incidents", policyPubkey] as const, incident: (incidentId: string) => ["incident", incidentId] as const, @@ -21,4 +27,16 @@ export const queryKeys = { escalations: () => ["escalations"] as const, escalationsByPolicy: (policyPubkey: string) => ["escalations", policyPubkey] as const, escalation: (id: string) => ["escalation", id] as const, + + fleetSummary: (walletPubkey?: string | null) => + ["fleet", "summary", viewerSegment(walletPubkey)] as const, + spendTrackers: (walletPubkey?: string | null) => + ["spend-trackers", viewerSegment(walletPubkey)] as const, + + transactionBySig: (sig: string) => ["transactions", "detail", sig] as const, + webhookStatus: () => ["settings", "webhook-status"] as const, + operatorSession: () => ["session"] as const, + llmSettings: () => ["settings", "llm"] as const, + auditLog: (filters: { type?: string; policyPubkey?: string; from?: string; to?: string }) => + ["audit", filters.type ?? "all", filters.policyPubkey ?? "", filters.from ?? "", filters.to ?? ""] as const, }; diff --git a/dashboard/lib/api/use-audit-log-query.ts b/dashboard/lib/api/use-audit-log-query.ts new file mode 100644 index 0000000..7598174 --- /dev/null +++ b/dashboard/lib/api/use-audit-log-query.ts @@ -0,0 +1,13 @@ +"use client"; + +import { useQuery } from "@tanstack/react-query"; +import { fetchAuditLog } from "@/lib/api/client"; +import type { AuditLogFilters } from "@/lib/types/dashboard"; +import { queryKeys } from "@/lib/api/query-keys"; + +export function useAuditLogQuery(filters: AuditLogFilters) { + return useQuery({ + queryKey: queryKeys.auditLog(filters), + queryFn: () => fetchAuditLog(filters), + }); +} diff --git a/dashboard/lib/api/use-escalation-query.ts b/dashboard/lib/api/use-escalation-query.ts new file mode 100644 index 0000000..b93221e --- /dev/null +++ b/dashboard/lib/api/use-escalation-query.ts @@ -0,0 +1,13 @@ +"use client"; + +import { useQuery } from "@tanstack/react-query"; +import { fetchEscalation } from "@/lib/api/client"; +import { queryKeys } from "@/lib/api/query-keys"; + +export function useEscalationQuery(id: string) { + return useQuery({ + queryKey: queryKeys.escalation(id), + queryFn: () => fetchEscalation(id), + enabled: Boolean(id), + }); +} diff --git a/dashboard/lib/api/use-fleet-summary-query.ts b/dashboard/lib/api/use-fleet-summary-query.ts new file mode 100644 index 0000000..82e5a68 --- /dev/null +++ b/dashboard/lib/api/use-fleet-summary-query.ts @@ -0,0 +1,14 @@ +"use client"; + +import { useQuery } from "@tanstack/react-query"; +import { fetchFleetSummary } from "@/lib/api/client"; +import { queryKeys } from "@/lib/api/query-keys"; +import { useSiwsAuthStore } from "@/lib/stores/siws-auth"; + +export function useFleetSummaryQuery() { + const viewerPubkey = useSiwsAuthStore((s) => s.siwsWallet); + return useQuery({ + queryKey: queryKeys.fleetSummary(viewerPubkey), + queryFn: () => fetchFleetSummary(viewerPubkey), + }); +} diff --git a/dashboard/lib/api/use-incident-query.ts b/dashboard/lib/api/use-incident-query.ts index db6ed48..660f8b0 100644 --- a/dashboard/lib/api/use-incident-query.ts +++ b/dashboard/lib/api/use-incident-query.ts @@ -3,11 +3,13 @@ import { useQuery } from "@tanstack/react-query"; import { fetchIncident } from "@/lib/api/client"; import { queryKeys } from "@/lib/api/query-keys"; +import { useSiwsAuthStore } from "@/lib/stores/siws-auth"; export function useIncidentQuery(incidentId: string) { + const viewerPubkey = useSiwsAuthStore((s) => s.siwsWallet); return useQuery({ queryKey: queryKeys.incident(incidentId), - queryFn: () => fetchIncident(incidentId), + queryFn: () => fetchIncident(incidentId, viewerPubkey), enabled: Boolean(incidentId), }); } diff --git a/dashboard/lib/api/use-incidents-query.ts b/dashboard/lib/api/use-incidents-query.ts index dbcc80a..65bed0a 100644 --- a/dashboard/lib/api/use-incidents-query.ts +++ b/dashboard/lib/api/use-incidents-query.ts @@ -3,13 +3,17 @@ import { useQuery } from "@tanstack/react-query"; import { fetchIncidents } from "@/lib/api/client"; import { queryKeys } from "@/lib/api/query-keys"; +import { useSiwsAuthStore } from "@/lib/stores/siws-auth"; export function useIncidentsQuery(policyPubkey?: string, limit = 25) { const pageSize = Math.max(1, limit); - const baseKey = policyPubkey ? queryKeys.incidentsByPolicy(policyPubkey) : queryKeys.incidents(); + const viewerPubkey = useSiwsAuthStore((s) => s.siwsWallet); + const baseKey = policyPubkey + ? queryKeys.incidentsByPolicy(policyPubkey) + : queryKeys.incidents(viewerPubkey); return useQuery({ queryKey: [...baseKey, pageSize] as const, - queryFn: () => fetchIncidents(policyPubkey, undefined, pageSize), + queryFn: () => fetchIncidents(policyPubkey, undefined, pageSize, viewerPubkey), }); } diff --git a/dashboard/lib/api/use-llm-settings-query.ts b/dashboard/lib/api/use-llm-settings-query.ts new file mode 100644 index 0000000..a5872ed --- /dev/null +++ b/dashboard/lib/api/use-llm-settings-query.ts @@ -0,0 +1,12 @@ +"use client"; + +import { useQuery } from "@tanstack/react-query"; +import { fetchLlmSettings } from "@/lib/api/client"; +import { queryKeys } from "@/lib/api/query-keys"; + +export function useLlmSettingsQuery() { + return useQuery({ + queryKey: queryKeys.llmSettings(), + queryFn: fetchLlmSettings, + }); +} diff --git a/dashboard/lib/api/use-operator-session-query.ts b/dashboard/lib/api/use-operator-session-query.ts new file mode 100644 index 0000000..2b5b7fe --- /dev/null +++ b/dashboard/lib/api/use-operator-session-query.ts @@ -0,0 +1,12 @@ +"use client"; + +import { useQuery } from "@tanstack/react-query"; +import { fetchOperatorSession } from "@/lib/api/client"; +import { queryKeys } from "@/lib/api/query-keys"; + +export function useOperatorSessionQuery() { + return useQuery({ + queryKey: queryKeys.operatorSession(), + queryFn: fetchOperatorSession, + }); +} diff --git a/dashboard/lib/api/use-policies-query.ts b/dashboard/lib/api/use-policies-query.ts index 9bb9fad..7fafe34 100644 --- a/dashboard/lib/api/use-policies-query.ts +++ b/dashboard/lib/api/use-policies-query.ts @@ -3,10 +3,12 @@ import { useQuery } from "@tanstack/react-query"; import { fetchPolicies } from "@/lib/api/client"; import { queryKeys } from "@/lib/api/query-keys"; +import { useSiwsAuthStore } from "@/lib/stores/siws-auth"; export function usePoliciesQuery() { + const viewerPubkey = useSiwsAuthStore((s) => s.siwsWallet); return useQuery({ - queryKey: queryKeys.policies(), - queryFn: fetchPolicies, + queryKey: queryKeys.policies(viewerPubkey), + queryFn: () => fetchPolicies(viewerPubkey), }); } diff --git a/dashboard/lib/api/use-policy-query.ts b/dashboard/lib/api/use-policy-query.ts index 4fd265e..238d67e 100644 --- a/dashboard/lib/api/use-policy-query.ts +++ b/dashboard/lib/api/use-policy-query.ts @@ -3,15 +3,17 @@ import { useQuery, useQueryClient } from "@tanstack/react-query"; import { fetchPolicy } from "@/lib/api/client"; import { queryKeys } from "@/lib/api/query-keys"; +import { useSiwsAuthStore } from "@/lib/stores/siws-auth"; import type { PolicySummary } from "@/lib/types/dashboard"; export function usePolicyQuery(pubkey: string) { const queryClient = useQueryClient(); + const viewerPubkey = useSiwsAuthStore((s) => s.siwsWallet); return useQuery({ queryKey: queryKeys.policy(pubkey), queryFn: async () => { try { - return await fetchPolicy(pubkey); + return await fetchPolicy(pubkey, viewerPubkey); } catch (error) { const cached = queryClient.getQueryData(queryKeys.policy(pubkey)); if (cached) return cached; diff --git a/dashboard/lib/api/use-recent-incidents-query.ts b/dashboard/lib/api/use-recent-incidents-query.ts new file mode 100644 index 0000000..bd43d42 --- /dev/null +++ b/dashboard/lib/api/use-recent-incidents-query.ts @@ -0,0 +1,8 @@ +"use client"; + +import { useIncidentsQuery } from "@/lib/api/use-incidents-query"; + +/** Recent incidents across all owned policies (fleet home). */ +export function useRecentIncidentsQuery(limit = 10) { + return useIncidentsQuery(undefined, limit); +} diff --git a/dashboard/lib/api/use-spend-trackers-query.ts b/dashboard/lib/api/use-spend-trackers-query.ts new file mode 100644 index 0000000..c592db1 --- /dev/null +++ b/dashboard/lib/api/use-spend-trackers-query.ts @@ -0,0 +1,14 @@ +"use client"; + +import { useQuery } from "@tanstack/react-query"; +import { fetchSpendTrackers } from "@/lib/api/client"; +import { queryKeys } from "@/lib/api/query-keys"; +import { useSiwsAuthStore } from "@/lib/stores/siws-auth"; + +export function useAllSpendTrackersQuery() { + const viewerPubkey = useSiwsAuthStore((s) => s.siwsWallet); + return useQuery({ + queryKey: queryKeys.spendTrackers(viewerPubkey), + queryFn: () => fetchSpendTrackers(viewerPubkey), + }); +} diff --git a/dashboard/lib/api/use-transaction-query.ts b/dashboard/lib/api/use-transaction-query.ts new file mode 100644 index 0000000..d346914 --- /dev/null +++ b/dashboard/lib/api/use-transaction-query.ts @@ -0,0 +1,13 @@ +"use client"; + +import { useQuery } from "@tanstack/react-query"; +import { fetchTransactionDetail } from "@/lib/api/client"; +import { queryKeys } from "@/lib/api/query-keys"; + +export function useTransactionQuery(sig: string) { + return useQuery({ + queryKey: queryKeys.transactionBySig(sig), + queryFn: () => fetchTransactionDetail(sig), + enabled: sig.length > 0, + }); +} diff --git a/dashboard/lib/api/use-webhook-status-query.ts b/dashboard/lib/api/use-webhook-status-query.ts new file mode 100644 index 0000000..cc9e085 --- /dev/null +++ b/dashboard/lib/api/use-webhook-status-query.ts @@ -0,0 +1,12 @@ +"use client"; + +import { useQuery } from "@tanstack/react-query"; +import { fetchWebhookStatus } from "@/lib/api/client"; +import { queryKeys } from "@/lib/api/query-keys"; + +export function useWebhookStatusQuery() { + return useQuery({ + queryKey: queryKeys.webhookStatus(), + queryFn: fetchWebhookStatus, + }); +} diff --git a/dashboard/lib/playground/constants.ts b/dashboard/lib/playground/constants.ts new file mode 100644 index 0000000..07b4593 --- /dev/null +++ b/dashboard/lib/playground/constants.ts @@ -0,0 +1,31 @@ +import type { PrefilterSignal } from "./types"; + +/** Program pubkey options in the crafter dropdown (labels via PROGRAM_LABELS in policies) */ +export const PLAYGROUND_PROGRAM_OPTIONS: { value: string; label: string }[] = [ + { value: "11111111111111111111111111111111", label: "System Program" }, + { value: "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", label: "Jupiter v6" }, + { value: "MrNEdFKsp4MSGPoQwnZqSxUYEbBYaxQGTdCSg1vmDVJ", label: "Marinade Finance" }, + { value: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", label: "Token Program" }, + { value: "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263", label: "Unknown" }, +]; + +export const SIGNAL_WEIGHTS: Record = { + burst_detected: 30, + high_amount: 20, + budget_nearly_exhausted: 20, + new_or_uncommon_program: 15, + outside_active_hours: 10, + session_expiring_soon: 10, + elevated_frequency: 10, +}; + +export const DEFAULT_CRAFTER_PARAMS = { + policyPubkey: null as string | null, + targetProgram: PLAYGROUND_PROGRAM_OPTIONS[1]!.value, + amountSol: 2, + velocityPerMin: 2, + budgetConsumedPercent: 35, + sessionRemaining: "gt24h" as const, + isProgramNew: false, + outsideActiveHours: false, +}; diff --git a/dashboard/lib/playground/engine.ts b/dashboard/lib/playground/engine.ts new file mode 100644 index 0000000..5d81c4a --- /dev/null +++ b/dashboard/lib/playground/engine.ts @@ -0,0 +1,134 @@ +import { SIGNAL_WEIGHTS } from "./constants"; +import type { + CrafterParams, + PlaygroundPolicySlice, + PlaygroundVerdict, + PrefilterSignal, + SimulationResult, +} from "./types"; + +export function computeDangerScore(signals: PrefilterSignal[]): number { + let sum = 0; + for (const s of signals) { + sum += SIGNAL_WEIGHTS[s] ?? 0; + } + return Math.min(100, Math.max(0, sum)); +} + +export function computeSignals(params: CrafterParams, policy: PlaygroundPolicySlice): PrefilterSignal[] { + const signals: PrefilterSignal[] = []; + const maxTxLamports = Number(policy.maxTxLamports || 0); + const maxTxSol = maxTxLamports > 0 ? maxTxLamports / 1e9 : 0; + + if (maxTxSol > 0 && params.amountSol > 0) { + const pctOfCap = (params.amountSol / maxTxSol) * 100; + if (pctOfCap > 70) signals.push("high_amount"); + } + + if (params.velocityPerMin >= 5) signals.push("burst_detected"); + else if (params.velocityPerMin >= 3) signals.push("elevated_frequency"); + + if (params.budgetConsumedPercent > 80) signals.push("budget_nearly_exhausted"); + + const uncommon = params.isProgramNew || !policy.allowedPrograms.includes(params.targetProgram); + if (uncommon) signals.push("new_or_uncommon_program"); + + if (params.outsideActiveHours) signals.push("outside_active_hours"); + + if (params.sessionRemaining === "lt10min") signals.push("session_expiring_soon"); + + return signals; +} + +export function determineVerdict( + signals: PrefilterSignal[], + dangerScore: number, + sessionRemaining: CrafterParams["sessionRemaining"], +): { verdict: PlaygroundVerdict; confidence: number } { + if (sessionRemaining === "expired") { + return { verdict: "pause", confidence: 99 }; + } + + const hasBurst = signals.includes("burst_detected"); + const hasHigh = signals.includes("high_amount"); + if (hasBurst && hasHigh) { + return { verdict: "pause", confidence: 95 }; + } + + if (signals.length === 0) { + return { verdict: "allow", confidence: 90 }; + } + + let verdict: PlaygroundVerdict = + dangerScore <= 30 ? "allow" : dangerScore <= 50 ? "flag" : "pause"; + + let confidence: number; + if (signals.length === 1) { + confidence = verdict === "flag" ? 52 : verdict === "pause" ? 82 : 72; + } else if (signals.length === 2) { + confidence = verdict === "flag" ? 65 : verdict === "pause" ? 84 : 68; + } else { + confidence = Math.min(95, 78 + signals.length * 4); + } + + if (dangerScore > 50 && verdict === "flag") { + verdict = "pause"; + confidence = Math.max(confidence, 85); + } + + return { verdict, confidence }; +} + +const SIGNAL_COPY: Record = { + burst_detected: "Burst-like velocity detected (≥5 tx/min).", + elevated_frequency: "Elevated frequency (3–4 tx/min).", + high_amount: "Amount exceeds ~70% of the per-transaction cap.", + budget_nearly_exhausted: "Daily budget consumption is critically high (>80%).", + new_or_uncommon_program: "Target program is uncommon relative to policy.", + outside_active_hours: "Activity falls outside typical active hours.", + session_expiring_soon: "Agent session expires within ~10 minutes.", +}; + +export function generateReasoning(signals: PrefilterSignal[], verdict: PlaygroundVerdict): string { + if (signals.length === 0) { + return "No prefilter signals fired — routing consistent with a benign pattern."; + } + const parts = signals.map((s) => SIGNAL_COPY[s]); + const tail = + verdict === "pause" + ? "Combined posture warrants halting execution pending human review." + : verdict === "flag" + ? "Elevated risk — queue for asynchronous review." + : "Residual risk acceptable under configured thresholds."; + return `${parts.join(" ")} ${tail}`; +} + +export function simulateLatency(): number { + return Math.floor(800 + Math.random() * 1700); +} + +export function runSimulation(params: CrafterParams, policy: PlaygroundPolicySlice): SimulationResult { + const signals = computeSignals(params, policy); + const dangerScore = computeDangerScore(signals); + const prefilterSkipped = signals.length === 0 && params.sessionRemaining !== "expired"; + const { verdict, confidence } = determineVerdict(signals, dangerScore, params.sessionRemaining); + + let reasoning: string; + if (prefilterSkipped) { + reasoning = + "Prefilter skipped the LLM judge — no anomaly signals matched configured thresholds."; + } else { + reasoning = generateReasoning(signals, verdict); + } + + return { + signals, + dangerScore, + verdict, + confidence, + reasoning, + prefilterSkipped, + latencyMs: simulateLatency(), + model: "guardian", + }; +} diff --git a/dashboard/lib/playground/scenarios.ts b/dashboard/lib/playground/scenarios.ts new file mode 100644 index 0000000..2086703 --- /dev/null +++ b/dashboard/lib/playground/scenarios.ts @@ -0,0 +1,82 @@ +import { DEFAULT_CRAFTER_PARAMS, PLAYGROUND_PROGRAM_OPTIONS } from "./constants"; +import type { CrafterParams } from "./types"; + +const JUP = PLAYGROUND_PROGRAM_OPTIONS[1]!.value; +const UNKNOWN = PLAYGROUND_PROGRAM_OPTIONS[4]!.value; + +export interface ScenarioDefinition { + id: string; + name: string; + description: string; + /** Partial overrides merged onto defaults for each simulated transaction step */ + steps: Partial[]; +} + +export const SCENARIOS: ScenarioDefinition[] = [ + { + id: "normal-trade", + name: "Normal Trade", + description: "Three small swaps on Jupiter within limits.", + steps: [ + { amountSol: 0.8, velocityPerMin: 2, budgetConsumedPercent: 12, targetProgram: JUP }, + { amountSol: 1.1, velocityPerMin: 2, budgetConsumedPercent: 18, targetProgram: JUP }, + { amountSol: 0.9, velocityPerMin: 2, budgetConsumedPercent: 22, targetProgram: JUP }, + ], + }, + { + id: "high-value-single", + name: "High-Value Single", + description: "One transaction near the configured cap.", + steps: [{ amountSol: 38, velocityPerMin: 2, budgetConsumedPercent: 40, targetProgram: JUP }], + }, + { + id: "gradual-drain", + name: "Gradual Drain", + description: "Escalating utilization toward pause territory.", + steps: [ + { amountSol: 10, velocityPerMin: 2, budgetConsumedPercent: 55, targetProgram: JUP }, + { amountSol: 18, velocityPerMin: 2, budgetConsumedPercent: 62, targetProgram: JUP }, + { amountSol: 28, velocityPerMin: 3, budgetConsumedPercent: 74, targetProgram: JUP }, + { amountSol: 33, velocityPerMin: 3, budgetConsumedPercent: 82, targetProgram: JUP }, + { amountSol: 42, velocityPerMin: 4, budgetConsumedPercent: 91, targetProgram: JUP }, + ], + }, + { + id: "burst-attack", + name: "Burst Attack", + description: "Rapid-fire transactions toward an uncommon program.", + steps: [ + { amountSol: 1.5, velocityPerMin: 3, budgetConsumedPercent: 25, targetProgram: UNKNOWN, isProgramNew: true }, + { amountSol: 2.2, velocityPerMin: 5, budgetConsumedPercent: 35, targetProgram: UNKNOWN, isProgramNew: true }, + { amountSol: 2.8, velocityPerMin: 6, budgetConsumedPercent: 48, targetProgram: UNKNOWN, isProgramNew: true }, + { amountSol: 3.5, velocityPerMin: 7, budgetConsumedPercent: 58, targetProgram: UNKNOWN, isProgramNew: true }, + { amountSol: 4.2, velocityPerMin: 8, budgetConsumedPercent: 72, targetProgram: UNKNOWN, isProgramNew: true }, + { amountSol: 5.1, velocityPerMin: 9, budgetConsumedPercent: 85, targetProgram: UNKNOWN, isProgramNew: true }, + ], + }, + { + id: "off-hours", + name: "Off-Hours Activity", + description: "Otherwise normal swap flagged by schedule heuristic.", + steps: [{ amountSol: 2, velocityPerMin: 2, budgetConsumedPercent: 30, outsideActiveHours: true, targetProgram: JUP }], + }, + { + id: "budget-exhaustion", + name: "Budget Exhaustion", + description: "Repeated spends pushing utilization toward exhaustion.", + steps: [ + { amountSol: 8, velocityPerMin: 2, budgetConsumedPercent: 52, targetProgram: JUP }, + { amountSol: 10, velocityPerMin: 2, budgetConsumedPercent: 68, targetProgram: JUP }, + { amountSol: 12, velocityPerMin: 3, budgetConsumedPercent: 83, targetProgram: JUP }, + { amountSol: 14, velocityPerMin: 3, budgetConsumedPercent: 92, targetProgram: JUP }, + ], + }, +]; + +export function mergeScenarioStep(step: Partial): CrafterParams { + return { + ...DEFAULT_CRAFTER_PARAMS, + ...step, + policyPubkey: step.policyPubkey ?? DEFAULT_CRAFTER_PARAMS.policyPubkey, + }; +} diff --git a/dashboard/lib/playground/types.ts b/dashboard/lib/playground/types.ts new file mode 100644 index 0000000..99e61e9 --- /dev/null +++ b/dashboard/lib/playground/types.ts @@ -0,0 +1,49 @@ +import type { Policy } from "@/lib/mock/policies"; + +/** Signals modeled after PLAYGROUND.md § Signal Inspector */ +export type PrefilterSignal = + | "burst_detected" + | "high_amount" + | "budget_nearly_exhausted" + | "new_or_uncommon_program" + | "outside_active_hours" + | "session_expiring_soon" + | "elevated_frequency"; + +export type SessionRemainingBucket = "gt24h" | "h1to6" | "m30" | "lt10min" | "expired"; + +export type PlaygroundVerdict = "allow" | "flag" | "pause"; + +export interface CrafterParams { + policyPubkey: string | null; + targetProgram: string; + amountSol: number; + velocityPerMin: number; + budgetConsumedPercent: number; + sessionRemaining: SessionRemainingBucket; + isProgramNew: boolean; + outsideActiveHours: boolean; +} + +export interface SimulationResult { + signals: PrefilterSignal[]; + dangerScore: number; + verdict: PlaygroundVerdict; + confidence: number; + reasoning: string; + prefilterSkipped: boolean; + latencyMs: number; + model: "guardian"; +} + +export type PlaygroundTab = "simulate" | "inspect" | "learn"; + +export type ScenarioPlayback = { + scenarioId: string; + stepIndex: number; + stepResults: SimulationResult[]; + isPlaying: boolean; +}; + +/** Narrow policy fields the engine needs */ +export type PlaygroundPolicySlice = Pick; diff --git a/dashboard/lib/sse/query-cache-helpers.ts b/dashboard/lib/sse/query-cache-helpers.ts index 0f9caa0..3b8b484 100644 --- a/dashboard/lib/sse/query-cache-helpers.ts +++ b/dashboard/lib/sse/query-cache-helpers.ts @@ -13,10 +13,10 @@ import type { export const MAX_FEED_ITEMS = 200; export function updateIfExists(queryClient: QueryClient, key: QueryKey, updater: (old: T) => T): void { - const existing = queryClient.getQueryData(key); - if (existing !== undefined) { - queryClient.setQueryData(key, updater(existing)); - } + queryClient.setQueriesData({ queryKey: key }, (old) => { + if (old === undefined) return old; + return updater(old); + }); } function capItems(items: T[], max: number): T[] { @@ -272,12 +272,12 @@ export function applyAgentPausedEvent(queryClient: QueryClient, raw: unknown): v const incident = sseAgentPausedToIncidentSummary(raw); const policyPubkey = incident.policyPubkey; - setIncidentListQueriesData(queryClient, queryKeys.incidents(), (old) => prependIncident(old, incident)); + setIncidentListQueriesData(queryClient, ["incidents"], (old) => prependIncident(old, incident)); setIncidentListQueriesData(queryClient, queryKeys.incidentsByPolicy(policyPubkey), (old) => prependIncident(old, incident), ); - updateIfExists(queryClient, queryKeys.policies(), (old) => + updateIfExists(queryClient, ["policies"], (old) => old.map((p) => (p.pubkey === policyPubkey ? { ...p, isActive: false } : p)), ); @@ -304,7 +304,7 @@ export function applyReportReadyEvent(queryClient: QueryClient, raw: unknown): v items: old.items.map((inc) => (inc.id === incidentId ? { ...inc, fullReport } : inc)), }); - setIncidentListQueriesData(queryClient, queryKeys.incidents(), patchList); + setIncidentListQueriesData(queryClient, ["incidents"], patchList); if (policyPubkey) { setIncidentListQueriesData(queryClient, queryKeys.incidentsByPolicy(policyPubkey), patchList); } @@ -340,5 +340,11 @@ export function applyAgentRotatedEvent( if (payload.oldPolicyPubkey) { queryClient.removeQueries({ queryKey: queryKeys.policy(payload.oldPolicyPubkey) }); } - queryClient.invalidateQueries({ queryKey: queryKeys.policies() }); + queryClient.invalidateQueries({ queryKey: ["policies"] }); +} + +/** Refetch fleet aggregates + spend trackers after SSE mutations. */ +export function invalidateFleetQueries(queryClient: QueryClient): void { + void queryClient.invalidateQueries({ queryKey: ["fleet"] }); + void queryClient.invalidateQueries({ queryKey: ["spend-trackers"] }); } diff --git a/dashboard/lib/sse/useSSE.ts b/dashboard/lib/sse/useSSE.ts index 060ebe4..b045bdf 100644 --- a/dashboard/lib/sse/useSSE.ts +++ b/dashboard/lib/sse/useSSE.ts @@ -1,7 +1,9 @@ "use client"; +import type { QueryClient } from "@tanstack/react-query"; import { useQueryClient } from "@tanstack/react-query"; import { useEffect, useRef } from "react"; +import { queryKeys } from "@/lib/api/query-keys"; import { applyAgentPausedEvent, applyAgentRotatedEvent, @@ -9,13 +11,43 @@ import { applyNewTransactionEvent, applyReportReadyEvent, applyVerdictEvent, + invalidateFleetQueries, } from "@/lib/sse/query-cache-helpers"; +import { useSSEEventLogStore } from "@/lib/stores/sse-event-log"; const API_URL = process.env.NEXT_PUBLIC_API_URL?.replace(/\/$/, ""); const USE_MOCK_API = process.env.NEXT_PUBLIC_USE_MOCK_API === "true" || !API_URL; const INITIAL_BACKOFF_MS = 1000; const MAX_BACKOFF_MS = 30_000; +type SSEListener = (event: { type: string; payload: unknown }) => void; +const listeners = new Set(); + +export function subscribeSSEEvents(listener: SSEListener): () => void { + listeners.add(listener); + return () => { + listeners.delete(listener); + }; +} + +/** SSE types that should trigger a fleet summary / spend-trackers refetch */ +const fleetInvalidateTypes = new Set([ + "new_transaction", + "verdict", + "agent_paused", + "agent_rotated", + "escalation_created", + "escalation_updated", + "policy_closed", +]); + +function pushFleetAwareSSE(qc: QueryClient, type: string, raw: unknown): void { + useSSEEventLogStore.getState().push(type, raw); + listeners.forEach((listener) => listener({ type, payload: raw })); + if (fleetInvalidateTypes.has(type)) { + invalidateFleetQueries(qc); + } +} export function useSSE(): void { const queryClient = useQueryClient(); @@ -51,51 +83,75 @@ export function useSSE(): void { }); const qc = queryClientRef.current; + eventSource.addEventListener("new_transaction", (e) => { try { - applyNewTransactionEvent(qc, JSON.parse(e.data)); + const raw = JSON.parse(e.data); + applyNewTransactionEvent(qc, raw); + pushFleetAwareSSE(qc, "new_transaction", raw); } catch { /* ignore malformed SSE */ } }); eventSource.addEventListener("verdict", (e) => { try { - applyVerdictEvent(qc, JSON.parse(e.data)); + const raw = JSON.parse(e.data); + applyVerdictEvent(qc, raw); + pushFleetAwareSSE(qc, "verdict", raw); } catch { /* ignore */ } }); eventSource.addEventListener("agent_paused", (e) => { try { - applyAgentPausedEvent(qc, JSON.parse(e.data)); + const raw = JSON.parse(e.data); + applyAgentPausedEvent(qc, raw); + pushFleetAwareSSE(qc, "agent_paused", raw); } catch { /* ignore */ } }); eventSource.addEventListener("report_ready", (e) => { try { - applyReportReadyEvent(qc, JSON.parse(e.data)); + const raw = JSON.parse(e.data); + applyReportReadyEvent(qc, raw); + useSSEEventLogStore.getState().push("report_ready", raw); } catch { /* ignore */ } }); eventSource.addEventListener("escalation_created", (e) => { try { - applyEscalationEvent(qc, JSON.parse(e.data)); + const raw = JSON.parse(e.data); + applyEscalationEvent(qc, raw); + pushFleetAwareSSE(qc, "escalation_created", raw); } catch { /* ignore */ } }); eventSource.addEventListener("escalation_updated", (e) => { try { - applyEscalationEvent(qc, JSON.parse(e.data)); + const raw = JSON.parse(e.data); + applyEscalationEvent(qc, raw); + pushFleetAwareSSE(qc, "escalation_updated", raw); } catch { /* ignore */ } }); eventSource.addEventListener("agent_rotated", (e) => { try { - applyAgentRotatedEvent(qc, JSON.parse(e.data)); + const raw = JSON.parse(e.data); + applyAgentRotatedEvent(qc, raw); + pushFleetAwareSSE(qc, "agent_rotated", raw); + } catch { + /* ignore */ + } + }); + eventSource.addEventListener("policy_closed", (e) => { + try { + const raw = JSON.parse(e.data); + qc.invalidateQueries({ queryKey: ["policies"] }); + pushFleetAwareSSE(qc, "policy_closed", raw); } catch { /* ignore */ } diff --git a/dashboard/lib/stores/playground.ts b/dashboard/lib/stores/playground.ts new file mode 100644 index 0000000..74cd7cc --- /dev/null +++ b/dashboard/lib/stores/playground.ts @@ -0,0 +1,103 @@ +import { create } from "zustand"; +import { DEFAULT_CRAFTER_PARAMS } from "@/lib/playground/constants"; +import type { + CrafterParams, + PlaygroundTab, + ScenarioPlayback, + SimulationResult, + PrefilterSignal, +} from "@/lib/playground/types"; + +const ALL_SIGNALS: PrefilterSignal[] = [ + "burst_detected", + "high_amount", + "budget_nearly_exhausted", + "new_or_uncommon_program", + "outside_active_hours", + "session_expiring_soon", + "elevated_frequency", +]; + +function initialInspector(): Record { + return Object.fromEntries(ALL_SIGNALS.map((s) => [s, false])) as Record; +} + +export type SandboxOverrides = { + maxTxSol: number; + dailyBudgetSol: number; +}; + +interface PlaygroundState { + activeTab: PlaygroundTab; + crafterParams: CrafterParams; + crafterResult: SimulationResult | null; + crafterRunning: boolean; + crafterProgress: number; + + playback: ScenarioPlayback | null; + + inspectorSignals: Record; + + killSwitchState: "active" | "paused"; + + sandboxOverrides: SandboxOverrides; + + setActiveTab: (t: PlaygroundTab) => void; + setCrafterParams: (p: Partial) => void; + setCrafterResult: (r: SimulationResult | null) => void; + setCrafterRunning: (v: boolean) => void; + setCrafterProgress: (n: number) => void; + + setPlayback: (p: ScenarioPlayback | null) => void; + + toggleInspectorSignal: (s: PrefilterSignal) => void; + resetInspector: () => void; + + setKillSwitchState: (s: "active" | "paused") => void; + + setSandboxOverrides: (p: Partial) => void; +} + +export const usePlaygroundStore = create((set) => ({ + activeTab: "simulate", + crafterParams: { ...DEFAULT_CRAFTER_PARAMS }, + crafterResult: null, + crafterRunning: false, + crafterProgress: 0, + + playback: null, + + inspectorSignals: initialInspector(), + + killSwitchState: "active", + + sandboxOverrides: { maxTxSol: 5, dailyBudgetSol: 50 }, + + setActiveTab: (activeTab) => set({ activeTab }), + setCrafterParams: (partial) => + set((s) => ({ + crafterParams: { ...s.crafterParams, ...partial }, + })), + setCrafterResult: (crafterResult) => set({ crafterResult }), + setCrafterRunning: (crafterRunning) => set({ crafterRunning }), + setCrafterProgress: (crafterProgress) => set({ crafterProgress }), + + setPlayback: (playback) => set({ playback }), + + toggleInspectorSignal: (sig) => + set((s) => ({ + inspectorSignals: { ...s.inspectorSignals, [sig]: !s.inspectorSignals[sig] }, + })), + resetInspector: () => set({ inspectorSignals: initialInspector() }), + + setKillSwitchState: (killSwitchState) => set({ killSwitchState }), + + setSandboxOverrides: (partial) => + set((s) => ({ + sandboxOverrides: { ...s.sandboxOverrides, ...partial }, + })), +})); + +export function inspectorSignalsToList(map: Record): PrefilterSignal[] { + return ALL_SIGNALS.filter((s) => map[s]); +} diff --git a/dashboard/lib/stores/sse-event-log.ts b/dashboard/lib/stores/sse-event-log.ts new file mode 100644 index 0000000..e8b24b0 --- /dev/null +++ b/dashboard/lib/stores/sse-event-log.ts @@ -0,0 +1,32 @@ +import { create } from "zustand"; + +export type SSELogEntry = { + id: string; + type: string; + payload: unknown; + receivedAt: string; +}; + +const MAX_ENTRIES = 50; + +type SSEEventLogState = { + entries: SSELogEntry[]; + push: (type: string, payload: unknown) => void; +}; + +/** Ring buffer of recent SSE payloads for terminal-style views (e.g. fleet dashboard). */ +export const useSSEEventLogStore = create((set) => ({ + entries: [], + push: (type, payload) => + set((s) => ({ + entries: [ + ...s.entries, + { + id: `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`, + type, + payload, + receivedAt: new Date().toISOString(), + }, + ].slice(-MAX_ENTRIES), + })), +})); diff --git a/dashboard/lib/types/dashboard.ts b/dashboard/lib/types/dashboard.ts index f486cf6..193cf36 100644 --- a/dashboard/lib/types/dashboard.ts +++ b/dashboard/lib/types/dashboard.ts @@ -64,3 +64,96 @@ export interface EscalationDetail extends EscalationSummary { amountLamports: string; } | null; } + +/** GET /api/fleet/summary */ +export interface FleetSummary { + activeAgents: number; + pausedAgents: number; + incidentsLast24h: number; + incidentsPrev24h: number; + totalLamportsSpent24h: string; + /** Historical spend snapshots not persisted — reserved for future use */ + totalLamportsSpentPrev24h: string | null; +} + +/** GET /api/spend-trackers — row shape after JSON serialization */ +export interface SpendTrackerRow { + policyPubkey: string; + windowStart: string; + txnCount24h: number; + lamportsSpent24h: string; + lastTxnTs: string; + lastTxnProgram: string; + uniqueDestinations24h: number; + maxSingleTxnLamports: string; + failedTxnCount24h: number; + uniquePrograms24h: number; + lamportsSpent1h: string; + windowStart1h: string; + consecutiveHighAmountCount: number; + updatedAt: string; + policy: { + label: string | null; + isActive: boolean; + anomalyScore: number; + dailyBudgetLamports: string; + }; +} + +/** Guarded txn + nested escalation from GET /api/transactions/:sig */ +export interface TransactionDetail extends TransactionSummary { + escalation: EscalationSummary | null; +} + +export interface TransactionDetailResponse { + transaction: TransactionDetail; + incident: IncidentSummary | null; + prevTxnSig: string | null; + nextTxnSig: string | null; +} + +export interface WebhookStatus { + webhookUrl: string; + lastWebhookReceivedAt: string | null; + eventsReceivedLastHour: number; +} + +export interface OperatorSession { + walletPubkey: string; + expiresAt: string | null; +} + +export interface LLMSettingsInfo { + judgeModel: string; + reportModel: string; + anthropicConfigured: boolean; + fallbackActive: boolean; +} + +export type AuditActionType = + | "pause" + | "resume" + | "rotate_key" + | "close_policy" + | "escalation_created" + | "escalation_updated"; + +export interface AuditRow { + id: string; + timestamp: string; + actionType: AuditActionType; + policyPubkey: string; + policyLabel: string | null; + actor: string; + details: string; + relatedIncidentId: string | null; + relatedTxnSig: string | null; + relatedProposalId: string | null; +} + +export interface AuditLogFilters { + type?: string; + policyPubkey?: string; + from?: string; + to?: string; +} diff --git a/dashboard/lib/utils.ts b/dashboard/lib/utils.ts index 52e5953..daeb6ea 100644 --- a/dashboard/lib/utils.ts +++ b/dashboard/lib/utils.ts @@ -2,6 +2,8 @@ import { PROGRAM_LABELS } from "@/lib/mock/policies"; import type { PolicySummary } from "@/lib/types/dashboard"; import { clsx, type ClassValue } from "clsx" import { twMerge } from "tailwind-merge" +import { formatSol } from "@/lib/utils/format"; +import { formatRelativeTime, formatRelativeTooltip } from "@/lib/utils/time"; export function shortAddress(value: string, start = 4, end = 4): string { if (!value) return ""; @@ -16,6 +18,8 @@ export function lamportsToSol(value: string | number | null | undefined): number return num / 1_000_000_000; } +export { formatSol, formatRelativeTime, formatRelativeTooltip }; + export function programLabel(program: string): string { return PROGRAM_LABELS[program] ?? shortAddress(program, 6, 4); } @@ -28,19 +32,8 @@ export function formatDateTime(value: string): string { return new Date(value).toLocaleString(); } -export function formatRelativeTime(value: string): string { - const diffMs = new Date(value).getTime() - Date.now(); - const absMs = Math.abs(diffMs); - const absDays = Math.round(absMs / 86_400_000); - if (absDays >= 1) return diffMs >= 0 ? `in ${absDays}d` : `${absDays}d ago`; - const absHours = Math.round(absMs / 3_600_000); - if (absHours >= 1) return diffMs >= 0 ? `in ${absHours}h` : `${absHours}h ago`; - const absMins = Math.max(0, Math.round(absMs / 60_000)); - return diffMs >= 0 ? `in ${absMins}m` : `${absMins}m ago`; -} - export function statusTone(policy: PolicySummary): "green" | "amber" | "red" { - if (!policy.isActive) return "red"; + if (!policy.isActive) return "amber"; if (new Date(policy.sessionExpiry).getTime() < Date.now()) return "amber"; return "green"; } diff --git a/dashboard/lib/utils/escalation-display.ts b/dashboard/lib/utils/escalation-display.ts new file mode 100644 index 0000000..4afee5c --- /dev/null +++ b/dashboard/lib/utils/escalation-display.ts @@ -0,0 +1,33 @@ +/** Shared escalation proposal chips — keep dashboard wording consistent */ + +export function escalationTone(status: string): "green" | "amber" | "red" { + switch (status) { + case "executed": + return "green"; + case "pending": + case "approved": + case "awaiting_proposal": + return "amber"; + default: + return "red"; + } +} + +export function escalationLabel(status: string): string { + switch (status) { + case "awaiting_proposal": + return "AWAITING PROPOSAL"; + case "pending": + return "PENDING APPROVAL"; + case "approved": + return "APPROVED"; + case "executed": + return "EXECUTED"; + case "rejected": + return "REJECTED"; + case "cancelled": + return "CANCELLED"; + default: + return status.toUpperCase(); + } +} diff --git a/dashboard/lib/utils/format.ts b/dashboard/lib/utils/format.ts new file mode 100644 index 0000000..dc22ba9 --- /dev/null +++ b/dashboard/lib/utils/format.ts @@ -0,0 +1,18 @@ +export function formatSol(lamports: bigint | number | string): string { + const raw = + typeof lamports === "bigint" + ? Number(lamports) + : typeof lamports === "string" + ? Number(lamports) + : lamports; + + if (!Number.isFinite(raw)) return "◎0"; + + const sol = raw / 1_000_000_000; + + if (sol === 0) return "◎0"; + if (sol < 0.001) return `◎${sol.toFixed(6)}`; + if (sol < 1) return `◎${sol.toFixed(4)}`; + if (sol < 100) return `◎${sol.toFixed(2)}`; + return `◎${sol.toFixed(1)}`; +} diff --git a/dashboard/lib/utils/time.ts b/dashboard/lib/utils/time.ts new file mode 100644 index 0000000..8a61665 --- /dev/null +++ b/dashboard/lib/utils/time.ts @@ -0,0 +1,29 @@ +export function formatRelativeTime(date: Date | string): string { + const d = typeof date === "string" ? new Date(date) : date; + const diffMs = Date.now() - d.getTime(); + const diffMins = Math.floor(diffMs / 60_000); + const diffHours = Math.floor(diffMs / 3_600_000); + + if (diffMins < 1) return "just now"; + if (diffMins < 60) return `${diffMins}m ago`; + if (diffHours < 6) return `${diffHours}h ago`; + + return d.toLocaleString(undefined, { + month: "short", + day: "numeric", + hour: "2-digit", + minute: "2-digit", + }); +} + +export function formatRelativeTooltip(date: Date | string): string { + const d = typeof date === "string" ? new Date(date) : date; + return d.toLocaleString(undefined, { + year: "numeric", + month: "short", + day: "numeric", + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + }); +} diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json index 463ae68..5cd31fb 100644 --- a/dashboard/package-lock.json +++ b/dashboard/package-lock.json @@ -17,6 +17,7 @@ "@solana/web3.js": "^1.95.0", "@sqds/multisig": "^2.1.4", "@tanstack/react-query": "^5.50.0", + "@tanstack/react-query-devtools": "^5.100.6", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "dotenv": "^17.4.2", @@ -9516,9 +9517,19 @@ } }, "node_modules/@tanstack/query-core": { - "version": "5.99.2", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.99.2.tgz", - "integrity": "sha512-1HunU0bXVsR1ZJMZbcOPE6VtaBJxsW809RE9xPe4Gz7MlB0GWwQvuTPhMoEmQ/hIzFKJ/DWAuttIe7BOaWx0tA==", + "version": "5.100.6", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.100.6.tgz", + "integrity": "sha512-Os2CPUr98to98RYm+D4qGqGkiffn7MGSyl2547a4MljVkHE30AMJRqTiyCqBfMwzAx/I91vCkAxp5tHSla6Twg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/query-devtools": { + "version": "5.100.6", + "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.100.6.tgz", + "integrity": "sha512-2SiNwlOiAdTbqktCSmwlXZH8x8mckSbES2O0bdr3qZNhdQl5DCtImZx0S3HGeNHWTIkzTaHx2Isg+bD4M3WRIg==", "license": "MIT", "funding": { "type": "github", @@ -9526,18 +9537,35 @@ } }, "node_modules/@tanstack/react-query": { - "version": "5.99.2", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.99.2.tgz", - "integrity": "sha512-vM91UEe45QUS9ED6OklsVL15i8qKcRqNwpWzPTVWvRPRSEgDudDgHpvyTjcdlwHcrKNa80T+xXYcchT2noPnZA==", + "version": "5.100.6", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.100.6.tgz", + "integrity": "sha512-uVSrps0PV16Cxmcn2rvL+dUhwTpTUtiRW347AEeYxMZXO2pZe9ja7E24PAMGoQ5u2g89DD8u4QhOviBk+RN8RA==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.100.6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@tanstack/react-query-devtools": { + "version": "5.100.6", + "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.100.6.tgz", + "integrity": "sha512-sz3ksMKA2t1rx0+Odzb0x1A3pXH/SVf7fzlzd3sKXzwXz8980f5sbOwfQD6+UfTG8G4Y2KaIg9e3sBn+uC4VTg==", "license": "MIT", "dependencies": { - "@tanstack/query-core": "5.99.2" + "@tanstack/query-devtools": "5.100.6" }, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { + "@tanstack/react-query": "^5.100.6", "react": "^18 || ^19" } }, diff --git a/dashboard/package.json b/dashboard/package.json index 60040ef..aa5adce 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -25,6 +25,7 @@ "@solana/web3.js": "^1.95.0", "@sqds/multisig": "^2.1.4", "@tanstack/react-query": "^5.50.0", + "@tanstack/react-query-devtools": "^5.100.6", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "dotenv": "^17.4.2", diff --git a/server/src/__tests__/api/routes/fleet-spend-trackers.test.ts b/server/src/__tests__/api/routes/fleet-spend-trackers.test.ts new file mode 100644 index 0000000..21854b0 --- /dev/null +++ b/server/src/__tests__/api/routes/fleet-spend-trackers.test.ts @@ -0,0 +1,127 @@ +import { describe, it, expect, vi, beforeEach } from "vitest"; +import express from "express"; +import cookieParser from "cookie-parser"; +import request from "supertest"; +import { makePolicy, makeSpendTracker } from "../../fixtures/prisma-rows.js"; + +const mockPrisma = { + policy: { findMany: vi.fn(), count: vi.fn() }, + incident: { count: vi.fn() }, + spendTracker: { findMany: vi.fn() }, +}; +vi.mock("../../../db/client.js", () => ({ prisma: mockPrisma })); + +const { fleetRouter } = await import("../../../api/routes/fleet.js"); +const { spendTrackersRouter } = await import("../../../api/routes/spend-trackers.js"); + +const WALLET = "OwnerPubkey11111111111111111111111"; + +function createTestApp(walletPubkey: string, router: express.Router, mountPath: string) { + const app = express(); + app.use(express.json()); + app.use(cookieParser()); + app.use((req, _res, next) => { + (req as express.Request & { walletPubkey?: string }).walletPubkey = walletPubkey; + next(); + }); + app.use(mountPath, router); + return app; +} + +describe("GET /api/fleet/summary", () => { + let app: express.Express; + + beforeEach(() => { + vi.clearAllMocks(); + app = createTestApp(WALLET, fleetRouter, "/api/fleet"); + }); + + it("returns zeros when wallet owns no policies", async () => { + mockPrisma.policy.findMany.mockResolvedValue([]); + + const res = await request(app).get("/api/fleet/summary"); + expect(res.status).toBe(200); + expect(res.body).toMatchObject({ + activeAgents: 0, + pausedAgents: 0, + incidentsLast24h: 0, + incidentsPrev24h: 0, + totalLamportsSpent24h: "0", + totalLamportsSpentPrev24h: null, + }); + expect(mockPrisma.incident.count).not.toHaveBeenCalled(); + }); + + it("aggregates counts and sums spend trackers", async () => { + const p = makePolicy(); + mockPrisma.policy.findMany.mockResolvedValue([{ pubkey: p.pubkey }]); + mockPrisma.policy.count.mockResolvedValueOnce(3); // active + mockPrisma.policy.count.mockResolvedValueOnce(1); // paused + mockPrisma.incident.count.mockResolvedValueOnce(5); // last24 + mockPrisma.incident.count.mockResolvedValueOnce(2); // prev24 + mockPrisma.spendTracker.findMany.mockResolvedValue([ + makeSpendTracker({ policyPubkey: p.pubkey, lamportsSpent24h: BigInt(1_000_000_000) }), + makeSpendTracker({ + policyPubkey: "OtherPolicy22222222222222222222222", + lamportsSpent24h: BigInt(500_000_000), + }), + ]); + + const res = await request(app).get("/api/fleet/summary"); + expect(res.status).toBe(200); + expect(res.body).toMatchObject({ + activeAgents: 3, + pausedAgents: 1, + incidentsLast24h: 5, + incidentsPrev24h: 2, + totalLamportsSpent24h: "1500000000", + totalLamportsSpentPrev24h: null, + }); + }); +}); + +describe("GET /api/spend-trackers", () => { + let app: express.Express; + + beforeEach(() => { + vi.clearAllMocks(); + app = createTestApp(WALLET, spendTrackersRouter, "/api/spend-trackers"); + }); + + it("returns empty when wallet owns no policies", async () => { + mockPrisma.policy.findMany.mockResolvedValue([]); + + const res = await request(app).get("/api/spend-trackers"); + expect(res.status).toBe(200); + expect(res.body).toEqual({ spendTrackers: [] }); + }); + + it("returns serialized trackers with policy snapshot", async () => { + const p = makePolicy({ label: "Bot", dailyBudgetLamports: BigInt(10_000_000_000) }); + mockPrisma.policy.findMany.mockResolvedValue([{ pubkey: p.pubkey }]); + const tracker = makeSpendTracker({ + policyPubkey: p.pubkey, + lamportsSpent24h: BigInt(100), + policy: { + label: p.label, + isActive: p.isActive, + anomalyScore: p.anomalyScore, + dailyBudgetLamports: p.dailyBudgetLamports, + }, + }); + mockPrisma.spendTracker.findMany.mockResolvedValue([tracker]); + + const res = await request(app).get("/api/spend-trackers"); + expect(res.status).toBe(200); + expect(res.body.spendTrackers).toHaveLength(1); + expect(res.body.spendTrackers[0]).toMatchObject({ + policyPubkey: p.pubkey, + lamportsSpent24h: "100", + policy: { + label: "Bot", + isActive: true, + dailyBudgetLamports: "10000000000", + }, + }); + }); +}); diff --git a/server/src/__tests__/api/routes/transactions.test.ts b/server/src/__tests__/api/routes/transactions.test.ts index d333cd8..9927a7e 100644 --- a/server/src/__tests__/api/routes/transactions.test.ts +++ b/server/src/__tests__/api/routes/transactions.test.ts @@ -10,11 +10,11 @@ import { const mockPrisma = { policy: { findUnique: vi.fn(), findMany: vi.fn() }, - guardedTxn: { findMany: vi.fn(), count: vi.fn() }, + guardedTxn: { findMany: vi.fn(), count: vi.fn(), findFirst: vi.fn() }, incident: { findMany: vi.fn(), findFirst: vi.fn(), count: vi.fn() }, - authSession: { create: vi.fn(), findFirst: vi.fn(), update: vi.fn() }, + authSession: { create: vi.fn(), findFirst: vi.fn(), update: vi.fn(), deleteMany: vi.fn() }, }; -vi.mock("../../db/client.js", () => ({ prisma: mockPrisma })); +vi.mock("../../../db/client.js", () => ({ prisma: mockPrisma })); const { transactionsRouter } = await import("../../../api/routes/transactions.js"); @@ -239,3 +239,44 @@ describe("GET /api/transactions", () => { expect(res.body).toEqual({ error: "Internal server error" }); }); }); + +describe("GET /api/transactions/:sig", () => { + let app: express.Express; + + beforeEach(() => { + vi.clearAllMocks(); + app = createTestApp(WALLET, transactionsRouter, "/api/transactions"); + }); + + it("returns 404 when transaction missing", async () => { + mockPrisma.guardedTxn.findFirst.mockResolvedValue(null); + + const res = await request(app).get("/api/transactions/missingSig111111111111111111111111111111111111111111111111"); + expect(res.status).toBe(404); + }); + + it("returns transaction with neighbors when owned", async () => { + const policy = makePolicy({ owner: WALLET }); + const txn = makeGuardedTxn({ + policyPubkey: policy.pubkey, + txnSig: "SigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + }); + + mockPrisma.guardedTxn.findFirst + .mockResolvedValueOnce({ + ...txn, + verdict: null, + escalation: null, + }) + .mockResolvedValueOnce({ txnSig: "prevSig1111111111111111111111111111111111111111111111111111111111111" }) + .mockResolvedValueOnce({ txnSig: "nextSig2222222222222222222222222222222222222222222222222222222222222" }); + mockPrisma.incident.findFirst.mockResolvedValue(null); + + const res = await request(app).get(`/api/transactions/${txn.txnSig}`); + + expect(res.status).toBe(200); + expect(res.body.transaction.txnSig).toBe(txn.txnSig); + expect(res.body.prevTxnSig).toBeDefined(); + expect(res.body.nextTxnSig).toBeDefined(); + }); +}); diff --git a/server/src/api/index.ts b/server/src/api/index.ts index 3892a7a..fd35c40 100644 --- a/server/src/api/index.ts +++ b/server/src/api/index.ts @@ -6,8 +6,13 @@ import { transactionsRouter } from "./routes/transactions.js"; import { incidentsRouter } from "./routes/incidents.js"; import { escalationsRouter } from "./routes/escalations.js"; import { policiesRouter } from "./routes/policies.js"; +import { fleetRouter } from "./routes/fleet.js"; +import { spendTrackersRouter } from "./routes/spend-trackers.js"; import { eventsRouter } from "./routes/events.js"; import { authRouter } from "./routes/auth.js"; +import { sessionRouter } from "./routes/session.js"; +import { settingsRouter } from "./routes/settings.js"; +import { auditRouter } from "./routes/audit.js"; export const apiRouter: express.Router = express.Router(); @@ -22,6 +27,11 @@ apiRouter.use("/transactions", transactionsRouter); apiRouter.use("/incidents", incidentsRouter); apiRouter.use("/escalations", escalationsRouter); apiRouter.use("/policies", policiesRouter); +apiRouter.use("/fleet", fleetRouter); +apiRouter.use("/spend-trackers", spendTrackersRouter); +apiRouter.use("/session", sessionRouter); +apiRouter.use("/settings", settingsRouter); +apiRouter.use("/audit", auditRouter); // SSE stream apiRouter.use("/events", eventsRouter); diff --git a/server/src/api/routes/audit.ts b/server/src/api/routes/audit.ts new file mode 100644 index 0000000..01d6ab4 --- /dev/null +++ b/server/src/api/routes/audit.ts @@ -0,0 +1,225 @@ +// GET /api/audit — unified operator action timeline for owned policies. + +import express from "express"; +import { prisma } from "../../db/client.js"; +import type { AuthenticatedRequest } from "../middleware/auth.js"; +import { detectAndExtract } from "../../worker/pipeline/ingest.js"; +import type { HeliusEnhancedTransaction } from "../../worker/routes/webhook.js"; + +export const auditRouter: express.Router = express.Router(); + +export type AuditActionType = + | "pause" + | "resume" + | "rotate_key" + | "close_policy" + | "escalation_created" + | "escalation_updated"; + +export interface AuditRow { + id: string; + timestamp: string; + actionType: AuditActionType; + policyPubkey: string; + policyLabel: string | null; + actor: string; + details: string; + relatedIncidentId: string | null; + relatedTxnSig: string | null; + relatedProposalId: string | null; +} + +const ALL_ACTIONS: AuditActionType[] = [ + "pause", + "resume", + "rotate_key", + "close_policy", + "escalation_created", + "escalation_updated", +]; + +function mapInstructionToAction( + ix: string, +): "pause" | "resume" | "rotate_key" | "close_policy" | null { + if (ix === "pause_agent") return "pause"; + if (ix === "resume_agent") return "resume"; + if (ix === "rotate_agent_key") return "rotate_key"; + if (ix === "close_policy") return "close_policy"; + return null; +} + +function parseTypesParam(raw: string | undefined): AuditActionType[] | null { + if (raw == null || raw === "" || raw === "all") return null; + const parts = raw.split(",").map((s) => s.trim()).filter(Boolean); + const set = new Set(); + for (const p of parts) { + if (ALL_ACTIONS.includes(p as AuditActionType)) { + set.add(p as AuditActionType); + } + } + return set.size === 0 ? [] : [...set]; +} + +auditRouter.get("/", async (req, res) => { + try { + const { walletPubkey } = req as AuthenticatedRequest; + + const policies = await prisma.policy.findMany({ + where: { owner: walletPubkey }, + select: { pubkey: true, label: true, owner: true }, + }); + + const pubkeys = policies.map((p) => p.pubkey); + const labelMap = new Map(policies.map((p) => [p.pubkey, p.label])); + const ownerMap = new Map(policies.map((p) => [p.pubkey, p.owner])); + + if (pubkeys.length === 0) { + res.json({ items: [] satisfies AuditRow[] }); + return; + } + + const policyFilter = req.query.policyPubkey as string | undefined; + const scopedPubkeys = + policyFilter && pubkeys.includes(policyFilter) ? [policyFilter] : pubkeys; + + const fromRaw = req.query.from as string | undefined; + const toRaw = req.query.to as string | undefined; + const from = fromRaw ? new Date(fromRaw) : null; + const to = toRaw ? new Date(toRaw) : null; + + const typeFilter = parseTypesParam(req.query.type as string | undefined); + + const [incidents, escalations, guardTxns] = await Promise.all([ + prisma.incident.findMany({ + where: { policyPubkey: { in: scopedPubkeys } }, + }), + prisma.escalationProposal.findMany({ + where: { policyPubkey: { in: scopedPubkeys } }, + include: { txn: { select: { txnSig: true } } }, + }), + prisma.guardedTxn.findMany({ + where: { policyPubkey: { in: scopedPubkeys } }, + orderBy: { blockTime: "desc" }, + take: 350, + }), + ]); + + const rows: AuditRow[] = []; + + for (const inc of incidents) { + rows.push({ + id: `inc-pause-${inc.id}`, + timestamp: inc.pausedAt.toISOString(), + actionType: "pause", + policyPubkey: inc.policyPubkey, + policyLabel: labelMap.get(inc.policyPubkey) ?? null, + actor: inc.pausedBy, + details: + inc.reason.length > 240 ? `${inc.reason.slice(0, 239)}…` : inc.reason, + relatedIncidentId: inc.id, + relatedTxnSig: inc.triggeringTxnSig, + relatedProposalId: null, + }); + + if (inc.resolvedAt) { + rows.push({ + id: `inc-resume-${inc.id}`, + timestamp: inc.resolvedAt.toISOString(), + actionType: "resume", + policyPubkey: inc.policyPubkey, + policyLabel: labelMap.get(inc.policyPubkey) ?? null, + actor: ownerMap.get(inc.policyPubkey) ?? inc.pausedBy, + details: + inc.resolution && inc.resolution.length > 0 + ? inc.resolution.length > 200 + ? `${inc.resolution.slice(0, 199)}…` + : inc.resolution + : "Incident resolved", + relatedIncidentId: inc.id, + relatedTxnSig: inc.triggeringTxnSig, + relatedProposalId: null, + }); + } + } + + for (const esc of escalations) { + rows.push({ + id: `esc-created-${esc.id}`, + timestamp: esc.createdAt.toISOString(), + actionType: "escalation_created", + policyPubkey: esc.policyPubkey, + policyLabel: labelMap.get(esc.policyPubkey) ?? null, + actor: ownerMap.get(esc.policyPubkey) ?? "", + details: `Multisig escalation — status ${esc.status}`, + relatedIncidentId: null, + relatedTxnSig: esc.txn.txnSig, + relatedProposalId: esc.id, + }); + + if (esc.updatedAt.getTime() > esc.createdAt.getTime() + 1500) { + rows.push({ + id: `esc-updated-${esc.id}-${esc.updatedAt.toISOString()}`, + timestamp: esc.updatedAt.toISOString(), + actionType: "escalation_updated", + policyPubkey: esc.policyPubkey, + policyLabel: labelMap.get(esc.policyPubkey) ?? null, + actor: ownerMap.get(esc.policyPubkey) ?? "", + details: `Escalation updated — status ${esc.status}`, + relatedIncidentId: null, + relatedTxnSig: esc.txn.txnSig, + relatedProposalId: esc.id, + }); + } + } + + for (const txn of guardTxns) { + const rawUnknown = txn.rawEvent as unknown; + if (!rawUnknown || typeof rawUnknown !== "object") continue; + + let instructionType = "unknown"; + try { + const det = detectAndExtract(rawUnknown as HeliusEnhancedTransaction); + instructionType = det.instructionType; + } catch { + instructionType = "unknown"; + } + + const mapped = mapInstructionToAction(instructionType); + if (!mapped) continue; + + rows.push({ + id: `txn-${mapped}-${txn.id}`, + timestamp: txn.blockTime.toISOString(), + actionType: mapped, + policyPubkey: txn.policyPubkey, + policyLabel: labelMap.get(txn.policyPubkey) ?? null, + actor: ownerMap.get(txn.policyPubkey) ?? "", + details: `On-chain ${instructionType} — ${txn.txnSig.slice(0, 10)}…`, + relatedIncidentId: null, + relatedTxnSig: txn.txnSig, + relatedProposalId: null, + }); + } + + let filtered = rows; + + if (typeFilter && typeFilter.length > 0) { + const allow = new Set(typeFilter); + filtered = filtered.filter((r) => allow.has(r.actionType)); + } + + if (from && !Number.isNaN(from.getTime())) { + filtered = filtered.filter((r) => new Date(r.timestamp).getTime() >= from.getTime()); + } + if (to && !Number.isNaN(to.getTime())) { + filtered = filtered.filter((r) => new Date(r.timestamp).getTime() <= to.getTime()); + } + + filtered.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()); + + res.json({ items: filtered.slice(0, 500) }); + } catch (err) { + console.error("[api/audit] error:", err); + res.status(500).json({ error: "Internal server error" }); + } +}); diff --git a/server/src/api/routes/auth.ts b/server/src/api/routes/auth.ts index a7629b0..350792d 100644 --- a/server/src/api/routes/auth.ts +++ b/server/src/api/routes/auth.ts @@ -101,7 +101,7 @@ authRouter.post("/siws/verify", async (req, res) => { // Atomically claim the session — updateMany with signedAt: null prevents // TOCTOU race where two concurrent requests claim the same nonce. - const claimed = await prisma.authSession.updateMany({ + const [claimed, policiesCount] = await Promise.all([prisma.authSession.updateMany({ where: { walletPubkey: pubkey, nonce, @@ -109,7 +109,11 @@ authRouter.post("/siws/verify", async (req, res) => { expiresAt: { gt: new Date() }, }, data: { signedAt: new Date() }, - }); + }), prisma.policy.count({ + where: { + owner: pubkey, + }, + })]); if (claimed.count === 0) { res.status(401).json({ error: "Invalid or expired nonce" }); @@ -129,13 +133,53 @@ authRouter.post("/siws/verify", async (req, res) => { maxAge: 24 * 60 * 60 * 1000, // 24 hours }); - res.json({ ok: true }); + res.json({ ok: true, policiesCount }); } catch (err) { console.error("[auth/verify] error:", err); res.status(500).json({ error: "Internal server error" }); } }); +// --------------------------------------------------------------------------- +// DELETE /auth/sessions — revoke SIWS sessions server-side + clear JWT cookie +// (runs without auth middleware; verifies JWT from cookie explicitly). +// --------------------------------------------------------------------------- + +authRouter.delete("/sessions", async (req, res) => { + try { + const token = req.cookies?.token as string | undefined; + if (!token) { + res.status(401).json({ error: "Not authenticated" }); + return; + } + + let walletPubkey: string; + try { + const payload = jwt.verify(token, env.JWT_SECRET) as { walletPubkey: string }; + walletPubkey = payload.walletPubkey; + } catch { + res.status(401).json({ error: "Invalid or expired token" }); + return; + } + + await prisma.authSession.deleteMany({ + where: { walletPubkey }, + }); + + res.clearCookie("token", { + httpOnly: true, + secure: true, + sameSite: "none", + path: "/", + }); + + res.json({ ok: true }); + } catch (err) { + console.error("[auth/sessions DELETE] error:", err); + res.status(500).json({ error: "Internal server error" }); + } +}); + // --------------------------------------------------------------------------- // Base58 decoder (for Solana pubkeys) // --------------------------------------------------------------------------- diff --git a/server/src/api/routes/escalations.ts b/server/src/api/routes/escalations.ts index 98138bc..8d2c555 100644 --- a/server/src/api/routes/escalations.ts +++ b/server/src/api/routes/escalations.ts @@ -74,7 +74,7 @@ escalationsRouter.get("/:id", async (req, res) => { id: req.params.id, policy: { owner: walletPubkey }, }, - include: { txn: true }, + include: { txn: { include: { verdict: true } } }, }); if (!escalation) { diff --git a/server/src/api/routes/fleet.ts b/server/src/api/routes/fleet.ts new file mode 100644 index 0000000..b39ceb7 --- /dev/null +++ b/server/src/api/routes/fleet.ts @@ -0,0 +1,84 @@ +// GET /api/fleet/summary — aggregated fleet metrics for the authenticated wallet. + +import express from "express"; +import { prisma } from "../../db/client.js"; +import type { AuthenticatedRequest } from "../middleware/auth.js"; + +export const fleetRouter: express.Router = express.Router(); + +fleetRouter.get("/summary", async (req, res) => { + try { + const { walletPubkey } = req as AuthenticatedRequest; + + const ownedPolicies = await prisma.policy.findMany({ + where: { owner: walletPubkey }, + select: { pubkey: true }, + }); + const policyPubkeys = ownedPolicies.map((p) => p.pubkey); + + if (policyPubkeys.length === 0) { + res.json({ + activeAgents: 0, + pausedAgents: 0, + incidentsLast24h: 0, + incidentsPrev24h: 0, + totalLamportsSpent24h: "0", + totalLamportsSpentPrev24h: null, + }); + return; + } + + const now = Date.now(); + const ms24h = 24 * 60 * 60 * 1000; + const boundary24h = new Date(now - ms24h); + const boundary48h = new Date(now - 2 * ms24h); + + const [ + activeAgents, + pausedAgents, + incidentsLast24h, + incidentsPrev24h, + trackers, + ] = await Promise.all([ + prisma.policy.count({ + where: { owner: walletPubkey, isActive: true }, + }), + prisma.policy.count({ + where: { owner: walletPubkey, isActive: false }, + }), + prisma.incident.count({ + where: { + policyPubkey: { in: policyPubkeys }, + pausedAt: { gte: boundary24h }, + }, + }), + prisma.incident.count({ + where: { + policyPubkey: { in: policyPubkeys }, + pausedAt: { gte: boundary48h, lt: boundary24h }, + }, + }), + prisma.spendTracker.findMany({ + where: { policyPubkey: { in: policyPubkeys } }, + select: { lamportsSpent24h: true }, + }), + ]); + + let totalSpent = BigInt(0); + for (const t of trackers) { + totalSpent += t.lamportsSpent24h; + } + + res.json({ + activeAgents, + pausedAgents, + incidentsLast24h, + incidentsPrev24h, + totalLamportsSpent24h: totalSpent.toString(), + totalLamportsSpentPrev24h: null, + }); + } catch (err) { + console.error("[api/fleet/summary] error:", err); + res.status(500).json({ error: "Internal server error" }); + } +}); diff --git a/server/src/api/routes/session.ts b/server/src/api/routes/session.ts new file mode 100644 index 0000000..648b474 --- /dev/null +++ b/server/src/api/routes/session.ts @@ -0,0 +1,29 @@ +// GET /api/session — JWT-backed session metadata for the dashboard. + +import express from "express"; +import jwt from "jsonwebtoken"; +import type { AuthenticatedRequest } from "../middleware/auth.js"; + +export const sessionRouter: express.Router = express.Router(); + +sessionRouter.get("/", (req, res) => { + try { + const walletPubkey = (req as AuthenticatedRequest).walletPubkey; + const token = req.cookies?.token as string | undefined; + let expiresAt: string | null = null; + if (token) { + const decoded = jwt.decode(token) as { exp?: number } | null; + if (decoded?.exp != null) { + expiresAt = new Date(decoded.exp * 1000).toISOString(); + } + } + + res.json({ + walletPubkey, + expiresAt, + }); + } catch (err) { + console.error("[api/session] error:", err); + res.status(500).json({ error: "Internal server error" }); + } +}); diff --git a/server/src/api/routes/settings.ts b/server/src/api/routes/settings.ts new file mode 100644 index 0000000..464532f --- /dev/null +++ b/server/src/api/routes/settings.ts @@ -0,0 +1,37 @@ +// GET /api/settings/webhook-status — Helius webhook URL + ingress metrics. +// GET /api/settings/llm — resolved judge/report models (read-only). + +import express from "express"; +import { env } from "../../config/env.js"; +import { getDashboardLLMInfo } from "../../config/llm.js"; +import { getWebhookIngressSnapshot } from "../../worker/webhook-metrics.js"; + +export const settingsRouter: express.Router = express.Router(); + +settingsRouter.get("/webhook-status", (_req, res) => { + try { + const base = + env.PUBLIC_WEBHOOK_BASE_URL?.replace(/\/$/, "") ?? `http://localhost:${env.PORT}`; + const webhookUrl = `${base}/webhook`; + const snapshot = getWebhookIngressSnapshot(); + + res.json({ + webhookUrl, + lastWebhookReceivedAt: snapshot.lastWebhookReceivedAt, + eventsReceivedLastHour: snapshot.eventsReceivedLastHour, + }); + } catch (err) { + console.error("[api/settings/webhook-status] error:", err); + res.status(500).json({ error: "Internal server error" }); + } +}); + +settingsRouter.get("/llm", (_req, res) => { + try { + const info = getDashboardLLMInfo(); + res.json(info); + } catch (err) { + console.error("[api/settings/llm] error:", err); + res.status(500).json({ error: "Internal server error" }); + } +}); diff --git a/server/src/api/routes/spend-trackers.ts b/server/src/api/routes/spend-trackers.ts new file mode 100644 index 0000000..c2af0fb --- /dev/null +++ b/server/src/api/routes/spend-trackers.ts @@ -0,0 +1,66 @@ +// GET /api/spend-trackers — spend tracker rows + policy fields for fleet health UI. + +import express from "express"; +import { prisma } from "../../db/client.js"; +import type { AuthenticatedRequest } from "../middleware/auth.js"; + +export const spendTrackersRouter: express.Router = express.Router(); + +spendTrackersRouter.get("/", async (req, res) => { + try { + const { walletPubkey } = req as AuthenticatedRequest; + + const ownedPolicies = await prisma.policy.findMany({ + where: { owner: walletPubkey }, + select: { pubkey: true }, + }); + const policyPubkeys = ownedPolicies.map((p) => p.pubkey); + + if (policyPubkeys.length === 0) { + res.json({ spendTrackers: [] }); + return; + } + + const rows = await prisma.spendTracker.findMany({ + where: { policyPubkey: { in: policyPubkeys } }, + include: { + policy: { + select: { + label: true, + isActive: true, + anomalyScore: true, + dailyBudgetLamports: true, + }, + }, + }, + }); + + const spendTrackers = rows.map((row) => ({ + policyPubkey: row.policyPubkey, + windowStart: row.windowStart, + txnCount24h: row.txnCount24h, + lamportsSpent24h: row.lamportsSpent24h.toString(), + lastTxnTs: row.lastTxnTs, + lastTxnProgram: row.lastTxnProgram, + uniqueDestinations24h: row.uniqueDestinations24h, + maxSingleTxnLamports: row.maxSingleTxnLamports.toString(), + failedTxnCount24h: row.failedTxnCount24h, + uniquePrograms24h: row.uniquePrograms24h, + lamportsSpent1h: row.lamportsSpent1h.toString(), + windowStart1h: row.windowStart1h, + consecutiveHighAmountCount: row.consecutiveHighAmountCount, + updatedAt: row.updatedAt, + policy: { + label: row.policy.label, + isActive: row.policy.isActive, + anomalyScore: row.policy.anomalyScore, + dailyBudgetLamports: row.policy.dailyBudgetLamports.toString(), + }, + })); + + res.json({ spendTrackers }); + } catch (err) { + console.error("[api/spend-trackers] error:", err); + res.status(500).json({ error: "Internal server error" }); + } +}); diff --git a/server/src/api/routes/transactions.ts b/server/src/api/routes/transactions.ts index 6f301dc..6a87f32 100644 --- a/server/src/api/routes/transactions.ts +++ b/server/src/api/routes/transactions.ts @@ -62,3 +62,103 @@ transactionsRouter.get("/", async (req, res) => { res.status(500).json({ error: "Internal server error" }); } }); + +function serializeTxn(row: { + id: string; + policyPubkey: string; + txnSig: string; + slot: bigint; + blockTime: Date; + targetProgram: string; + amountLamports: bigint | null; + status: string; + rejectReason: string | null; + destination: string | null; + rawEvent: unknown; + createdAt: Date; + verdict: Record | null; + escalation: + | ({ + amountLamports: bigint; + transactionIndex: bigint | null; + } & Record) + | null; +}) { + const escalation = + row.escalation == null + ? null + : { + ...row.escalation, + amountLamports: row.escalation.amountLamports.toString(), + transactionIndex: + row.escalation.transactionIndex == null + ? null + : row.escalation.transactionIndex.toString(), + }; + + return { + ...row, + slot: row.slot.toString(), + amountLamports: row.amountLamports?.toString() ?? null, + escalation, + }; +} + +// GET /api/transactions/:sig — deep dive for one guarded transaction (owned policy). +transactionsRouter.get("/:sig", async (req, res) => { + try { + const { walletPubkey } = req as unknown as AuthenticatedRequest; + const sig = req.params.sig; + + const txn = await prisma.guardedTxn.findFirst({ + where: { + txnSig: sig, + policy: { owner: walletPubkey }, + }, + include: { + verdict: true, + escalation: true, + }, + }); + + if (!txn) { + res.status(404).json({ error: "Transaction not found" }); + return; + } + + const [incident, prev, next] = await Promise.all([ + prisma.incident.findFirst({ + where: { + policyPubkey: txn.policyPubkey, + triggeringTxnSig: sig, + }, + }), + prisma.guardedTxn.findFirst({ + where: { + policyPubkey: txn.policyPubkey, + blockTime: { lt: txn.blockTime }, + }, + orderBy: { blockTime: "desc" }, + select: { txnSig: true }, + }), + prisma.guardedTxn.findFirst({ + where: { + policyPubkey: txn.policyPubkey, + blockTime: { gt: txn.blockTime }, + }, + orderBy: { blockTime: "asc" }, + select: { txnSig: true }, + }), + ]); + + res.json({ + transaction: serializeTxn(txn), + incident, + prevTxnSig: prev?.txnSig ?? null, + nextTxnSig: next?.txnSig ?? null, + }); + } catch (err) { + console.error("[api/transactions/:sig] error:", err); + res.status(500).json({ error: "Internal server error" }); + } +}); diff --git a/server/src/config/env.ts b/server/src/config/env.ts index bad9660..7f35362 100644 --- a/server/src/config/env.ts +++ b/server/src/config/env.ts @@ -69,4 +69,6 @@ export const env = { JWT_SECRET: required("JWT_SECRET"), CORS_ORIGIN: optional("CORS_ORIGIN", "http://localhost:3000"), POLL_INTERVAL_MS: optionalNumber("POLL_INTERVAL_MS", 30_000), + /** Optional public origin for webhook URL hints (e.g. https://api.example.com). Defaults to http://localhost:PORT */ + PUBLIC_WEBHOOK_BASE_URL: optionalKey("PUBLIC_WEBHOOK_BASE_URL"), } as const; diff --git a/server/src/config/llm.ts b/server/src/config/llm.ts index 6b16620..3227128 100644 --- a/server/src/config/llm.ts +++ b/server/src/config/llm.ts @@ -36,6 +36,21 @@ function resolveModel(tier: "fast" | "report"): string { return envOverride || DEFAULTS[tier]; } +/** Resolved models + fallback flags for dashboard settings (read-only). */ +export function getDashboardLLMInfo(): { + judgeModel: string; + reportModel: string; + anthropicConfigured: boolean; + fallbackActive: boolean; +} { + return { + judgeModel: resolveModel("fast"), + reportModel: resolveModel("report"), + anthropicConfigured: Boolean(env.ANTHROPIC_API_KEY), + fallbackActive: !env.ANTHROPIC_API_KEY, + }; +} + // --------------------------------------------------------------------------- // Anthropic provider // --------------------------------------------------------------------------- diff --git a/server/src/worker/routes/webhook.ts b/server/src/worker/routes/webhook.ts index 4e3e1c2..391e78c 100644 --- a/server/src/worker/routes/webhook.ts +++ b/server/src/worker/routes/webhook.ts @@ -5,6 +5,7 @@ import { createHmac, timingSafeEqual } from "node:crypto"; import type { Request, Response } from "express"; import { env } from "../../config/env.js"; import { processTransaction } from "../pipeline/process-transaction.js"; +import { recordWebhookIngress } from "../webhook-metrics.js"; /** * Verify the Helius webhook request. @@ -110,6 +111,7 @@ export async function webhookHandler(req: Request, res: Response): Promise // Respond immediately — pipeline runs async res.status(200).json({ received: transactions.length }); + recordWebhookIngress(transactions.length); // Process each transaction through the shared pipeline for (const txn of transactions) { diff --git a/server/src/worker/webhook-metrics.ts b/server/src/worker/webhook-metrics.ts new file mode 100644 index 0000000..2fd0bb3 --- /dev/null +++ b/server/src/worker/webhook-metrics.ts @@ -0,0 +1,35 @@ +// In-memory webhook ingress metrics (resets on process restart). + +const EVENT_WINDOW_MS = 60 * 60 * 1000; + +let lastWebhookReceivedAt: Date | null = null; +const recentEventCounts: number[] = []; + +function prune(now: number): void { + const cutoff = now - EVENT_WINDOW_MS; + while (recentEventCounts.length > 0 && recentEventCounts[0]! < cutoff) { + recentEventCounts.shift(); + } +} + +/** Called after a verified Helius webhook accepts a batch (once per HTTP delivery). */ +export function recordWebhookIngress(eventsInBatch: number): void { + const now = Date.now(); + lastWebhookReceivedAt = new Date(now); + prune(now); + for (let i = 0; i < eventsInBatch; i++) { + recentEventCounts.push(now); + } +} + +export function getWebhookIngressSnapshot(): { + lastWebhookReceivedAt: string | null; + eventsReceivedLastHour: number; +} { + const now = Date.now(); + prune(now); + return { + lastWebhookReceivedAt: lastWebhookReceivedAt?.toISOString() ?? null, + eventsReceivedLastHour: recentEventCounts.length, + }; +} From 6fe70e0dabc8f015086c28ff9da6408bfeb3cd7a Mon Sep 17 00:00:00 2001 From: iamasx Date: Mon, 4 May 2026 10:13:58 +0530 Subject: [PATCH 4/5] feat: add multisig_execute instruction for escalation execution MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - New on-chain `multisig_execute` instruction that verifies a Squads proposal is approved, then executes the transfer directly from the policy PDA. Funds never leave the guardrails layer — all policy checks (allowlist, max_tx, daily budget, session expiry) still apply, only the escalation threshold is skipped. - Extract shared helpers (parse_verified_amount, snapshot_balance) from guarded_execute into instructions/shared.rs for reuse. - Add POST /api/escalations/report endpoint so clients can report escalations directly (Helius cannot parse failed transactions). - Implement proper escalation poller using @sqds/multisig SDK to sync on-chain proposal status (was a stub returning null). - Update dashboard Execute button to call multisig_execute on the guardrails program instead of Squads vaultTransactionExecute. - Add webhook receipt logging, reconstructed instruction support for client-reported escalations, and resolve-escalation pipeline stage. --- dashboard/components/proposal-card.tsx | 12 +- dashboard/lib/sdk/client.ts | 31 +- dashboard/lib/sdk/idl/guardrails.json | 204 ++++++++ dashboard/lib/squads/create-proposal.ts | 81 ++- program/programs/guardrails/src/errors.rs | 13 + program/programs/guardrails/src/events.rs | 12 + .../src/instructions/guarded_execute.rs | 79 +-- .../guardrails/src/instructions/mod.rs | 2 + .../src/instructions/multisig_execute.rs | 454 ++++++++++++++++ .../guardrails/src/instructions/shared.rs | 74 +++ program/programs/guardrails/src/lib.rs | 8 + sdk/client.ts | 31 +- sdk/idl/guardrails.json | 204 ++++++++ server/package.json | 1 + server/pnpm-lock.yaml | 488 ++++++++++++++++++ server/src/api/routes/escalations.ts | 103 ++++ server/src/sdk/client.ts | 31 +- server/src/sdk/idl/guardrails.json | 204 ++++++++ .../src/worker/pipeline/escalation-poller.ts | 98 ++-- server/src/worker/pipeline/ingest.ts | 3 + .../worker/pipeline/process-transaction.ts | 11 + .../pipeline/reconstruct-instruction.ts | 5 + .../src/worker/pipeline/resolve-escalation.ts | 45 ++ server/src/worker/routes/webhook.ts | 2 + 24 files changed, 2034 insertions(+), 162 deletions(-) create mode 100644 program/programs/guardrails/src/instructions/multisig_execute.rs create mode 100644 program/programs/guardrails/src/instructions/shared.rs create mode 100644 server/src/worker/pipeline/resolve-escalation.ts diff --git a/dashboard/components/proposal-card.tsx b/dashboard/components/proposal-card.tsx index 1e24ceb..c882b13 100644 --- a/dashboard/components/proposal-card.tsx +++ b/dashboard/components/proposal-card.tsx @@ -6,8 +6,8 @@ import { useConnection, useWallet } from "@solana/wallet-adapter-react"; import { useAnchorWallet } from "@solana/wallet-adapter-react"; import { StatusChip } from "@/components/dashboard-ui"; import { shortAddress, formatRelativeTime, formatRelativeTooltip, formatSol, programLabel } from "@/lib/utils"; -import { approveProposal, executeProposal, createEscalationProposal } from "@/lib/squads/create-proposal"; -import { getErrorMessage } from "@/lib/api/client"; +import { approveProposal, executeViaGuardrails, createEscalationProposal } from "@/lib/squads/create-proposal"; +import { getErrorMessage, fetchEscalation } from "@/lib/api/client"; import type { EscalationSummary } from "@/lib/types/dashboard"; import { escalationLabel, escalationTone } from "@/lib/utils/escalation-display"; @@ -70,12 +70,8 @@ export function ProposalCard({ setBusy(true); setError(null); try { - await executeProposal( - connection, - wallet, - escalation.squadsMultisig, - escalation.transactionIndex, - ); + const detail = await fetchEscalation(escalation.id); + await executeViaGuardrails(connection, wallet, detail); onUpdate?.(); } catch (e) { setError(getErrorMessage(e)); diff --git a/dashboard/lib/sdk/client.ts b/dashboard/lib/sdk/client.ts index 98959a6..a33f3c5 100644 --- a/dashboard/lib/sdk/client.ts +++ b/dashboard/lib/sdk/client.ts @@ -205,7 +205,36 @@ export class GuardrailsClient { }) .remainingAccounts(remainingAccounts) .signers([agent]) - .rpc(); + .rpc({ skipPreflight: true, maxRetries: 0 }); + } + + /** + * Executes a multisig-approved transaction through the policy layer. + * The provider wallet must be the policy owner. + * Verifies the Squads proposal is approved, then transfers from the policy PDA. + * Skips escalation threshold but enforces all other policy limits. + */ + async multisigExecute( + policyPda: PublicKey, + trackerPda: PublicKey, + squadsProposal: PublicKey, + targetProgram: PublicKey, + args: GuardedExecuteArgs, + remainingAccounts: AccountMeta[], + ): Promise { + const owner = this.walletPublicKey(); + return await (this.program.methods as any) + .multisigExecute(args) + .accounts({ + owner, + policy: policyPda, + spendTracker: trackerPda, + squadsProposal, + targetProgram, + systemProgram: SystemProgram.programId, + }) + .remainingAccounts(remainingAccounts) + .rpc({ skipPreflight: true, maxRetries: 0 }); } /** diff --git a/dashboard/lib/sdk/idl/guardrails.json b/dashboard/lib/sdk/idl/guardrails.json index 16bb72c..e8283b7 100644 --- a/dashboard/lib/sdk/idl/guardrails.json +++ b/dashboard/lib/sdk/idl/guardrails.json @@ -353,6 +353,110 @@ } ] }, + { + "name": "multisig_execute", + "docs": [ + "Executes a multisig-approved transaction through the policy layer.", + "Called by the policy owner after a Squads proposal has been approved.", + "Skips the escalation threshold check but enforces all other policy limits." + ], + "discriminator": [ + 151, + 179, + 145, + 71, + 190, + 96, + 47, + 69 + ], + "accounts": [ + { + "name": "owner", + "writable": true, + "signer": true, + "relations": [ + "policy" + ] + }, + { + "name": "policy", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 112, + 111, + 108, + 105, + 99, + 121 + ] + }, + { + "kind": "account", + "path": "policy.owner", + "account": "PermissionPolicy" + }, + { + "kind": "account", + "path": "policy.agent", + "account": "PermissionPolicy" + } + ] + }, + "relations": [ + "spend_tracker" + ] + }, + { + "name": "spend_tracker", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 116, + 114, + 97, + 99, + 107, + 101, + 114 + ] + }, + { + "kind": "account", + "path": "policy" + } + ] + } + }, + { + "name": "squads_proposal" + }, + { + "name": "target_program" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "args", + "type": { + "defined": { + "name": "MultisigExecuteArgs" + } + } + } + ] + }, { "name": "pause_agent", "docs": [ @@ -1074,6 +1178,19 @@ 39 ] }, + { + "name": "MultisigTxnExecuted", + "discriminator": [ + 129, + 235, + 64, + 97, + 94, + 97, + 28, + 13 + ] + }, { "name": "PolicyClosed", "discriminator": [ @@ -1198,6 +1315,26 @@ "code": 6021, "name": "SameAgentKey", "msg": "New agent key must be different from current agent key" + }, + { + "code": 6022, + "name": "InvalidSquadsProposal", + "msg": "Squads proposal account is invalid or not owned by Squads program" + }, + { + "code": 6023, + "name": "MultisigMismatch", + "msg": "Squads proposal multisig does not match policy's squads_multisig" + }, + { + "code": 6024, + "name": "ProposalNotApproved", + "msg": "Squads proposal has not been approved" + }, + { + "code": 6025, + "name": "NoMultisigConfigured", + "msg": "Policy has no squads_multisig configured" } ], "types": [ @@ -1631,6 +1768,73 @@ ] } }, + { + "name": "MultisigExecuteArgs", + "type": { + "kind": "struct", + "fields": [ + { + "name": "instruction_data", + "docs": [ + "Raw instruction data to pass to the target program." + ], + "type": "bytes" + }, + { + "name": "amount_hint", + "docs": [ + "Owner-declared spending amount in lamports." + ], + "type": "u64" + }, + { + "name": "input_account_index", + "docs": [ + "Optional index into remaining_accounts for balance-diff enforcement." + ], + "type": { + "option": "u8" + } + } + ] + } + }, + { + "name": "MultisigTxnExecuted", + "docs": [ + "Emitted after a successful multisig_execute transfer.", + "The server uses this to resolve the escalation proposal and update the dashboard." + ], + "type": { + "kind": "struct", + "fields": [ + { + "name": "policy", + "type": "pubkey" + }, + { + "name": "owner", + "type": "pubkey" + }, + { + "name": "target_program", + "type": "pubkey" + }, + { + "name": "amount", + "type": "u64" + }, + { + "name": "squads_proposal", + "type": "pubkey" + }, + { + "name": "timestamp", + "type": "i64" + } + ] + } + }, { "name": "PauseAgentArgs", "docs": [ diff --git a/dashboard/lib/squads/create-proposal.ts b/dashboard/lib/squads/create-proposal.ts index 253c49e..8d7c4d9 100644 --- a/dashboard/lib/squads/create-proposal.ts +++ b/dashboard/lib/squads/create-proposal.ts @@ -1,9 +1,12 @@ "use client"; import { Connection, PublicKey, TransactionMessage, VersionedTransaction } from "@solana/web3.js"; +import { AnchorProvider, BN } from "@coral-xyz/anchor"; import * as multisig from "@sqds/multisig"; import type { AnchorWallet } from "@solana/wallet-adapter-react"; import { fetchEscalation, updateEscalationProposal } from "@/lib/api/client"; +import { GuardrailsClient } from "@/lib/sdk/client"; +import type { EscalationDetail } from "@/lib/types/dashboard"; /** * Create a Squads vault transaction + proposal for an escalated transaction. @@ -88,7 +91,10 @@ export async function createEscalationProposal( const tx = new VersionedTransaction(message); const signed = await wallet.signTransaction(tx); - const sig = await connection.sendRawTransaction(signed.serialize()); + const sig = await connection.sendRawTransaction(signed.serialize(), { + skipPreflight: true, + maxRetries: 0, + }); await connection.confirmTransaction(sig, "confirmed"); // 6. Derive proposal PDA @@ -134,43 +140,66 @@ export async function approveProposal( const tx = new VersionedTransaction(message); const signed = await wallet.signTransaction(tx); - const sig = await connection.sendRawTransaction(signed.serialize()); + const sig = await connection.sendRawTransaction(signed.serialize(), { + skipPreflight: true, + maxRetries: 0, + }); await connection.confirmTransaction(sig, "confirmed"); return sig; } /** - * Execute an approved Squads vault transaction. + * Execute an approved escalation via the Guardrails multisig_execute instruction. + * Transfers directly from the policy PDA — funds never leave the guardrails layer. */ -export async function executeProposal( +export async function executeViaGuardrails( connection: Connection, wallet: AnchorWallet, - multisigAddress: string, - transactionIndex: string, + escalation: EscalationDetail, ): Promise { - const multisigPda = new PublicKey(multisigAddress); - const txIndex = BigInt(transactionIndex); + const provider = new AnchorProvider(connection, wallet, { + commitment: "confirmed", + }); + const client = new GuardrailsClient(provider); - const { instruction: executeIx, lookupTableAccounts } = - await multisig.instructions.vaultTransactionExecute({ - connection, - multisigPda, - transactionIndex: txIndex, - member: wallet.publicKey, - }); + const policyPda = new PublicKey(escalation.policyPubkey); + const [trackerPda] = client.findTrackerPda(policyPda); - const { blockhash } = await connection.getLatestBlockhash(); - const message = new TransactionMessage({ - payerKey: wallet.publicKey, - recentBlockhash: blockhash, - instructions: [executeIx], - }).compileToV0Message(lookupTableAccounts); + // Derive the Squads proposal PDA + const multisigPda = new PublicKey(escalation.squadsMultisig); + const txIndex = BigInt(escalation.transactionIndex!); + const [proposalPda] = multisig.getProposalPda({ + multisigPda, + transactionIndex: txIndex, + }); - const tx = new VersionedTransaction(message); - const signed = await wallet.signTransaction(tx); - const sig = await connection.sendRawTransaction(signed.serialize()); - await connection.confirmTransaction(sig, "confirmed"); + const instruction = escalation.instruction; + if (!instruction) throw new Error("No instruction data for execution"); - return sig; + const targetProgram = new PublicKey(instruction.programId); + const instructionData = Buffer.from(instruction.data, "base64"); + const amountHint = new BN(instruction.amountLamports); + + // Build remaining accounts — for SOL transfers, just the destination + const remainingAccounts = instruction.accounts + .filter((acc) => acc.pubkey !== instruction.programId) + .map((acc) => ({ + pubkey: new PublicKey(acc.pubkey), + isSigner: false, + isWritable: acc.isWritable, + })); + + return await client.multisigExecute( + policyPda, + trackerPda, + proposalPda, + targetProgram, + { + instructionData, + amountHint, + inputAccountIndex: null, + }, + remainingAccounts, + ); } diff --git a/program/programs/guardrails/src/errors.rs b/program/programs/guardrails/src/errors.rs index fed40ad..d9dd572 100644 --- a/program/programs/guardrails/src/errors.rs +++ b/program/programs/guardrails/src/errors.rs @@ -61,4 +61,17 @@ pub enum GuardrailsError { #[msg("New agent key must be different from current agent key")] SameAgentKey, + + // --- Multisig execute errors --- + #[msg("Squads proposal account is invalid or not owned by Squads program")] + InvalidSquadsProposal, + + #[msg("Squads proposal multisig does not match policy's squads_multisig")] + MultisigMismatch, + + #[msg("Squads proposal has not been approved")] + ProposalNotApproved, + + #[msg("Policy has no squads_multisig configured")] + NoMultisigConfigured, } diff --git a/program/programs/guardrails/src/events.rs b/program/programs/guardrails/src/events.rs index 9ce3598..8edde6d 100644 --- a/program/programs/guardrails/src/events.rs +++ b/program/programs/guardrails/src/events.rs @@ -128,6 +128,18 @@ pub struct PolicyClosed { pub timestamp: i64, } +/// Emitted after a successful multisig_execute transfer. +/// The server uses this to resolve the escalation proposal and update the dashboard. +#[event] +pub struct MultisigTxnExecuted { + pub policy: Pubkey, + pub owner: Pubkey, + pub target_program: Pubkey, + pub amount: u64, + pub squads_proposal: Pubkey, + pub timestamp: i64, +} + /// Emitted before the CPI in `guarded_execute` (step 9 of the 12-step flow). /// Gives the server pipeline visibility into every CPI attempt that passed /// pre-validation, regardless of whether the CPI itself succeeds or fails. diff --git a/program/programs/guardrails/src/instructions/guarded_execute.rs b/program/programs/guardrails/src/instructions/guarded_execute.rs index e44d28f..e5f8419 100644 --- a/program/programs/guardrails/src/instructions/guarded_execute.rs +++ b/program/programs/guardrails/src/instructions/guarded_execute.rs @@ -35,6 +35,7 @@ use crate::errors::GuardrailsError; use crate::events::*; use crate::state::policy::PermissionPolicy; use crate::state::spend_tracker::SpendTracker; +use super::shared::{parse_verified_amount, snapshot_balance}; // --------------------------------------------------------------------------- // Accounts @@ -103,84 +104,6 @@ pub struct GuardedExecuteArgs { pub input_account_index: Option, } -// --------------------------------------------------------------------------- -// Amount parsing -// --------------------------------------------------------------------------- - -/// Parses and verifies the real transfer amount from instruction data for known -/// programs (System Program, Token Program). For unknown programs, returns the -/// agent-supplied amount_hint as-is. -/// -/// For known programs, the parsed amount must EXACTLY match amount_hint. -/// This prevents agents from understating amounts to bypass budget checks. -fn parse_verified_amount( - target_program: &Pubkey, - instruction_data: &[u8], - amount_hint: u64, -) -> Result { - let system_program_id = anchor_lang::solana_program::system_program::ID; - let token_program_id = anchor_spl::token::ID; - - if *target_program == system_program_id { - // System Program transfer layout: - // bytes 0-3: u32 instruction index (2 = Transfer) - // bytes 4-11: u64 lamports (little-endian) - if instruction_data.len() >= 12 { - let ix_index = u32::from_le_bytes(instruction_data[0..4].try_into().unwrap()); - if ix_index == 2 { - let parsed_amount = u64::from_le_bytes(instruction_data[4..12].try_into().unwrap()); - require!( - parsed_amount == amount_hint, - GuardrailsError::AmountMismatch - ); - return Ok(parsed_amount); - } - } - // Non-transfer System Program instruction (e.g., CreateAccount): use hint - Ok(amount_hint) - } else if *target_program == token_program_id { - // Token Program transfer layout: - // byte 0: u8 discriminator (3 = Transfer) - // bytes 1-8: u64 amount (little-endian) - if instruction_data.len() >= 9 { - let discriminator = instruction_data[0]; - if discriminator == 3 { - let parsed_amount = u64::from_le_bytes(instruction_data[1..9].try_into().unwrap()); - require!( - parsed_amount == amount_hint, - GuardrailsError::AmountMismatch - ); - return Ok(parsed_amount); - } - } - // Non-transfer Token Program instruction: use hint - Ok(amount_hint) - } else { - // Unknown program (Jupiter, Marinade, etc.): trust hint. - // Server does post-hoc balance-diff detection for anomalies. - Ok(amount_hint) - } -} - -// --------------------------------------------------------------------------- -// Balance snapshot (for post-CPI enforcement) -// --------------------------------------------------------------------------- - -/// Reads the balance of an account — token amount for SPL token accounts, -/// lamports for everything else. Used for before/after balance diff enforcement. -fn snapshot_balance(account_info: &AccountInfo) -> Result { - if *account_info.owner == anchor_spl::token::ID { - // SPL token account — read the amount field at offset 64..72 - let data = account_info.try_borrow_data()?; - require!(data.len() >= 72, GuardrailsError::InvalidInputAccountIndex); - let amount = u64::from_le_bytes(data[64..72].try_into().unwrap()); - Ok(amount) - } else { - // SOL account — use lamports - Ok(account_info.lamports()) - } -} - // --------------------------------------------------------------------------- // Handler // --------------------------------------------------------------------------- diff --git a/program/programs/guardrails/src/instructions/mod.rs b/program/programs/guardrails/src/instructions/mod.rs index 5bf0622..59f8f53 100644 --- a/program/programs/guardrails/src/instructions/mod.rs +++ b/program/programs/guardrails/src/instructions/mod.rs @@ -8,9 +8,11 @@ pub mod close_policy; pub mod escalate_to_squads; pub mod guarded_execute; pub mod initialize_policy; +pub mod multisig_execute; pub mod pause_agent; pub mod resume_agent; pub mod rotate_agent_key; +pub mod shared; pub mod unwrap_sol; pub mod update_anomaly_score; pub mod update_policy; diff --git a/program/programs/guardrails/src/instructions/multisig_execute.rs b/program/programs/guardrails/src/instructions/multisig_execute.rs new file mode 100644 index 0000000..c40df28 --- /dev/null +++ b/program/programs/guardrails/src/instructions/multisig_execute.rs @@ -0,0 +1,454 @@ +//! multisig_execute instruction handler -- executes a multisig-approved transaction. +//! +//! Called by the policy owner after a Squads proposal has been approved. +//! Follows the same 12-step validation flow as `guarded_execute`, but replaces +//! step 8 (escalation threshold check) with on-chain Squads proposal verification. +//! +//! The owner proves the Squads members have approved the high-value transfer by +//! passing the proposal account. The handler deserializes it manually and checks: +//! - Account is owned by the Squads v4 program +//! - Discriminator matches the Proposal account type +//! - The proposal's multisig field matches the policy's squads_multisig +//! - The proposal status is Approved (3), Executing (4), or Executed (5) + +use anchor_lang::prelude::*; +use anchor_lang::solana_program::instruction::Instruction; +use anchor_lang::solana_program::program::invoke_signed; +use anchor_lang::solana_program::rent::Rent; +use anchor_lang::solana_program::sysvar::Sysvar; +use std::str::FromStr; + +use crate::errors::GuardrailsError; +use crate::events::*; +use crate::state::policy::PermissionPolicy; +use crate::state::spend_tracker::SpendTracker; +use super::shared::{parse_verified_amount, snapshot_balance}; + +// --------------------------------------------------------------------------- +// Squads v4 program ID +// --------------------------------------------------------------------------- + +fn squads_program_id() -> Pubkey { + Pubkey::from_str("SQDS4ep65T869zMMBKyuUq6aD6EgTu8psMjkvj52pCf").unwrap() +} + +/// Squads v4 Proposal account discriminator (first 8 bytes). +const SQUADS_PROPOSAL_DISCRIMINATOR: [u8; 8] = [26, 94, 189, 187, 116, 136, 53, 33]; + +// --------------------------------------------------------------------------- +// Accounts +// --------------------------------------------------------------------------- + +#[derive(Accounts)] +#[instruction(args: MultisigExecuteArgs)] +pub struct MultisigExecute<'info> { + #[account(mut)] + pub owner: Signer<'info>, + + #[account( + mut, + seeds = [b"policy", policy.owner.as_ref(), policy.agent.as_ref()], + bump = policy.bump, + has_one = owner, + )] + pub policy: Account<'info, PermissionPolicy>, + + #[account( + mut, + seeds = [b"tracker", policy.key().as_ref()], + bump = spend_tracker.bump, + has_one = policy, + )] + pub spend_tracker: Account<'info, SpendTracker>, + + /// CHECK: Owner verified to be Squads program, data deserialized manually in handler. + pub squads_proposal: UncheckedAccount<'info>, + + /// CHECK: Validated against policy.allowed_programs in handler. + pub target_program: UncheckedAccount<'info>, + + pub system_program: Program<'info, System>, +} + +// --------------------------------------------------------------------------- +// Args +// --------------------------------------------------------------------------- + +#[derive(AnchorSerialize, AnchorDeserialize)] +pub struct MultisigExecuteArgs { + /// Raw instruction data to pass to the target program. + pub instruction_data: Vec, + /// Owner-declared spending amount in lamports. + pub amount_hint: u64, + /// Optional index into remaining_accounts for balance-diff enforcement. + pub input_account_index: Option, +} + +// --------------------------------------------------------------------------- +// Handler +// --------------------------------------------------------------------------- + +pub fn handler(ctx: Context, args: MultisigExecuteArgs) -> Result<()> { + let clock = Clock::get()?; + let now = clock.unix_timestamp; + let target_program_key = ctx.accounts.target_program.key(); + + // Capture policy fields as locals before mutable borrows + let policy_key = ctx.accounts.policy.key(); + let owner_key = ctx.accounts.owner.key(); + let policy_owner_key = ctx.accounts.policy.owner; + let policy_agent_key = ctx.accounts.policy.agent; + let policy_bump = ctx.accounts.policy.bump; + let squads_proposal_key = ctx.accounts.squads_proposal.key(); + + // ----------------------------------------------------------------------- + // Steps 2-5: Pre-validation checks + // ----------------------------------------------------------------------- + + // Step 2: Kill switch -- reject immediately if policy is paused + if !ctx.accounts.policy.is_active { + emit!(GuardedTxnRejected { + policy: policy_key, + agent: owner_key, + reason: 0, // PolicyPaused + timestamp: now, + }); + return err!(GuardrailsError::PolicyPaused); + } + + // Step 3: Session expiry -- reject if agent key has expired + if now >= ctx.accounts.policy.session_expiry { + emit!(GuardedTxnRejected { + policy: policy_key, + agent: owner_key, + reason: 1, // SessionExpired + timestamp: now, + }); + return err!(GuardrailsError::SessionExpired); + } + + // Step 4: Program whitelist -- reject if target is not allowed + if !ctx.accounts.policy.allowed_programs.contains(&target_program_key) { + emit!(GuardedTxnRejected { + policy: policy_key, + agent: owner_key, + reason: 2, // ProgramNotWhitelisted + timestamp: now, + }); + return err!(GuardrailsError::ProgramNotWhitelisted); + } + + // Step 5: Per-tx amount check -- parse real amount for known programs + let mut verified_amount = parse_verified_amount( + &target_program_key, + &args.instruction_data, + args.amount_hint, + )?; + if verified_amount > ctx.accounts.policy.max_tx_lamports { + emit!(GuardedTxnRejected { + policy: policy_key, + agent: owner_key, + reason: 3, // AmountExceedsLimit + timestamp: now, + }); + return err!(GuardrailsError::AmountExceedsLimit); + } + + // ----------------------------------------------------------------------- + // Step 6: Roll daily budget window if expired + // ----------------------------------------------------------------------- + + if ctx.accounts.policy.is_budget_window_expired(now) { + ctx.accounts.policy.daily_spent_lamports = 0; + ctx.accounts.policy.last_reset_ts = now; + ctx.accounts.spend_tracker.lamports_spent_24h = 0; + ctx.accounts.spend_tracker.txn_count_24h = 0; + ctx.accounts.spend_tracker.window_start = now; + ctx.accounts.spend_tracker.unique_destinations_24h = 0; + ctx.accounts.spend_tracker.max_single_txn_lamports = 0; + ctx.accounts.spend_tracker.failed_txn_count_24h = 0; + ctx.accounts.spend_tracker.unique_programs_24h = 0; + } + + // Roll 1h spend window if expired + let one_hour: i64 = 3600; + if now.checked_sub(ctx.accounts.spend_tracker.window_start_1h) + .map_or(true, |elapsed| elapsed >= one_hour) + { + ctx.accounts.spend_tracker.lamports_spent_1h = 0; + ctx.accounts.spend_tracker.window_start_1h = now; + } + + // ----------------------------------------------------------------------- + // Step 7: Daily budget check (after potential reset) + // ----------------------------------------------------------------------- + + let budget_after = ctx.accounts.policy.daily_spent_lamports + .checked_add(verified_amount) + .unwrap_or(u64::MAX); + if budget_after > ctx.accounts.policy.daily_budget_lamports { + emit!(GuardedTxnRejected { + policy: policy_key, + agent: owner_key, + reason: 4, // DailyBudgetExceeded + timestamp: now, + }); + return err!(GuardrailsError::DailyBudgetExceeded); + } + + // ----------------------------------------------------------------------- + // Step 8: Squads proposal verification (replaces escalation check) + // ----------------------------------------------------------------------- + + // Policy must have a squads_multisig configured + require!( + ctx.accounts.policy.squads_multisig.is_some(), + GuardrailsError::NoMultisigConfigured + ); + + // Verify squads_proposal is owned by the Squads v4 program + let proposal_info = ctx.accounts.squads_proposal.to_account_info(); + require!( + *proposal_info.owner == squads_program_id(), + GuardrailsError::InvalidSquadsProposal + ); + + // Deserialize proposal account data manually + let proposal_data = proposal_info.try_borrow_data()?; + + // Verify discriminator (first 8 bytes) + require!( + proposal_data.len() >= 49, // 8 discriminator + 32 multisig + 1 status + padding + GuardrailsError::InvalidSquadsProposal + ); + require!( + proposal_data[0..8] == SQUADS_PROPOSAL_DISCRIMINATOR, + GuardrailsError::InvalidSquadsProposal + ); + + // Verify multisig field (bytes 8..40) matches policy's squads_multisig + let proposal_multisig = Pubkey::try_from(&proposal_data[8..40]) + .map_err(|_| GuardrailsError::InvalidSquadsProposal)?; + require!( + proposal_multisig == ctx.accounts.policy.squads_multisig.unwrap(), + GuardrailsError::MultisigMismatch + ); + + // Verify status byte at offset 48: 3 = Approved, 4 = Executing, 5 = Executed + let status = proposal_data[48]; + require!( + status == 3 || status == 4 || status == 5, + GuardrailsError::ProposalNotApproved + ); + + // Drop the borrow before CPI + drop(proposal_data); + + // ----------------------------------------------------------------------- + // Step 9: Emit pre-CPI event + // ----------------------------------------------------------------------- + + emit!(GuardedTxnAttempted { + policy: policy_key, + agent: owner_key, + target_program: target_program_key, + amount_hint: verified_amount, + timestamp: now, + }); + + // ----------------------------------------------------------------------- + // Step 10: Execute the transfer / CPI + // ----------------------------------------------------------------------- + + let system_program_id = anchor_lang::solana_program::system_program::ID; + + if target_program_key == system_program_id { + // --- SOL transfer: direct lamport manipulation --- + let ra = ctx.remaining_accounts; + require!(!ra.is_empty(), GuardrailsError::CpiExecutionFailed); + let destination = &ra[0]; + + // Ensure policy PDA retains rent-exempt minimum after debit + let rent = Rent::get()?; + let policy_info = ctx.accounts.policy.to_account_info(); + let min_balance = rent.minimum_balance(policy_info.data_len()); + let current_lamports = policy_info.lamports(); + + require!( + current_lamports + .checked_sub(verified_amount) + .map_or(false, |remaining| remaining >= min_balance), + GuardrailsError::InsufficientLamports + ); + + // Debit policy PDA, credit destination + **policy_info.try_borrow_mut_lamports()? -= verified_amount; + **destination.try_borrow_mut_lamports()? += verified_amount; + } else { + // --- Token / DeFi CPI: invoke_signed with balance diff enforcement --- + + // Balance diff is mandatory for all CPI calls + require!( + args.input_account_index.is_some(), + GuardrailsError::InputAccountIndexRequired + ); + + let ra = ctx.remaining_accounts; + + // Snapshot balance before CPI + let balance_before: Option = if let Some(idx) = args.input_account_index { + let idx = idx as usize; + require!( + idx < ra.len(), + GuardrailsError::InvalidInputAccountIndex + ); + Some(snapshot_balance(&ra[idx])?) + } else { + None + }; + + // Build and execute CPI + let cpi_account_metas: Vec = ra + .iter() + .filter(|acc| acc.key != &target_program_key) + .map(|acc| { + let is_signer = acc.is_signer || *acc.key == policy_key; + if acc.is_writable { + AccountMeta::new(*acc.key, is_signer) + } else { + AccountMeta::new_readonly(*acc.key, is_signer) + } + }) + .collect(); + + let cpi_ix = Instruction { + program_id: target_program_key, + accounts: cpi_account_metas, + data: args.instruction_data, + }; + + let cpi_account_infos = ra; + let bump_slice = &[policy_bump]; + let signer_seeds: &[&[u8]] = &[ + b"policy", + policy_owner_key.as_ref(), + policy_agent_key.as_ref(), + bump_slice, + ]; + + let cpi_result = invoke_signed(&cpi_ix, cpi_account_infos, &[signer_seeds]); + + if let Err(_e) = cpi_result { + emit!(GuardedTxnRejected { + policy: policy_key, + agent: owner_key, + reason: 5, // CpiFailure + timestamp: now, + }); + + return err!(GuardrailsError::CpiExecutionFailed); + } + + // Post-CPI: enforce actual spend via balance diff + if let (Some(before), Some(idx)) = (balance_before, args.input_account_index) { + let measured_account = &ctx.remaining_accounts[idx as usize]; + let after = snapshot_balance(measured_account)?; + let actual_spent = before.saturating_sub(after); + let is_token_account = *measured_account.owner == anchor_spl::token::ID; + + if is_token_account { + // Token account: enforce per-tx token limit + require!( + actual_spent <= ctx.accounts.policy.max_tx_token_units, + GuardrailsError::AmountExceedsLimit + ); + } else { + // SOL account: enforce per-tx lamport limit + daily budget + require!( + actual_spent <= ctx.accounts.policy.max_tx_lamports, + GuardrailsError::AmountExceedsLimit + ); + + require!( + ctx.accounts + .policy + .daily_spent_lamports + .checked_add(actual_spent) + .ok_or(GuardrailsError::DailyBudgetExceeded)? + <= ctx.accounts.policy.daily_budget_lamports, + GuardrailsError::DailyBudgetExceeded + ); + } + + // Use actual_spent for counters + verified_amount = actual_spent; + } + } + + // ----------------------------------------------------------------------- + // Step 11: Update spend counters and emit success event + // ----------------------------------------------------------------------- + + ctx.accounts.policy.daily_spent_lamports = ctx + .accounts + .policy + .daily_spent_lamports + .checked_add(verified_amount) + .ok_or(GuardrailsError::DailyBudgetExceeded)?; + + ctx.accounts.spend_tracker.lamports_spent_24h = ctx + .accounts + .spend_tracker + .lamports_spent_24h + .checked_add(verified_amount) + .ok_or(GuardrailsError::DailyBudgetExceeded)?; + ctx.accounts.spend_tracker.txn_count_24h = + ctx.accounts.spend_tracker.txn_count_24h.saturating_add(1); + + // Track max single transaction amount + if verified_amount > ctx.accounts.spend_tracker.max_single_txn_lamports { + ctx.accounts.spend_tracker.max_single_txn_lamports = verified_amount; + } + + // Track 1h spend + ctx.accounts.spend_tracker.lamports_spent_1h = ctx + .accounts + .spend_tracker + .lamports_spent_1h + .checked_add(verified_amount) + .unwrap_or(u64::MAX); + + // Approximate unique programs: increment when program changes + if ctx.accounts.spend_tracker.last_txn_program != Pubkey::default() + && target_program_key != ctx.accounts.spend_tracker.last_txn_program + { + ctx.accounts.spend_tracker.unique_programs_24h = + ctx.accounts.spend_tracker.unique_programs_24h.saturating_add(1); + } else if ctx.accounts.spend_tracker.last_txn_program == Pubkey::default() { + // First transaction ever -- count this program + ctx.accounts.spend_tracker.unique_programs_24h = 1; + } + + // Consecutive high-amount tracking (>80% of per-tx cap) + let high_threshold = ctx.accounts.policy.max_tx_lamports / 5 * 4; // 80% + if verified_amount > high_threshold { + ctx.accounts.spend_tracker.consecutive_high_amount_count = + ctx.accounts.spend_tracker.consecutive_high_amount_count.saturating_add(1); + } else { + ctx.accounts.spend_tracker.consecutive_high_amount_count = 0; + } + + ctx.accounts.spend_tracker.last_txn_ts = now; + ctx.accounts.spend_tracker.last_txn_program = target_program_key; + + emit!(MultisigTxnExecuted { + policy: policy_key, + owner: owner_key, + target_program: target_program_key, + amount: verified_amount, + squads_proposal: squads_proposal_key, + timestamp: now, + }); + + Ok(()) +} diff --git a/program/programs/guardrails/src/instructions/shared.rs b/program/programs/guardrails/src/instructions/shared.rs new file mode 100644 index 0000000..259c685 --- /dev/null +++ b/program/programs/guardrails/src/instructions/shared.rs @@ -0,0 +1,74 @@ +//! Shared utility functions used by both `guarded_execute` and `multisig_execute`. + +use anchor_lang::prelude::*; +use crate::errors::GuardrailsError; + +/// Parses and verifies the real transfer amount from instruction data for known +/// programs (System Program, Token Program). For unknown programs, returns the +/// agent-supplied amount_hint as-is. +/// +/// For known programs, the parsed amount must EXACTLY match amount_hint. +/// This prevents agents from understating amounts to bypass budget checks. +pub fn parse_verified_amount( + target_program: &Pubkey, + instruction_data: &[u8], + amount_hint: u64, +) -> Result { + let system_program_id = anchor_lang::solana_program::system_program::ID; + let token_program_id = anchor_spl::token::ID; + + if *target_program == system_program_id { + // System Program transfer layout: + // bytes 0-3: u32 instruction index (2 = Transfer) + // bytes 4-11: u64 lamports (little-endian) + if instruction_data.len() >= 12 { + let ix_index = u32::from_le_bytes(instruction_data[0..4].try_into().unwrap()); + if ix_index == 2 { + let parsed_amount = u64::from_le_bytes(instruction_data[4..12].try_into().unwrap()); + require!( + parsed_amount == amount_hint, + GuardrailsError::AmountMismatch + ); + return Ok(parsed_amount); + } + } + // Non-transfer System Program instruction (e.g., CreateAccount): use hint + Ok(amount_hint) + } else if *target_program == token_program_id { + // Token Program transfer layout: + // byte 0: u8 discriminator (3 = Transfer) + // bytes 1-8: u64 amount (little-endian) + if instruction_data.len() >= 9 { + let discriminator = instruction_data[0]; + if discriminator == 3 { + let parsed_amount = u64::from_le_bytes(instruction_data[1..9].try_into().unwrap()); + require!( + parsed_amount == amount_hint, + GuardrailsError::AmountMismatch + ); + return Ok(parsed_amount); + } + } + // Non-transfer Token Program instruction: use hint + Ok(amount_hint) + } else { + // Unknown program (Jupiter, Marinade, etc.): trust hint. + // Server does post-hoc balance-diff detection for anomalies. + Ok(amount_hint) + } +} + +/// Reads the balance of an account -- token amount for SPL token accounts, +/// lamports for everything else. Used for before/after balance diff enforcement. +pub fn snapshot_balance(account_info: &AccountInfo) -> Result { + if *account_info.owner == anchor_spl::token::ID { + // SPL token account -- read the amount field at offset 64..72 + let data = account_info.try_borrow_data()?; + require!(data.len() >= 72, GuardrailsError::InvalidInputAccountIndex); + let amount = u64::from_le_bytes(data[64..72].try_into().unwrap()); + Ok(amount) + } else { + // SOL account -- use lamports + Ok(account_info.lamports()) + } +} diff --git a/program/programs/guardrails/src/lib.rs b/program/programs/guardrails/src/lib.rs index 122cc0b..d76a283 100644 --- a/program/programs/guardrails/src/lib.rs +++ b/program/programs/guardrails/src/lib.rs @@ -18,6 +18,7 @@ pub use instructions::close_policy::*; pub use instructions::escalate_to_squads::*; pub use instructions::guarded_execute::*; pub use instructions::initialize_policy::*; +pub use instructions::multisig_execute::*; pub use instructions::pause_agent::*; pub use instructions::resume_agent::*; pub use instructions::rotate_agent_key::*; @@ -55,6 +56,13 @@ pub mod guardrails { instructions::guarded_execute::handler(ctx, args) } + /// Executes a multisig-approved transaction through the policy layer. + /// Called by the policy owner after a Squads proposal has been approved. + /// Skips the escalation threshold check but enforces all other policy limits. + pub fn multisig_execute(ctx: Context, args: MultisigExecuteArgs) -> Result<()> { + instructions::multisig_execute::handler(ctx, args) + } + /// Pauses an agent. Callable by the policy owner or any authorized monitor. /// Sets is_active = false, preventing all guarded_execute calls. pub fn pause_agent(ctx: Context, args: PauseAgentArgs) -> Result<()> { diff --git a/sdk/client.ts b/sdk/client.ts index 98959a6..a33f3c5 100644 --- a/sdk/client.ts +++ b/sdk/client.ts @@ -205,7 +205,36 @@ export class GuardrailsClient { }) .remainingAccounts(remainingAccounts) .signers([agent]) - .rpc(); + .rpc({ skipPreflight: true, maxRetries: 0 }); + } + + /** + * Executes a multisig-approved transaction through the policy layer. + * The provider wallet must be the policy owner. + * Verifies the Squads proposal is approved, then transfers from the policy PDA. + * Skips escalation threshold but enforces all other policy limits. + */ + async multisigExecute( + policyPda: PublicKey, + trackerPda: PublicKey, + squadsProposal: PublicKey, + targetProgram: PublicKey, + args: GuardedExecuteArgs, + remainingAccounts: AccountMeta[], + ): Promise { + const owner = this.walletPublicKey(); + return await (this.program.methods as any) + .multisigExecute(args) + .accounts({ + owner, + policy: policyPda, + spendTracker: trackerPda, + squadsProposal, + targetProgram, + systemProgram: SystemProgram.programId, + }) + .remainingAccounts(remainingAccounts) + .rpc({ skipPreflight: true, maxRetries: 0 }); } /** diff --git a/sdk/idl/guardrails.json b/sdk/idl/guardrails.json index 16bb72c..e8283b7 100644 --- a/sdk/idl/guardrails.json +++ b/sdk/idl/guardrails.json @@ -353,6 +353,110 @@ } ] }, + { + "name": "multisig_execute", + "docs": [ + "Executes a multisig-approved transaction through the policy layer.", + "Called by the policy owner after a Squads proposal has been approved.", + "Skips the escalation threshold check but enforces all other policy limits." + ], + "discriminator": [ + 151, + 179, + 145, + 71, + 190, + 96, + 47, + 69 + ], + "accounts": [ + { + "name": "owner", + "writable": true, + "signer": true, + "relations": [ + "policy" + ] + }, + { + "name": "policy", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 112, + 111, + 108, + 105, + 99, + 121 + ] + }, + { + "kind": "account", + "path": "policy.owner", + "account": "PermissionPolicy" + }, + { + "kind": "account", + "path": "policy.agent", + "account": "PermissionPolicy" + } + ] + }, + "relations": [ + "spend_tracker" + ] + }, + { + "name": "spend_tracker", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 116, + 114, + 97, + 99, + 107, + 101, + 114 + ] + }, + { + "kind": "account", + "path": "policy" + } + ] + } + }, + { + "name": "squads_proposal" + }, + { + "name": "target_program" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "args", + "type": { + "defined": { + "name": "MultisigExecuteArgs" + } + } + } + ] + }, { "name": "pause_agent", "docs": [ @@ -1074,6 +1178,19 @@ 39 ] }, + { + "name": "MultisigTxnExecuted", + "discriminator": [ + 129, + 235, + 64, + 97, + 94, + 97, + 28, + 13 + ] + }, { "name": "PolicyClosed", "discriminator": [ @@ -1198,6 +1315,26 @@ "code": 6021, "name": "SameAgentKey", "msg": "New agent key must be different from current agent key" + }, + { + "code": 6022, + "name": "InvalidSquadsProposal", + "msg": "Squads proposal account is invalid or not owned by Squads program" + }, + { + "code": 6023, + "name": "MultisigMismatch", + "msg": "Squads proposal multisig does not match policy's squads_multisig" + }, + { + "code": 6024, + "name": "ProposalNotApproved", + "msg": "Squads proposal has not been approved" + }, + { + "code": 6025, + "name": "NoMultisigConfigured", + "msg": "Policy has no squads_multisig configured" } ], "types": [ @@ -1631,6 +1768,73 @@ ] } }, + { + "name": "MultisigExecuteArgs", + "type": { + "kind": "struct", + "fields": [ + { + "name": "instruction_data", + "docs": [ + "Raw instruction data to pass to the target program." + ], + "type": "bytes" + }, + { + "name": "amount_hint", + "docs": [ + "Owner-declared spending amount in lamports." + ], + "type": "u64" + }, + { + "name": "input_account_index", + "docs": [ + "Optional index into remaining_accounts for balance-diff enforcement." + ], + "type": { + "option": "u8" + } + } + ] + } + }, + { + "name": "MultisigTxnExecuted", + "docs": [ + "Emitted after a successful multisig_execute transfer.", + "The server uses this to resolve the escalation proposal and update the dashboard." + ], + "type": { + "kind": "struct", + "fields": [ + { + "name": "policy", + "type": "pubkey" + }, + { + "name": "owner", + "type": "pubkey" + }, + { + "name": "target_program", + "type": "pubkey" + }, + { + "name": "amount", + "type": "u64" + }, + { + "name": "squads_proposal", + "type": "pubkey" + }, + { + "name": "timestamp", + "type": "i64" + } + ] + } + }, { "name": "PauseAgentArgs", "docs": [ diff --git a/server/package.json b/server/package.json index 154c13e..55d5e76 100644 --- a/server/package.json +++ b/server/package.json @@ -19,6 +19,7 @@ "@coral-xyz/anchor": "^0.30.1", "@prisma/client": "^6.19.3", "@solana/web3.js": "^1.98.4", + "@sqds/multisig": "^2.1.4", "cookie-parser": "^1.4.7", "cors": "^2.8.6", "dotenv": "^17.4.2", diff --git a/server/pnpm-lock.yaml b/server/pnpm-lock.yaml index 5f9dfc3..174580c 100644 --- a/server/pnpm-lock.yaml +++ b/server/pnpm-lock.yaml @@ -20,6 +20,9 @@ importers: '@solana/web3.js': specifier: ^1.98.4 version: 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@sqds/multisig': + specifier: ^2.1.4 + version: 2.1.4(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) cookie-parser: specifier: ^1.4.7 version: 1.4.7 @@ -267,6 +270,15 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@metaplex-foundation/beet-solana@0.4.0': + resolution: {integrity: sha512-B1L94N3ZGMo53b0uOSoznbuM5GBNJ8LwSeznxBxJ+OThvfHQ4B5oMUqb+0zdLRfkKGS7Q6tpHK9P+QK0j3w2cQ==} + + '@metaplex-foundation/beet@0.7.1': + resolution: {integrity: sha512-hNCEnS2WyCiYyko82rwuISsBY3KYpe828ubsd2ckeqZr7tl0WVLivGkoyA/qdiaaHEBGdGl71OpfWa2rqL3DiA==} + + '@metaplex-foundation/cusper@0.0.2': + resolution: {integrity: sha512-S9RulC2fFCFOQraz61bij+5YCHhSO9llJegK8c8Y6731fSi6snUSQJdCUqYS8AIgR0TKbQvdvgSyIIdbDFZbBA==} + '@napi-rs/wasm-runtime@1.1.4': resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} peerDependencies: @@ -409,22 +421,58 @@ packages: '@rolldown/pluginutils@1.0.0-rc.17': resolution: {integrity: sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==} + '@solana/buffer-layout-utils@0.2.0': + resolution: {integrity: sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==} + engines: {node: '>= 10'} + '@solana/buffer-layout@4.0.1': resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} engines: {node: '>=5.10'} + '@solana/codecs-core@2.0.0-rc.1': + resolution: {integrity: sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ==} + peerDependencies: + typescript: '>=5' + '@solana/codecs-core@2.3.0': resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/codecs-data-structures@2.0.0-rc.1': + resolution: {integrity: sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog==} + peerDependencies: + typescript: '>=5' + + '@solana/codecs-numbers@2.0.0-rc.1': + resolution: {integrity: sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ==} + peerDependencies: + typescript: '>=5' + '@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-strings@2.0.0-rc.1': + resolution: {integrity: sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g==} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: '>=5' + + '@solana/codecs@2.0.0-rc.1': + resolution: {integrity: sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ==} + peerDependencies: + typescript: '>=5' + + '@solana/errors@2.0.0-rc.1': + resolution: {integrity: sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ==} + hasBin: true + peerDependencies: + typescript: '>=5' + '@solana/errors@2.3.0': resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} engines: {node: '>=20.18.0'} @@ -432,9 +480,30 @@ packages: peerDependencies: typescript: '>=5.3.3' + '@solana/options@2.0.0-rc.1': + resolution: {integrity: sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA==} + peerDependencies: + typescript: '>=5' + + '@solana/spl-token-metadata@0.1.6': + resolution: {integrity: sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.95.3 + + '@solana/spl-token@0.3.11': + resolution: {integrity: sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.88.0 + '@solana/web3.js@1.98.4': resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} + '@sqds/multisig@2.1.4': + resolution: {integrity: sha512-5w+NmwHOzl96nI50R/fjSD6uFydRLNUquhoEmmWbGepS4D9DnQyF2TKcUBfTyxV3sgJt00ypBt7SXB3y8WOzUQ==} + engines: {node: '>=14'} + '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -444,6 +513,9 @@ packages: '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/bn.js@5.2.0': + resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==} + '@types/body-parser@1.19.6': resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} @@ -568,12 +640,18 @@ packages: resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} engines: {node: '>= 8.0.0'} + ansicolors@0.3.2: + resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} + array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + assert@2.1.0: + resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -581,12 +659,29 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + base-x@3.0.11: resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} + base-x@4.0.1: + resolution: {integrity: sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + bigint-buffer@1.1.5: + resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} + engines: {node: '>= 10.0.0'} + + bignumber.js@9.3.1: + resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + bn.js@5.2.3: resolution: {integrity: sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==} @@ -600,6 +695,9 @@ packages: bs58@4.0.1: resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + bs58@5.0.0: + resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} + buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} @@ -630,6 +728,10 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} + engines: {node: '>= 0.4'} + call-bound@1.0.4: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} @@ -660,6 +762,10 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + commander@14.0.3: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} @@ -741,6 +847,14 @@ packages: resolution: {integrity: sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==} engines: {node: '>=16.0.0'} + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + defu@6.1.7: resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} @@ -883,6 +997,9 @@ packages: fast-stable-stringify@1.0.0: resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} + fastestsmallesttextencoderdecoder@1.0.22: + resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -892,10 +1009,17 @@ packages: picomatch: optional: true + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + finalhandler@1.3.2: resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} engines: {node: '>= 0.8'} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + form-data-encoder@1.7.2: resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} @@ -927,6 +1051,10 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -946,6 +1074,9 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -975,6 +1106,9 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + ip-address@10.1.0: resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} engines: {node: '>= 12'} @@ -983,6 +1117,30 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + isomorphic-ws@4.0.1: resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} peerDependencies: @@ -997,6 +1155,9 @@ packages: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} @@ -1101,6 +1262,10 @@ packages: lodash.once@4.1.1: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -1192,6 +1357,18 @@ packages: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} @@ -1231,6 +1408,10 @@ packages: pkg-types@2.3.0: resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + postcss@8.5.10: resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} engines: {node: ^10 || ^12 || >=14} @@ -1285,6 +1466,10 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -1301,6 +1486,10 @@ packages: resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} engines: {node: '>= 0.8.0'} + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -1423,6 +1612,9 @@ packages: resolution: {integrity: sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA==} engines: {node: '>=6.14.2'} + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} @@ -1533,6 +1725,10 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + engines: {node: '>= 0.4'} + why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} @@ -1708,6 +1904,29 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.5': {} + '@metaplex-foundation/beet-solana@0.4.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@metaplex-foundation/beet': 0.7.1 + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + bs58: 5.0.0 + debug: 4.4.3 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - typescript + - utf-8-validate + + '@metaplex-foundation/beet@0.7.1': + dependencies: + ansicolors: 0.3.2 + bn.js: 5.2.3 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@metaplex-foundation/cusper@0.0.2': {} + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: '@emnapi/core': 1.10.0 @@ -1813,27 +2032,115 @@ snapshots: '@rolldown/pluginutils@1.0.0-rc.17': {} + '@solana/buffer-layout-utils@0.2.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + bigint-buffer: 1.1.5 + bignumber.js: 9.3.1 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + '@solana/buffer-layout@4.0.1': dependencies: buffer: 6.0.3 + '@solana/codecs-core@2.0.0-rc.1(typescript@5.9.3)': + dependencies: + '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) + typescript: 5.9.3 + '@solana/codecs-core@2.3.0(typescript@5.9.3)': dependencies: '@solana/errors': 2.3.0(typescript@5.9.3) typescript: 5.9.3 + '@solana/codecs-data-structures@2.0.0-rc.1(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3) + '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/codecs-numbers@2.0.0-rc.1(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) + '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) + typescript: 5.9.3 + '@solana/codecs-numbers@2.3.0(typescript@5.9.3)': dependencies: '@solana/codecs-core': 2.3.0(typescript@5.9.3) '@solana/errors': 2.3.0(typescript@5.9.3) typescript: 5.9.3 + '@solana/codecs-strings@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3) + '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) + fastestsmallesttextencoderdecoder: 1.0.22 + typescript: 5.9.3 + + '@solana/codecs@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) + '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.9.3) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3) + '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/options': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/errors@2.0.0-rc.1(typescript@5.9.3)': + dependencies: + chalk: 5.6.2 + commander: 12.1.0 + typescript: 5.9.3 + '@solana/errors@2.3.0(typescript@5.9.3)': dependencies: chalk: 5.6.2 commander: 14.0.3 typescript: 5.9.3 + '@solana/options@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) + '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.9.3) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3) + '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - typescript + + '@solana/spl-token@0.3.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + buffer: 6.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + '@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': dependencies: '@babel/runtime': 7.29.2 @@ -1857,6 +2164,26 @@ snapshots: - typescript - utf-8-validate + '@sqds/multisig@2.1.4(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@metaplex-foundation/beet': 0.7.1 + '@metaplex-foundation/beet-solana': 0.4.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@metaplex-foundation/cusper': 0.0.2 + '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@types/bn.js': 5.2.0 + assert: 2.1.0 + bn.js: 5.2.3 + buffer: 6.0.3 + invariant: 2.2.4 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - supports-color + - typescript + - utf-8-validate + '@standard-schema/spec@1.1.0': {} '@swc/helpers@0.5.21': @@ -1868,6 +2195,10 @@ snapshots: tslib: 2.8.1 optional: true + '@types/bn.js@5.2.0': + dependencies: + '@types/node': 20.19.39 + '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 @@ -2024,20 +2355,46 @@ snapshots: dependencies: humanize-ms: 1.2.1 + ansicolors@0.3.2: {} + array-flatten@1.1.1: {} asap@2.0.6: {} + assert@2.1.0: + dependencies: + call-bind: 1.0.9 + is-nan: 1.3.2 + object-is: 1.1.6 + object.assign: 4.1.7 + util: 0.12.5 + assertion-error@2.0.1: {} asynckit@0.4.0: {} + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + base-x@3.0.11: dependencies: safe-buffer: 5.2.1 + base-x@4.0.1: {} + base64-js@1.5.1: {} + bigint-buffer@1.1.5: + dependencies: + bindings: 1.5.0 + + bignumber.js@9.3.1: {} + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + bn.js@5.2.3: {} body-parser@1.20.4: @@ -2067,6 +2424,10 @@ snapshots: dependencies: base-x: 3.0.11 + bs58@5.0.0: + dependencies: + base-x: 4.0.1 + buffer-equal-constant-time@1.0.1: {} buffer-layout@1.2.2: {} @@ -2103,6 +2464,13 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 + call-bind@1.0.9: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + call-bound@1.0.4: dependencies: call-bind-apply-helpers: 1.0.2 @@ -2128,6 +2496,8 @@ snapshots: dependencies: delayed-stream: 1.0.0 + commander@12.1.0: {} + commander@14.0.3: {} commander@2.20.3: {} @@ -2184,6 +2554,18 @@ snapshots: deepmerge-ts@7.1.5: {} + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + defu@6.1.7: {} delay@5.0.0: {} @@ -2354,10 +2736,14 @@ snapshots: fast-stable-stringify@1.0.0: {} + fastestsmallesttextencoderdecoder@1.0.22: {} + fdir@6.5.0(picomatch@4.0.4): optionalDependencies: picomatch: 4.0.4 + file-uri-to-path@1.0.0: {} + finalhandler@1.3.2: dependencies: debug: 2.6.9 @@ -2370,6 +2756,10 @@ snapshots: transitivePeerDependencies: - supports-color + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + form-data-encoder@1.7.2: {} form-data@4.0.5: @@ -2400,6 +2790,8 @@ snapshots: function-bind@1.1.2: {} + generator-function@2.0.1: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -2433,6 +2825,10 @@ snapshots: gopd@1.2.0: {} + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + has-symbols@1.1.0: {} has-tostringtag@1.0.2: @@ -2463,10 +2859,45 @@ snapshots: inherits@2.0.4: {} + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + ip-address@10.1.0: {} ipaddr.js@1.9.1: {} + is-arguments@1.2.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-nan@1.3.2: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.3 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.20 + isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@6.0.6)): dependencies: ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@6.0.6) @@ -2491,6 +2922,8 @@ snapshots: jiti@2.6.1: {} + js-tokens@4.0.0: {} + json-stringify-safe@5.0.1: {} jsonwebtoken@9.0.3: @@ -2580,6 +3013,10 @@ snapshots: lodash.once@4.1.1: {} + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + lower-case@2.0.2: dependencies: tslib: 2.8.1 @@ -2640,6 +3077,22 @@ snapshots: object-inspect@1.13.4: {} + object-is@1.1.6: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + obug@2.1.1: {} ohash@2.0.11: {} @@ -2672,6 +3125,8 @@ snapshots: exsolve: 1.0.8 pathe: 2.0.3 + possible-typed-array-names@1.1.0: {} + postcss@8.5.10: dependencies: nanoid: 3.3.11 @@ -2752,6 +3207,12 @@ snapshots: safe-buffer@5.2.1: {} + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + safer-buffer@2.1.2: {} semver@7.7.4: {} @@ -2783,6 +3244,15 @@ snapshots: transitivePeerDependencies: - supports-color + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + setprototypeof@1.2.0: {} side-channel-list@1.0.1: @@ -2908,6 +3378,14 @@ snapshots: node-gyp-build: 4.8.4 optional: true + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.1.2 + is-typed-array: 1.1.15 + which-typed-array: 1.1.20 + utils-merge@1.0.1: {} uuid@11.1.0: {} @@ -2966,6 +3444,16 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 + which-typed-array@1.1.20: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 diff --git a/server/src/api/routes/escalations.ts b/server/src/api/routes/escalations.ts index 8d2c555..d90af4f 100644 --- a/server/src/api/routes/escalations.ts +++ b/server/src/api/routes/escalations.ts @@ -11,6 +11,109 @@ import type { AuthenticatedRequest } from "../middleware/auth.js"; export const escalationsRouter: express.Router = express.Router(); +// Report an escalation from the client. +// Called when the client catches EscalatedToMultisig (Anchor error 6007). +// Helius does not parse failed transactions, so the webhook/poller pipeline +// can never see these — the client must report them directly. +escalationsRouter.post("/report", async (req, res) => { + try { + const { walletPubkey } = req as AuthenticatedRequest; + const { policyPubkey, txnSig, amountLamports, targetProgram, destination, instruction } = req.body; + + if (!policyPubkey || !txnSig || amountLamports == null || !targetProgram) { + res.status(400).json({ error: "policyPubkey, txnSig, amountLamports, and targetProgram are required" }); + return; + } + + // Verify policy exists and is owned by the caller + const policy = await prisma.policy.findUnique({ where: { pubkey: policyPubkey } }); + if (!policy || policy.owner !== walletPubkey) { + res.status(404).json({ error: "Policy not found" }); + return; + } + + if (!policy.squadsMultisig) { + res.status(400).json({ error: "Policy has no multisig configured" }); + return; + } + + // Deduplicate — skip if this txn was already recorded + const existing = await prisma.guardedTxn.findUnique({ where: { txnSig } }); + if (existing) { + res.json({ ok: true, duplicate: true }); + return; + } + + // Create the guarded_txn row with status "escalated" + const row = await prisma.guardedTxn.create({ + data: { + policyPubkey, + txnSig, + slot: BigInt(0), + blockTime: new Date(), + targetProgram, + amountLamports: BigInt(amountLamports), + destination: destination ?? null, + status: "escalated", + rejectReason: "EscalatedToMultisig", + rawEvent: instruction ? { _reconstructed: true, instruction } : undefined, + }, + }); + + // Emit new_transaction SSE event + sseEmitter.emitEvent("new_transaction", { + id: row.id, + policyPubkey: row.policyPubkey, + txnSig: row.txnSig, + slot: "0", + blockTime: row.blockTime, + targetProgram: row.targetProgram, + amountLamports: row.amountLamports?.toString() ?? null, + status: row.status, + rejectReason: row.rejectReason, + rawEvent: null, + createdAt: row.createdAt, + }); + + // Create the escalation proposal + const proposal = await prisma.escalationProposal.create({ + data: { + policyPubkey, + txnId: row.id, + squadsMultisig: policy.squadsMultisig, + targetProgram, + amountLamports: BigInt(amountLamports), + status: "awaiting_proposal", + }, + }); + + sseEmitter.emitEvent("escalation_created", { + id: proposal.id, + policyPubkey: proposal.policyPubkey, + txnId: proposal.txnId, + squadsMultisig: proposal.squadsMultisig, + targetProgram: proposal.targetProgram, + amountLamports: proposal.amountLamports.toString(), + status: proposal.status, + createdAt: proposal.createdAt, + }); + + console.log( + `[api/escalations/report] created escalation for txn ${txnSig.slice(0, 16)}… ` + + `amount=${amountLamports} policy=${policyPubkey.slice(0, 8)}…`, + ); + + res.json({ + ok: true, + escalationId: proposal.id, + txnId: row.id, + }); + } catch (err) { + console.error("[api/escalations/report] error:", err); + res.status(500).json({ error: "Internal server error" }); + } +}); + // List escalation proposals escalationsRouter.get("/", async (req, res) => { try { diff --git a/server/src/sdk/client.ts b/server/src/sdk/client.ts index 98959a6..a33f3c5 100644 --- a/server/src/sdk/client.ts +++ b/server/src/sdk/client.ts @@ -205,7 +205,36 @@ export class GuardrailsClient { }) .remainingAccounts(remainingAccounts) .signers([agent]) - .rpc(); + .rpc({ skipPreflight: true, maxRetries: 0 }); + } + + /** + * Executes a multisig-approved transaction through the policy layer. + * The provider wallet must be the policy owner. + * Verifies the Squads proposal is approved, then transfers from the policy PDA. + * Skips escalation threshold but enforces all other policy limits. + */ + async multisigExecute( + policyPda: PublicKey, + trackerPda: PublicKey, + squadsProposal: PublicKey, + targetProgram: PublicKey, + args: GuardedExecuteArgs, + remainingAccounts: AccountMeta[], + ): Promise { + const owner = this.walletPublicKey(); + return await (this.program.methods as any) + .multisigExecute(args) + .accounts({ + owner, + policy: policyPda, + spendTracker: trackerPda, + squadsProposal, + targetProgram, + systemProgram: SystemProgram.programId, + }) + .remainingAccounts(remainingAccounts) + .rpc({ skipPreflight: true, maxRetries: 0 }); } /** diff --git a/server/src/sdk/idl/guardrails.json b/server/src/sdk/idl/guardrails.json index 16bb72c..e8283b7 100644 --- a/server/src/sdk/idl/guardrails.json +++ b/server/src/sdk/idl/guardrails.json @@ -353,6 +353,110 @@ } ] }, + { + "name": "multisig_execute", + "docs": [ + "Executes a multisig-approved transaction through the policy layer.", + "Called by the policy owner after a Squads proposal has been approved.", + "Skips the escalation threshold check but enforces all other policy limits." + ], + "discriminator": [ + 151, + 179, + 145, + 71, + 190, + 96, + 47, + 69 + ], + "accounts": [ + { + "name": "owner", + "writable": true, + "signer": true, + "relations": [ + "policy" + ] + }, + { + "name": "policy", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 112, + 111, + 108, + 105, + 99, + 121 + ] + }, + { + "kind": "account", + "path": "policy.owner", + "account": "PermissionPolicy" + }, + { + "kind": "account", + "path": "policy.agent", + "account": "PermissionPolicy" + } + ] + }, + "relations": [ + "spend_tracker" + ] + }, + { + "name": "spend_tracker", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 116, + 114, + 97, + 99, + 107, + 101, + 114 + ] + }, + { + "kind": "account", + "path": "policy" + } + ] + } + }, + { + "name": "squads_proposal" + }, + { + "name": "target_program" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "args", + "type": { + "defined": { + "name": "MultisigExecuteArgs" + } + } + } + ] + }, { "name": "pause_agent", "docs": [ @@ -1074,6 +1178,19 @@ 39 ] }, + { + "name": "MultisigTxnExecuted", + "discriminator": [ + 129, + 235, + 64, + 97, + 94, + 97, + 28, + 13 + ] + }, { "name": "PolicyClosed", "discriminator": [ @@ -1198,6 +1315,26 @@ "code": 6021, "name": "SameAgentKey", "msg": "New agent key must be different from current agent key" + }, + { + "code": 6022, + "name": "InvalidSquadsProposal", + "msg": "Squads proposal account is invalid or not owned by Squads program" + }, + { + "code": 6023, + "name": "MultisigMismatch", + "msg": "Squads proposal multisig does not match policy's squads_multisig" + }, + { + "code": 6024, + "name": "ProposalNotApproved", + "msg": "Squads proposal has not been approved" + }, + { + "code": 6025, + "name": "NoMultisigConfigured", + "msg": "Policy has no squads_multisig configured" } ], "types": [ @@ -1631,6 +1768,73 @@ ] } }, + { + "name": "MultisigExecuteArgs", + "type": { + "kind": "struct", + "fields": [ + { + "name": "instruction_data", + "docs": [ + "Raw instruction data to pass to the target program." + ], + "type": "bytes" + }, + { + "name": "amount_hint", + "docs": [ + "Owner-declared spending amount in lamports." + ], + "type": "u64" + }, + { + "name": "input_account_index", + "docs": [ + "Optional index into remaining_accounts for balance-diff enforcement." + ], + "type": { + "option": "u8" + } + } + ] + } + }, + { + "name": "MultisigTxnExecuted", + "docs": [ + "Emitted after a successful multisig_execute transfer.", + "The server uses this to resolve the escalation proposal and update the dashboard." + ], + "type": { + "kind": "struct", + "fields": [ + { + "name": "policy", + "type": "pubkey" + }, + { + "name": "owner", + "type": "pubkey" + }, + { + "name": "target_program", + "type": "pubkey" + }, + { + "name": "amount", + "type": "u64" + }, + { + "name": "squads_proposal", + "type": "pubkey" + }, + { + "name": "timestamp", + "type": "i64" + } + ] + } + }, { "name": "PauseAgentArgs", "docs": [ diff --git a/server/src/worker/pipeline/escalation-poller.ts b/server/src/worker/pipeline/escalation-poller.ts index e9f3f7d..3dc0f01 100644 --- a/server/src/worker/pipeline/escalation-poller.ts +++ b/server/src/worker/pipeline/escalation-poller.ts @@ -1,10 +1,8 @@ // Escalation status poller — periodically checks on-chain Squads proposal status // for pending escalations and updates the DB + emits SSE events on changes. -// -// Uses the @sqds/multisig SDK for reading proposal account state. -// No signing is needed — read-only fetches. import { Connection, PublicKey } from "@solana/web3.js"; +import * as multisig from "@sqds/multisig"; import { prisma } from "../../db/client.js"; import { sseEmitter } from "../../sse/emitter.js"; import { env } from "../../config/env.js"; @@ -13,20 +11,22 @@ import { env } from "../../config/env.js"; // Proposal status mapping // --------------------------------------------------------------------------- -/** Map Squads proposal status to our internal status. */ -function mapProposalStatus(accountData: Buffer): string | null { - // Squads v4 Proposal account layout: - // The status field is at a known offset in the account data. - // Status enum: 0=Draft, 1=Active, 2=Approved, 3=Executing, 4=Executed, - // 5=Rejected, 6=Cancelled, 7=Expired - // For MVP, we do a simple byte check. If the @sqds/multisig SDK is - // available, use its deserialization instead. - // - // This is a placeholder — the exact offset depends on the Squads v4 - // account layout. With the SDK, use Proposal.fromAccountInfo() instead. - - // Without @sqds/multisig, return null to indicate "cannot parse" - return null; +/** Map Squads proposal status kind to our internal status string. */ +function mapStatus(status: { __kind: string }): string | null { + switch (status.__kind) { + case "Active": + return "pending"; + case "Approved": + return "approved"; + case "Executed": + return "executed"; + case "Rejected": + return "rejected"; + case "Cancelled": + return "cancelled"; + default: + return null; + } } // --------------------------------------------------------------------------- @@ -52,42 +52,41 @@ async function pollEscalations(connection: Connection): Promise { try { const proposalPubkey = new PublicKey(proposal.proposalPda); - const accountInfo = await connection.getAccountInfo(proposalPubkey); - if (!accountInfo) { - // Account not found — proposal may have been cancelled or expired + let onChainProposal: multisig.generated.Proposal; + try { + onChainProposal = await multisig.accounts.Proposal.fromAccountAddress( + connection, + proposalPubkey, + ); + } catch { console.warn( - `[escalation-poller] proposal ${proposal.proposalPda.slice(0, 8)}… account not found`, + `[escalation-poller] proposal ${proposal.proposalPda.slice(0, 8)}… account not found or unparseable`, ); continue; } - // Try to determine status from account data - const newStatus = mapProposalStatus(Buffer.from(accountInfo.data)); - - // Without full SDK parsing, check if account owner changed or data length - // indicates execution. For now, log and skip until @sqds/multisig is - // integrated for proper deserialization. - if (newStatus && newStatus !== proposal.status) { - const updated = await prisma.escalationProposal.update({ - where: { id: proposal.id }, - data: { status: newStatus }, - }); - - sseEmitter.emitEvent("escalation_updated", { - id: updated.id, - policyPubkey: updated.policyPubkey, - status: updated.status, - approvals: updated.approvals as Array<{ member: string; timestamp: string }>, - rejections: updated.rejections as Array<{ member: string; timestamp: string }>, - executedTxnSig: updated.executedTxnSig, - updatedAt: updated.updatedAt, - }); - - console.log( - `[escalation-poller] proposal ${proposal.id.slice(0, 8)}… status: ${proposal.status} → ${newStatus}`, - ); - } + const newStatus = mapStatus(onChainProposal.status as { __kind: string }); + if (!newStatus || newStatus === proposal.status) continue; + + const updated = await prisma.escalationProposal.update({ + where: { id: proposal.id }, + data: { status: newStatus }, + }); + + sseEmitter.emitEvent("escalation_updated", { + id: updated.id, + policyPubkey: updated.policyPubkey, + status: updated.status, + approvals: updated.approvals as Array<{ member: string; timestamp: string }>, + rejections: updated.rejections as Array<{ member: string; timestamp: string }>, + executedTxnSig: updated.executedTxnSig, + updatedAt: updated.updatedAt, + }); + + console.log( + `[escalation-poller] proposal ${proposal.id.slice(0, 8)}… status: ${proposal.status} → ${newStatus}`, + ); } catch (err) { console.error( `[escalation-poller] error checking proposal ${proposal.id.slice(0, 8)}…:`, @@ -114,6 +113,11 @@ export function startEscalationPoller(): { stop: () => void } { `[escalation-poller] starting (interval=${ESCALATION_POLL_INTERVAL_MS}ms)`, ); + // Immediate first poll + pollEscalations(connection).catch((err) => { + console.error("[escalation-poller] initial poll failed:", err); + }); + const timer = setInterval(() => { pollEscalations(connection).catch((err) => { console.error("[escalation-poller] poll cycle failed:", err); diff --git a/server/src/worker/pipeline/ingest.ts b/server/src/worker/pipeline/ingest.ts index b348f97..68007c2 100644 --- a/server/src/worker/pipeline/ingest.ts +++ b/server/src/worker/pipeline/ingest.ts @@ -53,6 +53,7 @@ export type InstructionType = | "pause_agent" | "resume_agent" | "guarded_execute" + | "multisig_execute" | "rotate_agent_key" | "close_policy" | "update_anomaly_score" @@ -66,6 +67,7 @@ const DISCRIMINATORS: Record = { "9420011a937ab28c": "pause_agent", "7cfc788cdd7d55f7": "resume_agent", "18068369ba16f7e1": "guarded_execute", + "97b39147be602f45": "multisig_execute", "551f11d4a2359973": "rotate_agent_key", "372af8e5de8a1afc": "close_policy", // update_anomaly_score, wrap_sol, unwrap_sol — not routed in pipeline @@ -78,6 +80,7 @@ const POLICY_ACCOUNT_INDEX: Record = { pause_agent: 1, // [caller, policy] resume_agent: 1, // [owner, policy] guarded_execute: 1, // [agent, policy, tracker, target, system] + multisig_execute: 1, // [owner, policy, tracker, squads_proposal, target, system] rotate_agent_key: 1, // [owner, old_policy, old_tracker, new_agent, new_policy, new_tracker, system] close_policy: 1, // [owner, policy, tracker] update_anomaly_score: 1, // [caller, policy] diff --git a/server/src/worker/pipeline/process-transaction.ts b/server/src/worker/pipeline/process-transaction.ts index e101ad0..b721b4e 100644 --- a/server/src/worker/pipeline/process-transaction.ts +++ b/server/src/worker/pipeline/process-transaction.ts @@ -5,6 +5,7 @@ import { detectAndExtract, detectInstruction, ingest } from "./ingest.js"; import { syncPolicyFromChain } from "./sync-policy.js"; import { syncTrackerFromChain } from "./sync-tracker.js"; import { handleEscalation } from "./escalation.js"; +import { resolveEscalation } from "./resolve-escalation.js"; import { migratePolicy } from "./migrate-policy.js"; import { prefilter } from "./prefilter.js"; import { judgeTransaction } from "./judge.js"; @@ -87,6 +88,16 @@ export async function processTransaction(txn: HeliusEnhancedTransaction): Promis break; } + // Multisig-approved execution — ingest → resolve escalation → sync tracker + case "multisig_execute": { + const msRow = await ingest(txn, policyPubkey); + if (!msRow) return; + + await resolveEscalation(msRow); + await syncTrackerFromChain(policyPubkey); + break; + } + // Core pipeline — ingest → escalation check → sync tracker → prefilter → judge → executor case "guarded_execute": { const row = await ingest(txn, policyPubkey); diff --git a/server/src/worker/pipeline/reconstruct-instruction.ts b/server/src/worker/pipeline/reconstruct-instruction.ts index 6aff6a0..9e5e57d 100644 --- a/server/src/worker/pipeline/reconstruct-instruction.ts +++ b/server/src/worker/pipeline/reconstruct-instruction.ts @@ -40,6 +40,11 @@ export function reconstructInstruction(row: GuardedTxn): ReconstructedInstructio const rawEvent = row.rawEvent as Record | null; if (!rawEvent) return null; + // Handle pre-built instruction from /api/escalations/report + if (rawEvent._reconstructed && rawEvent.instruction) { + return rawEvent.instruction as ReconstructedInstruction; + } + const programId = env.GUARDRAILS_PROGRAM_ID; // Find the guardrails instruction in the transaction diff --git a/server/src/worker/pipeline/resolve-escalation.ts b/server/src/worker/pipeline/resolve-escalation.ts new file mode 100644 index 0000000..0a07ee5 --- /dev/null +++ b/server/src/worker/pipeline/resolve-escalation.ts @@ -0,0 +1,45 @@ +// Resolves an escalation proposal after a successful multisig_execute. +// Updates the escalation status to "executed" and emits SSE event. + +import { prisma } from "../../db/client.js"; +import { sseEmitter } from "../../sse/emitter.js"; +import type { GuardedTxn } from "@prisma/client"; + +export async function resolveEscalation(row: GuardedTxn): Promise { + const proposal = await prisma.escalationProposal.findFirst({ + where: { + policyPubkey: row.policyPubkey, + status: { in: ["approved", "pending"] }, + }, + orderBy: { createdAt: "desc" }, + }); + + if (!proposal) { + console.warn( + `[resolve-escalation] no matching escalation for multisig_execute txn ${row.txnSig.slice(0, 16)}…`, + ); + return; + } + + const updated = await prisma.escalationProposal.update({ + where: { id: proposal.id }, + data: { + status: "executed", + executedTxnSig: row.txnSig, + }, + }); + + sseEmitter.emitEvent("escalation_updated", { + id: updated.id, + policyPubkey: updated.policyPubkey, + status: updated.status, + approvals: updated.approvals as Array<{ member: string; timestamp: string }>, + rejections: updated.rejections as Array<{ member: string; timestamp: string }>, + executedTxnSig: updated.executedTxnSig, + updatedAt: updated.updatedAt, + }); + + console.log( + `[resolve-escalation] escalation ${proposal.id.slice(0, 8)}… resolved via txn ${row.txnSig.slice(0, 16)}…`, + ); +} diff --git a/server/src/worker/routes/webhook.ts b/server/src/worker/routes/webhook.ts index 391e78c..02e989a 100644 --- a/server/src/worker/routes/webhook.ts +++ b/server/src/worker/routes/webhook.ts @@ -109,6 +109,8 @@ export async function webhookHandler(req: Request, res: Response): Promise return; } + console.log(`[webhook] received ${transactions.length} transaction(s)`); + // Respond immediately — pipeline runs async res.status(200).json({ received: transactions.length }); recordWebhookIngress(transactions.length); From 3c99b5cd4815d29e5b7772f2ca118ebfd2a61c38 Mon Sep 17 00:00:00 2001 From: iamasx Date: Mon, 4 May 2026 14:40:40 +0530 Subject: [PATCH 5/5] feat: add transaction simulation panel for agents Slide-out panel on the agent detail page where users can paste their agent's secret key and run real guarded_execute transactions to test guardrails in real-time. Supports honest, attack, and custom simulation modes. Key never leaves the browser. --- .../app/agents/[pubkey]/agent-detail-view.tsx | 21 +- dashboard/components/simulate-panel.tsx | 453 ++++++++++++++++++ dashboard/hooks/use-simulation-runner.ts | 217 +++++++++ .../lib/simulation/build-transfer-ix-data.ts | 37 ++ dashboard/lib/stores/simulation.ts | 148 ++++++ 5 files changed, 875 insertions(+), 1 deletion(-) create mode 100644 dashboard/components/simulate-panel.tsx create mode 100644 dashboard/hooks/use-simulation-runner.ts create mode 100644 dashboard/lib/simulation/build-transfer-ix-data.ts create mode 100644 dashboard/lib/stores/simulation.ts diff --git a/dashboard/app/agents/[pubkey]/agent-detail-view.tsx b/dashboard/app/agents/[pubkey]/agent-detail-view.tsx index 7c4f8b1..c4ed7e6 100644 --- a/dashboard/app/agents/[pubkey]/agent-detail-view.tsx +++ b/dashboard/app/agents/[pubkey]/agent-detail-view.tsx @@ -1,7 +1,8 @@ "use client"; import Link from "next/link"; -import { ChevronLeft } from "lucide-react"; +import { ChevronLeft, Play } from "lucide-react"; +import { useWallet } from "@solana/wallet-adapter-react"; import { AnomalyRiskLabel, anomalyBarClass, @@ -15,6 +16,7 @@ import { ClosePolicyButton } from "@/components/close-policy-button"; import { FundAgentButton } from "@/components/fund-agent-button"; import { KillSwitchButton } from "@/components/kill-switch-button"; import { RotateAgentKeyButton } from "@/components/rotate-agent-key-button"; +import { SimulatePanel } from "@/components/simulate-panel"; import { QueryEmpty, QueryError } from "@/components/query-states"; import { AgentDetailSkeleton, IncidentsViewSkeleton } from "@/components/skeletons"; import { useInfiniteTransactionsQuery } from "@/lib/api/use-infinite-transactions-query"; @@ -22,6 +24,7 @@ import { useIncidentsQuery } from "@/lib/api/use-incidents-query"; import { useEscalationsQuery } from "@/lib/api/use-escalations-query"; import { usePolicyQuery } from "@/lib/api/use-policy-query"; import { useAllSpendTrackersQuery } from "@/lib/api/use-spend-trackers-query"; +import { useSimulationStore } from "@/lib/stores/simulation"; import { formatSol } from "@/lib/utils"; function BackToAgentsLink() { @@ -37,6 +40,8 @@ function BackToAgentsLink() { } export function AgentDetailView({ pubkey }: { pubkey: string }) { + const { publicKey } = useWallet(); + const simulationStore = useSimulationStore(); const policyQuery = usePolicyQuery(pubkey); const transactionsQuery = useInfiniteTransactionsQuery(pubkey, 10); const incidentsQuery = useIncidentsQuery(pubkey, 10); @@ -110,6 +115,18 @@ export function AgentDetailView({ pubkey }: { pubkey: string }) { + {publicKey && publicKey.toBase58() === policy.owner && ( +
+ +
+ )}
{policy.squadsMultisig ? (() => { @@ -226,6 +243,8 @@ export function AgentDetailView({ pubkey }: { pubkey: string }) { )}
+ + {simulationStore.panelOpen && } ); } diff --git a/dashboard/components/simulate-panel.tsx b/dashboard/components/simulate-panel.tsx new file mode 100644 index 0000000..b61df53 --- /dev/null +++ b/dashboard/components/simulate-panel.tsx @@ -0,0 +1,453 @@ +"use client"; + +import { useCallback, useEffect, useRef, useState } from "react"; +import { Connection, LAMPORTS_PER_SOL, PublicKey } from "@solana/web3.js"; +import { X, Play, Square, CheckCircle2, XCircle, ExternalLink, Zap, Shield, Wrench } from "lucide-react"; +import { toast } from "sonner"; +import { useSimulationStore, type SimulationMode } from "@/lib/stores/simulation"; +import { useSimulationRunner } from "@/hooks/use-simulation-runner"; +import type { PolicySummary } from "@/lib/types/dashboard"; + +const RPC_URL = process.env.NEXT_PUBLIC_SOLANA_RPC_URL ?? "https://api.devnet.solana.com"; + +const MODE_CONFIG: { key: SimulationMode; label: string; icon: typeof Shield }[] = [ + { key: "honest", label: "Honest", icon: Shield }, + { key: "attack", label: "Attack", icon: Zap }, + { key: "custom", label: "Custom", icon: Wrench }, +]; + +function shortenSig(sig: string): string { + return sig.length > 16 ? `${sig.slice(0, 8)}...${sig.slice(-8)}` : sig; +} + +function shortenKey(key: string): string { + return key.length > 8 ? `${key.slice(0, 4)}...${key.slice(-4)}` : key; +} + +export function SimulatePanel({ policy }: { policy: PolicySummary }) { + const sim = useSimulationStore(); + const { start, stop } = useSimulationRunner(policy); + const logEndRef = useRef(null); + + const [agentBalance, setAgentBalance] = useState(null); + const [balanceLoading, setBalanceLoading] = useState(false); + const [airdropping, setAirdropping] = useState(false); + + const keyMatchesAgent = + sim.derivedPubkey !== null && sim.derivedPubkey === policy.agent; + const keyValid = sim.agentKeypairBytes !== null; + + // Fetch agent SOL balance when key is validated + useEffect(() => { + if (!keyValid || !sim.derivedPubkey) { + setAgentBalance(null); + return; + } + let cancelled = false; + setBalanceLoading(true); + const conn = new Connection(RPC_URL, "confirmed"); + conn + .getBalance(new PublicKey(sim.derivedPubkey)) + .then((bal) => { + if (!cancelled) setAgentBalance(bal / LAMPORTS_PER_SOL); + }) + .catch(() => { + if (!cancelled) setAgentBalance(null); + }) + .finally(() => { + if (!cancelled) setBalanceLoading(false); + }); + return () => { + cancelled = true; + }; + }, [keyValid, sim.derivedPubkey]); + + // Auto-scroll log + useEffect(() => { + logEndRef.current?.scrollIntoView({ behavior: "smooth" }); + }, [sim.log.length]); + + const handleAirdrop = useCallback(async () => { + if (!sim.derivedPubkey) return; + setAirdropping(true); + try { + const conn = new Connection(RPC_URL, "confirmed"); + const sig = await conn.requestAirdrop( + new PublicKey(sim.derivedPubkey), + 1 * LAMPORTS_PER_SOL, + ); + await conn.confirmTransaction(sig, "confirmed"); + const bal = await conn.getBalance(new PublicKey(sim.derivedPubkey)); + setAgentBalance(bal / LAMPORTS_PER_SOL); + toast.success("Airdropped 1 SOL"); + } catch { + toast.error("Airdrop failed — devnet may be rate-limited"); + } finally { + setAirdropping(false); + } + }, [sim.derivedPubkey]); + + const canStart = + keyValid && + keyMatchesAgent && + policy.isActive && + !sim.isRunning && + agentBalance !== null && + agentBalance > 0; + + return ( + <> + {/* Backdrop */} +
{ + if (!sim.isRunning) sim.setPanelOpen(false); + }} + /> + + {/* Panel */} +
+ {/* Header */} +
+

+ Simulate Transactions +

+ +
+ +
+
+ {/* Secret Key Input */} +
+ +