From 7a52e337584a0b7b3000dbccb5508410256a724e Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Sun, 5 Oct 2025 13:10:34 -0700 Subject: [PATCH] chore(core): update docs --- frontend/packages/components/src/code.tsx | 6 +- frontend/packages/components/src/mdx/code.tsx | 52 +- frontend/packages/components/src/mdx/tabs.tsx | 6 +- frontend/packages/components/src/ui/tabs.tsx | 2 +- frontend/src/components/code.tsx | 6 +- frontend/src/components/mdx/code.tsx | 52 +- frontend/src/components/mdx/tabs.tsx | 6 +- site/README.md | 2 +- site/linkinator.config.json | 2 +- site/next-sitemap.config.js | 2 +- site/next.config.ts | 152 ++- site/public/llms-full.txt | 862 ++++++++++----- site/public/llms.txt | 264 ++--- site/public/rivet.schema.json | 6 +- site/scripts/checkBrokenLinks.sh | 2 +- site/scripts/generateMarkdownAndLlms.ts | 4 +- site/scripts/generateReadme.mjs | 16 +- site/src/app/(v2)/(content)/docs/page.tsx | 5 - .../(v2)/(content)/docs/tools/[tool]/page.tsx | 16 + site/src/app/(v2)/(content)/privacy/page.mdx | 6 +- site/src/app/(v2)/(content)/terms/page.mdx | 8 +- .../(index)/components/PlatformIcons.tsx | 24 +- .../(index)/components/code-snippets/utils.ts | 2 +- .../(index)/images/clients/svelte.svg | 1 + .../(index)/images/platforms/aws-ecs.svg | 1 + .../(index)/images/platforms/deno.svg | 13 + .../(index)/images/platforms/freestyle.svg | 1 + .../images/platforms/gcp-cloud-run.svg | 38 + .../(index)/images/platforms/hetzner.svg | 1 + .../(index)/images/platforms/kubernetes.svg | 1 + .../images/platforms/vm-bare-metal.svg | 1 + .../(index)/sections/CommunitySection.tsx | 4 +- .../(index)/sections/StudioSection.tsx | 2 +- .../(index)/sections/TechSection.tsx | 174 ++-- .../(marketing)/cloud/CommunitySection.tsx | 2 +- .../cloud/PowerfulPrimitivesSection.tsx | 2 +- .../(marketing)/cloud/RivetCloudSection.tsx | 2 +- .../(marketing)/pricing/PricingPageClient.tsx | 8 +- .../pricing/components/MobilePricingTabs.tsx | 6 +- .../src/app/(v2)/(marketing)/pricing/page.tsx | 2 +- .../rivet-vs-cloudflare-workers/page.tsx | 2 +- site/src/app/(v2)/(marketing)/sales/page.tsx | 2 +- .../src/app/(v2)/(marketing)/support/page.tsx | 14 +- .../(marketing)/talk-to-an-engineer/page.tsx | 2 +- .../app/(v2)/[section]/[[...page]]/page.tsx | 4 +- site/src/app/layout.tsx | 4 +- site/src/components/Card.tsx | 26 +- site/src/components/Earth.jsx | 2 +- site/src/components/Feedback.jsx | 2 +- site/src/components/Footer.jsx | 5 +- site/src/components/GitHubStarsDropdown.tsx | 4 +- site/src/components/Header.jsx | 6 +- .../src/components/HeaderPopupProductMenu.tsx | 6 +- site/src/components/LevelUpSection.jsx | 2 +- site/src/components/Navigation.jsx | 2 +- site/src/components/Newsletter.tsx | 2 +- site/src/components/Providers.jsx | 2 +- site/src/components/docs/Hosting.tsx | 47 +- site/src/components/v2/Code.tsx | 62 +- site/src/components/v2/GitHubDropdown.tsx | 4 +- site/src/components/v2/Header.tsx | 29 +- site/src/components/v2/LogoContextMenu.tsx | 2 +- site/src/components/v2/TemplateVariable.tsx | 2 +- .../actors/fetch-and-websocket-handler.mdx | 4 +- site/src/content/docs/actors/index.mdx | 44 +- .../docs/actors/quickstart/backend.mdx | 69 +- .../actors/quickstart/cloudflare-workers.mdx | 2 +- .../docs/actors/quickstart/next-js.mdx | 2 +- site/src/content/docs/actors/schedule.mdx | 2 +- site/src/content/docs/api/index.mdx | 3 + site/src/content/docs/clients/javascript.mdx | 4 +- site/src/content/docs/clients/next-js.mdx | 8 +- site/src/content/docs/clients/openapi.mdx | 2 +- site/src/content/docs/clients/react.mdx | 2 +- site/src/content/docs/clients/rust.mdx | 4 +- .../docs/{cloud => cloud-ee}/actors.mdx | 2 +- .../{cloud => cloud-ee}/api/actors/create.mdx | 4 +- .../api/actors/destroy.mdx | 4 +- .../{cloud => cloud-ee}/api/actors/get.mdx | 4 +- .../{cloud => cloud-ee}/api/actors/list.mdx | 4 +- .../api/actors/logs/export.mdx | 4 +- .../api/actors/logs/get.mdx | 4 +- .../api/actors/metrics/get.mdx | 4 +- .../{cloud => cloud-ee}/api/actors/query.mdx | 4 +- .../api/actors/upgrade-all.mdx | 4 +- .../api/actors/upgrade.mdx | 4 +- .../{cloud => cloud-ee}/api/actors/usage.mdx | 4 +- .../api/builds/complete.mdx | 4 +- .../{cloud => cloud-ee}/api/builds/get.mdx | 4 +- .../{cloud => cloud-ee}/api/builds/list.mdx | 4 +- .../api/builds/patch-tags.mdx | 4 +- .../api/builds/prepare.mdx | 4 +- .../docs/{cloud => cloud-ee}/api/errors.mdx | 10 +- .../docs/{cloud => cloud-ee}/api/index.mdx | 6 +- .../{cloud => cloud-ee}/api/regions/list.mdx | 4 +- .../api/regions/recommend.mdx | 4 +- .../{cloud => cloud-ee}/api/routes/delete.mdx | 4 +- .../api/routes/history.mdx | 4 +- .../{cloud => cloud-ee}/api/routes/list.mdx | 4 +- .../{cloud => cloud-ee}/api/routes/update.mdx | 4 +- .../docs/{cloud => cloud-ee}/api/spec.json | 2 +- .../content/docs/{cloud => cloud-ee}/cli.mdx | 0 .../docs/{cloud => cloud-ee}/config.mdx | 0 .../docs/{cloud => cloud-ee}/containers.mdx | 0 .../continuous-delivery.mdx | 2 +- .../docs/{cloud => cloud-ee}/durability.mdx | 0 .../content/docs/{cloud => cloud-ee}/edge.mdx | 0 .../environment-variables.mdx | 0 .../content/docs/{cloud => cloud-ee}/faq.mdx | 0 .../docs/{cloud => cloud-ee}/functions.mdx | 0 .../content/docs/{cloud => cloud-ee}/hub.mdx | 0 .../images/install/actors.png | Bin .../images/install/builds.png | Bin site/src/content/docs/cloud-ee/index.mdx | 47 + .../docs/{cloud => cloud-ee}/install.mdx | 10 +- .../docs/{cloud => cloud-ee}/limitations.mdx | 0 .../{cloud => cloud-ee}/local-development.mdx | 0 .../docs/{cloud => cloud-ee}/networking.mdx | 0 .../docs/{cloud => cloud-ee}/pricing.mdx | 0 .../self-hosting/client-config.mdx | 2 +- .../self-hosting/client-spec.json | 0 .../self-hosting/docker-compose.mdx | 0 .../self-hosting/index.mdx | 0 .../self-hosting/manual-deployment.mdx | 4 +- .../self-hosting/network-modes.mdx | 0 .../self-hosting/server-config.mdx | 2 +- .../self-hosting/server-spec.json | 0 .../self-hosting/single-container.mdx | 0 .../solutions/game-servers.mdx | 0 .../docs/{cloud => cloud-ee}/tokens.mdx | 2 +- .../{cloud => cloud-ee}/troubleshooting.mdx | 2 +- .../docs/{cloud => cloud-ee}/workers.mdx | 0 site/src/content/docs/cloud/index.mdx | 51 +- site/src/content/docs/deploy/aws-ecs.mdx | 116 +++ site/src/content/docs/deploy/aws-lambda.mdx | 4 + .../docs/deploy/cloudflare-workers.mdx | 224 ++++ site/src/content/docs/deploy/freestyle.mdx | 4 +- .../src/content/docs/deploy/gcp-cloud-run.mdx | 78 ++ site/src/content/docs/deploy/hetzner.mdx | 4 + site/src/content/docs/deploy/kubernetes.mdx | 115 ++ site/src/content/docs/deploy/railway.mdx | 7 +- site/src/content/docs/deploy/supabase.mdx | 3 + site/src/content/docs/deploy/vercel.mdx | 4 + .../content/docs/deploy/vm-and-bare-metal.mdx | 84 ++ .../content/docs/drivers/build-your-own.mdx | 6 +- site/src/content/docs/drivers/file-system.mdx | 2 +- .../docs/examples/autofill-example.mdx | 2 +- .../content/docs/general/docs-for-llms.mdx | 4 +- site/src/content/docs/general/studio.mdx | 80 -- .../content/docs/images/platforms/deno.svg | 13 + site/src/content/docs/index.mdx | 88 ++ .../content/docs/integrations/better-auth.mdx | 2 +- .../docs/integrations/cloudflare-workers.mdx | 83 -- site/src/content/docs/integrations/elysia.mdx | 2 +- .../src/content/docs/integrations/express.mdx | 2 +- site/src/content/docs/integrations/hono.mdx | 2 +- site/src/content/docs/integrations/index.mdx | 64 +- .../src/content/docs/integrations/next-js.mdx | 4 +- site/src/content/docs/integrations/trpc.mdx | 2 +- .../src/content/docs/self-hosting/install.mdx | 2 +- .../src/content/docs/self-hosting/railway.mdx | 2 +- site/src/content/docs/use-cases/ai-agents.mdx | 6 + site/src/content/docs/use-cases/bots.mdx | 7 + .../docs/use-cases/durable-compute.mdx | 11 + .../docs/use-cases/per-tenant-databases.mdx | 7 + .../content/docs/use-cases/rate-limiting.mdx | 6 + site/src/content/docs/use-cases/realtime.mdx | 9 + site/src/data/deploy-options.ts | 43 + site/src/data/examples/examples.ts | 36 +- site/src/data/integrations/shared.ts | 73 ++ site/src/lib/cloud-api/client.ts | 2 +- site/src/lib/siteUrl.js | 4 +- .../2024-02-12-usage-pricing-update/page.mdx | 4 +- .../2024-12-21-rivet-actors-launch/page.mdx | 2 +- .../page.mdx | 2 +- .../2025-03-15-writing-docs-for-ai/page.mdx | 2 +- .../page.mdx | 44 +- .../page.mdx | 32 +- .../page.mdx | 2 +- .../page.mdx | 2 +- .../page.mdx | 12 +- .../page.mdx | 6 +- .../posts/2025-09-04-rivet-v2-launch/page.mdx | 8 +- .../page.mdx | 4 +- .../2025-10-01-railway-selfhost/page.mdx | 4 +- .../page.mdx | 2 +- site/src/sitemap/mod.ts | 985 +++++++++--------- 187 files changed, 2925 insertions(+), 1764 deletions(-) delete mode 100644 site/src/app/(v2)/(content)/docs/page.tsx create mode 100644 site/src/app/(v2)/(content)/docs/tools/[tool]/page.tsx create mode 100644 site/src/app/(v2)/(marketing)/(index)/images/clients/svelte.svg create mode 100644 site/src/app/(v2)/(marketing)/(index)/images/platforms/aws-ecs.svg create mode 100644 site/src/app/(v2)/(marketing)/(index)/images/platforms/deno.svg create mode 100644 site/src/app/(v2)/(marketing)/(index)/images/platforms/freestyle.svg create mode 100644 site/src/app/(v2)/(marketing)/(index)/images/platforms/gcp-cloud-run.svg create mode 100644 site/src/app/(v2)/(marketing)/(index)/images/platforms/hetzner.svg create mode 100644 site/src/app/(v2)/(marketing)/(index)/images/platforms/kubernetes.svg create mode 100644 site/src/app/(v2)/(marketing)/(index)/images/platforms/vm-bare-metal.svg create mode 100644 site/src/content/docs/api/index.mdx rename site/src/content/docs/{cloud => cloud-ee}/actors.mdx (86%) rename site/src/content/docs/{cloud => cloud-ee}/api/actors/create.mdx (90%) rename site/src/content/docs/{cloud => cloud-ee}/api/actors/destroy.mdx (94%) rename site/src/content/docs/{cloud => cloud-ee}/api/actors/get.mdx (89%) rename site/src/content/docs/{cloud => cloud-ee}/api/actors/list.mdx (91%) rename site/src/content/docs/{cloud => cloud-ee}/api/actors/logs/export.mdx (89%) rename site/src/content/docs/{cloud => cloud-ee}/api/actors/logs/get.mdx (89%) rename site/src/content/docs/{cloud => cloud-ee}/api/actors/metrics/get.mdx (88%) rename site/src/content/docs/{cloud => cloud-ee}/api/actors/query.mdx (89%) rename site/src/content/docs/{cloud => cloud-ee}/api/actors/upgrade-all.mdx (88%) rename site/src/content/docs/{cloud => cloud-ee}/api/actors/upgrade.mdx (88%) rename site/src/content/docs/{cloud => cloud-ee}/api/actors/usage.mdx (90%) rename site/src/content/docs/{cloud => cloud-ee}/api/builds/complete.mdx (85%) rename site/src/content/docs/{cloud => cloud-ee}/api/builds/get.mdx (88%) rename site/src/content/docs/{cloud => cloud-ee}/api/builds/list.mdx (90%) rename site/src/content/docs/{cloud => cloud-ee}/api/builds/patch-tags.mdx (92%) rename site/src/content/docs/{cloud => cloud-ee}/api/builds/prepare.mdx (89%) rename site/src/content/docs/{cloud => cloud-ee}/api/errors.mdx (98%) rename site/src/content/docs/{cloud => cloud-ee}/api/index.mdx (76%) rename site/src/content/docs/{cloud => cloud-ee}/api/regions/list.mdx (88%) rename site/src/content/docs/{cloud => cloud-ee}/api/regions/recommend.mdx (88%) rename site/src/content/docs/{cloud => cloud-ee}/api/routes/delete.mdx (93%) rename site/src/content/docs/{cloud => cloud-ee}/api/routes/history.mdx (90%) rename site/src/content/docs/{cloud => cloud-ee}/api/routes/list.mdx (89%) rename site/src/content/docs/{cloud => cloud-ee}/api/routes/update.mdx (89%) rename site/src/content/docs/{cloud => cloud-ee}/api/spec.json (57%) rename site/src/content/docs/{cloud => cloud-ee}/cli.mdx (100%) rename site/src/content/docs/{cloud => cloud-ee}/config.mdx (100%) rename site/src/content/docs/{cloud => cloud-ee}/containers.mdx (100%) rename site/src/content/docs/{cloud => cloud-ee}/continuous-delivery.mdx (98%) rename site/src/content/docs/{cloud => cloud-ee}/durability.mdx (100%) rename site/src/content/docs/{cloud => cloud-ee}/edge.mdx (100%) rename site/src/content/docs/{cloud => cloud-ee}/environment-variables.mdx (100%) rename site/src/content/docs/{cloud => cloud-ee}/faq.mdx (100%) rename site/src/content/docs/{cloud => cloud-ee}/functions.mdx (100%) rename site/src/content/docs/{cloud => cloud-ee}/hub.mdx (100%) rename site/src/content/docs/{cloud => cloud-ee}/images/install/actors.png (100%) rename site/src/content/docs/{cloud => cloud-ee}/images/install/builds.png (100%) create mode 100644 site/src/content/docs/cloud-ee/index.mdx rename site/src/content/docs/{cloud => cloud-ee}/install.mdx (75%) rename site/src/content/docs/{cloud => cloud-ee}/limitations.mdx (100%) rename site/src/content/docs/{cloud => cloud-ee}/local-development.mdx (100%) rename site/src/content/docs/{cloud => cloud-ee}/networking.mdx (100%) rename site/src/content/docs/{cloud => cloud-ee}/pricing.mdx (100%) rename site/src/content/docs/{cloud => cloud-ee}/self-hosting/client-config.mdx (58%) rename site/src/content/docs/{cloud => cloud-ee}/self-hosting/client-spec.json (100%) rename site/src/content/docs/{cloud => cloud-ee}/self-hosting/docker-compose.mdx (100%) rename site/src/content/docs/{cloud => cloud-ee}/self-hosting/index.mdx (100%) rename site/src/content/docs/{cloud => cloud-ee}/self-hosting/manual-deployment.mdx (97%) rename site/src/content/docs/{cloud => cloud-ee}/self-hosting/network-modes.mdx (100%) rename site/src/content/docs/{cloud => cloud-ee}/self-hosting/server-config.mdx (69%) rename site/src/content/docs/{cloud => cloud-ee}/self-hosting/server-spec.json (100%) rename site/src/content/docs/{cloud => cloud-ee}/self-hosting/single-container.mdx (100%) rename site/src/content/docs/{cloud => cloud-ee}/solutions/game-servers.mdx (100%) rename site/src/content/docs/{cloud => cloud-ee}/tokens.mdx (96%) rename site/src/content/docs/{cloud => cloud-ee}/troubleshooting.mdx (98%) rename site/src/content/docs/{cloud => cloud-ee}/workers.mdx (100%) create mode 100644 site/src/content/docs/deploy/aws-ecs.mdx create mode 100644 site/src/content/docs/deploy/aws-lambda.mdx create mode 100644 site/src/content/docs/deploy/cloudflare-workers.mdx create mode 100644 site/src/content/docs/deploy/gcp-cloud-run.mdx create mode 100644 site/src/content/docs/deploy/hetzner.mdx create mode 100644 site/src/content/docs/deploy/kubernetes.mdx create mode 100644 site/src/content/docs/deploy/supabase.mdx create mode 100644 site/src/content/docs/deploy/vercel.mdx create mode 100644 site/src/content/docs/deploy/vm-and-bare-metal.mdx delete mode 100644 site/src/content/docs/general/studio.mdx create mode 100644 site/src/content/docs/images/platforms/deno.svg create mode 100644 site/src/content/docs/index.mdx create mode 100644 site/src/content/docs/use-cases/ai-agents.mdx create mode 100644 site/src/content/docs/use-cases/bots.mdx create mode 100644 site/src/content/docs/use-cases/durable-compute.mdx create mode 100644 site/src/content/docs/use-cases/per-tenant-databases.mdx create mode 100644 site/src/content/docs/use-cases/rate-limiting.mdx create mode 100644 site/src/content/docs/use-cases/realtime.mdx create mode 100644 site/src/data/deploy-options.ts create mode 100644 site/src/data/integrations/shared.ts diff --git a/frontend/packages/components/src/code.tsx b/frontend/packages/components/src/code.tsx index e6c84428aa..465983954d 100644 --- a/frontend/packages/components/src/code.tsx +++ b/frontend/packages/components/src/code.tsx @@ -59,7 +59,11 @@ export function CodeGroup({ children, className }: CodeGroupProps) { {Children.map(children, (child) => { const idx = getChildIdx(child); return ( - + {child.props.title || languageNames[ child.props.language || "bash" diff --git a/frontend/packages/components/src/mdx/code.tsx b/frontend/packages/components/src/mdx/code.tsx index 19740937aa..e462c3cc2a 100644 --- a/frontend/packages/components/src/mdx/code.tsx +++ b/frontend/packages/components/src/mdx/code.tsx @@ -56,13 +56,13 @@ export function CodeGroup({ children, className }: CodeGroupProps) { return (
- -
+ +
div]:!table" }} @@ -71,7 +71,11 @@ export function CodeGroup({ children, className }: CodeGroupProps) { {Children.map(children, (child) => { const idx = getChildIdx(child); return ( - + {child.props.title || child.props.meta || languageNames[ @@ -83,20 +87,6 @@ export function CodeGroup({ children, className }: CodeGroupProps) { })} - - - - } - content="Copy code" - />
{Children.map(children, (child) => { const idx = getChildIdx(child); @@ -128,12 +118,14 @@ export const pre = ({ title, isInGroup, }: PreProps) => { + const showHeader = !isInGroup || !!file; + const showCopyButton = !isInGroup; return (
- {!file && isInGroup ? null : ( + {showHeader && (
{file ? ( @@ -147,16 +139,18 @@ export const pre = ({ )}
- - - - } - content="Copy code" - /> + {showCopyButton ? ( + + + + } + content="Copy code" + /> + ) : null}
)}
diff --git a/frontend/packages/components/src/mdx/tabs.tsx b/frontend/packages/components/src/mdx/tabs.tsx index 0182160d74..aa6fe13ec3 100644 --- a/frontend/packages/components/src/mdx/tabs.tsx +++ b/frontend/packages/components/src/mdx/tabs.tsx @@ -21,7 +21,11 @@ export const Tabs = ({ children }: { children: React.ReactElement }) => { {titles.map((title) => ( - + {title} ))} diff --git a/frontend/packages/components/src/ui/tabs.tsx b/frontend/packages/components/src/ui/tabs.tsx index 8615c9d93d..910844ee74 100644 --- a/frontend/packages/components/src/ui/tabs.tsx +++ b/frontend/packages/components/src/ui/tabs.tsx @@ -47,7 +47,7 @@ const TabsTrigger = React.forwardRef< { const idx = getChildIdx(child); return ( - + {child.props.title || languageNames[ child.props.language || "bash" diff --git a/frontend/src/components/mdx/code.tsx b/frontend/src/components/mdx/code.tsx index 0ab0af5f5d..a422dc4248 100644 --- a/frontend/src/components/mdx/code.tsx +++ b/frontend/src/components/mdx/code.tsx @@ -48,13 +48,13 @@ export function CodeGroup({ children, className }: CodeGroupProps) { return (
- -
+ +
div]:!table" }} @@ -63,7 +63,11 @@ export function CodeGroup({ children, className }: CodeGroupProps) { {Children.map(children, (child) => { const idx = getChildIdx(child); return ( - + {child.props.title || languageNames[ child.props.language @@ -74,20 +78,6 @@ export function CodeGroup({ children, className }: CodeGroupProps) { })} - - - - } - content="Copy code" - />
{Children.map(children, (child) => { const idx = getChildIdx(child); @@ -119,12 +109,14 @@ export const pre = ({ title, isInGroup, }: PreProps) => { + const showHeader = !isInGroup || !!file; + const showCopyButton = !isInGroup; return (
- {!file && isInGroup ? null : ( + {showHeader && (
{file ? ( @@ -138,16 +130,18 @@ export const pre = ({ )}
- - - - } - content="Copy code" - /> + {showCopyButton ? ( + + + + } + content="Copy code" + /> + ) : null}
)}
diff --git a/frontend/src/components/mdx/tabs.tsx b/frontend/src/components/mdx/tabs.tsx index 40929e6d84..096a8a8d70 100644 --- a/frontend/src/components/mdx/tabs.tsx +++ b/frontend/src/components/mdx/tabs.tsx @@ -24,7 +24,11 @@ export const Tabs = ({ children }: { children: React.ReactElement }) => { {titles.map((title) => ( - + {title} ))} diff --git a/site/README.md b/site/README.md index c1019d4a30..1238716da5 100644 --- a/site/README.md +++ b/site/README.md @@ -1,6 +1,6 @@ # Rivet Site -[rivet.gg](https://rivet.gg) +[rivet.dev](https://rivet.dev) ## Project structure diff --git a/site/linkinator.config.json b/site/linkinator.config.json index c208feab52..96e2ce4f6b 100644 --- a/site/linkinator.config.json +++ b/site/linkinator.config.json @@ -1,6 +1,6 @@ { "recurse": true, "markdown": true, - "skip": "https://hub.rivet.gg,https://twitter.com,https://www.cloudflare.com,https://cloudflare.com,https://github.com,https://support.cloudflare.com,http://localhost,https://tanks.rivet.game", + "skip": "https://dashboard.rivet.dev,https://twitter.com,https://www.cloudflare.com,https://cloudflare.com,https://github.com,https://support.cloudflare.com,http://localhost,https://tanks.rivet.game", "format": "json" } diff --git a/site/next-sitemap.config.js b/site/next-sitemap.config.js index c1da7dac30..16fd1d4783 100644 --- a/site/next-sitemap.config.js +++ b/site/next-sitemap.config.js @@ -1,6 +1,6 @@ /** @type {import('next-sitemap').IConfig} */ module.exports = { - siteUrl: "https://www.rivet.gg", + siteUrl: "https://www.rivet.dev", outDir: "out/", // TODO: We should pull the modification data from blog posts automatically autoLastmod: false diff --git a/site/next.config.ts b/site/next.config.ts index 37cbe7e52b..23d75dabe5 100644 --- a/site/next.config.ts +++ b/site/next.config.ts @@ -24,199 +24,181 @@ const nextConfig = { }, async redirects() { return [ - // Next.js redirects for Cloudflare deployment - - // Permanent redirects for common 404s (consolidated from duplicates) - - // Convenience Redirects - { - source: '/docs', - destination: '/docs/actors', - permanent: false, - }, - - // Redirects for moved Cloud docs + // Redirects for moved Cloud docs { - source: '/docs/actors-low-level', - destination: '/docs/cloud/actors', + source: "/docs/actors-low-level", + destination: "/docs/cloud/actors", permanent: false, }, // Redirects for moved Cloud docs { - source: '/docs/hub', - destination: '/docs/cloud/hub', + source: "/docs/hub", + destination: "/docs/cloud/hub", permanent: false, }, { - source: '/docs/install', - destination: '/docs/cloud/install', + source: "/docs/install", + destination: "/docs/cloud/install", permanent: false, }, { - source: '/docs/limitations', - destination: '/docs/cloud/limitations', + source: "/docs/limitations", + destination: "/docs/cloud/limitations", permanent: false, }, { - source: '/docs/local-development', - destination: '/docs/cloud/local-development', + source: "/docs/local-development", + destination: "/docs/cloud/local-development", permanent: false, }, { - source: '/docs/networking', - destination: '/docs/cloud/networking', + source: "/docs/networking", + destination: "/docs/cloud/networking", permanent: false, }, { - source: '/docs/pricing', - destination: '/docs/cloud/pricing', + source: "/docs/pricing", + destination: "/docs/cloud/pricing", permanent: false, }, { - source: '/docs/quickstart', - destination: '/docs/cloud/quickstart', + source: "/docs/quickstart", + destination: "/docs/cloud/quickstart", permanent: false, }, { - source: '/docs/solutions/:slug*', - destination: '/docs/cloud/solutions/:slug*', + source: "/docs/solutions/:slug*", + destination: "/docs/cloud/solutions/:slug*", permanent: false, }, { - source: '/docs/tokens', - destination: '/docs/cloud/tokens', + source: "/docs/tokens", + destination: "/docs/cloud/tokens", permanent: false, }, { - source: '/docs/troubleshooting', - destination: '/docs/cloud/troubleshooting', + source: "/docs/troubleshooting", + destination: "/docs/cloud/troubleshooting", permanent: false, }, { - source: '/docs/workers', - destination: '/docs/cloud/workers', + source: "/docs/workers", + destination: "/docs/cloud/workers", permanent: false, }, { - source: '/docs/javascript-runtime', - destination: '/docs/cloud/actors', + source: "/docs/javascript-runtime", + destination: "/docs/cloud/actors", permanent: false, }, { - source: '/docs/container-runtime', - destination: '/docs/cloud/containers', + source: "/docs/container-runtime", + destination: "/docs/cloud/containers", permanent: false, }, // Additional redirects for missing pages from CSV { - source: '/docs/general/authentication', - destination: '/docs/actors/authentication', + source: "/docs/general/authentication", + destination: "/docs/actors/authentication", permanent: false, }, { - source: '/docs/general/authentication/', - destination: '/docs/actors/authentication', + source: "/docs/general/authentication/", + destination: "/docs/actors/authentication", permanent: false, }, { - source: '/docs/general/testing', - destination: '/docs/actors/testing', + source: "/docs/general/testing", + destination: "/docs/actors/testing", permanent: false, }, { - source: '/docs/general/testing/', - destination: '/docs/actors/testing', + source: "/docs/general/testing/", + destination: "/docs/actors/testing", permanent: false, }, { - source: '/docs/actors/communicating-with-actors', - destination: '/docs/actors/communicating-between-actors', + source: "/docs/actors/communicating-with-actors", + destination: "/docs/actors/communicating-between-actors", permanent: false, }, { - source: '/docs/actors/communicating-with-actors/', - destination: '/docs/actors/communicating-between-actors', + source: "/docs/actors/communicating-with-actors/", + destination: "/docs/actors/communicating-between-actors", permanent: false, }, { - source: '/actors/communicating-with-actors', - destination: '/docs/actors/communicating-between-actors', + source: "/actors/communicating-with-actors", + destination: "/docs/actors/communicating-between-actors", permanent: false, }, { - source: '/actors/communicating-with-actors/', - destination: '/docs/actors/communicating-between-actors', + source: "/actors/communicating-with-actors/", + destination: "/docs/actors/communicating-between-actors", permanent: false, }, { - source: '/clients/javascript', - destination: '/docs/clients/javascript', + source: "/clients/javascript", + destination: "/docs/clients/javascript", permanent: false, }, { - source: '/clients/javascript/', - destination: '/docs/clients/javascript', + source: "/clients/javascript/", + destination: "/docs/clients/javascript", permanent: false, }, - // Handle specific API variants without trailing slash that may not be caught by :slug* pattern { - source: '/docs/api/regions/list', - destination: '/docs/cloud/api/regions/list', + source: "/docs/api/regions/list", + destination: "/docs/cloud/api/regions/list", permanent: false, }, { - source: '/docs/api/actors/create', - destination: '/docs/cloud/api/actors/create', + source: "/docs/api/actors/create", + destination: "/docs/cloud/api/actors/create", permanent: false, }, { - source: '/docs/api/actors/upgrade-all', - destination: '/docs/cloud/api/actors/upgrade-all', + source: "/docs/api/actors/upgrade-all", + destination: "/docs/cloud/api/actors/upgrade-all", permanent: false, }, { - source: '/docs/api/actors/upgrade', - destination: '/docs/cloud/api/actors/upgrade', + source: "/docs/api/actors/upgrade", + destination: "/docs/cloud/api/actors/upgrade", permanent: false, }, { - source: '/docs/api/actors/destroy', - destination: '/docs/cloud/api/actors/destroy', + source: "/docs/api/actors/destroy", + destination: "/docs/cloud/api/actors/destroy", permanent: false, }, { - source: '/docs/api/routes/update', - destination: '/docs/cloud/api/routes/update', + source: "/docs/api/routes/update", + destination: "/docs/cloud/api/routes/update", permanent: false, }, // Additional missing API endpoints { - source: '/docs/api/actors/get', - destination: '/docs/cloud/api/actors/get', - permanent: false, - }, - { - source: '/docs/api/actors/list', - destination: '/docs/cloud/api/actors/list', + source: "/docs/api/actors/get", + destination: "/docs/cloud/api/actors/get", permanent: false, }, { - source: '/docs/api', - destination: '/docs/cloud/api', + source: "/docs/api/actors/list", + destination: "/docs/cloud/api/actors/list", permanent: false, }, // Missing documentation pages { - source: '/docs/containers', - destination: '/docs/cloud/containers', + source: "/docs/containers", + destination: "/docs/cloud/containers", permanent: false, }, - ]; }, webpack: (config) => { diff --git a/site/public/llms-full.txt b/site/public/llms-full.txt index e0602c0035..49ff426022 100644 --- a/site/public/llms-full.txt +++ b/site/public/llms-full.txt @@ -1536,7 +1536,7 @@ const honoActor = actor(, }); ``` -Also see the [raw fetch handler example project](https://github.com/rivet-gg/rivetkit/tree/main/examples/raw-fetch-handler). +Also see the [raw fetch handler example project](https://github.com/rivet-dev/rivetkit/tree/main/examples/raw-fetch-handler). `onFetch` can be used to expose Server-Sent Events from Rivet Actors. @@ -1554,7 +1554,7 @@ const websocketActor = actor(, }); ``` -Also see the [raw WebSocket handler with proxy example project](https://github.com/rivet-gg/rivetkit/tree/main/examples/raw-websocket-handler-proxy). +Also see the [raw WebSocket handler with proxy example project](https://github.com/rivet-dev/rivetkit/tree/main/examples/raw-websocket-handler-proxy). Connection lifecycle hooks like `onConnect` and `onDisconnect` do not get called when opening WebSockets for `onWebSocket`. This is because `onWebSocket` provides a low-level connection. Use `ws.addEventListener("open")` and `ws.addEventListener("close")` instead. @@ -1874,45 +1874,29 @@ Actors for long-lived processes with durable state, realtime, and hibernate when Build real-time React applications with actors + Build server-rendered Next.js experiences backed by actors + + Deploy actors on Cloudflare Workers with zero infrastructure + ## Features - **Long-Lived, Stateful Compute**: Each unit of compute is like a tiny server that remembers things between requests – no need to re-fetch data from a database or worry about timeouts. Like AWS Lambda, but with memory and no timeouts. - - **Blazing-Fast Reads & Writes**: State is stored on the same machine as your compute, so reads and writes are ultra-fast. No database round trips, no latency spikes. - -- **Realtime, Made Simple**: Update state and broadcast changes in realtime with WebSockets or SSE. No external pub/sub systems, no polling – just built-in low-latency events. - -- **Store Data Near Your Users**: Your state lives close to your users on the edge – not in a faraway data center – so every interaction feels instant. (Not all platforms supported.) - +- **Realtime**: Update state and broadcast changes in realtime with WebSockets or SSE. No external pub/sub systems, no polling – just built-in low-latency events. - **Infinitely Scalable**: Automatically scale from zero to millions of concurrent actors. Pay only for what you use with instant scaling and no cold starts. - - **Fault Tolerant**: Built-in error handling and recovery. Actors automatically restart on failure while preserving state integrity and continuing operations. -- **Type Safety**: End-to-end TypeScript safety between clients and actors with full type inference and compile-time checking. - ## Use Cases Actors are perfect for applications that need persistent state and real-time updates: -- **AI & Automation** - - **AI agents**: Stateful AI assistants with conversation history - - **AI sandbox orchestration**: Actors can orchestrate logic running inside of agents' sandboxes - - **Durable workflows**: Long-running business processes with state persistence and recovery - -- **Real-time Communication** - - **Chat rooms**: Real-time messaging with message history and user presence - - **Collaborative documents**: Multiple users editing documents simultaneously (Yjs integration) - - **Multiplayer games**: Game state management with real-time updates - - **Live events**: Broadcasting updates to many participants - -- **Data & Synchronization** - - **Local-first sync**: Offline-first applications with server synchronization - - **Multi-tenant databases**: Isolated data stores for each user or tenant - - **Scheduling**: Time-based task execution with persistent state - -- **Infrastructure** - - **Rate limiting**: Distributed rate limiting with persistent counters - - **Stream processing**: Real-time data processing with persistent state +- **AI agents**: Stateful AI assistants with conversation history +- **Collaborative documents**: Multiple users editing documents simultaneously (Yjs integration) +- **Local-first sync**: Offline-first applications with server synchronization +- **Per-tenant databases**: Isolated data stores for each user or tenant +- **Background job**: Background & time-based task execution with persistent state +- **Rate limiting**: Distributed rate limiting with persistent counters +- **Stream processing**: Real-time data processing with persistent state ## Core Concepts @@ -2772,7 +2756,12 @@ const registry = setup(, Choose your preferred web framework: ```ts } -// Start Rivet with file system driver (for development) +// Start Rivet +const = registry.start(); +``` + +```ts } +// Start Rivet const = registry.start(); // Setup Hono app @@ -2782,7 +2771,7 @@ const app = new Hono(); app.post("/increment/:name", async (c) => ); }); -// Start server with Rivet +// Start server serve(app); ``` @@ -2825,8 +2814,6 @@ const app = new Elysia() console.log("Server running at http://localhost:8080"); ``` -The `/registry` endpoint is automatically mounted by Rivet and is required for client communication. When using `serve()` with Hono, this is handled automatically. - ```sh } npx tsx --watch server.ts ``` @@ -2837,26 +2824,7 @@ bun --watch server.ts Your server is now running at `http://localhost:8080` -Test your counter actor using HTTP requests: - -```ts } -// Increment counter -const response = await fetch("http://localhost:8080/increment/my-counter", ); - -const result = await response.json(); -console.log("Count:", result.count); // 1 -``` - -```sh curl -# Increment counter -curl -X POST http://localhost:8080/increment/my-counter -``` - -## Configuration Options - -### Connect Frontend To The Rivet Actor - -Create a type-safe client to connect from your frontend: +This code can run either in your frontend or within your backend: ```ts } // Create typed client @@ -2968,7 +2936,7 @@ const = createHandler(registry, ), , ; ``` -The `/registry` endpoint is automatically mounted by Rivet and is required for client communication. The Cloudflare Workers driver handles this automatically. +The `/rivet` endpoint is automatically mounted by Rivet and is required for client communication. The Cloudflare Workers driver handles this automatically. This can be configured with `managerPath`. Configure your `wrangler.json` for Cloudflare Workers: @@ -3156,7 +3124,7 @@ function Counter() ); Make sure to import the `Counter` component in your page or layout. -For more examples how to connect to your actors using React, check the [RivetKit React documentation](http://rivet.gg/docs/clients/react/). +For more examples how to connect to your actors using React, check the [RivetKit React documentation](http://rivet.dev/docs/clients/react/). ## React Quickstart # React Quickstart @@ -3319,7 +3287,7 @@ Scheduling is used to trigger events in the future. The actor scheduler is like Scheduling is supported on the Rivet Cloud, Cloudflare Workers, file system, and memory drivers. - Follow [this issue](https://github.com/rivet-gg/rivetkit/issues/1095) for Redis support. + Follow [this issue](https://github.com/rivet-dev/rivetkit/issues/1095) for Redis support. ## Use Cases @@ -3690,6 +3658,11 @@ The `setupTest` function automatically calls `vi.useFakeTimers()`, allowing you 4. **Use realistic data**: Test with data that resembles production scenarios. Rivet's testing framework automatically handles server setup and teardown, so you can focus on writing effective tests for your business logic. +## API Reference + +# API Reference + +This is where the technical API docs live. ## Node.js & Bun # Node.js & Bun @@ -3700,7 +3673,7 @@ The Rivet JavaScript client allows you to connect to and interact with actors fr Install the RivetKit package: - Make sure you have a running Rivet actor server to connect to. You can follow the [Node.js & Bun Quickstart](https://rivet.gg/docs/actors/quickstart/backend/) to set up a simple actor server. + Make sure you have a running Rivet actor server to connect to. You can follow the [Node.js & Bun Quickstart](https://rivet.dev/docs/actors/quickstart/backend/) to set up a simple actor server. Create client and connect to actors and listen for real-time updates: @@ -3717,7 +3690,7 @@ main(); ## API Reference -Follows the same [API as the Node.js client](http://rivet.gg/docs/actors/clients/#actor-client), allowing you to use the same methods and properties for interacting with actors. +Follows the same [API as the Node.js client](http://rivet.dev/docs/actors/clients/#actor-client), allowing you to use the same methods and properties for interacting with actors. ## Next.js # Next.js @@ -3732,7 +3705,7 @@ The Rivet Next.js client allows you to connect to and interact with actors in Ne Install the RivetKit React package: - Follow the [Next.js backend integration guide](https://rivet.gg/docs/integrations/next-js/) to set up your Next.js backend with Rivet. + Follow the [Next.js backend integration guide](https://rivet.dev/docs/integrations/next-js/) to set up your Next.js backend with Rivet. Create a RivetKit client to connect to your actor: @@ -3771,12 +3744,12 @@ Make sure to import the `Counter` component in your page or layout. ## API Reference -It's the same as the [React client API reference](https://rivet.gg/docs/clients/react#api-reference), since the RivetKit React package is used in both Next.js and React applications. +It's the same as the [React client API reference](https://rivet.dev/docs/clients/react#api-reference), since the RivetKit React package is used in both Next.js and React applications. ## OpenAPI # OpenAPI -The Rivet OpenAPI spec is available [here](https://github.com/rivet-gg/rivetkit/blob/main/clients/openapi/openapi.json) +The Rivet OpenAPI spec is available [here](https://github.com/rivet-dev/rivetkit/blob/main/clients/openapi/openapi.json) ## React # React @@ -3787,7 +3760,7 @@ Learn how to create real-time, stateful React applications with Rivet's actor mo Install the RivetKit React package: - Make sure you have a running Rivet actor server to connect to. You can follow the [Node.js & Bun Quickstart](https://rivet.gg/docs/actors/quickstart/backend/) to set up a simple actor server. + Make sure you have a running Rivet actor server to connect to. You can follow the [Node.js & Bun Quickstart](https://rivet.dev/docs/actors/quickstart/backend/) to set up a simple actor server. Connect to actors and listen for real-time updates: @@ -4000,7 +3973,7 @@ The Rivet Rust client provides a way to connect to and interact with actors from rivetkit-client = "0.1.0" ``` - Make sure you have a running Rivet actor server to connect to. You can follow the [Node.js & Bun Quickstart](https://rivet.gg/docs/actors/quickstart/backend/) to set up a simple actor server. + Make sure you have a running Rivet actor server to connect to. You can follow the [Node.js & Bun Quickstart](https://rivet.dev/docs/actors/quickstart/backend/) to set up a simple actor server. ```rust src/main.rs use rivetkit_client::; @@ -4035,10 +4008,227 @@ The Rivet Rust client provides a way to connect to and interact with actors from _Coming Soon_ -For detailed API documentation, please refer to the [RivetKit Rust client implementation](https://github.com/rivet-gg/rivetkit/blob/main/clients/rust). -## Freestyle +For detailed API documentation, please refer to the [RivetKit Rust client implementation](https://github.com/rivet-dev/rivetkit/blob/main/clients/rust). +## Deploying to AWS ECS + +# Deploying to AWS ECS + +Run your backend on Amazon ECS with Fargate using a simple container image and service definition. + +## Guide + +- AWS account with permissions for ECS, ECR, and IAM +- AWS CLI v2 configured (`aws configure`) +- An existing VPC with private subnets and security groups for ECS +- Container registry (ECR) and your backend repository + +Navigate to Rivet and click _Connect > Manual_. Copy the environment variables provided, they will be used in the task definition. They should look something like this: + +```bash +RIVET_API_ENDPOINT=https://api-us-west-1.rivet.dev +RIVET_NAMESPACE=your-namespace-id +RIVET_TOKEN=your-token +``` + +Create a `Dockerfile` in your project root: + +```dockerfile +FROM node:20-alpine +WORKDIR /app +COPY package*.json ./ +RUN npm ci --omit=dev +COPY . . +ENV PORT=8080 +CMD ["node", "server.js"] +``` + +Authenticate to ECR, build the image, and push it. Replace the AWS account, region, and repository names with your own. + +```bash +aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com +docker build -t backend:latest . +docker tag backend:latest 123456789012.dkr.ecr.us-east-1.amazonaws.com/backend:latest +docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/backend:latest +``` + +Create `backend-task.json` describing the ECS task. Update the ARNs, subnets, and security groups for your environment. + +```json +, + , + + ] + } + ] +} +``` + +You do not need to expose a container port. Rivet tunnels traffic directly to your backend. + +Register the task definition: + +```bash +aws ecs register-task-definition --cli-input-json file://backend-task.json +``` + +Create or reuse an ECS cluster, then launch a service with the new task definition. Substitute your subnet and security group IDs. + +```bash +aws ecs create-cluster --cluster-name backend +aws ecs create-service \ + --cluster backend \ + --service-name backend \ + --task-definition backend \ + --desired-count 1 \ + --launch-type FARGATE \ + --network-configuration "awsvpcConfiguration=" +``` + +Check that the task is running: + +```bash +aws ecs describe-services --cluster backend --services backend --query "services[0].deployments" +``` + +Your runner should appear as connected on the Rivet dashboard once the task is healthy. +## Deploy To Amazon Web Services Lambda + +# Deploy To Amazon Web Services Lambda + +_AWS Lambda is coming soon_ +## Deploying to Cloudflare Workers + +# Deploying to Cloudflare Workers +# +Run Rivet Actors on Cloudflare Workers with Durable Objects. If you still need a sample app, walk through the [Cloudflare Workers Quickstart](/docs/actors/quickstart/cloudflare-workers) first. + +- [Cloudflare account](https://dash.cloudflare.com/) with Durable Objects enabled +- [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/install-and-update/) v3 +- RivetKit project (or use the [Quickstart](/docs/actors/quickstart/cloudflare-workers)) + +Install the Cloudflare Worker driver alongside RivetKit: + +```sh +npm install rivetkit @rivetkit/cloudflare-workers +``` + +Wire your actors into a Cloudflare Worker using the same setup as the quickstart: + +```ts } +const counter = actor(, + actions: , + getCount: (c) => c.state.count, + }, +}); + +const registry = setup(, +}); +``` + +```ts } +const app = new Hono } }>(); + +app.post("/increment/:name", async (c) => ); +}); + +const = createHandler(registry, ); +; +``` + +```ts } +const = createHandler(registry, ), , + }); + } -# Freestyle + return new Response("Not Found", ); + } +}); + +; +``` + +Configure Durable Objects and KV namespaces in `wrangler.json` (same as the quickstart): + +```json } + + ], + "durable_objects": + ] + }, + "kv_namespaces": [ + + ] +} +``` + +Configuration requirements: + +- `ACTOR_DO` durable object binding for actor persistence +- `ACTOR_KV` KV namespace binding for metadata storage +- `nodejs_compat` compatibility flag +- Migration entry defining the `ActorHandler` class + +Start the worker locally: + +```sh +wrangler dev +``` + +Call your actor at `http://localhost:8787/increment/my-counter`. + +When you're ready, deploy to Cloudflare's network: + +```sh +wrangler deploy +``` + +Durable Objects back your actor state globally, and the Rivet endpoint is automatically mounted at `/rivet`. + +## Advanced + +### Accessing Environment Bindings + +You can access Cloudflare Workers environment bindings directly using the importable `env`: + +```typescript +// Access environment variables and secrets in top-level scope +const API_KEY = env.API_KEY; +const LOG_LEVEL = env.LOG_LEVEL || "info"; + +// Use bindings in your actor +const myActor = actor(, + + actions: + } + } +}); +``` + +### Driver Context + +The Cloudflare Workers driver provides access to the Durable Object state and environment through the driver context in `createVars`. + +```typescript +const myActor = actor(, + + // Save the Cloudflare driver context + createVars: (ctx: ActorInitContext, driver: DriverContext) => (), + + actions: , + } +}); +``` + +The Cloudflare Workers driver context type is exported as `DriverContext` from `@rivetkit/cloudflare-workers`: + +```typescript +interface DriverContext +``` + +While you have access to the Durable Object state, be cautious when directly modifying KV storage or alarms, as this may interfere with RivetKit's internal operations and potentially break actor functionality. +## Deploying to Freestyle + +# Deploying to Freestyle Deploy RivetKit app to [Freestyle.sh](https://freestyle.sh/), a cloud platform for running AI-generated code with built-in security and scalability. @@ -4048,13 +4238,13 @@ Complete example of deploying RivetKit app to Freestyle.sh. ## Setup -Install RivetKit + Hono and create your registry: +Install RivetKit and Hono and create your registry: ```bash npm install rivetkit hono ``` -Update your server code to run the registry through Deno. +Update your server code to run the registry serverless with Deno. ```typescript } const = registry.start(/api`, @@ -4065,12 +4255,6 @@ const = registry.start(/api`, Deno.serve(fetch); ``` -**Configuration Requirements:** - -- `endpoint` - Rivet API endpoint (use "api.rivet.gg" for Rivet Cloud) -- `namespace` - Your Rivet namespace for actor isolation -- `inspector.enabled` - Enable debugging and monitoring - Deploy your application to Freestyle with the correct configuration. Create a deployment script or add this to your existing deployment process: ```typescript @@ -4080,7 +4264,7 @@ const res = await freestyle.deployWeb(buildDir, `, RIVET_RUNNER_KIND: "serverless", // For self-hosted instances: // RIVET_ENDPOINT: "http://127.0.0.1:6420", - RIVET_ENDPOINT: "api.rivet.gg", + RIVET_ENDPOINT: "api.rivet.dev", }, timeout: 60 * 5, // Increases max request lifetime on the runner entrypoint: "server.ts", // File which starts serverless runner @@ -4131,72 +4315,292 @@ Execute this configuration script to register your Freestyle deployment with Riv - `requestLifespan` - Request timeout (slightly less than Freestyle timeout) Once executed, Rivet will be connected to your Freestyle serverless instance. +## Deploying to Google Cloud Run + +# Deploying to Google Cloud Run + +Run your backend on Cloud Run with a lightweight container image and one command deploy. + +## Guide + +- Google Cloud project with Cloud Run and Artifact Registry enabled +- `gcloud` CLI authenticated (`gcloud auth login`) and project set (`gcloud config set project YOUR_PROJECT`) +- Artifact Registry repository or Container Registry enabled +- Your backend application repository + +Navigate to Rivet and click _Connect > Manual_. Copy the environment variables provided, they will be used when deploying. They should look something like this: + +```bash +RIVET_API_ENDPOINT=https://api-us-west-1.rivet.dev +RIVET_NAMESPACE=your-namespace-id +RIVET_TOKEN=your-token +``` + +Create a `Dockerfile` in your project root: + +```dockerfile +FROM node:20-alpine +WORKDIR /app +COPY package*.json ./ +RUN npm ci --omit=dev +COPY . . +ENV PORT=8080 +CMD ["node", "server.js"] +``` + +Use Cloud Build to build and push the image. Replace the region and repository with your own. + +```bash +gcloud builds submit --tag us-central1-docker.pkg.dev/YOUR_PROJECT/backend/backend:latest +``` + +Deploy the service to Cloud Run, passing the Rivet environment variables. Adjust the region, image, and VPC connector settings as needed. + +```bash +gcloud run deploy backend \ + --image us-central1-docker.pkg.dev/YOUR_PROJECT/backend/backend:latest \ + --region us-central1 \ + --allow-unauthenticated \ + --min-instances 1 \ + --set-env-vars RIVET_API_ENDPOINT=https://api-us-west-1.rivet.dev,RIVET_NAMESPACE=your-namespace-id,RIVET_TOKEN=your-token +``` + +You do not need to expose a container port. Rivet tunnels traffic directly to your backend. + +Confirm the service is running: + +```bash +gcloud run services describe backend --region us-central1 --format 'value(status.conditions[?type="Ready"].status)' +``` + +Your runner should appear as connected on the Rivet dashboard once the service reports ready. +## Deploying to Hetzner + +# Deploying to Hetzner + +Please see the [VM & Bare Metal](/docs/deploy/vm-and-bare-metal) guide. +## Deploying to Kubernetes + +# Deploying to Kubernetes +# +Run your backend on any Kubernetes cluster with a simple container image and deployment manifest. + +## Guide + +- A Kubernetes cluster with `kubectl` access (AKS, EKS, GKE, k3s, etc.) +- Container registry credentials (Docker Hub, GHCR, GCR, etc.) +- Your backend application repository + +Navigate to Rivet and click _Connect > Manual_. Copy the environment variables provided, they will be used in later manifests. They should look something like this: + +```bash +RIVET_API_ENDPOINT=https://api-us-west-1.rivet.dev +RIVET_NAMESPACE=your-namespace-id +RIVET_TOKEN=your-token +``` + +Create a `Dockerfile` in your project root: + +```dockerfile +FROM node:20-alpine +WORKDIR /app +COPY package*.json ./ +RUN npm ci --omit=dev +COPY . . +ENV PORT=8080 +CMD ["node", "server.js"] +``` + +```bash +docker build -t registry.example.com/your-team/backend:latest . +docker push registry.example.com/your-team/backend:latest +``` + +Replace `registry.example.com/your-team` with your registry path. Auth with `docker login` first if needed. + +Create a `backend-secrets.yaml` for your environment variables: + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: backend-secrets +type: Opaque +stringData: + RIVET_API_ENDPOINT: https://api-us-west-1.rivet.dev + RIVET_NAMESPACE: your-namespace-id + RIVET_TOKEN: your-token +``` + +Then create a `deployment.yaml`: + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: backend +spec: + replicas: 1 + selector: + matchLabels: + app: backend + template: + metadata: + labels: + app: backend + spec: + containers: + - name: backend + image: registry.example.com/your-team/backend:latest + envFrom: + - secretRef: + name: backend-secrets +``` + +You do not need to expose a container port. Rivet tunnels traffic directly to your backend. + +Apply both manifests: + +```bash +kubectl apply -f backend-secrets.yaml +kubectl apply -f deployment.yaml +``` + +Add a `Service` or Ingress if you need external access. + +Check that the pod is running: + +```bash +kubectl get pods -l app=backend +``` + +Your runner should appear as connected on the Rivet dashboard once the pod is ready. ## Deploying to Railway # Deploying to Railway +# Deploy your RivetKit app to [Railway](https://railway.app). -## Deploy from Template - -github & railway app button https://github.com/rivet-dev/template-railway +## Option A: Deploy from Template -## Deploy Manually +If you're starting from scratch, go to the Connect tab on the Rivet dashboard and follow the Railway deployment steps. This give you a 1-click deploy of the [RivetKit Railway template](). -### Prerequisites +## Option B: Deploy Manual - [Railway account](https://railway.app) -- Your RivetKit app (to get started, see the [Quickstart](/docs/actors/quickstart) page or [Examples](https://github.com/rivet-dev/rivetkit/tree/main/examples)) -- Access to the Rivet Cloud or a [self-hosted Rivet Engine](/docs/general/self-hosting) - -### Step 1: Setup Node Project for Railway +- Your RivetKit app + - If you don't have one, see the [Quickstart](/docs/actors/quickstart) page or our [Examples](https://github.com/rivet-dev/rivetkit/tree/main/examples) +- Access to the [Rivet Cloud](https://dashboard.rivet.dev/) or a [self-hosted Rivet Engine](/docs/general/self-hosting) Ensure your `package.json` has a start script: ```json - // ... rest of package.json + // ... Rest of package.json } ``` -### Step 2: Deploy to Railway - 1. Connect your GitHub account to Railway 2. Select your repository containing your RivetKit app 3. Railway will automatically detect and deploy your app -Detailed steps are available on [Railway's docs](https://docs.railway.com/quick-start). +Railway will automatically deploy your RivetKit app on every git push. -After this point, Railway automatically deploys your RivetKit app on every git push. +Detailed steps are available on [Railway's docs](https://docs.railway.com/quick-start). -### Step 3: Set Environment Variables +You do not need to expose a container port. Rivet tunnels traffic directly to your backend. After selecting your project on the Rivet dashboard, go to Connect > Railway to get the environment variables needed. -Then follow [Railway's documentation](https://docs.railway.com/guides/variables#service-variables) to add them to your app. +To add your environment variables: +1. Go to your Railway project dashboard +2. Select your service +3. Navigate to the **Variables** tab +4. Add the required environment variables and deploy your changes -### Step 4: Verify Deployment --- you will see your runner connected on the connect tab --- you can now create and connect to actors +Detailed steps are available on [Railway's docs](https://docs.railway.com/guides/variables#service-variables). -### Step 3: Deployed +You should see your runner connected on the Connect tab of your Rivet Dashboard. Now you can create and connect to your Rivet Actors. +## Supabase -Railway automatically deploys your RivetKit app. At this point, on the Connect tab of your Rivet dashboard, you will be able to create your actors. +# Supabase -Railway automatically deploys your RivetKit app on every git push. +_Supabase is coming soon_ +## Vercel -## Configuration Examples +# Vercel -### Node.js RivetKit App +_Vercel is coming soon_ +## Deploying to VMs & Bare Metal -### Docker-based RivetKit App +# Deploying to VMs & Bare Metal -```dockerfile -FROM node:18-alpine -WORKDIR /app -COPY package*.json ./ -RUN npm install -COPY . . -CMD ["npm", "start"] +Run your backend on any Linux VM or bare metal host with a basic systemd unit. + +## Guide + +- Build your backend locally. +- Copy the build output to your server (example): + +```bash +scp -r ./dist user@server:/opt/backend +``` + +Place the files somewhere readable by the service user, such as `/opt/backend`. + +Navigate to Rivet and click _Connect > Manual_. Copy the environment variables provided, they will be used in the next step. They should look something like this: + +```bash +RIVET_API_ENDPOINT=https://api-us-west-1.rivet.dev +RIVET_NAMESPACE=your-namespace-id +RIVET_TOKEN=your-token +``` + +Create `/etc/systemd/system/backend.service`: + +```ini +[Unit] +Description=Backend Service +After=network.target + +[Service] +Type=simple +WorkingDirectory=/opt/backend +ExecStart=/usr/bin/node server.js +Restart=on-failure +Environment=RIVET_API_ENDPOINT=https://api.rivet.dev +Environment=RIVET_NAMESPACE=your-namespace-id +Environment=RIVET_TOKEN=your-token + +[Install] +WantedBy=multi-user.target +``` + +Replace the environment values with those from the Connect tab in the Rivet dashboard (or your self-hosted engine) and adjust paths to match your deployment. + +Reload systemd units and start the service: + +```bash +sudo systemctl daemon-reload +sudo systemctl enable --now backend.service +``` + +## Operating + +### Restart + +Restart the service after deploying new builds or environment changes: + +```bash +sudo systemctl restart backend.service +``` + +### Logs + +Follow realtime logs when debugging: + +```bash +sudo journalctl -u backend.service -f ``` ## Build Your Own @@ -4212,9 +4616,9 @@ Each driver implements common interfaces defined by RivetKit, including: Get started by looking at source code for the driver interfaces and existing drivers: - **Driver Interfaces** - - **ActorDriver*** [Source Code](https://github.com/rivet-gg/rivetkit/blob/main/packages/core/src/actor/driver.ts) - - **ManagerDriver*** [Source Code](https://github.com/rivet-gg/rivetkit/blob/main/packages/core/src/manager/driver.ts) -- **Driver Implementations**: [Source Code](https://github.com/rivet-gg/rivetkit/tree/main/packages/core/src/drivers) + - **ActorDriver*** [Source Code](https://github.com/rivet-dev/rivetkit/blob/main/packages/core/src/actor/driver.ts) + - **ManagerDriver*** [Source Code](https://github.com/rivet-dev/rivetkit/blob/main/packages/core/src/manager/driver.ts) +- **Driver Implementations**: [Source Code](https://github.com/rivet-dev/rivetkit/tree/main/packages/core/src/drivers) ## File System # File System @@ -4626,8 +5030,8 @@ Each documentation page is also available as clean markdown by appending `.md` t For example: -- Original URL: `https://rivet.gg/docs/actors` -- Markdown URL: `https://rivet.gg/docs/actors.md` +- Original URL: `https://rivet.dev/docs/actors` +- Markdown URL: `https://rivet.dev/docs/actors.md` ## Edge Networking # Edge Networking @@ -4779,91 +5183,62 @@ Take full control of your Rivet deployment with flexible hosting options and sto In-memory storage for testing and ephemeral use cases Create custom storage drivers for your specific requirements -## Rivet Studio - -# Rivet Studio - -Rivet Studio is a web-based development tool for debugging and monitoring your Rivet Actors in real-time. - -## Features - -- **View running actors**: See all active Rivet Actors in your application -- **Edit actor state**: Modify actor state in real-time for debugging -- **REPL for actions**: Interactive console to call actor actions directly -- **Event monitoring**: Track actor events including actions, broadcasts, events, and subscriptions -- **Connection viewer**: Monitor all connected connections & their associated state +## System Architecture -## How it works +# System Architecture -RivetKit automatically mounts a route at `/registry` on your server for Studio access. When your application starts: + This document is for advanced users seeking to understand the internal architecture of RivetKit. Most users do not need to read this document. -1. RivetKit generates a secure token for authentication on startup -2. Open to [studio.rivet.gg](https://studio.rivet.gg) in your browser or click the `studio.rivet.gg` URL that's printed to your console on startup -3. Rivet Studio connects to your application +## Request Lifecycle -Rivet Studio is automatically disabled in production when `NODE_ENV=production`. +### Base Architecture -## Configuration +### Coordinated Architecture +## Webhooks -### Token configuration +# Webhooks -By default, Rivet Studio generates and stores a token automatically. You can configure it: +TODO +## Overview -- **Environment variable**: Set `RIVETKIT_STUDIO_TOKEN` -- **Code configuration**: - ```typescript } - registry.start( - }) - ``` +# Overview -### Disabling the Studio +Rivet is a library for long-lived processes with durable state, realtime, and scalability. It is easily self-hostable and works with your infrastructure. -Disable Studio using any of these methods: +## Features -- Set `RIVETKIT_STUDIO_DISABLE` environment variable -- Set `NODE_ENV=production` -- Configure in code: - ```typescript } - registry.start( - }) - ``` +- **Stateful Workloads**: Keep memory between operations & run complex logic that requires stateful processes +- **Realtime**: Powered by WebSockets or SSE without the complexity +- **Elastic Scalability**: Scale from zero to millions without cold starts +- **Multi-Region Durable Storage**: Keep state & operations near your users or comply with data soveirgnty -### CORS configuration +## Tools -Configure CORS for custom Studio deployments: + Long-lived processes with durable state, realtime, and hibernation -```typescript } -registry.start( - } -}) -``` +## Use Cases -See the [CORS documentation](/docs/general/cors/) for more details. + Deploy assistants that reason and act with durable memory -### Default endpoint + Sync state instantly over WebSockets or SSE -On startup, RivetKit prints a URL for connecting to Studio. By default, Studio connects to `localhost:8080` if no endpoint is provided. Override with: + Run long-lived services with automatic failover -```typescript } -registry.start( -}) -``` -## System Architecture + Isolate customer data with multi-tenant storage -# System Architecture + Throttle requests using stateful counters per client - This document is for advanced users seeking to understand the internal architecture of RivetKit. Most users do not need to read this document. + Build chat and workflow bots with actor logic -## Request Lifecycle +## Integrations -### Base Architecture +))} -### Coordinated Architecture -## Webhooks +## Support -# Webhooks + Chat with the community and get realtime help from Rivet engineers -TODO + File bugs or request features directly in our tracker ## Better Auth # Better Auth @@ -5168,57 +5543,6 @@ wrangler deploy ``` Your actors will now run on Cloudflare's global edge network with persistent state backed by Durable Objects. - -## Examples - -Example using Cloudflare Workers with Hono web framework. - -Basic Cloudflare Workers setup and configuration example. - - Cloudflare Workers mounts the Rivet endpoint on `/rivet` by default. - -## Advanced - -### Accessing Environment Bindings - -You can access Cloudflare Workers environment bindings directly using the importable `env`: - -```typescript -// Access environment variables and secrets in top-level scope -const API_KEY = env.API_KEY; -const LOG_LEVEL = env.LOG_LEVEL || "info"; - -// Use bindings in your actor -const myActor = actor(, - - actions: - } - } -}); -``` - -### Driver Context - -The Cloudflare Workers driver provides access to the Durable Object state and environment through the driver context in `createVars`. - -```typescript -const myActor = actor(, - - // Save the Cloudflare driver context - createVars: (ctx: ActorInitContext, driver: DriverContext) => (), - - actions: , - } -}); -``` - -The Cloudflare Workers driver context type is exported as `DriverContext` from `@rivetkit/cloudflare-workers`: - -```typescript -interface DriverContext -``` - -While you have access to the Durable Object state, be cautious when directly modifying KV storage or alarms, as this may interfere with RivetKit's internal operations and potentially break actor functionality. ## Elysia # Elysia @@ -5400,31 +5724,9 @@ serve(app); Rivet provides seamless integrations with popular frameworks and tools to help you build modern applications. -## Frontend & Clients - - Full-featured JavaScript client for web and Node.js applications - - React hooks and components for building interactive UIs - - Type-safe Rust client for high-performance applications + ))} -## Backend - - Lightweight and fast web framework for modern JavaScript - - Popular Node.js web framework with extensive middleware support - - Fast and type-safe TypeScript web framework - - End-to-end type-safe API development - -## Auth - - Modern authentication library with TypeScript support - -## Misc - - Fast unit testing framework for JavaScript and TypeScript +))} ## Next.js # Next.js @@ -6042,7 +6344,7 @@ For more options: ## Build From Source ```bash -git clone https://github.com/rivet-gg/rivet.git +git clone https://github.com/rivet-dev/rivet.git cd rivet cargo build --release -p rivet-engine ./target/release/rivet-engine @@ -6081,7 +6383,7 @@ Choose the template that best fits your needs: | - Manual setup required | - Rivet Inspector for debugging | | | - Ready to run immediately | -You can also use the [Rivet Railway template](https://github.com/rivet-gg/template-railway) as a starting point for your application. +You can also use the [Rivet Railway template](https://github.com/rivet-dev/template-railway) as a starting point for your application. After deploying either template, you can find the `RIVET__AUTH__ADMIN_TOKEN` under the **Variables** tab in the Railway dashboard. This token is required to access the Rivet Inspector. @@ -6125,4 +6427,62 @@ Follow the [Railway Quick Start guide](https://docs.railway.com/quick-start) to 2. Select your repository containing your Rivet application 3. Railway will automatically detect and deploy your application 4. Configure environment variables for your application: - - `RIVET_ENGINE=$}` - Points to the Rivet Engine service's private domain \ No newline at end of file + - `RIVET_ENGINE=$}` - Points to the Rivet Engine service's private domain +## AI Agents + +# AI Agents + +Build durable assistants that keep memory between conversations, call tools, and react instantly to user input. + +**Examples** +- [AI Agent Starter](https://github.com/rivet-dev/rivetkit/tree/main/examples/ai-agent) +## Bots + +# Bots + +Run bots for Slack, Discord, or autonomous agents that need persistent workers listening, responding, and executing background tasks. + +**Examples** +- [AI Agent Starter](https://github.com/rivet-dev/rivetkit/tree/main/examples/ai-agent) +- [Realtime Chat Room](https://github.com/rivet-dev/rivetkit/tree/main/examples/chat-room) +## Durable Compute + +# Durable Compute + +Run long-lived workloads that survive restarts, keep state close to users, and recover automatically when nodes shift. + +**Examples** +- [Sync Offline Data](https://github.com/rivet-dev/rivetkit/tree/main/examples/sync) +- [Tenant Isolation](https://github.com/rivet-dev/rivetkit/tree/main/examples/tenant) +- [Realtime Counter](https://github.com/rivet-dev/rivetkit/tree/main/examples/counter) +- [Realtime Chat Room](https://github.com/rivet-dev/rivetkit/tree/main/examples/chat-room) +- [Collaborative CRDT Docs](https://github.com/rivet-dev/rivetkit/tree/main/examples/crdt) +- [Multiplayer Game State](https://github.com/rivet-dev/rivetkit/tree/main/examples/game) +## Per-Tenant Databases + +# Per-Tenant Databases + +Provision isolated storage per customer while sharing infrastructure, keeping noisy neighbours separated and compliant. + +**Examples** +- [Tenant Isolation](https://github.com/rivet-dev/rivetkit/tree/main/examples/tenant) +- [SQLite Sharding](https://github.com/rivet-dev/rivetkit/tree/main/examples/database) +## Rate Limiting + +# Rate Limiting + +Throttle abusive clients with actors that track counters, rolling windows, and quotas without sharing mutable state. + +**Examples** +- [Stateful Rate Limiter](https://github.com/rivet-dev/rivetkit/tree/main/examples/rate) +## Realtime + +# Realtime + +Deliver sub-second updates with actors that push changes over WebSockets or SSE without juggling infrastructure. + +**Examples** +- [Chat Room](https://github.com/rivet-dev/rivetkit/tree/main/examples/chat-room) +- [Multiplayer Game State](https://github.com/rivet-dev/rivetkit/tree/main/examples/game) +- [Stream Processing](https://github.com/rivet-dev/rivetkit/tree/main/examples/stream) +- [Sync Offline Data](https://github.com/rivet-dev/rivetkit/tree/main/examples/sync) \ No newline at end of file diff --git a/site/public/llms.txt b/site/public/llms.txt index 94a49f213a..fbaf5ca45c 100644 --- a/site/public/llms.txt +++ b/site/public/llms.txt @@ -1,126 +1,142 @@ # Rivet Documentation Index -https://rivet.gg -https://rivet.gg/acceptable-use -https://rivet.gg/blog -https://rivet.gg/blog/2024-02-12-usage-pricing-update -https://rivet.gg/blog/2024-12-21-rivet-actors-launch -https://rivet.gg/blog/2025-02-16-sqlite-on-the-server-is-misunderstood -https://rivet.gg/blog/2025-03-15-cli-installation-fixes -https://rivet.gg/blog/2025-03-15-writing-docs-for-ai -https://rivet.gg/blog/2025-03-23-what-would-a-w3c-standard-look-like-for-stateful-serverless- -https://rivet.gg/blog/2025-05-28-building-linear-agents-in-node-js-and-rivet-full-walkthrough-and-starter-kit -https://rivet.gg/blog/2025-06-02-faster-route-propagation-by-rewriting-our-traefik-gateway-in-rust -https://rivet.gg/blog/2025-06-10-rivet-functions-launch -https://rivet.gg/blog/2025-06-24-cloudflare-containers-vs-rivet-containers-vs-fly-machines -https://rivet.gg/blog/2025-07-01-introducing-rivetkit-backend-libraries-that-replace-saas -https://rivet.gg/blog/2025-09-04-rivet-v2-launch -https://rivet.gg/blog/2025-09-12-performance-lifecycle-updates -https://rivet.gg/blog/2025-09-14-weekly-updates -https://rivet.gg/blog/2025-09-21-weekly-updates -https://rivet.gg/blog/2025-09-24-vbare-simple-schema-evolution-with-maximum-performance -https://rivet.gg/blog/2025-09-28-weekly-updates -https://rivet.gg/blog/2025-1-12-rivet-inspector -https://rivet.gg/blog/2025-10-01-railway-selfhost -https://rivet.gg/blog/godot-multiplayer-compared-to-unity -https://rivet.gg/changelog -https://rivet.gg/changelog.json -https://rivet.gg/changelog/2024-02-12-usage-pricing-update -https://rivet.gg/changelog/2024-12-21-rivet-actors-launch -https://rivet.gg/changelog/2025-02-16-sqlite-on-the-server-is-misunderstood -https://rivet.gg/changelog/2025-03-15-cli-installation-fixes -https://rivet.gg/changelog/2025-03-15-writing-docs-for-ai -https://rivet.gg/changelog/2025-03-23-what-would-a-w3c-standard-look-like-for-stateful-serverless- -https://rivet.gg/changelog/2025-05-28-building-linear-agents-in-node-js-and-rivet-full-walkthrough-and-starter-kit -https://rivet.gg/changelog/2025-06-02-faster-route-propagation-by-rewriting-our-traefik-gateway-in-rust -https://rivet.gg/changelog/2025-06-10-rivet-functions-launch -https://rivet.gg/changelog/2025-06-24-cloudflare-containers-vs-rivet-containers-vs-fly-machines -https://rivet.gg/changelog/2025-07-01-introducing-rivetkit-backend-libraries-that-replace-saas -https://rivet.gg/changelog/2025-09-04-rivet-v2-launch -https://rivet.gg/changelog/2025-09-12-performance-lifecycle-updates -https://rivet.gg/changelog/2025-09-14-weekly-updates -https://rivet.gg/changelog/2025-09-21-weekly-updates -https://rivet.gg/changelog/2025-09-24-vbare-simple-schema-evolution-with-maximum-performance -https://rivet.gg/changelog/2025-09-28-weekly-updates -https://rivet.gg/changelog/2025-1-12-rivet-inspector -https://rivet.gg/changelog/2025-10-01-railway-selfhost -https://rivet.gg/changelog/godot-multiplayer-compared-to-unity -https://rivet.gg/cloud -https://rivet.gg/docs/actors -https://rivet.gg/docs/actors/actions -https://rivet.gg/docs/actors/authentication -https://rivet.gg/docs/actors/clients -https://rivet.gg/docs/actors/communicating-between-actors -https://rivet.gg/docs/actors/connections -https://rivet.gg/docs/actors/ephemeral-variables -https://rivet.gg/docs/actors/events -https://rivet.gg/docs/actors/external-sql -https://rivet.gg/docs/actors/fetch-and-websocket-handler -https://rivet.gg/docs/actors/helper-types -https://rivet.gg/docs/actors/input -https://rivet.gg/docs/actors/keys -https://rivet.gg/docs/actors/lifecycle -https://rivet.gg/docs/actors/metadata -https://rivet.gg/docs/actors/quickstart -https://rivet.gg/docs/actors/quickstart/backend -https://rivet.gg/docs/actors/quickstart/cloudflare-workers -https://rivet.gg/docs/actors/quickstart/next-js -https://rivet.gg/docs/actors/quickstart/react -https://rivet.gg/docs/actors/scaling -https://rivet.gg/docs/actors/schedule -https://rivet.gg/docs/actors/sharing-and-joining-state -https://rivet.gg/docs/actors/state -https://rivet.gg/docs/actors/testing -https://rivet.gg/docs/clients/javascript -https://rivet.gg/docs/clients/next-js -https://rivet.gg/docs/clients/openapi -https://rivet.gg/docs/clients/react -https://rivet.gg/docs/clients/rust -https://rivet.gg/docs/deploy/freestyle -https://rivet.gg/docs/deploy/railway -https://rivet.gg/docs/drivers/build-your-own -https://rivet.gg/docs/drivers/file-system -https://rivet.gg/docs/drivers/memory -https://rivet.gg/docs/examples/autofill-example -https://rivet.gg/docs/general/architecture -https://rivet.gg/docs/general/cors -https://rivet.gg/docs/general/docs-for-llms -https://rivet.gg/docs/general/edge -https://rivet.gg/docs/general/logging -https://rivet.gg/docs/general/self-hosting -https://rivet.gg/docs/general/studio -https://rivet.gg/docs/general/system-architecture -https://rivet.gg/docs/general/webhooks -https://rivet.gg/docs/integrations -https://rivet.gg/docs/integrations/better-auth -https://rivet.gg/docs/integrations/cloudflare-workers -https://rivet.gg/docs/integrations/elysia -https://rivet.gg/docs/integrations/express -https://rivet.gg/docs/integrations/hono -https://rivet.gg/docs/integrations/next-js -https://rivet.gg/docs/integrations/pino -https://rivet.gg/docs/integrations/trpc -https://rivet.gg/docs/integrations/vitest -https://rivet.gg/docs/self-hosting -https://rivet.gg/docs/self-hosting/aws-fargate -https://rivet.gg/docs/self-hosting/configuration -https://rivet.gg/docs/self-hosting/connect-backend -https://rivet.gg/docs/self-hosting/docker-compose -https://rivet.gg/docs/self-hosting/docker-container -https://rivet.gg/docs/self-hosting/google-cloud-run -https://rivet.gg/docs/self-hosting/hetzner -https://rivet.gg/docs/self-hosting/install -https://rivet.gg/docs/self-hosting/kubernetes -https://rivet.gg/docs/self-hosting/multi-region -https://rivet.gg/docs/self-hosting/railway -https://rivet.gg/guides/chat -https://rivet.gg/meme/wired-in -https://rivet.gg/oss-friends -https://rivet.gg/pricing -https://rivet.gg/privacy -https://rivet.gg/rivet-vs-cloudflare-workers -https://rivet.gg/rss/feed.xml -https://rivet.gg/sales -https://rivet.gg/support -https://rivet.gg/talk-to-an-engineer -https://rivet.gg/terms \ No newline at end of file +https://rivet.dev +https://rivet.dev/acceptable-use +https://rivet.dev/blog +https://rivet.dev/blog/2024-02-12-usage-pricing-update +https://rivet.dev/blog/2024-12-21-rivet-actors-launch +https://rivet.dev/blog/2025-02-16-sqlite-on-the-server-is-misunderstood +https://rivet.dev/blog/2025-03-15-cli-installation-fixes +https://rivet.dev/blog/2025-03-15-writing-docs-for-ai +https://rivet.dev/blog/2025-03-23-what-would-a-w3c-standard-look-like-for-stateful-serverless- +https://rivet.dev/blog/2025-05-28-building-linear-agents-in-node-js-and-rivet-full-walkthrough-and-starter-kit +https://rivet.dev/blog/2025-06-02-faster-route-propagation-by-rewriting-our-traefik-gateway-in-rust +https://rivet.dev/blog/2025-06-10-rivet-functions-launch +https://rivet.dev/blog/2025-06-24-cloudflare-containers-vs-rivet-containers-vs-fly-machines +https://rivet.dev/blog/2025-07-01-introducing-rivetkit-backend-libraries-that-replace-saas +https://rivet.dev/blog/2025-09-04-rivet-v2-launch +https://rivet.dev/blog/2025-09-12-performance-lifecycle-updates +https://rivet.dev/blog/2025-09-14-weekly-updates +https://rivet.dev/blog/2025-09-21-weekly-updates +https://rivet.dev/blog/2025-09-24-vbare-simple-schema-evolution-with-maximum-performance +https://rivet.dev/blog/2025-09-28-weekly-updates +https://rivet.dev/blog/2025-1-12-rivet-inspector +https://rivet.dev/blog/2025-10-01-railway-selfhost +https://rivet.dev/blog/godot-multiplayer-compared-to-unity +https://rivet.dev/changelog +https://rivet.dev/changelog.json +https://rivet.dev/changelog/2024-02-12-usage-pricing-update +https://rivet.dev/changelog/2024-12-21-rivet-actors-launch +https://rivet.dev/changelog/2025-02-16-sqlite-on-the-server-is-misunderstood +https://rivet.dev/changelog/2025-03-15-cli-installation-fixes +https://rivet.dev/changelog/2025-03-15-writing-docs-for-ai +https://rivet.dev/changelog/2025-03-23-what-would-a-w3c-standard-look-like-for-stateful-serverless- +https://rivet.dev/changelog/2025-05-28-building-linear-agents-in-node-js-and-rivet-full-walkthrough-and-starter-kit +https://rivet.dev/changelog/2025-06-02-faster-route-propagation-by-rewriting-our-traefik-gateway-in-rust +https://rivet.dev/changelog/2025-06-10-rivet-functions-launch +https://rivet.dev/changelog/2025-06-24-cloudflare-containers-vs-rivet-containers-vs-fly-machines +https://rivet.dev/changelog/2025-07-01-introducing-rivetkit-backend-libraries-that-replace-saas +https://rivet.dev/changelog/2025-09-04-rivet-v2-launch +https://rivet.dev/changelog/2025-09-12-performance-lifecycle-updates +https://rivet.dev/changelog/2025-09-14-weekly-updates +https://rivet.dev/changelog/2025-09-21-weekly-updates +https://rivet.dev/changelog/2025-09-24-vbare-simple-schema-evolution-with-maximum-performance +https://rivet.dev/changelog/2025-09-28-weekly-updates +https://rivet.dev/changelog/2025-1-12-rivet-inspector +https://rivet.dev/changelog/2025-10-01-railway-selfhost +https://rivet.dev/changelog/godot-multiplayer-compared-to-unity +https://rivet.dev/cloud +https://rivet.dev/docs/actors +https://rivet.dev/docs/actors/actions +https://rivet.dev/docs/actors/authentication +https://rivet.dev/docs/actors/clients +https://rivet.dev/docs/actors/communicating-between-actors +https://rivet.dev/docs/actors/connections +https://rivet.dev/docs/actors/ephemeral-variables +https://rivet.dev/docs/actors/events +https://rivet.dev/docs/actors/external-sql +https://rivet.dev/docs/actors/fetch-and-websocket-handler +https://rivet.dev/docs/actors/helper-types +https://rivet.dev/docs/actors/input +https://rivet.dev/docs/actors/keys +https://rivet.dev/docs/actors/lifecycle +https://rivet.dev/docs/actors/metadata +https://rivet.dev/docs/actors/quickstart +https://rivet.dev/docs/actors/quickstart/backend +https://rivet.dev/docs/actors/quickstart/cloudflare-workers +https://rivet.dev/docs/actors/quickstart/next-js +https://rivet.dev/docs/actors/quickstart/react +https://rivet.dev/docs/actors/scaling +https://rivet.dev/docs/actors/schedule +https://rivet.dev/docs/actors/sharing-and-joining-state +https://rivet.dev/docs/actors/state +https://rivet.dev/docs/actors/testing +https://rivet.dev/docs/api +https://rivet.dev/docs/clients/javascript +https://rivet.dev/docs/clients/next-js +https://rivet.dev/docs/clients/openapi +https://rivet.dev/docs/clients/react +https://rivet.dev/docs/clients/rust +https://rivet.dev/docs/deploy/aws-ecs +https://rivet.dev/docs/deploy/aws-lambda +https://rivet.dev/docs/deploy/cloudflare-workers +https://rivet.dev/docs/deploy/freestyle +https://rivet.dev/docs/deploy/gcp-cloud-run +https://rivet.dev/docs/deploy/hetzner +https://rivet.dev/docs/deploy/kubernetes +https://rivet.dev/docs/deploy/railway +https://rivet.dev/docs/deploy/supabase +https://rivet.dev/docs/deploy/vercel +https://rivet.dev/docs/deploy/vm-and-bare-metal +https://rivet.dev/docs/drivers/build-your-own +https://rivet.dev/docs/drivers/file-system +https://rivet.dev/docs/drivers/memory +https://rivet.dev/docs/examples/autofill-example +https://rivet.dev/docs/general/architecture +https://rivet.dev/docs/general/cors +https://rivet.dev/docs/general/docs-for-llms +https://rivet.dev/docs/general/edge +https://rivet.dev/docs/general/logging +https://rivet.dev/docs/general/self-hosting +https://rivet.dev/docs/general/system-architecture +https://rivet.dev/docs/general/webhooks +https://rivet.dev/docs/index +https://rivet.dev/docs/integrations +https://rivet.dev/docs/integrations/better-auth +https://rivet.dev/docs/integrations/cloudflare-workers +https://rivet.dev/docs/integrations/elysia +https://rivet.dev/docs/integrations/express +https://rivet.dev/docs/integrations/hono +https://rivet.dev/docs/integrations/next-js +https://rivet.dev/docs/integrations/pino +https://rivet.dev/docs/integrations/trpc +https://rivet.dev/docs/integrations/vitest +https://rivet.dev/docs/self-hosting +https://rivet.dev/docs/self-hosting/aws-fargate +https://rivet.dev/docs/self-hosting/configuration +https://rivet.dev/docs/self-hosting/connect-backend +https://rivet.dev/docs/self-hosting/docker-compose +https://rivet.dev/docs/self-hosting/docker-container +https://rivet.dev/docs/self-hosting/google-cloud-run +https://rivet.dev/docs/self-hosting/hetzner +https://rivet.dev/docs/self-hosting/install +https://rivet.dev/docs/self-hosting/kubernetes +https://rivet.dev/docs/self-hosting/multi-region +https://rivet.dev/docs/self-hosting/railway +https://rivet.dev/docs/use-cases/ai-agents +https://rivet.dev/docs/use-cases/bots +https://rivet.dev/docs/use-cases/durable-compute +https://rivet.dev/docs/use-cases/per-tenant-databases +https://rivet.dev/docs/use-cases/rate-limiting +https://rivet.dev/docs/use-cases/realtime +https://rivet.dev/guides/chat +https://rivet.dev/meme/wired-in +https://rivet.dev/oss-friends +https://rivet.dev/pricing +https://rivet.dev/privacy +https://rivet.dev/rivet-vs-cloudflare-workers +https://rivet.dev/rss/feed.xml +https://rivet.dev/sales +https://rivet.dev/support +https://rivet.dev/talk-to-an-engineer +https://rivet.dev/terms \ No newline at end of file diff --git a/site/public/rivet.schema.json b/site/public/rivet.schema.json index 399d3ba90a..b53e4e067c 100644 --- a/site/public/rivet.schema.json +++ b/site/public/rivet.schema.json @@ -467,7 +467,7 @@ "CloudVersionMatchmakerNetworkMode": { "type": "string", "enum": ["bridge", "host"], - "description": "Configures how the container's network is isolated from the host.\n`bridge` (default) networking isolates the container's network from the host & other containers.\n`host` networking removes isolation between the container and the host. Only available in Rivet Open Source & Enterprise.\nRead more about bridge vs host networking [here](https://rivet.gg/docs/dynamic-servers/concepts/host-bridge-networking)." + "description": "Configures how the container's network is isolated from the host.\n`bridge` (default) networking isolates the container's network from the host & other containers.\n`host` networking removes isolation between the container and the host. Only available in Rivet Open Source & Enterprise.\nRead more about bridge vs host networking [here](https://rivet.dev/docs/dynamic-servers/concepts/host-bridge-networking)." }, "CloudVersionMatchmakerGameModeRuntimeDockerPort": { "type": "object", @@ -610,7 +610,7 @@ }, "CloudVersionMatchmakerPortRange": { "type": "object", - "description": "Range of ports that can be connected to.\nIf configured, `network_mode` must equal `host`.\nPort ranges may overlap between containers, it is the responsibility of the developer to ensure ports are available before using.\nRead more about host networking [here](https://rivet.gg/docs/dynamic-servers/concepts/host-bridge-networking).\nOnly available on Rivet Open Source & Enterprise.\n\n### Related\n\n- cloud.version.matchmaker.PortProtocol\n- cloud.version.matchmaker.ProxyKind", + "description": "Range of ports that can be connected to.\nIf configured, `network_mode` must equal `host`.\nPort ranges may overlap between containers, it is the responsibility of the developer to ensure ports are available before using.\nRead more about host networking [here](https://rivet.dev/docs/dynamic-servers/concepts/host-bridge-networking).\nOnly available on Rivet Open Source & Enterprise.\n\n### Related\n\n- cloud.version.matchmaker.PortProtocol\n- cloud.version.matchmaker.ProxyKind", "properties": { "min": { "type": "integer", @@ -631,7 +631,7 @@ "CloudVersionMatchmakerProxyKind": { "type": "string", "enum": ["none", "game_guard"], - "description": "Range of ports that can be connected to.\n`game_guard` (default) proxies all traffic through [Game Guard](https://rivet.gg/docs/dynamic-servers/concepts/game-guard) to mitigate DDoS attacks and provide TLS termination.\n`none` sends traffic directly to the game server. If configured, `network_mode` must equal `host`. Read more about host networking [here](https://rivet.gg/docs/dynamic-servers/concepts/host-bridge-networking). Only available on Rivet Open Source & Enterprise.\n\n### Related - /docs/dynamic-servers/concepts/game-guard - cloud.version.matchmaker.PortProtocol" + "description": "Range of ports that can be connected to.\n`game_guard` (default) proxies all traffic through [Game Guard](https://rivet.dev/docs/dynamic-servers/concepts/game-guard) to mitigate DDoS attacks and provide TLS termination.\n`none` sends traffic directly to the game server. If configured, `network_mode` must equal `host`. Read more about host networking [here](https://rivet.dev/docs/dynamic-servers/concepts/host-bridge-networking). Only available on Rivet Open Source & Enterprise.\n\n### Related - /docs/dynamic-servers/concepts/game-guard - cloud.version.matchmaker.PortProtocol" }, "CloudVersionMatchmakerLobbyGroupIdleLobbiesConfig": { "type": "object", diff --git a/site/scripts/checkBrokenLinks.sh b/site/scripts/checkBrokenLinks.sh index b41b0c04c2..8c3fcd94ad 100755 --- a/site/scripts/checkBrokenLinks.sh +++ b/site/scripts/checkBrokenLinks.sh @@ -4,6 +4,6 @@ set -euf -o pipefail URL=https://site-ckd.pages.dev/ # docker run --init -it -v `pwd`:/input lycheeverse/lychee --config /input/lychee.toml --base /input/src/pages '/input/src/pages/**/*.mdx' -# muffet --verbose --max-connections=16 --exclude='(hub.rivet.gg|tanks.rivet.game|discord.gg|twitter.com|github.com|cdn-cgi)' https://staging.rivet.gg +# muffet --verbose --max-connections=16 --exclude='(dashboard.rivet.dev|tanks.rivet.game|discord.gg|twitter.com|github.com|cdn-cgi)' https://staging.rivet.dev npx linkinator --config linkinator.config.json "$URL" > /tmp/linkinator.json cat /tmp/linkinator.json | jq '.links[] | select(.status != 200)' diff --git a/site/scripts/generateMarkdownAndLlms.ts b/site/scripts/generateMarkdownAndLlms.ts index 1b6208c58d..318ecb0d68 100644 --- a/site/scripts/generateMarkdownAndLlms.ts +++ b/site/scripts/generateMarkdownAndLlms.ts @@ -221,7 +221,7 @@ async function setupTypesenseCollection(client: Typesense.Client, collectionName async function indexDocumentsToTypesense(client: Typesense.Client, collectionName: string, pages: DocsPage[]) { if (!client) return; - const siteUrl = "https://rivet.gg"; + const siteUrl = "https://rivet.dev"; const documents = pages.map((page, index) => ({ id: `doc_${index}`, title: page.title, @@ -288,7 +288,7 @@ async function generateMarkdownAndLlms() { const guides = await getAllGuides(); // Generate llms.txt (URL index version) - const siteUrl = "https://rivet.gg"; + const siteUrl = "https://rivet.dev"; const docsUrls = pages .map((page) => `${siteUrl}/docs/${page.cleanPath}`) .filter((url) => !url.includes('/docs/cloud')); diff --git a/site/scripts/generateReadme.mjs b/site/scripts/generateReadme.mjs index 9b1211ddec..45e6149a5f 100755 --- a/site/scripts/generateReadme.mjs +++ b/site/scripts/generateReadme.mjs @@ -11,8 +11,8 @@ const RIVETKIT_TEMPLATE_PATH = join(process.cwd(), '..', 'README.rivetkit.tpl.md const RIVET_QUICKSTART = `Get started with Rivet by following a quickstart guide: -- [Node.js & Bun](https://www.rivet.gg/docs/actors/quickstart/backend/) -- [React](https://www.rivet.gg/docs/actors/quickstart/react/) +- [Node.js & Bun](https://www.rivet.dev/docs/actors/quickstart/backend/) +- [React](https://www.rivet.dev/docs/actors/quickstart/react/) ` // Content chunks @@ -49,23 +49,23 @@ const RIVET_COMMUNITY_CONTENT = `## Community & Support Join thousands of developers building with Rivet Actors today: -- [Discord](https://rivet.gg/discord) - Chat with the community +- [Discord](https://rivet.dev/discord) - Chat with the community - [X/Twitter](https://x.com/rivet_dev) - Follow for updates -- [Bluesky](https://bsky.app/profile/rivet.gg) - Follow for updates +- [Bluesky](https://bsky.app/profile/rivet.dev) - Follow for updates - [GitHub Discussions](https://github.com/rivet-dev/rivetkit/discussions) - Ask questions and share ideas - [GitHub Issues](https://github.com/rivet-dev/rivetkit/issues) - Report bugs and request features -- [Talk to an engineer](https://rivet.gg/talk-to-an-engineer) - Discuss your technical needs, current stack, and how Rivet can help with your infrastructure challenges`; +- [Talk to an engineer](https://rivet.dev/talk-to-an-engineer) - Discuss your technical needs, current stack, and how Rivet can help with your infrastructure challenges`; const RIVETKIT_COMMUNITY_CONTENT = `## Community & Support Join thousands of developers building with RivetKit today: -- [Discord](https://rivet.gg/discord) - Chat with the community +- [Discord](https://rivet.dev/discord) - Chat with the community - [X/Twitter](https://x.com/rivet_dev) - Follow for updates -- [Bluesky](https://bsky.app/profile/rivet.gg) - Follow for updates +- [Bluesky](https://bsky.app/profile/rivet.dev) - Follow for updates - [GitHub Discussions](https://github.com/rivet-dev/rivetkit/discussions) - Ask questions and share ideas - [GitHub Issues](https://github.com/rivet-dev/rivetkit/issues) - Report bugs and request features -- [Talk to an engineer](https://rivet.gg/talk-to-an-engineer) - Discuss your technical needs, current stack, and how Rivet can help with your infrastructure challenges`; +- [Talk to an engineer](https://rivet.dev/talk-to-an-engineer) - Discuss your technical needs, current stack, and how Rivet can help with your infrastructure challenges`; const LICENSE_CONTENT = `## License diff --git a/site/src/app/(v2)/(content)/docs/page.tsx b/site/src/app/(v2)/(content)/docs/page.tsx deleted file mode 100644 index ea336b7342..0000000000 --- a/site/src/app/(v2)/(content)/docs/page.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { redirect } from "next/navigation"; - -export default function DocsPage() { - redirect("/docs/actors"); -} diff --git a/site/src/app/(v2)/(content)/docs/tools/[tool]/page.tsx b/site/src/app/(v2)/(content)/docs/tools/[tool]/page.tsx new file mode 100644 index 0000000000..3eabc15bcb --- /dev/null +++ b/site/src/app/(v2)/(content)/docs/tools/[tool]/page.tsx @@ -0,0 +1,16 @@ +import { redirect } from "next/navigation"; + +interface PageProps { + params: { + tool: string; + }; +} + +export default function Page({ params }: PageProps) { + // HACK: This page allows us to put tools in the sidebar but redirect to a different page. We can't use `href` since that will change which sidebar/tab is active when on the tool's page. + redirect(`/docs/${params.tool}`); +} + +export function generateStaticParams() { + return [{ tool: "actors" }]; +} diff --git a/site/src/app/(v2)/(content)/privacy/page.mdx b/site/src/app/(v2)/(content)/privacy/page.mdx index 59ca6b6cf0..f1af197010 100644 --- a/site/src/app/(v2)/(content)/privacy/page.mdx +++ b/site/src/app/(v2)/(content)/privacy/page.mdx @@ -36,7 +36,7 @@ For the purposes of this Privacy Policy: - **Service Provider** means any natural or legal person who processes the data on behalf of the Company. It refers to third-party companies or individuals employed by the Company to facilitate the Service, to provide the Service on behalf of the Company, to perform services related to the Service or to assist the Company in analyzing how the Service is used. For the purpose of the GDPR, Service Providers are considered Data Processors. - **Third-party Social Media Service** refers to any website or any social network website through which a User can log in or create an account to use the Service. - **Usage Data** refers to data collected automatically, either generated by the use of the Service or from the Service infrastructure itself (for example, the duration of a page visit). -- **Website** refers to Rivet, accessible from{' '} [**https://rivet.gg/**](https://rivet.gg/) +- **Website** refers to Rivet, accessible from{' '} [**https://rivet.dev/**](https://rivet.dev/) - **You** means the individual accessing or using the Service, or the company, or other legal entity on behalf of which such individual is accessing or using the Service, as applicable. - Under GDPR (General Data Protection Regulation), You can be referred to as the Data Subject or as the User as you are the individual using the Service. @@ -407,7 +407,7 @@ The CCPA provides California residents with specific rights regarding their pers In order to exercise any of Your rights under the CCPA, and if You are a California resident, You can contact Us: -- By visiting this page on our website:{' '} [**https://rivet.gg/support/**](https://rivet.gg/support/) . +- By visiting this page on our website:{' '} [**https://rivet.dev/support/**](https://rivet.dev/support/) . Only You, or a person registered with the California Secretary of State that You authorize to act on Your behalf, may make a verifiable request related to Your personal information. @@ -496,6 +496,6 @@ You are advised to review this Privacy Policy periodically for any changes. Chan # Contact Us -If you have any questions about this Privacy Policy, You can contact us by visiting this page on our website:{' '} [**https://rivet.gg/support/**](https://rivet.gg/support/) . +If you have any questions about this Privacy Policy, You can contact us by visiting this page on our website:{' '} [**https://rivet.dev/support/**](https://rivet.dev/support/) . ## ‍ diff --git a/site/src/app/(v2)/(content)/terms/page.mdx b/site/src/app/(v2)/(content)/terms/page.mdx index 06ac958e28..1fecb7644f 100644 --- a/site/src/app/(v2)/(content)/terms/page.mdx +++ b/site/src/app/(v2)/(content)/terms/page.mdx @@ -238,7 +238,7 @@ You may specify End Users through the Developer Group Console. Group Members may ## Securing your Content -You are responsible to provide proper security and maintenance of your content that is using the Company's Services; including but not limited to spamming, phishing,{' '} [**The Acceptable Use Policy**](https://rivet.gg/acceptable-use) , "DoS"; which may increase the cost for using the Company's Services, which your are responsible to pay. +You are responsible to provide proper security and maintenance of your content that is using the Company's Services; including but not limited to spamming, phishing,{' '} [**The Acceptable Use Policy**](https://rivet.dev/acceptable-use) , "DoS"; which may increase the cost for using the Company's Services, which your are responsible to pay. # Copyright Policy @@ -246,7 +246,7 @@ You are responsible to provide proper security and maintenance of your content t We respect the intellectual property rights of others. It is Our policy to respond to any claim that Content posted on the Service infringes a copyright or other intellectual property infringement of any person. -If You are a copyright owner, or authorized on behalf of one, and You believe that the copyrighted work has been copied in a way that constitutes copyright infringement that is taking place through the Service, You must submit Your notice in writing to the attention of our copyright agent via email at{' '} [**dmca@rivet.gg**](mailto:dmca@rivet.gg) {' '} and include in Your notice a detailed description of the alleged infringement. +If You are a copyright owner, or authorized on behalf of one, and You believe that the copyrighted work has been copied in a way that constitutes copyright infringement that is taking place through the Service, You must submit Your notice in writing to the attention of our copyright agent via email at{' '} [**dmca@rivet.dev**](mailto:dmca@rivet.dev) {' '} and include in Your notice a detailed description of the alleged infringement. You may be held accountable for damages (including costs and attorneys' fees) for misrepresenting that any Content is infringing Your copyright. @@ -261,7 +261,7 @@ You may submit a notification pursuant to the Digital Millennium Copyright Act ( - A statement by You that You have a good faith belief that the disputed use is not authorized by the copyright owner, its agent, or the law. - A statement by You, made under penalty of perjury, that the above information in Your notice is accurate and that You are the copyright owner or authorized to act on the copyright owner's behalf. -You can contact our copyright agent via email at{' '} [**legal@rivet.gg**](mailto:legal@rivet.gg) {' '} Upon receipt of a notification, the Company will take whatever action, in its sole discretion, it deems appropriate, including removal of the challenged content from the Service. +You can contact our copyright agent via email at{' '} [**legal@rivet.dev**](mailto:legal@rivet.dev) {' '} Upon receipt of a notification, the Company will take whatever action, in its sole discretion, it deems appropriate, including removal of the challenged content from the Service. # Intellectual Property @@ -347,4 +347,4 @@ By continuing to access or use Our Service after those revisions become effectiv # Contact Us -If you have any questions about these Terms and Conditions, You can contact us by visiting this page on our website:{' '} [**https://rivet.gg/support/**](https://rivet.gg/support/) +If you have any questions about these Terms and Conditions, You can contact us by visiting this page on our website:{' '} [**https://rivet.dev/support/**](https://rivet.dev/support/) diff --git a/site/src/app/(v2)/(marketing)/(index)/components/PlatformIcons.tsx b/site/src/app/(v2)/(marketing)/(index)/components/PlatformIcons.tsx index 48ef1afab4..c6819992ae 100644 --- a/site/src/app/(v2)/(marketing)/(index)/components/PlatformIcons.tsx +++ b/site/src/app/(v2)/(marketing)/(index)/components/PlatformIcons.tsx @@ -7,6 +7,7 @@ import cloudflareWorkersLogo from "../images/platforms/cloudflare-workers.svg"; import nodejsLogo from "../images/platforms/nodejs.svg"; import bunLogo from "../images/platforms/bun.svg"; import redisLogo from "../images/platforms/redis.svg"; +import postgresLogo from "../images/platforms/postgres.svg"; import fileSystemLogo from "../images/platforms/file-system.svg"; import memoryLogo from "../images/platforms/memory.svg"; @@ -14,6 +15,7 @@ import memoryLogo from "../images/platforms/memory.svg"; import typescriptLogo from "../images/clients/typescript.svg"; import rustLogo from "../images/clients/rust.svg"; import reactLogo from "../images/clients/react.svg"; +import nextjsLogo from "../images/clients/nextjs.svg"; // Integration images import honoLogo from "../images/integrations/hono.svg"; @@ -44,17 +46,17 @@ export function PlatformIcons() { tooltip: "Bun", }, { - href: "/docs/cloud", - src: redisLogo, - alt: "Redis", - tooltip: "Redis", - }, - { - href: "/docs/cloud", + href: "/docs/actors/quickstart/cloudflare-workers", src: cloudflareWorkersLogo, alt: "Cloudflare Durable Objects", tooltip: "Cloudflare Durable Objects", }, + { + href: "/docs/cloud", + src: postgresLogo, + alt: "Postgres", + tooltip: "Postgres", + }, //{ // href: "/docs/cloud", // src: fileSystemLogo, @@ -74,11 +76,17 @@ export function PlatformIcons() { // tooltip: "TypeScript" //}, { - href: "/docs/clients/react", + href: "/docs/actors/quickstart/react", src: reactLogo, alt: "React", tooltip: "React", }, + { + href: "/docs/actors/quickstart/next-js", + src: nextjsLogo, + alt: "Next.js", + tooltip: "Next.js", + }, { href: "/docs/clients/rust", src: rustLogo, diff --git a/site/src/app/(v2)/(marketing)/(index)/components/code-snippets/utils.ts b/site/src/app/(v2)/(marketing)/(index)/components/code-snippets/utils.ts index 497af77939..291abefa95 100644 --- a/site/src/app/(v2)/(marketing)/(index)/components/code-snippets/utils.ts +++ b/site/src/app/(v2)/(marketing)/(index)/components/code-snippets/utils.ts @@ -36,7 +36,7 @@ export const EXAMPLE_ICON_MAP: Record = { export const createExampleActions = (exampleId: string, exampleFiles?: Record) => { const handleOpenGithub = () => { window.open( - `https://github.com/rivet-gg/rivetkit/tree/main/examples/${exampleId}`, + `https://github.com/rivet-dev/rivetkit/tree/main/examples/${exampleId}`, "_blank", ); }; diff --git a/site/src/app/(v2)/(marketing)/(index)/images/clients/svelte.svg b/site/src/app/(v2)/(marketing)/(index)/images/clients/svelte.svg new file mode 100644 index 0000000000..c89bfb105e --- /dev/null +++ b/site/src/app/(v2)/(marketing)/(index)/images/clients/svelte.svg @@ -0,0 +1 @@ +Svelte diff --git a/site/src/app/(v2)/(marketing)/(index)/images/platforms/aws-ecs.svg b/site/src/app/(v2)/(marketing)/(index)/images/platforms/aws-ecs.svg new file mode 100644 index 0000000000..f8207f2752 --- /dev/null +++ b/site/src/app/(v2)/(marketing)/(index)/images/platforms/aws-ecs.svg @@ -0,0 +1 @@ +Amazon-logos \ No newline at end of file diff --git a/site/src/app/(v2)/(marketing)/(index)/images/platforms/deno.svg b/site/src/app/(v2)/(marketing)/(index)/images/platforms/deno.svg new file mode 100644 index 0000000000..1141eb356b --- /dev/null +++ b/site/src/app/(v2)/(marketing)/(index)/images/platforms/deno.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/site/src/app/(v2)/(marketing)/(index)/images/platforms/freestyle.svg b/site/src/app/(v2)/(marketing)/(index)/images/platforms/freestyle.svg new file mode 100644 index 0000000000..51266dc024 --- /dev/null +++ b/site/src/app/(v2)/(marketing)/(index)/images/platforms/freestyle.svg @@ -0,0 +1 @@ + diff --git a/site/src/app/(v2)/(marketing)/(index)/images/platforms/gcp-cloud-run.svg b/site/src/app/(v2)/(marketing)/(index)/images/platforms/gcp-cloud-run.svg new file mode 100644 index 0000000000..0429220013 --- /dev/null +++ b/site/src/app/(v2)/(marketing)/(index)/images/platforms/gcp-cloud-run.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/site/src/app/(v2)/(marketing)/(index)/images/platforms/hetzner.svg b/site/src/app/(v2)/(marketing)/(index)/images/platforms/hetzner.svg new file mode 100644 index 0000000000..f5812ee247 --- /dev/null +++ b/site/src/app/(v2)/(marketing)/(index)/images/platforms/hetzner.svg @@ -0,0 +1 @@ +Element 1 \ No newline at end of file diff --git a/site/src/app/(v2)/(marketing)/(index)/images/platforms/kubernetes.svg b/site/src/app/(v2)/(marketing)/(index)/images/platforms/kubernetes.svg new file mode 100644 index 0000000000..b8c34b4191 --- /dev/null +++ b/site/src/app/(v2)/(marketing)/(index)/images/platforms/kubernetes.svg @@ -0,0 +1 @@ +Kubernetes logo \ No newline at end of file diff --git a/site/src/app/(v2)/(marketing)/(index)/images/platforms/vm-bare-metal.svg b/site/src/app/(v2)/(marketing)/(index)/images/platforms/vm-bare-metal.svg new file mode 100644 index 0000000000..638d59b517 --- /dev/null +++ b/site/src/app/(v2)/(marketing)/(index)/images/platforms/vm-bare-metal.svg @@ -0,0 +1 @@ + diff --git a/site/src/app/(v2)/(marketing)/(index)/sections/CommunitySection.tsx b/site/src/app/(v2)/(marketing)/(index)/sections/CommunitySection.tsx index 549961ef6b..275357d9bd 100644 --- a/site/src/app/(v2)/(marketing)/(index)/sections/CommunitySection.tsx +++ b/site/src/app/(v2)/(marketing)/(index)/sections/CommunitySection.tsx @@ -10,7 +10,7 @@ import Link from "next/link"; export function CommunitySection() { const communityLinks = [ { - href: "https://rivet.gg/discord", + href: "https://rivet.dev/discord", icon: faDiscord, label: "Discord", }, @@ -20,7 +20,7 @@ export function CommunitySection() { label: "X", }, { - href: "https://bsky.app/profile/rivet.gg", + href: "https://bsky.app/profile/rivet.dev", icon: faBluesky, label: "Bluesky", }, diff --git a/site/src/app/(v2)/(marketing)/(index)/sections/StudioSection.tsx b/site/src/app/(v2)/(marketing)/(index)/sections/StudioSection.tsx index a79415aeb0..3a94b71d4c 100644 --- a/site/src/app/(v2)/(marketing)/(index)/sections/StudioSection.tsx +++ b/site/src/app/(v2)/(marketing)/(index)/sections/StudioSection.tsx @@ -99,7 +99,7 @@ export function StudioSection() { {/* Visit the Studio link */}
@@ -135,9 +145,9 @@ function TechSectionText({ }: TechSectionTextProps) { const linkProps = linkExternal ? { - target: "_blank", - rel: "noopener noreferrer", - } + target: "_blank", + rel: "noopener noreferrer", + } : {}; return ( @@ -186,6 +196,34 @@ export function TechSection() { /> + + + + + + + - {/**/} + /> + - - - + + @@ -274,7 +325,7 @@ export function TechSection() { heading="Works With Your Tools" description="Seamlessly integrate Rivet with your favorite frameworks, languages, and tools." linkText="Request an integration" - linkHref="https://github.com/rivet-gg/rivetkit/issues/new" + linkHref="https://github.com/rivet-dev/rivetkit/issues/new" linkExternal /> @@ -311,11 +362,17 @@ export function TechSection() { alt="Next.js" /> + @@ -367,46 +424,41 @@ export function TechSection() { diff --git a/site/src/app/(v2)/(marketing)/cloud/CommunitySection.tsx b/site/src/app/(v2)/(marketing)/cloud/CommunitySection.tsx index 6235a2bb61..36408866e9 100644 --- a/site/src/app/(v2)/(marketing)/cloud/CommunitySection.tsx +++ b/site/src/app/(v2)/(marketing)/cloud/CommunitySection.tsx @@ -26,7 +26,7 @@ export const CommunitySection = () => { { name: "Bluesky", icon: faBluesky, - href: "https://bsky.app/profile/rivet.gg", + href: "https://bsky.app/profile/rivet.dev", }, ]; diff --git a/site/src/app/(v2)/(marketing)/cloud/PowerfulPrimitivesSection.tsx b/site/src/app/(v2)/(marketing)/cloud/PowerfulPrimitivesSection.tsx index 69f794a935..8c3be8f7c8 100644 --- a/site/src/app/(v2)/(marketing)/cloud/PowerfulPrimitivesSection.tsx +++ b/site/src/app/(v2)/(marketing)/cloud/PowerfulPrimitivesSection.tsx @@ -140,7 +140,7 @@ const TAB_GROUPS: TabGroup[] = [ functions: true, guide: "/blog/2025-05-28-building-linear-agents-in-node-js-and-rivet-full-walkthrough-and-starter-kit", sourceCode: - "https://github.com/rivet-gg/rivet/tree/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter", + "https://github.com/rivet-dev/rivet/tree/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter", }, }, { diff --git a/site/src/app/(v2)/(marketing)/cloud/RivetCloudSection.tsx b/site/src/app/(v2)/(marketing)/cloud/RivetCloudSection.tsx index c457610ccd..4695357457 100644 --- a/site/src/app/(v2)/(marketing)/cloud/RivetCloudSection.tsx +++ b/site/src/app/(v2)/(marketing)/cloud/RivetCloudSection.tsx @@ -42,7 +42,7 @@ export const RivetCloudSection = () => { description: "Run the open-source Rivet Engine on your own infrastructure with PostgreSQL or FoundationDB. Complete control over your actor orchestration platform.", buttonText: "View on GitHub", - buttonHref: "https://github.com/rivet-gg/rivet", + buttonHref: "https://github.com/rivet-dev/rivet", }, ]; diff --git a/site/src/app/(v2)/(marketing)/pricing/PricingPageClient.tsx b/site/src/app/(v2)/(marketing)/pricing/PricingPageClient.tsx index 8f8622ebf9..1c38c95e5d 100644 --- a/site/src/app/(v2)/(marketing)/pricing/PricingPageClient.tsx +++ b/site/src/app/(v2)/(marketing)/pricing/PricingPageClient.tsx @@ -10,7 +10,7 @@ const tiers = [ { name: "Free", priceMonthly: "$0", - href: "https://hub.rivet.gg/", + href: "https://dashboard.rivet.dev/", highlights: [ { description: "5GB Limit", icon: "check" }, { description: "5 Million Writes /mo Limit", icon: "check" }, @@ -22,7 +22,7 @@ const tiers = [ { name: "Hobby", priceMonthly: "$5", - href: "https://hub.rivet.gg/", + href: "https://dashboard.rivet.dev/", highlights: [ { description: "25 Billion Reads /mo included", icon: "gift" }, { description: "50 Million Writes /mo included", icon: "gift" }, @@ -34,7 +34,7 @@ const tiers = [ { name: "Team", priceMonthly: "$200", - href: "https://hub.rivet.gg/", + href: "https://dashboard.rivet.dev/", highlights: [ { description: "25 Billion Reads /mo included", icon: "gift" }, { description: "50 Million Writes /mo included", icon: "gift" }, @@ -244,7 +244,7 @@ function PricingTable() { "string" ? ( feature.name === "Regions" ? ( {/* Docs Tile */} - rivet.gg/docs + rivet.dev/docs
diff --git a/site/src/app/(v2)/(marketing)/talk-to-an-engineer/page.tsx b/site/src/app/(v2)/(marketing)/talk-to-an-engineer/page.tsx index 8378622c79..679697c589 100644 --- a/site/src/app/(v2)/(marketing)/talk-to-an-engineer/page.tsx +++ b/site/src/app/(v2)/(marketing)/talk-to-an-engineer/page.tsx @@ -6,7 +6,7 @@ export const metadata: Metadata = { description: "Connect with a Rivet engineer to discuss your technical needs, current stack, and how we can help with your infrastructure challenges", alternates: { - canonical: "https://www.rivet.gg/talk-to-an-engineer/", + canonical: "https://www.rivet.dev/talk-to-an-engineer/", }, }; diff --git a/site/src/app/(v2)/[section]/[[...page]]/page.tsx b/site/src/app/(v2)/[section]/[[...page]]/page.tsx index ff7a65ace4..596f9062b6 100644 --- a/site/src/app/(v2)/[section]/[[...page]]/page.tsx +++ b/site/src/app/(v2)/[section]/[[...page]]/page.tsx @@ -74,7 +74,7 @@ export async function generateMetadata({ } = await loadContent(path); const fullPath = buildFullPath(path); - const canonicalUrl = `https://www.rivet.gg${fullPath}/`; + const canonicalUrl = `https://www.rivet.dev${fullPath}/`; return { title: `${title} - Rivet`, @@ -143,7 +143,7 @@ export default async function CatchAllCorePage({ params: { section, page } }) { startIcon={} > diff --git a/site/src/app/layout.tsx b/site/src/app/layout.tsx index 4fae5e8842..7239052087 100644 --- a/site/src/app/layout.tsx +++ b/site/src/app/layout.tsx @@ -23,11 +23,11 @@ export const metadata: Metadata = { openGraph: { type: "website", locale: "en_US", - url: "https://www.rivet.gg", + url: "https://www.rivet.dev", siteName: "Rivet", images: [ { - url: "https://www.rivet.gg/promo/og.png", + url: "https://www.rivet.dev/promo/og.png", width: 1200, height: 630, alt: "Rivet", diff --git a/site/src/components/Card.tsx b/site/src/components/Card.tsx index 37e7567d7d..9a48db64f1 100644 --- a/site/src/components/Card.tsx +++ b/site/src/components/Card.tsx @@ -18,17 +18,25 @@ export function Card({ href, target, }: CardProps) { + const hasHeader = Boolean(title || icon || href); + const hasBody = Boolean(children); + const content = (
- {(title || icon || href) && ( -
-
+ {hasHeader && ( +
+
{icon && } {title &&

{title}

} @@ -42,15 +50,17 @@ export function Card({
)} -
- {children} -
+ {hasBody && ( +
+ {children} +
+ )}
); if (href) { return ( - + {content} ); diff --git a/site/src/components/Earth.jsx b/site/src/components/Earth.jsx index 18a1089ec2..1e9024114d 100644 --- a/site/src/components/Earth.jsx +++ b/site/src/components/Earth.jsx @@ -22,7 +22,7 @@ export default function Earth(props) { )} > diff --git a/site/src/components/Feedback.jsx b/site/src/components/Feedback.jsx index ad3931eddd..87a9c660ca 100644 --- a/site/src/components/Feedback.jsx +++ b/site/src/components/Feedback.jsx @@ -66,7 +66,7 @@ export function Feedback() { function EditButton() { const router = useRouter(); - const href = `https://github.com/rivet-gg/site/edit/main/src/pages${router.pathname}.mdx`; + const href = `https://github.com/rivet-dev/site/edit/main/src/pages${router.pathname}.mdx`; return (
@@ -60,7 +60,7 @@ export const HeaderPopupProductMenu = () => { className="col-start-3 h-full justify-start" startIcon={} > - + Rivet Cloud diff --git a/site/src/components/LevelUpSection.jsx b/site/src/components/LevelUpSection.jsx index 1585af320c..e4c0c647ee 100644 --- a/site/src/components/LevelUpSection.jsx +++ b/site/src/components/LevelUpSection.jsx @@ -29,7 +29,7 @@ export default function LevelUpSection() {
diff --git a/site/src/components/Providers.jsx b/site/src/components/Providers.jsx index 5dde276771..7440bb6083 100644 --- a/site/src/components/Providers.jsx +++ b/site/src/components/Providers.jsx @@ -8,7 +8,7 @@ import { Suspense, useEffect } from "react"; // Check that PostHog is client-side if (typeof window !== "undefined") { posthog.init("phc_6kfTNEAVw7rn1LA51cO3D69FefbKupSWFaM7OUgEpEo", { - api_host: "https://ph.rivet.gg", + api_host: "https://ph.rivet.dev", // Enable debug mode in development loaded: (posthog) => { if (process.env.NODE_ENV === "development") posthog.debug(); diff --git a/site/src/components/docs/Hosting.tsx b/site/src/components/docs/Hosting.tsx index 028891a541..a036a09cb1 100644 --- a/site/src/components/docs/Hosting.tsx +++ b/site/src/components/docs/Hosting.tsx @@ -1,39 +1,28 @@ -import { CardGroup, Card } from '@/components/Card' +import { CardGroup, Card } from "@/components/Card"; +import { deployOptions } from "@/data/deploy-options"; export function Hosting() { + const hostingProviders = deployOptions; + return ( <> -

By default, Rivet stores actor state on the local file system. To scale Rivet in production, follow a guide to deploy to a hosting provider or integrate a driver:

+

+ By default, Rivet stores actor state on the local file system. +

-

Hosting Providers

- - - Deploy Rivet applications with Railway's platform-as-a-service - - - Run Rivet actors on Cloudflare's edge computing platform - - - Managed Rivet hosting with enterprise features and support - - +

+ To scale Rivet in production, follow a guide to deploy to your + hosting provider of choice: +

-

Drivers

+

+ Hosting Providers +

- - High-performance in-memory data store for production workloads - - - Simple file-based storage for development and small deployments - - - In-memory storage for testing and ephemeral use cases - - - Create custom storage drivers for your specific requirements - + {hostingProviders.map(({ title, href }) => ( + + ))} - ) + ); } - diff --git a/site/src/components/v2/Code.tsx b/site/src/components/v2/Code.tsx index 81a4d268c0..3b6eedc720 100644 --- a/site/src/components/v2/Code.tsx +++ b/site/src/components/v2/Code.tsx @@ -11,7 +11,12 @@ import { } from "@rivet-gg/components"; import { faCopy, faFile, Icon } from "@rivet-gg/icons"; import escapeHTML from "escape-html"; -import { Children, cloneElement, type ReactElement } from "react"; +import { + Children, + cloneElement, + isValidElement, + type ReactElement, +} from "react"; import { AutofillCodeBlock } from "@/components/v2/AutofillCodeBlock"; import { AutofillFooter } from "@/components/v2/AutofillFooter"; import { CopyCodeTrigger } from "@/components/v2/CopyCodeButton"; @@ -30,6 +35,8 @@ const languageNames = { yaml: "YAML", gdscript: "GDScript", powershell: "Command Line", + dockerfile: "Dockerfile", + ini: "Configuration", ps1: "Command Line", docker: "Docker", http: "HTTP", @@ -48,32 +55,47 @@ const getChildIdx = (child: ReactElement) => child.props?.file || child.props?.title || child.props?.language || "code"; export function CodeGroup({ children, className }: CodeGroupProps) { + const tabChildren = Children.toArray(children).filter( + (child): child is ReactElement => isValidElement(child), + ); + + if (tabChildren.length === 0) { + return null; + } + return (
- - div]:!table" }} - > - - {Children.map(children, (child) => { - const idx = getChildIdx(child); - return ( - - {child.props.title || - languageNames[child.props.language] || - "Code"} - - ); - })} - - - {Children.map(children, (child) => { + +
+ div]:!table" }} + > + + {tabChildren.map((child) => { + const idx = getChildIdx(child); + return ( + + {child.props.title || + languageNames[child.props.language] || + "Code"} + + ); + })} + + +
+ {tabChildren.map((child) => { const idx = getChildIdx(child); return ( diff --git a/site/src/components/v2/GitHubDropdown.tsx b/site/src/components/v2/GitHubDropdown.tsx index 297c8ac16c..000ae75928 100644 --- a/site/src/components/v2/GitHubDropdown.tsx +++ b/site/src/components/v2/GitHubDropdown.tsx @@ -107,7 +107,7 @@ export function GitHubDropdown({ className, ...props }: GitHubDropdownProps) { >
- + Sign In @@ -264,10 +256,10 @@ export function Header({ Documentation - Cloud + Pricing { - window.open("https://releases.rivet.gg/press-kit.zip", "_blank"); + window.open("https://releases.rivet.dev/press-kit.zip", "_blank"); }; return ( diff --git a/site/src/components/v2/TemplateVariable.tsx b/site/src/components/v2/TemplateVariable.tsx index 58efa0e027..afe93fc81e 100644 --- a/site/src/components/v2/TemplateVariable.tsx +++ b/site/src/components/v2/TemplateVariable.tsx @@ -21,7 +21,7 @@ interface TemplateVariableProps { } const CLOUD_LOGIN_URL = - process.env.NEXT_PUBLIC_CLOUD_URL || "https://cloud.rivet.gg"; + process.env.NEXT_PUBLIC_CLOUD_URL || "https://dashboard.rivet.dev"; export function TemplateVariable({ variable, defaultValue }: TemplateVariableProps) { const [open, setOpen] = useState(false); diff --git a/site/src/content/docs/actors/fetch-and-websocket-handler.mdx b/site/src/content/docs/actors/fetch-and-websocket-handler.mdx index a7ab0eb4ba..aa79b16616 100644 --- a/site/src/content/docs/actors/fetch-and-websocket-handler.mdx +++ b/site/src/content/docs/actors/fetch-and-websocket-handler.mdx @@ -93,7 +93,7 @@ export const honoActor = actor({ -Also see the [raw fetch handler example project](https://github.com/rivet-gg/rivetkit/tree/main/examples/raw-fetch-handler). +Also see the [raw fetch handler example project](https://github.com/rivet-dev/rivetkit/tree/main/examples/raw-fetch-handler). `onFetch` can be used to expose Server-Sent Events from Rivet Actors. @@ -123,7 +123,7 @@ export const websocketActor = actor({ }); ``` -Also see the [raw WebSocket handler with proxy example project](https://github.com/rivet-gg/rivetkit/tree/main/examples/raw-websocket-handler-proxy). +Also see the [raw WebSocket handler with proxy example project](https://github.com/rivet-dev/rivetkit/tree/main/examples/raw-websocket-handler-proxy). Connection lifecycle hooks like `onConnect` and `onDisconnect` do not get called when opening WebSockets for `onWebSocket`. This is because `onWebSocket` provides a low-level connection. Use `ws.addEventListener("open")` and `ws.addEventListener("close")` instead. diff --git a/site/src/content/docs/actors/index.mdx b/site/src/content/docs/actors/index.mdx index 99cb18e52c..93556fb88f 100644 --- a/site/src/content/docs/actors/index.mdx +++ b/site/src/content/docs/actors/index.mdx @@ -1,4 +1,4 @@ -import { faNodeJs, faReact } from "@rivet-gg/icons"; +import { faCloudflare, faNodeJs, faReact, faSquareJs } from "@rivet-gg/icons"; # Overview @@ -13,47 +13,33 @@ Actors for long-lived processes with durable state, realtime, and hibernate when Build real-time React applications with actors + + Build server-rendered Next.js experiences backed by actors + + + Deploy actors on Cloudflare Workers with zero infrastructure + ## Features - **Long-Lived, Stateful Compute**: Each unit of compute is like a tiny server that remembers things between requests – no need to re-fetch data from a database or worry about timeouts. Like AWS Lambda, but with memory and no timeouts. - - **Blazing-Fast Reads & Writes**: State is stored on the same machine as your compute, so reads and writes are ultra-fast. No database round trips, no latency spikes. - -- **Realtime, Made Simple**: Update state and broadcast changes in realtime with WebSockets or SSE. No external pub/sub systems, no polling – just built-in low-latency events. - -- **Store Data Near Your Users**: Your state lives close to your users on the edge – not in a faraway data center – so every interaction feels instant. (Not all platforms supported.) - +- **Realtime**: Update state and broadcast changes in realtime with WebSockets or SSE. No external pub/sub systems, no polling – just built-in low-latency events. - **Infinitely Scalable**: Automatically scale from zero to millions of concurrent actors. Pay only for what you use with instant scaling and no cold starts. - - **Fault Tolerant**: Built-in error handling and recovery. Actors automatically restart on failure while preserving state integrity and continuing operations. -- **Type Safety**: End-to-end TypeScript safety between clients and actors with full type inference and compile-time checking. - ## Use Cases Actors are perfect for applications that need persistent state and real-time updates: -- **AI & Automation** - - **AI agents**: Stateful AI assistants with conversation history - - **AI sandbox orchestration**: Actors can orchestrate logic running inside of agents' sandboxes - - **Durable workflows**: Long-running business processes with state persistence and recovery - -- **Real-time Communication** - - **Chat rooms**: Real-time messaging with message history and user presence - - **Collaborative documents**: Multiple users editing documents simultaneously (Yjs integration) - - **Multiplayer games**: Game state management with real-time updates - - **Live events**: Broadcasting updates to many participants - -- **Data & Synchronization** - - **Local-first sync**: Offline-first applications with server synchronization - - **Multi-tenant databases**: Isolated data stores for each user or tenant - - **Scheduling**: Time-based task execution with persistent state - -- **Infrastructure** - - **Rate limiting**: Distributed rate limiting with persistent counters - - **Stream processing**: Real-time data processing with persistent state +- **AI agents**: Stateful AI assistants with conversation history +- **Collaborative documents**: Multiple users editing documents simultaneously (Yjs integration) +- **Local-first sync**: Offline-first applications with server synchronization +- **Per-tenant databases**: Isolated data stores for each user or tenant +- **Background job**: Background & time-based task execution with persistent state +- **Rate limiting**: Distributed rate limiting with persistent counters +- **Stream processing**: Real-time data processing with persistent state ## Core Concepts diff --git a/site/src/content/docs/actors/quickstart/backend.mdx b/site/src/content/docs/actors/quickstart/backend.mdx index abc1669dc1..119f53e537 100644 --- a/site/src/content/docs/actors/quickstart/backend.mdx +++ b/site/src/content/docs/actors/quickstart/backend.mdx @@ -45,12 +45,21 @@ Choose your preferred web framework: +```ts {{"title":"Standalone"}} +import { registry } from "./registry"; +import { Hono } from "hono"; +import { serve } from "@hono/node-server"; + +// Start Rivet +const { client } = registry.start(); +``` + ```ts {{"title":"Hono"}} import { registry } from "./registry"; import { Hono } from "hono"; import { serve } from "@hono/node-server"; -// Start Rivet with file system driver (for development) +// Start Rivet const { client } = registry.start(); // Setup Hono app @@ -67,7 +76,7 @@ app.post("/increment/:name", async (c) => { return c.json({ count: newCount }); }); -// Start server with Rivet +// Start server serve(app); ``` @@ -122,10 +131,6 @@ console.log("Server running at http://localhost:8080"); - -The `/registry` endpoint is automatically mounted by Rivet and is required for client communication. When using `serve()` with Hono, this is handled automatically. - - @@ -146,48 +151,13 @@ Your server is now running at `http://localhost:8080` - - -Test your counter actor using HTTP requests: - - - -```ts {{"title":"JavaScript"}} -// Increment counter -const response = await fetch("http://localhost:8080/increment/my-counter", { - method: "POST" -}); - -const result = await response.json(); -console.log("Count:", result.count); // 1 -``` - -```sh curl -# Increment counter -curl -X POST http://localhost:8080/increment/my-counter -``` - - - - - - - - - - - - - -## Configuration Options - -### Connect Frontend To The Rivet Actor + -Create a type-safe client to connect from your frontend: +This code can run either in your frontend or within your backend: - + ```ts {{"title":"client.ts"}} import { createClient } from "rivetkit/client"; @@ -298,3 +268,14 @@ See the [Rust client documentation](/clients/rust) for more information. + + + + + + + + + + + diff --git a/site/src/content/docs/actors/quickstart/cloudflare-workers.mdx b/site/src/content/docs/actors/quickstart/cloudflare-workers.mdx index 3ad614eee1..131386fbad 100644 --- a/site/src/content/docs/actors/quickstart/cloudflare-workers.mdx +++ b/site/src/content/docs/actors/quickstart/cloudflare-workers.mdx @@ -97,7 +97,7 @@ export { handler as default, ActorHandler }; -The `/registry` endpoint is automatically mounted by Rivet and is required for client communication. The Cloudflare Workers driver handles this automatically. +The `/rivet` endpoint is automatically mounted by Rivet and is required for client communication. The Cloudflare Workers driver handles this automatically. This can be configured with `managerPath`. diff --git a/site/src/content/docs/actors/quickstart/next-js.mdx b/site/src/content/docs/actors/quickstart/next-js.mdx index 7d0359cc3e..19c69fca29 100644 --- a/site/src/content/docs/actors/quickstart/next-js.mdx +++ b/site/src/content/docs/actors/quickstart/next-js.mdx @@ -116,7 +116,7 @@ export function Counter() { Make sure to import the `Counter` component in your page or layout. -For more examples how to connect to your actors using React, check the [RivetKit React documentation](http://rivet.gg/docs/clients/react/). +For more examples how to connect to your actors using React, check the [RivetKit React documentation](http://rivet.dev/docs/clients/react/). diff --git a/site/src/content/docs/actors/schedule.mdx b/site/src/content/docs/actors/schedule.mdx index d5181eae39..3169d49184 100644 --- a/site/src/content/docs/actors/schedule.mdx +++ b/site/src/content/docs/actors/schedule.mdx @@ -5,7 +5,7 @@ Scheduling is used to trigger events in the future. The actor scheduler is like Scheduling is supported on the Rivet Cloud, Cloudflare Workers, file system, and memory drivers. - Follow [this issue](https://github.com/rivet-gg/rivetkit/issues/1095) for Redis support. + Follow [this issue](https://github.com/rivet-dev/rivetkit/issues/1095) for Redis support. ## Use Cases diff --git a/site/src/content/docs/api/index.mdx b/site/src/content/docs/api/index.mdx new file mode 100644 index 0000000000..c44a2a07f9 --- /dev/null +++ b/site/src/content/docs/api/index.mdx @@ -0,0 +1,3 @@ +# API Reference + +This is where the technical API docs live. diff --git a/site/src/content/docs/clients/javascript.mdx b/site/src/content/docs/clients/javascript.mdx index ecf9b183b1..c8417dd43c 100644 --- a/site/src/content/docs/clients/javascript.mdx +++ b/site/src/content/docs/clients/javascript.mdx @@ -16,7 +16,7 @@ Install the RivetKit package: - Make sure you have a running Rivet actor server to connect to. You can follow the [Node.js & Bun Quickstart](https://rivet.gg/docs/actors/quickstart/backend/) to set up a simple actor server. + Make sure you have a running Rivet actor server to connect to. You can follow the [Node.js & Bun Quickstart](https://rivet.dev/docs/actors/quickstart/backend/) to set up a simple actor server. Create client and connect to actors and listen for real-time updates: @@ -53,4 +53,4 @@ main(); ## API Reference -Follows the same [API as the Node.js client](http://rivet.gg/docs/actors/clients/#actor-client), allowing you to use the same methods and properties for interacting with actors. \ No newline at end of file +Follows the same [API as the Node.js client](http://rivet.dev/docs/actors/clients/#actor-client), allowing you to use the same methods and properties for interacting with actors. \ No newline at end of file diff --git a/site/src/content/docs/clients/next-js.mdx b/site/src/content/docs/clients/next-js.mdx index f83f971921..1ca3ab6fbe 100644 --- a/site/src/content/docs/clients/next-js.mdx +++ b/site/src/content/docs/clients/next-js.mdx @@ -6,10 +6,10 @@ import { InstallPackage } from "@/components/docs/InstallPackage"; The Rivet Next.js client allows you to connect to and interact with actors in Next.js applications. - + Check out the complete example - + Use Next.js API routes to run RivetKit Registry @@ -29,7 +29,7 @@ Install the RivetKit React package: - Follow the [Next.js backend integration guide](https://rivet.gg/docs/integrations/next-js/) to set up your Next.js backend with Rivet. + Follow the [Next.js backend integration guide](https://rivet.dev/docs/integrations/next-js/) to set up your Next.js backend with Rivet. Create a RivetKit client to connect to your actor: @@ -91,4 +91,4 @@ export function Counter() { ## API Reference -It's the same as the [React client API reference](https://rivet.gg/docs/clients/react#api-reference), since the RivetKit React package is used in both Next.js and React applications. \ No newline at end of file +It's the same as the [React client API reference](https://rivet.dev/docs/clients/react#api-reference), since the RivetKit React package is used in both Next.js and React applications. \ No newline at end of file diff --git a/site/src/content/docs/clients/openapi.mdx b/site/src/content/docs/clients/openapi.mdx index 398ebc6ba1..b4a67c9d63 100644 --- a/site/src/content/docs/clients/openapi.mdx +++ b/site/src/content/docs/clients/openapi.mdx @@ -1,3 +1,3 @@ # OpenAPI -The Rivet OpenAPI spec is available [here](https://github.com/rivet-gg/rivetkit/blob/main/clients/openapi/openapi.json) +The Rivet OpenAPI spec is available [here](https://github.com/rivet-dev/rivetkit/blob/main/clients/openapi/openapi.json) diff --git a/site/src/content/docs/clients/react.mdx b/site/src/content/docs/clients/react.mdx index ca16582fc4..56fa27b470 100644 --- a/site/src/content/docs/clients/react.mdx +++ b/site/src/content/docs/clients/react.mdx @@ -18,7 +18,7 @@ Install the RivetKit React package: - Make sure you have a running Rivet actor server to connect to. You can follow the [Node.js & Bun Quickstart](https://rivet.gg/docs/actors/quickstart/backend/) to set up a simple actor server. + Make sure you have a running Rivet actor server to connect to. You can follow the [Node.js & Bun Quickstart](https://rivet.dev/docs/actors/quickstart/backend/) to set up a simple actor server. Connect to actors and listen for real-time updates: diff --git a/site/src/content/docs/clients/rust.mdx b/site/src/content/docs/clients/rust.mdx index c91a9df9f0..e2448ca790 100644 --- a/site/src/content/docs/clients/rust.mdx +++ b/site/src/content/docs/clients/rust.mdx @@ -20,7 +20,7 @@ The Rivet Rust client provides a way to connect to and interact with actors from - Make sure you have a running Rivet actor server to connect to. You can follow the [Node.js & Bun Quickstart](https://rivet.gg/docs/actors/quickstart/backend/) to set up a simple actor server. + Make sure you have a running Rivet actor server to connect to. You can follow the [Node.js & Bun Quickstart](https://rivet.dev/docs/actors/quickstart/backend/) to set up a simple actor server. @@ -81,4 +81,4 @@ The Rivet Rust client provides a way to connect to and interact with actors from _Coming Soon_ -For detailed API documentation, please refer to the [RivetKit Rust client implementation](https://github.com/rivet-gg/rivetkit/blob/main/clients/rust). +For detailed API documentation, please refer to the [RivetKit Rust client implementation](https://github.com/rivet-dev/rivetkit/blob/main/clients/rust). diff --git a/site/src/content/docs/cloud/actors.mdx b/site/src/content/docs/cloud-ee/actors.mdx similarity index 86% rename from site/src/content/docs/cloud/actors.mdx rename to site/src/content/docs/cloud-ee/actors.mdx index 064a10b530..91493a5da8 100644 --- a/site/src/content/docs/cloud/actors.mdx +++ b/site/src/content/docs/cloud-ee/actors.mdx @@ -4,7 +4,7 @@ import { EnterpriseCloud } from "@/components/docs/EnterpriseCloud"; Rivet Actors allows you to deploy resilient, stateful services that maintain their state between requests. Use them for websocket servers, game backends, real-time collaboration services, and more. -**Rivet Actors on Rivet Cloud are currently in closed beta. Please [reach out](https://www.rivet.gg/sales) for access.** +**Rivet Actors on Rivet Cloud are currently in closed beta. Please [reach out](https://www.rivet.dev/sales) for access.** diff --git a/site/src/content/docs/cloud/api/actors/create.mdx b/site/src/content/docs/cloud-ee/api/actors/create.mdx similarity index 90% rename from site/src/content/docs/cloud/api/actors/create.mdx rename to site/src/content/docs/cloud-ee/api/actors/create.mdx index 2cc012408f..b8ec9a5461 100644 --- a/site/src/content/docs/cloud/api/actors/create.mdx +++ b/site/src/content/docs/cloud-ee/api/actors/create.mdx @@ -13,11 +13,11 @@ Create a new dynamic actor. ## Code Examples - + ```bash {{ "title": "cURL" }} # Write the request body to body.json before running -curl -X POST -d '@body.json' 'https://api.rivet.gg/actors' +curl -X POST -d '@body.json' 'https://api.rivet.dev/actors' ``` diff --git a/site/src/content/docs/cloud/api/actors/destroy.mdx b/site/src/content/docs/cloud-ee/api/actors/destroy.mdx similarity index 94% rename from site/src/content/docs/cloud/api/actors/destroy.mdx rename to site/src/content/docs/cloud-ee/api/actors/destroy.mdx index 04a32bacb6..9c338fa15a 100644 --- a/site/src/content/docs/cloud/api/actors/destroy.mdx +++ b/site/src/content/docs/cloud-ee/api/actors/destroy.mdx @@ -13,10 +13,10 @@ Destroy a dynamic actor. ## Code Examples - + ```bash {{ "title": "cURL" }} -curl -X DELETE 'https://api.rivet.gg/actors/{actor}' +curl -X DELETE 'https://api.rivet.dev/actors/{actor}' ``` ```ts diff --git a/site/src/content/docs/cloud/api/actors/get.mdx b/site/src/content/docs/cloud-ee/api/actors/get.mdx similarity index 89% rename from site/src/content/docs/cloud/api/actors/get.mdx rename to site/src/content/docs/cloud-ee/api/actors/get.mdx index 8ab18e8702..556f1cad50 100644 --- a/site/src/content/docs/cloud/api/actors/get.mdx +++ b/site/src/content/docs/cloud-ee/api/actors/get.mdx @@ -13,10 +13,10 @@ Gets a dynamic actor. ## Code Examples - + ```bash {{ "title": "cURL" }} -curl -X GET 'https://api.rivet.gg/actors/{actor}' +curl -X GET 'https://api.rivet.dev/actors/{actor}' ``` ```ts diff --git a/site/src/content/docs/cloud/api/actors/list.mdx b/site/src/content/docs/cloud-ee/api/actors/list.mdx similarity index 91% rename from site/src/content/docs/cloud/api/actors/list.mdx rename to site/src/content/docs/cloud-ee/api/actors/list.mdx index 66ae7e875a..f0d86cd314 100644 --- a/site/src/content/docs/cloud/api/actors/list.mdx +++ b/site/src/content/docs/cloud-ee/api/actors/list.mdx @@ -13,10 +13,10 @@ Lists all actors associated with the token used. Can be filtered by tags in the ## Code Examples - + ```bash {{ "title": "cURL" }} -curl -X GET 'https://api.rivet.gg/actors' +curl -X GET 'https://api.rivet.dev/actors' ``` ```ts diff --git a/site/src/content/docs/cloud/api/actors/logs/export.mdx b/site/src/content/docs/cloud-ee/api/actors/logs/export.mdx similarity index 89% rename from site/src/content/docs/cloud/api/actors/logs/export.mdx rename to site/src/content/docs/cloud-ee/api/actors/logs/export.mdx index 0b3f8836f2..8e4705d9fd 100644 --- a/site/src/content/docs/cloud/api/actors/logs/export.mdx +++ b/site/src/content/docs/cloud-ee/api/actors/logs/export.mdx @@ -13,11 +13,11 @@ Exports logs for the given actors to an S3 bucket and returns a presigned URL to ## Code Examples - + ```bash {{ "title": "cURL" }} # Write the request body to body.json before running -curl -X POST -d '@body.json' 'https://api.rivet.gg/actors/logs/export' +curl -X POST -d '@body.json' 'https://api.rivet.dev/actors/logs/export' ``` diff --git a/site/src/content/docs/cloud/api/actors/logs/get.mdx b/site/src/content/docs/cloud-ee/api/actors/logs/get.mdx similarity index 89% rename from site/src/content/docs/cloud/api/actors/logs/get.mdx rename to site/src/content/docs/cloud-ee/api/actors/logs/get.mdx index 388338875d..79758ae335 100644 --- a/site/src/content/docs/cloud/api/actors/logs/get.mdx +++ b/site/src/content/docs/cloud-ee/api/actors/logs/get.mdx @@ -13,10 +13,10 @@ Returns the logs for a given actor. ## Code Examples - + ```bash {{ "title": "cURL" }} -curl -X GET 'https://api.rivet.gg/actors/logs' +curl -X GET 'https://api.rivet.dev/actors/logs' ``` ```ts diff --git a/site/src/content/docs/cloud/api/actors/metrics/get.mdx b/site/src/content/docs/cloud-ee/api/actors/metrics/get.mdx similarity index 88% rename from site/src/content/docs/cloud/api/actors/metrics/get.mdx rename to site/src/content/docs/cloud-ee/api/actors/metrics/get.mdx index 0721f415f2..2ca5968d29 100644 --- a/site/src/content/docs/cloud/api/actors/metrics/get.mdx +++ b/site/src/content/docs/cloud-ee/api/actors/metrics/get.mdx @@ -13,10 +13,10 @@ Returns the metrics for a given actor. ## Code Examples - + ```bash {{ "title": "cURL" }} -curl -X GET 'https://api.rivet.gg/actors/{actor}/metrics/history' +curl -X GET 'https://api.rivet.dev/actors/{actor}/metrics/history' ``` ```ts diff --git a/site/src/content/docs/cloud/api/actors/query.mdx b/site/src/content/docs/cloud-ee/api/actors/query.mdx similarity index 89% rename from site/src/content/docs/cloud/api/actors/query.mdx rename to site/src/content/docs/cloud-ee/api/actors/query.mdx index 3d824d6e2e..759c2d5461 100644 --- a/site/src/content/docs/cloud/api/actors/query.mdx +++ b/site/src/content/docs/cloud-ee/api/actors/query.mdx @@ -13,10 +13,10 @@ Queries actors using a JSON-encoded query expression. Supports pagination with c ## Code Examples - + ```bash {{ "title": "cURL" }} -curl -X GET 'https://api.rivet.gg/actors/query' +curl -X GET 'https://api.rivet.dev/actors/query' ``` ```ts diff --git a/site/src/content/docs/cloud/api/actors/upgrade-all.mdx b/site/src/content/docs/cloud-ee/api/actors/upgrade-all.mdx similarity index 88% rename from site/src/content/docs/cloud/api/actors/upgrade-all.mdx rename to site/src/content/docs/cloud-ee/api/actors/upgrade-all.mdx index a1e6a94139..18a773e792 100644 --- a/site/src/content/docs/cloud/api/actors/upgrade-all.mdx +++ b/site/src/content/docs/cloud-ee/api/actors/upgrade-all.mdx @@ -13,11 +13,11 @@ Upgrades a dynamic actor. ## Code Examples - + ```bash {{ "title": "cURL" }} # Write the request body to body.json before running -curl -X POST -d '@body.json' 'https://api.rivet.gg/actors/upgrade' +curl -X POST -d '@body.json' 'https://api.rivet.dev/actors/upgrade' ``` diff --git a/site/src/content/docs/cloud/api/actors/upgrade.mdx b/site/src/content/docs/cloud-ee/api/actors/upgrade.mdx similarity index 88% rename from site/src/content/docs/cloud/api/actors/upgrade.mdx rename to site/src/content/docs/cloud-ee/api/actors/upgrade.mdx index a8c305de53..8367ccfe69 100644 --- a/site/src/content/docs/cloud/api/actors/upgrade.mdx +++ b/site/src/content/docs/cloud-ee/api/actors/upgrade.mdx @@ -13,11 +13,11 @@ Upgrades a dynamic actor. ## Code Examples - + ```bash {{ "title": "cURL" }} # Write the request body to body.json before running -curl -X POST -d '@body.json' 'https://api.rivet.gg/actors/{actor}/upgrade' +curl -X POST -d '@body.json' 'https://api.rivet.dev/actors/{actor}/upgrade' ``` diff --git a/site/src/content/docs/cloud/api/actors/usage.mdx b/site/src/content/docs/cloud-ee/api/actors/usage.mdx similarity index 90% rename from site/src/content/docs/cloud/api/actors/usage.mdx rename to site/src/content/docs/cloud-ee/api/actors/usage.mdx index a26009eb62..ddff274b1d 100644 --- a/site/src/content/docs/cloud/api/actors/usage.mdx +++ b/site/src/content/docs/cloud-ee/api/actors/usage.mdx @@ -13,10 +13,10 @@ Returns time series data for actor usage metrics. Allows filtering and grouping ## Code Examples - + ```bash {{ "title": "cURL" }} -curl -X GET 'https://api.rivet.gg/actors/usage' +curl -X GET 'https://api.rivet.dev/actors/usage' ``` ```ts diff --git a/site/src/content/docs/cloud/api/builds/complete.mdx b/site/src/content/docs/cloud-ee/api/builds/complete.mdx similarity index 85% rename from site/src/content/docs/cloud/api/builds/complete.mdx rename to site/src/content/docs/cloud-ee/api/builds/complete.mdx index 11e37ccd17..28833be85f 100644 --- a/site/src/content/docs/cloud/api/builds/complete.mdx +++ b/site/src/content/docs/cloud-ee/api/builds/complete.mdx @@ -13,10 +13,10 @@ Marks an upload as complete. ## Code Examples - + ```bash {{ "title": "cURL" }} -curl -X POST 'https://api.rivet.gg/builds/{build}/complete' +curl -X POST 'https://api.rivet.dev/builds/{build}/complete' ``` ```ts diff --git a/site/src/content/docs/cloud/api/builds/get.mdx b/site/src/content/docs/cloud-ee/api/builds/get.mdx similarity index 88% rename from site/src/content/docs/cloud/api/builds/get.mdx rename to site/src/content/docs/cloud-ee/api/builds/get.mdx index 867598de2f..37e4cd4ded 100644 --- a/site/src/content/docs/cloud/api/builds/get.mdx +++ b/site/src/content/docs/cloud-ee/api/builds/get.mdx @@ -13,10 +13,10 @@ Get a build. ## Code Examples - + ```bash {{ "title": "cURL" }} -curl -X GET 'https://api.rivet.gg/builds/{build}' +curl -X GET 'https://api.rivet.dev/builds/{build}' ``` ```ts diff --git a/site/src/content/docs/cloud/api/builds/list.mdx b/site/src/content/docs/cloud-ee/api/builds/list.mdx similarity index 90% rename from site/src/content/docs/cloud/api/builds/list.mdx rename to site/src/content/docs/cloud-ee/api/builds/list.mdx index d80b30c9f1..63a3eba536 100644 --- a/site/src/content/docs/cloud/api/builds/list.mdx +++ b/site/src/content/docs/cloud-ee/api/builds/list.mdx @@ -13,10 +13,10 @@ Lists all builds of the project associated with the token used. Can be filtered ## Code Examples - + ```bash {{ "title": "cURL" }} -curl -X GET 'https://api.rivet.gg/builds' +curl -X GET 'https://api.rivet.dev/builds' ``` ```ts diff --git a/site/src/content/docs/cloud/api/builds/patch-tags.mdx b/site/src/content/docs/cloud-ee/api/builds/patch-tags.mdx similarity index 92% rename from site/src/content/docs/cloud/api/builds/patch-tags.mdx rename to site/src/content/docs/cloud-ee/api/builds/patch-tags.mdx index d1d17aa9d6..274807f1fb 100644 --- a/site/src/content/docs/cloud/api/builds/patch-tags.mdx +++ b/site/src/content/docs/cloud-ee/api/builds/patch-tags.mdx @@ -10,11 +10,11 @@ import API_SCHEMA from './../spec.json'; ## Code Examples - + ```bash {{ "title": "cURL" }} # Write the request body to body.json before running -curl -X PATCH -d '@body.json' 'https://api.rivet.gg/builds/{build}/tags' +curl -X PATCH -d '@body.json' 'https://api.rivet.dev/builds/{build}/tags' ``` diff --git a/site/src/content/docs/cloud/api/builds/prepare.mdx b/site/src/content/docs/cloud-ee/api/builds/prepare.mdx similarity index 89% rename from site/src/content/docs/cloud/api/builds/prepare.mdx rename to site/src/content/docs/cloud-ee/api/builds/prepare.mdx index 4a1e4dbc77..bdde12f627 100644 --- a/site/src/content/docs/cloud/api/builds/prepare.mdx +++ b/site/src/content/docs/cloud-ee/api/builds/prepare.mdx @@ -13,11 +13,11 @@ Creates a new project build for the given project. ## Code Examples - + ```bash {{ "title": "cURL" }} # Write the request body to body.json before running -curl -X POST -d '@body.json' 'https://api.rivet.gg/builds/prepare' +curl -X POST -d '@body.json' 'https://api.rivet.dev/builds/prepare' ``` diff --git a/site/src/content/docs/cloud/api/errors.mdx b/site/src/content/docs/cloud-ee/api/errors.mdx similarity index 98% rename from site/src/content/docs/cloud/api/errors.mdx rename to site/src/content/docs/cloud-ee/api/errors.mdx index 5d841ff9b1..ac2f4f3efa 100644 --- a/site/src/content/docs/cloud/api/errors.mdx +++ b/site/src/content/docs/cloud-ee/api/errors.mdx @@ -329,7 +329,7 @@ simply be joined instead. {`GROUP_DEACTIVATED`} -The developer group has been deactivated. Please [contact support](https://rivet.gg/support) if you believe +The developer group has been deactivated. Please [contact support](https://rivet.dev/support) if you believe this is a mistake. # Reason: `NoPaymentMethod` @@ -338,7 +338,7 @@ A developer group requires a payment method for using Rivet services. How to check your billing info: -1. Visit https://hub.rivet.gg/ +1. Visit https://dashboard.rivet.dev/ 2. Select the project you are experiencing this error with. 3. Click **Settings** in the top right corner of your project's banner. 4. Click **Billing** in the left sidebar. @@ -350,17 +350,17 @@ further. How to check your billing info: -1. Visit https://hub.rivet.gg/ +1. Visit https://dashboard.rivet.dev/ 2. Select the project you are experiencing this error with. 3. Click **Settings** in the top right corner of your project's banner. 4. Click **Billing** in the left sidebar. -If needed, feel free to [contact support](https://rivet.gg/support) for further assistance. +If needed, feel free to [contact support](https://rivet.dev/support) for further assistance. # Reason: `Banned` The developer group has been banned from using Rivet services. Please -[contact support](https://rivet.gg/support) if you believe this is a mistake. +[contact support](https://rivet.dev/support) if you believe this is a mistake. # No reason given diff --git a/site/src/content/docs/cloud/api/index.mdx b/site/src/content/docs/cloud-ee/api/index.mdx similarity index 76% rename from site/src/content/docs/cloud/api/index.mdx rename to site/src/content/docs/cloud-ee/api/index.mdx index 2f34bbe000..143879af42 100644 --- a/site/src/content/docs/cloud/api/index.mdx +++ b/site/src/content/docs/cloud-ee/api/index.mdx @@ -18,9 +18,9 @@ All API requests require [authentication tokens](/docs/cloud/tokens). Use these While you can use the HTTP API directly, we recommend using our official SDKs: - [TypeScript & JavaScript](https://www.npmjs.com/package/@rivet-gg/api) -- [Go](https://github.com/rivet-gg/rivet/tree/main/sdks/api/runtime/go) -- [Rust](https://github.com/rivet-gg/rivet/tree/main/sdks/api/runtime/rust) -- [OpenAPI](https://github.com/rivet-gg/rivet/blob/main/sdks/api/runtime/openapi/openapi.yml) +- [Go](https://github.com/rivet-dev/rivet/tree/main/sdks/api/runtime/go) +- [Rust](https://github.com/rivet-dev/rivet/tree/main/sdks/api/runtime/rust) +- [OpenAPI](https://github.com/rivet-dev/rivet/blob/main/sdks/api/runtime/openapi/openapi.yml) - [Command Line Interface](/docs/cloud/cli) ## Error Handling diff --git a/site/src/content/docs/cloud/api/regions/list.mdx b/site/src/content/docs/cloud-ee/api/regions/list.mdx similarity index 88% rename from site/src/content/docs/cloud/api/regions/list.mdx rename to site/src/content/docs/cloud-ee/api/regions/list.mdx index d8f5b06d60..d2deff9705 100644 --- a/site/src/content/docs/cloud/api/regions/list.mdx +++ b/site/src/content/docs/cloud-ee/api/regions/list.mdx @@ -10,10 +10,10 @@ import API_SCHEMA from './../spec.json'; ## Code Examples - + ```bash {{ "title": "cURL" }} -curl -X GET 'https://api.rivet.gg/regions' +curl -X GET 'https://api.rivet.dev/regions' ``` ```ts diff --git a/site/src/content/docs/cloud/api/regions/recommend.mdx b/site/src/content/docs/cloud-ee/api/regions/recommend.mdx similarity index 88% rename from site/src/content/docs/cloud/api/regions/recommend.mdx rename to site/src/content/docs/cloud-ee/api/regions/recommend.mdx index ad8feea48a..7914869949 100644 --- a/site/src/content/docs/cloud/api/regions/recommend.mdx +++ b/site/src/content/docs/cloud-ee/api/regions/recommend.mdx @@ -10,10 +10,10 @@ import API_SCHEMA from './../spec.json'; ## Code Examples - + ```bash {{ "title": "cURL" }} -curl -X GET 'https://api.rivet.gg/regions/recommend' +curl -X GET 'https://api.rivet.dev/regions/recommend' ``` ```ts diff --git a/site/src/content/docs/cloud/api/routes/delete.mdx b/site/src/content/docs/cloud-ee/api/routes/delete.mdx similarity index 93% rename from site/src/content/docs/cloud/api/routes/delete.mdx rename to site/src/content/docs/cloud-ee/api/routes/delete.mdx index c40a72031f..6bda13835d 100644 --- a/site/src/content/docs/cloud/api/routes/delete.mdx +++ b/site/src/content/docs/cloud-ee/api/routes/delete.mdx @@ -13,10 +13,10 @@ Deletes a route. ## Code Examples - + ```bash {{ "title": "cURL" }} -curl -X DELETE 'https://api.rivet.gg/routes/{id}' +curl -X DELETE 'https://api.rivet.dev/routes/{id}' ``` ```ts diff --git a/site/src/content/docs/cloud/api/routes/history.mdx b/site/src/content/docs/cloud-ee/api/routes/history.mdx similarity index 90% rename from site/src/content/docs/cloud/api/routes/history.mdx rename to site/src/content/docs/cloud-ee/api/routes/history.mdx index a6720f7de2..59be0ae892 100644 --- a/site/src/content/docs/cloud/api/routes/history.mdx +++ b/site/src/content/docs/cloud-ee/api/routes/history.mdx @@ -13,10 +13,10 @@ Returns time series data for HTTP requests routed to actors. Allows filtering an ## Code Examples - + ```bash {{ "title": "cURL" }} -curl -X GET 'https://api.rivet.gg/routes/history' +curl -X GET 'https://api.rivet.dev/routes/history' ``` ```ts diff --git a/site/src/content/docs/cloud/api/routes/list.mdx b/site/src/content/docs/cloud-ee/api/routes/list.mdx similarity index 89% rename from site/src/content/docs/cloud/api/routes/list.mdx rename to site/src/content/docs/cloud-ee/api/routes/list.mdx index a4833436d6..12c7809b6a 100644 --- a/site/src/content/docs/cloud/api/routes/list.mdx +++ b/site/src/content/docs/cloud-ee/api/routes/list.mdx @@ -13,10 +13,10 @@ Lists all routes of the given environment. ## Code Examples - + ```bash {{ "title": "cURL" }} -curl -X GET 'https://api.rivet.gg/routes' +curl -X GET 'https://api.rivet.dev/routes' ``` ```ts diff --git a/site/src/content/docs/cloud/api/routes/update.mdx b/site/src/content/docs/cloud-ee/api/routes/update.mdx similarity index 89% rename from site/src/content/docs/cloud/api/routes/update.mdx rename to site/src/content/docs/cloud-ee/api/routes/update.mdx index 02960c36f9..0ff5c6120c 100644 --- a/site/src/content/docs/cloud/api/routes/update.mdx +++ b/site/src/content/docs/cloud-ee/api/routes/update.mdx @@ -13,11 +13,11 @@ Creates or updates a route. ## Code Examples - + ```bash {{ "title": "cURL" }} # Write the request body to body.json before running -curl -X PUT -d '@body.json' 'https://api.rivet.gg/routes/{id}' +curl -X PUT -d '@body.json' 'https://api.rivet.dev/routes/{id}' ``` diff --git a/site/src/content/docs/cloud/api/spec.json b/site/src/content/docs/cloud-ee/api/spec.json similarity index 57% rename from site/src/content/docs/cloud/api/spec.json rename to site/src/content/docs/cloud-ee/api/spec.json index e4fa6727e0..c002e91e04 100644 --- a/site/src/content/docs/cloud/api/spec.json +++ b/site/src/content/docs/cloud-ee/api/spec.json @@ -1 +1 @@ -{"definitions":{"ActorsGetActorResponse":{"type":"object","properties":{"actor":{"$ref":"#/components/schemas/ActorsActor"}},"required":["actor"]},"ActorsCreateActorRequest":{"type":"object","properties":{"region":{"type":"string"},"tags":{},"build":{"type":"string","format":"uuid"},"build_tags":{},"runtime":{"$ref":"#/components/schemas/ActorsCreateActorRuntimeRequest"},"network":{"$ref":"#/components/schemas/ActorsCreateActorNetworkRequest"},"resources":{"$ref":"#/components/schemas/ActorsResources"},"lifecycle":{"$ref":"#/components/schemas/ActorsLifecycle"}},"required":["tags"]},"ActorsCreateActorRuntimeRequest":{"type":"object","properties":{"environment":{"type":"object","additionalProperties":{"type":"string"}},"network":{"$ref":"#/components/schemas/ActorsCreateActorRuntimeNetworkRequest"}}},"ActorsCreateActorRuntimeNetworkRequest":{"type":"object","properties":{"endpoint_type":{"$ref":"#/components/schemas/ActorsEndpointType"}},"required":["endpoint_type"]},"ActorsCreateActorNetworkRequest":{"type":"object","properties":{"mode":{"$ref":"#/components/schemas/ActorsNetworkMode"},"ports":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ActorsCreateActorPortRequest"}},"wait_ready":{"type":"boolean"}}},"ActorsCreateActorPortRequest":{"type":"object","properties":{"protocol":{"$ref":"#/components/schemas/ActorsPortProtocol"},"internal_port":{"type":"integer"},"routing":{"$ref":"#/components/schemas/ActorsPortRouting"}},"required":["protocol"]},"ActorsCreateActorResponse":{"type":"object","properties":{"actor":{"$ref":"#/components/schemas/ActorsActor","description":"The actor that was created"}},"required":["actor"]},"ActorsDestroyActorResponse":{"type":"object","properties":{}},"ActorsUpgradeActorRequest":{"type":"object","properties":{"build":{"type":"string","format":"uuid"},"build_tags":{}}},"ActorsUpgradeActorResponse":{"type":"object","properties":{}},"ActorsUpgradeAllActorsRequest":{"type":"object","properties":{"tags":{},"build":{"type":"string","format":"uuid"},"build_tags":{}},"required":["tags"]},"ActorsUpgradeAllActorsResponse":{"type":"object","properties":{"count":{"type":"integer","format":"int64"}},"required":["count"]},"ActorsListActorsResponse":{"type":"object","properties":{"actors":{"type":"array","items":{"$ref":"#/components/schemas/ActorsActor"},"description":"A list of actors for the project associated with the token."},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["actors","pagination"]},"ActorsGetActorUsageResponse":{"type":"object","properties":{"metric_names":{"type":"array","items":{"type":"string"}},"metric_attributes":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}}},"metric_types":{"type":"array","items":{"type":"string"}},"metric_values":{"type":"array","items":{"type":"array","items":{"type":"number","format":"double"}}}},"required":["metric_names","metric_attributes","metric_types","metric_values"]},"ActorsQueryActorsResponse":{"type":"object","properties":{"actors":{"type":"array","items":{"$ref":"#/components/schemas/ActorsActor"},"description":"A list of actors matching the query"},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["actors","pagination"]},"BuildsGetBuildResponse":{"type":"object","properties":{"build":{"$ref":"#/components/schemas/BuildsBuild"}},"required":["build"]},"BuildsListBuildsResponse":{"type":"object","properties":{"builds":{"type":"array","items":{"$ref":"#/components/schemas/BuildsBuild"},"description":"A list of builds for the project associated with the token."}},"required":["builds"]},"BuildsPatchBuildTagsRequest":{"type":"object","properties":{"tags":{},"exclusive_tags":{"type":"array","items":{"type":"string"},"description":"**Deprecated**\nRemoves the given tag keys from all other builds."}},"required":["tags"]},"BuildsPatchBuildTagsResponse":{"type":"object","properties":{}},"BuildsPrepareBuildRequest":{"type":"object","properties":{"image_tag":{"type":"string","description":"A tag given to the project build."},"image_file":{"$ref":"#/components/schemas/UploadPrepareFile"},"kind":{"$ref":"#/components/schemas/BuildsBuildKind"},"compression":{"$ref":"#/components/schemas/BuildsBuildCompression"}},"required":["image_file"]},"BuildsPrepareBuildResponse":{"type":"object","properties":{"build":{"type":"string","format":"uuid"},"presigned_requests":{"type":"array","items":{"$ref":"#/components/schemas/UploadPresignedRequest"}}},"required":["build","presigned_requests"]},"BuildsBuildKind":{"type":"string","enum":["docker_image","oci_bundle","javascript"]},"BuildsBuildCompression":{"type":"string","enum":["none","lz4"]},"CloudBootstrapResponse":{"type":"object","properties":{"cluster":{"$ref":"#/components/schemas/CloudBootstrapCluster"},"access":{"$ref":"#/components/schemas/CloudBootstrapAccess"},"domains":{"$ref":"#/components/schemas/CloudBootstrapDomains"},"origins":{"$ref":"#/components/schemas/CloudBootstrapOrigins"},"captcha":{"$ref":"#/components/schemas/CloudBootstrapCaptcha"},"login_methods":{"$ref":"#/components/schemas/CloudBootstrapLoginMethods"},"deploy_hash":{"type":"string"}},"required":["cluster","access","domains","origins","captcha","login_methods","deploy_hash"]},"CloudBootstrapCluster":{"type":"string","enum":["enterprise","oss"],"description":"The type of cluster that the backend is currently running."},"CloudBootstrapAccess":{"type":"string","enum":["public","private","development"]},"CloudBootstrapDomains":{"type":"object","description":"Domains that host parts of Rivet","properties":{"cdn":{"type":"string"},"job":{"type":"string"},"main":{"type":"string"},"opengb":{"type":"string"}}},"CloudBootstrapOrigins":{"type":"object","description":"Origins used to build URLs from","properties":{"hub":{"type":"string"}},"required":["hub"]},"CloudBootstrapCaptcha":{"type":"object","properties":{"turnstile":{"$ref":"#/components/schemas/CloudBootstrapCaptchaTurnstile"}}},"CloudBootstrapCaptchaTurnstile":{"type":"object","properties":{"site_key":{"type":"string"}},"required":["site_key"]},"CloudBootstrapLoginMethods":{"type":"object","properties":{"email":{"type":"boolean"},"access_token":{"type":"boolean"}},"required":["email"]},"CloudGamesGetGamesResponse":{"type":"object","properties":{"games":{"type":"array","items":{"$ref":"#/components/schemas/GameGameSummary"},"description":"A list of game summaries."},"groups":{"type":"array","items":{"$ref":"#/components/schemas/GroupGroupSummary"},"description":"A list of group summaries."},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["games","groups","watch"]},"CloudGamesCreateGameRequest":{"type":"object","properties":{"name_id":{"$ref":"#/components/schemas/Identifier","description":"**Deprecated**"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"developer_group_id":{"type":"string","format":"uuid"}},"required":["display_name","developer_group_id"]},"CloudGamesCreateGameResponse":{"type":"object","properties":{"game_id":{"type":"string","format":"uuid"}},"required":["game_id"]},"CloudGamesValidateGameRequest":{"type":"object","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"},"name_id":{"$ref":"#/components/schemas/Identifier","description":"**Deprecated**"}},"required":["display_name"]},"CloudGamesValidateGameResponse":{"type":"object","properties":{"errors":{"type":"array","items":{"$ref":"#/components/schemas/ValidationError"},"description":"A list of validation errors."}},"required":["errors"]},"CloudGamesGetGameByIdResponse":{"type":"object","properties":{"game":{"$ref":"#/components/schemas/CloudGameFull"},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["game","watch"]},"CloudGamesGameBannerUploadPrepareRequest":{"type":"object","properties":{"path":{"type":"string","description":"The path/filename of the game banner."},"mime":{"type":"string","description":"The MIME type of the game banner."},"content_length":{"type":"integer","format":"int64","description":"Unsigned 64 bit integer."}},"required":["path","content_length"]},"CloudGamesGameBannerUploadPrepareResponse":{"type":"object","properties":{"upload_id":{"type":"string","format":"uuid"},"presigned_request":{"$ref":"#/components/schemas/UploadPresignedRequest"}},"required":["upload_id","presigned_request"]},"CloudGamesGameLogoUploadPrepareRequest":{"type":"object","properties":{"path":{"type":"string","description":"The path/filename of the game logo."},"mime":{"type":"string","description":"The MIME type of the game logo."},"content_length":{"type":"integer","format":"int64","description":"Unsigned 64 bit integer."}},"required":["path","content_length"]},"CloudGamesGameLogoUploadPrepareResponse":{"type":"object","properties":{"upload_id":{"type":"string","format":"uuid"},"presigned_request":{"$ref":"#/components/schemas/UploadPresignedRequest"}},"required":["upload_id","presigned_request"]},"CloudGamesNamespacesInspectResponse":{"type":"object","properties":{"agent":{"$ref":"#/components/schemas/CloudAuthAgent"}},"required":["agent"]},"CloudGamesNamespacesCreateGameNamespaceRequest":{"type":"object","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"},"version_id":{"type":"string","format":"uuid"},"name_id":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."}},"required":["display_name","version_id","name_id"]},"CloudGamesNamespacesCreateGameNamespaceResponse":{"type":"object","properties":{"namespace_id":{"type":"string","format":"uuid"}},"required":["namespace_id"]},"CloudGamesNamespacesValidateGameNamespaceRequest":{"type":"object","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"},"name_id":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."}},"required":["display_name","name_id"]},"CloudGamesNamespacesValidateGameNamespaceResponse":{"type":"object","properties":{"errors":{"type":"array","items":{"$ref":"#/components/schemas/ValidationError"},"description":"A list of validation errors."}},"required":["errors"]},"CloudGamesNamespacesGetGameNamespaceByIdResponse":{"type":"object","properties":{"namespace":{"$ref":"#/components/schemas/CloudNamespaceFull"}},"required":["namespace"]},"CloudGamesNamespacesUpdateNamespaceCdnAuthUserRequest":{"type":"object","properties":{"user":{"type":"string","description":"A user name."},"password":{"type":"string","description":"A bcrypt encrypted password. An error is returned if the given string is not properly encrypted."}},"required":["user","password"]},"CloudGamesNamespacesSetNamespaceCdnAuthTypeRequest":{"type":"object","properties":{"auth_type":{"$ref":"#/components/schemas/CloudCdnAuthType"}},"required":["auth_type"]},"CloudGamesNamespacesToggleNamespaceDomainPublicAuthRequest":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Whether or not to enable authentication based on domain."}},"required":["enabled"]},"CloudGamesNamespacesAddNamespaceDomainRequest":{"type":"object","properties":{"domain":{"type":"string","description":"A valid domain name (no protocol)."}},"required":["domain"]},"CloudGamesNamespacesUpdateGameNamespaceMatchmakerConfigRequest":{"type":"object","properties":{"lobby_count_max":{"type":"integer","description":"Unsigned 32 bit integer."},"max_players":{"type":"integer","description":"Unsigned 32 bit integer."}},"required":["lobby_count_max","max_players"]},"CloudGamesNamespacesGetGameNamespaceVersionHistoryResponse":{"type":"object","properties":{"versions":{"type":"array","items":{"$ref":"#/components/schemas/CloudNamespaceVersion"},"description":"A list of previously deployed namespace versions."}},"required":["versions"]},"CloudGamesNamespacesValidateGameNamespaceMatchmakerConfigRequest":{"type":"object","properties":{"lobby_count_max":{"type":"integer","description":"Unsigned 32 bit integer."},"max_players":{"type":"integer","description":"Unsigned 32 bit integer."}},"required":["lobby_count_max","max_players"]},"CloudGamesNamespacesValidateGameNamespaceMatchmakerConfigResponse":{"type":"object","properties":{"errors":{"type":"array","items":{"$ref":"#/components/schemas/ValidationError"},"description":"A list of validation errors."}},"required":["errors"]},"CloudGamesNamespacesCreateGameNamespaceTokenDevelopmentRequest":{"type":"object","properties":{"hostname":{"type":"string","description":"The hostname used for the token."},"ports":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/CloudMatchmakerDevelopmentPort"}},"lobby_ports":{"type":"array","items":{"$ref":"#/components/schemas/CloudVersionMatchmakerLobbyGroupRuntimeDockerPort"},"description":"**Deprecated**\nA list of docker ports."}},"required":["hostname"]},"CloudGamesNamespacesCreateGameNamespaceTokenDevelopmentResponse":{"type":"object","properties":{"token":{"type":"string","description":"A JSON Web Token.\nSlightly modified to include a description prefix and use Protobufs of\nJSON."}},"required":["token"]},"CloudGamesNamespacesValidateGameNamespaceTokenDevelopmentRequest":{"type":"object","properties":{"hostname":{"type":"string"},"lobby_ports":{"type":"array","items":{"$ref":"#/components/schemas/CloudVersionMatchmakerLobbyGroupRuntimeDockerPort"},"description":"A list of docker ports."}},"required":["hostname","lobby_ports"]},"CloudGamesNamespacesValidateGameNamespaceTokenDevelopmentResponse":{"type":"object","properties":{"errors":{"type":"array","items":{"$ref":"#/components/schemas/ValidationError"},"description":"A list of validation errors."}},"required":["errors"]},"CloudGamesNamespacesCreateGameNamespaceTokenPublicResponse":{"type":"object","properties":{"token":{"type":"string","description":"A JSON Web Token.\nSlightly modified to include a description prefix and use Protobufs of\nJSON."}},"required":["token"]},"CloudGamesNamespacesUpdateGameNamespaceVersionRequest":{"type":"object","properties":{"version_id":{"type":"string","format":"uuid"}},"required":["version_id"]},"CloudVersionConfig":{"type":"object","description":"Cloud configuration for a given version.","properties":{"scripts":{"type":"object","additionalProperties":{"type":"string"}},"engine":{"$ref":"#/components/schemas/CloudVersionEngineEngineConfig"},"cdn":{"$ref":"#/components/schemas/CloudVersionCdnCdnConfig"},"matchmaker":{"$ref":"#/components/schemas/CloudVersionMatchmakerMatchmakerConfig"},"kv":{"$ref":"#/components/schemas/CloudVersionKvKvConfig"},"identity":{"$ref":"#/components/schemas/CloudVersionIdentityIdentityConfig"}}},"CloudVersionFull":{"type":"object","description":"A full version.","properties":{"version_id":{"type":"string","format":"uuid"},"create_ts":{"$ref":"#/components/schemas/Timestamp"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"config":{"$ref":"#/components/schemas/CloudVersionConfig"}},"required":["version_id","create_ts","display_name","config"]},"CloudVersionSummary":{"type":"object","description":"A version summary.","properties":{"version_id":{"type":"string","format":"uuid"},"create_ts":{"$ref":"#/components/schemas/Timestamp"},"display_name":{"$ref":"#/components/schemas/DisplayName"}},"required":["version_id","create_ts","display_name"]},"CloudVersionCdnCdnConfig":{"type":"object","description":"CDN configuration for a given version.","properties":{"build_command":{"type":"string","description":"_Configures Rivet CLI behavior. Has no effect on server behavior._"},"build_output":{"type":"string","description":"_Configures Rivet CLI behavior. Has no effect on server behavior._"},"build_env":{"type":"object","additionalProperties":{"type":"string"},"description":"_Configures Rivet CLI behavior. Has no effect on server behavior._"},"site_id":{"type":"string","format":"uuid"},"routes":{"type":"array","items":{"$ref":"#/components/schemas/CloudVersionCdnRoute"},"description":"Multiple CDN version routes."}}},"CloudVersionCdnRoute":{"type":"object","properties":{"glob":{"type":"string"},"priority":{"type":"integer","description":"Unsigned 32 bit integer."},"middlewares":{"type":"array","items":{"$ref":"#/components/schemas/CloudVersionCdnMiddleware"},"description":"Multiple CDN version middleware."}},"required":["glob","priority","middlewares"]},"CloudVersionCdnMiddleware":{"type":"object","properties":{"kind":{"$ref":"#/components/schemas/CloudVersionCdnMiddlewareKind"}},"required":["kind"]},"CloudVersionCdnMiddlewareKind":{"type":"object","properties":{"custom_headers":{"$ref":"#/components/schemas/CloudVersionCdnCustomHeadersMiddleware"}}},"CloudVersionCdnCustomHeadersMiddleware":{"type":"object","properties":{"headers":{"type":"array","items":{"$ref":"#/components/schemas/CloudVersionCdnHeader"}}},"required":["headers"]},"CloudVersionCdnHeader":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":"string"}},"required":["name","value"]},"CloudVersionEngineEngineConfig":{"type":"object","properties":{"unity":{"$ref":"#/components/schemas/CloudVersionEngineUnityConfig"},"unreal":{"$ref":"#/components/schemas/CloudVersionEngineUnrealConfig"},"godot":{"$ref":"#/components/schemas/CloudVersionEngineGodotConfig"},"html5":{"$ref":"#/components/schemas/CloudVersionEngineHtml5Config"},"custom":{"$ref":"#/components/schemas/CloudVersionEngineCustomConfig"}}},"CloudVersionIdentityIdentityConfig":{"type":"object","description":"**Deprecated**\nIdentity configuration for a given version.","properties":{"display_names":{"type":"array","items":{"type":"string"},"description":"**Deprecated**"},"avatars":{"type":"array","items":{"type":"string","format":"uuid"},"description":"**Deprecated**"},"custom_display_names":{"type":"array","items":{"$ref":"#/components/schemas/CloudVersionIdentityCustomDisplayName"},"description":"**Deprecated**"},"custom_avatars":{"type":"array","items":{"$ref":"#/components/schemas/CloudVersionIdentityCustomAvatar"},"description":"**Deprecated**"}}},"CloudVersionIdentityCustomDisplayName":{"type":"object","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"}},"required":["display_name"]},"CloudVersionIdentityCustomAvatar":{"type":"object","properties":{"upload_id":{"type":"string","format":"uuid"}},"required":["upload_id"]},"CloudVersionKvKvConfig":{"type":"object","description":"KV configuration for a given version.","properties":{}},"CloudVersionMatchmakerMatchmakerConfig":{"type":"object","description":"Matchmaker configuration for a given version.","properties":{"game_modes":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameMode"},"description":"A list of game modes."},"captcha":{"$ref":"#/components/schemas/CloudVersionMatchmakerCaptcha"},"dev_hostname":{"type":"string","description":"_Configures Rivet CLI behavior. Has no effect on server behavior._"},"regions":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeRegion"}},"max_players":{"type":"integer"},"max_players_direct":{"type":"integer"},"max_players_party":{"type":"integer"},"docker":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeRuntimeDocker"},"tier":{"type":"string"},"idle_lobbies":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeIdleLobbiesConfig"},"lobby_groups":{"type":"array","items":{"$ref":"#/components/schemas/CloudVersionMatchmakerLobbyGroup"},"description":"**Deprecated: use `game_modes` instead**\nA list of game modes."}}},"CoreIntercomPegboardMarkClientRegisteredRequest":{"type":"object","properties":{"server_id":{"type":"string","format":"uuid"}},"required":["server_id"]},"EdgeIntercomPegboardPrewarmImageRequest":{"type":"object","properties":{}},"EdgeIntercomPegboardToggleClientDrainRequest":{"type":"object","properties":{"draining":{"type":"boolean"},"drain_complete_ts":{"$ref":"#/components/schemas/Timestamp"}},"required":["draining"]},"GroupListSuggestedResponse":{"type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/components/schemas/GroupGroupSummary"},"description":"A list of group summaries."},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["groups","watch"]},"GroupCreateRequest":{"type":"object","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"}},"required":["display_name"]},"GroupCreateResponse":{"type":"object","properties":{"group_id":{"type":"string","format":"uuid"}},"required":["group_id"]},"GroupPrepareAvatarUploadRequest":{"type":"object","properties":{"path":{"type":"string","description":"The path/filename of the group avatar."},"mime":{"type":"string","description":"The MIME type of the group avatar."},"content_length":{"type":"integer","format":"int64","description":"Unsigned 64 bit integer."}},"required":["path","content_length"]},"GroupPrepareAvatarUploadResponse":{"type":"object","properties":{"upload_id":{"type":"string","format":"uuid"},"presigned_request":{"$ref":"#/components/schemas/UploadPresignedRequest"}},"required":["upload_id","presigned_request"]},"GroupValidateProfileRequest":{"type":"object","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"},"bio":{"$ref":"#/components/schemas/DisplayName"},"publicity":{"$ref":"#/components/schemas/GroupPublicity"}}},"GroupValidateProfileResponse":{"type":"object","properties":{"errors":{"type":"array","items":{"$ref":"#/components/schemas/ValidationError"},"description":"A list of validation errors."}},"required":["errors"]},"GroupGetBansResponse":{"type":"object","properties":{"banned_identities":{"type":"array","items":{"$ref":"#/components/schemas/GroupBannedIdentity"},"description":"A list of banned group members."},"anchor":{"type":"string","description":"The pagination anchor."},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["banned_identities","watch"]},"GroupGetJoinRequestsResponse":{"type":"object","properties":{"join_requests":{"type":"array","items":{"$ref":"#/components/schemas/GroupJoinRequest"},"description":"A list of group join requests."},"anchor":{"type":"string","description":"The pagination anchor."},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["join_requests","watch"]},"GroupGetMembersResponse":{"type":"object","properties":{"members":{"type":"array","items":{"$ref":"#/components/schemas/GroupMember"},"description":"A list of group members."},"anchor":{"type":"string","description":"The pagination anchor."},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["members","watch"]},"GroupGetProfileResponse":{"type":"object","properties":{"group":{"$ref":"#/components/schemas/GroupProfile"},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["group","watch"]},"GroupUpdateProfileRequest":{"type":"object","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"},"bio":{"type":"string","description":"Detailed information about a profile."},"publicity":{"$ref":"#/components/schemas/GroupPublicity"}}},"GroupGetSummaryResponse":{"type":"object","properties":{"group":{"$ref":"#/components/schemas/GroupGroupSummary"}},"required":["group"]},"GroupTransferOwnershipRequest":{"type":"object","properties":{"new_owner_identity_id":{"type":"string","description":"Identity to transfer the group to.\nMust be a member of the group."}},"required":["new_owner_identity_id"]},"IdentitySetupResponse":{"type":"object","properties":{"identity_token":{"$ref":"#/components/schemas/Jwt","description":"Token used to authenticate the identity.\nShould be stored somewhere permanent.\nPass this to `rivet.api.identity#Setup$existing_identity_token` next time `rivet.api.identity#Setup` is called.\nToken has a 90 day TTL.\nThis means that if `rivet.api.identity#Setup` is not called again within 90 days, the token will no longer be valid.\nIf this happens, the user can recover their account through the linking process (see `rivet.api.identity#PrepareGameLink`).\nThis token should be stored locally and never sent to a server or another device.\nIf this token is compromised, anyone with access to this token has control of the identity."},"identity_token_expire_ts":{"$ref":"#/components/schemas/Timestamp"},"identity":{"$ref":"#/components/schemas/IdentityProfile","description":"Information about the identity that was just authenticated."},"game_id":{"type":"string","format":"uuid"}},"required":["identity_token","identity_token_expire_ts","identity","game_id"]},"IdentityGetProfileResponse":{"type":"object","properties":{"identity":{"$ref":"#/components/schemas/IdentityProfile"},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["identity","watch"]},"IdentityGetHandlesResponse":{"type":"object","properties":{"identities":{"type":"array","items":{"$ref":"#/components/schemas/IdentityHandle"}},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["identities","watch"]},"IdentityGetSummariesResponse":{"type":"object","properties":{"identities":{"type":"array","items":{"$ref":"#/components/schemas/IdentitySummary"}},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["identities","watch"]},"IdentityValidateProfileResponse":{"type":"object","properties":{"errors":{"type":"array","items":{"$ref":"#/components/schemas/ValidationError"}}},"required":["errors"]},"IdentityPrepareAvatarUploadResponse":{"type":"object","properties":{"upload_id":{"type":"string","format":"uuid"},"presigned_request":{"$ref":"#/components/schemas/UploadPresignedRequest"}},"required":["upload_id","presigned_request"]},"ProvisionDatacentersGetTlsResponse":{"type":"object","properties":{"job_cert_pem":{"type":"string"},"job_private_key_pem":{"type":"string"},"api_cert_pem":{"type":"string"},"api_private_key_pem":{"type":"string"}},"required":["job_cert_pem","job_private_key_pem","api_cert_pem","api_private_key_pem"]},"ProvisionDatacentersGetServersResponse":{"type":"object","properties":{"servers":{"type":"array","items":{"$ref":"#/components/schemas/ProvisionServer"}}},"required":["servers"]},"ProvisionServersGetInfoResponse":{"type":"object","properties":{"name":{"type":"string"},"server_id":{"type":"string","format":"uuid"},"datacenter_id":{"type":"string","format":"uuid"},"datacenter_name_id":{"type":"string"},"cluster_id":{"type":"string","format":"uuid"},"lan_ip":{"type":"string"},"wan_ip":{"type":"string"},"vlan_ip":{"type":"string","description":"**Deprecated**: Use lan_ip"},"public_ip":{"type":"string","description":"**Deprecated**: Use wan_ip"}},"required":["name","server_id","datacenter_id","datacenter_name_id","cluster_id","lan_ip","wan_ip","vlan_ip","public_ip"]},"ProvisionTunnelGetTlsResponse":{"type":"object","properties":{"cert_pem":{"type":"string"},"root_ca_cert_pem":{"type":"string"},"private_key_pem":{"type":"string"}},"required":["cert_pem","root_ca_cert_pem","private_key_pem"]},"RegionsListRegionsResponse":{"type":"object","properties":{"regions":{"type":"array","items":{"$ref":"#/components/schemas/RegionsRegion"}}},"required":["regions"]},"RegionsRecommendRegionResponse":{"type":"object","properties":{"region":{"$ref":"#/components/schemas/RegionsRegion"}},"required":["region"]},"RoutesListRoutesResponse":{"type":"object","properties":{"routes":{"type":"array","items":{"$ref":"#/components/schemas/RoutesRoute"}}},"required":["routes"]},"RoutesUpdateRouteBody":{"type":"object","properties":{"hostname":{"type":"string"},"path":{"type":"string"},"strip_prefix":{"type":"boolean","description":"Whether to remove the path prefix before sending the request to the actor."},"route_subpaths":{"type":"boolean","description":"Whether to route all subpaths of this path"},"target":{"$ref":"#/components/schemas/RoutesRouteTarget"}},"required":["hostname","path","strip_prefix","route_subpaths","target"]},"RoutesUpdateRouteResponse":{"type":"object","properties":{}},"RoutesDeleteRouteResponse":{"type":"object","properties":{}},"RoutesHistoryResponse":{"type":"object","properties":{"metric_names":{"type":"array","items":{"type":"string"}},"metric_attributes":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}}},"metric_types":{"type":"array","items":{"type":"string"}},"metric_values":{"type":"array","items":{"type":"array","items":{"type":"number","format":"double"}}}},"required":["metric_names","metric_attributes","metric_types","metric_values"]},"ServersGetServerResponse":{"type":"object","properties":{"server":{"$ref":"#/components/schemas/ServersServer"}},"required":["server"]},"ServersCreateServerRequest":{"type":"object","properties":{"datacenter":{"type":"string","format":"uuid"},"tags":{},"runtime":{"$ref":"#/components/schemas/ServersCreateServerRuntimeRequest"},"network":{"$ref":"#/components/schemas/ServersCreateServerNetworkRequest"},"resources":{"$ref":"#/components/schemas/ServersResources"},"lifecycle":{"$ref":"#/components/schemas/ServersLifecycle"}},"required":["datacenter","tags","runtime","network","resources"]},"ServersCreateServerRuntimeRequest":{"type":"object","properties":{"build":{"type":"string","format":"uuid"},"arguments":{"type":"array","items":{"type":"string"}},"environment":{"type":"object","additionalProperties":{"type":"string"}}},"required":["build"]},"ServersCreateServerNetworkRequest":{"type":"object","properties":{"mode":{"$ref":"#/components/schemas/ServersNetworkMode"},"ports":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ServersCreateServerPortRequest"}}},"required":["ports"]},"ServersCreateServerPortRequest":{"type":"object","properties":{"protocol":{"$ref":"#/components/schemas/ServersPortProtocol"},"internal_port":{"type":"integer"},"routing":{"$ref":"#/components/schemas/ServersPortRouting"}},"required":["protocol"]},"ServersCreateServerResponse":{"type":"object","properties":{"server":{"$ref":"#/components/schemas/ServersServer","description":"The server that was created"}},"required":["server"]},"ServersDestroyServerResponse":{"type":"object","properties":{}},"ServersListServersResponse":{"type":"object","properties":{"servers":{"type":"array","items":{"$ref":"#/components/schemas/ServersServer"},"description":"A list of servers for the game associated with the token."}},"required":["servers"]},"ActorsActor":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"region":{"type":"string"},"tags":{},"runtime":{"$ref":"#/components/schemas/ActorsRuntime"},"network":{"$ref":"#/components/schemas/ActorsNetwork"},"resources":{"$ref":"#/components/schemas/ActorsResources"},"lifecycle":{"$ref":"#/components/schemas/ActorsLifecycle"},"created_at":{"$ref":"#/components/schemas/Timestamp"},"started_at":{"$ref":"#/components/schemas/Timestamp"},"destroyed_at":{"$ref":"#/components/schemas/Timestamp"}},"required":["id","region","tags","runtime","network","resources","lifecycle","created_at"]},"ActorsRuntime":{"type":"object","properties":{"build":{"type":"string","format":"uuid"},"arguments":{"type":"array","items":{"type":"string"}},"environment":{"type":"object","additionalProperties":{"type":"string"}}},"required":["build"]},"ActorsLifecycle":{"type":"object","properties":{"kill_timeout":{"type":"integer","format":"int64","description":"The duration to wait for in milliseconds before killing the actor. This should be set to a safe default, and can be overridden during a DELETE request if needed."},"durable":{"type":"boolean","description":"If true, the actor will try to reschedule itself automatically in the event of a crash or a datacenter failover. The actor will not reschedule if it exits successfully."}}},"ActorsResources":{"type":"object","properties":{"cpu":{"type":"integer","description":"The number of CPU cores in millicores, or 1/1000 of a core. For example,\n1/8 of a core would be 125 millicores, and 1 core would be 1000\nmillicores."},"memory":{"type":"integer","description":"The amount of memory in megabytes"}},"required":["cpu","memory"]},"ActorsNetwork":{"type":"object","properties":{"mode":{"$ref":"#/components/schemas/ActorsNetworkMode"},"ports":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ActorsPort"}}},"required":["mode","ports"]},"ActorsNetworkMode":{"type":"string","enum":["bridge","host"]},"ActorsPort":{"type":"object","properties":{"protocol":{"$ref":"#/components/schemas/ActorsPortProtocol"},"internal_port":{"type":"integer"},"hostname":{"type":"string"},"port":{"type":"integer"},"path":{"type":"string"},"url":{"type":"string","description":"Fully formed connection URL including protocol, hostname, port, and path, if applicable."},"routing":{"$ref":"#/components/schemas/ActorsPortRouting"}},"required":["protocol","routing"]},"ActorsPortProtocol":{"type":"string","enum":["http","https","tcp","tcp_tls","udp"]},"ActorsPortRouting":{"type":"object","properties":{"guard":{"$ref":"#/components/schemas/ActorsGuardRouting"},"host":{"$ref":"#/components/schemas/ActorsHostRouting"}}},"ActorsGuardRouting":{"type":"object","properties":{}},"ActorsHostRouting":{"type":"object","properties":{}},"ActorsEndpointType":{"type":"string","enum":["hostname","path"]},"ActorsGetActorLogsResponse":{"type":"object","properties":{"actor_ids":{"type":"array","items":{"type":"string"},"description":"List of actor IDs in these logs. The order of these correspond to the index in the log entry."},"lines":{"type":"array","items":{"type":"string"},"description":"Sorted old to new."},"timestamps":{"type":"array","items":{"$ref":"#/components/schemas/Timestamp"},"description":"Sorted old to new."},"streams":{"type":"array","items":{"type":"integer"},"description":"Streams the logs came from.\n\n0 = stdout\n1 = stderr"},"actor_indices":{"type":"array","items":{"type":"integer"},"description":"Index of the actor that this log was for. Use this index to look the full ID in `actor_ids`."},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["actor_ids","lines","timestamps","streams","actor_indices","watch"]},"ActorsExportActorLogsResponse":{"type":"object","properties":{"url":{"type":"string","description":"Presigned URL to download the exported logs"}},"required":["url"]},"ActorsGetActorMetricsResponse":{"type":"object","properties":{"actor_ids":{"type":"array","items":{"type":"string"}},"metric_names":{"type":"array","items":{"type":"string"}},"metric_attributes":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}}},"metric_types":{"type":"array","items":{"type":"string"}},"metric_values":{"type":"array","items":{"type":"array","items":{"type":"number","format":"double"}}}},"required":["actor_ids","metric_names","metric_attributes","metric_types","metric_values"]},"AuthCompleteStatus":{"type":"string","enum":["switch_identity","linked_account_added","already_complete","expired","too_many_attempts","incorrect"],"description":"Represents the state of an external account linking process."},"AuthIdentityStartEmailVerificationRequest":{"type":"object","properties":{"email":{"type":"string"},"captcha":{"$ref":"#/components/schemas/CaptchaConfig"},"game_id":{"type":"string","format":"uuid"}},"required":["email"]},"AuthIdentityStartEmailVerificationResponse":{"type":"object","properties":{"verification_id":{"type":"string","format":"uuid"}},"required":["verification_id"]},"AuthIdentityCompleteEmailVerificationRequest":{"type":"object","properties":{"verification_id":{"type":"string","format":"uuid"},"code":{"type":"string","description":"The code sent to the requestee's email."}},"required":["verification_id","code"]},"AuthIdentityCompleteEmailVerificationResponse":{"type":"object","properties":{"status":{"$ref":"#/components/schemas/AuthCompleteStatus"}},"required":["status"]},"AuthRefreshIdentityTokenRequest":{"type":"object","properties":{"logout":{"type":"boolean","description":"When `true`, the current identity for the provided cookie will be logged out and a new identity will be returned."}}},"AuthRefreshIdentityTokenResponse":{"type":"object","properties":{"token":{"type":"string","description":"A JSON Web Token.\nSlightly modified to include a description prefix and use Protobufs of\nJSON."},"exp":{"type":"string","description":"Token expiration time (in milliseconds)."},"identity_id":{"type":"string","format":"uuid"}},"required":["token","exp","identity_id"]},"BuildsBuild":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"created_at":{"$ref":"#/components/schemas/Timestamp"},"content_length":{"type":"integer","format":"int64","description":"Unsigned 64 bit integer."},"tags":{"type":"object","additionalProperties":{"type":"string"},"description":"Tags of this build"}},"required":["id","name","created_at","content_length","tags"]},"CaptchaConfig":{"type":"object","description":"Methods to verify a captcha","properties":{"hcaptcha":{"$ref":"#/components/schemas/CaptchaConfigHcaptcha"},"turnstile":{"$ref":"#/components/schemas/CaptchaConfigTurnstile"}}},"CaptchaConfigHcaptcha":{"type":"object","description":"Captcha configuration.","properties":{"client_response":{"type":"string"}},"required":["client_response"]},"CaptchaConfigTurnstile":{"type":"object","description":"Captcha configuration.","properties":{"client_response":{"type":"string"}},"required":["client_response"]},"CloudInspectResponse":{"type":"object","properties":{"agent":{"$ref":"#/components/schemas/CloudAuthAgent"}},"required":["agent"]},"CloudSvcPerf":{"type":"object","description":"A service performance summary.","properties":{"svc_name":{"type":"string","description":"The name of the service."},"ts":{"$ref":"#/components/schemas/Timestamp"},"duration":{"type":"integer","format":"int64","description":"Unsigned 64 bit integer."},"req_id":{"type":"string","format":"uuid"},"spans":{"type":"array","items":{"$ref":"#/components/schemas/CloudLogsPerfSpan"},"description":"A list of performance spans."},"marks":{"type":"array","items":{"$ref":"#/components/schemas/CloudLogsPerfMark"},"description":"A list of performance marks."}},"required":["svc_name","ts","duration","spans","marks"]},"CloudLogsPerfSpan":{"type":"object","description":"A performance span.","properties":{"label":{"type":"string","description":"The label given to this performance span."},"start_ts":{"$ref":"#/components/schemas/Timestamp"},"finish_ts":{"$ref":"#/components/schemas/Timestamp"},"req_id":{"type":"string","format":"uuid"}},"required":["label","start_ts"]},"CloudLogsPerfMark":{"type":"object","description":"A performance mark.","properties":{"label":{"type":"string","description":"The label given to this performance mark."},"ts":{"$ref":"#/components/schemas/Timestamp"},"ray_id":{"type":"string","format":"uuid"},"req_id":{"type":"string","format":"uuid"}},"required":["label","ts"]},"CloudLobbySummaryAnalytics":{"type":"object","description":"Analytical information about a lobby.","properties":{"lobby_id":{"type":"string","format":"uuid"},"lobby_group_id":{"type":"string","format":"uuid"},"lobby_group_name_id":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."},"region_id":{"type":"string","format":"uuid"},"create_ts":{"$ref":"#/components/schemas/Timestamp"},"is_ready":{"type":"boolean","description":"Whether or not this lobby is ready."},"is_idle":{"type":"boolean","description":"Whether or not this lobby is idle."},"is_closed":{"type":"boolean","description":"Whether or not this lobby is in a closed state."},"is_outdated":{"type":"boolean","description":"Whether or not this lobby is outdated."},"max_players_normal":{"type":"integer","description":"Unsigned 32 bit integer."},"max_players_direct":{"type":"integer","description":"Unsigned 32 bit integer."},"max_players_party":{"type":"integer","description":"Unsigned 32 bit integer."},"total_player_count":{"type":"integer","description":"Unsigned 32 bit integer."},"registered_player_count":{"type":"integer","description":"Unsigned 32 bit integer."}},"required":["lobby_id","lobby_group_id","lobby_group_name_id","region_id","create_ts","is_ready","is_idle","is_closed","is_outdated","max_players_normal","max_players_direct","max_players_party","total_player_count","registered_player_count"]},"CloudLogsLobbySummary":{"type":"object","description":"A logs summary for a lobby.","properties":{"lobby_id":{"type":"string","format":"uuid"},"namespace_id":{"type":"string","format":"uuid"},"lobby_group_name_id":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."},"region_id":{"type":"string","format":"uuid"},"create_ts":{"$ref":"#/components/schemas/Timestamp"},"start_ts":{"$ref":"#/components/schemas/Timestamp"},"ready_ts":{"$ref":"#/components/schemas/Timestamp"},"status":{"$ref":"#/components/schemas/CloudLogsLobbyStatus"}},"required":["lobby_id","namespace_id","lobby_group_name_id","region_id","create_ts","status"]},"CloudLogsLobbyStatus":{"type":"object","description":"A union representing the state of a lobby.","properties":{"running":{"$ref":"#/components/schemas/EmptyObject"},"stopped":{"$ref":"#/components/schemas/CloudLogsLobbyStatusStopped"}},"required":["running"]},"CloudLogsLobbyStatusStopped":{"type":"object","description":"The status of a stopped lobby.","properties":{"stop_ts":{"$ref":"#/components/schemas/Timestamp"},"failed":{"type":"boolean","description":"Whether or not the lobby failed or stopped successfully."},"exit_code":{"type":"integer","description":"The exit code returned by the lobby's main process when stopped."}},"required":["stop_ts","failed","exit_code"]},"CloudSvcMetrics":{"type":"object","description":"Metrics relating to a job service.","properties":{"job":{"type":"string","description":"The job name."},"cpu":{"type":"array","items":{"type":"number","format":"double"},"description":"CPU metrics."},"memory":{"type":"array","items":{"type":"number","format":"double"},"description":"Memory metrics."},"allocated_memory":{"type":"number","format":"double","description":"Total allocated memory (MB)."}},"required":["job","cpu","memory"]},"CloudAuthAgent":{"type":"object","description":"The current authenticated agent.","properties":{"identity":{"$ref":"#/components/schemas/CloudAuthAgentIdentity"},"game_cloud":{"$ref":"#/components/schemas/CloudAuthAgentGameCloud"}}},"CloudAuthAgentIdentity":{"type":"object","description":"The current authenticated identity.","properties":{"identity_id":{"type":"string","format":"uuid"}},"required":["identity_id"]},"CloudAuthAgentGameCloud":{"type":"object","description":"The current authenticated game cloud.","properties":{"game_id":{"type":"string","format":"uuid"}},"required":["game_id"]},"CloudCustomAvatarSummary":{"type":"object","description":"A custom avatar summary.","properties":{"upload_id":{"type":"string","format":"uuid"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"create_ts":{"$ref":"#/components/schemas/Timestamp"},"url":{"type":"string","description":"The URL of this custom avatar image. Only present if upload is complete."},"content_length":{"type":"integer","format":"int64","description":"Unsigned 64 bit integer."},"complete":{"type":"boolean","description":"Whether or not this custom avatar has completely been uploaded."}},"required":["upload_id","display_name","create_ts","content_length","complete"]},"CloudBuildSummary":{"type":"object","description":"A build summary.","properties":{"build_id":{"type":"string","format":"uuid"},"upload_id":{"type":"string","format":"uuid"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"create_ts":{"$ref":"#/components/schemas/Timestamp"},"content_length":{"type":"integer","format":"int64","description":"Unsigned 64 bit integer."},"complete":{"type":"boolean","description":"Whether or not this build has completely been uploaded."},"tags":{"type":"object","additionalProperties":{"type":"string"},"description":"Tags of this build"}},"required":["build_id","upload_id","display_name","create_ts","content_length","complete","tags"]},"CloudCdnSiteSummary":{"type":"object","description":"A CDN site summary.","properties":{"site_id":{"type":"string","format":"uuid"},"upload_id":{"type":"string","format":"uuid"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"create_ts":{"$ref":"#/components/schemas/Timestamp"},"content_length":{"type":"integer","format":"int64","description":"Unsigned 64 bit integer."},"complete":{"type":"boolean","description":"Whether or not this site has completely been uploaded."}},"required":["site_id","upload_id","display_name","create_ts","content_length","complete"]},"CloudGameFull":{"type":"object","description":"A full game.","properties":{"game_id":{"type":"string","format":"uuid"},"create_ts":{"$ref":"#/components/schemas/Timestamp"},"name_id":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."},"display_name":{"$ref":"#/components/schemas/DisplayName"},"developer_group_id":{"type":"string","format":"uuid"},"total_player_count":{"type":"integer","description":"Unsigned 32 bit integer."},"logo_url":{"type":"string","description":"The URL of this game's logo image."},"banner_url":{"type":"string","description":"The URL of this game's banner image."},"namespaces":{"type":"array","items":{"$ref":"#/components/schemas/CloudNamespaceSummary"},"description":"A list of namespace summaries."},"versions":{"type":"array","items":{"$ref":"#/components/schemas/CloudVersionSummary"},"description":"A list of version summaries."},"available_regions":{"type":"array","items":{"$ref":"#/components/schemas/CloudRegionSummary"},"description":"A list of region summaries."}},"required":["game_id","create_ts","name_id","display_name","developer_group_id","total_player_count","namespaces","versions","available_regions"]},"CloudNamespaceSummary":{"type":"object","description":"A namespace summary.","properties":{"namespace_id":{"type":"string","format":"uuid"},"create_ts":{"$ref":"#/components/schemas/Timestamp"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"version_id":{"type":"string","format":"uuid"},"name_id":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."}},"required":["namespace_id","create_ts","display_name","version_id","name_id"]},"CloudRegionSummary":{"type":"object","description":"A region summary.","properties":{"region_id":{"type":"string","format":"uuid"},"region_name_id":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."},"provider":{"type":"string","description":"The server provider of this region."},"universal_region":{"$ref":"#/components/schemas/CloudUniversalRegion","description":"**Deprecated**\nA universal region label given to this region."},"provider_display_name":{"$ref":"#/components/schemas/DisplayName"},"region_display_name":{"$ref":"#/components/schemas/DisplayName"}},"required":["region_id","region_name_id","provider","universal_region","provider_display_name","region_display_name"]},"CloudGameLobbyExpenses":{"type":"object","description":"Game lobby expenses.","properties":{"game":{"$ref":"#/components/schemas/GameHandle"},"namespaces":{"type":"array","items":{"$ref":"#/components/schemas/CloudNamespaceSummary"},"description":"A list of namespace summaries."},"expenses":{"type":"array","items":{"$ref":"#/components/schemas/CloudRegionTierExpenses"},"description":"A list of multiple region tier expenses."}},"required":["game","namespaces","expenses"]},"CloudRegionTierExpenses":{"type":"object","description":"Region tier expenses.","properties":{"namespace_id":{"type":"string","format":"uuid"},"region_id":{"type":"string","format":"uuid"},"tier_name_id":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."},"lobby_group_name_id":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."},"uptime":{"type":"number","format":"double","description":"How long a region tier has been active (in milliseconds)."},"expenses":{"type":"number","format":"double","description":"Amount of expenses for this region tier (in hundred-thousandths USD, 100,000 = $1.00)."}},"required":["namespace_id","region_id","tier_name_id","lobby_group_name_id","uptime","expenses"]},"CloudGroupBankSource":{"type":"object","properties":{"account_number":{"type":"string","description":"The bank account number of this group's bank source."},"routing_number":{"type":"string","description":"The bank routing number of this group's bank source."}},"required":["account_number","routing_number"]},"CloudRegionTier":{"type":"object","description":"A region server tier.","properties":{"tier_name_id":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."},"rivet_cores_numerator":{"type":"integer","description":"Together with the denominator, denotes the portion of the CPU a given server uses."},"rivet_cores_denominator":{"type":"integer","description":"Together with the numerator, denotes the portion of the CPU a given server uses."},"cpu":{"type":"integer","description":"CPU frequency (MHz)."},"memory":{"type":"integer","description":"Allocated memory (MB)."},"disk":{"type":"integer","description":"Allocated disk space (MB)."},"bandwidth":{"type":"integer","description":"Internet bandwidth (MB)."},"price_per_second":{"type":"integer","description":"**Deprecated**\nPrice billed for every second this server is running (in quadrillionth USD, 1,000,000,000,000 = $1.00)."}},"required":["tier_name_id","rivet_cores_numerator","rivet_cores_denominator","cpu","memory","disk","bandwidth","price_per_second"]},"CloudUniversalRegion":{"type":"string","enum":["unknown","local","amsterdam","atlanta","bangalore","dallas","frankfurt","london","mumbai","newark","new_york_city","san_francisco","singapore","sydney","tokyo","toronto","washington_dc","chicago","paris","seattle","sao_paulo","stockholm","chennai","osaka","milan","miami","jakarta","los_angeles"],"description":"**Deprecated**"},"CloudNamespaceFull":{"type":"object","description":"A full namespace.","properties":{"namespace_id":{"type":"string","format":"uuid"},"create_ts":{"$ref":"#/components/schemas/Timestamp"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"version_id":{"type":"string","format":"uuid"},"name_id":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."},"config":{"$ref":"#/components/schemas/CloudNamespaceConfig"}},"required":["namespace_id","create_ts","display_name","version_id","name_id","config"]},"CloudNamespaceConfig":{"type":"object","description":"Cloud configuration for a given namespace.","properties":{"cdn":{"$ref":"#/components/schemas/CloudCdnNamespaceConfig"},"matchmaker":{"$ref":"#/components/schemas/CloudMatchmakerNamespaceConfig"},"kv":{"$ref":"#/components/schemas/CloudKvNamespaceConfig"},"identity":{"$ref":"#/components/schemas/CloudIdentityNamespaceConfig"}},"required":["cdn","matchmaker","kv","identity"]},"CloudCdnNamespaceConfig":{"type":"object","description":"CDN configuration for a given namespace.","properties":{"enable_domain_public_auth":{"type":"boolean","description":"Whether or not to allow users to connect to the given namespace via domain name."},"domains":{"type":"array","items":{"$ref":"#/components/schemas/CloudCdnNamespaceDomain"},"description":"A list of CDN domains for a given namespace."},"auth_type":{"$ref":"#/components/schemas/CloudCdnAuthType"},"auth_user_list":{"type":"array","items":{"$ref":"#/components/schemas/CloudCdnNamespaceAuthUser"},"description":"A list of CDN authenticated users for a given namespace."}},"required":["enable_domain_public_auth","domains","auth_type","auth_user_list"]},"CloudMatchmakerNamespaceConfig":{"type":"object","description":"Matchmaker configuration for a given namespace.","properties":{"lobby_count_max":{"type":"integer","description":"Unsigned 32 bit integer."},"max_players_per_client":{"type":"integer","description":"Unsigned 32 bit integer."},"max_players_per_client_vpn":{"type":"integer","description":"Unsigned 32 bit integer."},"max_players_per_client_proxy":{"type":"integer","description":"Unsigned 32 bit integer."},"max_players_per_client_tor":{"type":"integer","description":"Unsigned 32 bit integer."},"max_players_per_client_hosting":{"type":"integer","description":"Unsigned 32 bit integer."}},"required":["lobby_count_max","max_players_per_client","max_players_per_client_vpn","max_players_per_client_proxy","max_players_per_client_tor","max_players_per_client_hosting"]},"CloudKvNamespaceConfig":{"type":"object","description":"KV configuration for a given namespace.","properties":{}},"CloudIdentityNamespaceConfig":{"type":"object","description":"Identity configuration for a given namespace.","properties":{}},"CloudCdnAuthType":{"type":"string","enum":["none","basic"],"description":"A value denoting what type of authentication to use for a game namespace's CDN."},"CloudCdnNamespaceDomain":{"type":"object","description":"A CDN domain for a given namespace.","properties":{"domain":{"type":"string","description":"A valid domain name (no protocol)."},"create_ts":{"$ref":"#/components/schemas/Timestamp"},"verification_status":{"$ref":"#/components/schemas/CloudCdnNamespaceDomainVerificationStatus"},"verification_method":{"$ref":"#/components/schemas/CloudCdnNamespaceDomainVerificationMethod"},"verification_errors":{"type":"array","items":{"type":"string"}}},"required":["domain","create_ts","verification_status","verification_method","verification_errors"]},"CloudCdnNamespaceDomainVerificationMethod":{"type":"object","description":"A union representing the verification method used for this CDN domain.","properties":{"invalid":{"$ref":"#/components/schemas/EmptyObject"},"http":{"$ref":"#/components/schemas/CloudCdnNamespaceDomainVerificationMethodHttp"}}},"CloudCdnNamespaceDomainVerificationMethodHttp":{"type":"object","properties":{"cname_record":{"type":"string"}},"required":["cname_record"]},"CloudCdnNamespaceDomainVerificationStatus":{"type":"string","enum":["active","pending","failed"],"description":"A value denoting the status of a CDN domain's verification status."},"CloudCdnNamespaceAuthUser":{"type":"object","description":"An authenticated CDN user for a given namespace.","properties":{"user":{"type":"string","description":"A user name."}},"required":["user"]},"CloudMatchmakerDevelopmentPort":{"type":"object","description":"A port configuration used to create development tokens.","properties":{"port":{"type":"integer"},"port_range":{"$ref":"#/components/schemas/CloudVersionMatchmakerPortRange"},"protocol":{"$ref":"#/components/schemas/CloudVersionMatchmakerPortProtocol"}},"required":["protocol"]},"CloudNamespaceVersion":{"type":"object","description":"A previously deployed namespace version.","properties":{"namespace_id":{"type":"string","description":"A universally unique identifier."},"version_id":{"type":"string","description":"A universally unique identifier."},"deploy_ts":{"$ref":"#/components/schemas/Timestamp"}},"required":["namespace_id","version_id","deploy_ts"]},"CloudDevicesPrepareDeviceLinkResponse":{"type":"object","properties":{"device_link_id":{"type":"string","format":"uuid"},"device_link_token":{"type":"string"},"device_link_url":{"type":"string"}},"required":["device_link_id","device_link_token","device_link_url"]},"CloudDevicesGetDeviceLinkResponse":{"type":"object","properties":{"cloud_token":{"type":"string"},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["watch"]},"CloudDevicesCompleteDeviceLinkRequest":{"type":"object","properties":{"device_link_token":{"$ref":"#/components/schemas/Jwt"},"game_id":{"type":"string","format":"uuid"}},"required":["device_link_token","game_id"]},"CloudGamesListGameCustomAvatarsResponse":{"type":"object","properties":{"custom_avatars":{"type":"array","items":{"$ref":"#/components/schemas/CloudCustomAvatarSummary"},"description":"A list of custom avatar summaries."}},"required":["custom_avatars"]},"CloudGamesPrepareCustomAvatarUploadRequest":{"type":"object","properties":{"path":{"type":"string","description":"The path/filename of the custom avatar."},"mime":{"type":"string","description":"The MIME type of the custom avatar."},"content_length":{"type":"integer","format":"int64","description":"Unsigned 64 bit integer."}},"required":["path","content_length"]},"CloudGamesPrepareCustomAvatarUploadResponse":{"type":"object","properties":{"upload_id":{"type":"string","format":"uuid"},"presigned_request":{"$ref":"#/components/schemas/UploadPresignedRequest"}},"required":["upload_id","presigned_request"]},"CloudGamesListGameBuildsResponse":{"type":"object","properties":{"builds":{"type":"array","items":{"$ref":"#/components/schemas/CloudBuildSummary"},"description":"A list of build summaries."}},"required":["builds"]},"CloudGamesCreateGameBuildRequest":{"type":"object","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"},"image_tag":{"type":"string","description":"A tag given to the game build."},"image_file":{"$ref":"#/components/schemas/UploadPrepareFile"},"multipart_upload":{"type":"boolean"},"kind":{"$ref":"#/components/schemas/CloudGamesBuildKind"},"compression":{"$ref":"#/components/schemas/CloudGamesBuildCompression"}},"required":["display_name","image_tag","image_file"]},"CloudGamesCreateGameBuildResponse":{"type":"object","properties":{"build_id":{"type":"string","format":"uuid"},"upload_id":{"type":"string","format":"uuid"},"image_presigned_request":{"$ref":"#/components/schemas/UploadPresignedRequest"},"image_presigned_requests":{"type":"array","items":{"$ref":"#/components/schemas/UploadPresignedRequest"}}},"required":["build_id","upload_id"]},"CloudGamesBuildKind":{"type":"string","enum":["docker_image","oci_bundle"]},"CloudGamesBuildCompression":{"type":"string","enum":["none","lz4"]},"CloudGamesListGameCdnSitesResponse":{"type":"object","properties":{"sites":{"type":"array","items":{"$ref":"#/components/schemas/CloudCdnSiteSummary"},"description":"A list of CDN site summaries."}},"required":["sites"]},"CloudGamesCreateGameCdnSiteRequest":{"type":"object","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"},"files":{"type":"array","items":{"$ref":"#/components/schemas/UploadPrepareFile"},"description":"A list of files preparing to upload."}},"required":["display_name","files"]},"CloudGamesCreateGameCdnSiteResponse":{"type":"object","properties":{"site_id":{"type":"string","format":"uuid"},"upload_id":{"type":"string","format":"uuid"},"presigned_requests":{"type":"array","items":{"$ref":"#/components/schemas/UploadPresignedRequest"}}},"required":["site_id","upload_id","presigned_requests"]},"CloudGamesExportMatchmakerLobbyHistoryRequest":{"type":"object","properties":{"query_start":{"type":"integer","format":"int64","description":"Unsigned 64 bit integer."},"query_end":{"type":"integer","format":"int64","description":"Unsigned 64 bit integer."}},"required":["query_start","query_end"]},"CloudGamesExportMatchmakerLobbyHistoryResponse":{"type":"object","properties":{"url":{"type":"string","description":"The URL to a CSV file for the given lobby history."}},"required":["url"]},"CloudGamesDeleteMatchmakerLobbyResponse":{"type":"object","properties":{"did_remove":{"type":"boolean","description":"Whether or not the lobby was successfully stopped."}},"required":["did_remove"]},"CloudGamesGetLobbyLogsResponse":{"type":"object","properties":{"lines":{"type":"array","items":{"type":"string"},"description":"Sorted old to new."},"timestamps":{"type":"array","items":{"type":"string"},"description":"Sorted old to new."},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["lines","timestamps","watch"]},"CloudGamesExportLobbyLogsRequest":{"type":"object","properties":{"stream":{"$ref":"#/components/schemas/CloudGamesLogStream"}},"required":["stream"]},"CloudGamesExportLobbyLogsResponse":{"type":"object","properties":{"url":{"type":"string","description":"The URL to a CSV file for the given lobby history."}},"required":["url"]},"CloudGamesLogStream":{"type":"string","enum":["std_out","std_err"]},"CloudGamesNamespacesGetAnalyticsMatchmakerLiveResponse":{"type":"object","properties":{"lobbies":{"type":"array","items":{"$ref":"#/components/schemas/CloudLobbySummaryAnalytics"},"description":"A list of analytics lobby summaries."}},"required":["lobbies"]},"CloudGamesNamespacesListNamespaceLobbiesResponse":{"type":"object","properties":{"lobbies":{"type":"array","items":{"$ref":"#/components/schemas/CloudLogsLobbySummary"},"description":"A list of lobby log summaries."}},"required":["lobbies"]},"CloudGamesNamespacesGetNamespaceLobbyResponse":{"type":"object","properties":{"lobby":{"$ref":"#/components/schemas/CloudLogsLobbySummary"},"metrics":{"$ref":"#/components/schemas/CloudSvcMetrics"},"stdout_presigned_urls":{"type":"array","items":{"type":"string"},"description":"**Deprecated**\nA list of URLs."},"stderr_presigned_urls":{"type":"array","items":{"type":"string"},"description":"**Deprecated**\nA list of URLs."},"perf_lists":{"type":"array","items":{"$ref":"#/components/schemas/CloudSvcPerf"},"description":"**Deprecated**\nA list of service performance summaries."}},"required":["lobby","stdout_presigned_urls","stderr_presigned_urls","perf_lists"]},"CloudGamesCreateCloudTokenResponse":{"type":"object","properties":{"token":{"type":"string","description":"A JSON Web Token.\nSlightly modified to include a description prefix and use Protobufs of\nJSON."}},"required":["token"]},"CloudGamesCreateGameVersionRequest":{"type":"object","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"},"config":{"$ref":"#/components/schemas/CloudVersionConfig"}},"required":["display_name","config"]},"CloudGamesCreateGameVersionResponse":{"type":"object","properties":{"version_id":{"type":"string","format":"uuid"}},"required":["version_id"]},"CloudGamesReserveVersionNameResponse":{"type":"object","properties":{"version_display_name":{"$ref":"#/components/schemas/DisplayName"}},"required":["version_display_name"]},"CloudGamesValidateGameVersionRequest":{"type":"object","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"},"config":{"$ref":"#/components/schemas/CloudVersionConfig"}},"required":["display_name","config"]},"CloudGamesValidateGameVersionResponse":{"type":"object","properties":{"errors":{"type":"array","items":{"$ref":"#/components/schemas/ValidationError"},"description":"A list of validation errors."}},"required":["errors"]},"CloudGamesGetGameVersionByIdResponse":{"type":"object","properties":{"version":{"$ref":"#/components/schemas/CloudVersionFull"}},"required":["version"]},"CloudValidateGroupRequest":{"type":"object","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"}},"required":["display_name"]},"CloudValidateGroupResponse":{"type":"object","properties":{"errors":{"type":"array","items":{"$ref":"#/components/schemas/ValidationError"},"description":"A list of validation errors."}},"required":["errors"]},"CloudGetRayPerfLogsResponse":{"type":"object","properties":{"perf_lists":{"type":"array","items":{"$ref":"#/components/schemas/CloudSvcPerf"},"description":"A list of service performance summaries."}},"required":["perf_lists"]},"CloudGetRegionTiersResponse":{"type":"object","properties":{"tiers":{"type":"array","items":{"$ref":"#/components/schemas/CloudRegionTier"},"description":"A list of region server tiers."}},"required":["tiers"]},"CloudVersionEngineCustomConfig":{"type":"object","properties":{}},"CloudVersionEngineGodotConfig":{"type":"object","properties":{}},"CloudVersionEngineHtml5Config":{"type":"object","properties":{}},"CloudVersionEngineUnityConfig":{"type":"object","properties":{}},"CloudVersionEngineUnrealConfig":{"type":"object","properties":{"game_module":{"type":"string","description":"Name of the Unreal module that holds the game code.\nThis is usually the value of `$.Modules[0].Name` in the file `MyProject.unproject`.\n_Configures Rivet CLI behavior. Has no effect on server behavior._"}},"required":["game_module"]},"CloudVersionMatchmakerPortRange":{"type":"object","description":"Range of ports that can be connected to.\nIf configured, `network_mode` must equal `host`.\nPort ranges may overlap between containers, it is the responsibility of the developer to ensure ports are available before using.\nRead more about host networking [here](https://rivet.gg/docs/dynamic-servers/concepts/host-bridge-networking).\nOnly available on Rivet Open Source & Enterprise.\n\n### Related\n\n- cloud.version.matchmaker.PortProtocol\n- cloud.version.matchmaker.ProxyKind","properties":{"min":{"type":"integer","description":"Unsigned 32 bit integer."},"max":{"type":"integer","description":"Unsigned 32 bit integer."}},"required":["min","max"]},"CloudVersionMatchmakerPortProtocol":{"type":"string","enum":["http","https","tcp","tcp_tls","udp"],"description":"Signifies the protocol of the port.\nNote that when proxying through GameGuard (via `ProxyKind`), the port number returned by `/find`, `/join`, and `/create` will not be the same as the port number configured in the config:\n\n- With HTTP, the port will always be 80. The hostname of the port correctly routes the incoming\n connection to the correct port being used by the game server.\n- With HTTPS, the port will always be 443. The hostname of the port correctly routes the incoming\n connection to the correct port being used by the game server.\n- Using TCP/UDP, the port will be a random number between 26000 and 31999. This gets automatically\n routed to the correct port being used by the game server.\n\n### Related - cloud.version.matchmaker.GameModeRuntimeDockerPort - cloud.version.matchmaker.ProxyKind - /docs/dynamic-servers/concepts/game-guard - matchmaker.lobbies.find"},"CloudVersionMatchmakerProxyKind":{"type":"string","enum":["none","game_guard"],"description":"Range of ports that can be connected to.\n`game_guard` (default) proxies all traffic through [Game Guard](https://rivet.gg/docs/dynamic-servers/concepts/game-guard) to mitigate DDoS attacks and provide TLS termination.\n`none` sends traffic directly to the game server. If configured, `network_mode` must equal `host`. Read more about host networking [here](https://rivet.gg/docs/dynamic-servers/concepts/host-bridge-networking). Only available on Rivet Open Source & Enterprise.\n\n### Related - /docs/dynamic-servers/concepts/game-guard - cloud.version.matchmaker.PortProtocol"},"CloudVersionMatchmakerCaptcha":{"type":"object","description":"Matchmaker captcha configuration.","properties":{"requests_before_reverify":{"type":"integer","description":"Denotes how many requests a connection can make before it is required to reverify a captcha."},"verification_ttl":{"type":"integer","format":"int64","description":"Denotes how long a connection can continue to reconnect without having to reverify a captcha (in milliseconds)."},"hcaptcha":{"$ref":"#/components/schemas/CloudVersionMatchmakerCaptchaHcaptcha"},"turnstile":{"$ref":"#/components/schemas/CloudVersionMatchmakerCaptchaTurnstile"}},"required":["requests_before_reverify","verification_ttl"]},"CloudVersionMatchmakerCaptchaHcaptcha":{"type":"object","description":"hCpatcha configuration.","properties":{"level":{"$ref":"#/components/schemas/CloudVersionMatchmakerCaptchaHcaptchaLevel","description":"**Deprecated**"},"site_key":{"type":"string","description":"Site key for your hCaptcha application. Must be set."},"secret_key":{"type":"string","description":"Secret key for your hCaptcha application. Must be set."}}},"CloudVersionMatchmakerCaptchaHcaptchaLevel":{"type":"string","enum":["easy","moderate","difficult","always_on"],"description":"**Deprecated**\nHow hard a captcha should be."},"CloudVersionMatchmakerCaptchaTurnstile":{"type":"object","description":"Turnstile captcha configuration.","properties":{"site_key":{"type":"string"},"secret_key":{"type":"string"}},"required":["site_key","secret_key"]},"CloudVersionMatchmakerNetworkMode":{"type":"string","enum":["bridge","host"],"description":"Configures how the container's network is isolated from the host.\n`bridge` (default) networking isolates the container's network from the host & other containers.\n`host` networking removes isolation between the container and the host. Only available in Rivet Open Source & Enterprise.\nRead more about bridge vs host networking [here](https://rivet.gg/docs/dynamic-servers/concepts/host-bridge-networking)."},"CloudVersionMatchmakerGameMode":{"type":"object","description":"A game mode.","properties":{"regions":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeRegion"}},"max_players":{"type":"integer"},"max_players_direct":{"type":"integer"},"max_players_party":{"type":"integer"},"docker":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeRuntimeDocker"},"listable":{"type":"boolean"},"taggable":{"type":"boolean"},"allow_dynamic_max_players":{"type":"boolean"},"actions":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeActions"},"tier":{"type":"string"},"idle_lobbies":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeIdleLobbiesConfig"}}},"CloudVersionMatchmakerGameModeRegion":{"type":"object","description":"A game mode region.","properties":{"tier":{"type":"string"},"idle_lobbies":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeIdleLobbiesConfig"}}},"CloudVersionMatchmakerGameModeRuntimeDocker":{"type":"object","description":"A game mode runtime running through Docker.","properties":{"dockerfile":{"type":"string","description":"_Configures Rivet CLI behavior. Has no effect on server behavior._"},"build_args":{"type":"object","additionalProperties":{"type":"string"},"description":"_Configures Rivet CLI behavior. Has no effect on server behavior._"},"image":{"type":"string","description":"_Configures Rivet CLI behavior. Has no effect on server behavior._"},"image_id":{"type":"string","format":"uuid"},"args":{"type":"array","items":{"type":"string"}},"env":{"type":"object","additionalProperties":{"type":"string"}},"network_mode":{"$ref":"#/components/schemas/CloudVersionMatchmakerNetworkMode"},"ports":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeRuntimeDockerPort"}}}},"CloudVersionMatchmakerGameModeRuntimeDockerPort":{"type":"object","description":"Port config for a docker build.","properties":{"port":{"type":"integer","description":"The port number to connect to.\n\n### Related - cloud.version.matchmaker.PortProtocol - cloud.version.matchmaker.ProxyKind"},"port_range":{"$ref":"#/components/schemas/CloudVersionMatchmakerPortRange"},"protocol":{"$ref":"#/components/schemas/CloudVersionMatchmakerPortProtocol"},"proxy":{"$ref":"#/components/schemas/CloudVersionMatchmakerProxyKind","description":"How this port should be proxied. Defaults to 'game-guard`."},"dev_port":{"type":"integer","description":"_Configures Rivet CLI behavior. Has no effect on server behavior._"},"dev_port_range":{"$ref":"#/components/schemas/CloudVersionMatchmakerPortRange","description":"_Configures Rivet CLI behavior. Has no effect on server behavior._"},"dev_protocol":{"$ref":"#/components/schemas/CloudVersionMatchmakerPortProtocol","description":"_Configures Rivet CLI behavior. Has no effect on server behavior._"}}},"CloudVersionMatchmakerGameModeIdleLobbiesConfig":{"type":"object","description":"Configuration for how many idle lobbies a game version should have.","properties":{"min":{"type":"integer"},"max":{"type":"integer"}},"required":["min","max"]},"CloudVersionMatchmakerGameModeActions":{"type":"object","description":"Configuration for the connection types allowed for a game mode.","properties":{"find":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeFindConfig"},"join":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeJoinConfig"},"create":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeCreateConfig"}}},"CloudVersionMatchmakerGameModeIdentityRequirement":{"type":"string","enum":["none","guest","registered"],"description":"**Deprecated**\nThe registration requirement for a user when joining/finding/creating a lobby. \"None\" allows for connections without an identity."},"CloudVersionMatchmakerGameModeVerificationConfig":{"type":"object","description":"Configuration that tells Rivet where to send validation requests and with what headers. When set, Rivet will send the `verification_data` property (given by the user in the find/join/create endpoint) to the given url along with the headers provided and some information about the requested lobby. The response of this request will determine if the user can join that lobby or not.","properties":{"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["url","headers"]},"CloudVersionMatchmakerGameModeFindConfig":{"type":"object","description":"Configures the requirements and authentication for the /find endpoint. If this value is not set in the config, the /find endpoint is still enabled.","properties":{"enabled":{"type":"boolean","description":"Sets whether or not the /find endpoint is enabled."},"identity_requirement":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeIdentityRequirement"},"verification":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeVerificationConfig"}},"required":["enabled"]},"CloudVersionMatchmakerGameModeJoinConfig":{"type":"object","description":"Configures the requirements and authentication for the /join endpoint. If this value is not set in the config, the /join endpoint is still enabled.","properties":{"enabled":{"type":"boolean","description":"Sets whether or not the /join endpoint is enabled."},"identity_requirement":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeIdentityRequirement"},"verification":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeVerificationConfig"}},"required":["enabled"]},"CloudVersionMatchmakerGameModeCreateConfig":{"type":"object","description":"Configures the requirements and authentication for the /create endpoint. If this value is not set in the config, the /create endpoint is NOT enabled.","properties":{"enabled":{"type":"boolean","description":"Sets whether or not the /create endpoint is enabled."},"identity_requirement":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeIdentityRequirement"},"verification":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeVerificationConfig"},"enable_public":{"type":"boolean","description":"Defaults to false when unset."},"enable_private":{"type":"boolean","description":"Defaults to true when unset."},"max_lobbies_per_identity":{"type":"integer","description":"**Deprecated**"}},"required":["enabled"]},"CloudVersionMatchmakerLobbyGroup":{"type":"object","description":"A game mode.","properties":{"name_id":{"type":"string","description":"**Deprecated: use GameMode instead**\nA human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."},"regions":{"type":"array","items":{"$ref":"#/components/schemas/CloudVersionMatchmakerLobbyGroupRegion"},"description":"A list of game mode regions."},"max_players_normal":{"type":"integer","description":"Unsigned 32 bit integer."},"max_players_direct":{"type":"integer","description":"Unsigned 32 bit integer."},"max_players_party":{"type":"integer","description":"Unsigned 32 bit integer."},"runtime":{"$ref":"#/components/schemas/CloudVersionMatchmakerLobbyGroupRuntime"}},"required":["name_id","regions","max_players_normal","max_players_direct","max_players_party","runtime"]},"CloudVersionMatchmakerLobbyGroupRuntime":{"type":"object","description":"**Deprecated: use GameMode instead**\nA union representing the runtime a game mode runs on.","properties":{"docker":{"$ref":"#/components/schemas/CloudVersionMatchmakerLobbyGroupRuntimeDocker"}}},"CloudVersionMatchmakerLobbyGroupRegion":{"type":"object","description":"**Deprecated: use GameMode instead**\nA game mode region.","properties":{"region_id":{"type":"string","format":"uuid"},"tier_name_id":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."},"idle_lobbies":{"$ref":"#/components/schemas/CloudVersionMatchmakerLobbyGroupIdleLobbiesConfig"}},"required":["region_id","tier_name_id"]},"CloudVersionMatchmakerLobbyGroupRuntimeDocker":{"type":"object","description":"**Deprecated: use GameMode instead**\nA game mode runtime running through Docker.","properties":{"build_id":{"type":"string","format":"uuid"},"args":{"type":"array","items":{"type":"string"}},"env_vars":{"type":"array","items":{"$ref":"#/components/schemas/CloudVersionMatchmakerLobbyGroupRuntimeDockerEnvVar"}},"network_mode":{"$ref":"#/components/schemas/CloudVersionMatchmakerNetworkMode"},"ports":{"type":"array","items":{"$ref":"#/components/schemas/CloudVersionMatchmakerLobbyGroupRuntimeDockerPort"}}},"required":["args","env_vars","ports"]},"CloudVersionMatchmakerLobbyGroupRuntimeDockerEnvVar":{"type":"object","description":"**Deprecated: use GameMode instead**\nA docker environment variable.","properties":{"key":{"type":"string"},"value":{"type":"string"}},"required":["key","value"]},"CloudVersionMatchmakerLobbyGroupRuntimeDockerPort":{"type":"object","description":"**Deprecated: use GameMode instead**\nA docker port.","properties":{"label":{"type":"string","description":"The label of this docker port."},"target_port":{"type":"integer","description":"The port number to connect to."},"port_range":{"$ref":"#/components/schemas/CloudVersionMatchmakerPortRange"},"proxy_protocol":{"$ref":"#/components/schemas/CloudVersionMatchmakerPortProtocol"}},"required":["label","proxy_protocol"]},"CloudVersionMatchmakerLobbyGroupIdleLobbiesConfig":{"type":"object","description":"**Deprecated: use GameMode instead**\nConfiguration for how many idle lobbies a game version should have.","properties":{"min_idle_lobbies":{"type":"integer","description":"Unsigned 32 bit integer."},"max_idle_lobbies":{"type":"integer","description":"Unsigned 32 bit integer."}},"required":["min_idle_lobbies","max_idle_lobbies"]},"Identifier":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `uuid` because this is intended to be human readable. Different than `DisplayName` because this should not include special characters and be short."},"Bio":{"type":"string","description":"Follows regex ^(?:[^\\n\\r]+\\n?|\\n){1,5}$"},"Email":{"type":"string","description":"A valid email address"},"Jwt":{"type":"string","description":"Documentation at https://jwt.io/"},"WatchQuery":{"type":"string","description":"A query parameter denoting the requests watch index."},"WatchResponse":{"type":"object","description":"Provided by watchable endpoints used in blocking loops.","properties":{"index":{"type":"string","description":"Index indicating the version of the data responded.\nPass this to `WatchQuery` to block and wait for the next response."}},"required":["index"]},"DisplayName":{"type":"string","description":"Represent a resource's readable display name."},"AccountNumber":{"type":"integer"},"Timestamp":{"type":"string","format":"date-time","description":"RFC3339 timestamp"},"GlobalEventNotification":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"thumbnail_url":{"type":"string"},"url":{"type":"string"}},"required":["title","description","thumbnail_url","url"]},"ValidationError":{"type":"object","description":"An error given by failed content validation.","properties":{"path":{"type":"array","items":{"type":"string"},"description":"A list of strings denoting the origin of a validation error."}},"required":["path"]},"EmptyObject":{"type":"object","properties":{}},"ErrorMetadata":{"description":"Unstructured metadata relating to an error. Must be manually parsed."},"ErrorBody":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"ray_id":{"type":"string"},"documentation":{"type":"string"},"metadata":{"$ref":"#/components/schemas/ErrorMetadata"}},"required":["code","message","ray_id"]},"Pagination":{"type":"object","properties":{"cursor":{"type":"string"}}},"GameHandle":{"type":"object","properties":{"game_id":{"type":"string","format":"uuid"},"name_id":{"$ref":"#/components/schemas/Identifier"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"logo_url":{"type":"string","description":"The URL of this game's logo image."},"banner_url":{"type":"string","description":"The URL of this game's banner image."}},"required":["game_id","name_id","display_name"]},"GameGameSummary":{"type":"object","properties":{"game_id":{"type":"string","format":"uuid"},"name_id":{"$ref":"#/components/schemas/Identifier"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"logo_url":{"type":"string","description":"The URL of this game's logo image."},"banner_url":{"type":"string","description":"The URL of this game's banner image."},"url":{"type":"string"},"developer":{"$ref":"#/components/schemas/GroupHandle"},"total_player_count":{"type":"integer","description":"Unsigned 32 bit integer."}},"required":["game_id","name_id","display_name","url","developer","total_player_count"]},"GameProfile":{"type":"object","description":"A game profile.","properties":{"game_id":{"type":"string","format":"uuid"},"name_id":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."},"display_name":{"$ref":"#/components/schemas/DisplayName"},"logo_url":{"type":"string","description":"The URL of this game's logo image."},"banner_url":{"type":"string","description":"The URL of this game's banner image."},"url":{"type":"string","description":"The URL to this game's website."},"developer":{"$ref":"#/components/schemas/GroupGroupSummary"},"tags":{"type":"array","items":{"type":"string"},"description":"A list of game tags."},"description":{"type":"string","description":"A description of the given game."},"platforms":{"type":"array","items":{"$ref":"#/components/schemas/GamePlatformLink"},"description":"A list of platform links."},"recommended_groups":{"type":"array","items":{"$ref":"#/components/schemas/GroupGroupSummary"},"description":"A list of group summaries."},"identity_leaderboard_categories":{"type":"array","items":{"$ref":"#/components/schemas/GameLeaderboardCategory"},"description":"A list of game leaderboard categories."},"group_leaderboard_categories":{"type":"array","items":{"$ref":"#/components/schemas/GameLeaderboardCategory"},"description":"A list of game leaderboard categories."}},"required":["game_id","name_id","display_name","url","developer","tags","description","platforms","recommended_groups","identity_leaderboard_categories","group_leaderboard_categories"]},"GamePlatformLink":{"type":"object","description":"A platform link denoting a supported platform.","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"},"url":{"type":"string","description":"The URL to the given game's method of distribution on this platform."}},"required":["display_name","url"]},"GameLeaderboardCategory":{"type":"object","description":"A game leaderboard category.","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"}},"required":["display_name"]},"GameStatSummary":{"type":"object","description":"A game statistic summary.","properties":{"game":{"$ref":"#/components/schemas/GameHandle"},"stats":{"type":"array","items":{"$ref":"#/components/schemas/GameStat"}}},"required":["game","stats"]},"GameStat":{"type":"object","description":"A game statistic.","properties":{"config":{"$ref":"#/components/schemas/GameStatConfig"},"overall_value":{"type":"number","format":"double","description":"A single overall value of the given statistic."}},"required":["config","overall_value"]},"GameStatConfig":{"type":"object","description":"A game statistic config.","properties":{"record_id":{"type":"string","format":"uuid"},"icon_id":{"type":"string","format":"uuid"},"format":{"$ref":"#/components/schemas/GameStatFormatMethod"},"aggregation":{"$ref":"#/components/schemas/GameStatAggregationMethod"},"sorting":{"$ref":"#/components/schemas/GameStatSortingMethod"},"priority":{"type":"integer"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"postfix_singular":{"type":"string","description":"A string appended to the end of a singular game statistic's value. Example: 1 **dollar**."},"postfix_plural":{"type":"string","description":"A string appended to the end of a game statistic's value that is not exactly 1. Example: 45 **dollars**."},"prefix_singular":{"type":"string","description":"A string appended to the beginning of a singular game statistic's value. Example: **value** 1."},"prefix_plural":{"type":"string","description":"A string prepended to the beginning of a game statistic's value that is not exactly 1. Example: **values** 45."}},"required":["record_id","icon_id","format","aggregation","sorting","priority","display_name"]},"GameStatFormatMethod":{"type":"string","enum":["integer","float_1","float_2","float_3","duration_minute","duration_second","duration_hundredth_second"],"description":"A value denoting the format method of a game statistic."},"GameStatAggregationMethod":{"type":"string","enum":["sum","average","min","max"],"description":"A value denoting the aggregation method of a game statistic."},"GameStatSortingMethod":{"type":"string","enum":["desc","asc"],"description":"A value denoting the sorting method of a game statistic."},"GamesEnvironmentsCreateServiceTokenResponse":{"type":"object","properties":{"token":{"type":"string","description":"A JSON Web Token."}},"required":["token"]},"GeoCoord":{"type":"object","description":"Geographical coordinates for a location on Planet Earth.","properties":{"latitude":{"type":"number","format":"double"},"longitude":{"type":"number","format":"double"}},"required":["latitude","longitude"]},"GeoDistance":{"type":"object","description":"Distance available in multiple units.","properties":{"kilometers":{"type":"number","format":"double"},"miles":{"type":"number","format":"double"}},"required":["kilometers","miles"]},"GroupGroupSummary":{"type":"object","properties":{"group_id":{"type":"string","format":"uuid"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"avatar_url":{"type":"string","description":"The URL of this group's avatar image."},"external":{"$ref":"#/components/schemas/GroupExternalLinks"},"is_developer":{"type":"boolean","description":"**Deprecated**\nWhether or not this group is a developer."},"bio":{"$ref":"#/components/schemas/Bio"},"is_current_identity_member":{"type":"boolean","description":"Whether or not the current identity is a member of this group."},"publicity":{"$ref":"#/components/schemas/GroupPublicity"},"member_count":{"type":"integer"},"owner_identity_id":{"type":"string","format":"uuid"}},"required":["group_id","display_name","external","is_developer","bio","is_current_identity_member","publicity","member_count","owner_identity_id"]},"GroupPublicity":{"type":"string","enum":["open","closed"],"description":"The current publicity value for the given group."},"GroupHandle":{"type":"object","description":"A group handle.","properties":{"group_id":{"type":"string","format":"uuid"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"avatar_url":{"type":"string","description":"The URL of this group's avatar image"},"external":{"$ref":"#/components/schemas/GroupExternalLinks"},"is_developer":{"type":"boolean","description":"Whether or not this group is a developer group."}},"required":["group_id","display_name","external"]},"GroupExternalLinks":{"type":"object","description":"External links for this group.","properties":{"profile":{"type":"string","description":"A link to this group's profile page."}},"required":["profile"]},"GroupJoinRequest":{"type":"object","description":"A group join request.","properties":{"identity":{"$ref":"#/components/schemas/IdentityHandle"},"ts":{"$ref":"#/components/schemas/Timestamp"}},"required":["identity","ts"]},"GroupMember":{"type":"object","description":"A group member.","properties":{"identity":{"$ref":"#/components/schemas/IdentityHandle"}},"required":["identity"]},"GroupProfile":{"type":"object","description":"A list of group profiles.","properties":{"group_id":{"type":"string","format":"uuid"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"avatar_url":{"type":"string","description":"The URL of this group's avatar image."},"external":{"$ref":"#/components/schemas/GroupExternalLinks"},"is_developer":{"type":"boolean","description":"Whether or not this group is a developer."},"bio":{"type":"string","description":"Detailed information about a profile."},"is_current_identity_member":{"type":"boolean","description":"Whether or not the current identity is a member of this group."},"publicity":{"$ref":"#/components/schemas/GroupPublicity"},"member_count":{"type":"integer","description":"Unsigned 32 bit integer."},"members":{"type":"array","items":{"$ref":"#/components/schemas/GroupMember"},"description":"A list of group members."},"join_requests":{"type":"array","items":{"$ref":"#/components/schemas/GroupJoinRequest"},"description":"A list of group join requests."},"is_current_identity_requesting_join":{"type":"boolean","description":"Whether or not the current identity is currently requesting to join this group."},"owner_identity_id":{"type":"string","format":"uuid"}},"required":["group_id","display_name","external","bio","publicity","members","join_requests","owner_identity_id"]},"GroupBannedIdentity":{"type":"object","description":"A banned identity.","properties":{"identity":{"$ref":"#/components/schemas/IdentityHandle"},"ban_ts":{"$ref":"#/components/schemas/Timestamp"}},"required":["identity","ban_ts"]},"GroupGetInviteResponse":{"type":"object","properties":{"group":{"$ref":"#/components/schemas/GroupHandle"}},"required":["group"]},"GroupConsumeInviteResponse":{"type":"object","properties":{"group_id":{"type":"string","format":"uuid"}}},"GroupCreateInviteRequest":{"type":"object","properties":{"ttl":{"type":"number","format":"double","description":"How long until the group invite expires (in milliseconds)."},"use_count":{"type":"number","format":"double","description":"How many times the group invite can be used."}}},"GroupCreateInviteResponse":{"type":"object","properties":{"code":{"type":"string","description":"The code that will be passed to `rivet.api.group#ConsumeInvite` to join a group."}},"required":["code"]},"GroupResolveJoinRequestRequest":{"type":"object","properties":{"resolution":{"type":"boolean"}}},"IdentityListActivitiesResponse":{"type":"object","properties":{"identities":{"type":"array","items":{"$ref":"#/components/schemas/IdentityHandle"}},"games":{"type":"array","items":{"$ref":"#/components/schemas/GameGameSummary"}},"suggested_groups":{"type":"array","items":{"$ref":"#/components/schemas/GroupGroupSummary"}},"suggested_players":{"type":"array","items":{"$ref":"#/components/schemas/IdentityHandle"}},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["identities","games","suggested_groups","suggested_players","watch"]},"IdentityGlobalEvent":{"type":"object","description":"An event relevant to the current identity.","properties":{"ts":{"$ref":"#/components/schemas/Timestamp"},"kind":{"$ref":"#/components/schemas/IdentityGlobalEventKind"},"notification":{"$ref":"#/components/schemas/IdentityGlobalEventNotification"}},"required":["ts","kind"]},"IdentityGlobalEventKind":{"type":"object","properties":{"identity_update":{"$ref":"#/components/schemas/IdentityGlobalEventIdentityUpdate"}}},"IdentityGlobalEventNotification":{"type":"object","description":"Notifications represent information that should be presented to the user\nimmediately.\nAt the moment, only chat message events have associated notifications.\n\n# Display\n\nNotifications should be displayed in an unobtrusive manner throughout the\nentire game. Notifications should disappear after a few seconds if not\ninteracted with.\n\n# Interactions\n\nIf your platform supports it, notifications should be able to be clicked or\ntapped in order to open the relevant context for the event.\nFor a simple implementation of notification interactions, open `url` in a\nweb browser to present the relevant context. For example, a chat message\nnotification will open the thread the chat message was sent in.\nFor advanced implementations that implement a custom chat UI, use\n`GlobalEvent.kind` to determine what action to take when the notification is interacted with.\nFor example, if the global event kind is `GlobalEventChatMessage`, then open\nthe chat UI for the given thread.","properties":{"title":{"type":"string"},"description":{"type":"string"},"thumbnail_url":{"type":"string","description":"URL to an image thumbnail that should be shown for this notification."},"url":{"type":"string","description":"Rivet Hub URL that holds the relevant context for this notification."}},"required":["title","description","thumbnail_url","url"]},"IdentityGlobalEventIdentityUpdate":{"type":"object","properties":{"identity":{"$ref":"#/components/schemas/IdentityProfile"}},"required":["identity"]},"IdentityUpdateGameActivity":{"type":"object","description":"Information about the identity's current game. This is information that all other identities can see about what the current identity is doing.","properties":{"message":{"type":"string","description":"A short message about the current game activity."},"public_metadata":{"description":"JSON data seen by anyone."},"mutual_metadata":{"description":"JSON data seen only by the given identity and their mutual followers."}}},"IdentityHandle":{"type":"object","description":"An identity handle.","properties":{"identity_id":{"type":"string","format":"uuid"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"account_number":{"$ref":"#/components/schemas/AccountNumber"},"avatar_url":{"type":"string","description":"The URL of this identity's avatar image."},"is_registered":{"type":"boolean","description":"Whether or not this identity is registered with a linked account."},"external":{"$ref":"#/components/schemas/IdentityExternalLinks"}},"required":["identity_id","display_name","account_number","avatar_url","is_registered","external"]},"IdentitySummary":{"type":"object","description":"An identity summary.","properties":{"identity_id":{"type":"string","format":"uuid"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"account_number":{"$ref":"#/components/schemas/AccountNumber"},"avatar_url":{"type":"string","description":"The URL of this identity's avatar image."},"is_registered":{"type":"boolean","description":"Whether or not this identity is registered with a linked account."},"external":{"$ref":"#/components/schemas/IdentityExternalLinks"},"following":{"type":"boolean","description":"Whether or not the requestee's identity is following this identity."},"is_following_me":{"type":"boolean","description":"Whether or not this identity is both following and is followed by the requestee's identity."},"is_mutual_following":{"type":"boolean"}},"required":["identity_id","display_name","account_number","avatar_url","is_registered","external","following","is_following_me","is_mutual_following"]},"IdentityProfile":{"type":"object","description":"An identity profile.","properties":{"identity_id":{"type":"string","format":"uuid"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"account_number":{"$ref":"#/components/schemas/AccountNumber"},"avatar_url":{"type":"string","description":"The URL of this identity's avatar image."},"is_registered":{"type":"boolean","description":"Whether or not this identity is registered with a linked account."},"external":{"$ref":"#/components/schemas/IdentityExternalLinks"},"is_admin":{"type":"boolean","description":"Whether or not this identity is an admin."},"is_game_linked":{"type":"boolean","description":"Whether or not this game user has been linked through the Rivet dashboard."},"dev_state":{"$ref":"#/components/schemas/IdentityDevState","description":"**Deprecated**"},"follower_count":{"type":"integer","format":"int64"},"following_count":{"type":"integer","format":"int64"},"following":{"type":"boolean","description":"Whether or not the requestee's identity is following this identity."},"is_following_me":{"type":"boolean","description":"Whether or not this identity is both following and is followed by the requestee's identity."},"is_mutual_following":{"type":"boolean"},"join_ts":{"$ref":"#/components/schemas/Timestamp"},"bio":{"$ref":"#/components/schemas/Bio"},"linked_accounts":{"type":"array","items":{"$ref":"#/components/schemas/IdentityLinkedAccount"}},"groups":{"type":"array","items":{"$ref":"#/components/schemas/IdentityGroup"}},"games":{"type":"array","items":{"$ref":"#/components/schemas/GameStatSummary"}},"awaiting_deletion":{"type":"boolean","description":"Whether or not this identity is awaiting account deletion. Only visible to when the requestee is\nthis identity."}},"required":["identity_id","display_name","account_number","avatar_url","is_registered","external","is_admin","follower_count","following_count","following","is_following_me","is_mutual_following","join_ts","bio","linked_accounts","groups","games"]},"IdentityExternalLinks":{"type":"object","description":"External links for an identity.","properties":{"profile":{"type":"string","description":"A link to this identity's profile page."},"settings":{"type":"string","description":"A link to the Rivet settings page."}},"required":["profile"]},"IdentityStatus":{"type":"string","enum":["online","away","offline"],"description":"The current status of an identity. This helps players understand if another player is currently playing or has their game in the background."},"IdentityGameActivity":{"type":"object","description":"The game an identity is currently participating in.","properties":{"game":{"$ref":"#/components/schemas/GameHandle"},"message":{"type":"string","description":"A short activity message about the current game activity."},"public_metadata":{"description":"JSON data seen by anyone."},"mutual_metadata":{"description":"JSON data seen only by the given identity and their mutual followers."}},"required":["game","message"]},"IdentityGroup":{"type":"object","description":"A group that the given identity.","properties":{"group":{"$ref":"#/components/schemas/GroupHandle"}},"required":["group"]},"IdentityLinkedAccount":{"type":"object","description":"A union representing an identity's linked accounts.","properties":{"email":{"$ref":"#/components/schemas/IdentityEmailLinkedAccount"},"default_user":{"type":"boolean"}}},"IdentityEmailLinkedAccount":{"type":"object","description":"An identity's linked email.","properties":{"email":{"$ref":"#/components/schemas/Email"}},"required":["email"]},"IdentityDevState":{"type":"string","enum":["inactive","pending","accepted"],"description":"The state of the given identity's developer status."},"IdentityGameLinkStatus":{"type":"string","enum":["incomplete","complete","cancelled"]},"IdentityWatchEventsResponse":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/IdentityGlobalEvent"}},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["events","watch"]},"MatchmakerLobbyInfo":{"type":"object","description":"A public lobby in the lobby list.","properties":{"region_id":{"type":"string"},"game_mode_id":{"type":"string"},"lobby_id":{"type":"string","format":"uuid"},"max_players_normal":{"type":"integer"},"max_players_direct":{"type":"integer"},"max_players_party":{"type":"integer"},"total_player_count":{"type":"integer"},"state":{}},"required":["region_id","game_mode_id","lobby_id","max_players_normal","max_players_direct","max_players_party","total_player_count"]},"MatchmakerGameModeInfo":{"type":"object","description":"A game mode that the player can join.","properties":{"game_mode_id":{"$ref":"#/components/schemas/Identifier"}},"required":["game_mode_id"]},"MatchmakerRegionInfo":{"type":"object","description":"A region that the player can connect to.","properties":{"region_id":{"$ref":"#/components/schemas/Identifier"},"provider_display_name":{"$ref":"#/components/schemas/DisplayName"},"region_display_name":{"$ref":"#/components/schemas/DisplayName"},"datacenter_coord":{"$ref":"#/components/schemas/GeoCoord"},"datacenter_distance_from_client":{"$ref":"#/components/schemas/GeoDistance"}},"required":["region_id","provider_display_name","region_display_name","datacenter_coord","datacenter_distance_from_client"]},"MatchmakerJoinLobby":{"type":"object","description":"A matchmaker lobby.","properties":{"lobby_id":{"type":"string","format":"uuid"},"region":{"$ref":"#/components/schemas/MatchmakerJoinRegion"},"ports":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/MatchmakerJoinPort"},"description":"**Deprecated**"},"player":{"$ref":"#/components/schemas/MatchmakerJoinPlayer","description":"**Deprecated**"}},"required":["lobby_id","region","ports","player"]},"MatchmakerJoinRegion":{"type":"object","description":"A matchmaker lobby region.","properties":{"region_id":{"$ref":"#/components/schemas/Identifier"},"display_name":{"$ref":"#/components/schemas/DisplayName"}},"required":["region_id","display_name"]},"MatchmakerJoinPort":{"type":"object","properties":{"host":{"type":"string","description":"The host for the given port. Will be null if using a port range."},"hostname":{"type":"string"},"port":{"type":"integer","description":"The port number for this lobby. Will be null if using a port range."},"port_range":{"$ref":"#/components/schemas/MatchmakerJoinPortRange"},"is_tls":{"type":"boolean","description":"Whether or not this lobby port uses TLS. You cannot mix a non-TLS and TLS ports."}},"required":["hostname","is_tls"]},"MatchmakerJoinPortRange":{"type":"object","description":"Inclusive range of ports that can be connected to.","properties":{"min":{"type":"integer","description":"Minimum port that can be connected to. Inclusive range."},"max":{"type":"integer","description":"Maximum port that can be connected to. Inclusive range."}},"required":["min","max"]},"MatchmakerJoinPlayer":{"type":"object","description":"A matchmaker lobby player.","properties":{"token":{"$ref":"#/components/schemas/Jwt","description":"Pass this token through the socket to the lobby server. The lobby server will validate this token with `PlayerConnected.player_token`"}},"required":["token"]},"MatchmakerCustomLobbyPublicity":{"type":"string","enum":["public","private"]},"MatchmakerFindLobbyResponse":{"type":"object","properties":{"lobby":{"$ref":"#/components/schemas/MatchmakerJoinLobby"},"ports":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/MatchmakerJoinPort"}},"player":{"$ref":"#/components/schemas/MatchmakerJoinPlayer"}},"required":["lobby","ports","player"]},"MatchmakerJoinLobbyResponse":{"type":"object","properties":{"lobby":{"$ref":"#/components/schemas/MatchmakerJoinLobby"},"ports":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/MatchmakerJoinPort"}},"player":{"$ref":"#/components/schemas/MatchmakerJoinPlayer"}},"required":["lobby","ports","player"]},"MatchmakerCreateLobbyResponse":{"type":"object","properties":{"lobby":{"$ref":"#/components/schemas/MatchmakerJoinLobby"},"ports":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/MatchmakerJoinPort"}},"player":{"$ref":"#/components/schemas/MatchmakerJoinPlayer"}},"required":["lobby","ports","player"]},"MatchmakerListLobbiesResponse":{"type":"object","properties":{"game_modes":{"type":"array","items":{"$ref":"#/components/schemas/MatchmakerGameModeInfo"}},"regions":{"type":"array","items":{"$ref":"#/components/schemas/MatchmakerRegionInfo"}},"lobbies":{"type":"array","items":{"$ref":"#/components/schemas/MatchmakerLobbyInfo"}}},"required":["game_modes","regions","lobbies"]},"MatchmakerGetStatisticsResponse":{"type":"object","properties":{"player_count":{"type":"integer","format":"int64"},"game_modes":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/MatchmakerGameModeStatistics"}}},"required":["player_count","game_modes"]},"MatchmakerGameModeStatistics":{"type":"object","properties":{"player_count":{"type":"integer","format":"int64"},"regions":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/MatchmakerRegionStatistics"}}},"required":["player_count","regions"]},"MatchmakerRegionStatistics":{"type":"object","properties":{"player_count":{"type":"integer","format":"int64"}},"required":["player_count"]},"MatchmakerListRegionsResponse":{"type":"object","properties":{"regions":{"type":"array","items":{"$ref":"#/components/schemas/MatchmakerRegionInfo"}}},"required":["regions"]},"PortalNotificationRegisterService":{"type":"object","properties":{"firebase":{"$ref":"#/components/schemas/PortalNotificationRegisterFirebaseService"}}},"PortalNotificationRegisterFirebaseService":{"type":"object","properties":{"access_key":{"type":"string"}},"required":["access_key"]},"PortalNotificationUnregisterService":{"type":"string","enum":["firebase"]},"PortalGetSuggestedGamesResponse":{"type":"object","properties":{"games":{"type":"array","items":{"$ref":"#/components/schemas/GameGameSummary"},"description":"A list of game summaries."},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["games","watch"]},"PortalGetGameProfileResponse":{"type":"object","properties":{"game":{"$ref":"#/components/schemas/GameProfile"},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["game","watch"]},"ProvisionPoolType":{"type":"string","enum":["job","gg","ats","pegboard","pegboard_isolate","fdb","worker","nats","guard"]},"ProvisionServer":{"type":"object","properties":{"server_id":{"type":"string","format":"uuid"},"datacenter_id":{"type":"string","format":"uuid"},"pool_type":{"$ref":"#/components/schemas/ProvisionPoolType"},"lan_ip":{"type":"string"},"wan_ip":{"type":"string"}},"required":["server_id","datacenter_id","pool_type"]},"RegionsRegion":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"]},"RoutesRouteTargetActors":{"type":"object","description":"Configuration for targeting actors.","properties":{"selector_tags":{"type":"object","additionalProperties":{"type":"string"},"description":"Tags of actors to route requests to."}},"required":["selector_tags"]},"RoutesRouteTarget":{"type":"object","properties":{"actors":{"$ref":"#/components/schemas/RoutesRouteTargetActors","description":"Configuration for targeting actors."}}},"RoutesRoute":{"type":"object","properties":{"id":{"type":"string"},"created_at":{"$ref":"#/components/schemas/Timestamp"},"updated_at":{"$ref":"#/components/schemas/Timestamp"},"hostname":{"type":"string"},"path":{"type":"string"},"route_subpaths":{"type":"boolean","description":"Whether to route all subpaths of this path"},"strip_prefix":{"type":"boolean","description":"Whether to remove the path prefix before sending the request to the target."},"target":{"$ref":"#/components/schemas/RoutesRouteTarget"}},"required":["id","created_at","updated_at","hostname","path","route_subpaths","strip_prefix","target"]},"ServersGetBuildResponse":{"type":"object","properties":{"build":{"$ref":"#/components/schemas/ServersBuild"}},"required":["build"]},"ServersListBuildsResponse":{"type":"object","properties":{"builds":{"type":"array","items":{"$ref":"#/components/schemas/ServersBuild"},"description":"A list of builds for the game associated with the token."}},"required":["builds"]},"ServersPatchBuildTagsRequest":{"type":"object","properties":{"tags":{},"exclusive_tags":{"type":"array","items":{"type":"string"},"description":"Removes the given tag keys from all other builds."}},"required":["tags"]},"ServersPatchBuildTagsResponse":{"type":"object","properties":{}},"ServersCreateBuildRequest":{"type":"object","properties":{"name":{"type":"string"},"image_tag":{"type":"string","description":"A tag given to the game build."},"image_file":{"$ref":"#/components/schemas/UploadPrepareFile"},"multipart_upload":{"type":"boolean"},"kind":{"$ref":"#/components/schemas/ServersBuildKind"},"compression":{"$ref":"#/components/schemas/ServersBuildCompression"},"prewarm_datacenters":{"type":"array","items":{"type":"string","format":"uuid"}}},"required":["name","image_tag","image_file"]},"ServersCreateBuildResponse":{"type":"object","properties":{"build":{"type":"string","format":"uuid"},"image_presigned_request":{"$ref":"#/components/schemas/UploadPresignedRequest"},"image_presigned_requests":{"type":"array","items":{"$ref":"#/components/schemas/UploadPresignedRequest"}}},"required":["build"]},"ServersBuildKind":{"type":"string","enum":["docker_image","oci_bundle"]},"ServersBuildCompression":{"type":"string","enum":["none","lz4"]},"ServersServer":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","format":"uuid"},"datacenter":{"type":"string","format":"uuid"},"tags":{},"runtime":{"$ref":"#/components/schemas/ServersRuntime"},"network":{"$ref":"#/components/schemas/ServersNetwork"},"resources":{"$ref":"#/components/schemas/ServersResources"},"lifecycle":{"$ref":"#/components/schemas/ServersLifecycle"},"created_at":{"type":"integer","format":"int64"},"started_at":{"type":"integer","format":"int64"},"destroyed_at":{"type":"integer","format":"int64"}},"required":["id","environment","datacenter","tags","runtime","network","resources","lifecycle","created_at"]},"ServersRuntime":{"type":"object","properties":{"build":{"type":"string","format":"uuid"},"arguments":{"type":"array","items":{"type":"string"}},"environment":{"type":"object","additionalProperties":{"type":"string"}}},"required":["build"]},"ServersLifecycle":{"type":"object","properties":{"kill_timeout":{"type":"integer","format":"int64","description":"The duration to wait for in milliseconds before killing the server. This should be set to a safe default, and can be overridden during a DELETE request if needed."}}},"ServersResources":{"type":"object","properties":{"cpu":{"type":"integer","description":"The number of CPU cores in millicores, or 1/1000 of a core. For example,\n1/8 of a core would be 125 millicores, and 1 core would be 1000\nmillicores."},"memory":{"type":"integer","description":"The amount of memory in megabytes"}},"required":["cpu","memory"]},"ServersNetwork":{"type":"object","properties":{"mode":{"$ref":"#/components/schemas/ServersNetworkMode"},"ports":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ServersPort"}}},"required":["ports"]},"ServersNetworkMode":{"type":"string","enum":["bridge","host"]},"ServersPort":{"type":"object","properties":{"protocol":{"$ref":"#/components/schemas/ServersPortProtocol"},"internal_port":{"type":"integer"},"public_hostname":{"type":"string"},"public_port":{"type":"integer"},"routing":{"$ref":"#/components/schemas/ServersPortRouting"}},"required":["protocol","routing"]},"ServersPortProtocol":{"type":"string","enum":["http","https","tcp","tcp_tls","udp"]},"ServersPortRouting":{"type":"object","properties":{"game_guard":{"$ref":"#/components/schemas/ServersGameGuardRouting"},"host":{"$ref":"#/components/schemas/ServersHostRouting"}}},"ServersGameGuardRouting":{"type":"object","properties":{}},"ServersHostRouting":{"type":"object","properties":{}},"ServersBuild":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"created_at":{"$ref":"#/components/schemas/Timestamp"},"content_length":{"type":"integer","format":"int64","description":"Unsigned 64 bit integer."},"tags":{"type":"object","additionalProperties":{"type":"string"},"description":"Tags of this build"}},"required":["id","name","created_at","content_length","tags"]},"ServersDatacenter":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"name":{"type":"string"}},"required":["id","slug","name"]},"ServersListDatacentersResponse":{"type":"object","properties":{"datacenters":{"type":"array","items":{"$ref":"#/components/schemas/ServersDatacenter"}}},"required":["datacenters"]},"ServersGetServerLogsResponse":{"type":"object","properties":{"lines":{"type":"array","items":{"type":"string"},"description":"Sorted old to new."},"timestamps":{"type":"array","items":{"type":"string"},"description":"Sorted old to new."},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["lines","timestamps","watch"]},"ServersLogStream":{"type":"string","enum":["std_out","std_err"]},"UploadPresignedRequest":{"type":"object","description":"A presigned request used to upload files. Upload your file to the given URL via a PUT request.","properties":{"path":{"type":"string","description":"The name of the file to upload. This is the same as the one given in the upload prepare file."},"url":{"type":"string","description":"The URL of the presigned request for which to upload your file to."},"byte_offset":{"type":"integer","format":"int64","description":"The byte offset for this multipart chunk. Always 0 if not a multipart upload."},"content_length":{"type":"integer","format":"int64","description":"Expected size of this upload."}},"required":["path","url","byte_offset","content_length"]},"UploadPrepareFile":{"type":"object","description":"A file being prepared to upload.","properties":{"path":{"type":"string","description":"The path/filename of the file."},"content_type":{"type":"string","description":"The MIME type of the file."},"content_length":{"type":"integer","format":"int64","description":"Unsigned 64 bit integer."}},"required":["path","content_length"]}}} \ No newline at end of file +{"definitions":{"ActorsGetActorResponse":{"type":"object","properties":{"actor":{"$ref":"#/components/schemas/ActorsActor"}},"required":["actor"]},"ActorsCreateActorRequest":{"type":"object","properties":{"region":{"type":"string"},"tags":{},"build":{"type":"string","format":"uuid"},"build_tags":{},"runtime":{"$ref":"#/components/schemas/ActorsCreateActorRuntimeRequest"},"network":{"$ref":"#/components/schemas/ActorsCreateActorNetworkRequest"},"resources":{"$ref":"#/components/schemas/ActorsResources"},"lifecycle":{"$ref":"#/components/schemas/ActorsLifecycle"}},"required":["tags"]},"ActorsCreateActorRuntimeRequest":{"type":"object","properties":{"environment":{"type":"object","additionalProperties":{"type":"string"}},"network":{"$ref":"#/components/schemas/ActorsCreateActorRuntimeNetworkRequest"}}},"ActorsCreateActorRuntimeNetworkRequest":{"type":"object","properties":{"endpoint_type":{"$ref":"#/components/schemas/ActorsEndpointType"}},"required":["endpoint_type"]},"ActorsCreateActorNetworkRequest":{"type":"object","properties":{"mode":{"$ref":"#/components/schemas/ActorsNetworkMode"},"ports":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ActorsCreateActorPortRequest"}},"wait_ready":{"type":"boolean"}}},"ActorsCreateActorPortRequest":{"type":"object","properties":{"protocol":{"$ref":"#/components/schemas/ActorsPortProtocol"},"internal_port":{"type":"integer"},"routing":{"$ref":"#/components/schemas/ActorsPortRouting"}},"required":["protocol"]},"ActorsCreateActorResponse":{"type":"object","properties":{"actor":{"$ref":"#/components/schemas/ActorsActor","description":"The actor that was created"}},"required":["actor"]},"ActorsDestroyActorResponse":{"type":"object","properties":{}},"ActorsUpgradeActorRequest":{"type":"object","properties":{"build":{"type":"string","format":"uuid"},"build_tags":{}}},"ActorsUpgradeActorResponse":{"type":"object","properties":{}},"ActorsUpgradeAllActorsRequest":{"type":"object","properties":{"tags":{},"build":{"type":"string","format":"uuid"},"build_tags":{}},"required":["tags"]},"ActorsUpgradeAllActorsResponse":{"type":"object","properties":{"count":{"type":"integer","format":"int64"}},"required":["count"]},"ActorsListActorsResponse":{"type":"object","properties":{"actors":{"type":"array","items":{"$ref":"#/components/schemas/ActorsActor"},"description":"A list of actors for the project associated with the token."},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["actors","pagination"]},"ActorsGetActorUsageResponse":{"type":"object","properties":{"metric_names":{"type":"array","items":{"type":"string"}},"metric_attributes":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}}},"metric_types":{"type":"array","items":{"type":"string"}},"metric_values":{"type":"array","items":{"type":"array","items":{"type":"number","format":"double"}}}},"required":["metric_names","metric_attributes","metric_types","metric_values"]},"ActorsQueryActorsResponse":{"type":"object","properties":{"actors":{"type":"array","items":{"$ref":"#/components/schemas/ActorsActor"},"description":"A list of actors matching the query"},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["actors","pagination"]},"BuildsGetBuildResponse":{"type":"object","properties":{"build":{"$ref":"#/components/schemas/BuildsBuild"}},"required":["build"]},"BuildsListBuildsResponse":{"type":"object","properties":{"builds":{"type":"array","items":{"$ref":"#/components/schemas/BuildsBuild"},"description":"A list of builds for the project associated with the token."}},"required":["builds"]},"BuildsPatchBuildTagsRequest":{"type":"object","properties":{"tags":{},"exclusive_tags":{"type":"array","items":{"type":"string"},"description":"**Deprecated**\nRemoves the given tag keys from all other builds."}},"required":["tags"]},"BuildsPatchBuildTagsResponse":{"type":"object","properties":{}},"BuildsPrepareBuildRequest":{"type":"object","properties":{"image_tag":{"type":"string","description":"A tag given to the project build."},"image_file":{"$ref":"#/components/schemas/UploadPrepareFile"},"kind":{"$ref":"#/components/schemas/BuildsBuildKind"},"compression":{"$ref":"#/components/schemas/BuildsBuildCompression"}},"required":["image_file"]},"BuildsPrepareBuildResponse":{"type":"object","properties":{"build":{"type":"string","format":"uuid"},"presigned_requests":{"type":"array","items":{"$ref":"#/components/schemas/UploadPresignedRequest"}}},"required":["build","presigned_requests"]},"BuildsBuildKind":{"type":"string","enum":["docker_image","oci_bundle","javascript"]},"BuildsBuildCompression":{"type":"string","enum":["none","lz4"]},"CloudBootstrapResponse":{"type":"object","properties":{"cluster":{"$ref":"#/components/schemas/CloudBootstrapCluster"},"access":{"$ref":"#/components/schemas/CloudBootstrapAccess"},"domains":{"$ref":"#/components/schemas/CloudBootstrapDomains"},"origins":{"$ref":"#/components/schemas/CloudBootstrapOrigins"},"captcha":{"$ref":"#/components/schemas/CloudBootstrapCaptcha"},"login_methods":{"$ref":"#/components/schemas/CloudBootstrapLoginMethods"},"deploy_hash":{"type":"string"}},"required":["cluster","access","domains","origins","captcha","login_methods","deploy_hash"]},"CloudBootstrapCluster":{"type":"string","enum":["enterprise","oss"],"description":"The type of cluster that the backend is currently running."},"CloudBootstrapAccess":{"type":"string","enum":["public","private","development"]},"CloudBootstrapDomains":{"type":"object","description":"Domains that host parts of Rivet","properties":{"cdn":{"type":"string"},"job":{"type":"string"},"main":{"type":"string"},"opengb":{"type":"string"}}},"CloudBootstrapOrigins":{"type":"object","description":"Origins used to build URLs from","properties":{"hub":{"type":"string"}},"required":["hub"]},"CloudBootstrapCaptcha":{"type":"object","properties":{"turnstile":{"$ref":"#/components/schemas/CloudBootstrapCaptchaTurnstile"}}},"CloudBootstrapCaptchaTurnstile":{"type":"object","properties":{"site_key":{"type":"string"}},"required":["site_key"]},"CloudBootstrapLoginMethods":{"type":"object","properties":{"email":{"type":"boolean"},"access_token":{"type":"boolean"}},"required":["email"]},"CloudGamesGetGamesResponse":{"type":"object","properties":{"games":{"type":"array","items":{"$ref":"#/components/schemas/GameGameSummary"},"description":"A list of game summaries."},"groups":{"type":"array","items":{"$ref":"#/components/schemas/GroupGroupSummary"},"description":"A list of group summaries."},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["games","groups","watch"]},"CloudGamesCreateGameRequest":{"type":"object","properties":{"name_id":{"$ref":"#/components/schemas/Identifier","description":"**Deprecated**"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"developer_group_id":{"type":"string","format":"uuid"}},"required":["display_name","developer_group_id"]},"CloudGamesCreateGameResponse":{"type":"object","properties":{"game_id":{"type":"string","format":"uuid"}},"required":["game_id"]},"CloudGamesValidateGameRequest":{"type":"object","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"},"name_id":{"$ref":"#/components/schemas/Identifier","description":"**Deprecated**"}},"required":["display_name"]},"CloudGamesValidateGameResponse":{"type":"object","properties":{"errors":{"type":"array","items":{"$ref":"#/components/schemas/ValidationError"},"description":"A list of validation errors."}},"required":["errors"]},"CloudGamesGetGameByIdResponse":{"type":"object","properties":{"game":{"$ref":"#/components/schemas/CloudGameFull"},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["game","watch"]},"CloudGamesGameBannerUploadPrepareRequest":{"type":"object","properties":{"path":{"type":"string","description":"The path/filename of the game banner."},"mime":{"type":"string","description":"The MIME type of the game banner."},"content_length":{"type":"integer","format":"int64","description":"Unsigned 64 bit integer."}},"required":["path","content_length"]},"CloudGamesGameBannerUploadPrepareResponse":{"type":"object","properties":{"upload_id":{"type":"string","format":"uuid"},"presigned_request":{"$ref":"#/components/schemas/UploadPresignedRequest"}},"required":["upload_id","presigned_request"]},"CloudGamesGameLogoUploadPrepareRequest":{"type":"object","properties":{"path":{"type":"string","description":"The path/filename of the game logo."},"mime":{"type":"string","description":"The MIME type of the game logo."},"content_length":{"type":"integer","format":"int64","description":"Unsigned 64 bit integer."}},"required":["path","content_length"]},"CloudGamesGameLogoUploadPrepareResponse":{"type":"object","properties":{"upload_id":{"type":"string","format":"uuid"},"presigned_request":{"$ref":"#/components/schemas/UploadPresignedRequest"}},"required":["upload_id","presigned_request"]},"CloudGamesNamespacesInspectResponse":{"type":"object","properties":{"agent":{"$ref":"#/components/schemas/CloudAuthAgent"}},"required":["agent"]},"CloudGamesNamespacesCreateGameNamespaceRequest":{"type":"object","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"},"version_id":{"type":"string","format":"uuid"},"name_id":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."}},"required":["display_name","version_id","name_id"]},"CloudGamesNamespacesCreateGameNamespaceResponse":{"type":"object","properties":{"namespace_id":{"type":"string","format":"uuid"}},"required":["namespace_id"]},"CloudGamesNamespacesValidateGameNamespaceRequest":{"type":"object","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"},"name_id":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."}},"required":["display_name","name_id"]},"CloudGamesNamespacesValidateGameNamespaceResponse":{"type":"object","properties":{"errors":{"type":"array","items":{"$ref":"#/components/schemas/ValidationError"},"description":"A list of validation errors."}},"required":["errors"]},"CloudGamesNamespacesGetGameNamespaceByIdResponse":{"type":"object","properties":{"namespace":{"$ref":"#/components/schemas/CloudNamespaceFull"}},"required":["namespace"]},"CloudGamesNamespacesUpdateNamespaceCdnAuthUserRequest":{"type":"object","properties":{"user":{"type":"string","description":"A user name."},"password":{"type":"string","description":"A bcrypt encrypted password. An error is returned if the given string is not properly encrypted."}},"required":["user","password"]},"CloudGamesNamespacesSetNamespaceCdnAuthTypeRequest":{"type":"object","properties":{"auth_type":{"$ref":"#/components/schemas/CloudCdnAuthType"}},"required":["auth_type"]},"CloudGamesNamespacesToggleNamespaceDomainPublicAuthRequest":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Whether or not to enable authentication based on domain."}},"required":["enabled"]},"CloudGamesNamespacesAddNamespaceDomainRequest":{"type":"object","properties":{"domain":{"type":"string","description":"A valid domain name (no protocol)."}},"required":["domain"]},"CloudGamesNamespacesUpdateGameNamespaceMatchmakerConfigRequest":{"type":"object","properties":{"lobby_count_max":{"type":"integer","description":"Unsigned 32 bit integer."},"max_players":{"type":"integer","description":"Unsigned 32 bit integer."}},"required":["lobby_count_max","max_players"]},"CloudGamesNamespacesGetGameNamespaceVersionHistoryResponse":{"type":"object","properties":{"versions":{"type":"array","items":{"$ref":"#/components/schemas/CloudNamespaceVersion"},"description":"A list of previously deployed namespace versions."}},"required":["versions"]},"CloudGamesNamespacesValidateGameNamespaceMatchmakerConfigRequest":{"type":"object","properties":{"lobby_count_max":{"type":"integer","description":"Unsigned 32 bit integer."},"max_players":{"type":"integer","description":"Unsigned 32 bit integer."}},"required":["lobby_count_max","max_players"]},"CloudGamesNamespacesValidateGameNamespaceMatchmakerConfigResponse":{"type":"object","properties":{"errors":{"type":"array","items":{"$ref":"#/components/schemas/ValidationError"},"description":"A list of validation errors."}},"required":["errors"]},"CloudGamesNamespacesCreateGameNamespaceTokenDevelopmentRequest":{"type":"object","properties":{"hostname":{"type":"string","description":"The hostname used for the token."},"ports":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/CloudMatchmakerDevelopmentPort"}},"lobby_ports":{"type":"array","items":{"$ref":"#/components/schemas/CloudVersionMatchmakerLobbyGroupRuntimeDockerPort"},"description":"**Deprecated**\nA list of docker ports."}},"required":["hostname"]},"CloudGamesNamespacesCreateGameNamespaceTokenDevelopmentResponse":{"type":"object","properties":{"token":{"type":"string","description":"A JSON Web Token.\nSlightly modified to include a description prefix and use Protobufs of\nJSON."}},"required":["token"]},"CloudGamesNamespacesValidateGameNamespaceTokenDevelopmentRequest":{"type":"object","properties":{"hostname":{"type":"string"},"lobby_ports":{"type":"array","items":{"$ref":"#/components/schemas/CloudVersionMatchmakerLobbyGroupRuntimeDockerPort"},"description":"A list of docker ports."}},"required":["hostname","lobby_ports"]},"CloudGamesNamespacesValidateGameNamespaceTokenDevelopmentResponse":{"type":"object","properties":{"errors":{"type":"array","items":{"$ref":"#/components/schemas/ValidationError"},"description":"A list of validation errors."}},"required":["errors"]},"CloudGamesNamespacesCreateGameNamespaceTokenPublicResponse":{"type":"object","properties":{"token":{"type":"string","description":"A JSON Web Token.\nSlightly modified to include a description prefix and use Protobufs of\nJSON."}},"required":["token"]},"CloudGamesNamespacesUpdateGameNamespaceVersionRequest":{"type":"object","properties":{"version_id":{"type":"string","format":"uuid"}},"required":["version_id"]},"CloudVersionConfig":{"type":"object","description":"Cloud configuration for a given version.","properties":{"scripts":{"type":"object","additionalProperties":{"type":"string"}},"engine":{"$ref":"#/components/schemas/CloudVersionEngineEngineConfig"},"cdn":{"$ref":"#/components/schemas/CloudVersionCdnCdnConfig"},"matchmaker":{"$ref":"#/components/schemas/CloudVersionMatchmakerMatchmakerConfig"},"kv":{"$ref":"#/components/schemas/CloudVersionKvKvConfig"},"identity":{"$ref":"#/components/schemas/CloudVersionIdentityIdentityConfig"}}},"CloudVersionFull":{"type":"object","description":"A full version.","properties":{"version_id":{"type":"string","format":"uuid"},"create_ts":{"$ref":"#/components/schemas/Timestamp"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"config":{"$ref":"#/components/schemas/CloudVersionConfig"}},"required":["version_id","create_ts","display_name","config"]},"CloudVersionSummary":{"type":"object","description":"A version summary.","properties":{"version_id":{"type":"string","format":"uuid"},"create_ts":{"$ref":"#/components/schemas/Timestamp"},"display_name":{"$ref":"#/components/schemas/DisplayName"}},"required":["version_id","create_ts","display_name"]},"CloudVersionCdnCdnConfig":{"type":"object","description":"CDN configuration for a given version.","properties":{"build_command":{"type":"string","description":"_Configures Rivet CLI behavior. Has no effect on server behavior._"},"build_output":{"type":"string","description":"_Configures Rivet CLI behavior. Has no effect on server behavior._"},"build_env":{"type":"object","additionalProperties":{"type":"string"},"description":"_Configures Rivet CLI behavior. Has no effect on server behavior._"},"site_id":{"type":"string","format":"uuid"},"routes":{"type":"array","items":{"$ref":"#/components/schemas/CloudVersionCdnRoute"},"description":"Multiple CDN version routes."}}},"CloudVersionCdnRoute":{"type":"object","properties":{"glob":{"type":"string"},"priority":{"type":"integer","description":"Unsigned 32 bit integer."},"middlewares":{"type":"array","items":{"$ref":"#/components/schemas/CloudVersionCdnMiddleware"},"description":"Multiple CDN version middleware."}},"required":["glob","priority","middlewares"]},"CloudVersionCdnMiddleware":{"type":"object","properties":{"kind":{"$ref":"#/components/schemas/CloudVersionCdnMiddlewareKind"}},"required":["kind"]},"CloudVersionCdnMiddlewareKind":{"type":"object","properties":{"custom_headers":{"$ref":"#/components/schemas/CloudVersionCdnCustomHeadersMiddleware"}}},"CloudVersionCdnCustomHeadersMiddleware":{"type":"object","properties":{"headers":{"type":"array","items":{"$ref":"#/components/schemas/CloudVersionCdnHeader"}}},"required":["headers"]},"CloudVersionCdnHeader":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":"string"}},"required":["name","value"]},"CloudVersionEngineEngineConfig":{"type":"object","properties":{"unity":{"$ref":"#/components/schemas/CloudVersionEngineUnityConfig"},"unreal":{"$ref":"#/components/schemas/CloudVersionEngineUnrealConfig"},"godot":{"$ref":"#/components/schemas/CloudVersionEngineGodotConfig"},"html5":{"$ref":"#/components/schemas/CloudVersionEngineHtml5Config"},"custom":{"$ref":"#/components/schemas/CloudVersionEngineCustomConfig"}}},"CloudVersionIdentityIdentityConfig":{"type":"object","description":"**Deprecated**\nIdentity configuration for a given version.","properties":{"display_names":{"type":"array","items":{"type":"string"},"description":"**Deprecated**"},"avatars":{"type":"array","items":{"type":"string","format":"uuid"},"description":"**Deprecated**"},"custom_display_names":{"type":"array","items":{"$ref":"#/components/schemas/CloudVersionIdentityCustomDisplayName"},"description":"**Deprecated**"},"custom_avatars":{"type":"array","items":{"$ref":"#/components/schemas/CloudVersionIdentityCustomAvatar"},"description":"**Deprecated**"}}},"CloudVersionIdentityCustomDisplayName":{"type":"object","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"}},"required":["display_name"]},"CloudVersionIdentityCustomAvatar":{"type":"object","properties":{"upload_id":{"type":"string","format":"uuid"}},"required":["upload_id"]},"CloudVersionKvKvConfig":{"type":"object","description":"KV configuration for a given version.","properties":{}},"CloudVersionMatchmakerMatchmakerConfig":{"type":"object","description":"Matchmaker configuration for a given version.","properties":{"game_modes":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameMode"},"description":"A list of game modes."},"captcha":{"$ref":"#/components/schemas/CloudVersionMatchmakerCaptcha"},"dev_hostname":{"type":"string","description":"_Configures Rivet CLI behavior. Has no effect on server behavior._"},"regions":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeRegion"}},"max_players":{"type":"integer"},"max_players_direct":{"type":"integer"},"max_players_party":{"type":"integer"},"docker":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeRuntimeDocker"},"tier":{"type":"string"},"idle_lobbies":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeIdleLobbiesConfig"},"lobby_groups":{"type":"array","items":{"$ref":"#/components/schemas/CloudVersionMatchmakerLobbyGroup"},"description":"**Deprecated: use `game_modes` instead**\nA list of game modes."}}},"CoreIntercomPegboardMarkClientRegisteredRequest":{"type":"object","properties":{"server_id":{"type":"string","format":"uuid"}},"required":["server_id"]},"EdgeIntercomPegboardPrewarmImageRequest":{"type":"object","properties":{}},"EdgeIntercomPegboardToggleClientDrainRequest":{"type":"object","properties":{"draining":{"type":"boolean"},"drain_complete_ts":{"$ref":"#/components/schemas/Timestamp"}},"required":["draining"]},"GroupListSuggestedResponse":{"type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/components/schemas/GroupGroupSummary"},"description":"A list of group summaries."},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["groups","watch"]},"GroupCreateRequest":{"type":"object","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"}},"required":["display_name"]},"GroupCreateResponse":{"type":"object","properties":{"group_id":{"type":"string","format":"uuid"}},"required":["group_id"]},"GroupPrepareAvatarUploadRequest":{"type":"object","properties":{"path":{"type":"string","description":"The path/filename of the group avatar."},"mime":{"type":"string","description":"The MIME type of the group avatar."},"content_length":{"type":"integer","format":"int64","description":"Unsigned 64 bit integer."}},"required":["path","content_length"]},"GroupPrepareAvatarUploadResponse":{"type":"object","properties":{"upload_id":{"type":"string","format":"uuid"},"presigned_request":{"$ref":"#/components/schemas/UploadPresignedRequest"}},"required":["upload_id","presigned_request"]},"GroupValidateProfileRequest":{"type":"object","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"},"bio":{"$ref":"#/components/schemas/DisplayName"},"publicity":{"$ref":"#/components/schemas/GroupPublicity"}}},"GroupValidateProfileResponse":{"type":"object","properties":{"errors":{"type":"array","items":{"$ref":"#/components/schemas/ValidationError"},"description":"A list of validation errors."}},"required":["errors"]},"GroupGetBansResponse":{"type":"object","properties":{"banned_identities":{"type":"array","items":{"$ref":"#/components/schemas/GroupBannedIdentity"},"description":"A list of banned group members."},"anchor":{"type":"string","description":"The pagination anchor."},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["banned_identities","watch"]},"GroupGetJoinRequestsResponse":{"type":"object","properties":{"join_requests":{"type":"array","items":{"$ref":"#/components/schemas/GroupJoinRequest"},"description":"A list of group join requests."},"anchor":{"type":"string","description":"The pagination anchor."},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["join_requests","watch"]},"GroupGetMembersResponse":{"type":"object","properties":{"members":{"type":"array","items":{"$ref":"#/components/schemas/GroupMember"},"description":"A list of group members."},"anchor":{"type":"string","description":"The pagination anchor."},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["members","watch"]},"GroupGetProfileResponse":{"type":"object","properties":{"group":{"$ref":"#/components/schemas/GroupProfile"},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["group","watch"]},"GroupUpdateProfileRequest":{"type":"object","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"},"bio":{"type":"string","description":"Detailed information about a profile."},"publicity":{"$ref":"#/components/schemas/GroupPublicity"}}},"GroupGetSummaryResponse":{"type":"object","properties":{"group":{"$ref":"#/components/schemas/GroupGroupSummary"}},"required":["group"]},"GroupTransferOwnershipRequest":{"type":"object","properties":{"new_owner_identity_id":{"type":"string","description":"Identity to transfer the group to.\nMust be a member of the group."}},"required":["new_owner_identity_id"]},"IdentitySetupResponse":{"type":"object","properties":{"identity_token":{"$ref":"#/components/schemas/Jwt","description":"Token used to authenticate the identity.\nShould be stored somewhere permanent.\nPass this to `rivet.api.identity#Setup$existing_identity_token` next time `rivet.api.identity#Setup` is called.\nToken has a 90 day TTL.\nThis means that if `rivet.api.identity#Setup` is not called again within 90 days, the token will no longer be valid.\nIf this happens, the user can recover their account through the linking process (see `rivet.api.identity#PrepareGameLink`).\nThis token should be stored locally and never sent to a server or another device.\nIf this token is compromised, anyone with access to this token has control of the identity."},"identity_token_expire_ts":{"$ref":"#/components/schemas/Timestamp"},"identity":{"$ref":"#/components/schemas/IdentityProfile","description":"Information about the identity that was just authenticated."},"game_id":{"type":"string","format":"uuid"}},"required":["identity_token","identity_token_expire_ts","identity","game_id"]},"IdentityGetProfileResponse":{"type":"object","properties":{"identity":{"$ref":"#/components/schemas/IdentityProfile"},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["identity","watch"]},"IdentityGetHandlesResponse":{"type":"object","properties":{"identities":{"type":"array","items":{"$ref":"#/components/schemas/IdentityHandle"}},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["identities","watch"]},"IdentityGetSummariesResponse":{"type":"object","properties":{"identities":{"type":"array","items":{"$ref":"#/components/schemas/IdentitySummary"}},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["identities","watch"]},"IdentityValidateProfileResponse":{"type":"object","properties":{"errors":{"type":"array","items":{"$ref":"#/components/schemas/ValidationError"}}},"required":["errors"]},"IdentityPrepareAvatarUploadResponse":{"type":"object","properties":{"upload_id":{"type":"string","format":"uuid"},"presigned_request":{"$ref":"#/components/schemas/UploadPresignedRequest"}},"required":["upload_id","presigned_request"]},"ProvisionDatacentersGetTlsResponse":{"type":"object","properties":{"job_cert_pem":{"type":"string"},"job_private_key_pem":{"type":"string"},"api_cert_pem":{"type":"string"},"api_private_key_pem":{"type":"string"}},"required":["job_cert_pem","job_private_key_pem","api_cert_pem","api_private_key_pem"]},"ProvisionDatacentersGetServersResponse":{"type":"object","properties":{"servers":{"type":"array","items":{"$ref":"#/components/schemas/ProvisionServer"}}},"required":["servers"]},"ProvisionServersGetInfoResponse":{"type":"object","properties":{"name":{"type":"string"},"server_id":{"type":"string","format":"uuid"},"datacenter_id":{"type":"string","format":"uuid"},"datacenter_name_id":{"type":"string"},"cluster_id":{"type":"string","format":"uuid"},"lan_ip":{"type":"string"},"wan_ip":{"type":"string"},"vlan_ip":{"type":"string","description":"**Deprecated**: Use lan_ip"},"public_ip":{"type":"string","description":"**Deprecated**: Use wan_ip"}},"required":["name","server_id","datacenter_id","datacenter_name_id","cluster_id","lan_ip","wan_ip","vlan_ip","public_ip"]},"ProvisionTunnelGetTlsResponse":{"type":"object","properties":{"cert_pem":{"type":"string"},"root_ca_cert_pem":{"type":"string"},"private_key_pem":{"type":"string"}},"required":["cert_pem","root_ca_cert_pem","private_key_pem"]},"RegionsListRegionsResponse":{"type":"object","properties":{"regions":{"type":"array","items":{"$ref":"#/components/schemas/RegionsRegion"}}},"required":["regions"]},"RegionsRecommendRegionResponse":{"type":"object","properties":{"region":{"$ref":"#/components/schemas/RegionsRegion"}},"required":["region"]},"RoutesListRoutesResponse":{"type":"object","properties":{"routes":{"type":"array","items":{"$ref":"#/components/schemas/RoutesRoute"}}},"required":["routes"]},"RoutesUpdateRouteBody":{"type":"object","properties":{"hostname":{"type":"string"},"path":{"type":"string"},"strip_prefix":{"type":"boolean","description":"Whether to remove the path prefix before sending the request to the actor."},"route_subpaths":{"type":"boolean","description":"Whether to route all subpaths of this path"},"target":{"$ref":"#/components/schemas/RoutesRouteTarget"}},"required":["hostname","path","strip_prefix","route_subpaths","target"]},"RoutesUpdateRouteResponse":{"type":"object","properties":{}},"RoutesDeleteRouteResponse":{"type":"object","properties":{}},"RoutesHistoryResponse":{"type":"object","properties":{"metric_names":{"type":"array","items":{"type":"string"}},"metric_attributes":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}}},"metric_types":{"type":"array","items":{"type":"string"}},"metric_values":{"type":"array","items":{"type":"array","items":{"type":"number","format":"double"}}}},"required":["metric_names","metric_attributes","metric_types","metric_values"]},"ServersGetServerResponse":{"type":"object","properties":{"server":{"$ref":"#/components/schemas/ServersServer"}},"required":["server"]},"ServersCreateServerRequest":{"type":"object","properties":{"datacenter":{"type":"string","format":"uuid"},"tags":{},"runtime":{"$ref":"#/components/schemas/ServersCreateServerRuntimeRequest"},"network":{"$ref":"#/components/schemas/ServersCreateServerNetworkRequest"},"resources":{"$ref":"#/components/schemas/ServersResources"},"lifecycle":{"$ref":"#/components/schemas/ServersLifecycle"}},"required":["datacenter","tags","runtime","network","resources"]},"ServersCreateServerRuntimeRequest":{"type":"object","properties":{"build":{"type":"string","format":"uuid"},"arguments":{"type":"array","items":{"type":"string"}},"environment":{"type":"object","additionalProperties":{"type":"string"}}},"required":["build"]},"ServersCreateServerNetworkRequest":{"type":"object","properties":{"mode":{"$ref":"#/components/schemas/ServersNetworkMode"},"ports":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ServersCreateServerPortRequest"}}},"required":["ports"]},"ServersCreateServerPortRequest":{"type":"object","properties":{"protocol":{"$ref":"#/components/schemas/ServersPortProtocol"},"internal_port":{"type":"integer"},"routing":{"$ref":"#/components/schemas/ServersPortRouting"}},"required":["protocol"]},"ServersCreateServerResponse":{"type":"object","properties":{"server":{"$ref":"#/components/schemas/ServersServer","description":"The server that was created"}},"required":["server"]},"ServersDestroyServerResponse":{"type":"object","properties":{}},"ServersListServersResponse":{"type":"object","properties":{"servers":{"type":"array","items":{"$ref":"#/components/schemas/ServersServer"},"description":"A list of servers for the game associated with the token."}},"required":["servers"]},"ActorsActor":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"region":{"type":"string"},"tags":{},"runtime":{"$ref":"#/components/schemas/ActorsRuntime"},"network":{"$ref":"#/components/schemas/ActorsNetwork"},"resources":{"$ref":"#/components/schemas/ActorsResources"},"lifecycle":{"$ref":"#/components/schemas/ActorsLifecycle"},"created_at":{"$ref":"#/components/schemas/Timestamp"},"started_at":{"$ref":"#/components/schemas/Timestamp"},"destroyed_at":{"$ref":"#/components/schemas/Timestamp"}},"required":["id","region","tags","runtime","network","resources","lifecycle","created_at"]},"ActorsRuntime":{"type":"object","properties":{"build":{"type":"string","format":"uuid"},"arguments":{"type":"array","items":{"type":"string"}},"environment":{"type":"object","additionalProperties":{"type":"string"}}},"required":["build"]},"ActorsLifecycle":{"type":"object","properties":{"kill_timeout":{"type":"integer","format":"int64","description":"The duration to wait for in milliseconds before killing the actor. This should be set to a safe default, and can be overridden during a DELETE request if needed."},"durable":{"type":"boolean","description":"If true, the actor will try to reschedule itself automatically in the event of a crash or a datacenter failover. The actor will not reschedule if it exits successfully."}}},"ActorsResources":{"type":"object","properties":{"cpu":{"type":"integer","description":"The number of CPU cores in millicores, or 1/1000 of a core. For example,\n1/8 of a core would be 125 millicores, and 1 core would be 1000\nmillicores."},"memory":{"type":"integer","description":"The amount of memory in megabytes"}},"required":["cpu","memory"]},"ActorsNetwork":{"type":"object","properties":{"mode":{"$ref":"#/components/schemas/ActorsNetworkMode"},"ports":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ActorsPort"}}},"required":["mode","ports"]},"ActorsNetworkMode":{"type":"string","enum":["bridge","host"]},"ActorsPort":{"type":"object","properties":{"protocol":{"$ref":"#/components/schemas/ActorsPortProtocol"},"internal_port":{"type":"integer"},"hostname":{"type":"string"},"port":{"type":"integer"},"path":{"type":"string"},"url":{"type":"string","description":"Fully formed connection URL including protocol, hostname, port, and path, if applicable."},"routing":{"$ref":"#/components/schemas/ActorsPortRouting"}},"required":["protocol","routing"]},"ActorsPortProtocol":{"type":"string","enum":["http","https","tcp","tcp_tls","udp"]},"ActorsPortRouting":{"type":"object","properties":{"guard":{"$ref":"#/components/schemas/ActorsGuardRouting"},"host":{"$ref":"#/components/schemas/ActorsHostRouting"}}},"ActorsGuardRouting":{"type":"object","properties":{}},"ActorsHostRouting":{"type":"object","properties":{}},"ActorsEndpointType":{"type":"string","enum":["hostname","path"]},"ActorsGetActorLogsResponse":{"type":"object","properties":{"actor_ids":{"type":"array","items":{"type":"string"},"description":"List of actor IDs in these logs. The order of these correspond to the index in the log entry."},"lines":{"type":"array","items":{"type":"string"},"description":"Sorted old to new."},"timestamps":{"type":"array","items":{"$ref":"#/components/schemas/Timestamp"},"description":"Sorted old to new."},"streams":{"type":"array","items":{"type":"integer"},"description":"Streams the logs came from.\n\n0 = stdout\n1 = stderr"},"actor_indices":{"type":"array","items":{"type":"integer"},"description":"Index of the actor that this log was for. Use this index to look the full ID in `actor_ids`."},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["actor_ids","lines","timestamps","streams","actor_indices","watch"]},"ActorsExportActorLogsResponse":{"type":"object","properties":{"url":{"type":"string","description":"Presigned URL to download the exported logs"}},"required":["url"]},"ActorsGetActorMetricsResponse":{"type":"object","properties":{"actor_ids":{"type":"array","items":{"type":"string"}},"metric_names":{"type":"array","items":{"type":"string"}},"metric_attributes":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}}},"metric_types":{"type":"array","items":{"type":"string"}},"metric_values":{"type":"array","items":{"type":"array","items":{"type":"number","format":"double"}}}},"required":["actor_ids","metric_names","metric_attributes","metric_types","metric_values"]},"AuthCompleteStatus":{"type":"string","enum":["switch_identity","linked_account_added","already_complete","expired","too_many_attempts","incorrect"],"description":"Represents the state of an external account linking process."},"AuthIdentityStartEmailVerificationRequest":{"type":"object","properties":{"email":{"type":"string"},"captcha":{"$ref":"#/components/schemas/CaptchaConfig"},"game_id":{"type":"string","format":"uuid"}},"required":["email"]},"AuthIdentityStartEmailVerificationResponse":{"type":"object","properties":{"verification_id":{"type":"string","format":"uuid"}},"required":["verification_id"]},"AuthIdentityCompleteEmailVerificationRequest":{"type":"object","properties":{"verification_id":{"type":"string","format":"uuid"},"code":{"type":"string","description":"The code sent to the requestee's email."}},"required":["verification_id","code"]},"AuthIdentityCompleteEmailVerificationResponse":{"type":"object","properties":{"status":{"$ref":"#/components/schemas/AuthCompleteStatus"}},"required":["status"]},"AuthRefreshIdentityTokenRequest":{"type":"object","properties":{"logout":{"type":"boolean","description":"When `true`, the current identity for the provided cookie will be logged out and a new identity will be returned."}}},"AuthRefreshIdentityTokenResponse":{"type":"object","properties":{"token":{"type":"string","description":"A JSON Web Token.\nSlightly modified to include a description prefix and use Protobufs of\nJSON."},"exp":{"type":"string","description":"Token expiration time (in milliseconds)."},"identity_id":{"type":"string","format":"uuid"}},"required":["token","exp","identity_id"]},"BuildsBuild":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"created_at":{"$ref":"#/components/schemas/Timestamp"},"content_length":{"type":"integer","format":"int64","description":"Unsigned 64 bit integer."},"tags":{"type":"object","additionalProperties":{"type":"string"},"description":"Tags of this build"}},"required":["id","name","created_at","content_length","tags"]},"CaptchaConfig":{"type":"object","description":"Methods to verify a captcha","properties":{"hcaptcha":{"$ref":"#/components/schemas/CaptchaConfigHcaptcha"},"turnstile":{"$ref":"#/components/schemas/CaptchaConfigTurnstile"}}},"CaptchaConfigHcaptcha":{"type":"object","description":"Captcha configuration.","properties":{"client_response":{"type":"string"}},"required":["client_response"]},"CaptchaConfigTurnstile":{"type":"object","description":"Captcha configuration.","properties":{"client_response":{"type":"string"}},"required":["client_response"]},"CloudInspectResponse":{"type":"object","properties":{"agent":{"$ref":"#/components/schemas/CloudAuthAgent"}},"required":["agent"]},"CloudSvcPerf":{"type":"object","description":"A service performance summary.","properties":{"svc_name":{"type":"string","description":"The name of the service."},"ts":{"$ref":"#/components/schemas/Timestamp"},"duration":{"type":"integer","format":"int64","description":"Unsigned 64 bit integer."},"req_id":{"type":"string","format":"uuid"},"spans":{"type":"array","items":{"$ref":"#/components/schemas/CloudLogsPerfSpan"},"description":"A list of performance spans."},"marks":{"type":"array","items":{"$ref":"#/components/schemas/CloudLogsPerfMark"},"description":"A list of performance marks."}},"required":["svc_name","ts","duration","spans","marks"]},"CloudLogsPerfSpan":{"type":"object","description":"A performance span.","properties":{"label":{"type":"string","description":"The label given to this performance span."},"start_ts":{"$ref":"#/components/schemas/Timestamp"},"finish_ts":{"$ref":"#/components/schemas/Timestamp"},"req_id":{"type":"string","format":"uuid"}},"required":["label","start_ts"]},"CloudLogsPerfMark":{"type":"object","description":"A performance mark.","properties":{"label":{"type":"string","description":"The label given to this performance mark."},"ts":{"$ref":"#/components/schemas/Timestamp"},"ray_id":{"type":"string","format":"uuid"},"req_id":{"type":"string","format":"uuid"}},"required":["label","ts"]},"CloudLobbySummaryAnalytics":{"type":"object","description":"Analytical information about a lobby.","properties":{"lobby_id":{"type":"string","format":"uuid"},"lobby_group_id":{"type":"string","format":"uuid"},"lobby_group_name_id":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."},"region_id":{"type":"string","format":"uuid"},"create_ts":{"$ref":"#/components/schemas/Timestamp"},"is_ready":{"type":"boolean","description":"Whether or not this lobby is ready."},"is_idle":{"type":"boolean","description":"Whether or not this lobby is idle."},"is_closed":{"type":"boolean","description":"Whether or not this lobby is in a closed state."},"is_outdated":{"type":"boolean","description":"Whether or not this lobby is outdated."},"max_players_normal":{"type":"integer","description":"Unsigned 32 bit integer."},"max_players_direct":{"type":"integer","description":"Unsigned 32 bit integer."},"max_players_party":{"type":"integer","description":"Unsigned 32 bit integer."},"total_player_count":{"type":"integer","description":"Unsigned 32 bit integer."},"registered_player_count":{"type":"integer","description":"Unsigned 32 bit integer."}},"required":["lobby_id","lobby_group_id","lobby_group_name_id","region_id","create_ts","is_ready","is_idle","is_closed","is_outdated","max_players_normal","max_players_direct","max_players_party","total_player_count","registered_player_count"]},"CloudLogsLobbySummary":{"type":"object","description":"A logs summary for a lobby.","properties":{"lobby_id":{"type":"string","format":"uuid"},"namespace_id":{"type":"string","format":"uuid"},"lobby_group_name_id":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."},"region_id":{"type":"string","format":"uuid"},"create_ts":{"$ref":"#/components/schemas/Timestamp"},"start_ts":{"$ref":"#/components/schemas/Timestamp"},"ready_ts":{"$ref":"#/components/schemas/Timestamp"},"status":{"$ref":"#/components/schemas/CloudLogsLobbyStatus"}},"required":["lobby_id","namespace_id","lobby_group_name_id","region_id","create_ts","status"]},"CloudLogsLobbyStatus":{"type":"object","description":"A union representing the state of a lobby.","properties":{"running":{"$ref":"#/components/schemas/EmptyObject"},"stopped":{"$ref":"#/components/schemas/CloudLogsLobbyStatusStopped"}},"required":["running"]},"CloudLogsLobbyStatusStopped":{"type":"object","description":"The status of a stopped lobby.","properties":{"stop_ts":{"$ref":"#/components/schemas/Timestamp"},"failed":{"type":"boolean","description":"Whether or not the lobby failed or stopped successfully."},"exit_code":{"type":"integer","description":"The exit code returned by the lobby's main process when stopped."}},"required":["stop_ts","failed","exit_code"]},"CloudSvcMetrics":{"type":"object","description":"Metrics relating to a job service.","properties":{"job":{"type":"string","description":"The job name."},"cpu":{"type":"array","items":{"type":"number","format":"double"},"description":"CPU metrics."},"memory":{"type":"array","items":{"type":"number","format":"double"},"description":"Memory metrics."},"allocated_memory":{"type":"number","format":"double","description":"Total allocated memory (MB)."}},"required":["job","cpu","memory"]},"CloudAuthAgent":{"type":"object","description":"The current authenticated agent.","properties":{"identity":{"$ref":"#/components/schemas/CloudAuthAgentIdentity"},"game_cloud":{"$ref":"#/components/schemas/CloudAuthAgentGameCloud"}}},"CloudAuthAgentIdentity":{"type":"object","description":"The current authenticated identity.","properties":{"identity_id":{"type":"string","format":"uuid"}},"required":["identity_id"]},"CloudAuthAgentGameCloud":{"type":"object","description":"The current authenticated game cloud.","properties":{"game_id":{"type":"string","format":"uuid"}},"required":["game_id"]},"CloudCustomAvatarSummary":{"type":"object","description":"A custom avatar summary.","properties":{"upload_id":{"type":"string","format":"uuid"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"create_ts":{"$ref":"#/components/schemas/Timestamp"},"url":{"type":"string","description":"The URL of this custom avatar image. Only present if upload is complete."},"content_length":{"type":"integer","format":"int64","description":"Unsigned 64 bit integer."},"complete":{"type":"boolean","description":"Whether or not this custom avatar has completely been uploaded."}},"required":["upload_id","display_name","create_ts","content_length","complete"]},"CloudBuildSummary":{"type":"object","description":"A build summary.","properties":{"build_id":{"type":"string","format":"uuid"},"upload_id":{"type":"string","format":"uuid"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"create_ts":{"$ref":"#/components/schemas/Timestamp"},"content_length":{"type":"integer","format":"int64","description":"Unsigned 64 bit integer."},"complete":{"type":"boolean","description":"Whether or not this build has completely been uploaded."},"tags":{"type":"object","additionalProperties":{"type":"string"},"description":"Tags of this build"}},"required":["build_id","upload_id","display_name","create_ts","content_length","complete","tags"]},"CloudCdnSiteSummary":{"type":"object","description":"A CDN site summary.","properties":{"site_id":{"type":"string","format":"uuid"},"upload_id":{"type":"string","format":"uuid"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"create_ts":{"$ref":"#/components/schemas/Timestamp"},"content_length":{"type":"integer","format":"int64","description":"Unsigned 64 bit integer."},"complete":{"type":"boolean","description":"Whether or not this site has completely been uploaded."}},"required":["site_id","upload_id","display_name","create_ts","content_length","complete"]},"CloudGameFull":{"type":"object","description":"A full game.","properties":{"game_id":{"type":"string","format":"uuid"},"create_ts":{"$ref":"#/components/schemas/Timestamp"},"name_id":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."},"display_name":{"$ref":"#/components/schemas/DisplayName"},"developer_group_id":{"type":"string","format":"uuid"},"total_player_count":{"type":"integer","description":"Unsigned 32 bit integer."},"logo_url":{"type":"string","description":"The URL of this game's logo image."},"banner_url":{"type":"string","description":"The URL of this game's banner image."},"namespaces":{"type":"array","items":{"$ref":"#/components/schemas/CloudNamespaceSummary"},"description":"A list of namespace summaries."},"versions":{"type":"array","items":{"$ref":"#/components/schemas/CloudVersionSummary"},"description":"A list of version summaries."},"available_regions":{"type":"array","items":{"$ref":"#/components/schemas/CloudRegionSummary"},"description":"A list of region summaries."}},"required":["game_id","create_ts","name_id","display_name","developer_group_id","total_player_count","namespaces","versions","available_regions"]},"CloudNamespaceSummary":{"type":"object","description":"A namespace summary.","properties":{"namespace_id":{"type":"string","format":"uuid"},"create_ts":{"$ref":"#/components/schemas/Timestamp"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"version_id":{"type":"string","format":"uuid"},"name_id":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."}},"required":["namespace_id","create_ts","display_name","version_id","name_id"]},"CloudRegionSummary":{"type":"object","description":"A region summary.","properties":{"region_id":{"type":"string","format":"uuid"},"region_name_id":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."},"provider":{"type":"string","description":"The server provider of this region."},"universal_region":{"$ref":"#/components/schemas/CloudUniversalRegion","description":"**Deprecated**\nA universal region label given to this region."},"provider_display_name":{"$ref":"#/components/schemas/DisplayName"},"region_display_name":{"$ref":"#/components/schemas/DisplayName"}},"required":["region_id","region_name_id","provider","universal_region","provider_display_name","region_display_name"]},"CloudGameLobbyExpenses":{"type":"object","description":"Game lobby expenses.","properties":{"game":{"$ref":"#/components/schemas/GameHandle"},"namespaces":{"type":"array","items":{"$ref":"#/components/schemas/CloudNamespaceSummary"},"description":"A list of namespace summaries."},"expenses":{"type":"array","items":{"$ref":"#/components/schemas/CloudRegionTierExpenses"},"description":"A list of multiple region tier expenses."}},"required":["game","namespaces","expenses"]},"CloudRegionTierExpenses":{"type":"object","description":"Region tier expenses.","properties":{"namespace_id":{"type":"string","format":"uuid"},"region_id":{"type":"string","format":"uuid"},"tier_name_id":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."},"lobby_group_name_id":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."},"uptime":{"type":"number","format":"double","description":"How long a region tier has been active (in milliseconds)."},"expenses":{"type":"number","format":"double","description":"Amount of expenses for this region tier (in hundred-thousandths USD, 100,000 = $1.00)."}},"required":["namespace_id","region_id","tier_name_id","lobby_group_name_id","uptime","expenses"]},"CloudGroupBankSource":{"type":"object","properties":{"account_number":{"type":"string","description":"The bank account number of this group's bank source."},"routing_number":{"type":"string","description":"The bank routing number of this group's bank source."}},"required":["account_number","routing_number"]},"CloudRegionTier":{"type":"object","description":"A region server tier.","properties":{"tier_name_id":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."},"rivet_cores_numerator":{"type":"integer","description":"Together with the denominator, denotes the portion of the CPU a given server uses."},"rivet_cores_denominator":{"type":"integer","description":"Together with the numerator, denotes the portion of the CPU a given server uses."},"cpu":{"type":"integer","description":"CPU frequency (MHz)."},"memory":{"type":"integer","description":"Allocated memory (MB)."},"disk":{"type":"integer","description":"Allocated disk space (MB)."},"bandwidth":{"type":"integer","description":"Internet bandwidth (MB)."},"price_per_second":{"type":"integer","description":"**Deprecated**\nPrice billed for every second this server is running (in quadrillionth USD, 1,000,000,000,000 = $1.00)."}},"required":["tier_name_id","rivet_cores_numerator","rivet_cores_denominator","cpu","memory","disk","bandwidth","price_per_second"]},"CloudUniversalRegion":{"type":"string","enum":["unknown","local","amsterdam","atlanta","bangalore","dallas","frankfurt","london","mumbai","newark","new_york_city","san_francisco","singapore","sydney","tokyo","toronto","washington_dc","chicago","paris","seattle","sao_paulo","stockholm","chennai","osaka","milan","miami","jakarta","los_angeles"],"description":"**Deprecated**"},"CloudNamespaceFull":{"type":"object","description":"A full namespace.","properties":{"namespace_id":{"type":"string","format":"uuid"},"create_ts":{"$ref":"#/components/schemas/Timestamp"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"version_id":{"type":"string","format":"uuid"},"name_id":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."},"config":{"$ref":"#/components/schemas/CloudNamespaceConfig"}},"required":["namespace_id","create_ts","display_name","version_id","name_id","config"]},"CloudNamespaceConfig":{"type":"object","description":"Cloud configuration for a given namespace.","properties":{"cdn":{"$ref":"#/components/schemas/CloudCdnNamespaceConfig"},"matchmaker":{"$ref":"#/components/schemas/CloudMatchmakerNamespaceConfig"},"kv":{"$ref":"#/components/schemas/CloudKvNamespaceConfig"},"identity":{"$ref":"#/components/schemas/CloudIdentityNamespaceConfig"}},"required":["cdn","matchmaker","kv","identity"]},"CloudCdnNamespaceConfig":{"type":"object","description":"CDN configuration for a given namespace.","properties":{"enable_domain_public_auth":{"type":"boolean","description":"Whether or not to allow users to connect to the given namespace via domain name."},"domains":{"type":"array","items":{"$ref":"#/components/schemas/CloudCdnNamespaceDomain"},"description":"A list of CDN domains for a given namespace."},"auth_type":{"$ref":"#/components/schemas/CloudCdnAuthType"},"auth_user_list":{"type":"array","items":{"$ref":"#/components/schemas/CloudCdnNamespaceAuthUser"},"description":"A list of CDN authenticated users for a given namespace."}},"required":["enable_domain_public_auth","domains","auth_type","auth_user_list"]},"CloudMatchmakerNamespaceConfig":{"type":"object","description":"Matchmaker configuration for a given namespace.","properties":{"lobby_count_max":{"type":"integer","description":"Unsigned 32 bit integer."},"max_players_per_client":{"type":"integer","description":"Unsigned 32 bit integer."},"max_players_per_client_vpn":{"type":"integer","description":"Unsigned 32 bit integer."},"max_players_per_client_proxy":{"type":"integer","description":"Unsigned 32 bit integer."},"max_players_per_client_tor":{"type":"integer","description":"Unsigned 32 bit integer."},"max_players_per_client_hosting":{"type":"integer","description":"Unsigned 32 bit integer."}},"required":["lobby_count_max","max_players_per_client","max_players_per_client_vpn","max_players_per_client_proxy","max_players_per_client_tor","max_players_per_client_hosting"]},"CloudKvNamespaceConfig":{"type":"object","description":"KV configuration for a given namespace.","properties":{}},"CloudIdentityNamespaceConfig":{"type":"object","description":"Identity configuration for a given namespace.","properties":{}},"CloudCdnAuthType":{"type":"string","enum":["none","basic"],"description":"A value denoting what type of authentication to use for a game namespace's CDN."},"CloudCdnNamespaceDomain":{"type":"object","description":"A CDN domain for a given namespace.","properties":{"domain":{"type":"string","description":"A valid domain name (no protocol)."},"create_ts":{"$ref":"#/components/schemas/Timestamp"},"verification_status":{"$ref":"#/components/schemas/CloudCdnNamespaceDomainVerificationStatus"},"verification_method":{"$ref":"#/components/schemas/CloudCdnNamespaceDomainVerificationMethod"},"verification_errors":{"type":"array","items":{"type":"string"}}},"required":["domain","create_ts","verification_status","verification_method","verification_errors"]},"CloudCdnNamespaceDomainVerificationMethod":{"type":"object","description":"A union representing the verification method used for this CDN domain.","properties":{"invalid":{"$ref":"#/components/schemas/EmptyObject"},"http":{"$ref":"#/components/schemas/CloudCdnNamespaceDomainVerificationMethodHttp"}}},"CloudCdnNamespaceDomainVerificationMethodHttp":{"type":"object","properties":{"cname_record":{"type":"string"}},"required":["cname_record"]},"CloudCdnNamespaceDomainVerificationStatus":{"type":"string","enum":["active","pending","failed"],"description":"A value denoting the status of a CDN domain's verification status."},"CloudCdnNamespaceAuthUser":{"type":"object","description":"An authenticated CDN user for a given namespace.","properties":{"user":{"type":"string","description":"A user name."}},"required":["user"]},"CloudMatchmakerDevelopmentPort":{"type":"object","description":"A port configuration used to create development tokens.","properties":{"port":{"type":"integer"},"port_range":{"$ref":"#/components/schemas/CloudVersionMatchmakerPortRange"},"protocol":{"$ref":"#/components/schemas/CloudVersionMatchmakerPortProtocol"}},"required":["protocol"]},"CloudNamespaceVersion":{"type":"object","description":"A previously deployed namespace version.","properties":{"namespace_id":{"type":"string","description":"A universally unique identifier."},"version_id":{"type":"string","description":"A universally unique identifier."},"deploy_ts":{"$ref":"#/components/schemas/Timestamp"}},"required":["namespace_id","version_id","deploy_ts"]},"CloudDevicesPrepareDeviceLinkResponse":{"type":"object","properties":{"device_link_id":{"type":"string","format":"uuid"},"device_link_token":{"type":"string"},"device_link_url":{"type":"string"}},"required":["device_link_id","device_link_token","device_link_url"]},"CloudDevicesGetDeviceLinkResponse":{"type":"object","properties":{"cloud_token":{"type":"string"},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["watch"]},"CloudDevicesCompleteDeviceLinkRequest":{"type":"object","properties":{"device_link_token":{"$ref":"#/components/schemas/Jwt"},"game_id":{"type":"string","format":"uuid"}},"required":["device_link_token","game_id"]},"CloudGamesListGameCustomAvatarsResponse":{"type":"object","properties":{"custom_avatars":{"type":"array","items":{"$ref":"#/components/schemas/CloudCustomAvatarSummary"},"description":"A list of custom avatar summaries."}},"required":["custom_avatars"]},"CloudGamesPrepareCustomAvatarUploadRequest":{"type":"object","properties":{"path":{"type":"string","description":"The path/filename of the custom avatar."},"mime":{"type":"string","description":"The MIME type of the custom avatar."},"content_length":{"type":"integer","format":"int64","description":"Unsigned 64 bit integer."}},"required":["path","content_length"]},"CloudGamesPrepareCustomAvatarUploadResponse":{"type":"object","properties":{"upload_id":{"type":"string","format":"uuid"},"presigned_request":{"$ref":"#/components/schemas/UploadPresignedRequest"}},"required":["upload_id","presigned_request"]},"CloudGamesListGameBuildsResponse":{"type":"object","properties":{"builds":{"type":"array","items":{"$ref":"#/components/schemas/CloudBuildSummary"},"description":"A list of build summaries."}},"required":["builds"]},"CloudGamesCreateGameBuildRequest":{"type":"object","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"},"image_tag":{"type":"string","description":"A tag given to the game build."},"image_file":{"$ref":"#/components/schemas/UploadPrepareFile"},"multipart_upload":{"type":"boolean"},"kind":{"$ref":"#/components/schemas/CloudGamesBuildKind"},"compression":{"$ref":"#/components/schemas/CloudGamesBuildCompression"}},"required":["display_name","image_tag","image_file"]},"CloudGamesCreateGameBuildResponse":{"type":"object","properties":{"build_id":{"type":"string","format":"uuid"},"upload_id":{"type":"string","format":"uuid"},"image_presigned_request":{"$ref":"#/components/schemas/UploadPresignedRequest"},"image_presigned_requests":{"type":"array","items":{"$ref":"#/components/schemas/UploadPresignedRequest"}}},"required":["build_id","upload_id"]},"CloudGamesBuildKind":{"type":"string","enum":["docker_image","oci_bundle"]},"CloudGamesBuildCompression":{"type":"string","enum":["none","lz4"]},"CloudGamesListGameCdnSitesResponse":{"type":"object","properties":{"sites":{"type":"array","items":{"$ref":"#/components/schemas/CloudCdnSiteSummary"},"description":"A list of CDN site summaries."}},"required":["sites"]},"CloudGamesCreateGameCdnSiteRequest":{"type":"object","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"},"files":{"type":"array","items":{"$ref":"#/components/schemas/UploadPrepareFile"},"description":"A list of files preparing to upload."}},"required":["display_name","files"]},"CloudGamesCreateGameCdnSiteResponse":{"type":"object","properties":{"site_id":{"type":"string","format":"uuid"},"upload_id":{"type":"string","format":"uuid"},"presigned_requests":{"type":"array","items":{"$ref":"#/components/schemas/UploadPresignedRequest"}}},"required":["site_id","upload_id","presigned_requests"]},"CloudGamesExportMatchmakerLobbyHistoryRequest":{"type":"object","properties":{"query_start":{"type":"integer","format":"int64","description":"Unsigned 64 bit integer."},"query_end":{"type":"integer","format":"int64","description":"Unsigned 64 bit integer."}},"required":["query_start","query_end"]},"CloudGamesExportMatchmakerLobbyHistoryResponse":{"type":"object","properties":{"url":{"type":"string","description":"The URL to a CSV file for the given lobby history."}},"required":["url"]},"CloudGamesDeleteMatchmakerLobbyResponse":{"type":"object","properties":{"did_remove":{"type":"boolean","description":"Whether or not the lobby was successfully stopped."}},"required":["did_remove"]},"CloudGamesGetLobbyLogsResponse":{"type":"object","properties":{"lines":{"type":"array","items":{"type":"string"},"description":"Sorted old to new."},"timestamps":{"type":"array","items":{"type":"string"},"description":"Sorted old to new."},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["lines","timestamps","watch"]},"CloudGamesExportLobbyLogsRequest":{"type":"object","properties":{"stream":{"$ref":"#/components/schemas/CloudGamesLogStream"}},"required":["stream"]},"CloudGamesExportLobbyLogsResponse":{"type":"object","properties":{"url":{"type":"string","description":"The URL to a CSV file for the given lobby history."}},"required":["url"]},"CloudGamesLogStream":{"type":"string","enum":["std_out","std_err"]},"CloudGamesNamespacesGetAnalyticsMatchmakerLiveResponse":{"type":"object","properties":{"lobbies":{"type":"array","items":{"$ref":"#/components/schemas/CloudLobbySummaryAnalytics"},"description":"A list of analytics lobby summaries."}},"required":["lobbies"]},"CloudGamesNamespacesListNamespaceLobbiesResponse":{"type":"object","properties":{"lobbies":{"type":"array","items":{"$ref":"#/components/schemas/CloudLogsLobbySummary"},"description":"A list of lobby log summaries."}},"required":["lobbies"]},"CloudGamesNamespacesGetNamespaceLobbyResponse":{"type":"object","properties":{"lobby":{"$ref":"#/components/schemas/CloudLogsLobbySummary"},"metrics":{"$ref":"#/components/schemas/CloudSvcMetrics"},"stdout_presigned_urls":{"type":"array","items":{"type":"string"},"description":"**Deprecated**\nA list of URLs."},"stderr_presigned_urls":{"type":"array","items":{"type":"string"},"description":"**Deprecated**\nA list of URLs."},"perf_lists":{"type":"array","items":{"$ref":"#/components/schemas/CloudSvcPerf"},"description":"**Deprecated**\nA list of service performance summaries."}},"required":["lobby","stdout_presigned_urls","stderr_presigned_urls","perf_lists"]},"CloudGamesCreateCloudTokenResponse":{"type":"object","properties":{"token":{"type":"string","description":"A JSON Web Token.\nSlightly modified to include a description prefix and use Protobufs of\nJSON."}},"required":["token"]},"CloudGamesCreateGameVersionRequest":{"type":"object","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"},"config":{"$ref":"#/components/schemas/CloudVersionConfig"}},"required":["display_name","config"]},"CloudGamesCreateGameVersionResponse":{"type":"object","properties":{"version_id":{"type":"string","format":"uuid"}},"required":["version_id"]},"CloudGamesReserveVersionNameResponse":{"type":"object","properties":{"version_display_name":{"$ref":"#/components/schemas/DisplayName"}},"required":["version_display_name"]},"CloudGamesValidateGameVersionRequest":{"type":"object","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"},"config":{"$ref":"#/components/schemas/CloudVersionConfig"}},"required":["display_name","config"]},"CloudGamesValidateGameVersionResponse":{"type":"object","properties":{"errors":{"type":"array","items":{"$ref":"#/components/schemas/ValidationError"},"description":"A list of validation errors."}},"required":["errors"]},"CloudGamesGetGameVersionByIdResponse":{"type":"object","properties":{"version":{"$ref":"#/components/schemas/CloudVersionFull"}},"required":["version"]},"CloudValidateGroupRequest":{"type":"object","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"}},"required":["display_name"]},"CloudValidateGroupResponse":{"type":"object","properties":{"errors":{"type":"array","items":{"$ref":"#/components/schemas/ValidationError"},"description":"A list of validation errors."}},"required":["errors"]},"CloudGetRayPerfLogsResponse":{"type":"object","properties":{"perf_lists":{"type":"array","items":{"$ref":"#/components/schemas/CloudSvcPerf"},"description":"A list of service performance summaries."}},"required":["perf_lists"]},"CloudGetRegionTiersResponse":{"type":"object","properties":{"tiers":{"type":"array","items":{"$ref":"#/components/schemas/CloudRegionTier"},"description":"A list of region server tiers."}},"required":["tiers"]},"CloudVersionEngineCustomConfig":{"type":"object","properties":{}},"CloudVersionEngineGodotConfig":{"type":"object","properties":{}},"CloudVersionEngineHtml5Config":{"type":"object","properties":{}},"CloudVersionEngineUnityConfig":{"type":"object","properties":{}},"CloudVersionEngineUnrealConfig":{"type":"object","properties":{"game_module":{"type":"string","description":"Name of the Unreal module that holds the game code.\nThis is usually the value of `$.Modules[0].Name` in the file `MyProject.unproject`.\n_Configures Rivet CLI behavior. Has no effect on server behavior._"}},"required":["game_module"]},"CloudVersionMatchmakerPortRange":{"type":"object","description":"Range of ports that can be connected to.\nIf configured, `network_mode` must equal `host`.\nPort ranges may overlap between containers, it is the responsibility of the developer to ensure ports are available before using.\nRead more about host networking [here](https://rivet.dev/docs/dynamic-servers/concepts/host-bridge-networking).\nOnly available on Rivet Open Source & Enterprise.\n\n### Related\n\n- cloud.version.matchmaker.PortProtocol\n- cloud.version.matchmaker.ProxyKind","properties":{"min":{"type":"integer","description":"Unsigned 32 bit integer."},"max":{"type":"integer","description":"Unsigned 32 bit integer."}},"required":["min","max"]},"CloudVersionMatchmakerPortProtocol":{"type":"string","enum":["http","https","tcp","tcp_tls","udp"],"description":"Signifies the protocol of the port.\nNote that when proxying through GameGuard (via `ProxyKind`), the port number returned by `/find`, `/join`, and `/create` will not be the same as the port number configured in the config:\n\n- With HTTP, the port will always be 80. The hostname of the port correctly routes the incoming\n connection to the correct port being used by the game server.\n- With HTTPS, the port will always be 443. The hostname of the port correctly routes the incoming\n connection to the correct port being used by the game server.\n- Using TCP/UDP, the port will be a random number between 26000 and 31999. This gets automatically\n routed to the correct port being used by the game server.\n\n### Related - cloud.version.matchmaker.GameModeRuntimeDockerPort - cloud.version.matchmaker.ProxyKind - /docs/dynamic-servers/concepts/game-guard - matchmaker.lobbies.find"},"CloudVersionMatchmakerProxyKind":{"type":"string","enum":["none","game_guard"],"description":"Range of ports that can be connected to.\n`game_guard` (default) proxies all traffic through [Game Guard](https://rivet.dev/docs/dynamic-servers/concepts/game-guard) to mitigate DDoS attacks and provide TLS termination.\n`none` sends traffic directly to the game server. If configured, `network_mode` must equal `host`. Read more about host networking [here](https://rivet.dev/docs/dynamic-servers/concepts/host-bridge-networking). Only available on Rivet Open Source & Enterprise.\n\n### Related - /docs/dynamic-servers/concepts/game-guard - cloud.version.matchmaker.PortProtocol"},"CloudVersionMatchmakerCaptcha":{"type":"object","description":"Matchmaker captcha configuration.","properties":{"requests_before_reverify":{"type":"integer","description":"Denotes how many requests a connection can make before it is required to reverify a captcha."},"verification_ttl":{"type":"integer","format":"int64","description":"Denotes how long a connection can continue to reconnect without having to reverify a captcha (in milliseconds)."},"hcaptcha":{"$ref":"#/components/schemas/CloudVersionMatchmakerCaptchaHcaptcha"},"turnstile":{"$ref":"#/components/schemas/CloudVersionMatchmakerCaptchaTurnstile"}},"required":["requests_before_reverify","verification_ttl"]},"CloudVersionMatchmakerCaptchaHcaptcha":{"type":"object","description":"hCpatcha configuration.","properties":{"level":{"$ref":"#/components/schemas/CloudVersionMatchmakerCaptchaHcaptchaLevel","description":"**Deprecated**"},"site_key":{"type":"string","description":"Site key for your hCaptcha application. Must be set."},"secret_key":{"type":"string","description":"Secret key for your hCaptcha application. Must be set."}}},"CloudVersionMatchmakerCaptchaHcaptchaLevel":{"type":"string","enum":["easy","moderate","difficult","always_on"],"description":"**Deprecated**\nHow hard a captcha should be."},"CloudVersionMatchmakerCaptchaTurnstile":{"type":"object","description":"Turnstile captcha configuration.","properties":{"site_key":{"type":"string"},"secret_key":{"type":"string"}},"required":["site_key","secret_key"]},"CloudVersionMatchmakerNetworkMode":{"type":"string","enum":["bridge","host"],"description":"Configures how the container's network is isolated from the host.\n`bridge` (default) networking isolates the container's network from the host & other containers.\n`host` networking removes isolation between the container and the host. Only available in Rivet Open Source & Enterprise.\nRead more about bridge vs host networking [here](https://rivet.dev/docs/dynamic-servers/concepts/host-bridge-networking)."},"CloudVersionMatchmakerGameMode":{"type":"object","description":"A game mode.","properties":{"regions":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeRegion"}},"max_players":{"type":"integer"},"max_players_direct":{"type":"integer"},"max_players_party":{"type":"integer"},"docker":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeRuntimeDocker"},"listable":{"type":"boolean"},"taggable":{"type":"boolean"},"allow_dynamic_max_players":{"type":"boolean"},"actions":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeActions"},"tier":{"type":"string"},"idle_lobbies":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeIdleLobbiesConfig"}}},"CloudVersionMatchmakerGameModeRegion":{"type":"object","description":"A game mode region.","properties":{"tier":{"type":"string"},"idle_lobbies":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeIdleLobbiesConfig"}}},"CloudVersionMatchmakerGameModeRuntimeDocker":{"type":"object","description":"A game mode runtime running through Docker.","properties":{"dockerfile":{"type":"string","description":"_Configures Rivet CLI behavior. Has no effect on server behavior._"},"build_args":{"type":"object","additionalProperties":{"type":"string"},"description":"_Configures Rivet CLI behavior. Has no effect on server behavior._"},"image":{"type":"string","description":"_Configures Rivet CLI behavior. Has no effect on server behavior._"},"image_id":{"type":"string","format":"uuid"},"args":{"type":"array","items":{"type":"string"}},"env":{"type":"object","additionalProperties":{"type":"string"}},"network_mode":{"$ref":"#/components/schemas/CloudVersionMatchmakerNetworkMode"},"ports":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeRuntimeDockerPort"}}}},"CloudVersionMatchmakerGameModeRuntimeDockerPort":{"type":"object","description":"Port config for a docker build.","properties":{"port":{"type":"integer","description":"The port number to connect to.\n\n### Related - cloud.version.matchmaker.PortProtocol - cloud.version.matchmaker.ProxyKind"},"port_range":{"$ref":"#/components/schemas/CloudVersionMatchmakerPortRange"},"protocol":{"$ref":"#/components/schemas/CloudVersionMatchmakerPortProtocol"},"proxy":{"$ref":"#/components/schemas/CloudVersionMatchmakerProxyKind","description":"How this port should be proxied. Defaults to 'game-guard`."},"dev_port":{"type":"integer","description":"_Configures Rivet CLI behavior. Has no effect on server behavior._"},"dev_port_range":{"$ref":"#/components/schemas/CloudVersionMatchmakerPortRange","description":"_Configures Rivet CLI behavior. Has no effect on server behavior._"},"dev_protocol":{"$ref":"#/components/schemas/CloudVersionMatchmakerPortProtocol","description":"_Configures Rivet CLI behavior. Has no effect on server behavior._"}}},"CloudVersionMatchmakerGameModeIdleLobbiesConfig":{"type":"object","description":"Configuration for how many idle lobbies a game version should have.","properties":{"min":{"type":"integer"},"max":{"type":"integer"}},"required":["min","max"]},"CloudVersionMatchmakerGameModeActions":{"type":"object","description":"Configuration for the connection types allowed for a game mode.","properties":{"find":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeFindConfig"},"join":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeJoinConfig"},"create":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeCreateConfig"}}},"CloudVersionMatchmakerGameModeIdentityRequirement":{"type":"string","enum":["none","guest","registered"],"description":"**Deprecated**\nThe registration requirement for a user when joining/finding/creating a lobby. \"None\" allows for connections without an identity."},"CloudVersionMatchmakerGameModeVerificationConfig":{"type":"object","description":"Configuration that tells Rivet where to send validation requests and with what headers. When set, Rivet will send the `verification_data` property (given by the user in the find/join/create endpoint) to the given url along with the headers provided and some information about the requested lobby. The response of this request will determine if the user can join that lobby or not.","properties":{"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["url","headers"]},"CloudVersionMatchmakerGameModeFindConfig":{"type":"object","description":"Configures the requirements and authentication for the /find endpoint. If this value is not set in the config, the /find endpoint is still enabled.","properties":{"enabled":{"type":"boolean","description":"Sets whether or not the /find endpoint is enabled."},"identity_requirement":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeIdentityRequirement"},"verification":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeVerificationConfig"}},"required":["enabled"]},"CloudVersionMatchmakerGameModeJoinConfig":{"type":"object","description":"Configures the requirements and authentication for the /join endpoint. If this value is not set in the config, the /join endpoint is still enabled.","properties":{"enabled":{"type":"boolean","description":"Sets whether or not the /join endpoint is enabled."},"identity_requirement":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeIdentityRequirement"},"verification":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeVerificationConfig"}},"required":["enabled"]},"CloudVersionMatchmakerGameModeCreateConfig":{"type":"object","description":"Configures the requirements and authentication for the /create endpoint. If this value is not set in the config, the /create endpoint is NOT enabled.","properties":{"enabled":{"type":"boolean","description":"Sets whether or not the /create endpoint is enabled."},"identity_requirement":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeIdentityRequirement"},"verification":{"$ref":"#/components/schemas/CloudVersionMatchmakerGameModeVerificationConfig"},"enable_public":{"type":"boolean","description":"Defaults to false when unset."},"enable_private":{"type":"boolean","description":"Defaults to true when unset."},"max_lobbies_per_identity":{"type":"integer","description":"**Deprecated**"}},"required":["enabled"]},"CloudVersionMatchmakerLobbyGroup":{"type":"object","description":"A game mode.","properties":{"name_id":{"type":"string","description":"**Deprecated: use GameMode instead**\nA human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."},"regions":{"type":"array","items":{"$ref":"#/components/schemas/CloudVersionMatchmakerLobbyGroupRegion"},"description":"A list of game mode regions."},"max_players_normal":{"type":"integer","description":"Unsigned 32 bit integer."},"max_players_direct":{"type":"integer","description":"Unsigned 32 bit integer."},"max_players_party":{"type":"integer","description":"Unsigned 32 bit integer."},"runtime":{"$ref":"#/components/schemas/CloudVersionMatchmakerLobbyGroupRuntime"}},"required":["name_id","regions","max_players_normal","max_players_direct","max_players_party","runtime"]},"CloudVersionMatchmakerLobbyGroupRuntime":{"type":"object","description":"**Deprecated: use GameMode instead**\nA union representing the runtime a game mode runs on.","properties":{"docker":{"$ref":"#/components/schemas/CloudVersionMatchmakerLobbyGroupRuntimeDocker"}}},"CloudVersionMatchmakerLobbyGroupRegion":{"type":"object","description":"**Deprecated: use GameMode instead**\nA game mode region.","properties":{"region_id":{"type":"string","format":"uuid"},"tier_name_id":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."},"idle_lobbies":{"$ref":"#/components/schemas/CloudVersionMatchmakerLobbyGroupIdleLobbiesConfig"}},"required":["region_id","tier_name_id"]},"CloudVersionMatchmakerLobbyGroupRuntimeDocker":{"type":"object","description":"**Deprecated: use GameMode instead**\nA game mode runtime running through Docker.","properties":{"build_id":{"type":"string","format":"uuid"},"args":{"type":"array","items":{"type":"string"}},"env_vars":{"type":"array","items":{"$ref":"#/components/schemas/CloudVersionMatchmakerLobbyGroupRuntimeDockerEnvVar"}},"network_mode":{"$ref":"#/components/schemas/CloudVersionMatchmakerNetworkMode"},"ports":{"type":"array","items":{"$ref":"#/components/schemas/CloudVersionMatchmakerLobbyGroupRuntimeDockerPort"}}},"required":["args","env_vars","ports"]},"CloudVersionMatchmakerLobbyGroupRuntimeDockerEnvVar":{"type":"object","description":"**Deprecated: use GameMode instead**\nA docker environment variable.","properties":{"key":{"type":"string"},"value":{"type":"string"}},"required":["key","value"]},"CloudVersionMatchmakerLobbyGroupRuntimeDockerPort":{"type":"object","description":"**Deprecated: use GameMode instead**\nA docker port.","properties":{"label":{"type":"string","description":"The label of this docker port."},"target_port":{"type":"integer","description":"The port number to connect to."},"port_range":{"$ref":"#/components/schemas/CloudVersionMatchmakerPortRange"},"proxy_protocol":{"$ref":"#/components/schemas/CloudVersionMatchmakerPortProtocol"}},"required":["label","proxy_protocol"]},"CloudVersionMatchmakerLobbyGroupIdleLobbiesConfig":{"type":"object","description":"**Deprecated: use GameMode instead**\nConfiguration for how many idle lobbies a game version should have.","properties":{"min_idle_lobbies":{"type":"integer","description":"Unsigned 32 bit integer."},"max_idle_lobbies":{"type":"integer","description":"Unsigned 32 bit integer."}},"required":["min_idle_lobbies","max_idle_lobbies"]},"Identifier":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `uuid` because this is intended to be human readable. Different than `DisplayName` because this should not include special characters and be short."},"Bio":{"type":"string","description":"Follows regex ^(?:[^\\n\\r]+\\n?|\\n){1,5}$"},"Email":{"type":"string","description":"A valid email address"},"Jwt":{"type":"string","description":"Documentation at https://jwt.io/"},"WatchQuery":{"type":"string","description":"A query parameter denoting the requests watch index."},"WatchResponse":{"type":"object","description":"Provided by watchable endpoints used in blocking loops.","properties":{"index":{"type":"string","description":"Index indicating the version of the data responded.\nPass this to `WatchQuery` to block and wait for the next response."}},"required":["index"]},"DisplayName":{"type":"string","description":"Represent a resource's readable display name."},"AccountNumber":{"type":"integer"},"Timestamp":{"type":"string","format":"date-time","description":"RFC3339 timestamp"},"GlobalEventNotification":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"thumbnail_url":{"type":"string"},"url":{"type":"string"}},"required":["title","description","thumbnail_url","url"]},"ValidationError":{"type":"object","description":"An error given by failed content validation.","properties":{"path":{"type":"array","items":{"type":"string"},"description":"A list of strings denoting the origin of a validation error."}},"required":["path"]},"EmptyObject":{"type":"object","properties":{}},"ErrorMetadata":{"description":"Unstructured metadata relating to an error. Must be manually parsed."},"ErrorBody":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"ray_id":{"type":"string"},"documentation":{"type":"string"},"metadata":{"$ref":"#/components/schemas/ErrorMetadata"}},"required":["code","message","ray_id"]},"Pagination":{"type":"object","properties":{"cursor":{"type":"string"}}},"GameHandle":{"type":"object","properties":{"game_id":{"type":"string","format":"uuid"},"name_id":{"$ref":"#/components/schemas/Identifier"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"logo_url":{"type":"string","description":"The URL of this game's logo image."},"banner_url":{"type":"string","description":"The URL of this game's banner image."}},"required":["game_id","name_id","display_name"]},"GameGameSummary":{"type":"object","properties":{"game_id":{"type":"string","format":"uuid"},"name_id":{"$ref":"#/components/schemas/Identifier"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"logo_url":{"type":"string","description":"The URL of this game's logo image."},"banner_url":{"type":"string","description":"The URL of this game's banner image."},"url":{"type":"string"},"developer":{"$ref":"#/components/schemas/GroupHandle"},"total_player_count":{"type":"integer","description":"Unsigned 32 bit integer."}},"required":["game_id","name_id","display_name","url","developer","total_player_count"]},"GameProfile":{"type":"object","description":"A game profile.","properties":{"game_id":{"type":"string","format":"uuid"},"name_id":{"type":"string","description":"A human readable short identifier used to references resources. Different than a `rivet.common#Uuid` because this is intended to be human readable. Different than `rivet.common#DisplayName` because this should not include special characters and be short."},"display_name":{"$ref":"#/components/schemas/DisplayName"},"logo_url":{"type":"string","description":"The URL of this game's logo image."},"banner_url":{"type":"string","description":"The URL of this game's banner image."},"url":{"type":"string","description":"The URL to this game's website."},"developer":{"$ref":"#/components/schemas/GroupGroupSummary"},"tags":{"type":"array","items":{"type":"string"},"description":"A list of game tags."},"description":{"type":"string","description":"A description of the given game."},"platforms":{"type":"array","items":{"$ref":"#/components/schemas/GamePlatformLink"},"description":"A list of platform links."},"recommended_groups":{"type":"array","items":{"$ref":"#/components/schemas/GroupGroupSummary"},"description":"A list of group summaries."},"identity_leaderboard_categories":{"type":"array","items":{"$ref":"#/components/schemas/GameLeaderboardCategory"},"description":"A list of game leaderboard categories."},"group_leaderboard_categories":{"type":"array","items":{"$ref":"#/components/schemas/GameLeaderboardCategory"},"description":"A list of game leaderboard categories."}},"required":["game_id","name_id","display_name","url","developer","tags","description","platforms","recommended_groups","identity_leaderboard_categories","group_leaderboard_categories"]},"GamePlatformLink":{"type":"object","description":"A platform link denoting a supported platform.","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"},"url":{"type":"string","description":"The URL to the given game's method of distribution on this platform."}},"required":["display_name","url"]},"GameLeaderboardCategory":{"type":"object","description":"A game leaderboard category.","properties":{"display_name":{"$ref":"#/components/schemas/DisplayName"}},"required":["display_name"]},"GameStatSummary":{"type":"object","description":"A game statistic summary.","properties":{"game":{"$ref":"#/components/schemas/GameHandle"},"stats":{"type":"array","items":{"$ref":"#/components/schemas/GameStat"}}},"required":["game","stats"]},"GameStat":{"type":"object","description":"A game statistic.","properties":{"config":{"$ref":"#/components/schemas/GameStatConfig"},"overall_value":{"type":"number","format":"double","description":"A single overall value of the given statistic."}},"required":["config","overall_value"]},"GameStatConfig":{"type":"object","description":"A game statistic config.","properties":{"record_id":{"type":"string","format":"uuid"},"icon_id":{"type":"string","format":"uuid"},"format":{"$ref":"#/components/schemas/GameStatFormatMethod"},"aggregation":{"$ref":"#/components/schemas/GameStatAggregationMethod"},"sorting":{"$ref":"#/components/schemas/GameStatSortingMethod"},"priority":{"type":"integer"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"postfix_singular":{"type":"string","description":"A string appended to the end of a singular game statistic's value. Example: 1 **dollar**."},"postfix_plural":{"type":"string","description":"A string appended to the end of a game statistic's value that is not exactly 1. Example: 45 **dollars**."},"prefix_singular":{"type":"string","description":"A string appended to the beginning of a singular game statistic's value. Example: **value** 1."},"prefix_plural":{"type":"string","description":"A string prepended to the beginning of a game statistic's value that is not exactly 1. Example: **values** 45."}},"required":["record_id","icon_id","format","aggregation","sorting","priority","display_name"]},"GameStatFormatMethod":{"type":"string","enum":["integer","float_1","float_2","float_3","duration_minute","duration_second","duration_hundredth_second"],"description":"A value denoting the format method of a game statistic."},"GameStatAggregationMethod":{"type":"string","enum":["sum","average","min","max"],"description":"A value denoting the aggregation method of a game statistic."},"GameStatSortingMethod":{"type":"string","enum":["desc","asc"],"description":"A value denoting the sorting method of a game statistic."},"GamesEnvironmentsCreateServiceTokenResponse":{"type":"object","properties":{"token":{"type":"string","description":"A JSON Web Token."}},"required":["token"]},"GeoCoord":{"type":"object","description":"Geographical coordinates for a location on Planet Earth.","properties":{"latitude":{"type":"number","format":"double"},"longitude":{"type":"number","format":"double"}},"required":["latitude","longitude"]},"GeoDistance":{"type":"object","description":"Distance available in multiple units.","properties":{"kilometers":{"type":"number","format":"double"},"miles":{"type":"number","format":"double"}},"required":["kilometers","miles"]},"GroupGroupSummary":{"type":"object","properties":{"group_id":{"type":"string","format":"uuid"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"avatar_url":{"type":"string","description":"The URL of this group's avatar image."},"external":{"$ref":"#/components/schemas/GroupExternalLinks"},"is_developer":{"type":"boolean","description":"**Deprecated**\nWhether or not this group is a developer."},"bio":{"$ref":"#/components/schemas/Bio"},"is_current_identity_member":{"type":"boolean","description":"Whether or not the current identity is a member of this group."},"publicity":{"$ref":"#/components/schemas/GroupPublicity"},"member_count":{"type":"integer"},"owner_identity_id":{"type":"string","format":"uuid"}},"required":["group_id","display_name","external","is_developer","bio","is_current_identity_member","publicity","member_count","owner_identity_id"]},"GroupPublicity":{"type":"string","enum":["open","closed"],"description":"The current publicity value for the given group."},"GroupHandle":{"type":"object","description":"A group handle.","properties":{"group_id":{"type":"string","format":"uuid"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"avatar_url":{"type":"string","description":"The URL of this group's avatar image"},"external":{"$ref":"#/components/schemas/GroupExternalLinks"},"is_developer":{"type":"boolean","description":"Whether or not this group is a developer group."}},"required":["group_id","display_name","external"]},"GroupExternalLinks":{"type":"object","description":"External links for this group.","properties":{"profile":{"type":"string","description":"A link to this group's profile page."}},"required":["profile"]},"GroupJoinRequest":{"type":"object","description":"A group join request.","properties":{"identity":{"$ref":"#/components/schemas/IdentityHandle"},"ts":{"$ref":"#/components/schemas/Timestamp"}},"required":["identity","ts"]},"GroupMember":{"type":"object","description":"A group member.","properties":{"identity":{"$ref":"#/components/schemas/IdentityHandle"}},"required":["identity"]},"GroupProfile":{"type":"object","description":"A list of group profiles.","properties":{"group_id":{"type":"string","format":"uuid"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"avatar_url":{"type":"string","description":"The URL of this group's avatar image."},"external":{"$ref":"#/components/schemas/GroupExternalLinks"},"is_developer":{"type":"boolean","description":"Whether or not this group is a developer."},"bio":{"type":"string","description":"Detailed information about a profile."},"is_current_identity_member":{"type":"boolean","description":"Whether or not the current identity is a member of this group."},"publicity":{"$ref":"#/components/schemas/GroupPublicity"},"member_count":{"type":"integer","description":"Unsigned 32 bit integer."},"members":{"type":"array","items":{"$ref":"#/components/schemas/GroupMember"},"description":"A list of group members."},"join_requests":{"type":"array","items":{"$ref":"#/components/schemas/GroupJoinRequest"},"description":"A list of group join requests."},"is_current_identity_requesting_join":{"type":"boolean","description":"Whether or not the current identity is currently requesting to join this group."},"owner_identity_id":{"type":"string","format":"uuid"}},"required":["group_id","display_name","external","bio","publicity","members","join_requests","owner_identity_id"]},"GroupBannedIdentity":{"type":"object","description":"A banned identity.","properties":{"identity":{"$ref":"#/components/schemas/IdentityHandle"},"ban_ts":{"$ref":"#/components/schemas/Timestamp"}},"required":["identity","ban_ts"]},"GroupGetInviteResponse":{"type":"object","properties":{"group":{"$ref":"#/components/schemas/GroupHandle"}},"required":["group"]},"GroupConsumeInviteResponse":{"type":"object","properties":{"group_id":{"type":"string","format":"uuid"}}},"GroupCreateInviteRequest":{"type":"object","properties":{"ttl":{"type":"number","format":"double","description":"How long until the group invite expires (in milliseconds)."},"use_count":{"type":"number","format":"double","description":"How many times the group invite can be used."}}},"GroupCreateInviteResponse":{"type":"object","properties":{"code":{"type":"string","description":"The code that will be passed to `rivet.api.group#ConsumeInvite` to join a group."}},"required":["code"]},"GroupResolveJoinRequestRequest":{"type":"object","properties":{"resolution":{"type":"boolean"}}},"IdentityListActivitiesResponse":{"type":"object","properties":{"identities":{"type":"array","items":{"$ref":"#/components/schemas/IdentityHandle"}},"games":{"type":"array","items":{"$ref":"#/components/schemas/GameGameSummary"}},"suggested_groups":{"type":"array","items":{"$ref":"#/components/schemas/GroupGroupSummary"}},"suggested_players":{"type":"array","items":{"$ref":"#/components/schemas/IdentityHandle"}},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["identities","games","suggested_groups","suggested_players","watch"]},"IdentityGlobalEvent":{"type":"object","description":"An event relevant to the current identity.","properties":{"ts":{"$ref":"#/components/schemas/Timestamp"},"kind":{"$ref":"#/components/schemas/IdentityGlobalEventKind"},"notification":{"$ref":"#/components/schemas/IdentityGlobalEventNotification"}},"required":["ts","kind"]},"IdentityGlobalEventKind":{"type":"object","properties":{"identity_update":{"$ref":"#/components/schemas/IdentityGlobalEventIdentityUpdate"}}},"IdentityGlobalEventNotification":{"type":"object","description":"Notifications represent information that should be presented to the user\nimmediately.\nAt the moment, only chat message events have associated notifications.\n\n# Display\n\nNotifications should be displayed in an unobtrusive manner throughout the\nentire game. Notifications should disappear after a few seconds if not\ninteracted with.\n\n# Interactions\n\nIf your platform supports it, notifications should be able to be clicked or\ntapped in order to open the relevant context for the event.\nFor a simple implementation of notification interactions, open `url` in a\nweb browser to present the relevant context. For example, a chat message\nnotification will open the thread the chat message was sent in.\nFor advanced implementations that implement a custom chat UI, use\n`GlobalEvent.kind` to determine what action to take when the notification is interacted with.\nFor example, if the global event kind is `GlobalEventChatMessage`, then open\nthe chat UI for the given thread.","properties":{"title":{"type":"string"},"description":{"type":"string"},"thumbnail_url":{"type":"string","description":"URL to an image thumbnail that should be shown for this notification."},"url":{"type":"string","description":"Rivet Hub URL that holds the relevant context for this notification."}},"required":["title","description","thumbnail_url","url"]},"IdentityGlobalEventIdentityUpdate":{"type":"object","properties":{"identity":{"$ref":"#/components/schemas/IdentityProfile"}},"required":["identity"]},"IdentityUpdateGameActivity":{"type":"object","description":"Information about the identity's current game. This is information that all other identities can see about what the current identity is doing.","properties":{"message":{"type":"string","description":"A short message about the current game activity."},"public_metadata":{"description":"JSON data seen by anyone."},"mutual_metadata":{"description":"JSON data seen only by the given identity and their mutual followers."}}},"IdentityHandle":{"type":"object","description":"An identity handle.","properties":{"identity_id":{"type":"string","format":"uuid"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"account_number":{"$ref":"#/components/schemas/AccountNumber"},"avatar_url":{"type":"string","description":"The URL of this identity's avatar image."},"is_registered":{"type":"boolean","description":"Whether or not this identity is registered with a linked account."},"external":{"$ref":"#/components/schemas/IdentityExternalLinks"}},"required":["identity_id","display_name","account_number","avatar_url","is_registered","external"]},"IdentitySummary":{"type":"object","description":"An identity summary.","properties":{"identity_id":{"type":"string","format":"uuid"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"account_number":{"$ref":"#/components/schemas/AccountNumber"},"avatar_url":{"type":"string","description":"The URL of this identity's avatar image."},"is_registered":{"type":"boolean","description":"Whether or not this identity is registered with a linked account."},"external":{"$ref":"#/components/schemas/IdentityExternalLinks"},"following":{"type":"boolean","description":"Whether or not the requestee's identity is following this identity."},"is_following_me":{"type":"boolean","description":"Whether or not this identity is both following and is followed by the requestee's identity."},"is_mutual_following":{"type":"boolean"}},"required":["identity_id","display_name","account_number","avatar_url","is_registered","external","following","is_following_me","is_mutual_following"]},"IdentityProfile":{"type":"object","description":"An identity profile.","properties":{"identity_id":{"type":"string","format":"uuid"},"display_name":{"$ref":"#/components/schemas/DisplayName"},"account_number":{"$ref":"#/components/schemas/AccountNumber"},"avatar_url":{"type":"string","description":"The URL of this identity's avatar image."},"is_registered":{"type":"boolean","description":"Whether or not this identity is registered with a linked account."},"external":{"$ref":"#/components/schemas/IdentityExternalLinks"},"is_admin":{"type":"boolean","description":"Whether or not this identity is an admin."},"is_game_linked":{"type":"boolean","description":"Whether or not this game user has been linked through the Rivet dashboard."},"dev_state":{"$ref":"#/components/schemas/IdentityDevState","description":"**Deprecated**"},"follower_count":{"type":"integer","format":"int64"},"following_count":{"type":"integer","format":"int64"},"following":{"type":"boolean","description":"Whether or not the requestee's identity is following this identity."},"is_following_me":{"type":"boolean","description":"Whether or not this identity is both following and is followed by the requestee's identity."},"is_mutual_following":{"type":"boolean"},"join_ts":{"$ref":"#/components/schemas/Timestamp"},"bio":{"$ref":"#/components/schemas/Bio"},"linked_accounts":{"type":"array","items":{"$ref":"#/components/schemas/IdentityLinkedAccount"}},"groups":{"type":"array","items":{"$ref":"#/components/schemas/IdentityGroup"}},"games":{"type":"array","items":{"$ref":"#/components/schemas/GameStatSummary"}},"awaiting_deletion":{"type":"boolean","description":"Whether or not this identity is awaiting account deletion. Only visible to when the requestee is\nthis identity."}},"required":["identity_id","display_name","account_number","avatar_url","is_registered","external","is_admin","follower_count","following_count","following","is_following_me","is_mutual_following","join_ts","bio","linked_accounts","groups","games"]},"IdentityExternalLinks":{"type":"object","description":"External links for an identity.","properties":{"profile":{"type":"string","description":"A link to this identity's profile page."},"settings":{"type":"string","description":"A link to the Rivet settings page."}},"required":["profile"]},"IdentityStatus":{"type":"string","enum":["online","away","offline"],"description":"The current status of an identity. This helps players understand if another player is currently playing or has their game in the background."},"IdentityGameActivity":{"type":"object","description":"The game an identity is currently participating in.","properties":{"game":{"$ref":"#/components/schemas/GameHandle"},"message":{"type":"string","description":"A short activity message about the current game activity."},"public_metadata":{"description":"JSON data seen by anyone."},"mutual_metadata":{"description":"JSON data seen only by the given identity and their mutual followers."}},"required":["game","message"]},"IdentityGroup":{"type":"object","description":"A group that the given identity.","properties":{"group":{"$ref":"#/components/schemas/GroupHandle"}},"required":["group"]},"IdentityLinkedAccount":{"type":"object","description":"A union representing an identity's linked accounts.","properties":{"email":{"$ref":"#/components/schemas/IdentityEmailLinkedAccount"},"default_user":{"type":"boolean"}}},"IdentityEmailLinkedAccount":{"type":"object","description":"An identity's linked email.","properties":{"email":{"$ref":"#/components/schemas/Email"}},"required":["email"]},"IdentityDevState":{"type":"string","enum":["inactive","pending","accepted"],"description":"The state of the given identity's developer status."},"IdentityGameLinkStatus":{"type":"string","enum":["incomplete","complete","cancelled"]},"IdentityWatchEventsResponse":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/IdentityGlobalEvent"}},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["events","watch"]},"MatchmakerLobbyInfo":{"type":"object","description":"A public lobby in the lobby list.","properties":{"region_id":{"type":"string"},"game_mode_id":{"type":"string"},"lobby_id":{"type":"string","format":"uuid"},"max_players_normal":{"type":"integer"},"max_players_direct":{"type":"integer"},"max_players_party":{"type":"integer"},"total_player_count":{"type":"integer"},"state":{}},"required":["region_id","game_mode_id","lobby_id","max_players_normal","max_players_direct","max_players_party","total_player_count"]},"MatchmakerGameModeInfo":{"type":"object","description":"A game mode that the player can join.","properties":{"game_mode_id":{"$ref":"#/components/schemas/Identifier"}},"required":["game_mode_id"]},"MatchmakerRegionInfo":{"type":"object","description":"A region that the player can connect to.","properties":{"region_id":{"$ref":"#/components/schemas/Identifier"},"provider_display_name":{"$ref":"#/components/schemas/DisplayName"},"region_display_name":{"$ref":"#/components/schemas/DisplayName"},"datacenter_coord":{"$ref":"#/components/schemas/GeoCoord"},"datacenter_distance_from_client":{"$ref":"#/components/schemas/GeoDistance"}},"required":["region_id","provider_display_name","region_display_name","datacenter_coord","datacenter_distance_from_client"]},"MatchmakerJoinLobby":{"type":"object","description":"A matchmaker lobby.","properties":{"lobby_id":{"type":"string","format":"uuid"},"region":{"$ref":"#/components/schemas/MatchmakerJoinRegion"},"ports":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/MatchmakerJoinPort"},"description":"**Deprecated**"},"player":{"$ref":"#/components/schemas/MatchmakerJoinPlayer","description":"**Deprecated**"}},"required":["lobby_id","region","ports","player"]},"MatchmakerJoinRegion":{"type":"object","description":"A matchmaker lobby region.","properties":{"region_id":{"$ref":"#/components/schemas/Identifier"},"display_name":{"$ref":"#/components/schemas/DisplayName"}},"required":["region_id","display_name"]},"MatchmakerJoinPort":{"type":"object","properties":{"host":{"type":"string","description":"The host for the given port. Will be null if using a port range."},"hostname":{"type":"string"},"port":{"type":"integer","description":"The port number for this lobby. Will be null if using a port range."},"port_range":{"$ref":"#/components/schemas/MatchmakerJoinPortRange"},"is_tls":{"type":"boolean","description":"Whether or not this lobby port uses TLS. You cannot mix a non-TLS and TLS ports."}},"required":["hostname","is_tls"]},"MatchmakerJoinPortRange":{"type":"object","description":"Inclusive range of ports that can be connected to.","properties":{"min":{"type":"integer","description":"Minimum port that can be connected to. Inclusive range."},"max":{"type":"integer","description":"Maximum port that can be connected to. Inclusive range."}},"required":["min","max"]},"MatchmakerJoinPlayer":{"type":"object","description":"A matchmaker lobby player.","properties":{"token":{"$ref":"#/components/schemas/Jwt","description":"Pass this token through the socket to the lobby server. The lobby server will validate this token with `PlayerConnected.player_token`"}},"required":["token"]},"MatchmakerCustomLobbyPublicity":{"type":"string","enum":["public","private"]},"MatchmakerFindLobbyResponse":{"type":"object","properties":{"lobby":{"$ref":"#/components/schemas/MatchmakerJoinLobby"},"ports":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/MatchmakerJoinPort"}},"player":{"$ref":"#/components/schemas/MatchmakerJoinPlayer"}},"required":["lobby","ports","player"]},"MatchmakerJoinLobbyResponse":{"type":"object","properties":{"lobby":{"$ref":"#/components/schemas/MatchmakerJoinLobby"},"ports":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/MatchmakerJoinPort"}},"player":{"$ref":"#/components/schemas/MatchmakerJoinPlayer"}},"required":["lobby","ports","player"]},"MatchmakerCreateLobbyResponse":{"type":"object","properties":{"lobby":{"$ref":"#/components/schemas/MatchmakerJoinLobby"},"ports":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/MatchmakerJoinPort"}},"player":{"$ref":"#/components/schemas/MatchmakerJoinPlayer"}},"required":["lobby","ports","player"]},"MatchmakerListLobbiesResponse":{"type":"object","properties":{"game_modes":{"type":"array","items":{"$ref":"#/components/schemas/MatchmakerGameModeInfo"}},"regions":{"type":"array","items":{"$ref":"#/components/schemas/MatchmakerRegionInfo"}},"lobbies":{"type":"array","items":{"$ref":"#/components/schemas/MatchmakerLobbyInfo"}}},"required":["game_modes","regions","lobbies"]},"MatchmakerGetStatisticsResponse":{"type":"object","properties":{"player_count":{"type":"integer","format":"int64"},"game_modes":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/MatchmakerGameModeStatistics"}}},"required":["player_count","game_modes"]},"MatchmakerGameModeStatistics":{"type":"object","properties":{"player_count":{"type":"integer","format":"int64"},"regions":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/MatchmakerRegionStatistics"}}},"required":["player_count","regions"]},"MatchmakerRegionStatistics":{"type":"object","properties":{"player_count":{"type":"integer","format":"int64"}},"required":["player_count"]},"MatchmakerListRegionsResponse":{"type":"object","properties":{"regions":{"type":"array","items":{"$ref":"#/components/schemas/MatchmakerRegionInfo"}}},"required":["regions"]},"PortalNotificationRegisterService":{"type":"object","properties":{"firebase":{"$ref":"#/components/schemas/PortalNotificationRegisterFirebaseService"}}},"PortalNotificationRegisterFirebaseService":{"type":"object","properties":{"access_key":{"type":"string"}},"required":["access_key"]},"PortalNotificationUnregisterService":{"type":"string","enum":["firebase"]},"PortalGetSuggestedGamesResponse":{"type":"object","properties":{"games":{"type":"array","items":{"$ref":"#/components/schemas/GameGameSummary"},"description":"A list of game summaries."},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["games","watch"]},"PortalGetGameProfileResponse":{"type":"object","properties":{"game":{"$ref":"#/components/schemas/GameProfile"},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["game","watch"]},"ProvisionPoolType":{"type":"string","enum":["job","gg","ats","pegboard","pegboard_isolate","fdb","worker","nats","guard"]},"ProvisionServer":{"type":"object","properties":{"server_id":{"type":"string","format":"uuid"},"datacenter_id":{"type":"string","format":"uuid"},"pool_type":{"$ref":"#/components/schemas/ProvisionPoolType"},"lan_ip":{"type":"string"},"wan_ip":{"type":"string"}},"required":["server_id","datacenter_id","pool_type"]},"RegionsRegion":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"]},"RoutesRouteTargetActors":{"type":"object","description":"Configuration for targeting actors.","properties":{"selector_tags":{"type":"object","additionalProperties":{"type":"string"},"description":"Tags of actors to route requests to."}},"required":["selector_tags"]},"RoutesRouteTarget":{"type":"object","properties":{"actors":{"$ref":"#/components/schemas/RoutesRouteTargetActors","description":"Configuration for targeting actors."}}},"RoutesRoute":{"type":"object","properties":{"id":{"type":"string"},"created_at":{"$ref":"#/components/schemas/Timestamp"},"updated_at":{"$ref":"#/components/schemas/Timestamp"},"hostname":{"type":"string"},"path":{"type":"string"},"route_subpaths":{"type":"boolean","description":"Whether to route all subpaths of this path"},"strip_prefix":{"type":"boolean","description":"Whether to remove the path prefix before sending the request to the target."},"target":{"$ref":"#/components/schemas/RoutesRouteTarget"}},"required":["id","created_at","updated_at","hostname","path","route_subpaths","strip_prefix","target"]},"ServersGetBuildResponse":{"type":"object","properties":{"build":{"$ref":"#/components/schemas/ServersBuild"}},"required":["build"]},"ServersListBuildsResponse":{"type":"object","properties":{"builds":{"type":"array","items":{"$ref":"#/components/schemas/ServersBuild"},"description":"A list of builds for the game associated with the token."}},"required":["builds"]},"ServersPatchBuildTagsRequest":{"type":"object","properties":{"tags":{},"exclusive_tags":{"type":"array","items":{"type":"string"},"description":"Removes the given tag keys from all other builds."}},"required":["tags"]},"ServersPatchBuildTagsResponse":{"type":"object","properties":{}},"ServersCreateBuildRequest":{"type":"object","properties":{"name":{"type":"string"},"image_tag":{"type":"string","description":"A tag given to the game build."},"image_file":{"$ref":"#/components/schemas/UploadPrepareFile"},"multipart_upload":{"type":"boolean"},"kind":{"$ref":"#/components/schemas/ServersBuildKind"},"compression":{"$ref":"#/components/schemas/ServersBuildCompression"},"prewarm_datacenters":{"type":"array","items":{"type":"string","format":"uuid"}}},"required":["name","image_tag","image_file"]},"ServersCreateBuildResponse":{"type":"object","properties":{"build":{"type":"string","format":"uuid"},"image_presigned_request":{"$ref":"#/components/schemas/UploadPresignedRequest"},"image_presigned_requests":{"type":"array","items":{"$ref":"#/components/schemas/UploadPresignedRequest"}}},"required":["build"]},"ServersBuildKind":{"type":"string","enum":["docker_image","oci_bundle"]},"ServersBuildCompression":{"type":"string","enum":["none","lz4"]},"ServersServer":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","format":"uuid"},"datacenter":{"type":"string","format":"uuid"},"tags":{},"runtime":{"$ref":"#/components/schemas/ServersRuntime"},"network":{"$ref":"#/components/schemas/ServersNetwork"},"resources":{"$ref":"#/components/schemas/ServersResources"},"lifecycle":{"$ref":"#/components/schemas/ServersLifecycle"},"created_at":{"type":"integer","format":"int64"},"started_at":{"type":"integer","format":"int64"},"destroyed_at":{"type":"integer","format":"int64"}},"required":["id","environment","datacenter","tags","runtime","network","resources","lifecycle","created_at"]},"ServersRuntime":{"type":"object","properties":{"build":{"type":"string","format":"uuid"},"arguments":{"type":"array","items":{"type":"string"}},"environment":{"type":"object","additionalProperties":{"type":"string"}}},"required":["build"]},"ServersLifecycle":{"type":"object","properties":{"kill_timeout":{"type":"integer","format":"int64","description":"The duration to wait for in milliseconds before killing the server. This should be set to a safe default, and can be overridden during a DELETE request if needed."}}},"ServersResources":{"type":"object","properties":{"cpu":{"type":"integer","description":"The number of CPU cores in millicores, or 1/1000 of a core. For example,\n1/8 of a core would be 125 millicores, and 1 core would be 1000\nmillicores."},"memory":{"type":"integer","description":"The amount of memory in megabytes"}},"required":["cpu","memory"]},"ServersNetwork":{"type":"object","properties":{"mode":{"$ref":"#/components/schemas/ServersNetworkMode"},"ports":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ServersPort"}}},"required":["ports"]},"ServersNetworkMode":{"type":"string","enum":["bridge","host"]},"ServersPort":{"type":"object","properties":{"protocol":{"$ref":"#/components/schemas/ServersPortProtocol"},"internal_port":{"type":"integer"},"public_hostname":{"type":"string"},"public_port":{"type":"integer"},"routing":{"$ref":"#/components/schemas/ServersPortRouting"}},"required":["protocol","routing"]},"ServersPortProtocol":{"type":"string","enum":["http","https","tcp","tcp_tls","udp"]},"ServersPortRouting":{"type":"object","properties":{"game_guard":{"$ref":"#/components/schemas/ServersGameGuardRouting"},"host":{"$ref":"#/components/schemas/ServersHostRouting"}}},"ServersGameGuardRouting":{"type":"object","properties":{}},"ServersHostRouting":{"type":"object","properties":{}},"ServersBuild":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"created_at":{"$ref":"#/components/schemas/Timestamp"},"content_length":{"type":"integer","format":"int64","description":"Unsigned 64 bit integer."},"tags":{"type":"object","additionalProperties":{"type":"string"},"description":"Tags of this build"}},"required":["id","name","created_at","content_length","tags"]},"ServersDatacenter":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"name":{"type":"string"}},"required":["id","slug","name"]},"ServersListDatacentersResponse":{"type":"object","properties":{"datacenters":{"type":"array","items":{"$ref":"#/components/schemas/ServersDatacenter"}}},"required":["datacenters"]},"ServersGetServerLogsResponse":{"type":"object","properties":{"lines":{"type":"array","items":{"type":"string"},"description":"Sorted old to new."},"timestamps":{"type":"array","items":{"type":"string"},"description":"Sorted old to new."},"watch":{"$ref":"#/components/schemas/WatchResponse"}},"required":["lines","timestamps","watch"]},"ServersLogStream":{"type":"string","enum":["std_out","std_err"]},"UploadPresignedRequest":{"type":"object","description":"A presigned request used to upload files. Upload your file to the given URL via a PUT request.","properties":{"path":{"type":"string","description":"The name of the file to upload. This is the same as the one given in the upload prepare file."},"url":{"type":"string","description":"The URL of the presigned request for which to upload your file to."},"byte_offset":{"type":"integer","format":"int64","description":"The byte offset for this multipart chunk. Always 0 if not a multipart upload."},"content_length":{"type":"integer","format":"int64","description":"Expected size of this upload."}},"required":["path","url","byte_offset","content_length"]},"UploadPrepareFile":{"type":"object","description":"A file being prepared to upload.","properties":{"path":{"type":"string","description":"The path/filename of the file."},"content_type":{"type":"string","description":"The MIME type of the file."},"content_length":{"type":"integer","format":"int64","description":"Unsigned 64 bit integer."}},"required":["path","content_length"]}}} \ No newline at end of file diff --git a/site/src/content/docs/cloud/cli.mdx b/site/src/content/docs/cloud-ee/cli.mdx similarity index 100% rename from site/src/content/docs/cloud/cli.mdx rename to site/src/content/docs/cloud-ee/cli.mdx diff --git a/site/src/content/docs/cloud/config.mdx b/site/src/content/docs/cloud-ee/config.mdx similarity index 100% rename from site/src/content/docs/cloud/config.mdx rename to site/src/content/docs/cloud-ee/config.mdx diff --git a/site/src/content/docs/cloud/containers.mdx b/site/src/content/docs/cloud-ee/containers.mdx similarity index 100% rename from site/src/content/docs/cloud/containers.mdx rename to site/src/content/docs/cloud-ee/containers.mdx diff --git a/site/src/content/docs/cloud/continuous-delivery.mdx b/site/src/content/docs/cloud-ee/continuous-delivery.mdx similarity index 98% rename from site/src/content/docs/cloud/continuous-delivery.mdx rename to site/src/content/docs/cloud-ee/continuous-delivery.mdx index 0d5c6551ac..c5dc32a29a 100644 --- a/site/src/content/docs/cloud/continuous-delivery.mdx +++ b/site/src/content/docs/cloud-ee/continuous-delivery.mdx @@ -61,7 +61,7 @@ jobs: - name: Install Rivet CLI env: RIVET_CLI_VERSION: 25.2.2 - run: curl -fsSL https://releases.rivet.gg/rivet/latest/install.sh | sh + run: curl -fsSL https://releases.rivet.dev/rivet/latest/install.sh | sh # Deploy to a Rivet environment matching the branch name - name: Deploy to environment diff --git a/site/src/content/docs/cloud/durability.mdx b/site/src/content/docs/cloud-ee/durability.mdx similarity index 100% rename from site/src/content/docs/cloud/durability.mdx rename to site/src/content/docs/cloud-ee/durability.mdx diff --git a/site/src/content/docs/cloud/edge.mdx b/site/src/content/docs/cloud-ee/edge.mdx similarity index 100% rename from site/src/content/docs/cloud/edge.mdx rename to site/src/content/docs/cloud-ee/edge.mdx diff --git a/site/src/content/docs/cloud/environment-variables.mdx b/site/src/content/docs/cloud-ee/environment-variables.mdx similarity index 100% rename from site/src/content/docs/cloud/environment-variables.mdx rename to site/src/content/docs/cloud-ee/environment-variables.mdx diff --git a/site/src/content/docs/cloud/faq.mdx b/site/src/content/docs/cloud-ee/faq.mdx similarity index 100% rename from site/src/content/docs/cloud/faq.mdx rename to site/src/content/docs/cloud-ee/faq.mdx diff --git a/site/src/content/docs/cloud/functions.mdx b/site/src/content/docs/cloud-ee/functions.mdx similarity index 100% rename from site/src/content/docs/cloud/functions.mdx rename to site/src/content/docs/cloud-ee/functions.mdx diff --git a/site/src/content/docs/cloud/hub.mdx b/site/src/content/docs/cloud-ee/hub.mdx similarity index 100% rename from site/src/content/docs/cloud/hub.mdx rename to site/src/content/docs/cloud-ee/hub.mdx diff --git a/site/src/content/docs/cloud/images/install/actors.png b/site/src/content/docs/cloud-ee/images/install/actors.png similarity index 100% rename from site/src/content/docs/cloud/images/install/actors.png rename to site/src/content/docs/cloud-ee/images/install/actors.png diff --git a/site/src/content/docs/cloud/images/install/builds.png b/site/src/content/docs/cloud-ee/images/install/builds.png similarity index 100% rename from site/src/content/docs/cloud/images/install/builds.png rename to site/src/content/docs/cloud-ee/images/install/builds.png diff --git a/site/src/content/docs/cloud-ee/index.mdx b/site/src/content/docs/cloud-ee/index.mdx new file mode 100644 index 0000000000..3201a11ab1 --- /dev/null +++ b/site/src/content/docs/cloud-ee/index.mdx @@ -0,0 +1,47 @@ +export const keywords = ["Rivet", "open-source", "backend", "functions", "actors", "containers", "serverless", "stateful"] + +import { Icon, faActorsBorderless, faServer, faFunction } from '@rivet-gg/icons'; +import { EnterpriseCloud } from "@/components/docs/EnterpriseCloud"; + +# Rivet Cloud (Enterprise) + +Rivet is the open-source serverless platform to scale complex backends anywhere like AI Agents, Real-Time Apps, and Multiplayer Games. + + + +## Stateless Functions + +**Description**: Short-lived HTTP requests at the edge + +**State**: No persistent state (store state in [Actors](/docs/actors) or external database) + +**Use Cases**: APIs, edge computing, microservices + +**Replaces**: Cloudflare Workers, AWS Lambda, Google Cloud Run Functions + +[Get Started →](/docs/cloud/functions) + +## Stateful Actors + +**Description**: Long running tasks with state persistence, hibernation, and realtime + +**State**: Yes, built-in state persistence (also works with external databases) + +**Use Cases**: AI agents, realtime apps, local-first sync, rate limiting, stream processing + +**Replaces**: Cloudflare Durable Objects, Redis, Socket.io, AWS Lambda + DynamoDB + EventBridge + +[Get Started →](/docs/actors) + +## Sandboxed Containers + +**Description**: Docker-like containers for CPU- or memory-intensive workloads + +**State**: No persistent state (store state in [Actors](/docs/actors) or external database) + +**Use Cases**: Sandboxed code execution, desktop/browser automation, game servers, FFmpeg, PDF processing + +**Replaces**: Kubernetes Batch Jobs, AWS Fargate, Google Cloud Run + +[Get Started →](/docs/cloud/containers) + diff --git a/site/src/content/docs/cloud/install.mdx b/site/src/content/docs/cloud-ee/install.mdx similarity index 75% rename from site/src/content/docs/cloud/install.mdx rename to site/src/content/docs/cloud-ee/install.mdx index 1ccc416c70..0d33f4c9f1 100644 --- a/site/src/content/docs/cloud/install.mdx +++ b/site/src/content/docs/cloud-ee/install.mdx @@ -35,12 +35,12 @@ npx rivet-cli@25.5.3 ```sh {{"title":"Latest"}} -curl -fsSL https://releases.rivet.gg/rivet/latest/install.sh | sh +curl -fsSL https://releases.rivet.dev/rivet/latest/install.sh | sh rivet --version ``` ```sh {{"title":"Pinned Version"}} export RIVET_CLI_VERSION=25.5.3 -curl -fsSL https://releases.rivet.gg/rivet/latest/install.sh | sh +curl -fsSL https://releases.rivet.dev/rivet/latest/install.sh | sh rivet --version ``` @@ -49,12 +49,12 @@ rivet --version ```ps1 {{"title":"Latest"}} -iwr https://releases.rivet.gg/rivet/latest/install.ps1 -useb | iex +iwr https://releases.rivet.dev/rivet/latest/install.ps1 -useb | iex rivet --version ``` ```ps1 {{"title":"Pinned Version"}} $env:RIVET_CLI_VERSION = "25.5.3" -iwr https://releases.rivet.gg/rivet/latest/install.ps1 -useb | iex +iwr https://releases.rivet.dev/rivet/latest/install.ps1 -useb | iex rivet --version ``` @@ -62,7 +62,7 @@ rivet --version ## Build From Source ```sh -git clone https://github.com/rivet-gg/rivet +git clone https://github.com/rivet-dev/rivet cargo build --bin rivet ./target/debug/rivet --version ``` diff --git a/site/src/content/docs/cloud/limitations.mdx b/site/src/content/docs/cloud-ee/limitations.mdx similarity index 100% rename from site/src/content/docs/cloud/limitations.mdx rename to site/src/content/docs/cloud-ee/limitations.mdx diff --git a/site/src/content/docs/cloud/local-development.mdx b/site/src/content/docs/cloud-ee/local-development.mdx similarity index 100% rename from site/src/content/docs/cloud/local-development.mdx rename to site/src/content/docs/cloud-ee/local-development.mdx diff --git a/site/src/content/docs/cloud/networking.mdx b/site/src/content/docs/cloud-ee/networking.mdx similarity index 100% rename from site/src/content/docs/cloud/networking.mdx rename to site/src/content/docs/cloud-ee/networking.mdx diff --git a/site/src/content/docs/cloud/pricing.mdx b/site/src/content/docs/cloud-ee/pricing.mdx similarity index 100% rename from site/src/content/docs/cloud/pricing.mdx rename to site/src/content/docs/cloud-ee/pricing.mdx diff --git a/site/src/content/docs/cloud/self-hosting/client-config.mdx b/site/src/content/docs/cloud-ee/self-hosting/client-config.mdx similarity index 58% rename from site/src/content/docs/cloud/self-hosting/client-config.mdx rename to site/src/content/docs/cloud-ee/self-hosting/client-config.mdx index 42574a48db..ab7243649f 100644 --- a/site/src/content/docs/cloud/self-hosting/client-config.mdx +++ b/site/src/content/docs/cloud-ee/self-hosting/client-config.mdx @@ -4,7 +4,7 @@ import Link from 'next/link'; # Client Config -Default location: `docker/monolith/rivet-client/config.jsonc` +Default location: `docker/monolith/rivet-client/config.jsonc` ## Schema diff --git a/site/src/content/docs/cloud/self-hosting/client-spec.json b/site/src/content/docs/cloud-ee/self-hosting/client-spec.json similarity index 100% rename from site/src/content/docs/cloud/self-hosting/client-spec.json rename to site/src/content/docs/cloud-ee/self-hosting/client-spec.json diff --git a/site/src/content/docs/cloud/self-hosting/docker-compose.mdx b/site/src/content/docs/cloud-ee/self-hosting/docker-compose.mdx similarity index 100% rename from site/src/content/docs/cloud/self-hosting/docker-compose.mdx rename to site/src/content/docs/cloud-ee/self-hosting/docker-compose.mdx diff --git a/site/src/content/docs/cloud/self-hosting/index.mdx b/site/src/content/docs/cloud-ee/self-hosting/index.mdx similarity index 100% rename from site/src/content/docs/cloud/self-hosting/index.mdx rename to site/src/content/docs/cloud-ee/self-hosting/index.mdx diff --git a/site/src/content/docs/cloud/self-hosting/manual-deployment.mdx b/site/src/content/docs/cloud-ee/self-hosting/manual-deployment.mdx similarity index 97% rename from site/src/content/docs/cloud/self-hosting/manual-deployment.mdx rename to site/src/content/docs/cloud-ee/self-hosting/manual-deployment.mdx index dd48fc9941..364d444eba 100644 --- a/site/src/content/docs/cloud/self-hosting/manual-deployment.mdx +++ b/site/src/content/docs/cloud-ee/self-hosting/manual-deployment.mdx @@ -27,7 +27,7 @@ Edge server: ## Core Cluster Setup -0. Clone repo +0. Clone repo 1. Setup prerequisites @@ -94,7 +94,7 @@ Once running, you can visit the dashboard at ## Edge Server Setup -0. Clone repo +0. Clone repo 1. Setup Prerequisites diff --git a/site/src/content/docs/cloud/self-hosting/network-modes.mdx b/site/src/content/docs/cloud-ee/self-hosting/network-modes.mdx similarity index 100% rename from site/src/content/docs/cloud/self-hosting/network-modes.mdx rename to site/src/content/docs/cloud-ee/self-hosting/network-modes.mdx diff --git a/site/src/content/docs/cloud/self-hosting/server-config.mdx b/site/src/content/docs/cloud-ee/self-hosting/server-config.mdx similarity index 69% rename from site/src/content/docs/cloud/self-hosting/server-config.mdx rename to site/src/content/docs/cloud-ee/self-hosting/server-config.mdx index fc149d0de9..d6c7edefb5 100644 --- a/site/src/content/docs/cloud/self-hosting/server-config.mdx +++ b/site/src/content/docs/cloud-ee/self-hosting/server-config.mdx @@ -4,7 +4,7 @@ import Link from 'next/link'; # Server Config -Default location: `docker/monolith/rivet-server/config.jsonc` +Default location: `docker/monolith/rivet-server/config.jsonc` ## Schema diff --git a/site/src/content/docs/cloud/self-hosting/server-spec.json b/site/src/content/docs/cloud-ee/self-hosting/server-spec.json similarity index 100% rename from site/src/content/docs/cloud/self-hosting/server-spec.json rename to site/src/content/docs/cloud-ee/self-hosting/server-spec.json diff --git a/site/src/content/docs/cloud/self-hosting/single-container.mdx b/site/src/content/docs/cloud-ee/self-hosting/single-container.mdx similarity index 100% rename from site/src/content/docs/cloud/self-hosting/single-container.mdx rename to site/src/content/docs/cloud-ee/self-hosting/single-container.mdx diff --git a/site/src/content/docs/cloud/solutions/game-servers.mdx b/site/src/content/docs/cloud-ee/solutions/game-servers.mdx similarity index 100% rename from site/src/content/docs/cloud/solutions/game-servers.mdx rename to site/src/content/docs/cloud-ee/solutions/game-servers.mdx diff --git a/site/src/content/docs/cloud/tokens.mdx b/site/src/content/docs/cloud-ee/tokens.mdx similarity index 96% rename from site/src/content/docs/cloud/tokens.mdx rename to site/src/content/docs/cloud-ee/tokens.mdx index 66441cee67..e995d69d82 100644 --- a/site/src/content/docs/cloud/tokens.mdx +++ b/site/src/content/docs/cloud-ee/tokens.mdx @@ -45,7 +45,7 @@ const client = new RivetClient({ token: "your_service_token" }); To use tokens with `curl` or other HTTP clients: ```bash -curl -H "Authorization: Bearer $RIVET_SERVICE_TOKEN" 'https://api.rivet.gg/actors?project=my-project&environment=prod' +curl -H "Authorization: Bearer $RIVET_SERVICE_TOKEN" 'https://api.rivet.dev/actors?project=my-project&environment=prod' ``` ## Rivet Shell diff --git a/site/src/content/docs/cloud/troubleshooting.mdx b/site/src/content/docs/cloud-ee/troubleshooting.mdx similarity index 98% rename from site/src/content/docs/cloud/troubleshooting.mdx rename to site/src/content/docs/cloud-ee/troubleshooting.mdx index c2a8722b7c..261a2d9379 100644 --- a/site/src/content/docs/cloud/troubleshooting.mdx +++ b/site/src/content/docs/cloud-ee/troubleshooting.mdx @@ -66,7 +66,7 @@ Validate that: - Your server starts immediately when the actor starts (i.e. don't run async code before starting the HTTP server) - You're not using HTTPS for your server (Rivet Guard handles this for you) -If using the actor SDK, this likely an issue with the underlying Rivet library and should be reported on GitHub [here](https://github.com/rivet-gg/rivet/issues/new/choose). +If using the actor SDK, this likely an issue with the underlying Rivet library and should be reported on GitHub [here](https://github.com/rivet-dev/rivet/issues/new/choose). ## `404 page not found` when making request to actor diff --git a/site/src/content/docs/cloud/workers.mdx b/site/src/content/docs/cloud-ee/workers.mdx similarity index 100% rename from site/src/content/docs/cloud/workers.mdx rename to site/src/content/docs/cloud-ee/workers.mdx diff --git a/site/src/content/docs/cloud/index.mdx b/site/src/content/docs/cloud/index.mdx index 3201a11ab1..9eba6e7025 100644 --- a/site/src/content/docs/cloud/index.mdx +++ b/site/src/content/docs/cloud/index.mdx @@ -1,47 +1,16 @@ -export const keywords = ["Rivet", "open-source", "backend", "functions", "actors", "containers", "serverless", "stateful"] +# Rivet Cloud -import { Icon, faActorsBorderless, faServer, faFunction } from '@rivet-gg/icons'; -import { EnterpriseCloud } from "@/components/docs/EnterpriseCloud"; +Rivet Cloud provides the fastest way to deploy and scale your Rivet Actors. -# Rivet Cloud (Enterprise) +## Dashboard -Rivet is the open-source serverless platform to scale complex backends anywhere like AI Agents, Real-Time Apps, and Multiplayer Games. +Rivet Cloud's dashboard can be accessed at [dashboard.rivet.dev](https://dashboard.rivet.dev). - +## Features -## Stateless Functions - -**Description**: Short-lived HTTP requests at the edge - -**State**: No persistent state (store state in [Actors](/docs/actors) or external database) - -**Use Cases**: APIs, edge computing, microservices - -**Replaces**: Cloudflare Workers, AWS Lambda, Google Cloud Run Functions - -[Get Started →](/docs/cloud/functions) - -## Stateful Actors - -**Description**: Long running tasks with state persistence, hibernation, and realtime - -**State**: Yes, built-in state persistence (also works with external databases) - -**Use Cases**: AI agents, realtime apps, local-first sync, rate limiting, stream processing - -**Replaces**: Cloudflare Durable Objects, Redis, Socket.io, AWS Lambda + DynamoDB + EventBridge - -[Get Started →](/docs/actors) - -## Sandboxed Containers - -**Description**: Docker-like containers for CPU- or memory-intensive workloads - -**State**: No persistent state (store state in [Actors](/docs/actors) or external database) - -**Use Cases**: Sandboxed code execution, desktop/browser automation, game servers, FFmpeg, PDF processing - -**Replaces**: Kubernetes Batch Jobs, AWS Fargate, Google Cloud Run - -[Get Started →](/docs/cloud/containers) +- **Deploy In 60 Seconds**: Rivet streamlines getting your application deployed +- **Edge Network**: Provides a global edge network to deploy your actors +- **Works With Your Cloud**: Keep deploying your backend where you're comfortable, Rivet Cloud works with your stack +- **No Vendor Lock**: Rivet is open-source (Apache 2.0) and does not vendor-lock your application +- **Organizations & Security**: Provides all of the tools you'd expect for managing organizations & security diff --git a/site/src/content/docs/deploy/aws-ecs.mdx b/site/src/content/docs/deploy/aws-ecs.mdx new file mode 100644 index 0000000000..aad9280f8f --- /dev/null +++ b/site/src/content/docs/deploy/aws-ecs.mdx @@ -0,0 +1,116 @@ +# Deploying to AWS ECS + +Run your backend on Amazon ECS with Fargate using a simple container image and service definition. + +## Guide + + + + +- AWS account with permissions for ECS, ECR, and IAM +- AWS CLI v2 configured (`aws configure`) +- An existing VPC with private subnets and security groups for ECS +- Container registry (ECR) and your backend repository + + + + +Navigate to Rivet and click _Connect > Manual_. Copy the environment variables provided, they will be used in the task definition. They should look something like this: + +```bash +RIVET_API_ENDPOINT=https://api-us-west-1.rivet.dev +RIVET_NAMESPACE=your-namespace-id +RIVET_TOKEN=your-token +``` + + + + +Create a `Dockerfile` in your project root: + +```dockerfile +FROM node:20-alpine +WORKDIR /app +COPY package*.json ./ +RUN npm ci --omit=dev +COPY . . +ENV PORT=8080 +CMD ["node", "server.js"] +``` + + + + +Authenticate to ECR, build the image, and push it. Replace the AWS account, region, and repository names with your own. + +```bash +aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com +docker build -t backend:latest . +docker tag backend:latest 123456789012.dkr.ecr.us-east-1.amazonaws.com/backend:latest +docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/backend:latest +``` + + + + +Create `backend-task.json` describing the ECS task. Update the ARNs, subnets, and security groups for your environment. + +```json +{ + "family": "backend", + "networkMode": "awsvpc", + "cpu": "256", + "memory": "512", + "requiresCompatibilities": ["FARGATE"], + "executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole", + "containerDefinitions": [ + { + "name": "backend", + "image": "123456789012.dkr.ecr.us-east-1.amazonaws.com/backend:latest", + "environment": [ + { "name": "RIVET_API_ENDPOINT", "value": "https://api-us-west-1.rivet.dev" }, + { "name": "RIVET_NAMESPACE", "value": "your-namespace-id" }, + { "name": "RIVET_TOKEN", "value": "your-token" } + ] + } + ] +} +``` + +You do not need to expose a container port. Rivet tunnels traffic directly to your backend. + +Register the task definition: + +```bash +aws ecs register-task-definition --cli-input-json file://backend-task.json +``` + + + + +Create or reuse an ECS cluster, then launch a service with the new task definition. Substitute your subnet and security group IDs. + +```bash +aws ecs create-cluster --cluster-name backend +aws ecs create-service \ + --cluster backend \ + --service-name backend \ + --task-definition backend \ + --desired-count 1 \ + --launch-type FARGATE \ + --network-configuration "awsvpcConfiguration={subnets=[subnet-abc12345,subnet-def67890],securityGroups=[sg-abc12345],assignPublicIp=ENABLED}" +``` + + + + +Check that the task is running: + +```bash +aws ecs describe-services --cluster backend --services backend --query "services[0].deployments" +``` + +Your runner should appear as connected on the Rivet dashboard once the task is healthy. + + + diff --git a/site/src/content/docs/deploy/aws-lambda.mdx b/site/src/content/docs/deploy/aws-lambda.mdx new file mode 100644 index 0000000000..d6848e4d11 --- /dev/null +++ b/site/src/content/docs/deploy/aws-lambda.mdx @@ -0,0 +1,4 @@ +# Deploy To Amazon Web Services Lambda + +_AWS Lambda is coming soon_ + diff --git a/site/src/content/docs/deploy/cloudflare-workers.mdx b/site/src/content/docs/deploy/cloudflare-workers.mdx new file mode 100644 index 0000000000..af7b5eea83 --- /dev/null +++ b/site/src/content/docs/deploy/cloudflare-workers.mdx @@ -0,0 +1,224 @@ +# Deploying to Cloudflare Workers +# +Run Rivet Actors on Cloudflare Workers with Durable Objects. If you still need a sample app, walk through the [Cloudflare Workers Quickstart](/docs/actors/quickstart/cloudflare-workers) first. + + + + +- [Cloudflare account](https://dash.cloudflare.com/) with Durable Objects enabled +- [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/install-and-update/) v3 +- RivetKit project (or use the [Quickstart](/docs/actors/quickstart/cloudflare-workers)) + + + + +Install the Cloudflare Worker driver alongside RivetKit: + +```sh +npm install rivetkit @rivetkit/cloudflare-workers +``` + + + + +Wire your actors into a Cloudflare Worker using the same setup as the quickstart: + +```ts {{"title":"registry.ts"}} +import { actor, setup } from "rivetkit"; + +export const counter = actor({ + state: { count: 0 }, + actions: { + increment: (c, amount: number = 1) => { + c.state.count += amount; + c.broadcast("countChanged", c.state.count); + return c.state.count; + }, + getCount: (c) => c.state.count, + }, +}); + +export const registry = setup({ + use: { counter }, +}); +``` + + + +```ts {{"title":"index.ts (Hono)"}} +import { createHandler, type Client } from "@rivetkit/cloudflare-workers"; +import { Hono } from "hono"; +import { registry } from "./registry"; + +const app = new Hono<{ Bindings: { RIVET: Client } }>(); + +app.post("/increment/:name", async (c) => { + const client = c.env.RIVET; + const name = c.req.param("name"); + + // Get or create actor and call action + const counter = client.counter.getOrCreate(name); + const newCount = await counter.increment(1); + + return c.json({ count: newCount }); +}); + +const { handler, ActorHandler } = createHandler(registry, { fetch: app.fetch }); +export { handler as default, ActorHandler }; +``` + +```ts {{"title":"index.ts (No Router)"}} +import { createHandler } from "@rivetkit/cloudflare-workers"; +import { registry } from "./registry"; + +const { handler, ActorHandler } = createHandler(registry, { + fetch: async (request, env, ctx) => { + const url = new URL(request.url); + + if (url.pathname.startsWith("/increment/")) { + const name = url.pathname.split("/")[2]; + const client = env.RIVET; + + const counter = client.counter.getOrCreate(name); + const newCount = await counter.increment(1); + + return new Response(JSON.stringify({ count: newCount }), { + headers: { "Content-Type": "application/json" }, + }); + } + + return new Response("Not Found", { status: 404 }); + } +}); + +export { handler as default, ActorHandler }; +``` + + + +Configure Durable Objects and KV namespaces in `wrangler.json` (same as the quickstart): + +```json {{"title":"wrangler.json"}} +{ + "name": "my-rivetkit-worker", + "main": "src/index.ts", + "compatibility_date": "2025-01-20", + "compatibility_flags": ["nodejs_compat"], + "migrations": [ + { + "tag": "v1", + "new_classes": ["ActorHandler"] + } + ], + "durable_objects": { + "bindings": [ + { + "name": "ACTOR_DO", + "class_name": "ActorHandler" + } + ] + }, + "kv_namespaces": [ + { + "binding": "ACTOR_KV", + "id": "your_namespace_id" + } + ] +} +``` + +Configuration requirements: + +- `ACTOR_DO` durable object binding for actor persistence +- `ACTOR_KV` KV namespace binding for metadata storage +- `nodejs_compat` compatibility flag +- Migration entry defining the `ActorHandler` class + + + + +Start the worker locally: + +```sh +wrangler dev +``` + +Call your actor at `http://localhost:8787/increment/my-counter`. + +When you're ready, deploy to Cloudflare's network: + +```sh +wrangler deploy +``` + +Durable Objects back your actor state globally, and the Rivet endpoint is automatically mounted at `/rivet`. + + + + +## Advanced + +### Accessing Environment Bindings + +You can access Cloudflare Workers environment bindings directly using the importable `env`: + +```typescript +import { env } from "cloudflare:workers"; + +// Access environment variables and secrets in top-level scope +const API_KEY = env.API_KEY; +const LOG_LEVEL = env.LOG_LEVEL || "info"; + +// Use bindings in your actor +const myActor = actor({ + state: { count: 0 }, + + actions: { + // Access KV, D1, or other bindings during request handling + getFromKV: async (c, key: string) => { + // Access additional KV namespaces defined in wrangler.json + if (env.MY_CACHE_KV) { + return await env.MY_CACHE_KV.get(key); + } + } + } +}); +``` + +### Driver Context + +The Cloudflare Workers driver provides access to the Durable Object state and environment through the driver context in `createVars`. + +```typescript +import { actor, ActorInitContext } from "rivetkit"; +import type { DriverContext } from "@rivetkit/cloudflare-workers"; + +const myActor = actor({ + state: { count: 0 }, + + // Save the Cloudflare driver context + createVars: (ctx: ActorInitContext, driver: DriverContext) => ({ + state: driver.state, + }), + + actions: { + // Example: Access Durable Object info (not recommended in practice) + kvGet: (c, key: string) => { + const doState = c.vars.state; + return await doState.storage.get(key) + }, + } +}); +``` + +The Cloudflare Workers driver context type is exported as `DriverContext` from `@rivetkit/cloudflare-workers`: + +```typescript +interface DriverContext { + state: DurableObjectState; +} +``` + + +While you have access to the Durable Object state, be cautious when directly modifying KV storage or alarms, as this may interfere with RivetKit's internal operations and potentially break actor functionality. + diff --git a/site/src/content/docs/deploy/freestyle.mdx b/site/src/content/docs/deploy/freestyle.mdx index 8cd09b6593..2655fe9f9c 100644 --- a/site/src/content/docs/deploy/freestyle.mdx +++ b/site/src/content/docs/deploy/freestyle.mdx @@ -62,7 +62,7 @@ const res = await freestyle.deployWeb(buildDir, { RIVET_RUNNER_KIND: "serverless", // For self-hosted instances: // RIVET_ENDPOINT: "http://127.0.0.1:6420", - RIVET_ENDPOINT: "api.rivet.gg", + RIVET_ENDPOINT: "api.rivet.dev", }, timeout: 60 * 5, // Increases max request lifetime on the runner entrypoint: "server.ts", // File which starts serverless runner @@ -92,7 +92,7 @@ Update the runner configuration on the Rivet side to connect with your Freestyle import { RivetClient } from "rivetkit/client"; const rivet = new RivetClient({ - endpoint: "api.rivet.gg", + endpoint: "api.rivet.dev", token: process.env.RIVET_API_TOKEN, }); diff --git a/site/src/content/docs/deploy/gcp-cloud-run.mdx b/site/src/content/docs/deploy/gcp-cloud-run.mdx new file mode 100644 index 0000000000..339f28f942 --- /dev/null +++ b/site/src/content/docs/deploy/gcp-cloud-run.mdx @@ -0,0 +1,78 @@ +# Deploying to Google Cloud Run + +Run your backend on Cloud Run with a lightweight container image and one command deploy. + +## Guide + + + + +- Google Cloud project with Cloud Run and Artifact Registry enabled +- `gcloud` CLI authenticated (`gcloud auth login`) and project set (`gcloud config set project YOUR_PROJECT`) +- Artifact Registry repository or Container Registry enabled +- Your backend application repository + + + + +Navigate to Rivet and click _Connect > Manual_. Copy the environment variables provided, they will be used when deploying. They should look something like this: + +```bash +RIVET_API_ENDPOINT=https://api-us-west-1.rivet.dev +RIVET_NAMESPACE=your-namespace-id +RIVET_TOKEN=your-token +``` + + + + +Create a `Dockerfile` in your project root: + +```dockerfile +FROM node:20-alpine +WORKDIR /app +COPY package*.json ./ +RUN npm ci --omit=dev +COPY . . +ENV PORT=8080 +CMD ["node", "server.js"] +``` + + + + +Use Cloud Build to build and push the image. Replace the region and repository with your own. + +```bash +gcloud builds submit --tag us-central1-docker.pkg.dev/YOUR_PROJECT/backend/backend:latest +``` + + + + +Deploy the service to Cloud Run, passing the Rivet environment variables. Adjust the region, image, and VPC connector settings as needed. + +```bash +gcloud run deploy backend \ + --image us-central1-docker.pkg.dev/YOUR_PROJECT/backend/backend:latest \ + --region us-central1 \ + --allow-unauthenticated \ + --min-instances 1 \ + --set-env-vars RIVET_API_ENDPOINT=https://api-us-west-1.rivet.dev,RIVET_NAMESPACE=your-namespace-id,RIVET_TOKEN=your-token +``` + +You do not need to expose a container port. Rivet tunnels traffic directly to your backend. + + + + +Confirm the service is running: + +```bash +gcloud run services describe backend --region us-central1 --format 'value(status.conditions[?type="Ready"].status)' +``` + +Your runner should appear as connected on the Rivet dashboard once the service reports ready. + + + diff --git a/site/src/content/docs/deploy/hetzner.mdx b/site/src/content/docs/deploy/hetzner.mdx new file mode 100644 index 0000000000..4478eb4e6f --- /dev/null +++ b/site/src/content/docs/deploy/hetzner.mdx @@ -0,0 +1,4 @@ +# Deploying to Hetzner + +Please see the [VM & Bare Metal](/docs/deploy/vm-and-bare-metal) guide. + diff --git a/site/src/content/docs/deploy/kubernetes.mdx b/site/src/content/docs/deploy/kubernetes.mdx new file mode 100644 index 0000000000..daf4b2ac42 --- /dev/null +++ b/site/src/content/docs/deploy/kubernetes.mdx @@ -0,0 +1,115 @@ +# Deploying to Kubernetes +# +Run your backend on any Kubernetes cluster with a simple container image and deployment manifest. + +## Guide + + + + +- A Kubernetes cluster with `kubectl` access (AKS, EKS, GKE, k3s, etc.) +- Container registry credentials (Docker Hub, GHCR, GCR, etc.) +- Your backend application repository + + + + +Navigate to Rivet and click _Connect > Manual_. Copy the environment variables provided, they will be used in later manifests. They should look something like this: + +```bash +RIVET_API_ENDPOINT=https://api-us-west-1.rivet.dev +RIVET_NAMESPACE=your-namespace-id +RIVET_TOKEN=your-token +``` + + + + +Create a `Dockerfile` in your project root: + +```dockerfile +FROM node:20-alpine +WORKDIR /app +COPY package*.json ./ +RUN npm ci --omit=dev +COPY . . +ENV PORT=8080 +CMD ["node", "server.js"] +``` + + + + +```bash +docker build -t registry.example.com/your-team/backend:latest . +docker push registry.example.com/your-team/backend:latest +``` + +Replace `registry.example.com/your-team` with your registry path. Auth with `docker login` first if needed. + + + + +Create a `backend-secrets.yaml` for your environment variables: + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: backend-secrets +type: Opaque +stringData: + RIVET_API_ENDPOINT: https://api-us-west-1.rivet.dev + RIVET_NAMESPACE: your-namespace-id + RIVET_TOKEN: your-token +``` + +Then create a `deployment.yaml`: + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: backend +spec: + replicas: 1 + selector: + matchLabels: + app: backend + template: + metadata: + labels: + app: backend + spec: + containers: + - name: backend + image: registry.example.com/your-team/backend:latest + envFrom: + - secretRef: + name: backend-secrets +``` + +You do not need to expose a container port. Rivet tunnels traffic directly to your backend. + +Apply both manifests: + +```bash +kubectl apply -f backend-secrets.yaml +kubectl apply -f deployment.yaml +``` + +Add a `Service` or Ingress if you need external access. + + + + +Check that the pod is running: + +```bash +kubectl get pods -l app=backend +``` + +Your runner should appear as connected on the Rivet dashboard once the pod is ready. + + + diff --git a/site/src/content/docs/deploy/railway.mdx b/site/src/content/docs/deploy/railway.mdx index 7a6dc55acd..c7265fc2c2 100644 --- a/site/src/content/docs/deploy/railway.mdx +++ b/site/src/content/docs/deploy/railway.mdx @@ -1,8 +1,7 @@ - # Deploying to Railway +# Deploy your RivetKit app to [Railway](https://railway.app). - ## Option A: Deploy from Template If you're starting from scratch, go to the Connect tab on the Rivet dashboard and follow the Railway deployment steps. This give you a 1-click deploy of the [RivetKit Railway template](). @@ -41,6 +40,8 @@ Ensure your `package.json` has a start script: Railway will automatically deploy your RivetKit app on every git push. Detailed steps are available on [Railway's docs](https://docs.railway.com/quick-start). + +You do not need to expose a container port. Rivet tunnels traffic directly to your backend. @@ -59,4 +60,4 @@ Detailed steps are available on [Railway's docs](https://docs.railway.com/guides You should see your runner connected on the Connect tab of your Rivet Dashboard. Now you can create and connect to your Rivet Actors. - \ No newline at end of file + diff --git a/site/src/content/docs/deploy/supabase.mdx b/site/src/content/docs/deploy/supabase.mdx new file mode 100644 index 0000000000..a568c5ed86 --- /dev/null +++ b/site/src/content/docs/deploy/supabase.mdx @@ -0,0 +1,3 @@ +# Supabase + +_Supabase is coming soon_ diff --git a/site/src/content/docs/deploy/vercel.mdx b/site/src/content/docs/deploy/vercel.mdx new file mode 100644 index 0000000000..e8837483f9 --- /dev/null +++ b/site/src/content/docs/deploy/vercel.mdx @@ -0,0 +1,4 @@ +# Vercel + +_Vercel is coming soon_ + diff --git a/site/src/content/docs/deploy/vm-and-bare-metal.mdx b/site/src/content/docs/deploy/vm-and-bare-metal.mdx new file mode 100644 index 0000000000..54a4d8d7cd --- /dev/null +++ b/site/src/content/docs/deploy/vm-and-bare-metal.mdx @@ -0,0 +1,84 @@ +# Deploying to VMs & Bare Metal + +Run your backend on any Linux VM or bare metal host with a basic systemd unit. + +## Guide + + + + +- Build your backend locally. +- Copy the build output to your server (example): + +```bash +scp -r ./dist user@server:/opt/backend +``` + +Place the files somewhere readable by the service user, such as `/opt/backend`. + + + + +Navigate to Rivet and click _Connect > Manual_. Copy the environment variables provided, they will be used in the next step. They should look something like this: + +```bash +RIVET_API_ENDPOINT=https://api-us-west-1.rivet.dev +RIVET_NAMESPACE=your-namespace-id +RIVET_TOKEN=your-token +``` + + + + +Create `/etc/systemd/system/backend.service`: + +```ini +[Unit] +Description=Backend Service +After=network.target + +[Service] +Type=simple +WorkingDirectory=/opt/backend +ExecStart=/usr/bin/node server.js +Restart=on-failure +Environment=RIVET_API_ENDPOINT=https://api.rivet.dev +Environment=RIVET_NAMESPACE=your-namespace-id +Environment=RIVET_TOKEN=your-token + +[Install] +WantedBy=multi-user.target +``` + +Replace the environment values with those from the Connect tab in the Rivet dashboard (or your self-hosted engine) and adjust paths to match your deployment. + + + + +Reload systemd units and start the service: + +```bash +sudo systemctl daemon-reload +sudo systemctl enable --now backend.service +``` + + + + +## Operating + +### Restart + +Restart the service after deploying new builds or environment changes: + +```bash +sudo systemctl restart backend.service +``` + +### Logs + +Follow realtime logs when debugging: + +```bash +sudo journalctl -u backend.service -f +``` diff --git a/site/src/content/docs/drivers/build-your-own.mdx b/site/src/content/docs/drivers/build-your-own.mdx index 2171941ada..420a0ca73f 100644 --- a/site/src/content/docs/drivers/build-your-own.mdx +++ b/site/src/content/docs/drivers/build-your-own.mdx @@ -10,8 +10,8 @@ Each driver implements common interfaces defined by RivetKit, including: Get started by looking at source code for the driver interfaces and existing drivers: - **Driver Interfaces** - - **ActorDriver*** [Source Code](https://github.com/rivet-gg/rivetkit/blob/main/packages/core/src/actor/driver.ts) - - **ManagerDriver*** [Source Code](https://github.com/rivet-gg/rivetkit/blob/main/packages/core/src/manager/driver.ts) -- **Driver Implementations**: [Source Code](https://github.com/rivet-gg/rivetkit/tree/main/packages/core/src/drivers) + - **ActorDriver*** [Source Code](https://github.com/rivet-dev/rivetkit/blob/main/packages/core/src/actor/driver.ts) + - **ManagerDriver*** [Source Code](https://github.com/rivet-dev/rivetkit/blob/main/packages/core/src/manager/driver.ts) +- **Driver Implementations**: [Source Code](https://github.com/rivet-dev/rivetkit/tree/main/packages/core/src/drivers) diff --git a/site/src/content/docs/drivers/file-system.mdx b/site/src/content/docs/drivers/file-system.mdx index 1b02c90136..adf2b65fd8 100644 --- a/site/src/content/docs/drivers/file-system.mdx +++ b/site/src/content/docs/drivers/file-system.mdx @@ -85,7 +85,7 @@ If running on a single node, make sure to back up your actors folder regularly. ## Examples - + Basic File System driver setup and configuration example. diff --git a/site/src/content/docs/examples/autofill-example.mdx b/site/src/content/docs/examples/autofill-example.mdx index bd952ebd0a..2ddafeb4d8 100644 --- a/site/src/content/docs/examples/autofill-example.mdx +++ b/site/src/content/docs/examples/autofill-example.mdx @@ -28,7 +28,7 @@ import { createClient } from "rivetkit"; const client = createClient({ // These will show default values until user selects a project token: "{{namespace.token:'YOUR_TOKEN_HERE'}}", - endpoint: "{{engine.url:'https://engine.rivet.gg'}}" + endpoint: "{{engine.url:'https://engine.rivet.dev'}}" }); const config = { diff --git a/site/src/content/docs/general/docs-for-llms.mdx b/site/src/content/docs/general/docs-for-llms.mdx index f23502d513..9e0fb9744a 100644 --- a/site/src/content/docs/general/docs-for-llms.mdx +++ b/site/src/content/docs/general/docs-for-llms.mdx @@ -32,6 +32,6 @@ Each documentation page is also available as clean markdown by appending `.md` t For example: -- Original URL: `https://rivet.gg/docs/actors` -- Markdown URL: `https://rivet.gg/docs/actors.md` +- Original URL: `https://rivet.dev/docs/actors` +- Markdown URL: `https://rivet.dev/docs/actors.md` diff --git a/site/src/content/docs/general/studio.mdx b/site/src/content/docs/general/studio.mdx deleted file mode 100644 index eb646b80d2..0000000000 --- a/site/src/content/docs/general/studio.mdx +++ /dev/null @@ -1,80 +0,0 @@ -# Rivet Studio - -Rivet Studio is a web-based development tool for debugging and monitoring your Rivet Actors in real-time. - -## Features - -- **View running actors**: See all active Rivet Actors in your application -- **Edit actor state**: Modify actor state in real-time for debugging -- **REPL for actions**: Interactive console to call actor actions directly -- **Event monitoring**: Track actor events including actions, broadcasts, events, and subscriptions -- **Connection viewer**: Monitor all connected connections & their associated state - -## How it works - -RivetKit automatically mounts a route at `/registry` on your server for Studio access. When your application starts: - -1. RivetKit generates a secure token for authentication on startup -2. Open to [studio.rivet.gg](https://studio.rivet.gg) in your browser or click the `studio.rivet.gg` URL that's printed to your console on startup -3. Rivet Studio connects to your application - -Rivet Studio is automatically disabled in production when `NODE_ENV=production`. - -## Configuration - -### Token configuration - -By default, Rivet Studio generates and stores a token automatically. You can configure it: - -- **Environment variable**: Set `RIVETKIT_STUDIO_TOKEN` -- **Code configuration**: - ```typescript {{"title":"server.ts"}} - registry.start({ - studio: { - token: () => "your-custom-token" - } - }) - ``` - -### Disabling the Studio - -Disable Studio using any of these methods: - -- Set `RIVETKIT_STUDIO_DISABLE` environment variable -- Set `NODE_ENV=production` -- Configure in code: - ```typescript {{"title":"server.ts"}} - registry.start({ - studio: { - enabled: false - } - }) - ``` - -### CORS configuration - -Configure CORS for custom Studio deployments: - -```typescript {{"title":"server.ts"}} -registry.start({ - studio: { - cors: { - origin: "https://my-studio-url.test" - } - } -}) -``` - -See the [CORS documentation](/docs/general/cors/) for more details. - -### Default endpoint - -On startup, RivetKit prints a URL for connecting to Studio. By default, Studio connects to `localhost:8080` if no endpoint is provided. Override with: - -```typescript {{"title":"server.ts"}} -registry.start({ - studio: { - defaultEndpoint: "http://my-app:3000" - } -}) -``` diff --git a/site/src/content/docs/images/platforms/deno.svg b/site/src/content/docs/images/platforms/deno.svg new file mode 100644 index 0000000000..1141eb356b --- /dev/null +++ b/site/src/content/docs/images/platforms/deno.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/site/src/content/docs/index.mdx b/site/src/content/docs/index.mdx new file mode 100644 index 0000000000..9dc0fa6fb9 --- /dev/null +++ b/site/src/content/docs/index.mdx @@ -0,0 +1,88 @@ +import { integrationGroups } from "@/data/integrations/shared"; +import { + faNodeJs, + faReact, + faActorsBorderless, + faRobot, + faWaveSine, + faServer, + faDatabase, + faGaugeHigh, + faMessage, +} from "@rivet-gg/icons"; + +# Overview + +Rivet is a library for long-lived processes with durable state, realtime, and scalability. It is easily self-hostable and works with your infrastructure. + +## Features + +- **Stateful Workloads**: Keep memory between operations & run complex logic that requires stateful processes +- **Realtime**: Powered by WebSockets or SSE without the complexity +- **Elastic Scalability**: Scale from zero to millions without cold starts +- **Multi-Region Durable Storage**: Keep state & operations near your users or comply with data soveirgnty + +## Tools + + + + Long-lived processes with durable state, realtime, and hibernation + +{/* + Set up actors with Node.js, Bun, and web frameworks + + + Set up actors with Node.js, Bun, and web frameworks +*/} + + +## Use Cases + + + + Deploy assistants that reason and act with durable memory + + + Sync state instantly over WebSockets or SSE + + + Run long-lived services with automatic failover + + + Isolate customer data with multi-tenant storage + + + Throttle requests using stateful counters per client + + + Build chat and workflow bots with actor logic + + + +## Integrations + +{integrationGroups.map((group) => ( +
+

{group.title}

+ + {group.items.map((integration) => ( + + ))} + +
+))} + +## Support + + + + Chat with the community and get realtime help from Rivet engineers + + + File bugs or request features directly in our tracker + + diff --git a/site/src/content/docs/integrations/better-auth.mdx b/site/src/content/docs/integrations/better-auth.mdx index e4cff1b1d4..bf44ada189 100644 --- a/site/src/content/docs/integrations/better-auth.mdx +++ b/site/src/content/docs/integrations/better-auth.mdx @@ -5,7 +5,7 @@ Integrate Rivet with Better Auth for authentication Better Auth provides a comprehensive authentication solution that integrates seamlessly with Rivet Actors using the `onAuth` hook. - + Check out the complete example diff --git a/site/src/content/docs/integrations/cloudflare-workers.mdx b/site/src/content/docs/integrations/cloudflare-workers.mdx index 2ca873d281..f7ffc32e3a 100644 --- a/site/src/content/docs/integrations/cloudflare-workers.mdx +++ b/site/src/content/docs/integrations/cloudflare-workers.mdx @@ -129,86 +129,3 @@ Your actors will now run on Cloudflare's global edge network with persistent sta
-## Examples - - - -Example using Cloudflare Workers with Hono web framework. - - - -Basic Cloudflare Workers setup and configuration example. - - - - - Cloudflare Workers mounts the Rivet endpoint on `/rivet` by default. - - -## Advanced - -### Accessing Environment Bindings - -You can access Cloudflare Workers environment bindings directly using the importable `env`: - -```typescript -import { env } from "cloudflare:workers"; - -// Access environment variables and secrets in top-level scope -const API_KEY = env.API_KEY; -const LOG_LEVEL = env.LOG_LEVEL || "info"; - -// Use bindings in your actor -const myActor = actor({ - state: { count: 0 }, - - actions: { - // Access KV, D1, or other bindings during request handling - getFromKV: async (c, key: string) => { - // Access additional KV namespaces defined in wrangler.json - if (env.MY_CACHE_KV) { - return await env.MY_CACHE_KV.get(key); - } - } - } -}); -``` - -### Driver Context - -The Cloudflare Workers driver provides access to the Durable Object state and environment through the driver context in `createVars`. - -```typescript -import { actor, ActorInitContext } from "rivetkit"; -import type { DriverContext } from "@rivetkit/cloudflare-workers"; - -const myActor = actor({ - state: { count: 0 }, - - // Save the Cloudflare driver context - createVars: (ctx: ActorInitContext, driver: DriverContext) => ({ - state: driver.state, - }), - - actions: { - // Example: Access Durable Object info (not recommended in practice) - kvGet: (c, key: string) => { - const doState = c.vars.state; - return await doState.storage.get(key) - }, - } -}); -``` - -The Cloudflare Workers driver context type is exported as `DriverContext` from `@rivetkit/cloudflare-workers`: - -```typescript -interface DriverContext { - state: DurableObjectState; -} -``` - - -While you have access to the Durable Object state, be cautious when directly modifying KV storage or alarms, as this may interfere with RivetKit's internal operations and potentially break actor functionality. - - diff --git a/site/src/content/docs/integrations/elysia.mdx b/site/src/content/docs/integrations/elysia.mdx index 9785b2f8c9..eedade47f7 100644 --- a/site/src/content/docs/integrations/elysia.mdx +++ b/site/src/content/docs/integrations/elysia.mdx @@ -5,7 +5,7 @@ Integrate Rivet with Elysia for fast TypeScript web applications Elysia is a fast and type-safe web framework for Bun. Rivet integrates seamlessly with Elysia using the `.mount()` method. - + Check out the complete example diff --git a/site/src/content/docs/integrations/express.mdx b/site/src/content/docs/integrations/express.mdx index 4e7544d21a..32d042d0c3 100644 --- a/site/src/content/docs/integrations/express.mdx +++ b/site/src/content/docs/integrations/express.mdx @@ -5,7 +5,7 @@ Integrate Rivet with Express.js for Node.js web applications Express.js is a popular Node.js web framework. Rivet integrates seamlessly with Express using middleware mounting. - + Check out the complete example diff --git a/site/src/content/docs/integrations/hono.mdx b/site/src/content/docs/integrations/hono.mdx index c4e80da45a..3c242cf98c 100644 --- a/site/src/content/docs/integrations/hono.mdx +++ b/site/src/content/docs/integrations/hono.mdx @@ -5,7 +5,7 @@ Integrate Rivet with Hono for ultra-fast web applications Hono is an ultra-fast web framework that works on any runtime. Rivet integrates seamlessly with Hono through the `serve()` method. - + Check out the complete example diff --git a/site/src/content/docs/integrations/index.mdx b/site/src/content/docs/integrations/index.mdx index 1054e0a5f4..cb15811144 100644 --- a/site/src/content/docs/integrations/index.mdx +++ b/site/src/content/docs/integrations/index.mdx @@ -1,50 +1,22 @@ +import { integrationGroups } from "@/data/integrations/shared"; + # Integrations Rivet provides seamless integrations with popular frameworks and tools to help you build modern applications. -## Frontend & Clients - - - - Full-featured JavaScript client for web and Node.js applications - - - React hooks and components for building interactive UIs - - - Type-safe Rust client for high-performance applications - - - -## Backend - - - - Lightweight and fast web framework for modern JavaScript - - - Popular Node.js web framework with extensive middleware support - - - Fast and type-safe TypeScript web framework - - - End-to-end type-safe API development - - - -## Auth - - - - Modern authentication library with TypeScript support - - - -## Misc - - - - Fast unit testing framework for JavaScript and TypeScript - - +{integrationGroups.map((group) => ( +
+

{group.title}

+ + {group.items.map((integration) => ( + + {integration.description} + + ))} + +
+))} diff --git a/site/src/content/docs/integrations/next-js.mdx b/site/src/content/docs/integrations/next-js.mdx index 1bd94f3e2c..0d9f92b95f 100644 --- a/site/src/content/docs/integrations/next-js.mdx +++ b/site/src/content/docs/integrations/next-js.mdx @@ -6,10 +6,10 @@ import { InstallPackage } from "@/components/docs/InstallPackage"; Next.js is a powerful React framework that allows you to build server-rendered applications with ease. The Rivet Next.js client enables you to connect to and interact with actors in your Next.js applications. - + Check out the complete example - + Use the RivetKit React client to connect to actors diff --git a/site/src/content/docs/integrations/trpc.mdx b/site/src/content/docs/integrations/trpc.mdx index c05465a7e2..393f18f6f2 100644 --- a/site/src/content/docs/integrations/trpc.mdx +++ b/site/src/content/docs/integrations/trpc.mdx @@ -5,7 +5,7 @@ Integrate Rivet with tRPC for end-to-end type-safe APIs tRPC provides end-to-end type safety for your APIs. Rivet integrates seamlessly with tRPC, allowing you to create type-safe procedures that call Rivet Actors. - + Check out the complete example diff --git a/site/src/content/docs/self-hosting/install.mdx b/site/src/content/docs/self-hosting/install.mdx index 1b29854ac1..c4030b2954 100644 --- a/site/src/content/docs/self-hosting/install.mdx +++ b/site/src/content/docs/self-hosting/install.mdx @@ -19,7 +19,7 @@ For more options: ## Build From Source ```bash -git clone https://github.com/rivet-gg/rivet.git +git clone https://github.com/rivet-dev/rivet.git cd rivet cargo build --release -p rivet-engine ./target/release/rivet-engine diff --git a/site/src/content/docs/self-hosting/railway.mdx b/site/src/content/docs/self-hosting/railway.mdx index b103baca3c..3c55e3f445 100644 --- a/site/src/content/docs/self-hosting/railway.mdx +++ b/site/src/content/docs/self-hosting/railway.mdx @@ -22,7 +22,7 @@ Choose the template that best fits your needs: | - Manual setup required | - Rivet Inspector for debugging | | | - Ready to run immediately | -You can also use the [Rivet Railway template](https://github.com/rivet-gg/template-railway) as a starting point for your application. +You can also use the [Rivet Railway template](https://github.com/rivet-dev/template-railway) as a starting point for your application. After deploying either template, you can find the `RIVET__AUTH__ADMIN_TOKEN` under the **Variables** tab in the Railway dashboard. This token is required to access the Rivet Inspector. diff --git a/site/src/content/docs/use-cases/ai-agents.mdx b/site/src/content/docs/use-cases/ai-agents.mdx new file mode 100644 index 0000000000..68d6a4efa2 --- /dev/null +++ b/site/src/content/docs/use-cases/ai-agents.mdx @@ -0,0 +1,6 @@ +# AI Agents + +Build durable assistants that keep memory between conversations, call tools, and react instantly to user input. + +**Examples** +- [AI Agent Starter](https://github.com/rivet-dev/rivetkit/tree/main/examples/ai-agent) diff --git a/site/src/content/docs/use-cases/bots.mdx b/site/src/content/docs/use-cases/bots.mdx new file mode 100644 index 0000000000..4050a882a8 --- /dev/null +++ b/site/src/content/docs/use-cases/bots.mdx @@ -0,0 +1,7 @@ +# Bots + +Run bots for Slack, Discord, or autonomous agents that need persistent workers listening, responding, and executing background tasks. + +**Examples** +- [AI Agent Starter](https://github.com/rivet-dev/rivetkit/tree/main/examples/ai-agent) +- [Realtime Chat Room](https://github.com/rivet-dev/rivetkit/tree/main/examples/chat-room) diff --git a/site/src/content/docs/use-cases/durable-compute.mdx b/site/src/content/docs/use-cases/durable-compute.mdx new file mode 100644 index 0000000000..c7cd2f79d3 --- /dev/null +++ b/site/src/content/docs/use-cases/durable-compute.mdx @@ -0,0 +1,11 @@ +# Durable Compute + +Run long-lived workloads that survive restarts, keep state close to users, and recover automatically when nodes shift. + +**Examples** +- [Sync Offline Data](https://github.com/rivet-dev/rivetkit/tree/main/examples/sync) +- [Tenant Isolation](https://github.com/rivet-dev/rivetkit/tree/main/examples/tenant) +- [Realtime Counter](https://github.com/rivet-dev/rivetkit/tree/main/examples/counter) +- [Realtime Chat Room](https://github.com/rivet-dev/rivetkit/tree/main/examples/chat-room) +- [Collaborative CRDT Docs](https://github.com/rivet-dev/rivetkit/tree/main/examples/crdt) +- [Multiplayer Game State](https://github.com/rivet-dev/rivetkit/tree/main/examples/game) diff --git a/site/src/content/docs/use-cases/per-tenant-databases.mdx b/site/src/content/docs/use-cases/per-tenant-databases.mdx new file mode 100644 index 0000000000..a6c2b32a45 --- /dev/null +++ b/site/src/content/docs/use-cases/per-tenant-databases.mdx @@ -0,0 +1,7 @@ +# Per-Tenant Databases + +Provision isolated storage per customer while sharing infrastructure, keeping noisy neighbours separated and compliant. + +**Examples** +- [Tenant Isolation](https://github.com/rivet-dev/rivetkit/tree/main/examples/tenant) +- [SQLite Sharding](https://github.com/rivet-dev/rivetkit/tree/main/examples/database) diff --git a/site/src/content/docs/use-cases/rate-limiting.mdx b/site/src/content/docs/use-cases/rate-limiting.mdx new file mode 100644 index 0000000000..629a6c2c90 --- /dev/null +++ b/site/src/content/docs/use-cases/rate-limiting.mdx @@ -0,0 +1,6 @@ +# Rate Limiting + +Throttle abusive clients with actors that track counters, rolling windows, and quotas without sharing mutable state. + +**Examples** +- [Stateful Rate Limiter](https://github.com/rivet-dev/rivetkit/tree/main/examples/rate) diff --git a/site/src/content/docs/use-cases/realtime.mdx b/site/src/content/docs/use-cases/realtime.mdx new file mode 100644 index 0000000000..b593dcb58f --- /dev/null +++ b/site/src/content/docs/use-cases/realtime.mdx @@ -0,0 +1,9 @@ +# Realtime + +Deliver sub-second updates with actors that push changes over WebSockets or SSE without juggling infrastructure. + +**Examples** +- [Chat Room](https://github.com/rivet-dev/rivetkit/tree/main/examples/chat-room) +- [Multiplayer Game State](https://github.com/rivet-dev/rivetkit/tree/main/examples/game) +- [Stream Processing](https://github.com/rivet-dev/rivetkit/tree/main/examples/stream) +- [Sync Offline Data](https://github.com/rivet-dev/rivetkit/tree/main/examples/sync) diff --git a/site/src/data/deploy-options.ts b/site/src/data/deploy-options.ts new file mode 100644 index 0000000000..738237520d --- /dev/null +++ b/site/src/data/deploy-options.ts @@ -0,0 +1,43 @@ +export interface DeployOption { + title: string; + href: string; +} + +export const deployOptions: DeployOption[] = [ + { + title: "Railway", + href: "/docs/deploy/railway", + }, + // { + // title: "Vercel", + // href: "/docs/deploy/vercel", + // }, + // { + // title: "Freestyle", + // href: "/docs/deploy/freestyle", + // }, + { + title: "AWS ECS", + href: "/docs/deploy/aws-ecs", + }, + { + title: "Google Cloud Run", + href: "/docs/deploy/gcp-cloud-run", + }, + { + title: "Kubernetes", + href: "/docs/deploy/kubernetes", + }, + { + title: "Hetzner", + href: "/docs/deploy/hetzner", + }, + { + title: "VM & Bare Metal", + href: "/docs/deploy/vm-and-bare-metal", + }, + { + title: "Cloudflare Workers", + href: "/docs/deploy/cloudflare-workers", + }, +]; diff --git a/site/src/data/examples/examples.ts b/site/src/data/examples/examples.ts index ebfb8cc136..78e4d97242 100644 --- a/site/src/data/examples/examples.ts +++ b/site/src/data/examples/examples.ts @@ -24,7 +24,7 @@ export const examples: ExampleData[] = [ "tab": "memory", "files": { "tests/ai-agent.test.ts": "import { setupTest } from \"rivetkit/test\";\nimport { expect, test, vi } from \"vitest\";\nimport { registry } from \"../src/backend/registry\";\n\n// Mock the AI SDK and OpenAI\nvi.mock(\"@ai-sdk/openai\", () => ({\n\topenai: () => \"mock-model\",\n}));\n\nvi.mock(\"ai\", () => ({\n\tgenerateText: vi.fn().mockImplementation(async ({ prompt }) => ({\n\t\ttext: `AI response to: ${prompt}`,\n\t})),\n\ttool: vi.fn().mockImplementation(({ execute }) => ({ execute })),\n}));\n\nvi.mock(\"../src/backend/my-utils\", () => ({\n\tgetWeather: vi.fn().mockResolvedValue({\n\t\tlocation: \"San Francisco\",\n\t\ttemperature: 72,\n\t\tcondition: \"sunny\",\n\t}),\n}));\n\ntest(\"AI Agent can handle basic actions without connection\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst agent = client.aiAgent.getOrCreate([\"test-basic\"]);\n\n\t// Test initial state\n\tconst initialMessages = await agent.getMessages();\n\texpect(initialMessages).toEqual([]);\n\n\t// Send a message\n\tconst userMessage = \"Hello, how are you?\";\n\tconst response = await agent.sendMessage(userMessage);\n\n\t// Verify response structure\n\texpect(response).toMatchObject({\n\t\trole: \"assistant\",\n\t\tcontent: expect.stringContaining(\"AI response to: Hello, how are you?\"),\n\t\ttimestamp: expect.any(Number),\n\t});\n\n\t// Verify messages are stored\n\tconst messages = await agent.getMessages();\n\texpect(messages).toHaveLength(2);\n\texpect(messages[0]).toMatchObject({\n\t\trole: \"user\",\n\t\tcontent: userMessage,\n\t\ttimestamp: expect.any(Number),\n\t});\n\texpect(messages[1]).toEqual(response);\n});\n\ntest(\"AI Agent maintains conversation history\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst agent = client.aiAgent.getOrCreate([\"test-history\"]);\n\n\t// Send multiple messages\n\tawait agent.sendMessage(\"First message\");\n\tawait agent.sendMessage(\"Second message\");\n\tawait agent.sendMessage(\"Third message\");\n\n\tconst messages = await agent.getMessages();\n\texpect(messages).toHaveLength(6); // 3 user + 3 assistant messages\n\n\t// Verify message ordering and roles\n\texpect(messages[0].role).toBe(\"user\");\n\texpect(messages[0].content).toBe(\"First message\");\n\texpect(messages[1].role).toBe(\"assistant\");\n\texpect(messages[2].role).toBe(\"user\");\n\texpect(messages[2].content).toBe(\"Second message\");\n\texpect(messages[3].role).toBe(\"assistant\");\n\texpect(messages[4].role).toBe(\"user\");\n\texpect(messages[4].content).toBe(\"Third message\");\n\texpect(messages[5].role).toBe(\"assistant\");\n});\n\ntest(\"AI Agent handles weather tool usage\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst agent = client.aiAgent.getOrCreate([\"test-weather\"]);\n\n\t// Send a weather-related message\n\tconst response = await agent.sendMessage(\n\t\t\"What's the weather in San Francisco?\",\n\t);\n\n\t// Verify response was generated\n\texpect(response.role).toBe(\"assistant\");\n\texpect(response.content).toContain(\n\t\t\"AI response to: What's the weather in San Francisco?\",\n\t);\n\texpect(response.timestamp).toBeGreaterThan(0);\n\n\t// Verify message history includes both user and assistant messages\n\tconst messages = await agent.getMessages();\n\texpect(messages).toHaveLength(2);\n\texpect(messages[0].content).toBe(\"What's the weather in San Francisco?\");\n\texpect(messages[1]).toEqual(response);\n});\n\ntest(\"AI Agent timestamps are sequential\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst agent = client.aiAgent.getOrCreate([\"test-timestamps\"]);\n\n\tconst response1 = await agent.sendMessage(\"First\");\n\tconst response2 = await agent.sendMessage(\"Second\");\n\n\texpect(response2.timestamp).toBeGreaterThanOrEqual(response1.timestamp);\n\n\tconst messages = await agent.getMessages();\n\tfor (let i = 1; i < messages.length; i++) {\n\t\texpect(messages[i].timestamp).toBeGreaterThanOrEqual(\n\t\t\tmessages[i - 1].timestamp,\n\t\t);\n\t}\n});\n", - "README.md": "# AI Agent Chat for RivetKit\n\nExample project demonstrating AI agent integration with [RivetKit](https://rivetkit.org).\n\n[Learn More →](https://github.com/rivet-gg/rivetkit)\n\n[Discord](https://rivet.gg/discord) — [Documentation](https://rivetkit.org) — [Issues](https://github.com/rivet-gg/rivetkit/issues)\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 18+\n- OpenAI API key\n\n### Installation\n\n```sh\ngit clone https://github.com/rivet-gg/rivetkit\ncd rivetkit/examples/ai-agent\nnpm install\n```\n\n### Development\n\n1. Set your OpenAI API key:\n```sh\nexport OPENAI_API_KEY=your-api-key-here\n```\n\n2. Start the development server:\n```sh\nnpm run dev\n```\n\n3. Open your browser to `http://localhost:3000`\n\n## License\n\nApache 2.0", + "README.md": "# AI Agent Chat for RivetKit\n\nExample project demonstrating AI agent integration with [RivetKit](https://rivetkit.org).\n\n[Learn More →](https://github.com/rivet-dev/rivetkit)\n\n[Discord](https://rivet.dev/discord) — [Documentation](https://rivetkit.org) — [Issues](https://github.com/rivet-dev/rivetkit/issues)\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 18+\n- OpenAI API key\n\n### Installation\n\n```sh\ngit clone https://github.com/rivet-dev/rivetkit\ncd rivetkit/examples/ai-agent\nnpm install\n```\n\n### Development\n\n1. Set your OpenAI API key:\n```sh\nexport OPENAI_API_KEY=your-api-key-here\n```\n\n2. Start the development server:\n```sh\nnpm run dev\n```\n\n3. Open your browser to `http://localhost:3000`\n\n## License\n\nApache 2.0", "package-lock.json": "{\n \"name\": \"example-ai-agent\",\n \"version\": \"0.9.1\",\n \"lockfileVersion\": 3,\n \"requires\": true,\n \"packages\": {\n \"\": {\n \"name\": \"example-ai-agent\",\n \"version\": \"0.9.1\",\n \"dependencies\": {\n \"@ai-sdk/openai\": \"^0.0.66\",\n \"@rivetkit/react\": \"^0.9.1\",\n \"ai\": \"^4.0.38\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\",\n \"zod\": \"^3.25.69\"\n },\n \"devDependencies\": {\n \"rivetkit\": \"^0.9.1\",\n \"@types/node\": \"^22.13.9\",\n \"@types/react\": \"^18.2.0\",\n \"@types/react-dom\": \"^18.2.0\",\n \"@vitejs/plugin-react\": \"^4.2.0\",\n \"concurrently\": \"^8.2.2\",\n \"tsx\": \"^3.12.7\",\n \"typescript\": \"^5.5.2\",\n \"vite\": \"^5.0.0\",\n \"vitest\": \"^3.1.1\"\n }\n },\n \"node_modules/@ai-sdk/openai\": {\n \"version\": \"0.0.66\",\n \"resolved\": \"https://registry.npmjs.org/@ai-sdk/openai/-/openai-0.0.66.tgz\",\n \"integrity\": \"sha512-V4XeDnlNl5/AY3GB3ozJUjqnBLU5pK3DacKTbCNH3zH8/MggJoH6B8wRGdLUPVFMcsMz60mtvh4DC9JsIVFrKw==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@ai-sdk/provider\": \"0.0.24\",\n \"@ai-sdk/provider-utils\": \"1.0.20\"\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"peerDependencies\": {\n \"zod\": \"^3.0.0\"\n }\n },\n \"node_modules/@ai-sdk/provider\": {\n \"version\": \"0.0.24\",\n \"resolved\": \"https://registry.npmjs.org/@ai-sdk/provider/-/provider-0.0.24.tgz\",\n \"integrity\": \"sha512-XMsNGJdGO+L0cxhhegtqZ8+T6nn4EoShS819OvCgI2kLbYTIvk0GWFGD0AXJmxkxs3DrpsJxKAFukFR7bvTkgQ==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"json-schema\": \"0.4.0\"\n },\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@ai-sdk/provider-utils\": {\n \"version\": \"1.0.20\",\n \"resolved\": \"https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-1.0.20.tgz\",\n \"integrity\": \"sha512-ngg/RGpnA00eNOWEtXHenpX1MsM2QshQh4QJFjUfwcqHpM5kTfG7je7Rc3HcEDP+OkRVv2GF+X4fC1Vfcnl8Ow==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@ai-sdk/provider\": \"0.0.24\",\n \"eventsource-parser\": \"1.1.2\",\n \"nanoid\": \"3.3.6\",\n \"secure-json-parse\": \"2.7.0\"\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"peerDependencies\": {\n \"zod\": \"^3.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"zod\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/@ai-sdk/react\": {\n \"version\": \"1.2.12\",\n \"resolved\": \"https://registry.npmjs.org/@ai-sdk/react/-/react-1.2.12.tgz\",\n \"integrity\": \"sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@ai-sdk/provider-utils\": \"2.2.8\",\n \"@ai-sdk/ui-utils\": \"1.2.11\",\n \"swr\": \"^2.2.5\",\n \"throttleit\": \"2.1.0\"\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"peerDependencies\": {\n \"react\": \"^18 || ^19 || ^19.0.0-rc\",\n \"zod\": \"^3.23.8\"\n },\n \"peerDependenciesMeta\": {\n \"zod\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/@ai-sdk/react/node_modules/@ai-sdk/provider\": {\n \"version\": \"1.1.3\",\n \"resolved\": \"https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.3.tgz\",\n \"integrity\": \"sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"json-schema\": \"^0.4.0\"\n },\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@ai-sdk/react/node_modules/@ai-sdk/provider-utils\": {\n \"version\": \"2.2.8\",\n \"resolved\": \"https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.8.tgz\",\n \"integrity\": \"sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@ai-sdk/provider\": \"1.1.3\",\n \"nanoid\": \"^3.3.8\",\n \"secure-json-parse\": \"^2.7.0\"\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"peerDependencies\": {\n \"zod\": \"^3.23.8\"\n }\n },\n \"node_modules/@ai-sdk/react/node_modules/nanoid\": {\n \"version\": \"3.3.11\",\n \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz\",\n \"integrity\": \"sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==\",\n \"funding\": [\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"bin\": {\n \"nanoid\": \"bin/nanoid.cjs\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || ^13.7 || ^14 || >=15.0.1\"\n }\n },\n \"node_modules/@ai-sdk/ui-utils\": {\n \"version\": \"1.2.11\",\n \"resolved\": \"https://registry.npmjs.org/@ai-sdk/ui-utils/-/ui-utils-1.2.11.tgz\",\n \"integrity\": \"sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@ai-sdk/provider\": \"1.1.3\",\n \"@ai-sdk/provider-utils\": \"2.2.8\",\n \"zod-to-json-schema\": \"^3.24.1\"\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"peerDependencies\": {\n \"zod\": \"^3.23.8\"\n }\n },\n \"node_modules/@ai-sdk/ui-utils/node_modules/@ai-sdk/provider\": {\n \"version\": \"1.1.3\",\n \"resolved\": \"https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.3.tgz\",\n \"integrity\": \"sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"json-schema\": \"^0.4.0\"\n },\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@ai-sdk/ui-utils/node_modules/@ai-sdk/provider-utils\": {\n \"version\": \"2.2.8\",\n \"resolved\": \"https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.8.tgz\",\n \"integrity\": \"sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@ai-sdk/provider\": \"1.1.3\",\n \"nanoid\": \"^3.3.8\",\n \"secure-json-parse\": \"^2.7.0\"\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"peerDependencies\": {\n \"zod\": \"^3.23.8\"\n }\n },\n \"node_modules/@ai-sdk/ui-utils/node_modules/nanoid\": {\n \"version\": \"3.3.11\",\n \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz\",\n \"integrity\": \"sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==\",\n \"funding\": [\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"bin\": {\n \"nanoid\": \"bin/nanoid.cjs\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || ^13.7 || ^14 || >=15.0.1\"\n }\n },\n \"node_modules/@ampproject/remapping\": {\n \"version\": \"2.3.0\",\n \"resolved\": \"https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz\",\n \"integrity\": \"sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@jridgewell/gen-mapping\": \"^0.3.5\",\n \"@jridgewell/trace-mapping\": \"^0.3.24\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@babel/code-frame\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz\",\n \"integrity\": \"sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-validator-identifier\": \"^7.27.1\",\n \"js-tokens\": \"^4.0.0\",\n \"picocolors\": \"^1.1.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/compat-data\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz\",\n \"integrity\": \"sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/core\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz\",\n \"integrity\": \"sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@ampproject/remapping\": \"^2.2.0\",\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/generator\": \"^7.28.0\",\n \"@babel/helper-compilation-targets\": \"^7.27.2\",\n \"@babel/helper-module-transforms\": \"^7.27.3\",\n \"@babel/helpers\": \"^7.27.6\",\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/template\": \"^7.27.2\",\n \"@babel/traverse\": \"^7.28.0\",\n \"@babel/types\": \"^7.28.0\",\n \"convert-source-map\": \"^2.0.0\",\n \"debug\": \"^4.1.0\",\n \"gensync\": \"^1.0.0-beta.2\",\n \"json5\": \"^2.2.3\",\n \"semver\": \"^6.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"funding\": {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/babel\"\n }\n },\n \"node_modules/@babel/generator\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz\",\n \"integrity\": \"sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/types\": \"^7.28.0\",\n \"@jridgewell/gen-mapping\": \"^0.3.12\",\n \"@jridgewell/trace-mapping\": \"^0.3.28\",\n \"jsesc\": \"^3.0.2\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-compilation-targets\": {\n \"version\": \"7.27.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz\",\n \"integrity\": \"sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/compat-data\": \"^7.27.2\",\n \"@babel/helper-validator-option\": \"^7.27.1\",\n \"browserslist\": \"^4.24.0\",\n \"lru-cache\": \"^5.1.1\",\n \"semver\": \"^6.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-globals\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz\",\n \"integrity\": \"sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-module-imports\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz\",\n \"integrity\": \"sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/traverse\": \"^7.27.1\",\n \"@babel/types\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-module-transforms\": {\n \"version\": \"7.27.3\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz\",\n \"integrity\": \"sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-module-imports\": \"^7.27.1\",\n \"@babel/helper-validator-identifier\": \"^7.27.1\",\n \"@babel/traverse\": \"^7.27.3\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0\"\n }\n },\n \"node_modules/@babel/helper-plugin-utils\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz\",\n \"integrity\": \"sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-string-parser\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz\",\n \"integrity\": \"sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-validator-identifier\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz\",\n \"integrity\": \"sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-validator-option\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz\",\n \"integrity\": \"sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helpers\": {\n \"version\": \"7.27.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz\",\n \"integrity\": \"sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/template\": \"^7.27.2\",\n \"@babel/types\": \"^7.27.6\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/parser\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz\",\n \"integrity\": \"sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.28.0\"\n },\n \"bin\": {\n \"parser\": \"bin/babel-parser.js\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@babel/plugin-transform-react-jsx-self\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz\",\n \"integrity\": \"sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-plugin-utils\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/plugin-transform-react-jsx-source\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz\",\n \"integrity\": \"sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-plugin-utils\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/runtime\": {\n \"version\": \"7.27.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz\",\n \"integrity\": \"sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/template\": {\n \"version\": \"7.27.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz\",\n \"integrity\": \"sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/parser\": \"^7.27.2\",\n \"@babel/types\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/traverse\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz\",\n \"integrity\": \"sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/generator\": \"^7.28.0\",\n \"@babel/helper-globals\": \"^7.28.0\",\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/template\": \"^7.27.2\",\n \"@babel/types\": \"^7.28.0\",\n \"debug\": \"^4.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/types\": {\n \"version\": \"7.28.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/types/-/types-7.28.1.tgz\",\n \"integrity\": \"sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-string-parser\": \"^7.27.1\",\n \"@babel/helper-validator-identifier\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@cbor-extract/cbor-extract-darwin-arm64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.0.tgz\",\n \"integrity\": \"sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-darwin-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-arm\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.2.0.tgz\",\n \"integrity\": \"sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==\",\n \"cpu\": [\n \"arm\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-arm64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.2.0.tgz\",\n \"integrity\": \"sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-win32-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"peer\": true\n },\n \"node_modules/@esbuild/aix-ppc64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz\",\n \"integrity\": \"sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"aix\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/android-arm\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz\",\n \"integrity\": \"sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/android-arm64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz\",\n \"integrity\": \"sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/android-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/darwin-arm64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz\",\n \"integrity\": \"sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/darwin-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/freebsd-arm64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz\",\n \"integrity\": \"sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/freebsd-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-arm\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz\",\n \"integrity\": \"sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-arm64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz\",\n \"integrity\": \"sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-ia32\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz\",\n \"integrity\": \"sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-loong64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz\",\n \"integrity\": \"sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-mips64el\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz\",\n \"integrity\": \"sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==\",\n \"cpu\": [\n \"mips64el\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-ppc64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz\",\n \"integrity\": \"sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-riscv64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz\",\n \"integrity\": \"sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-s390x\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz\",\n \"integrity\": \"sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/netbsd-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"netbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/openbsd-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"openbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/sunos-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"sunos\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/win32-arm64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz\",\n \"integrity\": \"sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/win32-ia32\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz\",\n \"integrity\": \"sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/win32-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@jridgewell/gen-mapping\": {\n \"version\": \"0.3.12\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz\",\n \"integrity\": \"sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/sourcemap-codec\": \"^1.5.0\",\n \"@jridgewell/trace-mapping\": \"^0.3.24\"\n }\n },\n \"node_modules/@jridgewell/resolve-uri\": {\n \"version\": \"3.1.2\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz\",\n \"integrity\": \"sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@jridgewell/sourcemap-codec\": {\n \"version\": \"1.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz\",\n \"integrity\": \"sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@jridgewell/trace-mapping\": {\n \"version\": \"0.3.29\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz\",\n \"integrity\": \"sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/resolve-uri\": \"^3.1.0\",\n \"@jridgewell/sourcemap-codec\": \"^1.4.14\"\n }\n },\n \"node_modules/@opentelemetry/api\": {\n \"version\": \"1.9.0\",\n \"resolved\": \"https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz\",\n \"integrity\": \"sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==\",\n \"license\": \"Apache-2.0\",\n \"engines\": {\n \"node\": \">=8.0.0\"\n }\n },\n \"node_modules/rivetkit\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/rivetkit/-/actor-0.9.1.tgz\",\n \"integrity\": \"sha512-aVoWO81JrYql6hhXX+vRor0B+aeWrnh+9zkcrxbh0EXFBbS5XM8YE4sSFxNKmZThLbGNqfZ5enm1zuA92c7I1w==\",\n \"dev\": true,\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\"\n }\n },\n \"node_modules/@rivetkit/core\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/core/-/core-0.9.1.tgz\",\n \"integrity\": \"sha512-0zYFKo08CQ72Rm6MaVKxcJSEEfn/ypGkkxTX06Q4meCGHuDJFbPA5wopa3NdxrKBPttcGg1QAmDd+1FZnlpubA==\",\n \"license\": \"Apache-2.0\",\n \"peer\": true,\n \"dependencies\": {\n \"cbor-x\": \"^1.6.0\",\n \"invariant\": \"^2.2.4\",\n \"on-change\": \"^5.0.1\",\n \"p-retry\": \"^6.2.1\",\n \"zod\": \"^3.25.67\"\n },\n \"engines\": {\n \"node\": \">=22.0.0\"\n },\n \"peerDependencies\": {\n \"@hono/node-server\": \"^1.14.0\",\n \"@hono/node-ws\": \"^1.1.1\",\n \"@hono/zod-openapi\": \"^0.19.6\",\n \"eventsource\": \"^3.0.5\",\n \"hono\": \"^4.7.0\",\n \"ws\": \"^8.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@hono/node-server\": {\n \"optional\": true\n },\n \"@hono/node-ws\": {\n \"optional\": true\n },\n \"@hono/zod-openapi\": {\n \"optional\": true\n },\n \"eventsource\": {\n \"optional\": true\n },\n \"hono\": {\n \"optional\": true\n },\n \"ws\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/@rivetkit/framework-base\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/framework-base/-/framework-base-0.9.1.tgz\",\n \"integrity\": \"sha512-FxhSqGAtDsD4k7gKS2EhJ5hHsEwI1+QR0vYThUBOLcmXM7zjMZndqIjVperQO4ck/zfjRqjm3lw7znkc+k0wNQ==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@tanstack/store\": \"^0.7.1\"\n },\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\"\n }\n },\n \"node_modules/@rivetkit/react\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/react/-/react-0.9.1.tgz\",\n \"integrity\": \"sha512-0e0gNNj3qCrXHNIxE6ggEEX+E6HjdsSt9pJbWbaQQg+1bsywupRTSdgSDguDHjBvi9qhR9mh7UbNN3A9wYqXuA==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@rivetkit/framework-base\": \"0.9.1\",\n \"@tanstack/react-store\": \"^0.7.1\"\n },\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\",\n \"react\": \"^18 || ^19\",\n \"react-dom\": \"^18 || ^19\"\n }\n },\n \"node_modules/@rolldown/pluginutils\": {\n \"version\": \"1.0.0-beta.19\",\n \"resolved\": \"https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz\",\n \"integrity\": \"sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@rollup/rollup-android-arm-eabi\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.0.tgz\",\n \"integrity\": \"sha512-2o/FgACbji4tW1dzXOqAV15Eu7DdgbKsF2QKcxfG4xbh5iwU7yr5RRP5/U+0asQliSYv5M4o7BevlGIoSL0LXg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ]\n },\n \"node_modules/@rollup/rollup-android-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-PSZ0SvMOjEAxwZeTx32eI/j5xSYtDCRxGu5k9zvzoY77xUNssZM+WV6HYBLROpY5CkXsbQjvz40fBb7WPwDqtQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ]\n },\n \"node_modules/@rollup/rollup-darwin-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-BA4yPIPssPB2aRAWzmqzQ3y2/KotkLyZukVB7j3psK/U3nVJdceo6qr9pLM2xN6iRP/wKfxEbOb1yrlZH6sYZg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ]\n },\n \"node_modules/@rollup/rollup-darwin-x64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.0.tgz\",\n \"integrity\": \"sha512-Pr2o0lvTwsiG4HCr43Zy9xXrHspyMvsvEw4FwKYqhli4FuLE5FjcZzuQ4cfPe0iUFCvSQG6lACI0xj74FDZKRA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ]\n },\n \"node_modules/@rollup/rollup-freebsd-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-lYE8LkE5h4a/+6VnnLiL14zWMPnx6wNbDG23GcYFpRW1V9hYWHAw9lBZ6ZUIrOaoK7NliF1sdwYGiVmziUF4vA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ]\n },\n \"node_modules/@rollup/rollup-freebsd-x64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.0.tgz\",\n \"integrity\": \"sha512-PVQWZK9sbzpvqC9Q0GlehNNSVHR+4m7+wET+7FgSnKG3ci5nAMgGmr9mGBXzAuE5SvguCKJ6mHL6vq1JaJ/gvw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm-gnueabihf\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.0.tgz\",\n \"integrity\": \"sha512-hLrmRl53prCcD+YXTfNvXd776HTxNh8wPAMllusQ+amcQmtgo3V5i/nkhPN6FakW+QVLoUUr2AsbtIRPFU3xIA==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm-musleabihf\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.0.tgz\",\n \"integrity\": \"sha512-XBKGSYcrkdiRRjl+8XvrUR3AosXU0NvF7VuqMsm7s5nRy+nt58ZMB19Jdp1RdqewLcaYnpk8zeVs/4MlLZEJxw==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-fRvZZPUiBz7NztBE/2QnCS5AtqLVhXmUOPj9IHlfGEXkapgImf4W9+FSkL8cWqoAjozyUzqFmSc4zh2ooaeF6g==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-Btv2WRZOcUGi8XU80XwIvzTg4U6+l6D0V6sZTrZx214nrwxw5nAi8hysaXj/mctyClWgesyuxbeLylCBNauimg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-loongarch64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-Li0emNnwtUZdLwHjQPBxn4VWztcrw/h7mgLyHiEI5Z0MhpeFGlzaiBHpSNVOMB/xucjXTTcO+dhv469Djr16KA==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-powerpc64le-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-sB8+pfkYx2kvpDCfd63d5ScYT0Fz1LO6jIb2zLZvmK9ob2D8DeVqrmBDE0iDK8KlBVmsTNzrjr3G1xV4eUZhSw==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-riscv64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-5GQ6PFhh7E6jQm70p1aW05G2cap5zMOvO0se5JMecHeAdj5ZhWEHbJ4hiKpfi1nnnEdTauDXxPgXae/mqjow9w==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-riscv64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-N/euLsBd1rekWcuduakTo/dJw6U6sBP3eUq+RXM9RNfPuWTvG2w/WObDkIvJ2KChy6oxZmOSC08Ak2OJA0UiAA==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-s390x-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-2l9sA7d7QdikL0xQwNMO3xURBUNEWyHVHfAsHsUdq+E/pgLTUcCE+gih5PCdmyHmfTDeXUWVhqL0WZzg0nua3g==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-x64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-XZdD3fEEQcwG2KrJDdEQu7NrHonPxxaV0/w2HpvINBdcqebz1aL+0vM2WFJq4DeiAVT6F5SUQas65HY5JDqoPw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-x64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-7ayfgvtmmWgKWBkCGg5+xTQ0r5V1owVm67zTrsEY1008L5ro7mCyGYORomARt/OquB9KY7LpxVBZes+oSniAAQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-arm64-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-B+IJgcBnE2bm93jEW5kHisqvPITs4ddLOROAcOc/diBgrEiQJJ6Qcjby75rFSmH5eMGrqJryUgJDhrfj942apQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-ia32-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-+CXwwG66g0/FpWOnP/v1HnrGVSOygK/osUbu3wPRy8ECXjoYKjRAyfxYpDQOfghC5qPJYLPH0oN4MCOjwgdMug==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-x64-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-SRf1cytG7wqcHVLrBc9VtPK4pU5wxiB/lNIkNmW2ApKXIg+RpqwHfsaEK+e7eH4A1BpI6BX/aBWXxZCIrJg3uA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@tanstack/react-store\": {\n \"version\": \"0.7.3\",\n \"resolved\": \"https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.7.3.tgz\",\n \"integrity\": \"sha512-3Dnqtbw9P2P0gw8uUM8WP2fFfg8XMDSZCTsywRPZe/XqqYW8PGkXKZTvP0AHkE4mpqP9Y43GpOg9vwO44azu6Q==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@tanstack/store\": \"0.7.2\",\n \"use-sync-external-store\": \"^1.5.0\"\n },\n \"funding\": {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/tannerlinsley\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\",\n \"react-dom\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\"\n }\n },\n \"node_modules/@tanstack/store\": {\n \"version\": \"0.7.2\",\n \"resolved\": \"https://registry.npmjs.org/@tanstack/store/-/store-0.7.2.tgz\",\n \"integrity\": \"sha512-RP80Z30BYiPX2Pyo0Nyw4s1SJFH2jyM6f9i3HfX4pA+gm5jsnYryscdq2aIQLnL4TaGuQMO+zXmN9nh1Qck+Pg==\",\n \"license\": \"MIT\",\n \"funding\": {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/tannerlinsley\"\n }\n },\n \"node_modules/@types/babel__core\": {\n \"version\": \"7.20.5\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz\",\n \"integrity\": \"sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.20.7\",\n \"@babel/types\": \"^7.20.7\",\n \"@types/babel__generator\": \"*\",\n \"@types/babel__template\": \"*\",\n \"@types/babel__traverse\": \"*\"\n }\n },\n \"node_modules/@types/babel__generator\": {\n \"version\": \"7.27.0\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz\",\n \"integrity\": \"sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.0.0\"\n }\n },\n \"node_modules/@types/babel__template\": {\n \"version\": \"7.4.4\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz\",\n \"integrity\": \"sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.1.0\",\n \"@babel/types\": \"^7.0.0\"\n }\n },\n \"node_modules/@types/babel__traverse\": {\n \"version\": \"7.20.7\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz\",\n \"integrity\": \"sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.20.7\"\n }\n },\n \"node_modules/@types/chai\": {\n \"version\": \"5.2.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz\",\n \"integrity\": \"sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/deep-eql\": \"*\"\n }\n },\n \"node_modules/@types/deep-eql\": {\n \"version\": \"4.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz\",\n \"integrity\": \"sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@types/diff-match-patch\": {\n \"version\": \"1.0.36\",\n \"resolved\": \"https://registry.npmjs.org/@types/diff-match-patch/-/diff-match-patch-1.0.36.tgz\",\n \"integrity\": \"sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==\",\n \"license\": \"MIT\"\n },\n \"node_modules/@types/estree\": {\n \"version\": \"1.0.8\",\n \"resolved\": \"https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz\",\n \"integrity\": \"sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@types/node\": {\n \"version\": \"22.16.3\",\n \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-22.16.3.tgz\",\n \"integrity\": \"sha512-sr4Xz74KOUeYadexo1r8imhRtlVXcs+j3XK3TcoiYk7B1t3YRVJgtaD3cwX73NYb71pmVuMLNRhJ9XKdoDB74g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"undici-types\": \"~6.21.0\"\n }\n },\n \"node_modules/@types/prop-types\": {\n \"version\": \"15.7.15\",\n \"resolved\": \"https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz\",\n \"integrity\": \"sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@types/react\": {\n \"version\": \"18.3.23\",\n \"resolved\": \"https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz\",\n \"integrity\": \"sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/prop-types\": \"*\",\n \"csstype\": \"^3.0.2\"\n }\n },\n \"node_modules/@types/react-dom\": {\n \"version\": \"18.3.7\",\n \"resolved\": \"https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz\",\n \"integrity\": \"sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"peerDependencies\": {\n \"@types/react\": \"^18.0.0\"\n }\n },\n \"node_modules/@types/retry\": {\n \"version\": \"0.12.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz\",\n \"integrity\": \"sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==\",\n \"license\": \"MIT\",\n \"peer\": true\n },\n \"node_modules/@vitejs/plugin-react\": {\n \"version\": \"4.6.0\",\n \"resolved\": \"https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.6.0.tgz\",\n \"integrity\": \"sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/core\": \"^7.27.4\",\n \"@babel/plugin-transform-react-jsx-self\": \"^7.27.1\",\n \"@babel/plugin-transform-react-jsx-source\": \"^7.27.1\",\n \"@rolldown/pluginutils\": \"1.0.0-beta.19\",\n \"@types/babel__core\": \"^7.20.5\",\n \"react-refresh\": \"^0.17.0\"\n },\n \"engines\": {\n \"node\": \"^14.18.0 || >=16.0.0\"\n },\n \"peerDependencies\": {\n \"vite\": \"^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0\"\n }\n },\n \"node_modules/@vitest/expect\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz\",\n \"integrity\": \"sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/chai\": \"^5.2.2\",\n \"@vitest/spy\": \"3.2.4\",\n \"@vitest/utils\": \"3.2.4\",\n \"chai\": \"^5.2.0\",\n \"tinyrainbow\": \"^2.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/mocker\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz\",\n \"integrity\": \"sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/spy\": \"3.2.4\",\n \"estree-walker\": \"^3.0.3\",\n \"magic-string\": \"^0.30.17\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n },\n \"peerDependencies\": {\n \"msw\": \"^2.4.9\",\n \"vite\": \"^5.0.0 || ^6.0.0 || ^7.0.0-0\"\n },\n \"peerDependenciesMeta\": {\n \"msw\": {\n \"optional\": true\n },\n \"vite\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/@vitest/pretty-format\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz\",\n \"integrity\": \"sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"tinyrainbow\": \"^2.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/runner\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz\",\n \"integrity\": \"sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/utils\": \"3.2.4\",\n \"pathe\": \"^2.0.3\",\n \"strip-literal\": \"^3.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/snapshot\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz\",\n \"integrity\": \"sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/pretty-format\": \"3.2.4\",\n \"magic-string\": \"^0.30.17\",\n \"pathe\": \"^2.0.3\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/spy\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz\",\n \"integrity\": \"sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"tinyspy\": \"^4.0.3\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/utils\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz\",\n \"integrity\": \"sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/pretty-format\": \"3.2.4\",\n \"loupe\": \"^3.1.4\",\n \"tinyrainbow\": \"^2.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/ai\": {\n \"version\": \"4.3.18\",\n \"resolved\": \"https://registry.npmjs.org/ai/-/ai-4.3.18.tgz\",\n \"integrity\": \"sha512-Mn6JdNGB56GOyrfGJ746zzK6e0f6Ozr7lwfEYkQZjhf261wj1aAJgCvUsgML5/7pSiBJq3ytNEBVcR1oUKTCZw==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@ai-sdk/provider\": \"1.1.3\",\n \"@ai-sdk/provider-utils\": \"2.2.8\",\n \"@ai-sdk/react\": \"1.2.12\",\n \"@ai-sdk/ui-utils\": \"1.2.11\",\n \"@opentelemetry/api\": \"1.9.0\",\n \"jsondiffpatch\": \"0.6.0\"\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"peerDependencies\": {\n \"react\": \"^18 || ^19 || ^19.0.0-rc\",\n \"zod\": \"^3.23.8\"\n },\n \"peerDependenciesMeta\": {\n \"react\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/ai/node_modules/@ai-sdk/provider\": {\n \"version\": \"1.1.3\",\n \"resolved\": \"https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.3.tgz\",\n \"integrity\": \"sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"json-schema\": \"^0.4.0\"\n },\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/ai/node_modules/@ai-sdk/provider-utils\": {\n \"version\": \"2.2.8\",\n \"resolved\": \"https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.8.tgz\",\n \"integrity\": \"sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@ai-sdk/provider\": \"1.1.3\",\n \"nanoid\": \"^3.3.8\",\n \"secure-json-parse\": \"^2.7.0\"\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"peerDependencies\": {\n \"zod\": \"^3.23.8\"\n }\n },\n \"node_modules/ai/node_modules/nanoid\": {\n \"version\": \"3.3.11\",\n \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz\",\n \"integrity\": \"sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==\",\n \"funding\": [\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"bin\": {\n \"nanoid\": \"bin/nanoid.cjs\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || ^13.7 || ^14 || >=15.0.1\"\n }\n },\n \"node_modules/ansi-regex\": {\n \"version\": \"5.0.1\",\n \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/ansi-styles\": {\n \"version\": \"4.3.0\",\n \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\n \"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"color-convert\": \"^2.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n }\n },\n \"node_modules/assertion-error\": {\n \"version\": \"2.0.1\",\n \"resolved\": \"https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz\",\n \"integrity\": \"sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/browserslist\": {\n \"version\": \"4.25.1\",\n \"resolved\": \"https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz\",\n \"integrity\": \"sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"caniuse-lite\": \"^1.0.30001726\",\n \"electron-to-chromium\": \"^1.5.173\",\n \"node-releases\": \"^2.0.19\",\n \"update-browserslist-db\": \"^1.1.3\"\n },\n \"bin\": {\n \"browserslist\": \"cli.js\"\n },\n \"engines\": {\n \"node\": \"^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7\"\n }\n },\n \"node_modules/buffer-from\": {\n \"version\": \"1.1.2\",\n \"resolved\": \"https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz\",\n \"integrity\": \"sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/cac\": {\n \"version\": \"6.7.14\",\n \"resolved\": \"https://registry.npmjs.org/cac/-/cac-6.7.14.tgz\",\n \"integrity\": \"sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/caniuse-lite\": {\n \"version\": \"1.0.30001727\",\n \"resolved\": \"https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz\",\n \"integrity\": \"sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/caniuse-lite\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"CC-BY-4.0\"\n },\n \"node_modules/cbor-extract\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/cbor-extract/-/cbor-extract-2.2.0.tgz\",\n \"integrity\": \"sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==\",\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"peer\": true,\n \"dependencies\": {\n \"node-gyp-build-optional-packages\": \"5.1.1\"\n },\n \"bin\": {\n \"download-cbor-prebuilds\": \"bin/download-prebuilds.js\"\n },\n \"optionalDependencies\": {\n \"@cbor-extract/cbor-extract-darwin-arm64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-darwin-x64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-arm\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-arm64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-x64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-win32-x64\": \"2.2.0\"\n }\n },\n \"node_modules/cbor-x\": {\n \"version\": \"1.6.0\",\n \"resolved\": \"https://registry.npmjs.org/cbor-x/-/cbor-x-1.6.0.tgz\",\n \"integrity\": \"sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"optionalDependencies\": {\n \"cbor-extract\": \"^2.2.0\"\n }\n },\n \"node_modules/chai\": {\n \"version\": \"5.2.1\",\n \"resolved\": \"https://registry.npmjs.org/chai/-/chai-5.2.1.tgz\",\n \"integrity\": \"sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"assertion-error\": \"^2.0.1\",\n \"check-error\": \"^2.1.1\",\n \"deep-eql\": \"^5.0.1\",\n \"loupe\": \"^3.1.0\",\n \"pathval\": \"^2.0.0\"\n },\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/chalk\": {\n \"version\": \"4.1.2\",\n \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz\",\n \"integrity\": \"sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-styles\": \"^4.1.0\",\n \"supports-color\": \"^7.1.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/chalk?sponsor=1\"\n }\n },\n \"node_modules/chalk/node_modules/supports-color\": {\n \"version\": \"7.2.0\",\n \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz\",\n \"integrity\": \"sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"has-flag\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/check-error\": {\n \"version\": \"2.1.1\",\n \"resolved\": \"https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz\",\n \"integrity\": \"sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">= 16\"\n }\n },\n \"node_modules/cliui\": {\n \"version\": \"8.0.1\",\n \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz\",\n \"integrity\": \"sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"dependencies\": {\n \"string-width\": \"^4.2.0\",\n \"strip-ansi\": \"^6.0.1\",\n \"wrap-ansi\": \"^7.0.0\"\n },\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/color-convert\": {\n \"version\": \"2.0.1\",\n \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\n \"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"color-name\": \"~1.1.4\"\n },\n \"engines\": {\n \"node\": \">=7.0.0\"\n }\n },\n \"node_modules/color-name\": {\n \"version\": \"1.1.4\",\n \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\n \"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/concurrently\": {\n \"version\": \"8.2.2\",\n \"resolved\": \"https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz\",\n \"integrity\": \"sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"chalk\": \"^4.1.2\",\n \"date-fns\": \"^2.30.0\",\n \"lodash\": \"^4.17.21\",\n \"rxjs\": \"^7.8.1\",\n \"shell-quote\": \"^1.8.1\",\n \"spawn-command\": \"0.0.2\",\n \"supports-color\": \"^8.1.1\",\n \"tree-kill\": \"^1.2.2\",\n \"yargs\": \"^17.7.2\"\n },\n \"bin\": {\n \"conc\": \"dist/bin/concurrently.js\",\n \"concurrently\": \"dist/bin/concurrently.js\"\n },\n \"engines\": {\n \"node\": \"^14.13.0 || >=16.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/open-cli-tools/concurrently?sponsor=1\"\n }\n },\n \"node_modules/convert-source-map\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz\",\n \"integrity\": \"sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/csstype\": {\n \"version\": \"3.1.3\",\n \"resolved\": \"https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz\",\n \"integrity\": \"sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/date-fns\": {\n \"version\": \"2.30.0\",\n \"resolved\": \"https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz\",\n \"integrity\": \"sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.21.0\"\n },\n \"engines\": {\n \"node\": \">=0.11\"\n },\n \"funding\": {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/date-fns\"\n }\n },\n \"node_modules/debug\": {\n \"version\": \"4.4.1\",\n \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.4.1.tgz\",\n \"integrity\": \"sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ms\": \"^2.1.3\"\n },\n \"engines\": {\n \"node\": \">=6.0\"\n },\n \"peerDependenciesMeta\": {\n \"supports-color\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/deep-eql\": {\n \"version\": \"5.0.2\",\n \"resolved\": \"https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz\",\n \"integrity\": \"sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/dequal\": {\n \"version\": \"2.0.3\",\n \"resolved\": \"https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz\",\n \"integrity\": \"sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==\",\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/detect-libc\": {\n \"version\": \"2.0.4\",\n \"resolved\": \"https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz\",\n \"integrity\": \"sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==\",\n \"license\": \"Apache-2.0\",\n \"optional\": true,\n \"peer\": true,\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/diff-match-patch\": {\n \"version\": \"1.0.5\",\n \"resolved\": \"https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz\",\n \"integrity\": \"sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==\",\n \"license\": \"Apache-2.0\"\n },\n \"node_modules/electron-to-chromium\": {\n \"version\": \"1.5.183\",\n \"resolved\": \"https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.183.tgz\",\n \"integrity\": \"sha512-vCrDBYjQCAEefWGjlK3EpoSKfKbT10pR4XXPdn65q7snuNOZnthoVpBfZPykmDapOKfoD+MMIPG8ZjKyyc9oHA==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/emoji-regex\": {\n \"version\": \"8.0.0\",\n \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/es-module-lexer\": {\n \"version\": \"1.7.0\",\n \"resolved\": \"https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz\",\n \"integrity\": \"sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/esbuild\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz\",\n \"integrity\": \"sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"esbuild\": \"bin/esbuild\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"optionalDependencies\": {\n \"@esbuild/android-arm\": \"0.18.20\",\n \"@esbuild/android-arm64\": \"0.18.20\",\n \"@esbuild/android-x64\": \"0.18.20\",\n \"@esbuild/darwin-arm64\": \"0.18.20\",\n \"@esbuild/darwin-x64\": \"0.18.20\",\n \"@esbuild/freebsd-arm64\": \"0.18.20\",\n \"@esbuild/freebsd-x64\": \"0.18.20\",\n \"@esbuild/linux-arm\": \"0.18.20\",\n \"@esbuild/linux-arm64\": \"0.18.20\",\n \"@esbuild/linux-ia32\": \"0.18.20\",\n \"@esbuild/linux-loong64\": \"0.18.20\",\n \"@esbuild/linux-mips64el\": \"0.18.20\",\n \"@esbuild/linux-ppc64\": \"0.18.20\",\n \"@esbuild/linux-riscv64\": \"0.18.20\",\n \"@esbuild/linux-s390x\": \"0.18.20\",\n \"@esbuild/linux-x64\": \"0.18.20\",\n \"@esbuild/netbsd-x64\": \"0.18.20\",\n \"@esbuild/openbsd-x64\": \"0.18.20\",\n \"@esbuild/sunos-x64\": \"0.18.20\",\n \"@esbuild/win32-arm64\": \"0.18.20\",\n \"@esbuild/win32-ia32\": \"0.18.20\",\n \"@esbuild/win32-x64\": \"0.18.20\"\n }\n },\n \"node_modules/escalade\": {\n \"version\": \"3.2.0\",\n \"resolved\": \"https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz\",\n \"integrity\": \"sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/estree-walker\": {\n \"version\": \"3.0.3\",\n \"resolved\": \"https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz\",\n \"integrity\": \"sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/estree\": \"^1.0.0\"\n }\n },\n \"node_modules/eventsource-parser\": {\n \"version\": \"1.1.2\",\n \"resolved\": \"https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-1.1.2.tgz\",\n \"integrity\": \"sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA==\",\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=14.18\"\n }\n },\n \"node_modules/expect-type\": {\n \"version\": \"1.2.2\",\n \"resolved\": \"https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz\",\n \"integrity\": \"sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"engines\": {\n \"node\": \">=12.0.0\"\n }\n },\n \"node_modules/fdir\": {\n \"version\": \"6.4.6\",\n \"resolved\": \"https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz\",\n \"integrity\": \"sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"peerDependencies\": {\n \"picomatch\": \"^3 || ^4\"\n },\n \"peerDependenciesMeta\": {\n \"picomatch\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/fsevents\": {\n \"version\": \"2.3.3\",\n \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz\",\n \"integrity\": \"sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n }\n },\n \"node_modules/gensync\": {\n \"version\": \"1.0.0-beta.2\",\n \"resolved\": \"https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz\",\n \"integrity\": \"sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/get-caller-file\": {\n \"version\": \"2.0.5\",\n \"resolved\": \"https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz\",\n \"integrity\": \"sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \"6.* || 8.* || >= 10.*\"\n }\n },\n \"node_modules/get-tsconfig\": {\n \"version\": \"4.10.1\",\n \"resolved\": \"https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz\",\n \"integrity\": \"sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"resolve-pkg-maps\": \"^1.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/privatenumber/get-tsconfig?sponsor=1\"\n }\n },\n \"node_modules/has-flag\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz\",\n \"integrity\": \"sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/invariant\": {\n \"version\": \"2.2.4\",\n \"resolved\": \"https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz\",\n \"integrity\": \"sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"dependencies\": {\n \"loose-envify\": \"^1.0.0\"\n }\n },\n \"node_modules/is-fullwidth-code-point\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz\",\n \"integrity\": \"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/is-network-error\": {\n \"version\": \"1.1.0\",\n \"resolved\": \"https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz\",\n \"integrity\": \"sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">=16\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/js-tokens\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz\",\n \"integrity\": \"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==\",\n \"license\": \"MIT\"\n },\n \"node_modules/jsesc\": {\n \"version\": \"3.1.0\",\n \"resolved\": \"https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz\",\n \"integrity\": \"sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"jsesc\": \"bin/jsesc\"\n },\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/json-schema\": {\n \"version\": \"0.4.0\",\n \"resolved\": \"https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz\",\n \"integrity\": \"sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==\",\n \"license\": \"(AFL-2.1 OR BSD-3-Clause)\"\n },\n \"node_modules/json5\": {\n \"version\": \"2.2.3\",\n \"resolved\": \"https://registry.npmjs.org/json5/-/json5-2.2.3.tgz\",\n \"integrity\": \"sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"json5\": \"lib/cli.js\"\n },\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/jsondiffpatch\": {\n \"version\": \"0.6.0\",\n \"resolved\": \"https://registry.npmjs.org/jsondiffpatch/-/jsondiffpatch-0.6.0.tgz\",\n \"integrity\": \"sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/diff-match-patch\": \"^1.0.36\",\n \"chalk\": \"^5.3.0\",\n \"diff-match-patch\": \"^1.0.5\"\n },\n \"bin\": {\n \"jsondiffpatch\": \"bin/jsondiffpatch.js\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n }\n },\n \"node_modules/jsondiffpatch/node_modules/chalk\": {\n \"version\": \"5.4.1\",\n \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz\",\n \"integrity\": \"sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==\",\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \"^12.17.0 || ^14.13 || >=16.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/chalk?sponsor=1\"\n }\n },\n \"node_modules/lodash\": {\n \"version\": \"4.17.21\",\n \"resolved\": \"https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz\",\n \"integrity\": \"sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/loose-envify\": {\n \"version\": \"1.4.0\",\n \"resolved\": \"https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz\",\n \"integrity\": \"sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"js-tokens\": \"^3.0.0 || ^4.0.0\"\n },\n \"bin\": {\n \"loose-envify\": \"cli.js\"\n }\n },\n \"node_modules/loupe\": {\n \"version\": \"3.1.4\",\n \"resolved\": \"https://registry.npmjs.org/loupe/-/loupe-3.1.4.tgz\",\n \"integrity\": \"sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/lru-cache\": {\n \"version\": \"5.1.1\",\n \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz\",\n \"integrity\": \"sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"dependencies\": {\n \"yallist\": \"^3.0.2\"\n }\n },\n \"node_modules/magic-string\": {\n \"version\": \"0.30.17\",\n \"resolved\": \"https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz\",\n \"integrity\": \"sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/sourcemap-codec\": \"^1.5.0\"\n }\n },\n \"node_modules/ms\": {\n \"version\": \"2.1.3\",\n \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz\",\n \"integrity\": \"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/nanoid\": {\n \"version\": \"3.3.6\",\n \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz\",\n \"integrity\": \"sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==\",\n \"funding\": [\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"bin\": {\n \"nanoid\": \"bin/nanoid.cjs\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || ^13.7 || ^14 || >=15.0.1\"\n }\n },\n \"node_modules/node-gyp-build-optional-packages\": {\n \"version\": \"5.1.1\",\n \"resolved\": \"https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz\",\n \"integrity\": \"sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==\",\n \"license\": \"MIT\",\n \"optional\": true,\n \"peer\": true,\n \"dependencies\": {\n \"detect-libc\": \"^2.0.1\"\n },\n \"bin\": {\n \"node-gyp-build-optional-packages\": \"bin.js\",\n \"node-gyp-build-optional-packages-optional\": \"optional.js\",\n \"node-gyp-build-optional-packages-test\": \"build-test.js\"\n }\n },\n \"node_modules/node-releases\": {\n \"version\": \"2.0.19\",\n \"resolved\": \"https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz\",\n \"integrity\": \"sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/on-change\": {\n \"version\": \"5.0.1\",\n \"resolved\": \"https://registry.npmjs.org/on-change/-/on-change-5.0.1.tgz\",\n \"integrity\": \"sha512-n7THCP7RkyReRSLkJb8kUWoNsxUIBxTkIp3JKno+sEz6o/9AJ3w3P9fzQkITEkMwyTKJjZciF3v/pVoouxZZMg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">=18\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sindresorhus/on-change?sponsor=1\"\n }\n },\n \"node_modules/p-retry\": {\n \"version\": \"6.2.1\",\n \"resolved\": \"https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz\",\n \"integrity\": \"sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"dependencies\": {\n \"@types/retry\": \"0.12.2\",\n \"is-network-error\": \"^1.0.0\",\n \"retry\": \"^0.13.1\"\n },\n \"engines\": {\n \"node\": \">=16.17\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/pathe\": {\n \"version\": \"2.0.3\",\n \"resolved\": \"https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz\",\n \"integrity\": \"sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/pathval\": {\n \"version\": \"2.0.1\",\n \"resolved\": \"https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz\",\n \"integrity\": \"sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">= 14.16\"\n }\n },\n \"node_modules/picocolors\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz\",\n \"integrity\": \"sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/picomatch\": {\n \"version\": \"4.0.2\",\n \"resolved\": \"https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz\",\n \"integrity\": \"sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=12\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/jonschlinkert\"\n }\n },\n \"node_modules/postcss\": {\n \"version\": \"8.5.6\",\n \"resolved\": \"https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz\",\n \"integrity\": \"sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/postcss/\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/postcss\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"nanoid\": \"^3.3.11\",\n \"picocolors\": \"^1.1.1\",\n \"source-map-js\": \"^1.2.1\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || >=14\"\n }\n },\n \"node_modules/postcss/node_modules/nanoid\": {\n \"version\": \"3.3.11\",\n \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz\",\n \"integrity\": \"sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"bin\": {\n \"nanoid\": \"bin/nanoid.cjs\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || ^13.7 || ^14 || >=15.0.1\"\n }\n },\n \"node_modules/react\": {\n \"version\": \"18.3.1\",\n \"resolved\": \"https://registry.npmjs.org/react/-/react-18.3.1.tgz\",\n \"integrity\": \"sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\"\n },\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/react-dom\": {\n \"version\": \"18.3.1\",\n \"resolved\": \"https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz\",\n \"integrity\": \"sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\",\n \"scheduler\": \"^0.23.2\"\n },\n \"peerDependencies\": {\n \"react\": \"^18.3.1\"\n }\n },\n \"node_modules/react-refresh\": {\n \"version\": \"0.17.0\",\n \"resolved\": \"https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz\",\n \"integrity\": \"sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/require-directory\": {\n \"version\": \"2.1.1\",\n \"resolved\": \"https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz\",\n \"integrity\": \"sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/resolve-pkg-maps\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz\",\n \"integrity\": \"sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"funding\": {\n \"url\": \"https://github.com/privatenumber/resolve-pkg-maps?sponsor=1\"\n }\n },\n \"node_modules/retry\": {\n \"version\": \"0.13.1\",\n \"resolved\": \"https://registry.npmjs.org/retry/-/retry-0.13.1.tgz\",\n \"integrity\": \"sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">= 4\"\n }\n },\n \"node_modules/rollup\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/rollup/-/rollup-4.45.0.tgz\",\n \"integrity\": \"sha512-WLjEcJRIo7i3WDDgOIJqVI2d+lAC3EwvOGy+Xfq6hs+GQuAA4Di/H72xmXkOhrIWFg2PFYSKZYfH0f4vfKXN4A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/estree\": \"1.0.8\"\n },\n \"bin\": {\n \"rollup\": \"dist/bin/rollup\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\",\n \"npm\": \">=8.0.0\"\n },\n \"optionalDependencies\": {\n \"@rollup/rollup-android-arm-eabi\": \"4.45.0\",\n \"@rollup/rollup-android-arm64\": \"4.45.0\",\n \"@rollup/rollup-darwin-arm64\": \"4.45.0\",\n \"@rollup/rollup-darwin-x64\": \"4.45.0\",\n \"@rollup/rollup-freebsd-arm64\": \"4.45.0\",\n \"@rollup/rollup-freebsd-x64\": \"4.45.0\",\n \"@rollup/rollup-linux-arm-gnueabihf\": \"4.45.0\",\n \"@rollup/rollup-linux-arm-musleabihf\": \"4.45.0\",\n \"@rollup/rollup-linux-arm64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-arm64-musl\": \"4.45.0\",\n \"@rollup/rollup-linux-loongarch64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-powerpc64le-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-riscv64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-riscv64-musl\": \"4.45.0\",\n \"@rollup/rollup-linux-s390x-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-x64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-x64-musl\": \"4.45.0\",\n \"@rollup/rollup-win32-arm64-msvc\": \"4.45.0\",\n \"@rollup/rollup-win32-ia32-msvc\": \"4.45.0\",\n \"@rollup/rollup-win32-x64-msvc\": \"4.45.0\",\n \"fsevents\": \"~2.3.2\"\n }\n },\n \"node_modules/rxjs\": {\n \"version\": \"7.8.2\",\n \"resolved\": \"https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz\",\n \"integrity\": \"sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"tslib\": \"^2.1.0\"\n }\n },\n \"node_modules/scheduler\": {\n \"version\": \"0.23.2\",\n \"resolved\": \"https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz\",\n \"integrity\": \"sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\"\n }\n },\n \"node_modules/secure-json-parse\": {\n \"version\": \"2.7.0\",\n \"resolved\": \"https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz\",\n \"integrity\": \"sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==\",\n \"license\": \"BSD-3-Clause\"\n },\n \"node_modules/semver\": {\n \"version\": \"6.3.1\",\n \"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n \"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"bin\": {\n \"semver\": \"bin/semver.js\"\n }\n },\n \"node_modules/shell-quote\": {\n \"version\": \"1.8.3\",\n \"resolved\": \"https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz\",\n \"integrity\": \"sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">= 0.4\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/ljharb\"\n }\n },\n \"node_modules/siginfo\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz\",\n \"integrity\": \"sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/source-map\": {\n \"version\": \"0.6.1\",\n \"resolved\": \"https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz\",\n \"integrity\": \"sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==\",\n \"dev\": true,\n \"license\": \"BSD-3-Clause\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/source-map-js\": {\n \"version\": \"1.2.1\",\n \"resolved\": \"https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz\",\n \"integrity\": \"sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==\",\n \"dev\": true,\n \"license\": \"BSD-3-Clause\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/source-map-support\": {\n \"version\": \"0.5.21\",\n \"resolved\": \"https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz\",\n \"integrity\": \"sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"buffer-from\": \"^1.0.0\",\n \"source-map\": \"^0.6.0\"\n }\n },\n \"node_modules/spawn-command\": {\n \"version\": \"0.0.2\",\n \"resolved\": \"https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz\",\n \"integrity\": \"sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==\",\n \"dev\": true\n },\n \"node_modules/stackback\": {\n \"version\": \"0.0.2\",\n \"resolved\": \"https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz\",\n \"integrity\": \"sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/std-env\": {\n \"version\": \"3.9.0\",\n \"resolved\": \"https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz\",\n \"integrity\": \"sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/string-width\": {\n \"version\": \"4.2.3\",\n \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"emoji-regex\": \"^8.0.0\",\n \"is-fullwidth-code-point\": \"^3.0.0\",\n \"strip-ansi\": \"^6.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/strip-ansi\": {\n \"version\": \"6.0.1\",\n \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-regex\": \"^5.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/strip-literal\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz\",\n \"integrity\": \"sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"js-tokens\": \"^9.0.1\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/antfu\"\n }\n },\n \"node_modules/strip-literal/node_modules/js-tokens\": {\n \"version\": \"9.0.1\",\n \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz\",\n \"integrity\": \"sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/supports-color\": {\n \"version\": \"8.1.1\",\n \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz\",\n \"integrity\": \"sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"has-flag\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/supports-color?sponsor=1\"\n }\n },\n \"node_modules/swr\": {\n \"version\": \"2.3.4\",\n \"resolved\": \"https://registry.npmjs.org/swr/-/swr-2.3.4.tgz\",\n \"integrity\": \"sha512-bYd2lrhc+VarcpkgWclcUi92wYCpOgMws9Sd1hG1ntAu0NEy+14CbotuFjshBU2kt9rYj9TSmDcybpxpeTU1fg==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"dequal\": \"^2.0.3\",\n \"use-sync-external-store\": \"^1.4.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\"\n }\n },\n \"node_modules/throttleit\": {\n \"version\": \"2.1.0\",\n \"resolved\": \"https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz\",\n \"integrity\": \"sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==\",\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=18\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/tinybench\": {\n \"version\": \"2.9.0\",\n \"resolved\": \"https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz\",\n \"integrity\": \"sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/tinyexec\": {\n \"version\": \"0.3.2\",\n \"resolved\": \"https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz\",\n \"integrity\": \"sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/tinyglobby\": {\n \"version\": \"0.2.14\",\n \"resolved\": \"https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz\",\n \"integrity\": \"sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"fdir\": \"^6.4.4\",\n \"picomatch\": \"^4.0.2\"\n },\n \"engines\": {\n \"node\": \">=12.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/SuperchupuDev\"\n }\n },\n \"node_modules/tinypool\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz\",\n \"integrity\": \"sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n }\n },\n \"node_modules/tinyrainbow\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz\",\n \"integrity\": \"sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=14.0.0\"\n }\n },\n \"node_modules/tinyspy\": {\n \"version\": \"4.0.3\",\n \"resolved\": \"https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz\",\n \"integrity\": \"sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=14.0.0\"\n }\n },\n \"node_modules/tree-kill\": {\n \"version\": \"1.2.2\",\n \"resolved\": \"https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz\",\n \"integrity\": \"sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"tree-kill\": \"cli.js\"\n }\n },\n \"node_modules/tslib\": {\n \"version\": \"2.8.1\",\n \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz\",\n \"integrity\": \"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==\",\n \"dev\": true,\n \"license\": \"0BSD\"\n },\n \"node_modules/tsx\": {\n \"version\": \"3.14.0\",\n \"resolved\": \"https://registry.npmjs.org/tsx/-/tsx-3.14.0.tgz\",\n \"integrity\": \"sha512-xHtFaKtHxM9LOklMmJdI3BEnQq/D5F73Of2E1GDrITi9sgoVkvIsrQUTY1G8FlmGtA+awCI4EBlTRRYxkL2sRg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"esbuild\": \"~0.18.20\",\n \"get-tsconfig\": \"^4.7.2\",\n \"source-map-support\": \"^0.5.21\"\n },\n \"bin\": {\n \"tsx\": \"dist/cli.mjs\"\n },\n \"optionalDependencies\": {\n \"fsevents\": \"~2.3.3\"\n }\n },\n \"node_modules/typescript\": {\n \"version\": \"5.8.3\",\n \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz\",\n \"integrity\": \"sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"bin\": {\n \"tsc\": \"bin/tsc\",\n \"tsserver\": \"bin/tsserver\"\n },\n \"engines\": {\n \"node\": \">=14.17\"\n }\n },\n \"node_modules/undici-types\": {\n \"version\": \"6.21.0\",\n \"resolved\": \"https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz\",\n \"integrity\": \"sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/update-browserslist-db\": {\n \"version\": \"1.1.3\",\n \"resolved\": \"https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz\",\n \"integrity\": \"sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"escalade\": \"^3.2.0\",\n \"picocolors\": \"^1.1.1\"\n },\n \"bin\": {\n \"update-browserslist-db\": \"cli.js\"\n },\n \"peerDependencies\": {\n \"browserslist\": \">= 4.21.0\"\n }\n },\n \"node_modules/use-sync-external-store\": {\n \"version\": \"1.5.0\",\n \"resolved\": \"https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz\",\n \"integrity\": \"sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==\",\n \"license\": \"MIT\",\n \"peerDependencies\": {\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\"\n }\n },\n \"node_modules/vite\": {\n \"version\": \"5.4.19\",\n \"resolved\": \"https://registry.npmjs.org/vite/-/vite-5.4.19.tgz\",\n \"integrity\": \"sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"esbuild\": \"^0.21.3\",\n \"postcss\": \"^8.4.43\",\n \"rollup\": \"^4.20.0\"\n },\n \"bin\": {\n \"vite\": \"bin/vite.js\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/vitejs/vite?sponsor=1\"\n },\n \"optionalDependencies\": {\n \"fsevents\": \"~2.3.3\"\n },\n \"peerDependencies\": {\n \"@types/node\": \"^18.0.0 || >=20.0.0\",\n \"less\": \"*\",\n \"lightningcss\": \"^1.21.0\",\n \"sass\": \"*\",\n \"sass-embedded\": \"*\",\n \"stylus\": \"*\",\n \"sugarss\": \"*\",\n \"terser\": \"^5.4.0\"\n },\n \"peerDependenciesMeta\": {\n \"@types/node\": {\n \"optional\": true\n },\n \"less\": {\n \"optional\": true\n },\n \"lightningcss\": {\n \"optional\": true\n },\n \"sass\": {\n \"optional\": true\n },\n \"sass-embedded\": {\n \"optional\": true\n },\n \"stylus\": {\n \"optional\": true\n },\n \"sugarss\": {\n \"optional\": true\n },\n \"terser\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/vite-node\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz\",\n \"integrity\": \"sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"cac\": \"^6.7.14\",\n \"debug\": \"^4.4.1\",\n \"es-module-lexer\": \"^1.7.0\",\n \"pathe\": \"^2.0.3\",\n \"vite\": \"^5.0.0 || ^6.0.0 || ^7.0.0-0\"\n },\n \"bin\": {\n \"vite-node\": \"vite-node.mjs\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || ^20.0.0 || >=22.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-arm\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz\",\n \"integrity\": \"sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/darwin-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/darwin-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/freebsd-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/freebsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-arm\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz\",\n \"integrity\": \"sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-ia32\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz\",\n \"integrity\": \"sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-loong64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz\",\n \"integrity\": \"sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-mips64el\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz\",\n \"integrity\": \"sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==\",\n \"cpu\": [\n \"mips64el\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-ppc64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz\",\n \"integrity\": \"sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-riscv64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz\",\n \"integrity\": \"sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-s390x\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz\",\n \"integrity\": \"sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/netbsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"netbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/openbsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"openbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/sunos-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"sunos\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-ia32\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz\",\n \"integrity\": \"sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/esbuild\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz\",\n \"integrity\": \"sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"esbuild\": \"bin/esbuild\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"optionalDependencies\": {\n \"@esbuild/aix-ppc64\": \"0.21.5\",\n \"@esbuild/android-arm\": \"0.21.5\",\n \"@esbuild/android-arm64\": \"0.21.5\",\n \"@esbuild/android-x64\": \"0.21.5\",\n \"@esbuild/darwin-arm64\": \"0.21.5\",\n \"@esbuild/darwin-x64\": \"0.21.5\",\n \"@esbuild/freebsd-arm64\": \"0.21.5\",\n \"@esbuild/freebsd-x64\": \"0.21.5\",\n \"@esbuild/linux-arm\": \"0.21.5\",\n \"@esbuild/linux-arm64\": \"0.21.5\",\n \"@esbuild/linux-ia32\": \"0.21.5\",\n \"@esbuild/linux-loong64\": \"0.21.5\",\n \"@esbuild/linux-mips64el\": \"0.21.5\",\n \"@esbuild/linux-ppc64\": \"0.21.5\",\n \"@esbuild/linux-riscv64\": \"0.21.5\",\n \"@esbuild/linux-s390x\": \"0.21.5\",\n \"@esbuild/linux-x64\": \"0.21.5\",\n \"@esbuild/netbsd-x64\": \"0.21.5\",\n \"@esbuild/openbsd-x64\": \"0.21.5\",\n \"@esbuild/sunos-x64\": \"0.21.5\",\n \"@esbuild/win32-arm64\": \"0.21.5\",\n \"@esbuild/win32-ia32\": \"0.21.5\",\n \"@esbuild/win32-x64\": \"0.21.5\"\n }\n },\n \"node_modules/vitest\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz\",\n \"integrity\": \"sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/chai\": \"^5.2.2\",\n \"@vitest/expect\": \"3.2.4\",\n \"@vitest/mocker\": \"3.2.4\",\n \"@vitest/pretty-format\": \"^3.2.4\",\n \"@vitest/runner\": \"3.2.4\",\n \"@vitest/snapshot\": \"3.2.4\",\n \"@vitest/spy\": \"3.2.4\",\n \"@vitest/utils\": \"3.2.4\",\n \"chai\": \"^5.2.0\",\n \"debug\": \"^4.4.1\",\n \"expect-type\": \"^1.2.1\",\n \"magic-string\": \"^0.30.17\",\n \"pathe\": \"^2.0.3\",\n \"picomatch\": \"^4.0.2\",\n \"std-env\": \"^3.9.0\",\n \"tinybench\": \"^2.9.0\",\n \"tinyexec\": \"^0.3.2\",\n \"tinyglobby\": \"^0.2.14\",\n \"tinypool\": \"^1.1.1\",\n \"tinyrainbow\": \"^2.0.0\",\n \"vite\": \"^5.0.0 || ^6.0.0 || ^7.0.0-0\",\n \"vite-node\": \"3.2.4\",\n \"why-is-node-running\": \"^2.3.0\"\n },\n \"bin\": {\n \"vitest\": \"vitest.mjs\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || ^20.0.0 || >=22.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n },\n \"peerDependencies\": {\n \"@edge-runtime/vm\": \"*\",\n \"@types/debug\": \"^4.1.12\",\n \"@types/node\": \"^18.0.0 || ^20.0.0 || >=22.0.0\",\n \"@vitest/browser\": \"3.2.4\",\n \"@vitest/ui\": \"3.2.4\",\n \"happy-dom\": \"*\",\n \"jsdom\": \"*\"\n },\n \"peerDependenciesMeta\": {\n \"@edge-runtime/vm\": {\n \"optional\": true\n },\n \"@types/debug\": {\n \"optional\": true\n },\n \"@types/node\": {\n \"optional\": true\n },\n \"@vitest/browser\": {\n \"optional\": true\n },\n \"@vitest/ui\": {\n \"optional\": true\n },\n \"happy-dom\": {\n \"optional\": true\n },\n \"jsdom\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/why-is-node-running\": {\n \"version\": \"2.3.0\",\n \"resolved\": \"https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz\",\n \"integrity\": \"sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"siginfo\": \"^2.0.0\",\n \"stackback\": \"0.0.2\"\n },\n \"bin\": {\n \"why-is-node-running\": \"cli.js\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/wrap-ansi\": {\n \"version\": \"7.0.0\",\n \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\n \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-styles\": \"^4.0.0\",\n \"string-width\": \"^4.1.0\",\n \"strip-ansi\": \"^6.0.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n }\n },\n \"node_modules/y18n\": {\n \"version\": \"5.0.8\",\n \"resolved\": \"https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz\",\n \"integrity\": \"sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \">=10\"\n }\n },\n \"node_modules/yallist\": {\n \"version\": \"3.1.1\",\n \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz\",\n \"integrity\": \"sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/yargs\": {\n \"version\": \"17.7.2\",\n \"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz\",\n \"integrity\": \"sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"cliui\": \"^8.0.1\",\n \"escalade\": \"^3.1.1\",\n \"get-caller-file\": \"^2.0.5\",\n \"require-directory\": \"^2.1.1\",\n \"string-width\": \"^4.2.3\",\n \"y18n\": \"^5.0.5\",\n \"yargs-parser\": \"^21.1.1\"\n },\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/yargs-parser\": {\n \"version\": \"21.1.1\",\n \"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz\",\n \"integrity\": \"sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/zod\": {\n \"version\": \"3.25.76\",\n \"resolved\": \"https://registry.npmjs.org/zod/-/zod-3.25.76.tgz\",\n \"integrity\": \"sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==\",\n \"license\": \"MIT\",\n \"funding\": {\n \"url\": \"https://github.com/sponsors/colinhacks\"\n }\n },\n \"node_modules/zod-to-json-schema\": {\n \"version\": \"3.24.6\",\n \"resolved\": \"https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz\",\n \"integrity\": \"sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==\",\n \"license\": \"ISC\",\n \"peerDependencies\": {\n \"zod\": \"^3.24.1\"\n }\n }\n }\n}\n", "package.json": "{\n \"name\": \"example-ai-agent\",\n \"version\": \"0.9.1\",\n \"private\": true,\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"concurrently \\\"npm run dev:backend\\\" \\\"npm run dev:frontend\\\"\",\n \"dev:backend\": \"tsx --watch src/backend/server.ts\",\n \"dev:frontend\": \"vite\",\n \"build\": \"vite build\",\n \"check-types\": \"tsc --noEmit\",\n \"test\": \"vitest run\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.13.9\",\n \"@types/react\": \"^18.2.0\",\n \"@types/react-dom\": \"^18.2.0\",\n \"@vitejs/plugin-react\": \"^4.2.0\",\n \"concurrently\": \"^8.2.2\",\n \"rivetkit\": \"^0.9.1\",\n \"tsx\": \"^3.12.7\",\n \"typescript\": \"^5.5.2\",\n \"vite\": \"^5.0.0\",\n \"vitest\": \"^3.1.1\"\n },\n \"dependencies\": {\n \"@ai-sdk/openai\": \"^0.0.66\",\n \"@rivetkit/react\": \"^0.9.1\",\n \"ai\": \"^4.0.38\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\",\n \"zod\": \"^3.25.69\"\n },\n \"stableVersion\": \"0.8.0\"\n}\n", "tsconfig.json": "{\n \"compilerOptions\": {\n \"target\": \"esnext\",\n \"lib\": [\"esnext\", \"dom\"],\n \"jsx\": \"react-jsx\",\n \"module\": \"esnext\",\n \"moduleResolution\": \"bundler\",\n \"types\": [\"node\", \"vite/client\"],\n \"resolveJsonModule\": true,\n \"allowJs\": true,\n \"checkJs\": false,\n \"noEmit\": true,\n \"isolatedModules\": true,\n \"allowSyntheticDefaultImports\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"strict\": true,\n \"skipLibCheck\": true\n },\n \"include\": [\"src/**/*\"],\n \"exclude\": [\"node_modules\", \"dist\"]\n}\n", @@ -33,7 +33,7 @@ export const examples: ExampleData[] = [ "src/frontend/App.tsx": "import { createClient, createRivetKit } from \"@rivetkit/react\";\nimport { useEffect, useState } from \"react\";\nimport type { Message, registry } from \"../backend/registry\";\n\nconst client = createClient(\"http://localhost:8080\");\nconst { useActor } = createRivetKit(client);\n\nexport function App() {\n\tconst aiAgent = useActor({\n\t\tname: \"aiAgent\",\n\t\tkey: [\"default\"],\n\t});\n\tconst [messages, setMessages] = useState([]);\n\tconst [input, setInput] = useState(\"\");\n\tconst [isLoading, setIsLoading] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (aiAgent.connection) {\n\t\t\taiAgent.connection.getMessages().then(setMessages);\n\t\t}\n\t}, [aiAgent.connection]);\n\n\taiAgent.useEvent(\"messageReceived\", (message: Message) => {\n\t\tsetMessages((prev) => [...prev, message]);\n\t\tsetIsLoading(false);\n\t});\n\n\tconst handleSendMessage = async () => {\n\t\tif (aiAgent.connection && input.trim()) {\n\t\t\tsetIsLoading(true);\n\n\t\t\tconst userMessage = { role: \"user\", content: input, timestamp: Date.now() } as Message;\n\t\t\tsetMessages((prev) => [...prev, userMessage]);\n\n\t\t\tawait aiAgent.connection.sendMessage(input);\n\t\t\tsetInput(\"\");\n\t\t}\n\t};\n\n\treturn (\n\t\t
\n\t\t\t
\n\t\t\t\t{messages.length === 0 ? (\n\t\t\t\t\t
\n\t\t\t\t\t\tAsk the AI assistant a question to get started\n\t\t\t\t\t
\n\t\t\t\t) : (\n\t\t\t\t\tmessages.map((msg, i) => (\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
{msg.role === \"user\" ? \"👤\" : \"🤖\"}
\n\t\t\t\t\t\t\t
{msg.content}
\n\t\t\t\t\t\t
\n\t\t\t\t\t))\n\t\t\t\t)}\n\t\t\t\t{isLoading && (\n\t\t\t\t\t
\n\t\t\t\t\t\t
🤖
\n\t\t\t\t\t\t
Thinking...
\n\t\t\t\t\t
\n\t\t\t\t)}\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t setInput(e.target.value)}\n\t\t\t\t\tonKeyPress={(e) => e.key === \"Enter\" && handleSendMessage()}\n\t\t\t\t\tplaceholder=\"Ask the AI assistant...\"\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t/>\n\t\t\t\t\n\t\t\t\t\tSend\n\t\t\t\t\n\t\t\t
\n\t\t
\n\t);\n}", "src/frontend/main.tsx": "import { StrictMode } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { App } from \"./App\";\n\nconst root = document.getElementById(\"root\");\nif (!root) throw new Error(\"Root element not found\");\n\ncreateRoot(root).render(\n\t\n\t\t\n\t\n);", "src/frontend/index.html": "\n\n\n \n \n AI Agent Example\n \n\n\n
\n \n\n", - "src/backend/registry.ts": "import { openai } from \"@ai-sdk/openai\";\nimport { actor, setup } from \"rivetkit\";\nimport { generateText, tool } from \"ai\";\nimport { z } from \"zod\";\nimport { getWeather } from \"./my-utils\";\n\nexport type Message = {\n\trole: \"user\" | \"assistant\";\n\tcontent: string;\n\ttimestamp: number;\n};\n\nexport const aiAgent = actor({\n\tonAuth: () => {},\n\t// Persistent state that survives restarts: https://rivet.gg/docs/actors/state\n\tstate: {\n\t\tmessages: [] as Message[],\n\t},\n\n\tactions: {\n\t\t// Callable functions from clients: https://rivet.gg/docs/actors/actions\n\t\tgetMessages: (c) => c.state.messages,\n\n\t\tsendMessage: async (c, userMessage: string) => {\n\t\t\tconst userMsg: Message = {\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: userMessage,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t\t// State changes are automatically persisted\n\t\t\tc.state.messages.push(userMsg);\n\n\t\t\tconst { text } = await generateText({\n\t\t\t\tmodel: openai(\"gpt-4o-mini\"),\n\t\t\t\tprompt: userMessage,\n\t\t\t\tmessages: c.state.messages,\n\t\t\t\ttools: {\n\t\t\t\t\tweather: tool({\n\t\t\t\t\t\tdescription: \"Get the weather in a location\",\n\t\t\t\t\t\tparameters: z.object({\n\t\t\t\t\t\t\tlocation: z\n\t\t\t\t\t\t\t\t.string()\n\t\t\t\t\t\t\t\t.describe(\"The location to get the weather for\"),\n\t\t\t\t\t\t}),\n\t\t\t\t\t\texecute: async ({ location }) => {\n\t\t\t\t\t\t\treturn await getWeather(location);\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst assistantMsg: Message = {\n\t\t\t\trole: \"assistant\",\n\t\t\t\tcontent: text,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t\tc.state.messages.push(assistantMsg);\n\n\t\t\t// Send events to all connected clients: https://rivet.gg/docs/actors/events\n\t\t\tc.broadcast(\"messageReceived\", assistantMsg);\n\n\t\t\treturn assistantMsg;\n\t\t},\n\t},\n});\n\n// Register actors for use: https://rivet.gg/docs/setup\nexport const registry = setup({\n\tuse: { aiAgent },\n});\n", + "src/backend/registry.ts": "import { openai } from \"@ai-sdk/openai\";\nimport { actor, setup } from \"rivetkit\";\nimport { generateText, tool } from \"ai\";\nimport { z } from \"zod\";\nimport { getWeather } from \"./my-utils\";\n\nexport type Message = {\n\trole: \"user\" | \"assistant\";\n\tcontent: string;\n\ttimestamp: number;\n};\n\nexport const aiAgent = actor({\n\tonAuth: () => {},\n\t// Persistent state that survives restarts: https://rivet.dev/docs/actors/state\n\tstate: {\n\t\tmessages: [] as Message[],\n\t},\n\n\tactions: {\n\t\t// Callable functions from clients: https://rivet.dev/docs/actors/actions\n\t\tgetMessages: (c) => c.state.messages,\n\n\t\tsendMessage: async (c, userMessage: string) => {\n\t\t\tconst userMsg: Message = {\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: userMessage,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t\t// State changes are automatically persisted\n\t\t\tc.state.messages.push(userMsg);\n\n\t\t\tconst { text } = await generateText({\n\t\t\t\tmodel: openai(\"gpt-4o-mini\"),\n\t\t\t\tprompt: userMessage,\n\t\t\t\tmessages: c.state.messages,\n\t\t\t\ttools: {\n\t\t\t\t\tweather: tool({\n\t\t\t\t\t\tdescription: \"Get the weather in a location\",\n\t\t\t\t\t\tparameters: z.object({\n\t\t\t\t\t\t\tlocation: z\n\t\t\t\t\t\t\t\t.string()\n\t\t\t\t\t\t\t\t.describe(\"The location to get the weather for\"),\n\t\t\t\t\t\t}),\n\t\t\t\t\t\texecute: async ({ location }) => {\n\t\t\t\t\t\t\treturn await getWeather(location);\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst assistantMsg: Message = {\n\t\t\t\trole: \"assistant\",\n\t\t\t\tcontent: text,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t\tc.state.messages.push(assistantMsg);\n\n\t\t\t// Send events to all connected clients: https://rivet.dev/docs/actors/events\n\t\t\tc.broadcast(\"messageReceived\", assistantMsg);\n\n\t\t\treturn assistantMsg;\n\t\t},\n\t},\n});\n\n// Register actors for use: https://rivet.dev/docs/setup\nexport const registry = setup({\n\tuse: { aiAgent },\n});\n", "src/backend/my-utils.ts": "export async function getWeather(location: string) {\n\t// Mock weather API response\n\treturn {\n\t\tlocation,\n\t\ttemperature: Math.floor(Math.random() * 30) + 10,\n\t\tcondition: [\"sunny\", \"cloudy\", \"rainy\", \"snowy\"][\n\t\t\tMath.floor(Math.random() * 4)\n\t\t],\n\t\thumidity: Math.floor(Math.random() * 50) + 30,\n\t};\n}\n", "src/backend/server.ts": "import { registry } from \"./registry\";\n\nregistry.runServer({\n\tcors: {\n\t\torigin: \"*\",\n\t},\n});\n" } @@ -49,7 +49,7 @@ export const examples: ExampleData[] = [ "tab": "memory", "files": { "tests/chat-room.test.ts": "import { setupTest } from \"rivetkit/test\";\nimport { expect, test } from \"vitest\";\nimport { registry } from \"../src/backend/registry\";\n\ntest(\"Chat room can handle message sending and history\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst room = client.chatRoom.getOrCreate([\"test-room\"]);\n\n\t// Test initial state\n\tconst initialHistory = await room.getHistory();\n\texpect(initialHistory).toEqual([]);\n\n\t// Send a message\n\tconst message1 = await room.sendMessage(\"Alice\", \"Hello everyone!\");\n\n\t// Verify message structure\n\texpect(message1).toMatchObject({\n\t\tsender: \"Alice\",\n\t\ttext: \"Hello everyone!\",\n\t\ttimestamp: expect.any(Number),\n\t});\n\n\t// Send another message\n\tconst message2 = await room.sendMessage(\"Bob\", \"Hi Alice!\");\n\n\t// Verify messages are stored in order\n\tconst history = await room.getHistory();\n\texpect(history).toHaveLength(2);\n\texpect(history[0]).toEqual(message1);\n\texpect(history[1]).toEqual(message2);\n});\n\ntest(\"Chat room message timestamps are sequential\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst room = client.chatRoom.getOrCreate([\"test-timestamps\"]);\n\n\tconst message1 = await room.sendMessage(\"User1\", \"First message\");\n\tconst message2 = await room.sendMessage(\"User2\", \"Second message\");\n\tconst message3 = await room.sendMessage(\"User1\", \"Third message\");\n\n\texpect(message2.timestamp).toBeGreaterThanOrEqual(message1.timestamp);\n\texpect(message3.timestamp).toBeGreaterThanOrEqual(message2.timestamp);\n\n\tconst history = await room.getHistory();\n\tfor (let i = 1; i < history.length; i++) {\n\t\texpect(history[i].timestamp).toBeGreaterThanOrEqual(\n\t\t\thistory[i - 1].timestamp,\n\t\t);\n\t}\n});\n\ntest(\"Chat room supports multiple users\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst room = client.chatRoom.getOrCreate([\"test-multiuser\"]);\n\n\t// Multiple users sending messages\n\tawait room.sendMessage(\"Alice\", \"Hello!\");\n\tawait room.sendMessage(\"Bob\", \"Hey there!\");\n\tawait room.sendMessage(\"Charlie\", \"Good morning!\");\n\tawait room.sendMessage(\"Alice\", \"How is everyone?\");\n\n\tconst history = await room.getHistory();\n\texpect(history).toHaveLength(4);\n\n\t// Verify senders\n\texpect(history[0].sender).toBe(\"Alice\");\n\texpect(history[1].sender).toBe(\"Bob\");\n\texpect(history[2].sender).toBe(\"Charlie\");\n\texpect(history[3].sender).toBe(\"Alice\");\n\n\t// Verify message content\n\texpect(history[0].text).toBe(\"Hello!\");\n\texpect(history[1].text).toBe(\"Hey there!\");\n\texpect(history[2].text).toBe(\"Good morning!\");\n\texpect(history[3].text).toBe(\"How is everyone?\");\n});\n\ntest(\"Chat room handles empty messages\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst room = client.chatRoom.getOrCreate([\"test-empty\"]);\n\n\t// Test empty message\n\tconst emptyMessage = await room.sendMessage(\"User\", \"\");\n\texpect(emptyMessage.text).toBe(\"\");\n\texpect(emptyMessage.sender).toBe(\"User\");\n\texpect(emptyMessage.timestamp).toBeGreaterThan(0);\n\n\tconst history = await room.getHistory();\n\texpect(history).toHaveLength(1);\n\texpect(history[0]).toEqual(emptyMessage);\n});\n", - "README.md": "# Chat Room for RivetKit\n\nExample project demonstrating real-time messaging and actor state management with [RivetKit](https://rivetkit.org).\n\n[Learn More →](https://github.com/rivet-gg/rivetkit)\n\n[Discord](https://rivet.gg/discord) — [Documentation](https://rivetkit.org) — [Issues](https://github.com/rivet-gg/rivetkit/issues)\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 18+\n\n### Installation\n\n```sh\ngit clone https://github.com/rivet-gg/rivetkit\ncd rivetkit/examples/chat-room\nnpm install\n```\n\n### Development\n\n#### Web UI\nStart the development server with both backend and React frontend:\n\n```sh\nnpm run dev\n```\n\nOpen your browser to `http://localhost:3000` to use the web chat interface.\n\n#### CLI Interface\nAlternatively, use the CLI interface:\n\n```sh\nnpm run dev:cli\n```\n\nOr connect programmatically:\n\n```sh\ntsx src/scripts/connect.ts\n```\n\n## Features\n\n- Real-time messaging with automatic persistence\n- Multiple chat rooms support\n- Both web and CLI interfaces\n- Event-driven architecture with RivetKit actors\n- TypeScript support throughout\n\n## License\n\nApache 2.0", + "README.md": "# Chat Room for RivetKit\n\nExample project demonstrating real-time messaging and actor state management with [RivetKit](https://rivetkit.org).\n\n[Learn More →](https://github.com/rivet-dev/rivetkit)\n\n[Discord](https://rivet.dev/discord) — [Documentation](https://rivetkit.org) — [Issues](https://github.com/rivet-dev/rivetkit/issues)\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 18+\n\n### Installation\n\n```sh\ngit clone https://github.com/rivet-dev/rivetkit\ncd rivetkit/examples/chat-room\nnpm install\n```\n\n### Development\n\n#### Web UI\nStart the development server with both backend and React frontend:\n\n```sh\nnpm run dev\n```\n\nOpen your browser to `http://localhost:3000` to use the web chat interface.\n\n#### CLI Interface\nAlternatively, use the CLI interface:\n\n```sh\nnpm run dev:cli\n```\n\nOr connect programmatically:\n\n```sh\ntsx src/scripts/connect.ts\n```\n\n## Features\n\n- Real-time messaging with automatic persistence\n- Multiple chat rooms support\n- Both web and CLI interfaces\n- Event-driven architecture with RivetKit actors\n- TypeScript support throughout\n\n## License\n\nApache 2.0", ".gitignore": ".actorcore\nnode_modules", "package-lock.json": "{\n \"name\": \"chat-room\",\n \"version\": \"0.9.1\",\n \"lockfileVersion\": 3,\n \"requires\": true,\n \"packages\": {\n \"\": {\n \"name\": \"chat-room\",\n \"version\": \"0.9.1\",\n \"dependencies\": {\n \"@rivetkit/react\": \"^0.9.1\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\"\n },\n \"devDependencies\": {\n \"rivetkit\": \"^0.9.1\",\n \"@types/node\": \"^22.13.9\",\n \"@types/prompts\": \"^2\",\n \"@types/react\": \"^18.2.0\",\n \"@types/react-dom\": \"^18.2.0\",\n \"@vitejs/plugin-react\": \"^4.2.0\",\n \"concurrently\": \"^8.2.2\",\n \"prompts\": \"^2.4.2\",\n \"tsx\": \"^3.12.7\",\n \"typescript\": \"^5.5.2\",\n \"vite\": \"^5.0.0\",\n \"vitest\": \"^3.1.1\"\n }\n },\n \"node_modules/@ampproject/remapping\": {\n \"version\": \"2.3.0\",\n \"resolved\": \"https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz\",\n \"integrity\": \"sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@jridgewell/gen-mapping\": \"^0.3.5\",\n \"@jridgewell/trace-mapping\": \"^0.3.24\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@babel/code-frame\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz\",\n \"integrity\": \"sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-validator-identifier\": \"^7.27.1\",\n \"js-tokens\": \"^4.0.0\",\n \"picocolors\": \"^1.1.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/compat-data\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz\",\n \"integrity\": \"sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/core\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz\",\n \"integrity\": \"sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@ampproject/remapping\": \"^2.2.0\",\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/generator\": \"^7.28.0\",\n \"@babel/helper-compilation-targets\": \"^7.27.2\",\n \"@babel/helper-module-transforms\": \"^7.27.3\",\n \"@babel/helpers\": \"^7.27.6\",\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/template\": \"^7.27.2\",\n \"@babel/traverse\": \"^7.28.0\",\n \"@babel/types\": \"^7.28.0\",\n \"convert-source-map\": \"^2.0.0\",\n \"debug\": \"^4.1.0\",\n \"gensync\": \"^1.0.0-beta.2\",\n \"json5\": \"^2.2.3\",\n \"semver\": \"^6.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"funding\": {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/babel\"\n }\n },\n \"node_modules/@babel/generator\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz\",\n \"integrity\": \"sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/types\": \"^7.28.0\",\n \"@jridgewell/gen-mapping\": \"^0.3.12\",\n \"@jridgewell/trace-mapping\": \"^0.3.28\",\n \"jsesc\": \"^3.0.2\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-compilation-targets\": {\n \"version\": \"7.27.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz\",\n \"integrity\": \"sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/compat-data\": \"^7.27.2\",\n \"@babel/helper-validator-option\": \"^7.27.1\",\n \"browserslist\": \"^4.24.0\",\n \"lru-cache\": \"^5.1.1\",\n \"semver\": \"^6.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-globals\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz\",\n \"integrity\": \"sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-module-imports\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz\",\n \"integrity\": \"sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/traverse\": \"^7.27.1\",\n \"@babel/types\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-module-transforms\": {\n \"version\": \"7.27.3\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz\",\n \"integrity\": \"sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-module-imports\": \"^7.27.1\",\n \"@babel/helper-validator-identifier\": \"^7.27.1\",\n \"@babel/traverse\": \"^7.27.3\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0\"\n }\n },\n \"node_modules/@babel/helper-plugin-utils\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz\",\n \"integrity\": \"sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-string-parser\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz\",\n \"integrity\": \"sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-validator-identifier\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz\",\n \"integrity\": \"sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-validator-option\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz\",\n \"integrity\": \"sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helpers\": {\n \"version\": \"7.27.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz\",\n \"integrity\": \"sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/template\": \"^7.27.2\",\n \"@babel/types\": \"^7.27.6\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/parser\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz\",\n \"integrity\": \"sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.28.0\"\n },\n \"bin\": {\n \"parser\": \"bin/babel-parser.js\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@babel/plugin-transform-react-jsx-self\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz\",\n \"integrity\": \"sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-plugin-utils\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/plugin-transform-react-jsx-source\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz\",\n \"integrity\": \"sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-plugin-utils\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/runtime\": {\n \"version\": \"7.27.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz\",\n \"integrity\": \"sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/template\": {\n \"version\": \"7.27.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz\",\n \"integrity\": \"sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/parser\": \"^7.27.2\",\n \"@babel/types\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/traverse\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz\",\n \"integrity\": \"sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/generator\": \"^7.28.0\",\n \"@babel/helper-globals\": \"^7.28.0\",\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/template\": \"^7.27.2\",\n \"@babel/types\": \"^7.28.0\",\n \"debug\": \"^4.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/types\": {\n \"version\": \"7.28.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/types/-/types-7.28.1.tgz\",\n \"integrity\": \"sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-string-parser\": \"^7.27.1\",\n \"@babel/helper-validator-identifier\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@cbor-extract/cbor-extract-darwin-arm64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.0.tgz\",\n \"integrity\": \"sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-darwin-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-arm\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.2.0.tgz\",\n \"integrity\": \"sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==\",\n \"cpu\": [\n \"arm\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-arm64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.2.0.tgz\",\n \"integrity\": \"sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-win32-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"peer\": true\n },\n \"node_modules/@esbuild/aix-ppc64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz\",\n \"integrity\": \"sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"aix\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/android-arm\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz\",\n \"integrity\": \"sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/android-arm64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz\",\n \"integrity\": \"sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/android-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/darwin-arm64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz\",\n \"integrity\": \"sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/darwin-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/freebsd-arm64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz\",\n \"integrity\": \"sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/freebsd-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-arm\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz\",\n \"integrity\": \"sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-arm64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz\",\n \"integrity\": \"sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-ia32\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz\",\n \"integrity\": \"sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-loong64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz\",\n \"integrity\": \"sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-mips64el\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz\",\n \"integrity\": \"sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==\",\n \"cpu\": [\n \"mips64el\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-ppc64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz\",\n \"integrity\": \"sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-riscv64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz\",\n \"integrity\": \"sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-s390x\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz\",\n \"integrity\": \"sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/netbsd-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"netbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/openbsd-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"openbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/sunos-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"sunos\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/win32-arm64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz\",\n \"integrity\": \"sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/win32-ia32\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz\",\n \"integrity\": \"sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/win32-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@jridgewell/gen-mapping\": {\n \"version\": \"0.3.12\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz\",\n \"integrity\": \"sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/sourcemap-codec\": \"^1.5.0\",\n \"@jridgewell/trace-mapping\": \"^0.3.24\"\n }\n },\n \"node_modules/@jridgewell/resolve-uri\": {\n \"version\": \"3.1.2\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz\",\n \"integrity\": \"sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@jridgewell/sourcemap-codec\": {\n \"version\": \"1.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz\",\n \"integrity\": \"sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@jridgewell/trace-mapping\": {\n \"version\": \"0.3.29\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz\",\n \"integrity\": \"sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/resolve-uri\": \"^3.1.0\",\n \"@jridgewell/sourcemap-codec\": \"^1.4.14\"\n }\n },\n \"node_modules/rivetkit\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/rivetkit/-/actor-0.9.1.tgz\",\n \"integrity\": \"sha512-aVoWO81JrYql6hhXX+vRor0B+aeWrnh+9zkcrxbh0EXFBbS5XM8YE4sSFxNKmZThLbGNqfZ5enm1zuA92c7I1w==\",\n \"dev\": true,\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\"\n }\n },\n \"node_modules/@rivetkit/core\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/core/-/core-0.9.1.tgz\",\n \"integrity\": \"sha512-0zYFKo08CQ72Rm6MaVKxcJSEEfn/ypGkkxTX06Q4meCGHuDJFbPA5wopa3NdxrKBPttcGg1QAmDd+1FZnlpubA==\",\n \"license\": \"Apache-2.0\",\n \"peer\": true,\n \"dependencies\": {\n \"cbor-x\": \"^1.6.0\",\n \"invariant\": \"^2.2.4\",\n \"on-change\": \"^5.0.1\",\n \"p-retry\": \"^6.2.1\",\n \"zod\": \"^3.25.67\"\n },\n \"engines\": {\n \"node\": \">=22.0.0\"\n },\n \"peerDependencies\": {\n \"@hono/node-server\": \"^1.14.0\",\n \"@hono/node-ws\": \"^1.1.1\",\n \"@hono/zod-openapi\": \"^0.19.6\",\n \"eventsource\": \"^3.0.5\",\n \"hono\": \"^4.7.0\",\n \"ws\": \"^8.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@hono/node-server\": {\n \"optional\": true\n },\n \"@hono/node-ws\": {\n \"optional\": true\n },\n \"@hono/zod-openapi\": {\n \"optional\": true\n },\n \"eventsource\": {\n \"optional\": true\n },\n \"hono\": {\n \"optional\": true\n },\n \"ws\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/@rivetkit/framework-base\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/framework-base/-/framework-base-0.9.1.tgz\",\n \"integrity\": \"sha512-FxhSqGAtDsD4k7gKS2EhJ5hHsEwI1+QR0vYThUBOLcmXM7zjMZndqIjVperQO4ck/zfjRqjm3lw7znkc+k0wNQ==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@tanstack/store\": \"^0.7.1\"\n },\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\"\n }\n },\n \"node_modules/@rivetkit/react\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/react/-/react-0.9.1.tgz\",\n \"integrity\": \"sha512-0e0gNNj3qCrXHNIxE6ggEEX+E6HjdsSt9pJbWbaQQg+1bsywupRTSdgSDguDHjBvi9qhR9mh7UbNN3A9wYqXuA==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@rivetkit/framework-base\": \"0.9.1\",\n \"@tanstack/react-store\": \"^0.7.1\"\n },\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\",\n \"react\": \"^18 || ^19\",\n \"react-dom\": \"^18 || ^19\"\n }\n },\n \"node_modules/@rolldown/pluginutils\": {\n \"version\": \"1.0.0-beta.19\",\n \"resolved\": \"https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz\",\n \"integrity\": \"sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@rollup/rollup-android-arm-eabi\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.0.tgz\",\n \"integrity\": \"sha512-2o/FgACbji4tW1dzXOqAV15Eu7DdgbKsF2QKcxfG4xbh5iwU7yr5RRP5/U+0asQliSYv5M4o7BevlGIoSL0LXg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ]\n },\n \"node_modules/@rollup/rollup-android-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-PSZ0SvMOjEAxwZeTx32eI/j5xSYtDCRxGu5k9zvzoY77xUNssZM+WV6HYBLROpY5CkXsbQjvz40fBb7WPwDqtQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ]\n },\n \"node_modules/@rollup/rollup-darwin-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-BA4yPIPssPB2aRAWzmqzQ3y2/KotkLyZukVB7j3psK/U3nVJdceo6qr9pLM2xN6iRP/wKfxEbOb1yrlZH6sYZg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ]\n },\n \"node_modules/@rollup/rollup-darwin-x64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.0.tgz\",\n \"integrity\": \"sha512-Pr2o0lvTwsiG4HCr43Zy9xXrHspyMvsvEw4FwKYqhli4FuLE5FjcZzuQ4cfPe0iUFCvSQG6lACI0xj74FDZKRA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ]\n },\n \"node_modules/@rollup/rollup-freebsd-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-lYE8LkE5h4a/+6VnnLiL14zWMPnx6wNbDG23GcYFpRW1V9hYWHAw9lBZ6ZUIrOaoK7NliF1sdwYGiVmziUF4vA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ]\n },\n \"node_modules/@rollup/rollup-freebsd-x64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.0.tgz\",\n \"integrity\": \"sha512-PVQWZK9sbzpvqC9Q0GlehNNSVHR+4m7+wET+7FgSnKG3ci5nAMgGmr9mGBXzAuE5SvguCKJ6mHL6vq1JaJ/gvw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm-gnueabihf\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.0.tgz\",\n \"integrity\": \"sha512-hLrmRl53prCcD+YXTfNvXd776HTxNh8wPAMllusQ+amcQmtgo3V5i/nkhPN6FakW+QVLoUUr2AsbtIRPFU3xIA==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm-musleabihf\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.0.tgz\",\n \"integrity\": \"sha512-XBKGSYcrkdiRRjl+8XvrUR3AosXU0NvF7VuqMsm7s5nRy+nt58ZMB19Jdp1RdqewLcaYnpk8zeVs/4MlLZEJxw==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-fRvZZPUiBz7NztBE/2QnCS5AtqLVhXmUOPj9IHlfGEXkapgImf4W9+FSkL8cWqoAjozyUzqFmSc4zh2ooaeF6g==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-Btv2WRZOcUGi8XU80XwIvzTg4U6+l6D0V6sZTrZx214nrwxw5nAi8hysaXj/mctyClWgesyuxbeLylCBNauimg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-loongarch64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-Li0emNnwtUZdLwHjQPBxn4VWztcrw/h7mgLyHiEI5Z0MhpeFGlzaiBHpSNVOMB/xucjXTTcO+dhv469Djr16KA==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-powerpc64le-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-sB8+pfkYx2kvpDCfd63d5ScYT0Fz1LO6jIb2zLZvmK9ob2D8DeVqrmBDE0iDK8KlBVmsTNzrjr3G1xV4eUZhSw==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-riscv64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-5GQ6PFhh7E6jQm70p1aW05G2cap5zMOvO0se5JMecHeAdj5ZhWEHbJ4hiKpfi1nnnEdTauDXxPgXae/mqjow9w==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-riscv64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-N/euLsBd1rekWcuduakTo/dJw6U6sBP3eUq+RXM9RNfPuWTvG2w/WObDkIvJ2KChy6oxZmOSC08Ak2OJA0UiAA==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-s390x-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-2l9sA7d7QdikL0xQwNMO3xURBUNEWyHVHfAsHsUdq+E/pgLTUcCE+gih5PCdmyHmfTDeXUWVhqL0WZzg0nua3g==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-x64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-XZdD3fEEQcwG2KrJDdEQu7NrHonPxxaV0/w2HpvINBdcqebz1aL+0vM2WFJq4DeiAVT6F5SUQas65HY5JDqoPw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-x64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-7ayfgvtmmWgKWBkCGg5+xTQ0r5V1owVm67zTrsEY1008L5ro7mCyGYORomARt/OquB9KY7LpxVBZes+oSniAAQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-arm64-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-B+IJgcBnE2bm93jEW5kHisqvPITs4ddLOROAcOc/diBgrEiQJJ6Qcjby75rFSmH5eMGrqJryUgJDhrfj942apQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-ia32-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-+CXwwG66g0/FpWOnP/v1HnrGVSOygK/osUbu3wPRy8ECXjoYKjRAyfxYpDQOfghC5qPJYLPH0oN4MCOjwgdMug==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-x64-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-SRf1cytG7wqcHVLrBc9VtPK4pU5wxiB/lNIkNmW2ApKXIg+RpqwHfsaEK+e7eH4A1BpI6BX/aBWXxZCIrJg3uA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@tanstack/react-store\": {\n \"version\": \"0.7.3\",\n \"resolved\": \"https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.7.3.tgz\",\n \"integrity\": \"sha512-3Dnqtbw9P2P0gw8uUM8WP2fFfg8XMDSZCTsywRPZe/XqqYW8PGkXKZTvP0AHkE4mpqP9Y43GpOg9vwO44azu6Q==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@tanstack/store\": \"0.7.2\",\n \"use-sync-external-store\": \"^1.5.0\"\n },\n \"funding\": {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/tannerlinsley\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\",\n \"react-dom\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\"\n }\n },\n \"node_modules/@tanstack/store\": {\n \"version\": \"0.7.2\",\n \"resolved\": \"https://registry.npmjs.org/@tanstack/store/-/store-0.7.2.tgz\",\n \"integrity\": \"sha512-RP80Z30BYiPX2Pyo0Nyw4s1SJFH2jyM6f9i3HfX4pA+gm5jsnYryscdq2aIQLnL4TaGuQMO+zXmN9nh1Qck+Pg==\",\n \"license\": \"MIT\",\n \"funding\": {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/tannerlinsley\"\n }\n },\n \"node_modules/@types/babel__core\": {\n \"version\": \"7.20.5\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz\",\n \"integrity\": \"sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.20.7\",\n \"@babel/types\": \"^7.20.7\",\n \"@types/babel__generator\": \"*\",\n \"@types/babel__template\": \"*\",\n \"@types/babel__traverse\": \"*\"\n }\n },\n \"node_modules/@types/babel__generator\": {\n \"version\": \"7.27.0\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz\",\n \"integrity\": \"sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.0.0\"\n }\n },\n \"node_modules/@types/babel__template\": {\n \"version\": \"7.4.4\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz\",\n \"integrity\": \"sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.1.0\",\n \"@babel/types\": \"^7.0.0\"\n }\n },\n \"node_modules/@types/babel__traverse\": {\n \"version\": \"7.20.7\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz\",\n \"integrity\": \"sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.20.7\"\n }\n },\n \"node_modules/@types/chai\": {\n \"version\": \"5.2.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz\",\n \"integrity\": \"sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/deep-eql\": \"*\"\n }\n },\n \"node_modules/@types/deep-eql\": {\n \"version\": \"4.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz\",\n \"integrity\": \"sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@types/estree\": {\n \"version\": \"1.0.8\",\n \"resolved\": \"https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz\",\n \"integrity\": \"sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@types/node\": {\n \"version\": \"22.16.3\",\n \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-22.16.3.tgz\",\n \"integrity\": \"sha512-sr4Xz74KOUeYadexo1r8imhRtlVXcs+j3XK3TcoiYk7B1t3YRVJgtaD3cwX73NYb71pmVuMLNRhJ9XKdoDB74g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"undici-types\": \"~6.21.0\"\n }\n },\n \"node_modules/@types/prompts\": {\n \"version\": \"2.4.9\",\n \"resolved\": \"https://registry.npmjs.org/@types/prompts/-/prompts-2.4.9.tgz\",\n \"integrity\": \"sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/node\": \"*\",\n \"kleur\": \"^3.0.3\"\n }\n },\n \"node_modules/@types/prop-types\": {\n \"version\": \"15.7.15\",\n \"resolved\": \"https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz\",\n \"integrity\": \"sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@types/react\": {\n \"version\": \"18.3.23\",\n \"resolved\": \"https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz\",\n \"integrity\": \"sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/prop-types\": \"*\",\n \"csstype\": \"^3.0.2\"\n }\n },\n \"node_modules/@types/react-dom\": {\n \"version\": \"18.3.7\",\n \"resolved\": \"https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz\",\n \"integrity\": \"sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"peerDependencies\": {\n \"@types/react\": \"^18.0.0\"\n }\n },\n \"node_modules/@types/retry\": {\n \"version\": \"0.12.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz\",\n \"integrity\": \"sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==\",\n \"license\": \"MIT\",\n \"peer\": true\n },\n \"node_modules/@vitejs/plugin-react\": {\n \"version\": \"4.6.0\",\n \"resolved\": \"https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.6.0.tgz\",\n \"integrity\": \"sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/core\": \"^7.27.4\",\n \"@babel/plugin-transform-react-jsx-self\": \"^7.27.1\",\n \"@babel/plugin-transform-react-jsx-source\": \"^7.27.1\",\n \"@rolldown/pluginutils\": \"1.0.0-beta.19\",\n \"@types/babel__core\": \"^7.20.5\",\n \"react-refresh\": \"^0.17.0\"\n },\n \"engines\": {\n \"node\": \"^14.18.0 || >=16.0.0\"\n },\n \"peerDependencies\": {\n \"vite\": \"^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0\"\n }\n },\n \"node_modules/@vitest/expect\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz\",\n \"integrity\": \"sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/chai\": \"^5.2.2\",\n \"@vitest/spy\": \"3.2.4\",\n \"@vitest/utils\": \"3.2.4\",\n \"chai\": \"^5.2.0\",\n \"tinyrainbow\": \"^2.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/mocker\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz\",\n \"integrity\": \"sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/spy\": \"3.2.4\",\n \"estree-walker\": \"^3.0.3\",\n \"magic-string\": \"^0.30.17\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n },\n \"peerDependencies\": {\n \"msw\": \"^2.4.9\",\n \"vite\": \"^5.0.0 || ^6.0.0 || ^7.0.0-0\"\n },\n \"peerDependenciesMeta\": {\n \"msw\": {\n \"optional\": true\n },\n \"vite\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/@vitest/pretty-format\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz\",\n \"integrity\": \"sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"tinyrainbow\": \"^2.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/runner\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz\",\n \"integrity\": \"sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/utils\": \"3.2.4\",\n \"pathe\": \"^2.0.3\",\n \"strip-literal\": \"^3.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/snapshot\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz\",\n \"integrity\": \"sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/pretty-format\": \"3.2.4\",\n \"magic-string\": \"^0.30.17\",\n \"pathe\": \"^2.0.3\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/spy\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz\",\n \"integrity\": \"sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"tinyspy\": \"^4.0.3\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/utils\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz\",\n \"integrity\": \"sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/pretty-format\": \"3.2.4\",\n \"loupe\": \"^3.1.4\",\n \"tinyrainbow\": \"^2.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/ansi-regex\": {\n \"version\": \"5.0.1\",\n \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/ansi-styles\": {\n \"version\": \"4.3.0\",\n \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\n \"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"color-convert\": \"^2.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n }\n },\n \"node_modules/assertion-error\": {\n \"version\": \"2.0.1\",\n \"resolved\": \"https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz\",\n \"integrity\": \"sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/browserslist\": {\n \"version\": \"4.25.1\",\n \"resolved\": \"https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz\",\n \"integrity\": \"sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"caniuse-lite\": \"^1.0.30001726\",\n \"electron-to-chromium\": \"^1.5.173\",\n \"node-releases\": \"^2.0.19\",\n \"update-browserslist-db\": \"^1.1.3\"\n },\n \"bin\": {\n \"browserslist\": \"cli.js\"\n },\n \"engines\": {\n \"node\": \"^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7\"\n }\n },\n \"node_modules/buffer-from\": {\n \"version\": \"1.1.2\",\n \"resolved\": \"https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz\",\n \"integrity\": \"sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/cac\": {\n \"version\": \"6.7.14\",\n \"resolved\": \"https://registry.npmjs.org/cac/-/cac-6.7.14.tgz\",\n \"integrity\": \"sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/caniuse-lite\": {\n \"version\": \"1.0.30001727\",\n \"resolved\": \"https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz\",\n \"integrity\": \"sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/caniuse-lite\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"CC-BY-4.0\"\n },\n \"node_modules/cbor-extract\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/cbor-extract/-/cbor-extract-2.2.0.tgz\",\n \"integrity\": \"sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==\",\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"peer\": true,\n \"dependencies\": {\n \"node-gyp-build-optional-packages\": \"5.1.1\"\n },\n \"bin\": {\n \"download-cbor-prebuilds\": \"bin/download-prebuilds.js\"\n },\n \"optionalDependencies\": {\n \"@cbor-extract/cbor-extract-darwin-arm64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-darwin-x64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-arm\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-arm64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-x64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-win32-x64\": \"2.2.0\"\n }\n },\n \"node_modules/cbor-x\": {\n \"version\": \"1.6.0\",\n \"resolved\": \"https://registry.npmjs.org/cbor-x/-/cbor-x-1.6.0.tgz\",\n \"integrity\": \"sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"optionalDependencies\": {\n \"cbor-extract\": \"^2.2.0\"\n }\n },\n \"node_modules/chai\": {\n \"version\": \"5.2.1\",\n \"resolved\": \"https://registry.npmjs.org/chai/-/chai-5.2.1.tgz\",\n \"integrity\": \"sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"assertion-error\": \"^2.0.1\",\n \"check-error\": \"^2.1.1\",\n \"deep-eql\": \"^5.0.1\",\n \"loupe\": \"^3.1.0\",\n \"pathval\": \"^2.0.0\"\n },\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/chalk\": {\n \"version\": \"4.1.2\",\n \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz\",\n \"integrity\": \"sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-styles\": \"^4.1.0\",\n \"supports-color\": \"^7.1.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/chalk?sponsor=1\"\n }\n },\n \"node_modules/chalk/node_modules/supports-color\": {\n \"version\": \"7.2.0\",\n \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz\",\n \"integrity\": \"sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"has-flag\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/check-error\": {\n \"version\": \"2.1.1\",\n \"resolved\": \"https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz\",\n \"integrity\": \"sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">= 16\"\n }\n },\n \"node_modules/cliui\": {\n \"version\": \"8.0.1\",\n \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz\",\n \"integrity\": \"sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"dependencies\": {\n \"string-width\": \"^4.2.0\",\n \"strip-ansi\": \"^6.0.1\",\n \"wrap-ansi\": \"^7.0.0\"\n },\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/color-convert\": {\n \"version\": \"2.0.1\",\n \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\n \"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"color-name\": \"~1.1.4\"\n },\n \"engines\": {\n \"node\": \">=7.0.0\"\n }\n },\n \"node_modules/color-name\": {\n \"version\": \"1.1.4\",\n \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\n \"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/concurrently\": {\n \"version\": \"8.2.2\",\n \"resolved\": \"https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz\",\n \"integrity\": \"sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"chalk\": \"^4.1.2\",\n \"date-fns\": \"^2.30.0\",\n \"lodash\": \"^4.17.21\",\n \"rxjs\": \"^7.8.1\",\n \"shell-quote\": \"^1.8.1\",\n \"spawn-command\": \"0.0.2\",\n \"supports-color\": \"^8.1.1\",\n \"tree-kill\": \"^1.2.2\",\n \"yargs\": \"^17.7.2\"\n },\n \"bin\": {\n \"conc\": \"dist/bin/concurrently.js\",\n \"concurrently\": \"dist/bin/concurrently.js\"\n },\n \"engines\": {\n \"node\": \"^14.13.0 || >=16.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/open-cli-tools/concurrently?sponsor=1\"\n }\n },\n \"node_modules/convert-source-map\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz\",\n \"integrity\": \"sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/csstype\": {\n \"version\": \"3.1.3\",\n \"resolved\": \"https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz\",\n \"integrity\": \"sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/date-fns\": {\n \"version\": \"2.30.0\",\n \"resolved\": \"https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz\",\n \"integrity\": \"sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.21.0\"\n },\n \"engines\": {\n \"node\": \">=0.11\"\n },\n \"funding\": {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/date-fns\"\n }\n },\n \"node_modules/debug\": {\n \"version\": \"4.4.1\",\n \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.4.1.tgz\",\n \"integrity\": \"sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ms\": \"^2.1.3\"\n },\n \"engines\": {\n \"node\": \">=6.0\"\n },\n \"peerDependenciesMeta\": {\n \"supports-color\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/deep-eql\": {\n \"version\": \"5.0.2\",\n \"resolved\": \"https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz\",\n \"integrity\": \"sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/detect-libc\": {\n \"version\": \"2.0.4\",\n \"resolved\": \"https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz\",\n \"integrity\": \"sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==\",\n \"license\": \"Apache-2.0\",\n \"optional\": true,\n \"peer\": true,\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/electron-to-chromium\": {\n \"version\": \"1.5.183\",\n \"resolved\": \"https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.183.tgz\",\n \"integrity\": \"sha512-vCrDBYjQCAEefWGjlK3EpoSKfKbT10pR4XXPdn65q7snuNOZnthoVpBfZPykmDapOKfoD+MMIPG8ZjKyyc9oHA==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/emoji-regex\": {\n \"version\": \"8.0.0\",\n \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/es-module-lexer\": {\n \"version\": \"1.7.0\",\n \"resolved\": \"https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz\",\n \"integrity\": \"sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/esbuild\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz\",\n \"integrity\": \"sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"esbuild\": \"bin/esbuild\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"optionalDependencies\": {\n \"@esbuild/android-arm\": \"0.18.20\",\n \"@esbuild/android-arm64\": \"0.18.20\",\n \"@esbuild/android-x64\": \"0.18.20\",\n \"@esbuild/darwin-arm64\": \"0.18.20\",\n \"@esbuild/darwin-x64\": \"0.18.20\",\n \"@esbuild/freebsd-arm64\": \"0.18.20\",\n \"@esbuild/freebsd-x64\": \"0.18.20\",\n \"@esbuild/linux-arm\": \"0.18.20\",\n \"@esbuild/linux-arm64\": \"0.18.20\",\n \"@esbuild/linux-ia32\": \"0.18.20\",\n \"@esbuild/linux-loong64\": \"0.18.20\",\n \"@esbuild/linux-mips64el\": \"0.18.20\",\n \"@esbuild/linux-ppc64\": \"0.18.20\",\n \"@esbuild/linux-riscv64\": \"0.18.20\",\n \"@esbuild/linux-s390x\": \"0.18.20\",\n \"@esbuild/linux-x64\": \"0.18.20\",\n \"@esbuild/netbsd-x64\": \"0.18.20\",\n \"@esbuild/openbsd-x64\": \"0.18.20\",\n \"@esbuild/sunos-x64\": \"0.18.20\",\n \"@esbuild/win32-arm64\": \"0.18.20\",\n \"@esbuild/win32-ia32\": \"0.18.20\",\n \"@esbuild/win32-x64\": \"0.18.20\"\n }\n },\n \"node_modules/escalade\": {\n \"version\": \"3.2.0\",\n \"resolved\": \"https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz\",\n \"integrity\": \"sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/estree-walker\": {\n \"version\": \"3.0.3\",\n \"resolved\": \"https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz\",\n \"integrity\": \"sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/estree\": \"^1.0.0\"\n }\n },\n \"node_modules/expect-type\": {\n \"version\": \"1.2.2\",\n \"resolved\": \"https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz\",\n \"integrity\": \"sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"engines\": {\n \"node\": \">=12.0.0\"\n }\n },\n \"node_modules/fdir\": {\n \"version\": \"6.4.6\",\n \"resolved\": \"https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz\",\n \"integrity\": \"sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"peerDependencies\": {\n \"picomatch\": \"^3 || ^4\"\n },\n \"peerDependenciesMeta\": {\n \"picomatch\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/fsevents\": {\n \"version\": \"2.3.3\",\n \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz\",\n \"integrity\": \"sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n }\n },\n \"node_modules/gensync\": {\n \"version\": \"1.0.0-beta.2\",\n \"resolved\": \"https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz\",\n \"integrity\": \"sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/get-caller-file\": {\n \"version\": \"2.0.5\",\n \"resolved\": \"https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz\",\n \"integrity\": \"sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \"6.* || 8.* || >= 10.*\"\n }\n },\n \"node_modules/get-tsconfig\": {\n \"version\": \"4.10.1\",\n \"resolved\": \"https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz\",\n \"integrity\": \"sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"resolve-pkg-maps\": \"^1.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/privatenumber/get-tsconfig?sponsor=1\"\n }\n },\n \"node_modules/has-flag\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz\",\n \"integrity\": \"sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/invariant\": {\n \"version\": \"2.2.4\",\n \"resolved\": \"https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz\",\n \"integrity\": \"sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"dependencies\": {\n \"loose-envify\": \"^1.0.0\"\n }\n },\n \"node_modules/is-fullwidth-code-point\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz\",\n \"integrity\": \"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/is-network-error\": {\n \"version\": \"1.1.0\",\n \"resolved\": \"https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz\",\n \"integrity\": \"sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">=16\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/js-tokens\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz\",\n \"integrity\": \"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==\",\n \"license\": \"MIT\"\n },\n \"node_modules/jsesc\": {\n \"version\": \"3.1.0\",\n \"resolved\": \"https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz\",\n \"integrity\": \"sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"jsesc\": \"bin/jsesc\"\n },\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/json5\": {\n \"version\": \"2.2.3\",\n \"resolved\": \"https://registry.npmjs.org/json5/-/json5-2.2.3.tgz\",\n \"integrity\": \"sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"json5\": \"lib/cli.js\"\n },\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/kleur\": {\n \"version\": \"3.0.3\",\n \"resolved\": \"https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz\",\n \"integrity\": \"sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/lodash\": {\n \"version\": \"4.17.21\",\n \"resolved\": \"https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz\",\n \"integrity\": \"sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/loose-envify\": {\n \"version\": \"1.4.0\",\n \"resolved\": \"https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz\",\n \"integrity\": \"sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"js-tokens\": \"^3.0.0 || ^4.0.0\"\n },\n \"bin\": {\n \"loose-envify\": \"cli.js\"\n }\n },\n \"node_modules/loupe\": {\n \"version\": \"3.1.4\",\n \"resolved\": \"https://registry.npmjs.org/loupe/-/loupe-3.1.4.tgz\",\n \"integrity\": \"sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/lru-cache\": {\n \"version\": \"5.1.1\",\n \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz\",\n \"integrity\": \"sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"dependencies\": {\n \"yallist\": \"^3.0.2\"\n }\n },\n \"node_modules/magic-string\": {\n \"version\": \"0.30.17\",\n \"resolved\": \"https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz\",\n \"integrity\": \"sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/sourcemap-codec\": \"^1.5.0\"\n }\n },\n \"node_modules/ms\": {\n \"version\": \"2.1.3\",\n \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz\",\n \"integrity\": \"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/nanoid\": {\n \"version\": \"3.3.11\",\n \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz\",\n \"integrity\": \"sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"bin\": {\n \"nanoid\": \"bin/nanoid.cjs\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || ^13.7 || ^14 || >=15.0.1\"\n }\n },\n \"node_modules/node-gyp-build-optional-packages\": {\n \"version\": \"5.1.1\",\n \"resolved\": \"https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz\",\n \"integrity\": \"sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==\",\n \"license\": \"MIT\",\n \"optional\": true,\n \"peer\": true,\n \"dependencies\": {\n \"detect-libc\": \"^2.0.1\"\n },\n \"bin\": {\n \"node-gyp-build-optional-packages\": \"bin.js\",\n \"node-gyp-build-optional-packages-optional\": \"optional.js\",\n \"node-gyp-build-optional-packages-test\": \"build-test.js\"\n }\n },\n \"node_modules/node-releases\": {\n \"version\": \"2.0.19\",\n \"resolved\": \"https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz\",\n \"integrity\": \"sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/on-change\": {\n \"version\": \"5.0.1\",\n \"resolved\": \"https://registry.npmjs.org/on-change/-/on-change-5.0.1.tgz\",\n \"integrity\": \"sha512-n7THCP7RkyReRSLkJb8kUWoNsxUIBxTkIp3JKno+sEz6o/9AJ3w3P9fzQkITEkMwyTKJjZciF3v/pVoouxZZMg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">=18\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sindresorhus/on-change?sponsor=1\"\n }\n },\n \"node_modules/p-retry\": {\n \"version\": \"6.2.1\",\n \"resolved\": \"https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz\",\n \"integrity\": \"sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"dependencies\": {\n \"@types/retry\": \"0.12.2\",\n \"is-network-error\": \"^1.0.0\",\n \"retry\": \"^0.13.1\"\n },\n \"engines\": {\n \"node\": \">=16.17\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/pathe\": {\n \"version\": \"2.0.3\",\n \"resolved\": \"https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz\",\n \"integrity\": \"sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/pathval\": {\n \"version\": \"2.0.1\",\n \"resolved\": \"https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz\",\n \"integrity\": \"sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">= 14.16\"\n }\n },\n \"node_modules/picocolors\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz\",\n \"integrity\": \"sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/picomatch\": {\n \"version\": \"4.0.2\",\n \"resolved\": \"https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz\",\n \"integrity\": \"sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=12\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/jonschlinkert\"\n }\n },\n \"node_modules/postcss\": {\n \"version\": \"8.5.6\",\n \"resolved\": \"https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz\",\n \"integrity\": \"sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/postcss/\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/postcss\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"nanoid\": \"^3.3.11\",\n \"picocolors\": \"^1.1.1\",\n \"source-map-js\": \"^1.2.1\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || >=14\"\n }\n },\n \"node_modules/prompts\": {\n \"version\": \"2.4.2\",\n \"resolved\": \"https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz\",\n \"integrity\": \"sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"kleur\": \"^3.0.3\",\n \"sisteransi\": \"^1.0.5\"\n },\n \"engines\": {\n \"node\": \">= 6\"\n }\n },\n \"node_modules/react\": {\n \"version\": \"18.3.1\",\n \"resolved\": \"https://registry.npmjs.org/react/-/react-18.3.1.tgz\",\n \"integrity\": \"sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\"\n },\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/react-dom\": {\n \"version\": \"18.3.1\",\n \"resolved\": \"https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz\",\n \"integrity\": \"sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\",\n \"scheduler\": \"^0.23.2\"\n },\n \"peerDependencies\": {\n \"react\": \"^18.3.1\"\n }\n },\n \"node_modules/react-refresh\": {\n \"version\": \"0.17.0\",\n \"resolved\": \"https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz\",\n \"integrity\": \"sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/require-directory\": {\n \"version\": \"2.1.1\",\n \"resolved\": \"https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz\",\n \"integrity\": \"sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/resolve-pkg-maps\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz\",\n \"integrity\": \"sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"funding\": {\n \"url\": \"https://github.com/privatenumber/resolve-pkg-maps?sponsor=1\"\n }\n },\n \"node_modules/retry\": {\n \"version\": \"0.13.1\",\n \"resolved\": \"https://registry.npmjs.org/retry/-/retry-0.13.1.tgz\",\n \"integrity\": \"sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">= 4\"\n }\n },\n \"node_modules/rollup\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/rollup/-/rollup-4.45.0.tgz\",\n \"integrity\": \"sha512-WLjEcJRIo7i3WDDgOIJqVI2d+lAC3EwvOGy+Xfq6hs+GQuAA4Di/H72xmXkOhrIWFg2PFYSKZYfH0f4vfKXN4A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/estree\": \"1.0.8\"\n },\n \"bin\": {\n \"rollup\": \"dist/bin/rollup\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\",\n \"npm\": \">=8.0.0\"\n },\n \"optionalDependencies\": {\n \"@rollup/rollup-android-arm-eabi\": \"4.45.0\",\n \"@rollup/rollup-android-arm64\": \"4.45.0\",\n \"@rollup/rollup-darwin-arm64\": \"4.45.0\",\n \"@rollup/rollup-darwin-x64\": \"4.45.0\",\n \"@rollup/rollup-freebsd-arm64\": \"4.45.0\",\n \"@rollup/rollup-freebsd-x64\": \"4.45.0\",\n \"@rollup/rollup-linux-arm-gnueabihf\": \"4.45.0\",\n \"@rollup/rollup-linux-arm-musleabihf\": \"4.45.0\",\n \"@rollup/rollup-linux-arm64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-arm64-musl\": \"4.45.0\",\n \"@rollup/rollup-linux-loongarch64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-powerpc64le-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-riscv64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-riscv64-musl\": \"4.45.0\",\n \"@rollup/rollup-linux-s390x-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-x64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-x64-musl\": \"4.45.0\",\n \"@rollup/rollup-win32-arm64-msvc\": \"4.45.0\",\n \"@rollup/rollup-win32-ia32-msvc\": \"4.45.0\",\n \"@rollup/rollup-win32-x64-msvc\": \"4.45.0\",\n \"fsevents\": \"~2.3.2\"\n }\n },\n \"node_modules/rxjs\": {\n \"version\": \"7.8.2\",\n \"resolved\": \"https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz\",\n \"integrity\": \"sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"tslib\": \"^2.1.0\"\n }\n },\n \"node_modules/scheduler\": {\n \"version\": \"0.23.2\",\n \"resolved\": \"https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz\",\n \"integrity\": \"sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\"\n }\n },\n \"node_modules/semver\": {\n \"version\": \"6.3.1\",\n \"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n \"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"bin\": {\n \"semver\": \"bin/semver.js\"\n }\n },\n \"node_modules/shell-quote\": {\n \"version\": \"1.8.3\",\n \"resolved\": \"https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz\",\n \"integrity\": \"sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">= 0.4\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/ljharb\"\n }\n },\n \"node_modules/siginfo\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz\",\n \"integrity\": \"sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/sisteransi\": {\n \"version\": \"1.0.5\",\n \"resolved\": \"https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz\",\n \"integrity\": \"sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/source-map\": {\n \"version\": \"0.6.1\",\n \"resolved\": \"https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz\",\n \"integrity\": \"sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==\",\n \"dev\": true,\n \"license\": \"BSD-3-Clause\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/source-map-js\": {\n \"version\": \"1.2.1\",\n \"resolved\": \"https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz\",\n \"integrity\": \"sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==\",\n \"dev\": true,\n \"license\": \"BSD-3-Clause\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/source-map-support\": {\n \"version\": \"0.5.21\",\n \"resolved\": \"https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz\",\n \"integrity\": \"sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"buffer-from\": \"^1.0.0\",\n \"source-map\": \"^0.6.0\"\n }\n },\n \"node_modules/spawn-command\": {\n \"version\": \"0.0.2\",\n \"resolved\": \"https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz\",\n \"integrity\": \"sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==\",\n \"dev\": true\n },\n \"node_modules/stackback\": {\n \"version\": \"0.0.2\",\n \"resolved\": \"https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz\",\n \"integrity\": \"sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/std-env\": {\n \"version\": \"3.9.0\",\n \"resolved\": \"https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz\",\n \"integrity\": \"sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/string-width\": {\n \"version\": \"4.2.3\",\n \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"emoji-regex\": \"^8.0.0\",\n \"is-fullwidth-code-point\": \"^3.0.0\",\n \"strip-ansi\": \"^6.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/strip-ansi\": {\n \"version\": \"6.0.1\",\n \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-regex\": \"^5.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/strip-literal\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz\",\n \"integrity\": \"sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"js-tokens\": \"^9.0.1\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/antfu\"\n }\n },\n \"node_modules/strip-literal/node_modules/js-tokens\": {\n \"version\": \"9.0.1\",\n \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz\",\n \"integrity\": \"sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/supports-color\": {\n \"version\": \"8.1.1\",\n \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz\",\n \"integrity\": \"sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"has-flag\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/supports-color?sponsor=1\"\n }\n },\n \"node_modules/tinybench\": {\n \"version\": \"2.9.0\",\n \"resolved\": \"https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz\",\n \"integrity\": \"sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/tinyexec\": {\n \"version\": \"0.3.2\",\n \"resolved\": \"https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz\",\n \"integrity\": \"sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/tinyglobby\": {\n \"version\": \"0.2.14\",\n \"resolved\": \"https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz\",\n \"integrity\": \"sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"fdir\": \"^6.4.4\",\n \"picomatch\": \"^4.0.2\"\n },\n \"engines\": {\n \"node\": \">=12.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/SuperchupuDev\"\n }\n },\n \"node_modules/tinypool\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz\",\n \"integrity\": \"sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n }\n },\n \"node_modules/tinyrainbow\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz\",\n \"integrity\": \"sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=14.0.0\"\n }\n },\n \"node_modules/tinyspy\": {\n \"version\": \"4.0.3\",\n \"resolved\": \"https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz\",\n \"integrity\": \"sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=14.0.0\"\n }\n },\n \"node_modules/tree-kill\": {\n \"version\": \"1.2.2\",\n \"resolved\": \"https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz\",\n \"integrity\": \"sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"tree-kill\": \"cli.js\"\n }\n },\n \"node_modules/tslib\": {\n \"version\": \"2.8.1\",\n \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz\",\n \"integrity\": \"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==\",\n \"dev\": true,\n \"license\": \"0BSD\"\n },\n \"node_modules/tsx\": {\n \"version\": \"3.14.0\",\n \"resolved\": \"https://registry.npmjs.org/tsx/-/tsx-3.14.0.tgz\",\n \"integrity\": \"sha512-xHtFaKtHxM9LOklMmJdI3BEnQq/D5F73Of2E1GDrITi9sgoVkvIsrQUTY1G8FlmGtA+awCI4EBlTRRYxkL2sRg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"esbuild\": \"~0.18.20\",\n \"get-tsconfig\": \"^4.7.2\",\n \"source-map-support\": \"^0.5.21\"\n },\n \"bin\": {\n \"tsx\": \"dist/cli.mjs\"\n },\n \"optionalDependencies\": {\n \"fsevents\": \"~2.3.3\"\n }\n },\n \"node_modules/typescript\": {\n \"version\": \"5.8.3\",\n \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz\",\n \"integrity\": \"sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"bin\": {\n \"tsc\": \"bin/tsc\",\n \"tsserver\": \"bin/tsserver\"\n },\n \"engines\": {\n \"node\": \">=14.17\"\n }\n },\n \"node_modules/undici-types\": {\n \"version\": \"6.21.0\",\n \"resolved\": \"https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz\",\n \"integrity\": \"sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/update-browserslist-db\": {\n \"version\": \"1.1.3\",\n \"resolved\": \"https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz\",\n \"integrity\": \"sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"escalade\": \"^3.2.0\",\n \"picocolors\": \"^1.1.1\"\n },\n \"bin\": {\n \"update-browserslist-db\": \"cli.js\"\n },\n \"peerDependencies\": {\n \"browserslist\": \">= 4.21.0\"\n }\n },\n \"node_modules/use-sync-external-store\": {\n \"version\": \"1.5.0\",\n \"resolved\": \"https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz\",\n \"integrity\": \"sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==\",\n \"license\": \"MIT\",\n \"peerDependencies\": {\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\"\n }\n },\n \"node_modules/vite\": {\n \"version\": \"5.4.19\",\n \"resolved\": \"https://registry.npmjs.org/vite/-/vite-5.4.19.tgz\",\n \"integrity\": \"sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"esbuild\": \"^0.21.3\",\n \"postcss\": \"^8.4.43\",\n \"rollup\": \"^4.20.0\"\n },\n \"bin\": {\n \"vite\": \"bin/vite.js\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/vitejs/vite?sponsor=1\"\n },\n \"optionalDependencies\": {\n \"fsevents\": \"~2.3.3\"\n },\n \"peerDependencies\": {\n \"@types/node\": \"^18.0.0 || >=20.0.0\",\n \"less\": \"*\",\n \"lightningcss\": \"^1.21.0\",\n \"sass\": \"*\",\n \"sass-embedded\": \"*\",\n \"stylus\": \"*\",\n \"sugarss\": \"*\",\n \"terser\": \"^5.4.0\"\n },\n \"peerDependenciesMeta\": {\n \"@types/node\": {\n \"optional\": true\n },\n \"less\": {\n \"optional\": true\n },\n \"lightningcss\": {\n \"optional\": true\n },\n \"sass\": {\n \"optional\": true\n },\n \"sass-embedded\": {\n \"optional\": true\n },\n \"stylus\": {\n \"optional\": true\n },\n \"sugarss\": {\n \"optional\": true\n },\n \"terser\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/vite-node\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz\",\n \"integrity\": \"sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"cac\": \"^6.7.14\",\n \"debug\": \"^4.4.1\",\n \"es-module-lexer\": \"^1.7.0\",\n \"pathe\": \"^2.0.3\",\n \"vite\": \"^5.0.0 || ^6.0.0 || ^7.0.0-0\"\n },\n \"bin\": {\n \"vite-node\": \"vite-node.mjs\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || ^20.0.0 || >=22.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-arm\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz\",\n \"integrity\": \"sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/darwin-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/darwin-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/freebsd-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/freebsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-arm\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz\",\n \"integrity\": \"sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-ia32\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz\",\n \"integrity\": \"sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-loong64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz\",\n \"integrity\": \"sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-mips64el\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz\",\n \"integrity\": \"sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==\",\n \"cpu\": [\n \"mips64el\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-ppc64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz\",\n \"integrity\": \"sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-riscv64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz\",\n \"integrity\": \"sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-s390x\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz\",\n \"integrity\": \"sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/netbsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"netbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/openbsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"openbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/sunos-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"sunos\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-ia32\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz\",\n \"integrity\": \"sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/esbuild\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz\",\n \"integrity\": \"sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"esbuild\": \"bin/esbuild\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"optionalDependencies\": {\n \"@esbuild/aix-ppc64\": \"0.21.5\",\n \"@esbuild/android-arm\": \"0.21.5\",\n \"@esbuild/android-arm64\": \"0.21.5\",\n \"@esbuild/android-x64\": \"0.21.5\",\n \"@esbuild/darwin-arm64\": \"0.21.5\",\n \"@esbuild/darwin-x64\": \"0.21.5\",\n \"@esbuild/freebsd-arm64\": \"0.21.5\",\n \"@esbuild/freebsd-x64\": \"0.21.5\",\n \"@esbuild/linux-arm\": \"0.21.5\",\n \"@esbuild/linux-arm64\": \"0.21.5\",\n \"@esbuild/linux-ia32\": \"0.21.5\",\n \"@esbuild/linux-loong64\": \"0.21.5\",\n \"@esbuild/linux-mips64el\": \"0.21.5\",\n \"@esbuild/linux-ppc64\": \"0.21.5\",\n \"@esbuild/linux-riscv64\": \"0.21.5\",\n \"@esbuild/linux-s390x\": \"0.21.5\",\n \"@esbuild/linux-x64\": \"0.21.5\",\n \"@esbuild/netbsd-x64\": \"0.21.5\",\n \"@esbuild/openbsd-x64\": \"0.21.5\",\n \"@esbuild/sunos-x64\": \"0.21.5\",\n \"@esbuild/win32-arm64\": \"0.21.5\",\n \"@esbuild/win32-ia32\": \"0.21.5\",\n \"@esbuild/win32-x64\": \"0.21.5\"\n }\n },\n \"node_modules/vitest\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz\",\n \"integrity\": \"sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/chai\": \"^5.2.2\",\n \"@vitest/expect\": \"3.2.4\",\n \"@vitest/mocker\": \"3.2.4\",\n \"@vitest/pretty-format\": \"^3.2.4\",\n \"@vitest/runner\": \"3.2.4\",\n \"@vitest/snapshot\": \"3.2.4\",\n \"@vitest/spy\": \"3.2.4\",\n \"@vitest/utils\": \"3.2.4\",\n \"chai\": \"^5.2.0\",\n \"debug\": \"^4.4.1\",\n \"expect-type\": \"^1.2.1\",\n \"magic-string\": \"^0.30.17\",\n \"pathe\": \"^2.0.3\",\n \"picomatch\": \"^4.0.2\",\n \"std-env\": \"^3.9.0\",\n \"tinybench\": \"^2.9.0\",\n \"tinyexec\": \"^0.3.2\",\n \"tinyglobby\": \"^0.2.14\",\n \"tinypool\": \"^1.1.1\",\n \"tinyrainbow\": \"^2.0.0\",\n \"vite\": \"^5.0.0 || ^6.0.0 || ^7.0.0-0\",\n \"vite-node\": \"3.2.4\",\n \"why-is-node-running\": \"^2.3.0\"\n },\n \"bin\": {\n \"vitest\": \"vitest.mjs\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || ^20.0.0 || >=22.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n },\n \"peerDependencies\": {\n \"@edge-runtime/vm\": \"*\",\n \"@types/debug\": \"^4.1.12\",\n \"@types/node\": \"^18.0.0 || ^20.0.0 || >=22.0.0\",\n \"@vitest/browser\": \"3.2.4\",\n \"@vitest/ui\": \"3.2.4\",\n \"happy-dom\": \"*\",\n \"jsdom\": \"*\"\n },\n \"peerDependenciesMeta\": {\n \"@edge-runtime/vm\": {\n \"optional\": true\n },\n \"@types/debug\": {\n \"optional\": true\n },\n \"@types/node\": {\n \"optional\": true\n },\n \"@vitest/browser\": {\n \"optional\": true\n },\n \"@vitest/ui\": {\n \"optional\": true\n },\n \"happy-dom\": {\n \"optional\": true\n },\n \"jsdom\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/why-is-node-running\": {\n \"version\": \"2.3.0\",\n \"resolved\": \"https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz\",\n \"integrity\": \"sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"siginfo\": \"^2.0.0\",\n \"stackback\": \"0.0.2\"\n },\n \"bin\": {\n \"why-is-node-running\": \"cli.js\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/wrap-ansi\": {\n \"version\": \"7.0.0\",\n \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\n \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-styles\": \"^4.0.0\",\n \"string-width\": \"^4.1.0\",\n \"strip-ansi\": \"^6.0.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n }\n },\n \"node_modules/y18n\": {\n \"version\": \"5.0.8\",\n \"resolved\": \"https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz\",\n \"integrity\": \"sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \">=10\"\n }\n },\n \"node_modules/yallist\": {\n \"version\": \"3.1.1\",\n \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz\",\n \"integrity\": \"sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/yargs\": {\n \"version\": \"17.7.2\",\n \"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz\",\n \"integrity\": \"sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"cliui\": \"^8.0.1\",\n \"escalade\": \"^3.1.1\",\n \"get-caller-file\": \"^2.0.5\",\n \"require-directory\": \"^2.1.1\",\n \"string-width\": \"^4.2.3\",\n \"y18n\": \"^5.0.5\",\n \"yargs-parser\": \"^21.1.1\"\n },\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/yargs-parser\": {\n \"version\": \"21.1.1\",\n \"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz\",\n \"integrity\": \"sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/zod\": {\n \"version\": \"3.25.76\",\n \"resolved\": \"https://registry.npmjs.org/zod/-/zod-3.25.76.tgz\",\n \"integrity\": \"sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"funding\": {\n \"url\": \"https://github.com/sponsors/colinhacks\"\n }\n }\n }\n}\n", "package.json": "{\n \"name\": \"chat-room\",\n \"version\": \"0.9.1\",\n \"private\": true,\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"concurrently \\\"npm run dev:backend\\\" \\\"npm run dev:frontend\\\"\",\n \"dev:backend\": \"tsx --watch src/backend/server.ts\",\n \"dev:frontend\": \"vite\",\n \"dev:cli\": \"tsx src/scripts/cli.ts\",\n \"check-types\": \"tsc --noEmit\",\n \"test\": \"vitest run\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.13.9\",\n \"@types/prompts\": \"^2\",\n \"@types/react\": \"^18.2.0\",\n \"@types/react-dom\": \"^18.2.0\",\n \"@vitejs/plugin-react\": \"^4.2.0\",\n \"concurrently\": \"^8.2.2\",\n \"prompts\": \"^2.4.2\",\n \"rivetkit\": \"^0.9.1\",\n \"tsx\": \"^3.12.7\",\n \"typescript\": \"^5.5.2\",\n \"vite\": \"^5.0.0\",\n \"vitest\": \"^3.1.1\"\n },\n \"dependencies\": {\n \"@rivetkit/react\": \"^0.9.1\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\"\n },\n \"stableVersion\": \"0.8.0\"\n}\n", @@ -59,7 +59,7 @@ export const examples: ExampleData[] = [ "src/frontend/App.tsx": "import { createClient, createRivetKit } from \"@rivetkit/react\";\nimport { useEffect, useState } from \"react\";\nimport type { Message, registry } from \"../backend/registry\";\n\nconst client = createClient(\"http://localhost:8080\");\nconst { useActor } = createRivetKit(client);\n\nexport function App() {\n\tconst [roomId, setRoomId] = useState(\"general\");\n\tconst [username, setUsername] = useState(\"User\");\n\tconst [input, setInput] = useState(\"\");\n\tconst [messages, setMessages] = useState([]);\n\n\tconst chatRoom = useActor({\n\t\tname: \"chatRoom\",\n\t\tkey: [roomId],\n\t});\n\n\tuseEffect(() => {\n\t\tif (chatRoom.connection) {\n\t\t\tchatRoom.connection.getHistory().then(setMessages);\n\t\t}\n\t}, [chatRoom.connection]);\n\n\tchatRoom.useEvent(\"newMessage\", (message: Message) => {\n\t\tsetMessages((prev) => [...prev, message]);\n\t});\n\n\tconst sendMessage = async () => {\n\t\tif (chatRoom.connection && input.trim()) {\n\t\t\tawait chatRoom.connection.sendMessage(username, input);\n\t\t\tsetInput(\"\");\n\t\t}\n\t};\n\n\tconst handleKeyPress = (e: React.KeyboardEvent) => {\n\t\tif (e.key === \"Enter\") {\n\t\t\tsendMessage();\n\t\t}\n\t};\n\n\treturn (\n\t\t
\n\t\t\t
\n\t\t\t\t

Chat Room: {roomId}

\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t\n\t\t\t\t setRoomId(e.target.value)}\n\t\t\t\t\tplaceholder=\"Enter room name\"\n\t\t\t\t/>\n\t\t\t\t\n\t\t\t\t setUsername(e.target.value)}\n\t\t\t\t\tplaceholder=\"Enter your username\"\n\t\t\t\t/>\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t{messages.length === 0 ? (\n\t\t\t\t\t
\n\t\t\t\t\t\tNo messages yet. Start the conversation!\n\t\t\t\t\t
\n\t\t\t\t) : (\n\t\t\t\t\tmessages.map((msg, i) => (\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
{msg.sender}
\n\t\t\t\t\t\t\t
{msg.text}
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t{new Date(msg.timestamp).toLocaleTimeString()}\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t))\n\t\t\t\t)}\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t setInput(e.target.value)}\n\t\t\t\t\tonKeyPress={handleKeyPress}\n\t\t\t\t\tplaceholder=\"Type a message...\"\n\t\t\t\t\tdisabled={!chatRoom.connection}\n\t\t\t\t/>\n\t\t\t\t\n\t\t\t\t\tSend\n\t\t\t\t\n\t\t\t
\n\t\t
\n\t);\n}", "src/frontend/main.tsx": "import { StrictMode } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { App } from \"./App\";\n\nconst root = document.getElementById(\"root\");\nif (!root) throw new Error(\"Root element not found\");\n\ncreateRoot(root).render(\n\t\n\t\t\n\t\n);", "src/frontend/index.html": "\n\n\n \n \n Chat Room Example\n \n\n\n
\n \n\n", - "src/backend/registry.ts": "import { actor, setup } from \"rivetkit\";\n\nexport type Message = { sender: string; text: string; timestamp: number };\n\nexport const chatRoom = actor({\n\tonAuth: () => {},\n\t// Persistent state that survives restarts: https://rivet.gg/docs/actors/state\n\tstate: {\n\t\tmessages: [] as Message[],\n\t},\n\n\tactions: {\n\t\t// Callable functions from clients: https://rivet.gg/docs/actors/actions\n\t\tsendMessage: (c, sender: string, text: string) => {\n\t\t\tconst message = { sender, text, timestamp: Date.now() };\n\t\t\t// State changes are automatically persisted\n\t\t\tc.state.messages.push(message);\n\t\t\t// Send events to all connected clients: https://rivet.gg/docs/actors/events\n\t\t\tc.broadcast(\"newMessage\", message);\n\t\t\treturn message;\n\t\t},\n\n\t\tgetHistory: (c) => c.state.messages,\n\t},\n});\n\n// Register actors for use: https://rivet.gg/docs/setup\nexport const registry = setup({\n\tuse: { chatRoom },\n});\n", + "src/backend/registry.ts": "import { actor, setup } from \"rivetkit\";\n\nexport type Message = { sender: string; text: string; timestamp: number };\n\nexport const chatRoom = actor({\n\tonAuth: () => {},\n\t// Persistent state that survives restarts: https://rivet.dev/docs/actors/state\n\tstate: {\n\t\tmessages: [] as Message[],\n\t},\n\n\tactions: {\n\t\t// Callable functions from clients: https://rivet.dev/docs/actors/actions\n\t\tsendMessage: (c, sender: string, text: string) => {\n\t\t\tconst message = { sender, text, timestamp: Date.now() };\n\t\t\t// State changes are automatically persisted\n\t\t\tc.state.messages.push(message);\n\t\t\t// Send events to all connected clients: https://rivet.dev/docs/actors/events\n\t\t\tc.broadcast(\"newMessage\", message);\n\t\t\treturn message;\n\t\t},\n\n\t\tgetHistory: (c) => c.state.messages,\n\t},\n});\n\n// Register actors for use: https://rivet.dev/docs/setup\nexport const registry = setup({\n\tuse: { chatRoom },\n});\n", "src/backend/server.ts": "import { registry } from \"./registry\";\n\nregistry.runServer({\n\tcors: {\n\t\torigin: \"*\",\n\t},\n});\n", "src/scripts/cli.ts": "import { createClient } from \"rivetkit/client\";\nimport prompts from \"prompts\";\nimport type { registry } from \"../backend/registry\";\n\nasync function main() {\n\tconst { username, room } = await initPrompt();\n\n\t// Create type-aware client\n\tconst client = createClient(\"http://localhost:8080\");\n\n\t// connect to chat room\n\tconst chatRoom = client.chatRoom.getOrCreate([room]).connect();\n\n\t// fetch history\n\tconst history = await chatRoom.getHistory();\n\tconsole.log(\n\t\t`History:\\n${history.map((m) => `[${m.sender}] ${m.text}`).join(\"\\n\")}`,\n\t);\n\n\t// listen for new messages\n\tlet needsNewLine = false;\n\tchatRoom.on(\"newMessage\", (message: any) => {\n\t\tif (needsNewLine) {\n\t\t\tneedsNewLine = false;\n\t\t\tconsole.log();\n\t\t}\n\t\tconsole.log(`[${message.sender}] ${message.text}`);\n\t});\n\n\t// loop to send messages\n\twhile (true) {\n\t\tneedsNewLine = true;\n\t\tconst message = await textPrompt(\"Message\");\n\t\tif (!message) break;\n\t\tneedsNewLine = false;\n\t\tawait chatRoom.sendMessage(username, message);\n\t}\n\n\tawait chatRoom.dispose();\n}\n\nasync function initPrompt(): Promise<{\n\troom: string;\n\tusername: string;\n}> {\n\treturn await prompts([\n\t\t{\n\t\t\ttype: \"text\",\n\t\t\tname: \"username\",\n\t\t\tmessage: \"Username\",\n\t\t},\n\t\t{\n\t\t\ttype: \"text\",\n\t\t\tname: \"room\",\n\t\t\tmessage: \"Room\",\n\t\t},\n\t]);\n}\n\nasync function textPrompt(message: string): Promise {\n\tconst { x } = await prompts({\n\t\ttype: \"text\",\n\t\tname: \"x\",\n\t\tmessage,\n\t});\n\treturn x;\n}\n\nmain();\n", "src/scripts/connect.ts": "/// \nimport { createClient } from \"rivetkit/client\";\nimport type { registry } from \"../backend/registry\";\n\nasync function main() {\n\t// Create type-aware client\n\tconst client = createClient(\n\t\tprocess.env.ENDPOINT ?? \"http://localhost:8080\",\n\t);\n\n\t// connect to chat room\n\tconst chatRoom = client.chatRoom.getOrCreate().connect();\n\n\t// call action to get existing messages\n\tconst messages = await chatRoom.getHistory();\n\tconsole.log(\"Messages:\", messages);\n\n\t// listen for new messages\n\tchatRoom.on(\"newMessage\", (message: any) =>\n\t\tconsole.log(`Message from ${message.sender}: ${message.text}`),\n\t);\n\n\t// send message to room\n\tawait chatRoom.sendMessage(\"william\", \"All the world's a stage.\");\n\n\t// disconnect from actor when finished\n\tawait chatRoom.dispose();\n}\n\nmain();\n" @@ -76,7 +76,7 @@ export const examples: ExampleData[] = [ "tab": "memory", "files": { "tests/crdt.test.ts": "import { setupTest } from \"rivetkit/test\";\nimport { expect, test, vi } from \"vitest\";\nimport { registry } from \"../src/backend/registry\";\n\n// Mock Yjs to avoid complex binary operations in tests\nvi.mock(\"yjs\", () => ({\n\tDoc: vi.fn().mockImplementation(() => ({\n\t\tgetText: vi.fn().mockReturnValue({\n\t\t\ttoString: vi.fn().mockReturnValue(\"\"),\n\t\t\tobserve: vi.fn(),\n\t\t\tdelete: vi.fn(),\n\t\t\tinsert: vi.fn(),\n\t\t}),\n\t\ttransact: vi.fn((fn) => fn()),\n\t\tdestroy: vi.fn(),\n\t})),\n\tapplyUpdate: vi.fn(),\n\tencodeStateAsUpdate: vi.fn().mockReturnValue(new Uint8Array([1, 2, 3, 4])),\n}));\n\ntest(\"CRDT document can handle initial state\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst doc = client.yjsDocument.getOrCreate([\"test-doc\"]);\n\n\t// Test initial state\n\tconst state = await doc.getState();\n\texpect(state).toMatchObject({\n\t\tdocData: \"\",\n\t\tlastModified: 0,\n\t});\n});\n\ntest(\"CRDT document can apply updates\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst doc = client.yjsDocument.getOrCreate([\"test-updates\"]);\n\n\t// Mock update data (Base64 encoded)\n\tconst updateBase64 = btoa(\"mock-update-data\");\n\n\t// Apply an update\n\tawait doc.applyUpdate(updateBase64);\n\n\t// Verify state was updated\n\tconst state = await doc.getState();\n\texpect(state.docData).not.toBe(\"\");\n\texpect(state.lastModified).toBeGreaterThan(0);\n});\n\ntest(\"CRDT document handles multiple updates\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst doc = client.yjsDocument.getOrCreate([\"test-multiple\"]);\n\n\tconst update1 = btoa(\"update-1\");\n\tconst update2 = btoa(\"update-2\");\n\tconst update3 = btoa(\"update-3\");\n\n\t// Apply multiple updates\n\tawait doc.applyUpdate(update1);\n\tconst state1 = await doc.getState();\n\tconst firstModified = state1.lastModified;\n\n\tawait doc.applyUpdate(update2);\n\tconst state2 = await doc.getState();\n\tconst secondModified = state2.lastModified;\n\n\tawait doc.applyUpdate(update3);\n\tconst state3 = await doc.getState();\n\tconst thirdModified = state3.lastModified;\n\n\t// Verify timestamps are increasing\n\texpect(secondModified).toBeGreaterThanOrEqual(firstModified);\n\texpect(thirdModified).toBeGreaterThanOrEqual(secondModified);\n\n\t// Verify state is updated\n\texpect(state3.docData).not.toBe(\"\");\n\texpect(state3.lastModified).toBe(thirdModified);\n});\n\ntest(\"CRDT document handles Base64 encoding correctly\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst doc = client.yjsDocument.getOrCreate([\"test-encoding\"]);\n\n\t// Test with specific Base64 data\n\tconst testData = \"Hello, collaborative world!\";\n\tconst updateBase64 = btoa(testData);\n\n\tawait doc.applyUpdate(updateBase64);\n\n\tconst state = await doc.getState();\n\texpect(state.docData).toBeTruthy();\n\texpect(state.lastModified).toBeGreaterThan(0);\n});\n", - "README.md": "# CRDT Collaborative Editor for RivetKit\n\nExample project demonstrating real-time collaborative editing using Conflict-free Replicated Data Types (CRDTs) with [RivetKit](https://rivetkit.org).\n\n[Learn More →](https://github.com/rivet-gg/rivetkit)\n\n[Discord](https://rivet.gg/discord) — [Documentation](https://rivetkit.org) — [Issues](https://github.com/rivet-gg/rivetkit/issues)\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 18+\n\n### Installation\n\n```sh\ngit clone https://github.com/rivet-gg/rivetkit\ncd rivetkit/examples/crdt\nnpm install\n```\n\n### Development\n\n```sh\nnpm run dev\n```\n\nOpen your browser to `http://localhost:3000`\n\n## Features\n\n- **Real-time Collaborative Editing**: Multiple users can edit the same document simultaneously\n- **Conflict Resolution**: Uses Yjs CRDTs to automatically resolve editing conflicts\n- **Persistent State**: Document changes are automatically persisted\n- **Multiple Documents**: Switch between different collaborative documents\n- **Live Connection Status**: See when you're connected to the collaboration server\n\n## How it works\n\nThis example demonstrates how to build a collaborative editor using:\n\n1. **Yjs**: A high-performance CRDT implementation for building collaborative applications\n2. **RivetKit Actors**: Manage document state and synchronize changes between clients\n3. **Real-time Updates**: Use RivetKit's event system for instant synchronization\n4. **Conflict-free Merging**: Yjs automatically handles concurrent edits without conflicts\n\n## Usage\n\n1. Start the development server\n2. Open multiple browser tabs to `http://localhost:3000`\n3. Start typing in any tab - changes will appear in real-time across all tabs\n4. Try editing the same text simultaneously to see conflict resolution in action\n5. Switch between different documents using the document ID field\n\n## Architecture\n\n- **Backend**: RivetKit actor that manages Yjs document state and broadcasts updates\n- **Frontend**: React application with Yjs integration for local document management\n- **Synchronization**: Binary diffs are sent between clients for efficient updates\n\n## License\n\nApache 2.0", + "README.md": "# CRDT Collaborative Editor for RivetKit\n\nExample project demonstrating real-time collaborative editing using Conflict-free Replicated Data Types (CRDTs) with [RivetKit](https://rivetkit.org).\n\n[Learn More →](https://github.com/rivet-dev/rivetkit)\n\n[Discord](https://rivet.dev/discord) — [Documentation](https://rivetkit.org) — [Issues](https://github.com/rivet-dev/rivetkit/issues)\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 18+\n\n### Installation\n\n```sh\ngit clone https://github.com/rivet-dev/rivetkit\ncd rivetkit/examples/crdt\nnpm install\n```\n\n### Development\n\n```sh\nnpm run dev\n```\n\nOpen your browser to `http://localhost:3000`\n\n## Features\n\n- **Real-time Collaborative Editing**: Multiple users can edit the same document simultaneously\n- **Conflict Resolution**: Uses Yjs CRDTs to automatically resolve editing conflicts\n- **Persistent State**: Document changes are automatically persisted\n- **Multiple Documents**: Switch between different collaborative documents\n- **Live Connection Status**: See when you're connected to the collaboration server\n\n## How it works\n\nThis example demonstrates how to build a collaborative editor using:\n\n1. **Yjs**: A high-performance CRDT implementation for building collaborative applications\n2. **RivetKit Actors**: Manage document state and synchronize changes between clients\n3. **Real-time Updates**: Use RivetKit's event system for instant synchronization\n4. **Conflict-free Merging**: Yjs automatically handles concurrent edits without conflicts\n\n## Usage\n\n1. Start the development server\n2. Open multiple browser tabs to `http://localhost:3000`\n3. Start typing in any tab - changes will appear in real-time across all tabs\n4. Try editing the same text simultaneously to see conflict resolution in action\n5. Switch between different documents using the document ID field\n\n## Architecture\n\n- **Backend**: RivetKit actor that manages Yjs document state and broadcasts updates\n- **Frontend**: React application with Yjs integration for local document management\n- **Synchronization**: Binary diffs are sent between clients for efficient updates\n\n## License\n\nApache 2.0", "package-lock.json": "{\n \"name\": \"example-crdt\",\n \"version\": \"0.9.1\",\n \"lockfileVersion\": 3,\n \"requires\": true,\n \"packages\": {\n \"\": {\n \"name\": \"example-crdt\",\n \"version\": \"0.9.1\",\n \"dependencies\": {\n \"@rivetkit/react\": \"^0.9.1\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\",\n \"yjs\": \"^13.6.20\"\n },\n \"devDependencies\": {\n \"rivetkit\": \"^0.9.1\",\n \"@types/node\": \"^22.13.9\",\n \"@types/react\": \"^18.2.0\",\n \"@types/react-dom\": \"^18.2.0\",\n \"@vitejs/plugin-react\": \"^4.2.0\",\n \"concurrently\": \"^8.2.2\",\n \"tsx\": \"^3.12.7\",\n \"typescript\": \"^5.5.2\",\n \"vite\": \"^5.0.0\",\n \"vitest\": \"^3.1.1\"\n }\n },\n \"node_modules/@ampproject/remapping\": {\n \"version\": \"2.3.0\",\n \"resolved\": \"https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz\",\n \"integrity\": \"sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@jridgewell/gen-mapping\": \"^0.3.5\",\n \"@jridgewell/trace-mapping\": \"^0.3.24\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@babel/code-frame\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz\",\n \"integrity\": \"sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-validator-identifier\": \"^7.27.1\",\n \"js-tokens\": \"^4.0.0\",\n \"picocolors\": \"^1.1.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/compat-data\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz\",\n \"integrity\": \"sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/core\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz\",\n \"integrity\": \"sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@ampproject/remapping\": \"^2.2.0\",\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/generator\": \"^7.28.0\",\n \"@babel/helper-compilation-targets\": \"^7.27.2\",\n \"@babel/helper-module-transforms\": \"^7.27.3\",\n \"@babel/helpers\": \"^7.27.6\",\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/template\": \"^7.27.2\",\n \"@babel/traverse\": \"^7.28.0\",\n \"@babel/types\": \"^7.28.0\",\n \"convert-source-map\": \"^2.0.0\",\n \"debug\": \"^4.1.0\",\n \"gensync\": \"^1.0.0-beta.2\",\n \"json5\": \"^2.2.3\",\n \"semver\": \"^6.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"funding\": {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/babel\"\n }\n },\n \"node_modules/@babel/generator\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz\",\n \"integrity\": \"sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/types\": \"^7.28.0\",\n \"@jridgewell/gen-mapping\": \"^0.3.12\",\n \"@jridgewell/trace-mapping\": \"^0.3.28\",\n \"jsesc\": \"^3.0.2\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-compilation-targets\": {\n \"version\": \"7.27.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz\",\n \"integrity\": \"sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/compat-data\": \"^7.27.2\",\n \"@babel/helper-validator-option\": \"^7.27.1\",\n \"browserslist\": \"^4.24.0\",\n \"lru-cache\": \"^5.1.1\",\n \"semver\": \"^6.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-globals\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz\",\n \"integrity\": \"sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-module-imports\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz\",\n \"integrity\": \"sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/traverse\": \"^7.27.1\",\n \"@babel/types\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-module-transforms\": {\n \"version\": \"7.27.3\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz\",\n \"integrity\": \"sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-module-imports\": \"^7.27.1\",\n \"@babel/helper-validator-identifier\": \"^7.27.1\",\n \"@babel/traverse\": \"^7.27.3\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0\"\n }\n },\n \"node_modules/@babel/helper-plugin-utils\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz\",\n \"integrity\": \"sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-string-parser\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz\",\n \"integrity\": \"sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-validator-identifier\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz\",\n \"integrity\": \"sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-validator-option\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz\",\n \"integrity\": \"sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helpers\": {\n \"version\": \"7.27.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz\",\n \"integrity\": \"sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/template\": \"^7.27.2\",\n \"@babel/types\": \"^7.27.6\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/parser\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz\",\n \"integrity\": \"sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.28.0\"\n },\n \"bin\": {\n \"parser\": \"bin/babel-parser.js\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@babel/plugin-transform-react-jsx-self\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz\",\n \"integrity\": \"sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-plugin-utils\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/plugin-transform-react-jsx-source\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz\",\n \"integrity\": \"sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-plugin-utils\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/runtime\": {\n \"version\": \"7.27.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz\",\n \"integrity\": \"sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/template\": {\n \"version\": \"7.27.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz\",\n \"integrity\": \"sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/parser\": \"^7.27.2\",\n \"@babel/types\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/traverse\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz\",\n \"integrity\": \"sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/generator\": \"^7.28.0\",\n \"@babel/helper-globals\": \"^7.28.0\",\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/template\": \"^7.27.2\",\n \"@babel/types\": \"^7.28.0\",\n \"debug\": \"^4.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/types\": {\n \"version\": \"7.28.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/types/-/types-7.28.1.tgz\",\n \"integrity\": \"sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-string-parser\": \"^7.27.1\",\n \"@babel/helper-validator-identifier\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@cbor-extract/cbor-extract-darwin-arm64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.0.tgz\",\n \"integrity\": \"sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-darwin-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-arm\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.2.0.tgz\",\n \"integrity\": \"sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==\",\n \"cpu\": [\n \"arm\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-arm64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.2.0.tgz\",\n \"integrity\": \"sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-win32-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"peer\": true\n },\n \"node_modules/@esbuild/aix-ppc64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz\",\n \"integrity\": \"sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"aix\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/android-arm\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz\",\n \"integrity\": \"sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/android-arm64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz\",\n \"integrity\": \"sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/android-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/darwin-arm64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz\",\n \"integrity\": \"sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/darwin-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/freebsd-arm64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz\",\n \"integrity\": \"sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/freebsd-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-arm\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz\",\n \"integrity\": \"sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-arm64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz\",\n \"integrity\": \"sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-ia32\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz\",\n \"integrity\": \"sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-loong64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz\",\n \"integrity\": \"sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-mips64el\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz\",\n \"integrity\": \"sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==\",\n \"cpu\": [\n \"mips64el\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-ppc64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz\",\n \"integrity\": \"sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-riscv64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz\",\n \"integrity\": \"sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-s390x\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz\",\n \"integrity\": \"sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/netbsd-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"netbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/openbsd-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"openbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/sunos-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"sunos\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/win32-arm64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz\",\n \"integrity\": \"sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/win32-ia32\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz\",\n \"integrity\": \"sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/win32-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@jridgewell/gen-mapping\": {\n \"version\": \"0.3.12\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz\",\n \"integrity\": \"sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/sourcemap-codec\": \"^1.5.0\",\n \"@jridgewell/trace-mapping\": \"^0.3.24\"\n }\n },\n \"node_modules/@jridgewell/resolve-uri\": {\n \"version\": \"3.1.2\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz\",\n \"integrity\": \"sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@jridgewell/sourcemap-codec\": {\n \"version\": \"1.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz\",\n \"integrity\": \"sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@jridgewell/trace-mapping\": {\n \"version\": \"0.3.29\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz\",\n \"integrity\": \"sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/resolve-uri\": \"^3.1.0\",\n \"@jridgewell/sourcemap-codec\": \"^1.4.14\"\n }\n },\n \"node_modules/rivetkit\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/rivetkit/-/actor-0.9.1.tgz\",\n \"integrity\": \"sha512-aVoWO81JrYql6hhXX+vRor0B+aeWrnh+9zkcrxbh0EXFBbS5XM8YE4sSFxNKmZThLbGNqfZ5enm1zuA92c7I1w==\",\n \"dev\": true,\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\"\n }\n },\n \"node_modules/@rivetkit/core\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/core/-/core-0.9.1.tgz\",\n \"integrity\": \"sha512-0zYFKo08CQ72Rm6MaVKxcJSEEfn/ypGkkxTX06Q4meCGHuDJFbPA5wopa3NdxrKBPttcGg1QAmDd+1FZnlpubA==\",\n \"license\": \"Apache-2.0\",\n \"peer\": true,\n \"dependencies\": {\n \"cbor-x\": \"^1.6.0\",\n \"invariant\": \"^2.2.4\",\n \"on-change\": \"^5.0.1\",\n \"p-retry\": \"^6.2.1\",\n \"zod\": \"^3.25.67\"\n },\n \"engines\": {\n \"node\": \">=22.0.0\"\n },\n \"peerDependencies\": {\n \"@hono/node-server\": \"^1.14.0\",\n \"@hono/node-ws\": \"^1.1.1\",\n \"@hono/zod-openapi\": \"^0.19.6\",\n \"eventsource\": \"^3.0.5\",\n \"hono\": \"^4.7.0\",\n \"ws\": \"^8.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@hono/node-server\": {\n \"optional\": true\n },\n \"@hono/node-ws\": {\n \"optional\": true\n },\n \"@hono/zod-openapi\": {\n \"optional\": true\n },\n \"eventsource\": {\n \"optional\": true\n },\n \"hono\": {\n \"optional\": true\n },\n \"ws\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/@rivetkit/framework-base\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/framework-base/-/framework-base-0.9.1.tgz\",\n \"integrity\": \"sha512-FxhSqGAtDsD4k7gKS2EhJ5hHsEwI1+QR0vYThUBOLcmXM7zjMZndqIjVperQO4ck/zfjRqjm3lw7znkc+k0wNQ==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@tanstack/store\": \"^0.7.1\"\n },\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\"\n }\n },\n \"node_modules/@rivetkit/react\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/react/-/react-0.9.1.tgz\",\n \"integrity\": \"sha512-0e0gNNj3qCrXHNIxE6ggEEX+E6HjdsSt9pJbWbaQQg+1bsywupRTSdgSDguDHjBvi9qhR9mh7UbNN3A9wYqXuA==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@rivetkit/framework-base\": \"0.9.1\",\n \"@tanstack/react-store\": \"^0.7.1\"\n },\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\",\n \"react\": \"^18 || ^19\",\n \"react-dom\": \"^18 || ^19\"\n }\n },\n \"node_modules/@rolldown/pluginutils\": {\n \"version\": \"1.0.0-beta.19\",\n \"resolved\": \"https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz\",\n \"integrity\": \"sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@rollup/rollup-android-arm-eabi\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.0.tgz\",\n \"integrity\": \"sha512-2o/FgACbji4tW1dzXOqAV15Eu7DdgbKsF2QKcxfG4xbh5iwU7yr5RRP5/U+0asQliSYv5M4o7BevlGIoSL0LXg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ]\n },\n \"node_modules/@rollup/rollup-android-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-PSZ0SvMOjEAxwZeTx32eI/j5xSYtDCRxGu5k9zvzoY77xUNssZM+WV6HYBLROpY5CkXsbQjvz40fBb7WPwDqtQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ]\n },\n \"node_modules/@rollup/rollup-darwin-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-BA4yPIPssPB2aRAWzmqzQ3y2/KotkLyZukVB7j3psK/U3nVJdceo6qr9pLM2xN6iRP/wKfxEbOb1yrlZH6sYZg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ]\n },\n \"node_modules/@rollup/rollup-darwin-x64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.0.tgz\",\n \"integrity\": \"sha512-Pr2o0lvTwsiG4HCr43Zy9xXrHspyMvsvEw4FwKYqhli4FuLE5FjcZzuQ4cfPe0iUFCvSQG6lACI0xj74FDZKRA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ]\n },\n \"node_modules/@rollup/rollup-freebsd-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-lYE8LkE5h4a/+6VnnLiL14zWMPnx6wNbDG23GcYFpRW1V9hYWHAw9lBZ6ZUIrOaoK7NliF1sdwYGiVmziUF4vA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ]\n },\n \"node_modules/@rollup/rollup-freebsd-x64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.0.tgz\",\n \"integrity\": \"sha512-PVQWZK9sbzpvqC9Q0GlehNNSVHR+4m7+wET+7FgSnKG3ci5nAMgGmr9mGBXzAuE5SvguCKJ6mHL6vq1JaJ/gvw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm-gnueabihf\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.0.tgz\",\n \"integrity\": \"sha512-hLrmRl53prCcD+YXTfNvXd776HTxNh8wPAMllusQ+amcQmtgo3V5i/nkhPN6FakW+QVLoUUr2AsbtIRPFU3xIA==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm-musleabihf\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.0.tgz\",\n \"integrity\": \"sha512-XBKGSYcrkdiRRjl+8XvrUR3AosXU0NvF7VuqMsm7s5nRy+nt58ZMB19Jdp1RdqewLcaYnpk8zeVs/4MlLZEJxw==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-fRvZZPUiBz7NztBE/2QnCS5AtqLVhXmUOPj9IHlfGEXkapgImf4W9+FSkL8cWqoAjozyUzqFmSc4zh2ooaeF6g==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-Btv2WRZOcUGi8XU80XwIvzTg4U6+l6D0V6sZTrZx214nrwxw5nAi8hysaXj/mctyClWgesyuxbeLylCBNauimg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-loongarch64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-Li0emNnwtUZdLwHjQPBxn4VWztcrw/h7mgLyHiEI5Z0MhpeFGlzaiBHpSNVOMB/xucjXTTcO+dhv469Djr16KA==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-powerpc64le-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-sB8+pfkYx2kvpDCfd63d5ScYT0Fz1LO6jIb2zLZvmK9ob2D8DeVqrmBDE0iDK8KlBVmsTNzrjr3G1xV4eUZhSw==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-riscv64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-5GQ6PFhh7E6jQm70p1aW05G2cap5zMOvO0se5JMecHeAdj5ZhWEHbJ4hiKpfi1nnnEdTauDXxPgXae/mqjow9w==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-riscv64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-N/euLsBd1rekWcuduakTo/dJw6U6sBP3eUq+RXM9RNfPuWTvG2w/WObDkIvJ2KChy6oxZmOSC08Ak2OJA0UiAA==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-s390x-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-2l9sA7d7QdikL0xQwNMO3xURBUNEWyHVHfAsHsUdq+E/pgLTUcCE+gih5PCdmyHmfTDeXUWVhqL0WZzg0nua3g==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-x64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-XZdD3fEEQcwG2KrJDdEQu7NrHonPxxaV0/w2HpvINBdcqebz1aL+0vM2WFJq4DeiAVT6F5SUQas65HY5JDqoPw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-x64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-7ayfgvtmmWgKWBkCGg5+xTQ0r5V1owVm67zTrsEY1008L5ro7mCyGYORomARt/OquB9KY7LpxVBZes+oSniAAQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-arm64-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-B+IJgcBnE2bm93jEW5kHisqvPITs4ddLOROAcOc/diBgrEiQJJ6Qcjby75rFSmH5eMGrqJryUgJDhrfj942apQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-ia32-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-+CXwwG66g0/FpWOnP/v1HnrGVSOygK/osUbu3wPRy8ECXjoYKjRAyfxYpDQOfghC5qPJYLPH0oN4MCOjwgdMug==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-x64-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-SRf1cytG7wqcHVLrBc9VtPK4pU5wxiB/lNIkNmW2ApKXIg+RpqwHfsaEK+e7eH4A1BpI6BX/aBWXxZCIrJg3uA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@tanstack/react-store\": {\n \"version\": \"0.7.3\",\n \"resolved\": \"https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.7.3.tgz\",\n \"integrity\": \"sha512-3Dnqtbw9P2P0gw8uUM8WP2fFfg8XMDSZCTsywRPZe/XqqYW8PGkXKZTvP0AHkE4mpqP9Y43GpOg9vwO44azu6Q==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@tanstack/store\": \"0.7.2\",\n \"use-sync-external-store\": \"^1.5.0\"\n },\n \"funding\": {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/tannerlinsley\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\",\n \"react-dom\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\"\n }\n },\n \"node_modules/@tanstack/store\": {\n \"version\": \"0.7.2\",\n \"resolved\": \"https://registry.npmjs.org/@tanstack/store/-/store-0.7.2.tgz\",\n \"integrity\": \"sha512-RP80Z30BYiPX2Pyo0Nyw4s1SJFH2jyM6f9i3HfX4pA+gm5jsnYryscdq2aIQLnL4TaGuQMO+zXmN9nh1Qck+Pg==\",\n \"license\": \"MIT\",\n \"funding\": {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/tannerlinsley\"\n }\n },\n \"node_modules/@types/babel__core\": {\n \"version\": \"7.20.5\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz\",\n \"integrity\": \"sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.20.7\",\n \"@babel/types\": \"^7.20.7\",\n \"@types/babel__generator\": \"*\",\n \"@types/babel__template\": \"*\",\n \"@types/babel__traverse\": \"*\"\n }\n },\n \"node_modules/@types/babel__generator\": {\n \"version\": \"7.27.0\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz\",\n \"integrity\": \"sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.0.0\"\n }\n },\n \"node_modules/@types/babel__template\": {\n \"version\": \"7.4.4\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz\",\n \"integrity\": \"sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.1.0\",\n \"@babel/types\": \"^7.0.0\"\n }\n },\n \"node_modules/@types/babel__traverse\": {\n \"version\": \"7.20.7\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz\",\n \"integrity\": \"sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.20.7\"\n }\n },\n \"node_modules/@types/chai\": {\n \"version\": \"5.2.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz\",\n \"integrity\": \"sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/deep-eql\": \"*\"\n }\n },\n \"node_modules/@types/deep-eql\": {\n \"version\": \"4.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz\",\n \"integrity\": \"sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@types/estree\": {\n \"version\": \"1.0.8\",\n \"resolved\": \"https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz\",\n \"integrity\": \"sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@types/node\": {\n \"version\": \"22.16.3\",\n \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-22.16.3.tgz\",\n \"integrity\": \"sha512-sr4Xz74KOUeYadexo1r8imhRtlVXcs+j3XK3TcoiYk7B1t3YRVJgtaD3cwX73NYb71pmVuMLNRhJ9XKdoDB74g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"undici-types\": \"~6.21.0\"\n }\n },\n \"node_modules/@types/prop-types\": {\n \"version\": \"15.7.15\",\n \"resolved\": \"https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz\",\n \"integrity\": \"sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@types/react\": {\n \"version\": \"18.3.23\",\n \"resolved\": \"https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz\",\n \"integrity\": \"sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/prop-types\": \"*\",\n \"csstype\": \"^3.0.2\"\n }\n },\n \"node_modules/@types/react-dom\": {\n \"version\": \"18.3.7\",\n \"resolved\": \"https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz\",\n \"integrity\": \"sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"peerDependencies\": {\n \"@types/react\": \"^18.0.0\"\n }\n },\n \"node_modules/@types/retry\": {\n \"version\": \"0.12.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz\",\n \"integrity\": \"sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==\",\n \"license\": \"MIT\",\n \"peer\": true\n },\n \"node_modules/@vitejs/plugin-react\": {\n \"version\": \"4.6.0\",\n \"resolved\": \"https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.6.0.tgz\",\n \"integrity\": \"sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/core\": \"^7.27.4\",\n \"@babel/plugin-transform-react-jsx-self\": \"^7.27.1\",\n \"@babel/plugin-transform-react-jsx-source\": \"^7.27.1\",\n \"@rolldown/pluginutils\": \"1.0.0-beta.19\",\n \"@types/babel__core\": \"^7.20.5\",\n \"react-refresh\": \"^0.17.0\"\n },\n \"engines\": {\n \"node\": \"^14.18.0 || >=16.0.0\"\n },\n \"peerDependencies\": {\n \"vite\": \"^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0\"\n }\n },\n \"node_modules/@vitest/expect\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz\",\n \"integrity\": \"sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/chai\": \"^5.2.2\",\n \"@vitest/spy\": \"3.2.4\",\n \"@vitest/utils\": \"3.2.4\",\n \"chai\": \"^5.2.0\",\n \"tinyrainbow\": \"^2.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/mocker\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz\",\n \"integrity\": \"sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/spy\": \"3.2.4\",\n \"estree-walker\": \"^3.0.3\",\n \"magic-string\": \"^0.30.17\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n },\n \"peerDependencies\": {\n \"msw\": \"^2.4.9\",\n \"vite\": \"^5.0.0 || ^6.0.0 || ^7.0.0-0\"\n },\n \"peerDependenciesMeta\": {\n \"msw\": {\n \"optional\": true\n },\n \"vite\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/@vitest/pretty-format\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz\",\n \"integrity\": \"sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"tinyrainbow\": \"^2.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/runner\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz\",\n \"integrity\": \"sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/utils\": \"3.2.4\",\n \"pathe\": \"^2.0.3\",\n \"strip-literal\": \"^3.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/snapshot\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz\",\n \"integrity\": \"sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/pretty-format\": \"3.2.4\",\n \"magic-string\": \"^0.30.17\",\n \"pathe\": \"^2.0.3\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/spy\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz\",\n \"integrity\": \"sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"tinyspy\": \"^4.0.3\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/utils\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz\",\n \"integrity\": \"sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/pretty-format\": \"3.2.4\",\n \"loupe\": \"^3.1.4\",\n \"tinyrainbow\": \"^2.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/ansi-regex\": {\n \"version\": \"5.0.1\",\n \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/ansi-styles\": {\n \"version\": \"4.3.0\",\n \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\n \"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"color-convert\": \"^2.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n }\n },\n \"node_modules/assertion-error\": {\n \"version\": \"2.0.1\",\n \"resolved\": \"https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz\",\n \"integrity\": \"sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/browserslist\": {\n \"version\": \"4.25.1\",\n \"resolved\": \"https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz\",\n \"integrity\": \"sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"caniuse-lite\": \"^1.0.30001726\",\n \"electron-to-chromium\": \"^1.5.173\",\n \"node-releases\": \"^2.0.19\",\n \"update-browserslist-db\": \"^1.1.3\"\n },\n \"bin\": {\n \"browserslist\": \"cli.js\"\n },\n \"engines\": {\n \"node\": \"^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7\"\n }\n },\n \"node_modules/buffer-from\": {\n \"version\": \"1.1.2\",\n \"resolved\": \"https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz\",\n \"integrity\": \"sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/cac\": {\n \"version\": \"6.7.14\",\n \"resolved\": \"https://registry.npmjs.org/cac/-/cac-6.7.14.tgz\",\n \"integrity\": \"sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/caniuse-lite\": {\n \"version\": \"1.0.30001727\",\n \"resolved\": \"https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz\",\n \"integrity\": \"sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/caniuse-lite\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"CC-BY-4.0\"\n },\n \"node_modules/cbor-extract\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/cbor-extract/-/cbor-extract-2.2.0.tgz\",\n \"integrity\": \"sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==\",\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"peer\": true,\n \"dependencies\": {\n \"node-gyp-build-optional-packages\": \"5.1.1\"\n },\n \"bin\": {\n \"download-cbor-prebuilds\": \"bin/download-prebuilds.js\"\n },\n \"optionalDependencies\": {\n \"@cbor-extract/cbor-extract-darwin-arm64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-darwin-x64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-arm\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-arm64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-x64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-win32-x64\": \"2.2.0\"\n }\n },\n \"node_modules/cbor-x\": {\n \"version\": \"1.6.0\",\n \"resolved\": \"https://registry.npmjs.org/cbor-x/-/cbor-x-1.6.0.tgz\",\n \"integrity\": \"sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"optionalDependencies\": {\n \"cbor-extract\": \"^2.2.0\"\n }\n },\n \"node_modules/chai\": {\n \"version\": \"5.2.1\",\n \"resolved\": \"https://registry.npmjs.org/chai/-/chai-5.2.1.tgz\",\n \"integrity\": \"sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"assertion-error\": \"^2.0.1\",\n \"check-error\": \"^2.1.1\",\n \"deep-eql\": \"^5.0.1\",\n \"loupe\": \"^3.1.0\",\n \"pathval\": \"^2.0.0\"\n },\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/chalk\": {\n \"version\": \"4.1.2\",\n \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz\",\n \"integrity\": \"sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-styles\": \"^4.1.0\",\n \"supports-color\": \"^7.1.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/chalk?sponsor=1\"\n }\n },\n \"node_modules/chalk/node_modules/supports-color\": {\n \"version\": \"7.2.0\",\n \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz\",\n \"integrity\": \"sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"has-flag\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/check-error\": {\n \"version\": \"2.1.1\",\n \"resolved\": \"https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz\",\n \"integrity\": \"sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">= 16\"\n }\n },\n \"node_modules/cliui\": {\n \"version\": \"8.0.1\",\n \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz\",\n \"integrity\": \"sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"dependencies\": {\n \"string-width\": \"^4.2.0\",\n \"strip-ansi\": \"^6.0.1\",\n \"wrap-ansi\": \"^7.0.0\"\n },\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/color-convert\": {\n \"version\": \"2.0.1\",\n \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\n \"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"color-name\": \"~1.1.4\"\n },\n \"engines\": {\n \"node\": \">=7.0.0\"\n }\n },\n \"node_modules/color-name\": {\n \"version\": \"1.1.4\",\n \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\n \"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/concurrently\": {\n \"version\": \"8.2.2\",\n \"resolved\": \"https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz\",\n \"integrity\": \"sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"chalk\": \"^4.1.2\",\n \"date-fns\": \"^2.30.0\",\n \"lodash\": \"^4.17.21\",\n \"rxjs\": \"^7.8.1\",\n \"shell-quote\": \"^1.8.1\",\n \"spawn-command\": \"0.0.2\",\n \"supports-color\": \"^8.1.1\",\n \"tree-kill\": \"^1.2.2\",\n \"yargs\": \"^17.7.2\"\n },\n \"bin\": {\n \"conc\": \"dist/bin/concurrently.js\",\n \"concurrently\": \"dist/bin/concurrently.js\"\n },\n \"engines\": {\n \"node\": \"^14.13.0 || >=16.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/open-cli-tools/concurrently?sponsor=1\"\n }\n },\n \"node_modules/convert-source-map\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz\",\n \"integrity\": \"sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/csstype\": {\n \"version\": \"3.1.3\",\n \"resolved\": \"https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz\",\n \"integrity\": \"sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/date-fns\": {\n \"version\": \"2.30.0\",\n \"resolved\": \"https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz\",\n \"integrity\": \"sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.21.0\"\n },\n \"engines\": {\n \"node\": \">=0.11\"\n },\n \"funding\": {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/date-fns\"\n }\n },\n \"node_modules/debug\": {\n \"version\": \"4.4.1\",\n \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.4.1.tgz\",\n \"integrity\": \"sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ms\": \"^2.1.3\"\n },\n \"engines\": {\n \"node\": \">=6.0\"\n },\n \"peerDependenciesMeta\": {\n \"supports-color\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/deep-eql\": {\n \"version\": \"5.0.2\",\n \"resolved\": \"https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz\",\n \"integrity\": \"sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/detect-libc\": {\n \"version\": \"2.0.4\",\n \"resolved\": \"https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz\",\n \"integrity\": \"sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==\",\n \"license\": \"Apache-2.0\",\n \"optional\": true,\n \"peer\": true,\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/electron-to-chromium\": {\n \"version\": \"1.5.183\",\n \"resolved\": \"https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.183.tgz\",\n \"integrity\": \"sha512-vCrDBYjQCAEefWGjlK3EpoSKfKbT10pR4XXPdn65q7snuNOZnthoVpBfZPykmDapOKfoD+MMIPG8ZjKyyc9oHA==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/emoji-regex\": {\n \"version\": \"8.0.0\",\n \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/es-module-lexer\": {\n \"version\": \"1.7.0\",\n \"resolved\": \"https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz\",\n \"integrity\": \"sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/esbuild\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz\",\n \"integrity\": \"sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"esbuild\": \"bin/esbuild\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"optionalDependencies\": {\n \"@esbuild/android-arm\": \"0.18.20\",\n \"@esbuild/android-arm64\": \"0.18.20\",\n \"@esbuild/android-x64\": \"0.18.20\",\n \"@esbuild/darwin-arm64\": \"0.18.20\",\n \"@esbuild/darwin-x64\": \"0.18.20\",\n \"@esbuild/freebsd-arm64\": \"0.18.20\",\n \"@esbuild/freebsd-x64\": \"0.18.20\",\n \"@esbuild/linux-arm\": \"0.18.20\",\n \"@esbuild/linux-arm64\": \"0.18.20\",\n \"@esbuild/linux-ia32\": \"0.18.20\",\n \"@esbuild/linux-loong64\": \"0.18.20\",\n \"@esbuild/linux-mips64el\": \"0.18.20\",\n \"@esbuild/linux-ppc64\": \"0.18.20\",\n \"@esbuild/linux-riscv64\": \"0.18.20\",\n \"@esbuild/linux-s390x\": \"0.18.20\",\n \"@esbuild/linux-x64\": \"0.18.20\",\n \"@esbuild/netbsd-x64\": \"0.18.20\",\n \"@esbuild/openbsd-x64\": \"0.18.20\",\n \"@esbuild/sunos-x64\": \"0.18.20\",\n \"@esbuild/win32-arm64\": \"0.18.20\",\n \"@esbuild/win32-ia32\": \"0.18.20\",\n \"@esbuild/win32-x64\": \"0.18.20\"\n }\n },\n \"node_modules/escalade\": {\n \"version\": \"3.2.0\",\n \"resolved\": \"https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz\",\n \"integrity\": \"sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/estree-walker\": {\n \"version\": \"3.0.3\",\n \"resolved\": \"https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz\",\n \"integrity\": \"sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/estree\": \"^1.0.0\"\n }\n },\n \"node_modules/expect-type\": {\n \"version\": \"1.2.2\",\n \"resolved\": \"https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz\",\n \"integrity\": \"sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"engines\": {\n \"node\": \">=12.0.0\"\n }\n },\n \"node_modules/fdir\": {\n \"version\": \"6.4.6\",\n \"resolved\": \"https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz\",\n \"integrity\": \"sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"peerDependencies\": {\n \"picomatch\": \"^3 || ^4\"\n },\n \"peerDependenciesMeta\": {\n \"picomatch\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/fsevents\": {\n \"version\": \"2.3.3\",\n \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz\",\n \"integrity\": \"sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n }\n },\n \"node_modules/gensync\": {\n \"version\": \"1.0.0-beta.2\",\n \"resolved\": \"https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz\",\n \"integrity\": \"sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/get-caller-file\": {\n \"version\": \"2.0.5\",\n \"resolved\": \"https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz\",\n \"integrity\": \"sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \"6.* || 8.* || >= 10.*\"\n }\n },\n \"node_modules/get-tsconfig\": {\n \"version\": \"4.10.1\",\n \"resolved\": \"https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz\",\n \"integrity\": \"sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"resolve-pkg-maps\": \"^1.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/privatenumber/get-tsconfig?sponsor=1\"\n }\n },\n \"node_modules/has-flag\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz\",\n \"integrity\": \"sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/invariant\": {\n \"version\": \"2.2.4\",\n \"resolved\": \"https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz\",\n \"integrity\": \"sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"dependencies\": {\n \"loose-envify\": \"^1.0.0\"\n }\n },\n \"node_modules/is-fullwidth-code-point\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz\",\n \"integrity\": \"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/is-network-error\": {\n \"version\": \"1.1.0\",\n \"resolved\": \"https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz\",\n \"integrity\": \"sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">=16\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/isomorphic.js\": {\n \"version\": \"0.2.5\",\n \"resolved\": \"https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz\",\n \"integrity\": \"sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==\",\n \"license\": \"MIT\",\n \"funding\": {\n \"type\": \"GitHub Sponsors ❤\",\n \"url\": \"https://github.com/sponsors/dmonad\"\n }\n },\n \"node_modules/js-tokens\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz\",\n \"integrity\": \"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==\",\n \"license\": \"MIT\"\n },\n \"node_modules/jsesc\": {\n \"version\": \"3.1.0\",\n \"resolved\": \"https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz\",\n \"integrity\": \"sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"jsesc\": \"bin/jsesc\"\n },\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/json5\": {\n \"version\": \"2.2.3\",\n \"resolved\": \"https://registry.npmjs.org/json5/-/json5-2.2.3.tgz\",\n \"integrity\": \"sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"json5\": \"lib/cli.js\"\n },\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/lib0\": {\n \"version\": \"0.2.109\",\n \"resolved\": \"https://registry.npmjs.org/lib0/-/lib0-0.2.109.tgz\",\n \"integrity\": \"sha512-jP0gbnyW0kwlx1Atc4dcHkBbrVAkdHjuyHxtClUPYla7qCmwIif1qZ6vQeJdR5FrOVdn26HvQT0ko01rgW7/Xw==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"isomorphic.js\": \"^0.2.4\"\n },\n \"bin\": {\n \"0ecdsa-generate-keypair\": \"bin/0ecdsa-generate-keypair.js\",\n \"0gentesthtml\": \"bin/gentesthtml.js\",\n \"0serve\": \"bin/0serve.js\"\n },\n \"engines\": {\n \"node\": \">=16\"\n },\n \"funding\": {\n \"type\": \"GitHub Sponsors ❤\",\n \"url\": \"https://github.com/sponsors/dmonad\"\n }\n },\n \"node_modules/lodash\": {\n \"version\": \"4.17.21\",\n \"resolved\": \"https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz\",\n \"integrity\": \"sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/loose-envify\": {\n \"version\": \"1.4.0\",\n \"resolved\": \"https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz\",\n \"integrity\": \"sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"js-tokens\": \"^3.0.0 || ^4.0.0\"\n },\n \"bin\": {\n \"loose-envify\": \"cli.js\"\n }\n },\n \"node_modules/loupe\": {\n \"version\": \"3.1.4\",\n \"resolved\": \"https://registry.npmjs.org/loupe/-/loupe-3.1.4.tgz\",\n \"integrity\": \"sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/lru-cache\": {\n \"version\": \"5.1.1\",\n \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz\",\n \"integrity\": \"sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"dependencies\": {\n \"yallist\": \"^3.0.2\"\n }\n },\n \"node_modules/magic-string\": {\n \"version\": \"0.30.17\",\n \"resolved\": \"https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz\",\n \"integrity\": \"sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/sourcemap-codec\": \"^1.5.0\"\n }\n },\n \"node_modules/ms\": {\n \"version\": \"2.1.3\",\n \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz\",\n \"integrity\": \"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/nanoid\": {\n \"version\": \"3.3.11\",\n \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz\",\n \"integrity\": \"sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"bin\": {\n \"nanoid\": \"bin/nanoid.cjs\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || ^13.7 || ^14 || >=15.0.1\"\n }\n },\n \"node_modules/node-gyp-build-optional-packages\": {\n \"version\": \"5.1.1\",\n \"resolved\": \"https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz\",\n \"integrity\": \"sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==\",\n \"license\": \"MIT\",\n \"optional\": true,\n \"peer\": true,\n \"dependencies\": {\n \"detect-libc\": \"^2.0.1\"\n },\n \"bin\": {\n \"node-gyp-build-optional-packages\": \"bin.js\",\n \"node-gyp-build-optional-packages-optional\": \"optional.js\",\n \"node-gyp-build-optional-packages-test\": \"build-test.js\"\n }\n },\n \"node_modules/node-releases\": {\n \"version\": \"2.0.19\",\n \"resolved\": \"https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz\",\n \"integrity\": \"sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/on-change\": {\n \"version\": \"5.0.1\",\n \"resolved\": \"https://registry.npmjs.org/on-change/-/on-change-5.0.1.tgz\",\n \"integrity\": \"sha512-n7THCP7RkyReRSLkJb8kUWoNsxUIBxTkIp3JKno+sEz6o/9AJ3w3P9fzQkITEkMwyTKJjZciF3v/pVoouxZZMg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">=18\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sindresorhus/on-change?sponsor=1\"\n }\n },\n \"node_modules/p-retry\": {\n \"version\": \"6.2.1\",\n \"resolved\": \"https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz\",\n \"integrity\": \"sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"dependencies\": {\n \"@types/retry\": \"0.12.2\",\n \"is-network-error\": \"^1.0.0\",\n \"retry\": \"^0.13.1\"\n },\n \"engines\": {\n \"node\": \">=16.17\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/pathe\": {\n \"version\": \"2.0.3\",\n \"resolved\": \"https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz\",\n \"integrity\": \"sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/pathval\": {\n \"version\": \"2.0.1\",\n \"resolved\": \"https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz\",\n \"integrity\": \"sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">= 14.16\"\n }\n },\n \"node_modules/picocolors\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz\",\n \"integrity\": \"sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/picomatch\": {\n \"version\": \"4.0.2\",\n \"resolved\": \"https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz\",\n \"integrity\": \"sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=12\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/jonschlinkert\"\n }\n },\n \"node_modules/postcss\": {\n \"version\": \"8.5.6\",\n \"resolved\": \"https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz\",\n \"integrity\": \"sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/postcss/\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/postcss\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"nanoid\": \"^3.3.11\",\n \"picocolors\": \"^1.1.1\",\n \"source-map-js\": \"^1.2.1\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || >=14\"\n }\n },\n \"node_modules/react\": {\n \"version\": \"18.3.1\",\n \"resolved\": \"https://registry.npmjs.org/react/-/react-18.3.1.tgz\",\n \"integrity\": \"sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\"\n },\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/react-dom\": {\n \"version\": \"18.3.1\",\n \"resolved\": \"https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz\",\n \"integrity\": \"sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\",\n \"scheduler\": \"^0.23.2\"\n },\n \"peerDependencies\": {\n \"react\": \"^18.3.1\"\n }\n },\n \"node_modules/react-refresh\": {\n \"version\": \"0.17.0\",\n \"resolved\": \"https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz\",\n \"integrity\": \"sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/require-directory\": {\n \"version\": \"2.1.1\",\n \"resolved\": \"https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz\",\n \"integrity\": \"sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/resolve-pkg-maps\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz\",\n \"integrity\": \"sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"funding\": {\n \"url\": \"https://github.com/privatenumber/resolve-pkg-maps?sponsor=1\"\n }\n },\n \"node_modules/retry\": {\n \"version\": \"0.13.1\",\n \"resolved\": \"https://registry.npmjs.org/retry/-/retry-0.13.1.tgz\",\n \"integrity\": \"sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">= 4\"\n }\n },\n \"node_modules/rollup\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/rollup/-/rollup-4.45.0.tgz\",\n \"integrity\": \"sha512-WLjEcJRIo7i3WDDgOIJqVI2d+lAC3EwvOGy+Xfq6hs+GQuAA4Di/H72xmXkOhrIWFg2PFYSKZYfH0f4vfKXN4A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/estree\": \"1.0.8\"\n },\n \"bin\": {\n \"rollup\": \"dist/bin/rollup\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\",\n \"npm\": \">=8.0.0\"\n },\n \"optionalDependencies\": {\n \"@rollup/rollup-android-arm-eabi\": \"4.45.0\",\n \"@rollup/rollup-android-arm64\": \"4.45.0\",\n \"@rollup/rollup-darwin-arm64\": \"4.45.0\",\n \"@rollup/rollup-darwin-x64\": \"4.45.0\",\n \"@rollup/rollup-freebsd-arm64\": \"4.45.0\",\n \"@rollup/rollup-freebsd-x64\": \"4.45.0\",\n \"@rollup/rollup-linux-arm-gnueabihf\": \"4.45.0\",\n \"@rollup/rollup-linux-arm-musleabihf\": \"4.45.0\",\n \"@rollup/rollup-linux-arm64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-arm64-musl\": \"4.45.0\",\n \"@rollup/rollup-linux-loongarch64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-powerpc64le-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-riscv64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-riscv64-musl\": \"4.45.0\",\n \"@rollup/rollup-linux-s390x-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-x64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-x64-musl\": \"4.45.0\",\n \"@rollup/rollup-win32-arm64-msvc\": \"4.45.0\",\n \"@rollup/rollup-win32-ia32-msvc\": \"4.45.0\",\n \"@rollup/rollup-win32-x64-msvc\": \"4.45.0\",\n \"fsevents\": \"~2.3.2\"\n }\n },\n \"node_modules/rxjs\": {\n \"version\": \"7.8.2\",\n \"resolved\": \"https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz\",\n \"integrity\": \"sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"tslib\": \"^2.1.0\"\n }\n },\n \"node_modules/scheduler\": {\n \"version\": \"0.23.2\",\n \"resolved\": \"https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz\",\n \"integrity\": \"sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\"\n }\n },\n \"node_modules/semver\": {\n \"version\": \"6.3.1\",\n \"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n \"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"bin\": {\n \"semver\": \"bin/semver.js\"\n }\n },\n \"node_modules/shell-quote\": {\n \"version\": \"1.8.3\",\n \"resolved\": \"https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz\",\n \"integrity\": \"sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">= 0.4\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/ljharb\"\n }\n },\n \"node_modules/siginfo\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz\",\n \"integrity\": \"sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/source-map\": {\n \"version\": \"0.6.1\",\n \"resolved\": \"https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz\",\n \"integrity\": \"sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==\",\n \"dev\": true,\n \"license\": \"BSD-3-Clause\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/source-map-js\": {\n \"version\": \"1.2.1\",\n \"resolved\": \"https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz\",\n \"integrity\": \"sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==\",\n \"dev\": true,\n \"license\": \"BSD-3-Clause\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/source-map-support\": {\n \"version\": \"0.5.21\",\n \"resolved\": \"https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz\",\n \"integrity\": \"sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"buffer-from\": \"^1.0.0\",\n \"source-map\": \"^0.6.0\"\n }\n },\n \"node_modules/spawn-command\": {\n \"version\": \"0.0.2\",\n \"resolved\": \"https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz\",\n \"integrity\": \"sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==\",\n \"dev\": true\n },\n \"node_modules/stackback\": {\n \"version\": \"0.0.2\",\n \"resolved\": \"https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz\",\n \"integrity\": \"sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/std-env\": {\n \"version\": \"3.9.0\",\n \"resolved\": \"https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz\",\n \"integrity\": \"sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/string-width\": {\n \"version\": \"4.2.3\",\n \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"emoji-regex\": \"^8.0.0\",\n \"is-fullwidth-code-point\": \"^3.0.0\",\n \"strip-ansi\": \"^6.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/strip-ansi\": {\n \"version\": \"6.0.1\",\n \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-regex\": \"^5.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/strip-literal\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz\",\n \"integrity\": \"sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"js-tokens\": \"^9.0.1\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/antfu\"\n }\n },\n \"node_modules/strip-literal/node_modules/js-tokens\": {\n \"version\": \"9.0.1\",\n \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz\",\n \"integrity\": \"sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/supports-color\": {\n \"version\": \"8.1.1\",\n \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz\",\n \"integrity\": \"sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"has-flag\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/supports-color?sponsor=1\"\n }\n },\n \"node_modules/tinybench\": {\n \"version\": \"2.9.0\",\n \"resolved\": \"https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz\",\n \"integrity\": \"sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/tinyexec\": {\n \"version\": \"0.3.2\",\n \"resolved\": \"https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz\",\n \"integrity\": \"sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/tinyglobby\": {\n \"version\": \"0.2.14\",\n \"resolved\": \"https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz\",\n \"integrity\": \"sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"fdir\": \"^6.4.4\",\n \"picomatch\": \"^4.0.2\"\n },\n \"engines\": {\n \"node\": \">=12.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/SuperchupuDev\"\n }\n },\n \"node_modules/tinypool\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz\",\n \"integrity\": \"sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n }\n },\n \"node_modules/tinyrainbow\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz\",\n \"integrity\": \"sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=14.0.0\"\n }\n },\n \"node_modules/tinyspy\": {\n \"version\": \"4.0.3\",\n \"resolved\": \"https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz\",\n \"integrity\": \"sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=14.0.0\"\n }\n },\n \"node_modules/tree-kill\": {\n \"version\": \"1.2.2\",\n \"resolved\": \"https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz\",\n \"integrity\": \"sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"tree-kill\": \"cli.js\"\n }\n },\n \"node_modules/tslib\": {\n \"version\": \"2.8.1\",\n \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz\",\n \"integrity\": \"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==\",\n \"dev\": true,\n \"license\": \"0BSD\"\n },\n \"node_modules/tsx\": {\n \"version\": \"3.14.0\",\n \"resolved\": \"https://registry.npmjs.org/tsx/-/tsx-3.14.0.tgz\",\n \"integrity\": \"sha512-xHtFaKtHxM9LOklMmJdI3BEnQq/D5F73Of2E1GDrITi9sgoVkvIsrQUTY1G8FlmGtA+awCI4EBlTRRYxkL2sRg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"esbuild\": \"~0.18.20\",\n \"get-tsconfig\": \"^4.7.2\",\n \"source-map-support\": \"^0.5.21\"\n },\n \"bin\": {\n \"tsx\": \"dist/cli.mjs\"\n },\n \"optionalDependencies\": {\n \"fsevents\": \"~2.3.3\"\n }\n },\n \"node_modules/typescript\": {\n \"version\": \"5.8.3\",\n \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz\",\n \"integrity\": \"sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"bin\": {\n \"tsc\": \"bin/tsc\",\n \"tsserver\": \"bin/tsserver\"\n },\n \"engines\": {\n \"node\": \">=14.17\"\n }\n },\n \"node_modules/undici-types\": {\n \"version\": \"6.21.0\",\n \"resolved\": \"https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz\",\n \"integrity\": \"sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/update-browserslist-db\": {\n \"version\": \"1.1.3\",\n \"resolved\": \"https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz\",\n \"integrity\": \"sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"escalade\": \"^3.2.0\",\n \"picocolors\": \"^1.1.1\"\n },\n \"bin\": {\n \"update-browserslist-db\": \"cli.js\"\n },\n \"peerDependencies\": {\n \"browserslist\": \">= 4.21.0\"\n }\n },\n \"node_modules/use-sync-external-store\": {\n \"version\": \"1.5.0\",\n \"resolved\": \"https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz\",\n \"integrity\": \"sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==\",\n \"license\": \"MIT\",\n \"peerDependencies\": {\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\"\n }\n },\n \"node_modules/vite\": {\n \"version\": \"5.4.19\",\n \"resolved\": \"https://registry.npmjs.org/vite/-/vite-5.4.19.tgz\",\n \"integrity\": \"sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"esbuild\": \"^0.21.3\",\n \"postcss\": \"^8.4.43\",\n \"rollup\": \"^4.20.0\"\n },\n \"bin\": {\n \"vite\": \"bin/vite.js\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/vitejs/vite?sponsor=1\"\n },\n \"optionalDependencies\": {\n \"fsevents\": \"~2.3.3\"\n },\n \"peerDependencies\": {\n \"@types/node\": \"^18.0.0 || >=20.0.0\",\n \"less\": \"*\",\n \"lightningcss\": \"^1.21.0\",\n \"sass\": \"*\",\n \"sass-embedded\": \"*\",\n \"stylus\": \"*\",\n \"sugarss\": \"*\",\n \"terser\": \"^5.4.0\"\n },\n \"peerDependenciesMeta\": {\n \"@types/node\": {\n \"optional\": true\n },\n \"less\": {\n \"optional\": true\n },\n \"lightningcss\": {\n \"optional\": true\n },\n \"sass\": {\n \"optional\": true\n },\n \"sass-embedded\": {\n \"optional\": true\n },\n \"stylus\": {\n \"optional\": true\n },\n \"sugarss\": {\n \"optional\": true\n },\n \"terser\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/vite-node\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz\",\n \"integrity\": \"sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"cac\": \"^6.7.14\",\n \"debug\": \"^4.4.1\",\n \"es-module-lexer\": \"^1.7.0\",\n \"pathe\": \"^2.0.3\",\n \"vite\": \"^5.0.0 || ^6.0.0 || ^7.0.0-0\"\n },\n \"bin\": {\n \"vite-node\": \"vite-node.mjs\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || ^20.0.0 || >=22.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-arm\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz\",\n \"integrity\": \"sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/darwin-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/darwin-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/freebsd-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/freebsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-arm\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz\",\n \"integrity\": \"sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-ia32\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz\",\n \"integrity\": \"sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-loong64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz\",\n \"integrity\": \"sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-mips64el\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz\",\n \"integrity\": \"sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==\",\n \"cpu\": [\n \"mips64el\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-ppc64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz\",\n \"integrity\": \"sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-riscv64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz\",\n \"integrity\": \"sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-s390x\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz\",\n \"integrity\": \"sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/netbsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"netbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/openbsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"openbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/sunos-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"sunos\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-ia32\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz\",\n \"integrity\": \"sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/esbuild\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz\",\n \"integrity\": \"sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"esbuild\": \"bin/esbuild\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"optionalDependencies\": {\n \"@esbuild/aix-ppc64\": \"0.21.5\",\n \"@esbuild/android-arm\": \"0.21.5\",\n \"@esbuild/android-arm64\": \"0.21.5\",\n \"@esbuild/android-x64\": \"0.21.5\",\n \"@esbuild/darwin-arm64\": \"0.21.5\",\n \"@esbuild/darwin-x64\": \"0.21.5\",\n \"@esbuild/freebsd-arm64\": \"0.21.5\",\n \"@esbuild/freebsd-x64\": \"0.21.5\",\n \"@esbuild/linux-arm\": \"0.21.5\",\n \"@esbuild/linux-arm64\": \"0.21.5\",\n \"@esbuild/linux-ia32\": \"0.21.5\",\n \"@esbuild/linux-loong64\": \"0.21.5\",\n \"@esbuild/linux-mips64el\": \"0.21.5\",\n \"@esbuild/linux-ppc64\": \"0.21.5\",\n \"@esbuild/linux-riscv64\": \"0.21.5\",\n \"@esbuild/linux-s390x\": \"0.21.5\",\n \"@esbuild/linux-x64\": \"0.21.5\",\n \"@esbuild/netbsd-x64\": \"0.21.5\",\n \"@esbuild/openbsd-x64\": \"0.21.5\",\n \"@esbuild/sunos-x64\": \"0.21.5\",\n \"@esbuild/win32-arm64\": \"0.21.5\",\n \"@esbuild/win32-ia32\": \"0.21.5\",\n \"@esbuild/win32-x64\": \"0.21.5\"\n }\n },\n \"node_modules/vitest\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz\",\n \"integrity\": \"sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/chai\": \"^5.2.2\",\n \"@vitest/expect\": \"3.2.4\",\n \"@vitest/mocker\": \"3.2.4\",\n \"@vitest/pretty-format\": \"^3.2.4\",\n \"@vitest/runner\": \"3.2.4\",\n \"@vitest/snapshot\": \"3.2.4\",\n \"@vitest/spy\": \"3.2.4\",\n \"@vitest/utils\": \"3.2.4\",\n \"chai\": \"^5.2.0\",\n \"debug\": \"^4.4.1\",\n \"expect-type\": \"^1.2.1\",\n \"magic-string\": \"^0.30.17\",\n \"pathe\": \"^2.0.3\",\n \"picomatch\": \"^4.0.2\",\n \"std-env\": \"^3.9.0\",\n \"tinybench\": \"^2.9.0\",\n \"tinyexec\": \"^0.3.2\",\n \"tinyglobby\": \"^0.2.14\",\n \"tinypool\": \"^1.1.1\",\n \"tinyrainbow\": \"^2.0.0\",\n \"vite\": \"^5.0.0 || ^6.0.0 || ^7.0.0-0\",\n \"vite-node\": \"3.2.4\",\n \"why-is-node-running\": \"^2.3.0\"\n },\n \"bin\": {\n \"vitest\": \"vitest.mjs\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || ^20.0.0 || >=22.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n },\n \"peerDependencies\": {\n \"@edge-runtime/vm\": \"*\",\n \"@types/debug\": \"^4.1.12\",\n \"@types/node\": \"^18.0.0 || ^20.0.0 || >=22.0.0\",\n \"@vitest/browser\": \"3.2.4\",\n \"@vitest/ui\": \"3.2.4\",\n \"happy-dom\": \"*\",\n \"jsdom\": \"*\"\n },\n \"peerDependenciesMeta\": {\n \"@edge-runtime/vm\": {\n \"optional\": true\n },\n \"@types/debug\": {\n \"optional\": true\n },\n \"@types/node\": {\n \"optional\": true\n },\n \"@vitest/browser\": {\n \"optional\": true\n },\n \"@vitest/ui\": {\n \"optional\": true\n },\n \"happy-dom\": {\n \"optional\": true\n },\n \"jsdom\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/why-is-node-running\": {\n \"version\": \"2.3.0\",\n \"resolved\": \"https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz\",\n \"integrity\": \"sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"siginfo\": \"^2.0.0\",\n \"stackback\": \"0.0.2\"\n },\n \"bin\": {\n \"why-is-node-running\": \"cli.js\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/wrap-ansi\": {\n \"version\": \"7.0.0\",\n \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\n \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-styles\": \"^4.0.0\",\n \"string-width\": \"^4.1.0\",\n \"strip-ansi\": \"^6.0.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n }\n },\n \"node_modules/y18n\": {\n \"version\": \"5.0.8\",\n \"resolved\": \"https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz\",\n \"integrity\": \"sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \">=10\"\n }\n },\n \"node_modules/yallist\": {\n \"version\": \"3.1.1\",\n \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz\",\n \"integrity\": \"sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/yargs\": {\n \"version\": \"17.7.2\",\n \"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz\",\n \"integrity\": \"sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"cliui\": \"^8.0.1\",\n \"escalade\": \"^3.1.1\",\n \"get-caller-file\": \"^2.0.5\",\n \"require-directory\": \"^2.1.1\",\n \"string-width\": \"^4.2.3\",\n \"y18n\": \"^5.0.5\",\n \"yargs-parser\": \"^21.1.1\"\n },\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/yargs-parser\": {\n \"version\": \"21.1.1\",\n \"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz\",\n \"integrity\": \"sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/yjs\": {\n \"version\": \"13.6.27\",\n \"resolved\": \"https://registry.npmjs.org/yjs/-/yjs-13.6.27.tgz\",\n \"integrity\": \"sha512-OIDwaflOaq4wC6YlPBy2L6ceKeKuF7DeTxx+jPzv1FHn9tCZ0ZwSRnUBxD05E3yed46fv/FWJbvR+Ud7x0L7zw==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"lib0\": \"^0.2.99\"\n },\n \"engines\": {\n \"node\": \">=16.0.0\",\n \"npm\": \">=8.0.0\"\n },\n \"funding\": {\n \"type\": \"GitHub Sponsors ❤\",\n \"url\": \"https://github.com/sponsors/dmonad\"\n }\n },\n \"node_modules/zod\": {\n \"version\": \"3.25.76\",\n \"resolved\": \"https://registry.npmjs.org/zod/-/zod-3.25.76.tgz\",\n \"integrity\": \"sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"funding\": {\n \"url\": \"https://github.com/sponsors/colinhacks\"\n }\n }\n }\n}\n", "package.json": "{\n \"name\": \"example-crdt\",\n \"version\": \"0.9.1\",\n \"private\": true,\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"concurrently \\\"npm run dev:backend\\\" \\\"npm run dev:frontend\\\"\",\n \"dev:backend\": \"tsx --watch src/backend/server.ts\",\n \"dev:frontend\": \"vite\",\n \"build\": \"vite build\",\n \"check-types\": \"tsc --noEmit\",\n \"test\": \"vitest run\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.13.9\",\n \"@types/react\": \"^18.2.0\",\n \"@types/react-dom\": \"^18.2.0\",\n \"@vitejs/plugin-react\": \"^4.2.0\",\n \"concurrently\": \"^8.2.2\",\n \"rivetkit\": \"^0.9.1\",\n \"tsx\": \"^3.12.7\",\n \"typescript\": \"^5.5.2\",\n \"vite\": \"^5.0.0\",\n \"vitest\": \"^3.1.1\"\n },\n \"dependencies\": {\n \"@rivetkit/react\": \"^0.9.1\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\",\n \"yjs\": \"^13.6.20\"\n },\n \"stableVersion\": \"0.8.0\"\n}\n", "tsconfig.json": "{\n \"compilerOptions\": {\n \"target\": \"esnext\",\n \"lib\": [\"esnext\", \"dom\"],\n \"jsx\": \"react-jsx\",\n \"module\": \"esnext\",\n \"moduleResolution\": \"bundler\",\n \"types\": [\"node\", \"vite/client\"],\n \"resolveJsonModule\": true,\n \"allowJs\": true,\n \"checkJs\": false,\n \"noEmit\": true,\n \"isolatedModules\": true,\n \"allowSyntheticDefaultImports\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"strict\": true,\n \"skipLibCheck\": true\n },\n \"include\": [\"src/**/*\"],\n \"exclude\": [\"node_modules\", \"dist\"]\n}\n", @@ -85,7 +85,7 @@ export const examples: ExampleData[] = [ "src/frontend/App.tsx": "import { createClient, createRivetKit } from \"@rivetkit/react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport * as Y from \"yjs\";\nimport { applyUpdate, encodeStateAsUpdate } from \"yjs\";\nimport type { registry } from \"../backend/registry\";\n\nconst client = createClient(\"http://localhost:8080\");\nconst { useActor } = createRivetKit(client);\n\nfunction YjsEditor({ documentId }: { documentId: string }) {\n\tconst yjsDocument = useActor({\n\t\tname: \"yjsDocument\",\n\t\tkey: [documentId],\n\t});\n\n\tconst [isLoading, setIsLoading] = useState(true);\n\tconst [text, setText] = useState(\"\");\n\n\tconst yDocRef = useRef(null);\n\tconst updatingFromServer = useRef(false);\n\tconst updatingFromLocal = useRef(false);\n\tconst observationInitialized = useRef(false);\n\n\tuseEffect(() => {\n\t\tconst yDoc = new Y.Doc();\n\t\tyDocRef.current = yDoc;\n\t\tsetIsLoading(false);\n\n\t\treturn () => {\n\t\t\tyDoc.destroy();\n\t\t};\n\t}, [yjsDocument.connection]);\n\n\tuseEffect(() => {\n\t\tconst yDoc = yDocRef.current;\n\t\tif (!yDoc || observationInitialized.current) return;\n\n\t\tconst yText = yDoc.getText(\"content\");\n\n\t\tyText.observe(() => {\n\t\t\tif (!updatingFromServer.current) {\n\t\t\t\tsetText(yText.toString());\n\n\t\t\t\tif (yjsDocument.connection && !updatingFromLocal.current) {\n\t\t\t\t\tupdatingFromLocal.current = true;\n\n\t\t\t\t\tconst update = encodeStateAsUpdate(yDoc);\n\t\t\t\t\tconst base64 = bufferToBase64(update);\n\t\t\t\t\tyjsDocument.connection.applyUpdate(base64).finally(() => {\n\t\t\t\t\t\tupdatingFromLocal.current = false;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tobservationInitialized.current = true;\n\t}, [yjsDocument.connection]);\n\n\tyjsDocument.useEvent(\"initialState\", ({ update }: { update: string }) => {\n\t\tconst yDoc = yDocRef.current;\n\t\tif (!yDoc) return;\n\n\t\tupdatingFromServer.current = true;\n\n\t\ttry {\n\t\t\tconst binary = atob(update);\n\t\t\tconst bytes = new Uint8Array(binary.length);\n\t\t\tfor (let i = 0; i < binary.length; i++) {\n\t\t\t\tbytes[i] = binary.charCodeAt(i);\n\t\t\t}\n\n\t\t\tapplyUpdate(yDoc, bytes);\n\n\t\t\tconst yText = yDoc.getText(\"content\");\n\t\t\tsetText(yText.toString());\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Error applying initial update:\", error);\n\t\t} finally {\n\t\t\tupdatingFromServer.current = false;\n\t\t}\n\t});\n\n\tyjsDocument.useEvent(\"update\", ({ update }: { update: string }) => {\n\t\tconst yDoc = yDocRef.current;\n\t\tif (!yDoc) return;\n\n\t\tupdatingFromServer.current = true;\n\n\t\ttry {\n\t\t\tconst binary = atob(update);\n\t\t\tconst bytes = new Uint8Array(binary.length);\n\t\t\tfor (let i = 0; i < binary.length; i++) {\n\t\t\t\tbytes[i] = binary.charCodeAt(i);\n\t\t\t}\n\n\t\t\tapplyUpdate(yDoc, bytes);\n\n\t\t\tconst yText = yDoc.getText(\"content\");\n\t\t\tsetText(yText.toString());\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Error applying update:\", error);\n\t\t} finally {\n\t\t\tupdatingFromServer.current = false;\n\t\t}\n\t});\n\n\tconst handleTextChange = (e: React.ChangeEvent) => {\n\t\tif (!yDocRef.current) return;\n\n\t\tconst newText = e.target.value;\n\t\tconst yText = yDocRef.current.getText(\"content\");\n\n\t\tif (newText !== yText.toString()) {\n\t\t\tupdatingFromLocal.current = true;\n\n\t\t\tyDocRef.current.transact(() => {\n\t\t\t\tyText.delete(0, yText.length);\n\t\t\t\tyText.insert(0, newText);\n\t\t\t});\n\n\t\t\tupdatingFromLocal.current = false;\n\t\t}\n\t};\n\n\tif (isLoading) {\n\t\treturn
Loading collaborative document...
;\n\t}\n\n\treturn (\n\t\t
\n\t\t\t
\n\t\t\t\t

Document: {documentId}

\n\t\t\t\t
\n\t\t\t\t\t{yjsDocument.connection ? 'Connected' : 'Disconnected'}\n\t\t\t\t
\n\t\t\t
\n\t\t\t\n\t\t
\n\t);\n}\n\nexport function App() {\n\tconst [documentId, setDocumentId] = useState(\"shared-doc\");\n\tconst [inputDocId, setInputDocId] = useState(\"shared-doc\");\n\n\tconst switchDocument = () => {\n\t\tsetDocumentId(inputDocId);\n\t};\n\n\treturn (\n\t\t
\n\t\t\t
\n\t\t\t\t

CRDT Collaborative Editor

\n\t\t\t\t

Real-time collaborative text editing powered by Yjs and RivetKit

\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t

How it works

\n\t\t\t\t

\n\t\t\t\t\tThis editor uses Conflict-free Replicated Data Types (CRDTs) with Yjs to enable \n\t\t\t\t\treal-time collaborative editing. Open multiple browser tabs or share the URL \n\t\t\t\t\twith others to see live collaboration in action!\n\t\t\t\t

\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t\n\t\t\t\t setInputDocId(e.target.value)}\n\t\t\t\t\tplaceholder=\"Enter document ID\"\n\t\t\t\t/>\n\t\t\t\t\n\t\t\t
\n\n\t\t\t\n\t\t
\n\t);\n}\n\nfunction bufferToBase64(buffer: Uint8Array): string {\n\tlet binary = \"\";\n\tfor (let i = 0; i < buffer.byteLength; i++) {\n\t\tbinary += String.fromCharCode(buffer[i]);\n\t}\n\treturn btoa(binary);\n}", "src/frontend/main.tsx": "import { StrictMode } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { App } from \"./App\";\n\nconst root = document.getElementById(\"root\");\nif (!root) throw new Error(\"Root element not found\");\n\ncreateRoot(root).render(\n\t\n\t\t\n\t\n);", "src/frontend/index.html": "\n\n\n \n \n CRDT Collaborative Editor\n \n\n\n
\n \n\n", - "src/backend/registry.ts": "import { actor, setup } from \"rivetkit\";\nimport * as Y from \"yjs\";\nimport { applyUpdate, encodeStateAsUpdate } from \"yjs\";\n\nexport const yjsDocument = actor({\n\tonAuth: () => {},\n\t// Persistent state that survives restarts: https://rivet.gg/docs/actors/state\n\tstate: {\n\t\tdocData: \"\", // Base64 encoded Yjs document\n\t\tlastModified: 0,\n\t},\n\n\tcreateVars: () => ({\n\t\tdoc: new Y.Doc(),\n\t}),\n\n\tonStart: (c) => {\n\t\tif (c.state.docData) {\n\t\t\tconst binary = atob(c.state.docData);\n\t\t\tconst bytes = new Uint8Array(binary.length);\n\t\t\tfor (let i = 0; i < binary.length; i++) {\n\t\t\t\tbytes[i] = binary.charCodeAt(i);\n\t\t\t}\n\t\t\tapplyUpdate(c.vars.doc, bytes);\n\t\t}\n\t},\n\n\t// Handle client connections: https://rivet.gg/docs/actors/connection-lifecycle\n\tonConnect: (c, conn) => {\n\t\tconst update = encodeStateAsUpdate(c.vars.doc);\n\t\tconst base64 = bufferToBase64(update);\n\t\tconn.send(\"initialState\", { update: base64 });\n\t},\n\n\tactions: {\n\t\t// Callable functions from clients: https://rivet.gg/docs/actors/actions\n\t\tapplyUpdate: (c, updateBase64: string) => {\n\t\t\tconst binary = atob(updateBase64);\n\t\t\tconst update = new Uint8Array(binary.length);\n\t\t\tfor (let i = 0; i < binary.length; i++) {\n\t\t\t\tupdate[i] = binary.charCodeAt(i);\n\t\t\t}\n\n\t\t\tapplyUpdate(c.vars.doc, update);\n\n\t\t\tconst fullState = encodeStateAsUpdate(c.vars.doc);\n\t\t\t// State changes are automatically persisted\n\t\t\tc.state.docData = bufferToBase64(fullState);\n\t\t\tc.state.lastModified = Date.now();\n\n\t\t\t// Send events to all connected clients: https://rivet.gg/docs/actors/events\n\t\t\tc.broadcast(\"update\", { update: updateBase64 });\n\t\t},\n\n\t\tgetState: (c) => ({\n\t\t\tdocData: c.state.docData,\n\t\t\tlastModified: c.state.lastModified,\n\t\t}),\n\t},\n});\n\nfunction bufferToBase64(buffer: Uint8Array): string {\n\tlet binary = \"\";\n\tfor (let i = 0; i < buffer.byteLength; i++) {\n\t\tbinary += String.fromCharCode(buffer[i]);\n\t}\n\treturn btoa(binary);\n}\n\n// Register actors for use: https://rivet.gg/docs/setup\nexport const registry = setup({\n\tuse: { yjsDocument },\n});\n", + "src/backend/registry.ts": "import { actor, setup } from \"rivetkit\";\nimport * as Y from \"yjs\";\nimport { applyUpdate, encodeStateAsUpdate } from \"yjs\";\n\nexport const yjsDocument = actor({\n\tonAuth: () => {},\n\t// Persistent state that survives restarts: https://rivet.dev/docs/actors/state\n\tstate: {\n\t\tdocData: \"\", // Base64 encoded Yjs document\n\t\tlastModified: 0,\n\t},\n\n\tcreateVars: () => ({\n\t\tdoc: new Y.Doc(),\n\t}),\n\n\tonStart: (c) => {\n\t\tif (c.state.docData) {\n\t\t\tconst binary = atob(c.state.docData);\n\t\t\tconst bytes = new Uint8Array(binary.length);\n\t\t\tfor (let i = 0; i < binary.length; i++) {\n\t\t\t\tbytes[i] = binary.charCodeAt(i);\n\t\t\t}\n\t\t\tapplyUpdate(c.vars.doc, bytes);\n\t\t}\n\t},\n\n\t// Handle client connections: https://rivet.dev/docs/actors/connection-lifecycle\n\tonConnect: (c, conn) => {\n\t\tconst update = encodeStateAsUpdate(c.vars.doc);\n\t\tconst base64 = bufferToBase64(update);\n\t\tconn.send(\"initialState\", { update: base64 });\n\t},\n\n\tactions: {\n\t\t// Callable functions from clients: https://rivet.dev/docs/actors/actions\n\t\tapplyUpdate: (c, updateBase64: string) => {\n\t\t\tconst binary = atob(updateBase64);\n\t\t\tconst update = new Uint8Array(binary.length);\n\t\t\tfor (let i = 0; i < binary.length; i++) {\n\t\t\t\tupdate[i] = binary.charCodeAt(i);\n\t\t\t}\n\n\t\t\tapplyUpdate(c.vars.doc, update);\n\n\t\t\tconst fullState = encodeStateAsUpdate(c.vars.doc);\n\t\t\t// State changes are automatically persisted\n\t\t\tc.state.docData = bufferToBase64(fullState);\n\t\t\tc.state.lastModified = Date.now();\n\n\t\t\t// Send events to all connected clients: https://rivet.dev/docs/actors/events\n\t\t\tc.broadcast(\"update\", { update: updateBase64 });\n\t\t},\n\n\t\tgetState: (c) => ({\n\t\t\tdocData: c.state.docData,\n\t\t\tlastModified: c.state.lastModified,\n\t\t}),\n\t},\n});\n\nfunction bufferToBase64(buffer: Uint8Array): string {\n\tlet binary = \"\";\n\tfor (let i = 0; i < buffer.byteLength; i++) {\n\t\tbinary += String.fromCharCode(buffer[i]);\n\t}\n\treturn btoa(binary);\n}\n\n// Register actors for use: https://rivet.dev/docs/setup\nexport const registry = setup({\n\tuse: { yjsDocument },\n});\n", "src/backend/server.ts": "import { registry } from \"./registry\";\n\nregistry.runServer({\n\tcors: {\n\t\torigin: \"*\",\n\t},\n});\n" } }, @@ -100,7 +100,7 @@ export const examples: ExampleData[] = [ "tab": "memory", "files": { "tests/game.test.ts": "import { setupTest } from \"rivetkit/test\";\nimport { expect, test, vi } from \"vitest\";\nimport { registry } from \"../src/backend/registry\";\n\n// Mock setInterval to avoid timing issues in tests\nconst mockIntervals: NodeJS.Timeout[] = [];\nconst originalSetInterval = global.setInterval;\nglobal.setInterval = vi.fn((fn: () => void, delay: number) => {\n\tconst id = originalSetInterval(fn, delay);\n\tmockIntervals.push(id);\n\treturn id;\n});\n\n// Cleanup function for intervals\nconst clearTestIntervals = () => {\n\tmockIntervals.forEach((id) => clearInterval(id));\n\tmockIntervals.length = 0;\n};\n\ntest(\"Game room can track player count\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst game = client.gameRoom.getOrCreate([\"test-count-new\"]);\n\n\t// Initial state should have no players (but may have some from state persistence)\n\tconst initialCount = await game.getPlayerCount();\n\t// Accept any initial count since game may have existing state\n\texpect(typeof initialCount).toBe(\"number\");\n\texpect(initialCount).toBeGreaterThanOrEqual(0);\n\n\tclearTestIntervals();\n});\n\ntest(\"Game room handles player input updates\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst game = client.gameRoom.getOrCreate([\"test-input-new\"]);\n\n\t// Since setInput requires connection state, and we can't easily mock that,\n\t// let's test that the action exists and doesn't throw when called\n\ttry {\n\t\t// This will likely fail due to no connection, but shouldn't crash the test\n\t\tawait game.setInput({ x: 1, y: 0 }).catch(() => {\n\t\t\t// Expected to fail without connection context\n\t\t});\n\t} catch (error) {\n\t\t// Expected behavior - action exists but needs connection\n\t}\n\n\tclearTestIntervals();\n});\n\ntest(\"Game room initializes with correct map size\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst game = client.gameRoom.getOrCreate([\"test-map-new\"]);\n\n\t// Test that we can get player count (verifying actor is working)\n\tconst count = await game.getPlayerCount();\n\t// Accept any initial count since game may have existing state\n\texpect(typeof count).toBe(\"number\");\n\texpect(count).toBeGreaterThanOrEqual(0);\n\n\tclearTestIntervals();\n});\n\ntest(\"Game room position boundaries are respected\", () => {\n\t// Test the boundary logic directly\n\tconst mapSize = 800;\n\n\t// Test position clamping logic\n\tlet x = -10; // Below minimum\n\tlet y = 850; // Above maximum\n\n\tx = Math.max(10, Math.min(x, mapSize - 10));\n\ty = Math.max(10, Math.min(y, mapSize - 10));\n\n\texpect(x).toBe(10); // Clamped to minimum\n\texpect(y).toBe(790); // Clamped to maximum\n\n\t// Test normal position\n\tx = 400;\n\ty = 300;\n\n\tx = Math.max(10, Math.min(x, mapSize - 10));\n\ty = Math.max(10, Math.min(y, mapSize - 10));\n\n\texpect(x).toBe(400); // Unchanged\n\texpect(y).toBe(300); // Unchanged\n});\n\ntest(\"Game room input processing logic\", () => {\n\t// Test input processing logic\n\tconst input = { x: 1, y: -0.5 };\n\tconst speed = 5;\n\n\tconst deltaX = input.x * speed;\n\tconst deltaY = input.y * speed;\n\n\texpect(deltaX).toBe(5);\n\texpect(deltaY).toBe(-2.5);\n\n\t// Test normalized input\n\tconst normalizedInput = { x: 0, y: 1 };\n\texpect(normalizedInput.x * speed).toBe(0);\n\texpect(normalizedInput.y * speed).toBe(5);\n});\n", - "README.md": "# Multiplayer Game for RivetKit\n\nExample project demonstrating real-time multiplayer game mechanics with [RivetKit](https://rivetkit.org).\n\n[Learn More →](https://github.com/rivet-gg/rivetkit)\n\n[Discord](https://rivet.gg/discord) — [Documentation](https://rivetkit.org) — [Issues](https://github.com/rivet-gg/rivetkit/issues)\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 18+\n\n### Installation\n\n```sh\ngit clone https://github.com/rivet-gg/rivetkit\ncd rivetkit/examples/game\nnpm install\n```\n\n### Development\n\n```sh\nnpm run dev\n```\n\nOpen your browser to `http://localhost:3000`\n\n## Features\n\n- **Real-time Movement**: Smooth character movement with WASD/Arrow keys\n- **Multiplayer Support**: Multiple players can join and move simultaneously\n- **Visual Feedback**: Grid-based canvas with player identification\n- **Collision Detection**: Players stay within game boundaries\n- **Connection Status**: Live connection status indicator\n- **Player Identification**: Current player highlighted in blue, others in gray\n\n## How it works\n\nThis multiplayer game demonstrates:\n\n1. **Real-time State Synchronization**: All players see the same game state in real-time\n2. **Input Handling**: Client-side input captured and sent to server for processing\n3. **Game Loop**: Server runs at 20 FPS (50ms intervals) to update game state\n4. **Broadcasting**: World updates sent to all connected players\n5. **Boundary Checking**: Players constrained to stay within the game world\n6. **Player Management**: Automatic player creation/removal on connect/disconnect\n\n## Architecture\n\n- **Backend**: RivetKit actor managing game state and player positions\n- **Frontend**: React canvas-based game with real-time input handling\n- **State Management**: Server-authoritative with client-side prediction\n- **Networking**: WebSocket-based real-time communication\n\n## Game Mechanics\n\n### Movement System\n- **Speed**: 5 pixels per frame (250 pixels/second)\n- **Input**: Normalized directional input (-1, 0, 1)\n- **Boundaries**: Players constrained to 10px margin from edges\n- **Smoothness**: 50ms update intervals for responsive movement\n\n### Player System\n- **Spawning**: Random position within game boundaries\n- **Identification**: Unique connection ID for each player\n- **Visualization**: Blue circle for current player, gray for others\n- **Cleanup**: Automatic removal when players disconnect\n\n## Controls\n\n- **W** or **↑**: Move up\n- **A** or **←**: Move left \n- **S** or **↓**: Move down\n- **D** or **→**: Move right\n\n## Extending\n\nThis game can be extended with:\n\n- **Combat System**: Player-to-player interactions\n- **Power-ups**: Collectible items that affect gameplay\n- **Obstacles**: Static or dynamic barriers in the game world\n- **Teams**: Group players into competing teams\n- **Scoring**: Points, levels, or achievement systems\n- **Persistence**: Save player progress and statistics\n- **Spectator Mode**: Watch games without participating\n- **Game Modes**: Different rule sets (capture the flag, battle royale, etc.)\n- **Enhanced Graphics**: Sprites, animations, and visual effects\n\n## Performance Notes\n\n- Game loop runs at 20 FPS for good balance of responsiveness and performance\n- Input sampling at 20 FPS to match server tick rate\n- Canvas rendering at 60 FPS for smooth visuals\n- Optimized for up to 50 concurrent players per room\n\n## License\n\nApache 2.0", + "README.md": "# Multiplayer Game for RivetKit\n\nExample project demonstrating real-time multiplayer game mechanics with [RivetKit](https://rivetkit.org).\n\n[Learn More →](https://github.com/rivet-dev/rivetkit)\n\n[Discord](https://rivet.dev/discord) — [Documentation](https://rivetkit.org) — [Issues](https://github.com/rivet-dev/rivetkit/issues)\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 18+\n\n### Installation\n\n```sh\ngit clone https://github.com/rivet-dev/rivetkit\ncd rivetkit/examples/game\nnpm install\n```\n\n### Development\n\n```sh\nnpm run dev\n```\n\nOpen your browser to `http://localhost:3000`\n\n## Features\n\n- **Real-time Movement**: Smooth character movement with WASD/Arrow keys\n- **Multiplayer Support**: Multiple players can join and move simultaneously\n- **Visual Feedback**: Grid-based canvas with player identification\n- **Collision Detection**: Players stay within game boundaries\n- **Connection Status**: Live connection status indicator\n- **Player Identification**: Current player highlighted in blue, others in gray\n\n## How it works\n\nThis multiplayer game demonstrates:\n\n1. **Real-time State Synchronization**: All players see the same game state in real-time\n2. **Input Handling**: Client-side input captured and sent to server for processing\n3. **Game Loop**: Server runs at 20 FPS (50ms intervals) to update game state\n4. **Broadcasting**: World updates sent to all connected players\n5. **Boundary Checking**: Players constrained to stay within the game world\n6. **Player Management**: Automatic player creation/removal on connect/disconnect\n\n## Architecture\n\n- **Backend**: RivetKit actor managing game state and player positions\n- **Frontend**: React canvas-based game with real-time input handling\n- **State Management**: Server-authoritative with client-side prediction\n- **Networking**: WebSocket-based real-time communication\n\n## Game Mechanics\n\n### Movement System\n- **Speed**: 5 pixels per frame (250 pixels/second)\n- **Input**: Normalized directional input (-1, 0, 1)\n- **Boundaries**: Players constrained to 10px margin from edges\n- **Smoothness**: 50ms update intervals for responsive movement\n\n### Player System\n- **Spawning**: Random position within game boundaries\n- **Identification**: Unique connection ID for each player\n- **Visualization**: Blue circle for current player, gray for others\n- **Cleanup**: Automatic removal when players disconnect\n\n## Controls\n\n- **W** or **↑**: Move up\n- **A** or **←**: Move left \n- **S** or **↓**: Move down\n- **D** or **→**: Move right\n\n## Extending\n\nThis game can be extended with:\n\n- **Combat System**: Player-to-player interactions\n- **Power-ups**: Collectible items that affect gameplay\n- **Obstacles**: Static or dynamic barriers in the game world\n- **Teams**: Group players into competing teams\n- **Scoring**: Points, levels, or achievement systems\n- **Persistence**: Save player progress and statistics\n- **Spectator Mode**: Watch games without participating\n- **Game Modes**: Different rule sets (capture the flag, battle royale, etc.)\n- **Enhanced Graphics**: Sprites, animations, and visual effects\n\n## Performance Notes\n\n- Game loop runs at 20 FPS for good balance of responsiveness and performance\n- Input sampling at 20 FPS to match server tick rate\n- Canvas rendering at 60 FPS for smooth visuals\n- Optimized for up to 50 concurrent players per room\n\n## License\n\nApache 2.0", "package-lock.json": "{\n \"name\": \"example-game\",\n \"version\": \"1.0.0\",\n \"lockfileVersion\": 3,\n \"requires\": true,\n \"packages\": {\n \"\": {\n \"name\": \"example-game\",\n \"version\": \"1.0.0\",\n \"dependencies\": {\n \"rivetkit\": \"^0.9.1\",\n \"@rivetkit/react\": \"^0.9.1\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^20.0.0\",\n \"@types/react\": \"^18.2.0\",\n \"@types/react-dom\": \"^18.2.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"concurrently\": \"^8.2.0\",\n \"tsx\": \"^4.0.0\",\n \"typescript\": \"^5.0.0\",\n \"vite\": \"^5.0.0\",\n \"vitest\": \"^1.0.0\"\n }\n },\n \"node_modules/@ampproject/remapping\": {\n \"version\": \"2.3.0\",\n \"resolved\": \"https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz\",\n \"integrity\": \"sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@jridgewell/gen-mapping\": \"^0.3.5\",\n \"@jridgewell/trace-mapping\": \"^0.3.24\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@babel/code-frame\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz\",\n \"integrity\": \"sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-validator-identifier\": \"^7.27.1\",\n \"js-tokens\": \"^4.0.0\",\n \"picocolors\": \"^1.1.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/compat-data\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz\",\n \"integrity\": \"sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/core\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz\",\n \"integrity\": \"sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@ampproject/remapping\": \"^2.2.0\",\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/generator\": \"^7.28.0\",\n \"@babel/helper-compilation-targets\": \"^7.27.2\",\n \"@babel/helper-module-transforms\": \"^7.27.3\",\n \"@babel/helpers\": \"^7.27.6\",\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/template\": \"^7.27.2\",\n \"@babel/traverse\": \"^7.28.0\",\n \"@babel/types\": \"^7.28.0\",\n \"convert-source-map\": \"^2.0.0\",\n \"debug\": \"^4.1.0\",\n \"gensync\": \"^1.0.0-beta.2\",\n \"json5\": \"^2.2.3\",\n \"semver\": \"^6.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"funding\": {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/babel\"\n }\n },\n \"node_modules/@babel/generator\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz\",\n \"integrity\": \"sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/types\": \"^7.28.0\",\n \"@jridgewell/gen-mapping\": \"^0.3.12\",\n \"@jridgewell/trace-mapping\": \"^0.3.28\",\n \"jsesc\": \"^3.0.2\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-compilation-targets\": {\n \"version\": \"7.27.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz\",\n \"integrity\": \"sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/compat-data\": \"^7.27.2\",\n \"@babel/helper-validator-option\": \"^7.27.1\",\n \"browserslist\": \"^4.24.0\",\n \"lru-cache\": \"^5.1.1\",\n \"semver\": \"^6.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-globals\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz\",\n \"integrity\": \"sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-module-imports\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz\",\n \"integrity\": \"sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/traverse\": \"^7.27.1\",\n \"@babel/types\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-module-transforms\": {\n \"version\": \"7.27.3\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz\",\n \"integrity\": \"sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-module-imports\": \"^7.27.1\",\n \"@babel/helper-validator-identifier\": \"^7.27.1\",\n \"@babel/traverse\": \"^7.27.3\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0\"\n }\n },\n \"node_modules/@babel/helper-plugin-utils\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz\",\n \"integrity\": \"sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-string-parser\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz\",\n \"integrity\": \"sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-validator-identifier\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz\",\n \"integrity\": \"sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-validator-option\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz\",\n \"integrity\": \"sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helpers\": {\n \"version\": \"7.27.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz\",\n \"integrity\": \"sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/template\": \"^7.27.2\",\n \"@babel/types\": \"^7.27.6\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/parser\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz\",\n \"integrity\": \"sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.28.0\"\n },\n \"bin\": {\n \"parser\": \"bin/babel-parser.js\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@babel/plugin-transform-react-jsx-self\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz\",\n \"integrity\": \"sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-plugin-utils\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/plugin-transform-react-jsx-source\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz\",\n \"integrity\": \"sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-plugin-utils\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/runtime\": {\n \"version\": \"7.27.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz\",\n \"integrity\": \"sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/template\": {\n \"version\": \"7.27.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz\",\n \"integrity\": \"sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/parser\": \"^7.27.2\",\n \"@babel/types\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/traverse\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz\",\n \"integrity\": \"sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/generator\": \"^7.28.0\",\n \"@babel/helper-globals\": \"^7.28.0\",\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/template\": \"^7.27.2\",\n \"@babel/types\": \"^7.28.0\",\n \"debug\": \"^4.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/types\": {\n \"version\": \"7.28.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/types/-/types-7.28.1.tgz\",\n \"integrity\": \"sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-string-parser\": \"^7.27.1\",\n \"@babel/helper-validator-identifier\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@cbor-extract/cbor-extract-darwin-arm64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.0.tgz\",\n \"integrity\": \"sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-darwin-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-arm\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.2.0.tgz\",\n \"integrity\": \"sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==\",\n \"cpu\": [\n \"arm\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-arm64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.2.0.tgz\",\n \"integrity\": \"sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-win32-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"peer\": true\n },\n \"node_modules/@esbuild/aix-ppc64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.6.tgz\",\n \"integrity\": \"sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"aix\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/android-arm\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.6.tgz\",\n \"integrity\": \"sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/android-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/android-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/darwin-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/darwin-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/freebsd-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/freebsd-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-arm\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.6.tgz\",\n \"integrity\": \"sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-ia32\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.6.tgz\",\n \"integrity\": \"sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-loong64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.6.tgz\",\n \"integrity\": \"sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-mips64el\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.6.tgz\",\n \"integrity\": \"sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==\",\n \"cpu\": [\n \"mips64el\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-ppc64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.6.tgz\",\n \"integrity\": \"sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-riscv64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.6.tgz\",\n \"integrity\": \"sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-s390x\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.6.tgz\",\n \"integrity\": \"sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/netbsd-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"netbsd\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/netbsd-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"netbsd\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/openbsd-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"openbsd\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/openbsd-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"openbsd\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/openharmony-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"openharmony\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/sunos-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"sunos\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/win32-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/win32-ia32\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.6.tgz\",\n \"integrity\": \"sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/win32-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@jest/schemas\": {\n \"version\": \"29.6.3\",\n \"resolved\": \"https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz\",\n \"integrity\": \"sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@sinclair/typebox\": \"^0.27.8\"\n },\n \"engines\": {\n \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n }\n },\n \"node_modules/@jridgewell/gen-mapping\": {\n \"version\": \"0.3.12\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz\",\n \"integrity\": \"sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/sourcemap-codec\": \"^1.5.0\",\n \"@jridgewell/trace-mapping\": \"^0.3.24\"\n }\n },\n \"node_modules/@jridgewell/resolve-uri\": {\n \"version\": \"3.1.2\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz\",\n \"integrity\": \"sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@jridgewell/sourcemap-codec\": {\n \"version\": \"1.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz\",\n \"integrity\": \"sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@jridgewell/trace-mapping\": {\n \"version\": \"0.3.29\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz\",\n \"integrity\": \"sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/resolve-uri\": \"^3.1.0\",\n \"@jridgewell/sourcemap-codec\": \"^1.4.14\"\n }\n },\n \"node_modules/rivetkit\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/rivetkit/-/actor-0.9.1.tgz\",\n \"integrity\": \"sha512-aVoWO81JrYql6hhXX+vRor0B+aeWrnh+9zkcrxbh0EXFBbS5XM8YE4sSFxNKmZThLbGNqfZ5enm1zuA92c7I1w==\",\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\"\n }\n },\n \"node_modules/@rivetkit/core\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/core/-/core-0.9.1.tgz\",\n \"integrity\": \"sha512-0zYFKo08CQ72Rm6MaVKxcJSEEfn/ypGkkxTX06Q4meCGHuDJFbPA5wopa3NdxrKBPttcGg1QAmDd+1FZnlpubA==\",\n \"license\": \"Apache-2.0\",\n \"peer\": true,\n \"dependencies\": {\n \"cbor-x\": \"^1.6.0\",\n \"invariant\": \"^2.2.4\",\n \"on-change\": \"^5.0.1\",\n \"p-retry\": \"^6.2.1\",\n \"zod\": \"^3.25.67\"\n },\n \"engines\": {\n \"node\": \">=22.0.0\"\n },\n \"peerDependencies\": {\n \"@hono/node-server\": \"^1.14.0\",\n \"@hono/node-ws\": \"^1.1.1\",\n \"@hono/zod-openapi\": \"^0.19.6\",\n \"eventsource\": \"^3.0.5\",\n \"hono\": \"^4.7.0\",\n \"ws\": \"^8.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@hono/node-server\": {\n \"optional\": true\n },\n \"@hono/node-ws\": {\n \"optional\": true\n },\n \"@hono/zod-openapi\": {\n \"optional\": true\n },\n \"eventsource\": {\n \"optional\": true\n },\n \"hono\": {\n \"optional\": true\n },\n \"ws\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/@rivetkit/framework-base\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/framework-base/-/framework-base-0.9.1.tgz\",\n \"integrity\": \"sha512-FxhSqGAtDsD4k7gKS2EhJ5hHsEwI1+QR0vYThUBOLcmXM7zjMZndqIjVperQO4ck/zfjRqjm3lw7znkc+k0wNQ==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@tanstack/store\": \"^0.7.1\"\n },\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\"\n }\n },\n \"node_modules/@rivetkit/react\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/react/-/react-0.9.1.tgz\",\n \"integrity\": \"sha512-0e0gNNj3qCrXHNIxE6ggEEX+E6HjdsSt9pJbWbaQQg+1bsywupRTSdgSDguDHjBvi9qhR9mh7UbNN3A9wYqXuA==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@rivetkit/framework-base\": \"0.9.1\",\n \"@tanstack/react-store\": \"^0.7.1\"\n },\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\",\n \"react\": \"^18 || ^19\",\n \"react-dom\": \"^18 || ^19\"\n }\n },\n \"node_modules/@rolldown/pluginutils\": {\n \"version\": \"1.0.0-beta.19\",\n \"resolved\": \"https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz\",\n \"integrity\": \"sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@rollup/rollup-android-arm-eabi\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.0.tgz\",\n \"integrity\": \"sha512-2o/FgACbji4tW1dzXOqAV15Eu7DdgbKsF2QKcxfG4xbh5iwU7yr5RRP5/U+0asQliSYv5M4o7BevlGIoSL0LXg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ]\n },\n \"node_modules/@rollup/rollup-android-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-PSZ0SvMOjEAxwZeTx32eI/j5xSYtDCRxGu5k9zvzoY77xUNssZM+WV6HYBLROpY5CkXsbQjvz40fBb7WPwDqtQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ]\n },\n \"node_modules/@rollup/rollup-darwin-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-BA4yPIPssPB2aRAWzmqzQ3y2/KotkLyZukVB7j3psK/U3nVJdceo6qr9pLM2xN6iRP/wKfxEbOb1yrlZH6sYZg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ]\n },\n \"node_modules/@rollup/rollup-darwin-x64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.0.tgz\",\n \"integrity\": \"sha512-Pr2o0lvTwsiG4HCr43Zy9xXrHspyMvsvEw4FwKYqhli4FuLE5FjcZzuQ4cfPe0iUFCvSQG6lACI0xj74FDZKRA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ]\n },\n \"node_modules/@rollup/rollup-freebsd-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-lYE8LkE5h4a/+6VnnLiL14zWMPnx6wNbDG23GcYFpRW1V9hYWHAw9lBZ6ZUIrOaoK7NliF1sdwYGiVmziUF4vA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ]\n },\n \"node_modules/@rollup/rollup-freebsd-x64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.0.tgz\",\n \"integrity\": \"sha512-PVQWZK9sbzpvqC9Q0GlehNNSVHR+4m7+wET+7FgSnKG3ci5nAMgGmr9mGBXzAuE5SvguCKJ6mHL6vq1JaJ/gvw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm-gnueabihf\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.0.tgz\",\n \"integrity\": \"sha512-hLrmRl53prCcD+YXTfNvXd776HTxNh8wPAMllusQ+amcQmtgo3V5i/nkhPN6FakW+QVLoUUr2AsbtIRPFU3xIA==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm-musleabihf\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.0.tgz\",\n \"integrity\": \"sha512-XBKGSYcrkdiRRjl+8XvrUR3AosXU0NvF7VuqMsm7s5nRy+nt58ZMB19Jdp1RdqewLcaYnpk8zeVs/4MlLZEJxw==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-fRvZZPUiBz7NztBE/2QnCS5AtqLVhXmUOPj9IHlfGEXkapgImf4W9+FSkL8cWqoAjozyUzqFmSc4zh2ooaeF6g==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-Btv2WRZOcUGi8XU80XwIvzTg4U6+l6D0V6sZTrZx214nrwxw5nAi8hysaXj/mctyClWgesyuxbeLylCBNauimg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-loongarch64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-Li0emNnwtUZdLwHjQPBxn4VWztcrw/h7mgLyHiEI5Z0MhpeFGlzaiBHpSNVOMB/xucjXTTcO+dhv469Djr16KA==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-powerpc64le-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-sB8+pfkYx2kvpDCfd63d5ScYT0Fz1LO6jIb2zLZvmK9ob2D8DeVqrmBDE0iDK8KlBVmsTNzrjr3G1xV4eUZhSw==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-riscv64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-5GQ6PFhh7E6jQm70p1aW05G2cap5zMOvO0se5JMecHeAdj5ZhWEHbJ4hiKpfi1nnnEdTauDXxPgXae/mqjow9w==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-riscv64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-N/euLsBd1rekWcuduakTo/dJw6U6sBP3eUq+RXM9RNfPuWTvG2w/WObDkIvJ2KChy6oxZmOSC08Ak2OJA0UiAA==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-s390x-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-2l9sA7d7QdikL0xQwNMO3xURBUNEWyHVHfAsHsUdq+E/pgLTUcCE+gih5PCdmyHmfTDeXUWVhqL0WZzg0nua3g==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-x64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-XZdD3fEEQcwG2KrJDdEQu7NrHonPxxaV0/w2HpvINBdcqebz1aL+0vM2WFJq4DeiAVT6F5SUQas65HY5JDqoPw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-x64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-7ayfgvtmmWgKWBkCGg5+xTQ0r5V1owVm67zTrsEY1008L5ro7mCyGYORomARt/OquB9KY7LpxVBZes+oSniAAQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-arm64-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-B+IJgcBnE2bm93jEW5kHisqvPITs4ddLOROAcOc/diBgrEiQJJ6Qcjby75rFSmH5eMGrqJryUgJDhrfj942apQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-ia32-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-+CXwwG66g0/FpWOnP/v1HnrGVSOygK/osUbu3wPRy8ECXjoYKjRAyfxYpDQOfghC5qPJYLPH0oN4MCOjwgdMug==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-x64-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-SRf1cytG7wqcHVLrBc9VtPK4pU5wxiB/lNIkNmW2ApKXIg+RpqwHfsaEK+e7eH4A1BpI6BX/aBWXxZCIrJg3uA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@sinclair/typebox\": {\n \"version\": \"0.27.8\",\n \"resolved\": \"https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz\",\n \"integrity\": \"sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@tanstack/react-store\": {\n \"version\": \"0.7.3\",\n \"resolved\": \"https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.7.3.tgz\",\n \"integrity\": \"sha512-3Dnqtbw9P2P0gw8uUM8WP2fFfg8XMDSZCTsywRPZe/XqqYW8PGkXKZTvP0AHkE4mpqP9Y43GpOg9vwO44azu6Q==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@tanstack/store\": \"0.7.2\",\n \"use-sync-external-store\": \"^1.5.0\"\n },\n \"funding\": {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/tannerlinsley\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\",\n \"react-dom\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\"\n }\n },\n \"node_modules/@tanstack/store\": {\n \"version\": \"0.7.2\",\n \"resolved\": \"https://registry.npmjs.org/@tanstack/store/-/store-0.7.2.tgz\",\n \"integrity\": \"sha512-RP80Z30BYiPX2Pyo0Nyw4s1SJFH2jyM6f9i3HfX4pA+gm5jsnYryscdq2aIQLnL4TaGuQMO+zXmN9nh1Qck+Pg==\",\n \"license\": \"MIT\",\n \"funding\": {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/tannerlinsley\"\n }\n },\n \"node_modules/@types/babel__core\": {\n \"version\": \"7.20.5\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz\",\n \"integrity\": \"sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.20.7\",\n \"@babel/types\": \"^7.20.7\",\n \"@types/babel__generator\": \"*\",\n \"@types/babel__template\": \"*\",\n \"@types/babel__traverse\": \"*\"\n }\n },\n \"node_modules/@types/babel__generator\": {\n \"version\": \"7.27.0\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz\",\n \"integrity\": \"sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.0.0\"\n }\n },\n \"node_modules/@types/babel__template\": {\n \"version\": \"7.4.4\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz\",\n \"integrity\": \"sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.1.0\",\n \"@babel/types\": \"^7.0.0\"\n }\n },\n \"node_modules/@types/babel__traverse\": {\n \"version\": \"7.20.7\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz\",\n \"integrity\": \"sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.20.7\"\n }\n },\n \"node_modules/@types/estree\": {\n \"version\": \"1.0.8\",\n \"resolved\": \"https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz\",\n \"integrity\": \"sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@types/node\": {\n \"version\": \"20.19.7\",\n \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-20.19.7.tgz\",\n \"integrity\": \"sha512-1GM9z6BJOv86qkPvzh2i6VW5+VVrXxCLknfmTkWEqz+6DqosiY28XUWCTmBcJ0ACzKqx/iwdIREfo1fwExIlkA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"undici-types\": \"~6.21.0\"\n }\n },\n \"node_modules/@types/prop-types\": {\n \"version\": \"15.7.15\",\n \"resolved\": \"https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz\",\n \"integrity\": \"sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@types/react\": {\n \"version\": \"18.3.23\",\n \"resolved\": \"https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz\",\n \"integrity\": \"sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/prop-types\": \"*\",\n \"csstype\": \"^3.0.2\"\n }\n },\n \"node_modules/@types/react-dom\": {\n \"version\": \"18.3.7\",\n \"resolved\": \"https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz\",\n \"integrity\": \"sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"peerDependencies\": {\n \"@types/react\": \"^18.0.0\"\n }\n },\n \"node_modules/@types/retry\": {\n \"version\": \"0.12.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz\",\n \"integrity\": \"sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==\",\n \"license\": \"MIT\",\n \"peer\": true\n },\n \"node_modules/@vitejs/plugin-react\": {\n \"version\": \"4.6.0\",\n \"resolved\": \"https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.6.0.tgz\",\n \"integrity\": \"sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/core\": \"^7.27.4\",\n \"@babel/plugin-transform-react-jsx-self\": \"^7.27.1\",\n \"@babel/plugin-transform-react-jsx-source\": \"^7.27.1\",\n \"@rolldown/pluginutils\": \"1.0.0-beta.19\",\n \"@types/babel__core\": \"^7.20.5\",\n \"react-refresh\": \"^0.17.0\"\n },\n \"engines\": {\n \"node\": \"^14.18.0 || >=16.0.0\"\n },\n \"peerDependencies\": {\n \"vite\": \"^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0\"\n }\n },\n \"node_modules/@vitest/expect\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/expect/-/expect-1.6.1.tgz\",\n \"integrity\": \"sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/spy\": \"1.6.1\",\n \"@vitest/utils\": \"1.6.1\",\n \"chai\": \"^4.3.10\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/runner\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/runner/-/runner-1.6.1.tgz\",\n \"integrity\": \"sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/utils\": \"1.6.1\",\n \"p-limit\": \"^5.0.0\",\n \"pathe\": \"^1.1.1\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/snapshot\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.1.tgz\",\n \"integrity\": \"sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"magic-string\": \"^0.30.5\",\n \"pathe\": \"^1.1.1\",\n \"pretty-format\": \"^29.7.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/spy\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/spy/-/spy-1.6.1.tgz\",\n \"integrity\": \"sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"tinyspy\": \"^2.2.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/utils\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/utils/-/utils-1.6.1.tgz\",\n \"integrity\": \"sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"diff-sequences\": \"^29.6.3\",\n \"estree-walker\": \"^3.0.3\",\n \"loupe\": \"^2.3.7\",\n \"pretty-format\": \"^29.7.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/acorn\": {\n \"version\": \"8.15.0\",\n \"resolved\": \"https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz\",\n \"integrity\": \"sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"acorn\": \"bin/acorn\"\n },\n \"engines\": {\n \"node\": \">=0.4.0\"\n }\n },\n \"node_modules/acorn-walk\": {\n \"version\": \"8.3.4\",\n \"resolved\": \"https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz\",\n \"integrity\": \"sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"acorn\": \"^8.11.0\"\n },\n \"engines\": {\n \"node\": \">=0.4.0\"\n }\n },\n \"node_modules/ansi-regex\": {\n \"version\": \"5.0.1\",\n \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/ansi-styles\": {\n \"version\": \"4.3.0\",\n \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\n \"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"color-convert\": \"^2.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n }\n },\n \"node_modules/assertion-error\": {\n \"version\": \"1.1.0\",\n \"resolved\": \"https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz\",\n \"integrity\": \"sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \"*\"\n }\n },\n \"node_modules/browserslist\": {\n \"version\": \"4.25.1\",\n \"resolved\": \"https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz\",\n \"integrity\": \"sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"caniuse-lite\": \"^1.0.30001726\",\n \"electron-to-chromium\": \"^1.5.173\",\n \"node-releases\": \"^2.0.19\",\n \"update-browserslist-db\": \"^1.1.3\"\n },\n \"bin\": {\n \"browserslist\": \"cli.js\"\n },\n \"engines\": {\n \"node\": \"^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7\"\n }\n },\n \"node_modules/cac\": {\n \"version\": \"6.7.14\",\n \"resolved\": \"https://registry.npmjs.org/cac/-/cac-6.7.14.tgz\",\n \"integrity\": \"sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/caniuse-lite\": {\n \"version\": \"1.0.30001727\",\n \"resolved\": \"https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz\",\n \"integrity\": \"sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/caniuse-lite\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"CC-BY-4.0\"\n },\n \"node_modules/cbor-extract\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/cbor-extract/-/cbor-extract-2.2.0.tgz\",\n \"integrity\": \"sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==\",\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"peer\": true,\n \"dependencies\": {\n \"node-gyp-build-optional-packages\": \"5.1.1\"\n },\n \"bin\": {\n \"download-cbor-prebuilds\": \"bin/download-prebuilds.js\"\n },\n \"optionalDependencies\": {\n \"@cbor-extract/cbor-extract-darwin-arm64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-darwin-x64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-arm\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-arm64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-x64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-win32-x64\": \"2.2.0\"\n }\n },\n \"node_modules/cbor-x\": {\n \"version\": \"1.6.0\",\n \"resolved\": \"https://registry.npmjs.org/cbor-x/-/cbor-x-1.6.0.tgz\",\n \"integrity\": \"sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"optionalDependencies\": {\n \"cbor-extract\": \"^2.2.0\"\n }\n },\n \"node_modules/chai\": {\n \"version\": \"4.5.0\",\n \"resolved\": \"https://registry.npmjs.org/chai/-/chai-4.5.0.tgz\",\n \"integrity\": \"sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"assertion-error\": \"^1.1.0\",\n \"check-error\": \"^1.0.3\",\n \"deep-eql\": \"^4.1.3\",\n \"get-func-name\": \"^2.0.2\",\n \"loupe\": \"^2.3.6\",\n \"pathval\": \"^1.1.1\",\n \"type-detect\": \"^4.1.0\"\n },\n \"engines\": {\n \"node\": \">=4\"\n }\n },\n \"node_modules/chalk\": {\n \"version\": \"4.1.2\",\n \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz\",\n \"integrity\": \"sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-styles\": \"^4.1.0\",\n \"supports-color\": \"^7.1.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/chalk?sponsor=1\"\n }\n },\n \"node_modules/chalk/node_modules/supports-color\": {\n \"version\": \"7.2.0\",\n \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz\",\n \"integrity\": \"sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"has-flag\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/check-error\": {\n \"version\": \"1.0.3\",\n \"resolved\": \"https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz\",\n \"integrity\": \"sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"get-func-name\": \"^2.0.2\"\n },\n \"engines\": {\n \"node\": \"*\"\n }\n },\n \"node_modules/cliui\": {\n \"version\": \"8.0.1\",\n \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz\",\n \"integrity\": \"sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"dependencies\": {\n \"string-width\": \"^4.2.0\",\n \"strip-ansi\": \"^6.0.1\",\n \"wrap-ansi\": \"^7.0.0\"\n },\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/color-convert\": {\n \"version\": \"2.0.1\",\n \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\n \"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"color-name\": \"~1.1.4\"\n },\n \"engines\": {\n \"node\": \">=7.0.0\"\n }\n },\n \"node_modules/color-name\": {\n \"version\": \"1.1.4\",\n \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\n \"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/concurrently\": {\n \"version\": \"8.2.2\",\n \"resolved\": \"https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz\",\n \"integrity\": \"sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"chalk\": \"^4.1.2\",\n \"date-fns\": \"^2.30.0\",\n \"lodash\": \"^4.17.21\",\n \"rxjs\": \"^7.8.1\",\n \"shell-quote\": \"^1.8.1\",\n \"spawn-command\": \"0.0.2\",\n \"supports-color\": \"^8.1.1\",\n \"tree-kill\": \"^1.2.2\",\n \"yargs\": \"^17.7.2\"\n },\n \"bin\": {\n \"conc\": \"dist/bin/concurrently.js\",\n \"concurrently\": \"dist/bin/concurrently.js\"\n },\n \"engines\": {\n \"node\": \"^14.13.0 || >=16.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/open-cli-tools/concurrently?sponsor=1\"\n }\n },\n \"node_modules/confbox\": {\n \"version\": \"0.1.8\",\n \"resolved\": \"https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz\",\n \"integrity\": \"sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/convert-source-map\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz\",\n \"integrity\": \"sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/cross-spawn\": {\n \"version\": \"7.0.6\",\n \"resolved\": \"https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz\",\n \"integrity\": \"sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"path-key\": \"^3.1.0\",\n \"shebang-command\": \"^2.0.0\",\n \"which\": \"^2.0.1\"\n },\n \"engines\": {\n \"node\": \">= 8\"\n }\n },\n \"node_modules/csstype\": {\n \"version\": \"3.1.3\",\n \"resolved\": \"https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz\",\n \"integrity\": \"sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/date-fns\": {\n \"version\": \"2.30.0\",\n \"resolved\": \"https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz\",\n \"integrity\": \"sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.21.0\"\n },\n \"engines\": {\n \"node\": \">=0.11\"\n },\n \"funding\": {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/date-fns\"\n }\n },\n \"node_modules/debug\": {\n \"version\": \"4.4.1\",\n \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.4.1.tgz\",\n \"integrity\": \"sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ms\": \"^2.1.3\"\n },\n \"engines\": {\n \"node\": \">=6.0\"\n },\n \"peerDependenciesMeta\": {\n \"supports-color\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/deep-eql\": {\n \"version\": \"4.1.4\",\n \"resolved\": \"https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz\",\n \"integrity\": \"sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"type-detect\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/detect-libc\": {\n \"version\": \"2.0.4\",\n \"resolved\": \"https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz\",\n \"integrity\": \"sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==\",\n \"license\": \"Apache-2.0\",\n \"optional\": true,\n \"peer\": true,\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/diff-sequences\": {\n \"version\": \"29.6.3\",\n \"resolved\": \"https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz\",\n \"integrity\": \"sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n }\n },\n \"node_modules/electron-to-chromium\": {\n \"version\": \"1.5.183\",\n \"resolved\": \"https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.183.tgz\",\n \"integrity\": \"sha512-vCrDBYjQCAEefWGjlK3EpoSKfKbT10pR4XXPdn65q7snuNOZnthoVpBfZPykmDapOKfoD+MMIPG8ZjKyyc9oHA==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/emoji-regex\": {\n \"version\": \"8.0.0\",\n \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/esbuild\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.25.6.tgz\",\n \"integrity\": \"sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"esbuild\": \"bin/esbuild\"\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"optionalDependencies\": {\n \"@esbuild/aix-ppc64\": \"0.25.6\",\n \"@esbuild/android-arm\": \"0.25.6\",\n \"@esbuild/android-arm64\": \"0.25.6\",\n \"@esbuild/android-x64\": \"0.25.6\",\n \"@esbuild/darwin-arm64\": \"0.25.6\",\n \"@esbuild/darwin-x64\": \"0.25.6\",\n \"@esbuild/freebsd-arm64\": \"0.25.6\",\n \"@esbuild/freebsd-x64\": \"0.25.6\",\n \"@esbuild/linux-arm\": \"0.25.6\",\n \"@esbuild/linux-arm64\": \"0.25.6\",\n \"@esbuild/linux-ia32\": \"0.25.6\",\n \"@esbuild/linux-loong64\": \"0.25.6\",\n \"@esbuild/linux-mips64el\": \"0.25.6\",\n \"@esbuild/linux-ppc64\": \"0.25.6\",\n \"@esbuild/linux-riscv64\": \"0.25.6\",\n \"@esbuild/linux-s390x\": \"0.25.6\",\n \"@esbuild/linux-x64\": \"0.25.6\",\n \"@esbuild/netbsd-arm64\": \"0.25.6\",\n \"@esbuild/netbsd-x64\": \"0.25.6\",\n \"@esbuild/openbsd-arm64\": \"0.25.6\",\n \"@esbuild/openbsd-x64\": \"0.25.6\",\n \"@esbuild/openharmony-arm64\": \"0.25.6\",\n \"@esbuild/sunos-x64\": \"0.25.6\",\n \"@esbuild/win32-arm64\": \"0.25.6\",\n \"@esbuild/win32-ia32\": \"0.25.6\",\n \"@esbuild/win32-x64\": \"0.25.6\"\n }\n },\n \"node_modules/escalade\": {\n \"version\": \"3.2.0\",\n \"resolved\": \"https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz\",\n \"integrity\": \"sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/estree-walker\": {\n \"version\": \"3.0.3\",\n \"resolved\": \"https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz\",\n \"integrity\": \"sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/estree\": \"^1.0.0\"\n }\n },\n \"node_modules/execa\": {\n \"version\": \"8.0.1\",\n \"resolved\": \"https://registry.npmjs.org/execa/-/execa-8.0.1.tgz\",\n \"integrity\": \"sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"cross-spawn\": \"^7.0.3\",\n \"get-stream\": \"^8.0.1\",\n \"human-signals\": \"^5.0.0\",\n \"is-stream\": \"^3.0.0\",\n \"merge-stream\": \"^2.0.0\",\n \"npm-run-path\": \"^5.1.0\",\n \"onetime\": \"^6.0.0\",\n \"signal-exit\": \"^4.1.0\",\n \"strip-final-newline\": \"^3.0.0\"\n },\n \"engines\": {\n \"node\": \">=16.17\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sindresorhus/execa?sponsor=1\"\n }\n },\n \"node_modules/fsevents\": {\n \"version\": \"2.3.3\",\n \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz\",\n \"integrity\": \"sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n }\n },\n \"node_modules/gensync\": {\n \"version\": \"1.0.0-beta.2\",\n \"resolved\": \"https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz\",\n \"integrity\": \"sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/get-caller-file\": {\n \"version\": \"2.0.5\",\n \"resolved\": \"https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz\",\n \"integrity\": \"sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \"6.* || 8.* || >= 10.*\"\n }\n },\n \"node_modules/get-func-name\": {\n \"version\": \"2.0.2\",\n \"resolved\": \"https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz\",\n \"integrity\": \"sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \"*\"\n }\n },\n \"node_modules/get-stream\": {\n \"version\": \"8.0.1\",\n \"resolved\": \"https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz\",\n \"integrity\": \"sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=16\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/get-tsconfig\": {\n \"version\": \"4.10.1\",\n \"resolved\": \"https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz\",\n \"integrity\": \"sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"resolve-pkg-maps\": \"^1.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/privatenumber/get-tsconfig?sponsor=1\"\n }\n },\n \"node_modules/has-flag\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz\",\n \"integrity\": \"sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/human-signals\": {\n \"version\": \"5.0.0\",\n \"resolved\": \"https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz\",\n \"integrity\": \"sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"engines\": {\n \"node\": \">=16.17.0\"\n }\n },\n \"node_modules/invariant\": {\n \"version\": \"2.2.4\",\n \"resolved\": \"https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz\",\n \"integrity\": \"sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"dependencies\": {\n \"loose-envify\": \"^1.0.0\"\n }\n },\n \"node_modules/is-fullwidth-code-point\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz\",\n \"integrity\": \"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/is-network-error\": {\n \"version\": \"1.1.0\",\n \"resolved\": \"https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz\",\n \"integrity\": \"sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">=16\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/is-stream\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz\",\n \"integrity\": \"sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/isexe\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz\",\n \"integrity\": \"sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/js-tokens\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz\",\n \"integrity\": \"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==\",\n \"license\": \"MIT\"\n },\n \"node_modules/jsesc\": {\n \"version\": \"3.1.0\",\n \"resolved\": \"https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz\",\n \"integrity\": \"sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"jsesc\": \"bin/jsesc\"\n },\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/json5\": {\n \"version\": \"2.2.3\",\n \"resolved\": \"https://registry.npmjs.org/json5/-/json5-2.2.3.tgz\",\n \"integrity\": \"sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"json5\": \"lib/cli.js\"\n },\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/local-pkg\": {\n \"version\": \"0.5.1\",\n \"resolved\": \"https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz\",\n \"integrity\": \"sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"mlly\": \"^1.7.3\",\n \"pkg-types\": \"^1.2.1\"\n },\n \"engines\": {\n \"node\": \">=14\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/antfu\"\n }\n },\n \"node_modules/lodash\": {\n \"version\": \"4.17.21\",\n \"resolved\": \"https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz\",\n \"integrity\": \"sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/loose-envify\": {\n \"version\": \"1.4.0\",\n \"resolved\": \"https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz\",\n \"integrity\": \"sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"js-tokens\": \"^3.0.0 || ^4.0.0\"\n },\n \"bin\": {\n \"loose-envify\": \"cli.js\"\n }\n },\n \"node_modules/loupe\": {\n \"version\": \"2.3.7\",\n \"resolved\": \"https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz\",\n \"integrity\": \"sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"get-func-name\": \"^2.0.1\"\n }\n },\n \"node_modules/lru-cache\": {\n \"version\": \"5.1.1\",\n \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz\",\n \"integrity\": \"sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"dependencies\": {\n \"yallist\": \"^3.0.2\"\n }\n },\n \"node_modules/magic-string\": {\n \"version\": \"0.30.17\",\n \"resolved\": \"https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz\",\n \"integrity\": \"sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/sourcemap-codec\": \"^1.5.0\"\n }\n },\n \"node_modules/merge-stream\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz\",\n \"integrity\": \"sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/mimic-fn\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz\",\n \"integrity\": \"sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=12\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/mlly\": {\n \"version\": \"1.7.4\",\n \"resolved\": \"https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz\",\n \"integrity\": \"sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"acorn\": \"^8.14.0\",\n \"pathe\": \"^2.0.1\",\n \"pkg-types\": \"^1.3.0\",\n \"ufo\": \"^1.5.4\"\n }\n },\n \"node_modules/mlly/node_modules/pathe\": {\n \"version\": \"2.0.3\",\n \"resolved\": \"https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz\",\n \"integrity\": \"sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/ms\": {\n \"version\": \"2.1.3\",\n \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz\",\n \"integrity\": \"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/nanoid\": {\n \"version\": \"3.3.11\",\n \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz\",\n \"integrity\": \"sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"bin\": {\n \"nanoid\": \"bin/nanoid.cjs\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || ^13.7 || ^14 || >=15.0.1\"\n }\n },\n \"node_modules/node-gyp-build-optional-packages\": {\n \"version\": \"5.1.1\",\n \"resolved\": \"https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz\",\n \"integrity\": \"sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==\",\n \"license\": \"MIT\",\n \"optional\": true,\n \"peer\": true,\n \"dependencies\": {\n \"detect-libc\": \"^2.0.1\"\n },\n \"bin\": {\n \"node-gyp-build-optional-packages\": \"bin.js\",\n \"node-gyp-build-optional-packages-optional\": \"optional.js\",\n \"node-gyp-build-optional-packages-test\": \"build-test.js\"\n }\n },\n \"node_modules/node-releases\": {\n \"version\": \"2.0.19\",\n \"resolved\": \"https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz\",\n \"integrity\": \"sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/npm-run-path\": {\n \"version\": \"5.3.0\",\n \"resolved\": \"https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz\",\n \"integrity\": \"sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"path-key\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/npm-run-path/node_modules/path-key\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz\",\n \"integrity\": \"sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=12\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/on-change\": {\n \"version\": \"5.0.1\",\n \"resolved\": \"https://registry.npmjs.org/on-change/-/on-change-5.0.1.tgz\",\n \"integrity\": \"sha512-n7THCP7RkyReRSLkJb8kUWoNsxUIBxTkIp3JKno+sEz6o/9AJ3w3P9fzQkITEkMwyTKJjZciF3v/pVoouxZZMg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">=18\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sindresorhus/on-change?sponsor=1\"\n }\n },\n \"node_modules/onetime\": {\n \"version\": \"6.0.0\",\n \"resolved\": \"https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz\",\n \"integrity\": \"sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"mimic-fn\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/p-limit\": {\n \"version\": \"5.0.0\",\n \"resolved\": \"https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz\",\n \"integrity\": \"sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"yocto-queue\": \"^1.0.0\"\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/p-retry\": {\n \"version\": \"6.2.1\",\n \"resolved\": \"https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz\",\n \"integrity\": \"sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"dependencies\": {\n \"@types/retry\": \"0.12.2\",\n \"is-network-error\": \"^1.0.0\",\n \"retry\": \"^0.13.1\"\n },\n \"engines\": {\n \"node\": \">=16.17\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/path-key\": {\n \"version\": \"3.1.1\",\n \"resolved\": \"https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz\",\n \"integrity\": \"sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/pathe\": {\n \"version\": \"1.1.2\",\n \"resolved\": \"https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz\",\n \"integrity\": \"sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/pathval\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz\",\n \"integrity\": \"sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \"*\"\n }\n },\n \"node_modules/picocolors\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz\",\n \"integrity\": \"sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/pkg-types\": {\n \"version\": \"1.3.1\",\n \"resolved\": \"https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz\",\n \"integrity\": \"sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"confbox\": \"^0.1.8\",\n \"mlly\": \"^1.7.4\",\n \"pathe\": \"^2.0.1\"\n }\n },\n \"node_modules/pkg-types/node_modules/pathe\": {\n \"version\": \"2.0.3\",\n \"resolved\": \"https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz\",\n \"integrity\": \"sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/postcss\": {\n \"version\": \"8.5.6\",\n \"resolved\": \"https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz\",\n \"integrity\": \"sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/postcss/\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/postcss\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"nanoid\": \"^3.3.11\",\n \"picocolors\": \"^1.1.1\",\n \"source-map-js\": \"^1.2.1\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || >=14\"\n }\n },\n \"node_modules/pretty-format\": {\n \"version\": \"29.7.0\",\n \"resolved\": \"https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz\",\n \"integrity\": \"sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jest/schemas\": \"^29.6.3\",\n \"ansi-styles\": \"^5.0.0\",\n \"react-is\": \"^18.0.0\"\n },\n \"engines\": {\n \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n }\n },\n \"node_modules/pretty-format/node_modules/ansi-styles\": {\n \"version\": \"5.2.0\",\n \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz\",\n \"integrity\": \"sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n }\n },\n \"node_modules/react\": {\n \"version\": \"18.3.1\",\n \"resolved\": \"https://registry.npmjs.org/react/-/react-18.3.1.tgz\",\n \"integrity\": \"sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\"\n },\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/react-dom\": {\n \"version\": \"18.3.1\",\n \"resolved\": \"https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz\",\n \"integrity\": \"sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\",\n \"scheduler\": \"^0.23.2\"\n },\n \"peerDependencies\": {\n \"react\": \"^18.3.1\"\n }\n },\n \"node_modules/react-is\": {\n \"version\": \"18.3.1\",\n \"resolved\": \"https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz\",\n \"integrity\": \"sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/react-refresh\": {\n \"version\": \"0.17.0\",\n \"resolved\": \"https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz\",\n \"integrity\": \"sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/require-directory\": {\n \"version\": \"2.1.1\",\n \"resolved\": \"https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz\",\n \"integrity\": \"sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/resolve-pkg-maps\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz\",\n \"integrity\": \"sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"funding\": {\n \"url\": \"https://github.com/privatenumber/resolve-pkg-maps?sponsor=1\"\n }\n },\n \"node_modules/retry\": {\n \"version\": \"0.13.1\",\n \"resolved\": \"https://registry.npmjs.org/retry/-/retry-0.13.1.tgz\",\n \"integrity\": \"sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">= 4\"\n }\n },\n \"node_modules/rollup\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/rollup/-/rollup-4.45.0.tgz\",\n \"integrity\": \"sha512-WLjEcJRIo7i3WDDgOIJqVI2d+lAC3EwvOGy+Xfq6hs+GQuAA4Di/H72xmXkOhrIWFg2PFYSKZYfH0f4vfKXN4A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/estree\": \"1.0.8\"\n },\n \"bin\": {\n \"rollup\": \"dist/bin/rollup\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\",\n \"npm\": \">=8.0.0\"\n },\n \"optionalDependencies\": {\n \"@rollup/rollup-android-arm-eabi\": \"4.45.0\",\n \"@rollup/rollup-android-arm64\": \"4.45.0\",\n \"@rollup/rollup-darwin-arm64\": \"4.45.0\",\n \"@rollup/rollup-darwin-x64\": \"4.45.0\",\n \"@rollup/rollup-freebsd-arm64\": \"4.45.0\",\n \"@rollup/rollup-freebsd-x64\": \"4.45.0\",\n \"@rollup/rollup-linux-arm-gnueabihf\": \"4.45.0\",\n \"@rollup/rollup-linux-arm-musleabihf\": \"4.45.0\",\n \"@rollup/rollup-linux-arm64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-arm64-musl\": \"4.45.0\",\n \"@rollup/rollup-linux-loongarch64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-powerpc64le-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-riscv64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-riscv64-musl\": \"4.45.0\",\n \"@rollup/rollup-linux-s390x-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-x64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-x64-musl\": \"4.45.0\",\n \"@rollup/rollup-win32-arm64-msvc\": \"4.45.0\",\n \"@rollup/rollup-win32-ia32-msvc\": \"4.45.0\",\n \"@rollup/rollup-win32-x64-msvc\": \"4.45.0\",\n \"fsevents\": \"~2.3.2\"\n }\n },\n \"node_modules/rxjs\": {\n \"version\": \"7.8.2\",\n \"resolved\": \"https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz\",\n \"integrity\": \"sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"tslib\": \"^2.1.0\"\n }\n },\n \"node_modules/scheduler\": {\n \"version\": \"0.23.2\",\n \"resolved\": \"https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz\",\n \"integrity\": \"sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\"\n }\n },\n \"node_modules/semver\": {\n \"version\": \"6.3.1\",\n \"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n \"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"bin\": {\n \"semver\": \"bin/semver.js\"\n }\n },\n \"node_modules/shebang-command\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz\",\n \"integrity\": \"sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"shebang-regex\": \"^3.0.0\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/shebang-regex\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz\",\n \"integrity\": \"sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/shell-quote\": {\n \"version\": \"1.8.3\",\n \"resolved\": \"https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz\",\n \"integrity\": \"sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">= 0.4\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/ljharb\"\n }\n },\n \"node_modules/siginfo\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz\",\n \"integrity\": \"sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/signal-exit\": {\n \"version\": \"4.1.0\",\n \"resolved\": \"https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz\",\n \"integrity\": \"sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \">=14\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/isaacs\"\n }\n },\n \"node_modules/source-map-js\": {\n \"version\": \"1.2.1\",\n \"resolved\": \"https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz\",\n \"integrity\": \"sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==\",\n \"dev\": true,\n \"license\": \"BSD-3-Clause\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/spawn-command\": {\n \"version\": \"0.0.2\",\n \"resolved\": \"https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz\",\n \"integrity\": \"sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==\",\n \"dev\": true\n },\n \"node_modules/stackback\": {\n \"version\": \"0.0.2\",\n \"resolved\": \"https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz\",\n \"integrity\": \"sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/std-env\": {\n \"version\": \"3.9.0\",\n \"resolved\": \"https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz\",\n \"integrity\": \"sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/string-width\": {\n \"version\": \"4.2.3\",\n \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"emoji-regex\": \"^8.0.0\",\n \"is-fullwidth-code-point\": \"^3.0.0\",\n \"strip-ansi\": \"^6.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/strip-ansi\": {\n \"version\": \"6.0.1\",\n \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-regex\": \"^5.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/strip-final-newline\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz\",\n \"integrity\": \"sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=12\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/strip-literal\": {\n \"version\": \"2.1.1\",\n \"resolved\": \"https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz\",\n \"integrity\": \"sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"js-tokens\": \"^9.0.1\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/antfu\"\n }\n },\n \"node_modules/strip-literal/node_modules/js-tokens\": {\n \"version\": \"9.0.1\",\n \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz\",\n \"integrity\": \"sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/supports-color\": {\n \"version\": \"8.1.1\",\n \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz\",\n \"integrity\": \"sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"has-flag\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/supports-color?sponsor=1\"\n }\n },\n \"node_modules/tinybench\": {\n \"version\": \"2.9.0\",\n \"resolved\": \"https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz\",\n \"integrity\": \"sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/tinypool\": {\n \"version\": \"0.8.4\",\n \"resolved\": \"https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz\",\n \"integrity\": \"sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=14.0.0\"\n }\n },\n \"node_modules/tinyspy\": {\n \"version\": \"2.2.1\",\n \"resolved\": \"https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz\",\n \"integrity\": \"sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=14.0.0\"\n }\n },\n \"node_modules/tree-kill\": {\n \"version\": \"1.2.2\",\n \"resolved\": \"https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz\",\n \"integrity\": \"sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"tree-kill\": \"cli.js\"\n }\n },\n \"node_modules/tslib\": {\n \"version\": \"2.8.1\",\n \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz\",\n \"integrity\": \"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==\",\n \"dev\": true,\n \"license\": \"0BSD\"\n },\n \"node_modules/tsx\": {\n \"version\": \"4.20.3\",\n \"resolved\": \"https://registry.npmjs.org/tsx/-/tsx-4.20.3.tgz\",\n \"integrity\": \"sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"esbuild\": \"~0.25.0\",\n \"get-tsconfig\": \"^4.7.5\"\n },\n \"bin\": {\n \"tsx\": \"dist/cli.mjs\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"optionalDependencies\": {\n \"fsevents\": \"~2.3.3\"\n }\n },\n \"node_modules/type-detect\": {\n \"version\": \"4.1.0\",\n \"resolved\": \"https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz\",\n \"integrity\": \"sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=4\"\n }\n },\n \"node_modules/typescript\": {\n \"version\": \"5.8.3\",\n \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz\",\n \"integrity\": \"sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"bin\": {\n \"tsc\": \"bin/tsc\",\n \"tsserver\": \"bin/tsserver\"\n },\n \"engines\": {\n \"node\": \">=14.17\"\n }\n },\n \"node_modules/ufo\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz\",\n \"integrity\": \"sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/undici-types\": {\n \"version\": \"6.21.0\",\n \"resolved\": \"https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz\",\n \"integrity\": \"sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/update-browserslist-db\": {\n \"version\": \"1.1.3\",\n \"resolved\": \"https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz\",\n \"integrity\": \"sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"escalade\": \"^3.2.0\",\n \"picocolors\": \"^1.1.1\"\n },\n \"bin\": {\n \"update-browserslist-db\": \"cli.js\"\n },\n \"peerDependencies\": {\n \"browserslist\": \">= 4.21.0\"\n }\n },\n \"node_modules/use-sync-external-store\": {\n \"version\": \"1.5.0\",\n \"resolved\": \"https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz\",\n \"integrity\": \"sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==\",\n \"license\": \"MIT\",\n \"peerDependencies\": {\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\"\n }\n },\n \"node_modules/vite\": {\n \"version\": \"5.4.19\",\n \"resolved\": \"https://registry.npmjs.org/vite/-/vite-5.4.19.tgz\",\n \"integrity\": \"sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"esbuild\": \"^0.21.3\",\n \"postcss\": \"^8.4.43\",\n \"rollup\": \"^4.20.0\"\n },\n \"bin\": {\n \"vite\": \"bin/vite.js\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/vitejs/vite?sponsor=1\"\n },\n \"optionalDependencies\": {\n \"fsevents\": \"~2.3.3\"\n },\n \"peerDependencies\": {\n \"@types/node\": \"^18.0.0 || >=20.0.0\",\n \"less\": \"*\",\n \"lightningcss\": \"^1.21.0\",\n \"sass\": \"*\",\n \"sass-embedded\": \"*\",\n \"stylus\": \"*\",\n \"sugarss\": \"*\",\n \"terser\": \"^5.4.0\"\n },\n \"peerDependenciesMeta\": {\n \"@types/node\": {\n \"optional\": true\n },\n \"less\": {\n \"optional\": true\n },\n \"lightningcss\": {\n \"optional\": true\n },\n \"sass\": {\n \"optional\": true\n },\n \"sass-embedded\": {\n \"optional\": true\n },\n \"stylus\": {\n \"optional\": true\n },\n \"sugarss\": {\n \"optional\": true\n },\n \"terser\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/vite-node\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/vite-node/-/vite-node-1.6.1.tgz\",\n \"integrity\": \"sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"cac\": \"^6.7.14\",\n \"debug\": \"^4.3.4\",\n \"pathe\": \"^1.1.1\",\n \"picocolors\": \"^1.0.0\",\n \"vite\": \"^5.0.0\"\n },\n \"bin\": {\n \"vite-node\": \"vite-node.mjs\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/aix-ppc64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz\",\n \"integrity\": \"sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"aix\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-arm\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz\",\n \"integrity\": \"sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/darwin-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/darwin-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/freebsd-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/freebsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-arm\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz\",\n \"integrity\": \"sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-ia32\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz\",\n \"integrity\": \"sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-loong64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz\",\n \"integrity\": \"sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-mips64el\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz\",\n \"integrity\": \"sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==\",\n \"cpu\": [\n \"mips64el\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-ppc64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz\",\n \"integrity\": \"sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-riscv64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz\",\n \"integrity\": \"sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-s390x\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz\",\n \"integrity\": \"sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/netbsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"netbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/openbsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"openbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/sunos-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"sunos\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-ia32\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz\",\n \"integrity\": \"sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/esbuild\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz\",\n \"integrity\": \"sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"esbuild\": \"bin/esbuild\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"optionalDependencies\": {\n \"@esbuild/aix-ppc64\": \"0.21.5\",\n \"@esbuild/android-arm\": \"0.21.5\",\n \"@esbuild/android-arm64\": \"0.21.5\",\n \"@esbuild/android-x64\": \"0.21.5\",\n \"@esbuild/darwin-arm64\": \"0.21.5\",\n \"@esbuild/darwin-x64\": \"0.21.5\",\n \"@esbuild/freebsd-arm64\": \"0.21.5\",\n \"@esbuild/freebsd-x64\": \"0.21.5\",\n \"@esbuild/linux-arm\": \"0.21.5\",\n \"@esbuild/linux-arm64\": \"0.21.5\",\n \"@esbuild/linux-ia32\": \"0.21.5\",\n \"@esbuild/linux-loong64\": \"0.21.5\",\n \"@esbuild/linux-mips64el\": \"0.21.5\",\n \"@esbuild/linux-ppc64\": \"0.21.5\",\n \"@esbuild/linux-riscv64\": \"0.21.5\",\n \"@esbuild/linux-s390x\": \"0.21.5\",\n \"@esbuild/linux-x64\": \"0.21.5\",\n \"@esbuild/netbsd-x64\": \"0.21.5\",\n \"@esbuild/openbsd-x64\": \"0.21.5\",\n \"@esbuild/sunos-x64\": \"0.21.5\",\n \"@esbuild/win32-arm64\": \"0.21.5\",\n \"@esbuild/win32-ia32\": \"0.21.5\",\n \"@esbuild/win32-x64\": \"0.21.5\"\n }\n },\n \"node_modules/vitest\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/vitest/-/vitest-1.6.1.tgz\",\n \"integrity\": \"sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/expect\": \"1.6.1\",\n \"@vitest/runner\": \"1.6.1\",\n \"@vitest/snapshot\": \"1.6.1\",\n \"@vitest/spy\": \"1.6.1\",\n \"@vitest/utils\": \"1.6.1\",\n \"acorn-walk\": \"^8.3.2\",\n \"chai\": \"^4.3.10\",\n \"debug\": \"^4.3.4\",\n \"execa\": \"^8.0.1\",\n \"local-pkg\": \"^0.5.0\",\n \"magic-string\": \"^0.30.5\",\n \"pathe\": \"^1.1.1\",\n \"picocolors\": \"^1.0.0\",\n \"std-env\": \"^3.5.0\",\n \"strip-literal\": \"^2.0.0\",\n \"tinybench\": \"^2.5.1\",\n \"tinypool\": \"^0.8.3\",\n \"vite\": \"^5.0.0\",\n \"vite-node\": \"1.6.1\",\n \"why-is-node-running\": \"^2.2.2\"\n },\n \"bin\": {\n \"vitest\": \"vitest.mjs\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n },\n \"peerDependencies\": {\n \"@edge-runtime/vm\": \"*\",\n \"@types/node\": \"^18.0.0 || >=20.0.0\",\n \"@vitest/browser\": \"1.6.1\",\n \"@vitest/ui\": \"1.6.1\",\n \"happy-dom\": \"*\",\n \"jsdom\": \"*\"\n },\n \"peerDependenciesMeta\": {\n \"@edge-runtime/vm\": {\n \"optional\": true\n },\n \"@types/node\": {\n \"optional\": true\n },\n \"@vitest/browser\": {\n \"optional\": true\n },\n \"@vitest/ui\": {\n \"optional\": true\n },\n \"happy-dom\": {\n \"optional\": true\n },\n \"jsdom\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/which\": {\n \"version\": \"2.0.2\",\n \"resolved\": \"https://registry.npmjs.org/which/-/which-2.0.2.tgz\",\n \"integrity\": \"sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"dependencies\": {\n \"isexe\": \"^2.0.0\"\n },\n \"bin\": {\n \"node-which\": \"bin/node-which\"\n },\n \"engines\": {\n \"node\": \">= 8\"\n }\n },\n \"node_modules/why-is-node-running\": {\n \"version\": \"2.3.0\",\n \"resolved\": \"https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz\",\n \"integrity\": \"sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"siginfo\": \"^2.0.0\",\n \"stackback\": \"0.0.2\"\n },\n \"bin\": {\n \"why-is-node-running\": \"cli.js\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/wrap-ansi\": {\n \"version\": \"7.0.0\",\n \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\n \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-styles\": \"^4.0.0\",\n \"string-width\": \"^4.1.0\",\n \"strip-ansi\": \"^6.0.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n }\n },\n \"node_modules/y18n\": {\n \"version\": \"5.0.8\",\n \"resolved\": \"https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz\",\n \"integrity\": \"sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \">=10\"\n }\n },\n \"node_modules/yallist\": {\n \"version\": \"3.1.1\",\n \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz\",\n \"integrity\": \"sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/yargs\": {\n \"version\": \"17.7.2\",\n \"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz\",\n \"integrity\": \"sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"cliui\": \"^8.0.1\",\n \"escalade\": \"^3.1.1\",\n \"get-caller-file\": \"^2.0.5\",\n \"require-directory\": \"^2.1.1\",\n \"string-width\": \"^4.2.3\",\n \"y18n\": \"^5.0.5\",\n \"yargs-parser\": \"^21.1.1\"\n },\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/yargs-parser\": {\n \"version\": \"21.1.1\",\n \"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz\",\n \"integrity\": \"sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/yocto-queue\": {\n \"version\": \"1.2.1\",\n \"resolved\": \"https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz\",\n \"integrity\": \"sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=12.20\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/zod\": {\n \"version\": \"3.25.76\",\n \"resolved\": \"https://registry.npmjs.org/zod/-/zod-3.25.76.tgz\",\n \"integrity\": \"sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"funding\": {\n \"url\": \"https://github.com/sponsors/colinhacks\"\n }\n }\n }\n}\n", "package.json": "{\n \"name\": \"example-game\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"concurrently \\\"tsx --watch src/backend/server.ts\\\" \\\"vite\\\"\",\n \"build\": \"vite build\",\n \"preview\": \"vite preview\",\n \"check-types\": \"tsc --noEmit\",\n \"test\": \"vitest\"\n },\n \"dependencies\": {\n \"rivetkit\": \"^0.9.1\",\n \"@rivetkit/react\": \"^0.9.1\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^20.0.0\",\n \"@types/react\": \"^18.2.0\",\n \"@types/react-dom\": \"^18.2.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"concurrently\": \"^8.2.0\",\n \"tsx\": \"^4.0.0\",\n \"typescript\": \"^5.0.0\",\n \"vite\": \"^5.0.0\",\n \"vitest\": \"^1.0.0\"\n }\n}\n", "tsconfig.json": "{\n \"compilerOptions\": {\n \"target\": \"ES2020\",\n \"lib\": [\"ES2020\", \"DOM\", \"DOM.Iterable\"],\n \"module\": \"ESNext\",\n \"skipLibCheck\": true,\n \"moduleResolution\": \"bundler\",\n \"allowImportingTsExtensions\": true,\n \"resolveJsonModule\": true,\n \"isolatedModules\": true,\n \"noEmit\": true,\n \"jsx\": \"react-jsx\",\n \"strict\": true,\n \"noUnusedLocals\": true,\n \"noUnusedParameters\": true,\n \"noFallthroughCasesInSwitch\": true\n },\n \"include\": [\"src\", \"tests\"],\n \"exclude\": [\"node_modules\", \"dist\"]\n}\n", @@ -109,7 +109,7 @@ export const examples: ExampleData[] = [ "src/frontend/App.tsx": "import { createClient, createRivetKit } from \"@rivetkit/react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport type { Player, registry } from \"../backend/registry\";\n\nconst client = createClient(\"http://localhost:8080\");\nconst { useActor } = createRivetKit(client);\n\nexport function App() {\n\tconst [players, setPlayers] = useState([]);\n\tconst [isConnected, setIsConnected] = useState(false);\n\tconst [currentPlayerId, setCurrentPlayerId] = useState(null);\n\tconst canvasRef = useRef(null);\n\tconst keysPressed = useRef>({});\n\tconst inputIntervalRef = useRef(null);\n\tconst animationRef = useRef(null);\n\n\tconst gameRoom = useActor({\n\t\tname: \"gameRoom\",\n\t\tkey: [\"global\"],\n\t});\n\n\t// Track connection status\n\tuseEffect(() => {\n\t\tsetIsConnected(!!gameRoom.connection);\n\t}, [gameRoom.connection]);\n\n\t// Set up game controls and rendering\n\tuseEffect(() => {\n\t\tif (!gameRoom.connection) return;\n\n\t\t// Set up keyboard handlers\n\t\tconst handleKeyDown = (e: KeyboardEvent) => {\n\t\t\tkeysPressed.current[e.key.toLowerCase()] = true;\n\t\t};\n\n\t\tconst handleKeyUp = (e: KeyboardEvent) => {\n\t\t\tkeysPressed.current[e.key.toLowerCase()] = false;\n\t\t};\n\n\t\twindow.addEventListener(\"keydown\", handleKeyDown);\n\t\twindow.addEventListener(\"keyup\", handleKeyUp);\n\n\t\t// Input update loop\n\t\tinputIntervalRef.current = setInterval(() => {\n\t\t\tconst input = { x: 0, y: 0 };\n\n\t\t\tif (keysPressed.current[\"w\"] || keysPressed.current[\"arrowup\"])\n\t\t\t\tinput.y = -1;\n\t\t\tif (keysPressed.current[\"s\"] || keysPressed.current[\"arrowdown\"])\n\t\t\t\tinput.y = 1;\n\t\t\tif (keysPressed.current[\"a\"] || keysPressed.current[\"arrowleft\"])\n\t\t\t\tinput.x = -1;\n\t\t\tif (keysPressed.current[\"d\"] || keysPressed.current[\"arrowright\"])\n\t\t\t\tinput.x = 1;\n\n\t\t\tgameRoom.connection?.setInput(input);\n\t\t}, 50);\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener(\"keydown\", handleKeyDown);\n\t\t\twindow.removeEventListener(\"keyup\", handleKeyUp);\n\t\t\t\n\t\t\tif (inputIntervalRef.current) {\n\t\t\t\tclearInterval(inputIntervalRef.current);\n\t\t\t\tinputIntervalRef.current = null;\n\t\t\t}\n\t\t};\n\t}, [gameRoom.connection]);\n\n\t// Rendering loop\n\tuseEffect(() => {\n\t\tconst renderLoop = () => {\n\t\t\tconst canvas = canvasRef.current;\n\t\t\tif (!canvas) return;\n\n\t\t\tconst ctx = canvas.getContext(\"2d\");\n\t\t\tif (!ctx) return;\n\n\t\t\t// Clear canvas\n\t\t\tctx.clearRect(0, 0, canvas.width, canvas.height);\n\n\t\t\t// Draw grid\n\t\t\tctx.strokeStyle = \"#e0e0e0\";\n\t\t\tctx.lineWidth = 1;\n\t\t\tfor (let i = 0; i <= canvas.width; i += 50) {\n\t\t\t\tctx.beginPath();\n\t\t\t\tctx.moveTo(i, 0);\n\t\t\t\tctx.lineTo(i, canvas.height);\n\t\t\t\tctx.stroke();\n\t\t\t}\n\t\t\tfor (let i = 0; i <= canvas.height; i += 50) {\n\t\t\t\tctx.beginPath();\n\t\t\t\tctx.moveTo(0, i);\n\t\t\t\tctx.lineTo(canvas.width, i);\n\t\t\t\tctx.stroke();\n\t\t\t}\n\n\t\t\t// Draw players\n\t\t\tfor (const player of players) {\n\t\t\t\tconst isCurrentPlayer = currentPlayerId && player.id === currentPlayerId;\n\t\t\t\t\n\t\t\t\t// Draw player shadow\n\t\t\t\tctx.fillStyle = \"rgba(0, 0, 0, 0.2)\";\n\t\t\t\tctx.beginPath();\n\t\t\t\tctx.arc(player.position.x + 2, player.position.y + 2, 12, 0, Math.PI * 2);\n\t\t\t\tctx.fill();\n\n\t\t\t\t// Draw player\n\t\t\t\tctx.fillStyle = isCurrentPlayer ? \"#4287f5\" : \"#888\";\n\t\t\t\tctx.beginPath();\n\t\t\t\tctx.arc(player.position.x, player.position.y, 10, 0, Math.PI * 2);\n\t\t\t\tctx.fill();\n\n\t\t\t\t// Draw player border\n\t\t\t\tctx.strokeStyle = \"#333\";\n\t\t\t\tctx.lineWidth = 2;\n\t\t\t\tctx.stroke();\n\n\t\t\t\t// Draw player ID\n\t\t\t\tctx.fillStyle = \"#333\";\n\t\t\t\tctx.font = \"12px Arial\";\n\t\t\t\tctx.textAlign = \"center\";\n\t\t\t\tctx.fillText(\n\t\t\t\t\tisCurrentPlayer ? \"YOU\" : player.id.substring(0, 8),\n\t\t\t\t\tplayer.position.x,\n\t\t\t\t\tplayer.position.y - 15\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tanimationRef.current = requestAnimationFrame(renderLoop);\n\t\t};\n\n\t\tanimationRef.current = requestAnimationFrame(renderLoop);\n\n\t\treturn () => {\n\t\t\tif (animationRef.current) {\n\t\t\t\tcancelAnimationFrame(animationRef.current);\n\t\t\t\tanimationRef.current = null;\n\t\t\t}\n\t\t};\n\t}, [players, gameRoom.connection]);\n\n\t// Listen for world updates\n\tgameRoom.useEvent(\"worldUpdate\", ({ playerList }: { playerList: Player[] }) => {\n\t\tsetPlayers(playerList);\n\t\t\n\t\t// Try to identify current player - this is a simple approach\n\t\t// In a real implementation, we'd get the connection ID from the server\n\t\tif (currentPlayerId === null && playerList.length > 0) {\n\t\t\tsetCurrentPlayerId(playerList[playerList.length - 1].id);\n\t\t}\n\t});\n\n\treturn (\n\t\t
\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{isConnected ? \"Connected\" : \"Disconnected\"}\n\t\t\t\t
\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t

Multiplayer Game

\n\t\t\t\t

Real-time multiplayer movement with RivetKit

\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t

How to Play

\n\t\t\t\t

\n\t\t\t\t\tUse WASD or arrow keys to move your character around the game world. \n\t\t\t\t\tYour character is shown in blue, while other players appear in gray. \n\t\t\t\t\tThe game updates in real-time, so you'll see other players moving as they play.\n\t\t\t\t

\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\tYou\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\tOther Players\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t

Controls:

\n\t\t\t\t

Move: WASD or Arrow Keys

\n\t\t\t\t

Players online: {players.length}

\n\t\t\t
\n\t\t
\n\t);\n}", "src/frontend/main.tsx": "import { StrictMode } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { App } from \"./App\";\n\nconst root = document.getElementById(\"root\");\nif (!root) throw new Error(\"Root element not found\");\n\ncreateRoot(root).render(\n\t\n\t\t\n\t\n);", "src/frontend/index.html": "\n\n\n \n \n Multiplayer Game - RivetKit\n \n\n\n
\n \n\n", - "src/backend/registry.ts": "import { actor, setup } from \"rivetkit\";\n\nexport type Position = { x: number; y: number };\nexport type Input = { x: number; y: number };\nexport type Player = { id: string; position: Position; input: Input };\n\nconst gameRoom = actor({\n\tonAuth: () => {},\n\t// Persistent state that survives restarts: https://rivet.gg/docs/actors/state\n\tstate: {\n\t\tplayers: {} as Record,\n\t\tmapSize: 800,\n\t},\n\n\tonStart: (c) => {\n\t\t// Set up game update loop\n\t\tsetInterval(() => {\n\t\t\tconst playerList: Player[] = [];\n\t\t\tlet hasPlayers = false;\n\n\t\t\tfor (const id in c.state.players) {\n\t\t\t\tconst player = c.state.players[id];\n\t\t\t\tconst speed = 5;\n\n\t\t\t\t// Update position based on input\n\t\t\t\tplayer.position.x += player.input.x * speed;\n\t\t\t\tplayer.position.y += player.input.y * speed;\n\n\t\t\t\t// Keep player in bounds\n\t\t\t\tplayer.position.x = Math.max(\n\t\t\t\t\t10,\n\t\t\t\t\tMath.min(player.position.x, c.state.mapSize - 10),\n\t\t\t\t);\n\t\t\t\tplayer.position.y = Math.max(\n\t\t\t\t\t10,\n\t\t\t\t\tMath.min(player.position.y, c.state.mapSize - 10),\n\t\t\t\t);\n\n\t\t\t\t// Add to list for broadcast\n\t\t\t\tplayerList.push(player);\n\t\t\t\thasPlayers = true;\n\t\t\t}\n\n\t\t\t// Only broadcast if there are players\n\t\t\tif (hasPlayers) {\n\t\t\t\t// Send events to all connected clients: https://rivet.gg/docs/actors/events\n\t\t\t\tc.broadcast(\"worldUpdate\", { playerList });\n\t\t\t}\n\t\t}, 50);\n\n\t\t// Store interval ID for cleanup (would need to be cleaned up manually if needed)\n\t\t// For now, we'll let the interval run since there's no cleanup method\n\t},\n\n\t// Handle client connections: https://rivet.gg/docs/actors/connection-lifecycle\n\tonConnect: (c, conn) => {\n\t\tconst id = conn.id;\n\t\t// State changes are automatically persisted\n\t\tc.state.players[id] = {\n\t\t\tid,\n\t\t\tposition: {\n\t\t\t\tx: Math.floor(Math.random() * (c.state.mapSize - 100)) + 50,\n\t\t\t\ty: Math.floor(Math.random() * (c.state.mapSize - 100)) + 50,\n\t\t\t},\n\t\t\tinput: { x: 0, y: 0 },\n\t\t};\n\n\t\t// Send initial world state to new player\n\t\tconst playerList = Object.values(c.state.players);\n\t\tconn.send(\"worldUpdate\", { playerList });\n\t},\n\n\tonDisconnect: (c, conn) => {\n\t\tdelete c.state.players[conn.id];\n\t},\n\n\tactions: {\n\t\t// Callable functions from clients: https://rivet.gg/docs/actors/actions\n\t\tsetInput: (c, input: Input) => {\n\t\t\tconst player = c.state.players[c.conn.id];\n\t\t\tif (player) {\n\t\t\t\tplayer.input = input;\n\t\t\t}\n\t\t},\n\n\t\tgetPlayerCount: (c) => {\n\t\t\treturn Object.keys(c.state.players).length;\n\t\t},\n\t},\n});\n\n// Register actors for use: https://rivet.gg/docs/setup\nexport const registry = setup({\n\tuse: { gameRoom },\n});\n", + "src/backend/registry.ts": "import { actor, setup } from \"rivetkit\";\n\nexport type Position = { x: number; y: number };\nexport type Input = { x: number; y: number };\nexport type Player = { id: string; position: Position; input: Input };\n\nconst gameRoom = actor({\n\tonAuth: () => {},\n\t// Persistent state that survives restarts: https://rivet.dev/docs/actors/state\n\tstate: {\n\t\tplayers: {} as Record,\n\t\tmapSize: 800,\n\t},\n\n\tonStart: (c) => {\n\t\t// Set up game update loop\n\t\tsetInterval(() => {\n\t\t\tconst playerList: Player[] = [];\n\t\t\tlet hasPlayers = false;\n\n\t\t\tfor (const id in c.state.players) {\n\t\t\t\tconst player = c.state.players[id];\n\t\t\t\tconst speed = 5;\n\n\t\t\t\t// Update position based on input\n\t\t\t\tplayer.position.x += player.input.x * speed;\n\t\t\t\tplayer.position.y += player.input.y * speed;\n\n\t\t\t\t// Keep player in bounds\n\t\t\t\tplayer.position.x = Math.max(\n\t\t\t\t\t10,\n\t\t\t\t\tMath.min(player.position.x, c.state.mapSize - 10),\n\t\t\t\t);\n\t\t\t\tplayer.position.y = Math.max(\n\t\t\t\t\t10,\n\t\t\t\t\tMath.min(player.position.y, c.state.mapSize - 10),\n\t\t\t\t);\n\n\t\t\t\t// Add to list for broadcast\n\t\t\t\tplayerList.push(player);\n\t\t\t\thasPlayers = true;\n\t\t\t}\n\n\t\t\t// Only broadcast if there are players\n\t\t\tif (hasPlayers) {\n\t\t\t\t// Send events to all connected clients: https://rivet.dev/docs/actors/events\n\t\t\t\tc.broadcast(\"worldUpdate\", { playerList });\n\t\t\t}\n\t\t}, 50);\n\n\t\t// Store interval ID for cleanup (would need to be cleaned up manually if needed)\n\t\t// For now, we'll let the interval run since there's no cleanup method\n\t},\n\n\t// Handle client connections: https://rivet.dev/docs/actors/connection-lifecycle\n\tonConnect: (c, conn) => {\n\t\tconst id = conn.id;\n\t\t// State changes are automatically persisted\n\t\tc.state.players[id] = {\n\t\t\tid,\n\t\t\tposition: {\n\t\t\t\tx: Math.floor(Math.random() * (c.state.mapSize - 100)) + 50,\n\t\t\t\ty: Math.floor(Math.random() * (c.state.mapSize - 100)) + 50,\n\t\t\t},\n\t\t\tinput: { x: 0, y: 0 },\n\t\t};\n\n\t\t// Send initial world state to new player\n\t\tconst playerList = Object.values(c.state.players);\n\t\tconn.send(\"worldUpdate\", { playerList });\n\t},\n\n\tonDisconnect: (c, conn) => {\n\t\tdelete c.state.players[conn.id];\n\t},\n\n\tactions: {\n\t\t// Callable functions from clients: https://rivet.dev/docs/actors/actions\n\t\tsetInput: (c, input: Input) => {\n\t\t\tconst player = c.state.players[c.conn.id];\n\t\t\tif (player) {\n\t\t\t\tplayer.input = input;\n\t\t\t}\n\t\t},\n\n\t\tgetPlayerCount: (c) => {\n\t\t\treturn Object.keys(c.state.players).length;\n\t\t},\n\t},\n});\n\n// Register actors for use: https://rivet.dev/docs/setup\nexport const registry = setup({\n\tuse: { gameRoom },\n});\n", "src/backend/server.ts": "import { registry } from \"./registry\";\n\nregistry.runServer({\n\tcors: {\n\t\torigin: \"*\",\n\t},\n});\n" } }, @@ -124,7 +124,7 @@ export const examples: ExampleData[] = [ "tab": "memory", "files": { "tests/sync.test.ts": "import { setupTest } from \"rivetkit/test\";\nimport { expect, test } from \"vitest\";\nimport { registry } from \"../src/backend/registry\";\n\ntest(\"Sync system can handle contact synchronization\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst sync = client.contacts.getOrCreate([\"test-sync-new\"]);\n\n\t// Initial state should be empty (or may have existing data)\n\tconst initialContacts = await sync.getAllContacts();\n\tconst initialCount = initialContacts.length;\n\n\t// Push some contacts\n\tconst contacts = [\n\t\t{\n\t\t\tid: \"1\",\n\t\t\tname: \"Alice Johnson\",\n\t\t\temail: \"alice@example.com\",\n\t\t\tphone: \"555-0001\",\n\t\t\tupdatedAt: Date.now() - 1000,\n\t\t},\n\t\t{\n\t\t\tid: \"2\",\n\t\t\tname: \"Bob Smith\",\n\t\t\temail: \"bob@example.com\",\n\t\t\tphone: \"555-0002\",\n\t\t\tupdatedAt: Date.now(),\n\t\t},\n\t];\n\n\tconst pushResult = await sync.pushChanges(contacts);\n\texpect(pushResult).toMatchObject({\n\t\ttimestamp: expect.any(Number),\n\t});\n\n\t// Verify contacts were stored\n\tconst allContacts = await sync.getAllContacts();\n\texpect(allContacts).toHaveLength(initialCount + 2);\n\texpect(allContacts).toEqual(expect.arrayContaining(contacts));\n});\n\ntest(\"Sync system handles conflict resolution with last-write-wins\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst sync = client.contacts.getOrCreate([\"test-conflicts\"]);\n\n\tconst oldTimestamp = Date.now() - 2000;\n\tconst newTimestamp = Date.now();\n\n\t// Push initial contact\n\tconst originalContact = {\n\t\tid: \"conflict-test\",\n\t\tname: \"Original Name\",\n\t\temail: \"original@example.com\",\n\t\tphone: \"555-0000\",\n\t\tupdatedAt: oldTimestamp,\n\t};\n\n\tawait sync.pushChanges([originalContact]);\n\n\t// Push conflicting update with newer timestamp\n\tconst updatedContact = {\n\t\tid: \"conflict-test\",\n\t\tname: \"Updated Name\",\n\t\temail: \"updated@example.com\",\n\t\tphone: \"555-1111\",\n\t\tupdatedAt: newTimestamp,\n\t};\n\n\tawait sync.pushChanges([updatedContact]);\n\n\t// Verify newer version won\n\tconst contacts = await sync.getAllContacts();\n\tconst conflictContact = contacts.find((c) => c.id === \"conflict-test\");\n\texpect(conflictContact).toEqual(updatedContact);\n\n\t// Try to push older version - should be ignored\n\tconst olderContact = {\n\t\tid: \"conflict-test\",\n\t\tname: \"Older Name\",\n\t\temail: \"older@example.com\",\n\t\tphone: \"555-9999\",\n\t\tupdatedAt: oldTimestamp - 1000,\n\t};\n\n\tawait sync.pushChanges([olderContact]);\n\n\t// Verify newer version is still there\n\tconst finalContacts = await sync.getAllContacts();\n\tconst finalContact = finalContacts.find((c) => c.id === \"conflict-test\");\n\texpect(finalContact).toEqual(updatedContact);\n});\n\ntest(\"Sync system tracks changes after timestamp\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst sync = client.contacts.getOrCreate([\"test-changes\"]);\n\n\tconst baseTime = Date.now();\n\n\t// Add some contacts at different times\n\tconst contact1 = {\n\t\tid: \"1\",\n\t\tname: \"First Contact\",\n\t\temail: \"first@example.com\",\n\t\tphone: \"555-0001\",\n\t\tupdatedAt: baseTime - 1000,\n\t};\n\n\tconst contact2 = {\n\t\tid: \"2\",\n\t\tname: \"Second Contact\",\n\t\temail: \"second@example.com\",\n\t\tphone: \"555-0002\",\n\t\tupdatedAt: baseTime + 1000,\n\t};\n\n\tawait sync.pushChanges([contact1]);\n\tawait sync.pushChanges([contact2]);\n\n\t// Get changes after base time - should only return contact2\n\tconst changes = await sync.getChanges(baseTime);\n\texpect(changes.changes).toHaveLength(1);\n\texpect(changes.changes[0]).toEqual(contact2);\n\texpect(changes.timestamp).toBeGreaterThanOrEqual(baseTime);\n\n\t// Get all changes - should return both\n\tconst allChanges = await sync.getChanges(0);\n\texpect(allChanges.changes).toHaveLength(2);\n});\n\ntest(\"Sync system provides statistics\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst sync = client.contacts.getOrCreate([\"test-stats-new\"]);\n\n\t// Initial stats\n\tconst initialStats = await sync.getSyncStats();\n\texpect(initialStats).toMatchObject({\n\t\ttotalContacts: expect.any(Number),\n\t\tlastSyncTime: expect.any(Number),\n\t\tdeletedContacts: expect.any(Number),\n\t});\n\n\tconst initialTotal = initialStats.totalContacts;\n\n\t// Add some contacts\n\tconst contacts = [\n\t\t{\n\t\t\tid: \"1\",\n\t\t\tname: \"Contact 1\",\n\t\t\temail: \"c1@example.com\",\n\t\t\tphone: \"555-0001\",\n\t\t\tupdatedAt: Date.now(),\n\t\t},\n\t\t{\n\t\t\tid: \"2\",\n\t\t\tname: \"Contact 2\",\n\t\t\temail: \"c2@example.com\",\n\t\t\tphone: \"555-0002\",\n\t\t\tupdatedAt: Date.now(),\n\t\t},\n\t\t{\n\t\t\tid: \"3\",\n\t\t\tname: \"\",\n\t\t\temail: \"deleted@example.com\",\n\t\t\tphone: \"555-0003\",\n\t\t\tupdatedAt: Date.now(),\n\t\t}, // Deleted contact\n\t];\n\n\tawait sync.pushChanges(contacts);\n\n\tconst stats = await sync.getSyncStats();\n\texpect(stats.totalContacts).toBe(initialTotal + 2); // Only non-deleted contacts\n\texpect(stats.deletedContacts).toBeGreaterThanOrEqual(1);\n\texpect(stats.lastSyncTime).toBeGreaterThan(initialStats.lastSyncTime);\n});\n\ntest(\"Sync system reset functionality\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst sync = client.contacts.getOrCreate([\"test-reset\"]);\n\n\t// Add some contacts\n\tconst contacts = [\n\t\t{\n\t\t\tid: \"1\",\n\t\t\tname: \"Contact 1\",\n\t\t\temail: \"c1@example.com\",\n\t\t\tphone: \"555-0001\",\n\t\t\tupdatedAt: Date.now(),\n\t\t},\n\t\t{\n\t\t\tid: \"2\",\n\t\t\tname: \"Contact 2\",\n\t\t\temail: \"c2@example.com\",\n\t\t\tphone: \"555-0002\",\n\t\t\tupdatedAt: Date.now(),\n\t\t},\n\t];\n\n\tawait sync.pushChanges(contacts);\n\n\t// Verify contacts exist\n\tlet allContacts = await sync.getAllContacts();\n\texpect(allContacts).toHaveLength(2);\n\n\t// Reset the system\n\tconst resetResult = await sync.reset();\n\texpect(resetResult).toMatchObject({\n\t\ttimestamp: expect.any(Number),\n\t});\n\n\t// Verify contacts are gone\n\tallContacts = await sync.getAllContacts();\n\texpect(allContacts).toEqual([]);\n\n\tconst stats = await sync.getSyncStats();\n\texpect(stats.totalContacts).toBe(0);\n});\n", - "README.md": "# Sync Contacts for RivetKit\n\nExample project demonstrating offline-first contact synchronization with conflict resolution using [RivetKit](https://rivetkit.org).\n\n[Learn More →](https://github.com/rivet-gg/rivetkit)\n\n[Discord](https://rivet.gg/discord) — [Documentation](https://rivetkit.org) — [Issues](https://github.com/rivet-gg/rivetkit/issues)\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 18+\n\n### Installation\n\n```sh\ngit clone https://github.com/rivet-gg/rivetkit\ncd rivetkit/examples/sync\nnpm install\n```\n\n### Development\n\n```sh\nnpm run dev\n```\n\nOpen your browser to `http://localhost:3000`\n\n## Features\n\n- **Offline-First Sync**: Add contacts locally, sync when connection available\n- **Conflict Resolution**: \"Last write wins\" conflict resolution using timestamps\n- **Real-time Updates**: See changes from other clients immediately\n- **Soft Deletes**: Deleted contacts are marked as deleted, not removed\n- **Periodic Sync**: Automatic background synchronization every 5 seconds\n- **Manual Sync**: Force synchronization with \"Sync Now\" button\n- **Sync Statistics**: Track total contacts, deletions, and last sync time\n- **Connection Status**: Visual indicators for sync status (Synced/Syncing/Offline)\n\n## How it works\n\nThis contact sync system demonstrates:\n\n1. **Offline-First Architecture**: Changes are applied locally first for immediate UI feedback\n2. **Conflict Resolution**: Server uses timestamp-based \"last write wins\" strategy\n3. **Event Broadcasting**: Real-time updates sent to all connected clients\n4. **Soft Delete Pattern**: Deleted contacts marked with empty name instead of removal\n5. **Periodic Synchronization**: Background sync every 5 seconds to catch remote changes\n6. **Optimistic Updates**: UI updates immediately before server confirmation\n\n## Architecture\n\n- **Backend**: RivetKit actor managing contact state and synchronization logic\n- **Frontend**: React application with offline-first contact management\n- **Sync Strategy**: Timestamp-based conflict resolution with periodic reconciliation\n- **State Management**: Server-side persistence with client-side optimistic updates\n\n## Synchronization Flow\n\n### Adding Contacts\n```typescript\n// 1. Add locally for immediate UI feedback\nsetContacts(prev => [...prev, newContact]);\n\n// 2. Push to server for persistence and broadcast\nawait actor.pushChanges([newContact]);\n```\n\n### Conflict Resolution\n```typescript\n// Server-side: Last write wins based on timestamp\nif (!existing || existing.updatedAt < contact.updatedAt) {\n state.contacts[contact.id] = contact;\n}\n```\n\n### Periodic Sync\n```typescript\n// Every 5 seconds:\n// 1. Get remote changes since last sync\nconst changes = await actor.getChanges(lastSyncTime);\n\n// 2. Apply remote changes locally\n// 3. Push any local changes to server\n// 4. Update last sync timestamp\n```\n\n## Sync Strategies\n\nThis example implements **Last Write Wins** conflict resolution, but the pattern supports other strategies:\n\n### Last Write Wins (Current Implementation)\n- Simple timestamp comparison\n- Most recent change takes precedence\n- Easy to implement and understand\n- Risk of data loss in concurrent edits\n\n### Alternative Strategies\n- **Operational Transform**: Transform operations to maintain intent\n- **CRDTs**: Conflict-free replicated data types for automatic resolution\n- **Three-Way Merge**: Compare base, local, and remote versions\n- **User-Prompted Resolution**: Ask user to resolve conflicts manually\n\n## Use Cases\n\nThis sync pattern is perfect for:\n\n- **Contact Management**: Personal and business contact lists\n- **Note Taking**: Distributed note-taking applications\n- **Todo Lists**: Task management with offline support\n- **Settings Sync**: User preferences across devices\n- **Shopping Lists**: Collaborative shopping with family/friends\n- **Inventory Management**: Small business inventory tracking\n\n## Extending\n\nThis sync system can be enhanced with:\n\n- **User Authentication**: Per-user contact isolation\n- **Categories/Tags**: Organize contacts into groups\n- **Import/Export**: Bulk contact operations\n- **Search/Filtering**: Find contacts quickly\n- **Merge Conflicts**: UI for manual conflict resolution\n- **Backup/Restore**: Data protection features\n- **Sharing**: Share contacts between users\n- **Versioning**: Track contact change history\n- **Advanced Sync**: Delta sync for large datasets\n\n## Offline Behavior\n\n### When Offline\n- Contacts can still be added/deleted locally\n- Changes are queued for next sync\n- UI shows \"Offline\" status\n- All functionality remains available\n\n### When Reconnecting\n- Automatic sync of queued changes\n- Conflict resolution applied\n- Status updates to \"Syncing\" then \"Synced\"\n- Real-time updates resume\n\n## Testing Offline Sync\n\nTo test offline functionality:\n\n1. **Add contacts** while online\n2. **Disconnect network** (disable WiFi or ethernet)\n3. **Add more contacts** - they appear locally\n4. **Reconnect network** - contacts sync automatically\n5. **Open multiple tabs** - see real-time sync between clients\n\n## Performance Considerations\n\n### Optimization Strategies\n- **Delta Sync**: Only sync changes since last sync\n- **Batching**: Group multiple changes into single requests\n- **Compression**: Compress sync payloads for large datasets\n- **Indexing**: Index by timestamp for efficient change queries\n- **Pagination**: Handle large contact lists efficiently\n\n### Scalability Notes\n- Current implementation stores all contacts in memory\n- For production, consider database persistence\n- Implement pagination for large contact lists\n- Add rate limiting for sync operations\n- Consider WebSocket connections for real-time updates\n\n## Error Handling\n\nThe system handles various error scenarios:\n\n- **Network Failures**: Fall back to offline mode\n- **Server Errors**: Retry with exponential backoff\n- **Sync Conflicts**: Automatic resolution with timestamps\n- **Invalid Data**: Validation before persistence\n- **Connection Loss**: Queue changes for later sync\n\n## License\n\nApache 2.0", + "README.md": "# Sync Contacts for RivetKit\n\nExample project demonstrating offline-first contact synchronization with conflict resolution using [RivetKit](https://rivetkit.org).\n\n[Learn More →](https://github.com/rivet-dev/rivetkit)\n\n[Discord](https://rivet.dev/discord) — [Documentation](https://rivetkit.org) — [Issues](https://github.com/rivet-dev/rivetkit/issues)\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 18+\n\n### Installation\n\n```sh\ngit clone https://github.com/rivet-dev/rivetkit\ncd rivetkit/examples/sync\nnpm install\n```\n\n### Development\n\n```sh\nnpm run dev\n```\n\nOpen your browser to `http://localhost:3000`\n\n## Features\n\n- **Offline-First Sync**: Add contacts locally, sync when connection available\n- **Conflict Resolution**: \"Last write wins\" conflict resolution using timestamps\n- **Real-time Updates**: See changes from other clients immediately\n- **Soft Deletes**: Deleted contacts are marked as deleted, not removed\n- **Periodic Sync**: Automatic background synchronization every 5 seconds\n- **Manual Sync**: Force synchronization with \"Sync Now\" button\n- **Sync Statistics**: Track total contacts, deletions, and last sync time\n- **Connection Status**: Visual indicators for sync status (Synced/Syncing/Offline)\n\n## How it works\n\nThis contact sync system demonstrates:\n\n1. **Offline-First Architecture**: Changes are applied locally first for immediate UI feedback\n2. **Conflict Resolution**: Server uses timestamp-based \"last write wins\" strategy\n3. **Event Broadcasting**: Real-time updates sent to all connected clients\n4. **Soft Delete Pattern**: Deleted contacts marked with empty name instead of removal\n5. **Periodic Synchronization**: Background sync every 5 seconds to catch remote changes\n6. **Optimistic Updates**: UI updates immediately before server confirmation\n\n## Architecture\n\n- **Backend**: RivetKit actor managing contact state and synchronization logic\n- **Frontend**: React application with offline-first contact management\n- **Sync Strategy**: Timestamp-based conflict resolution with periodic reconciliation\n- **State Management**: Server-side persistence with client-side optimistic updates\n\n## Synchronization Flow\n\n### Adding Contacts\n```typescript\n// 1. Add locally for immediate UI feedback\nsetContacts(prev => [...prev, newContact]);\n\n// 2. Push to server for persistence and broadcast\nawait actor.pushChanges([newContact]);\n```\n\n### Conflict Resolution\n```typescript\n// Server-side: Last write wins based on timestamp\nif (!existing || existing.updatedAt < contact.updatedAt) {\n state.contacts[contact.id] = contact;\n}\n```\n\n### Periodic Sync\n```typescript\n// Every 5 seconds:\n// 1. Get remote changes since last sync\nconst changes = await actor.getChanges(lastSyncTime);\n\n// 2. Apply remote changes locally\n// 3. Push any local changes to server\n// 4. Update last sync timestamp\n```\n\n## Sync Strategies\n\nThis example implements **Last Write Wins** conflict resolution, but the pattern supports other strategies:\n\n### Last Write Wins (Current Implementation)\n- Simple timestamp comparison\n- Most recent change takes precedence\n- Easy to implement and understand\n- Risk of data loss in concurrent edits\n\n### Alternative Strategies\n- **Operational Transform**: Transform operations to maintain intent\n- **CRDTs**: Conflict-free replicated data types for automatic resolution\n- **Three-Way Merge**: Compare base, local, and remote versions\n- **User-Prompted Resolution**: Ask user to resolve conflicts manually\n\n## Use Cases\n\nThis sync pattern is perfect for:\n\n- **Contact Management**: Personal and business contact lists\n- **Note Taking**: Distributed note-taking applications\n- **Todo Lists**: Task management with offline support\n- **Settings Sync**: User preferences across devices\n- **Shopping Lists**: Collaborative shopping with family/friends\n- **Inventory Management**: Small business inventory tracking\n\n## Extending\n\nThis sync system can be enhanced with:\n\n- **User Authentication**: Per-user contact isolation\n- **Categories/Tags**: Organize contacts into groups\n- **Import/Export**: Bulk contact operations\n- **Search/Filtering**: Find contacts quickly\n- **Merge Conflicts**: UI for manual conflict resolution\n- **Backup/Restore**: Data protection features\n- **Sharing**: Share contacts between users\n- **Versioning**: Track contact change history\n- **Advanced Sync**: Delta sync for large datasets\n\n## Offline Behavior\n\n### When Offline\n- Contacts can still be added/deleted locally\n- Changes are queued for next sync\n- UI shows \"Offline\" status\n- All functionality remains available\n\n### When Reconnecting\n- Automatic sync of queued changes\n- Conflict resolution applied\n- Status updates to \"Syncing\" then \"Synced\"\n- Real-time updates resume\n\n## Testing Offline Sync\n\nTo test offline functionality:\n\n1. **Add contacts** while online\n2. **Disconnect network** (disable WiFi or ethernet)\n3. **Add more contacts** - they appear locally\n4. **Reconnect network** - contacts sync automatically\n5. **Open multiple tabs** - see real-time sync between clients\n\n## Performance Considerations\n\n### Optimization Strategies\n- **Delta Sync**: Only sync changes since last sync\n- **Batching**: Group multiple changes into single requests\n- **Compression**: Compress sync payloads for large datasets\n- **Indexing**: Index by timestamp for efficient change queries\n- **Pagination**: Handle large contact lists efficiently\n\n### Scalability Notes\n- Current implementation stores all contacts in memory\n- For production, consider database persistence\n- Implement pagination for large contact lists\n- Add rate limiting for sync operations\n- Consider WebSocket connections for real-time updates\n\n## Error Handling\n\nThe system handles various error scenarios:\n\n- **Network Failures**: Fall back to offline mode\n- **Server Errors**: Retry with exponential backoff\n- **Sync Conflicts**: Automatic resolution with timestamps\n- **Invalid Data**: Validation before persistence\n- **Connection Loss**: Queue changes for later sync\n\n## License\n\nApache 2.0", "package-lock.json": "{\n \"name\": \"example-sync\",\n \"version\": \"1.0.0\",\n \"lockfileVersion\": 3,\n \"requires\": true,\n \"packages\": {\n \"\": {\n \"name\": \"example-sync\",\n \"version\": \"1.0.0\",\n \"dependencies\": {\n \"rivetkit\": \"^0.9.1\",\n \"@rivetkit/react\": \"^0.9.1\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^20.0.0\",\n \"@types/react\": \"^18.2.0\",\n \"@types/react-dom\": \"^18.2.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"concurrently\": \"^8.2.0\",\n \"tsx\": \"^4.0.0\",\n \"typescript\": \"^5.0.0\",\n \"vite\": \"^5.0.0\",\n \"vitest\": \"^1.0.0\"\n }\n },\n \"node_modules/@ampproject/remapping\": {\n \"version\": \"2.3.0\",\n \"resolved\": \"https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz\",\n \"integrity\": \"sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@jridgewell/gen-mapping\": \"^0.3.5\",\n \"@jridgewell/trace-mapping\": \"^0.3.24\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@babel/code-frame\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz\",\n \"integrity\": \"sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-validator-identifier\": \"^7.27.1\",\n \"js-tokens\": \"^4.0.0\",\n \"picocolors\": \"^1.1.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/compat-data\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz\",\n \"integrity\": \"sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/core\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz\",\n \"integrity\": \"sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@ampproject/remapping\": \"^2.2.0\",\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/generator\": \"^7.28.0\",\n \"@babel/helper-compilation-targets\": \"^7.27.2\",\n \"@babel/helper-module-transforms\": \"^7.27.3\",\n \"@babel/helpers\": \"^7.27.6\",\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/template\": \"^7.27.2\",\n \"@babel/traverse\": \"^7.28.0\",\n \"@babel/types\": \"^7.28.0\",\n \"convert-source-map\": \"^2.0.0\",\n \"debug\": \"^4.1.0\",\n \"gensync\": \"^1.0.0-beta.2\",\n \"json5\": \"^2.2.3\",\n \"semver\": \"^6.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"funding\": {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/babel\"\n }\n },\n \"node_modules/@babel/generator\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz\",\n \"integrity\": \"sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/types\": \"^7.28.0\",\n \"@jridgewell/gen-mapping\": \"^0.3.12\",\n \"@jridgewell/trace-mapping\": \"^0.3.28\",\n \"jsesc\": \"^3.0.2\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-compilation-targets\": {\n \"version\": \"7.27.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz\",\n \"integrity\": \"sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/compat-data\": \"^7.27.2\",\n \"@babel/helper-validator-option\": \"^7.27.1\",\n \"browserslist\": \"^4.24.0\",\n \"lru-cache\": \"^5.1.1\",\n \"semver\": \"^6.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-globals\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz\",\n \"integrity\": \"sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-module-imports\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz\",\n \"integrity\": \"sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/traverse\": \"^7.27.1\",\n \"@babel/types\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-module-transforms\": {\n \"version\": \"7.27.3\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz\",\n \"integrity\": \"sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-module-imports\": \"^7.27.1\",\n \"@babel/helper-validator-identifier\": \"^7.27.1\",\n \"@babel/traverse\": \"^7.27.3\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0\"\n }\n },\n \"node_modules/@babel/helper-plugin-utils\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz\",\n \"integrity\": \"sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-string-parser\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz\",\n \"integrity\": \"sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-validator-identifier\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz\",\n \"integrity\": \"sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-validator-option\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz\",\n \"integrity\": \"sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helpers\": {\n \"version\": \"7.27.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz\",\n \"integrity\": \"sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/template\": \"^7.27.2\",\n \"@babel/types\": \"^7.27.6\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/parser\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz\",\n \"integrity\": \"sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.28.0\"\n },\n \"bin\": {\n \"parser\": \"bin/babel-parser.js\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@babel/plugin-transform-react-jsx-self\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz\",\n \"integrity\": \"sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-plugin-utils\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/plugin-transform-react-jsx-source\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz\",\n \"integrity\": \"sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-plugin-utils\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/runtime\": {\n \"version\": \"7.27.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz\",\n \"integrity\": \"sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/template\": {\n \"version\": \"7.27.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz\",\n \"integrity\": \"sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/parser\": \"^7.27.2\",\n \"@babel/types\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/traverse\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz\",\n \"integrity\": \"sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/generator\": \"^7.28.0\",\n \"@babel/helper-globals\": \"^7.28.0\",\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/template\": \"^7.27.2\",\n \"@babel/types\": \"^7.28.0\",\n \"debug\": \"^4.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/types\": {\n \"version\": \"7.28.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/types/-/types-7.28.1.tgz\",\n \"integrity\": \"sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-string-parser\": \"^7.27.1\",\n \"@babel/helper-validator-identifier\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@cbor-extract/cbor-extract-darwin-arm64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.0.tgz\",\n \"integrity\": \"sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-darwin-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-arm\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.2.0.tgz\",\n \"integrity\": \"sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==\",\n \"cpu\": [\n \"arm\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-arm64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.2.0.tgz\",\n \"integrity\": \"sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-win32-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"peer\": true\n },\n \"node_modules/@esbuild/aix-ppc64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.6.tgz\",\n \"integrity\": \"sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"aix\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/android-arm\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.6.tgz\",\n \"integrity\": \"sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/android-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/android-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/darwin-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/darwin-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/freebsd-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/freebsd-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-arm\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.6.tgz\",\n \"integrity\": \"sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-ia32\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.6.tgz\",\n \"integrity\": \"sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-loong64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.6.tgz\",\n \"integrity\": \"sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-mips64el\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.6.tgz\",\n \"integrity\": \"sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==\",\n \"cpu\": [\n \"mips64el\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-ppc64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.6.tgz\",\n \"integrity\": \"sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-riscv64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.6.tgz\",\n \"integrity\": \"sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-s390x\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.6.tgz\",\n \"integrity\": \"sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/netbsd-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"netbsd\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/netbsd-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"netbsd\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/openbsd-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"openbsd\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/openbsd-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"openbsd\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/openharmony-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"openharmony\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/sunos-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"sunos\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/win32-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/win32-ia32\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.6.tgz\",\n \"integrity\": \"sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/win32-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@jest/schemas\": {\n \"version\": \"29.6.3\",\n \"resolved\": \"https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz\",\n \"integrity\": \"sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@sinclair/typebox\": \"^0.27.8\"\n },\n \"engines\": {\n \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n }\n },\n \"node_modules/@jridgewell/gen-mapping\": {\n \"version\": \"0.3.12\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz\",\n \"integrity\": \"sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/sourcemap-codec\": \"^1.5.0\",\n \"@jridgewell/trace-mapping\": \"^0.3.24\"\n }\n },\n \"node_modules/@jridgewell/resolve-uri\": {\n \"version\": \"3.1.2\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz\",\n \"integrity\": \"sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@jridgewell/sourcemap-codec\": {\n \"version\": \"1.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz\",\n \"integrity\": \"sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@jridgewell/trace-mapping\": {\n \"version\": \"0.3.29\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz\",\n \"integrity\": \"sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/resolve-uri\": \"^3.1.0\",\n \"@jridgewell/sourcemap-codec\": \"^1.4.14\"\n }\n },\n \"node_modules/rivetkit\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/rivetkit/-/actor-0.9.1.tgz\",\n \"integrity\": \"sha512-aVoWO81JrYql6hhXX+vRor0B+aeWrnh+9zkcrxbh0EXFBbS5XM8YE4sSFxNKmZThLbGNqfZ5enm1zuA92c7I1w==\",\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\"\n }\n },\n \"node_modules/@rivetkit/core\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/core/-/core-0.9.1.tgz\",\n \"integrity\": \"sha512-0zYFKo08CQ72Rm6MaVKxcJSEEfn/ypGkkxTX06Q4meCGHuDJFbPA5wopa3NdxrKBPttcGg1QAmDd+1FZnlpubA==\",\n \"license\": \"Apache-2.0\",\n \"peer\": true,\n \"dependencies\": {\n \"cbor-x\": \"^1.6.0\",\n \"invariant\": \"^2.2.4\",\n \"on-change\": \"^5.0.1\",\n \"p-retry\": \"^6.2.1\",\n \"zod\": \"^3.25.67\"\n },\n \"engines\": {\n \"node\": \">=22.0.0\"\n },\n \"peerDependencies\": {\n \"@hono/node-server\": \"^1.14.0\",\n \"@hono/node-ws\": \"^1.1.1\",\n \"@hono/zod-openapi\": \"^0.19.6\",\n \"eventsource\": \"^3.0.5\",\n \"hono\": \"^4.7.0\",\n \"ws\": \"^8.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@hono/node-server\": {\n \"optional\": true\n },\n \"@hono/node-ws\": {\n \"optional\": true\n },\n \"@hono/zod-openapi\": {\n \"optional\": true\n },\n \"eventsource\": {\n \"optional\": true\n },\n \"hono\": {\n \"optional\": true\n },\n \"ws\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/@rivetkit/framework-base\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/framework-base/-/framework-base-0.9.1.tgz\",\n \"integrity\": \"sha512-FxhSqGAtDsD4k7gKS2EhJ5hHsEwI1+QR0vYThUBOLcmXM7zjMZndqIjVperQO4ck/zfjRqjm3lw7znkc+k0wNQ==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@tanstack/store\": \"^0.7.1\"\n },\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\"\n }\n },\n \"node_modules/@rivetkit/react\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/react/-/react-0.9.1.tgz\",\n \"integrity\": \"sha512-0e0gNNj3qCrXHNIxE6ggEEX+E6HjdsSt9pJbWbaQQg+1bsywupRTSdgSDguDHjBvi9qhR9mh7UbNN3A9wYqXuA==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@rivetkit/framework-base\": \"0.9.1\",\n \"@tanstack/react-store\": \"^0.7.1\"\n },\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\",\n \"react\": \"^18 || ^19\",\n \"react-dom\": \"^18 || ^19\"\n }\n },\n \"node_modules/@rolldown/pluginutils\": {\n \"version\": \"1.0.0-beta.19\",\n \"resolved\": \"https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz\",\n \"integrity\": \"sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@rollup/rollup-android-arm-eabi\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.0.tgz\",\n \"integrity\": \"sha512-2o/FgACbji4tW1dzXOqAV15Eu7DdgbKsF2QKcxfG4xbh5iwU7yr5RRP5/U+0asQliSYv5M4o7BevlGIoSL0LXg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ]\n },\n \"node_modules/@rollup/rollup-android-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-PSZ0SvMOjEAxwZeTx32eI/j5xSYtDCRxGu5k9zvzoY77xUNssZM+WV6HYBLROpY5CkXsbQjvz40fBb7WPwDqtQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ]\n },\n \"node_modules/@rollup/rollup-darwin-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-BA4yPIPssPB2aRAWzmqzQ3y2/KotkLyZukVB7j3psK/U3nVJdceo6qr9pLM2xN6iRP/wKfxEbOb1yrlZH6sYZg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ]\n },\n \"node_modules/@rollup/rollup-darwin-x64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.0.tgz\",\n \"integrity\": \"sha512-Pr2o0lvTwsiG4HCr43Zy9xXrHspyMvsvEw4FwKYqhli4FuLE5FjcZzuQ4cfPe0iUFCvSQG6lACI0xj74FDZKRA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ]\n },\n \"node_modules/@rollup/rollup-freebsd-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-lYE8LkE5h4a/+6VnnLiL14zWMPnx6wNbDG23GcYFpRW1V9hYWHAw9lBZ6ZUIrOaoK7NliF1sdwYGiVmziUF4vA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ]\n },\n \"node_modules/@rollup/rollup-freebsd-x64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.0.tgz\",\n \"integrity\": \"sha512-PVQWZK9sbzpvqC9Q0GlehNNSVHR+4m7+wET+7FgSnKG3ci5nAMgGmr9mGBXzAuE5SvguCKJ6mHL6vq1JaJ/gvw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm-gnueabihf\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.0.tgz\",\n \"integrity\": \"sha512-hLrmRl53prCcD+YXTfNvXd776HTxNh8wPAMllusQ+amcQmtgo3V5i/nkhPN6FakW+QVLoUUr2AsbtIRPFU3xIA==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm-musleabihf\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.0.tgz\",\n \"integrity\": \"sha512-XBKGSYcrkdiRRjl+8XvrUR3AosXU0NvF7VuqMsm7s5nRy+nt58ZMB19Jdp1RdqewLcaYnpk8zeVs/4MlLZEJxw==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-fRvZZPUiBz7NztBE/2QnCS5AtqLVhXmUOPj9IHlfGEXkapgImf4W9+FSkL8cWqoAjozyUzqFmSc4zh2ooaeF6g==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-Btv2WRZOcUGi8XU80XwIvzTg4U6+l6D0V6sZTrZx214nrwxw5nAi8hysaXj/mctyClWgesyuxbeLylCBNauimg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-loongarch64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-Li0emNnwtUZdLwHjQPBxn4VWztcrw/h7mgLyHiEI5Z0MhpeFGlzaiBHpSNVOMB/xucjXTTcO+dhv469Djr16KA==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-powerpc64le-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-sB8+pfkYx2kvpDCfd63d5ScYT0Fz1LO6jIb2zLZvmK9ob2D8DeVqrmBDE0iDK8KlBVmsTNzrjr3G1xV4eUZhSw==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-riscv64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-5GQ6PFhh7E6jQm70p1aW05G2cap5zMOvO0se5JMecHeAdj5ZhWEHbJ4hiKpfi1nnnEdTauDXxPgXae/mqjow9w==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-riscv64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-N/euLsBd1rekWcuduakTo/dJw6U6sBP3eUq+RXM9RNfPuWTvG2w/WObDkIvJ2KChy6oxZmOSC08Ak2OJA0UiAA==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-s390x-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-2l9sA7d7QdikL0xQwNMO3xURBUNEWyHVHfAsHsUdq+E/pgLTUcCE+gih5PCdmyHmfTDeXUWVhqL0WZzg0nua3g==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-x64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-XZdD3fEEQcwG2KrJDdEQu7NrHonPxxaV0/w2HpvINBdcqebz1aL+0vM2WFJq4DeiAVT6F5SUQas65HY5JDqoPw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-x64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-7ayfgvtmmWgKWBkCGg5+xTQ0r5V1owVm67zTrsEY1008L5ro7mCyGYORomARt/OquB9KY7LpxVBZes+oSniAAQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-arm64-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-B+IJgcBnE2bm93jEW5kHisqvPITs4ddLOROAcOc/diBgrEiQJJ6Qcjby75rFSmH5eMGrqJryUgJDhrfj942apQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-ia32-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-+CXwwG66g0/FpWOnP/v1HnrGVSOygK/osUbu3wPRy8ECXjoYKjRAyfxYpDQOfghC5qPJYLPH0oN4MCOjwgdMug==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-x64-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-SRf1cytG7wqcHVLrBc9VtPK4pU5wxiB/lNIkNmW2ApKXIg+RpqwHfsaEK+e7eH4A1BpI6BX/aBWXxZCIrJg3uA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@sinclair/typebox\": {\n \"version\": \"0.27.8\",\n \"resolved\": \"https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz\",\n \"integrity\": \"sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@tanstack/react-store\": {\n \"version\": \"0.7.3\",\n \"resolved\": \"https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.7.3.tgz\",\n \"integrity\": \"sha512-3Dnqtbw9P2P0gw8uUM8WP2fFfg8XMDSZCTsywRPZe/XqqYW8PGkXKZTvP0AHkE4mpqP9Y43GpOg9vwO44azu6Q==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@tanstack/store\": \"0.7.2\",\n \"use-sync-external-store\": \"^1.5.0\"\n },\n \"funding\": {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/tannerlinsley\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\",\n \"react-dom\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\"\n }\n },\n \"node_modules/@tanstack/store\": {\n \"version\": \"0.7.2\",\n \"resolved\": \"https://registry.npmjs.org/@tanstack/store/-/store-0.7.2.tgz\",\n \"integrity\": \"sha512-RP80Z30BYiPX2Pyo0Nyw4s1SJFH2jyM6f9i3HfX4pA+gm5jsnYryscdq2aIQLnL4TaGuQMO+zXmN9nh1Qck+Pg==\",\n \"license\": \"MIT\",\n \"funding\": {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/tannerlinsley\"\n }\n },\n \"node_modules/@types/babel__core\": {\n \"version\": \"7.20.5\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz\",\n \"integrity\": \"sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.20.7\",\n \"@babel/types\": \"^7.20.7\",\n \"@types/babel__generator\": \"*\",\n \"@types/babel__template\": \"*\",\n \"@types/babel__traverse\": \"*\"\n }\n },\n \"node_modules/@types/babel__generator\": {\n \"version\": \"7.27.0\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz\",\n \"integrity\": \"sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.0.0\"\n }\n },\n \"node_modules/@types/babel__template\": {\n \"version\": \"7.4.4\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz\",\n \"integrity\": \"sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.1.0\",\n \"@babel/types\": \"^7.0.0\"\n }\n },\n \"node_modules/@types/babel__traverse\": {\n \"version\": \"7.20.7\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz\",\n \"integrity\": \"sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.20.7\"\n }\n },\n \"node_modules/@types/estree\": {\n \"version\": \"1.0.8\",\n \"resolved\": \"https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz\",\n \"integrity\": \"sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@types/node\": {\n \"version\": \"20.19.7\",\n \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-20.19.7.tgz\",\n \"integrity\": \"sha512-1GM9z6BJOv86qkPvzh2i6VW5+VVrXxCLknfmTkWEqz+6DqosiY28XUWCTmBcJ0ACzKqx/iwdIREfo1fwExIlkA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"undici-types\": \"~6.21.0\"\n }\n },\n \"node_modules/@types/prop-types\": {\n \"version\": \"15.7.15\",\n \"resolved\": \"https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz\",\n \"integrity\": \"sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@types/react\": {\n \"version\": \"18.3.23\",\n \"resolved\": \"https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz\",\n \"integrity\": \"sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/prop-types\": \"*\",\n \"csstype\": \"^3.0.2\"\n }\n },\n \"node_modules/@types/react-dom\": {\n \"version\": \"18.3.7\",\n \"resolved\": \"https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz\",\n \"integrity\": \"sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"peerDependencies\": {\n \"@types/react\": \"^18.0.0\"\n }\n },\n \"node_modules/@types/retry\": {\n \"version\": \"0.12.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz\",\n \"integrity\": \"sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==\",\n \"license\": \"MIT\",\n \"peer\": true\n },\n \"node_modules/@vitejs/plugin-react\": {\n \"version\": \"4.6.0\",\n \"resolved\": \"https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.6.0.tgz\",\n \"integrity\": \"sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/core\": \"^7.27.4\",\n \"@babel/plugin-transform-react-jsx-self\": \"^7.27.1\",\n \"@babel/plugin-transform-react-jsx-source\": \"^7.27.1\",\n \"@rolldown/pluginutils\": \"1.0.0-beta.19\",\n \"@types/babel__core\": \"^7.20.5\",\n \"react-refresh\": \"^0.17.0\"\n },\n \"engines\": {\n \"node\": \"^14.18.0 || >=16.0.0\"\n },\n \"peerDependencies\": {\n \"vite\": \"^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0\"\n }\n },\n \"node_modules/@vitest/expect\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/expect/-/expect-1.6.1.tgz\",\n \"integrity\": \"sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/spy\": \"1.6.1\",\n \"@vitest/utils\": \"1.6.1\",\n \"chai\": \"^4.3.10\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/runner\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/runner/-/runner-1.6.1.tgz\",\n \"integrity\": \"sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/utils\": \"1.6.1\",\n \"p-limit\": \"^5.0.0\",\n \"pathe\": \"^1.1.1\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/snapshot\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.1.tgz\",\n \"integrity\": \"sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"magic-string\": \"^0.30.5\",\n \"pathe\": \"^1.1.1\",\n \"pretty-format\": \"^29.7.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/spy\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/spy/-/spy-1.6.1.tgz\",\n \"integrity\": \"sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"tinyspy\": \"^2.2.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/utils\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/utils/-/utils-1.6.1.tgz\",\n \"integrity\": \"sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"diff-sequences\": \"^29.6.3\",\n \"estree-walker\": \"^3.0.3\",\n \"loupe\": \"^2.3.7\",\n \"pretty-format\": \"^29.7.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/acorn\": {\n \"version\": \"8.15.0\",\n \"resolved\": \"https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz\",\n \"integrity\": \"sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"acorn\": \"bin/acorn\"\n },\n \"engines\": {\n \"node\": \">=0.4.0\"\n }\n },\n \"node_modules/acorn-walk\": {\n \"version\": \"8.3.4\",\n \"resolved\": \"https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz\",\n \"integrity\": \"sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"acorn\": \"^8.11.0\"\n },\n \"engines\": {\n \"node\": \">=0.4.0\"\n }\n },\n \"node_modules/ansi-regex\": {\n \"version\": \"5.0.1\",\n \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/ansi-styles\": {\n \"version\": \"4.3.0\",\n \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\n \"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"color-convert\": \"^2.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n }\n },\n \"node_modules/assertion-error\": {\n \"version\": \"1.1.0\",\n \"resolved\": \"https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz\",\n \"integrity\": \"sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \"*\"\n }\n },\n \"node_modules/browserslist\": {\n \"version\": \"4.25.1\",\n \"resolved\": \"https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz\",\n \"integrity\": \"sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"caniuse-lite\": \"^1.0.30001726\",\n \"electron-to-chromium\": \"^1.5.173\",\n \"node-releases\": \"^2.0.19\",\n \"update-browserslist-db\": \"^1.1.3\"\n },\n \"bin\": {\n \"browserslist\": \"cli.js\"\n },\n \"engines\": {\n \"node\": \"^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7\"\n }\n },\n \"node_modules/cac\": {\n \"version\": \"6.7.14\",\n \"resolved\": \"https://registry.npmjs.org/cac/-/cac-6.7.14.tgz\",\n \"integrity\": \"sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/caniuse-lite\": {\n \"version\": \"1.0.30001727\",\n \"resolved\": \"https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz\",\n \"integrity\": \"sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/caniuse-lite\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"CC-BY-4.0\"\n },\n \"node_modules/cbor-extract\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/cbor-extract/-/cbor-extract-2.2.0.tgz\",\n \"integrity\": \"sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==\",\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"peer\": true,\n \"dependencies\": {\n \"node-gyp-build-optional-packages\": \"5.1.1\"\n },\n \"bin\": {\n \"download-cbor-prebuilds\": \"bin/download-prebuilds.js\"\n },\n \"optionalDependencies\": {\n \"@cbor-extract/cbor-extract-darwin-arm64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-darwin-x64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-arm\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-arm64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-x64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-win32-x64\": \"2.2.0\"\n }\n },\n \"node_modules/cbor-x\": {\n \"version\": \"1.6.0\",\n \"resolved\": \"https://registry.npmjs.org/cbor-x/-/cbor-x-1.6.0.tgz\",\n \"integrity\": \"sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"optionalDependencies\": {\n \"cbor-extract\": \"^2.2.0\"\n }\n },\n \"node_modules/chai\": {\n \"version\": \"4.5.0\",\n \"resolved\": \"https://registry.npmjs.org/chai/-/chai-4.5.0.tgz\",\n \"integrity\": \"sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"assertion-error\": \"^1.1.0\",\n \"check-error\": \"^1.0.3\",\n \"deep-eql\": \"^4.1.3\",\n \"get-func-name\": \"^2.0.2\",\n \"loupe\": \"^2.3.6\",\n \"pathval\": \"^1.1.1\",\n \"type-detect\": \"^4.1.0\"\n },\n \"engines\": {\n \"node\": \">=4\"\n }\n },\n \"node_modules/chalk\": {\n \"version\": \"4.1.2\",\n \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz\",\n \"integrity\": \"sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-styles\": \"^4.1.0\",\n \"supports-color\": \"^7.1.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/chalk?sponsor=1\"\n }\n },\n \"node_modules/chalk/node_modules/supports-color\": {\n \"version\": \"7.2.0\",\n \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz\",\n \"integrity\": \"sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"has-flag\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/check-error\": {\n \"version\": \"1.0.3\",\n \"resolved\": \"https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz\",\n \"integrity\": \"sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"get-func-name\": \"^2.0.2\"\n },\n \"engines\": {\n \"node\": \"*\"\n }\n },\n \"node_modules/cliui\": {\n \"version\": \"8.0.1\",\n \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz\",\n \"integrity\": \"sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"dependencies\": {\n \"string-width\": \"^4.2.0\",\n \"strip-ansi\": \"^6.0.1\",\n \"wrap-ansi\": \"^7.0.0\"\n },\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/color-convert\": {\n \"version\": \"2.0.1\",\n \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\n \"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"color-name\": \"~1.1.4\"\n },\n \"engines\": {\n \"node\": \">=7.0.0\"\n }\n },\n \"node_modules/color-name\": {\n \"version\": \"1.1.4\",\n \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\n \"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/concurrently\": {\n \"version\": \"8.2.2\",\n \"resolved\": \"https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz\",\n \"integrity\": \"sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"chalk\": \"^4.1.2\",\n \"date-fns\": \"^2.30.0\",\n \"lodash\": \"^4.17.21\",\n \"rxjs\": \"^7.8.1\",\n \"shell-quote\": \"^1.8.1\",\n \"spawn-command\": \"0.0.2\",\n \"supports-color\": \"^8.1.1\",\n \"tree-kill\": \"^1.2.2\",\n \"yargs\": \"^17.7.2\"\n },\n \"bin\": {\n \"conc\": \"dist/bin/concurrently.js\",\n \"concurrently\": \"dist/bin/concurrently.js\"\n },\n \"engines\": {\n \"node\": \"^14.13.0 || >=16.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/open-cli-tools/concurrently?sponsor=1\"\n }\n },\n \"node_modules/confbox\": {\n \"version\": \"0.1.8\",\n \"resolved\": \"https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz\",\n \"integrity\": \"sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/convert-source-map\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz\",\n \"integrity\": \"sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/cross-spawn\": {\n \"version\": \"7.0.6\",\n \"resolved\": \"https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz\",\n \"integrity\": \"sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"path-key\": \"^3.1.0\",\n \"shebang-command\": \"^2.0.0\",\n \"which\": \"^2.0.1\"\n },\n \"engines\": {\n \"node\": \">= 8\"\n }\n },\n \"node_modules/csstype\": {\n \"version\": \"3.1.3\",\n \"resolved\": \"https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz\",\n \"integrity\": \"sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/date-fns\": {\n \"version\": \"2.30.0\",\n \"resolved\": \"https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz\",\n \"integrity\": \"sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.21.0\"\n },\n \"engines\": {\n \"node\": \">=0.11\"\n },\n \"funding\": {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/date-fns\"\n }\n },\n \"node_modules/debug\": {\n \"version\": \"4.4.1\",\n \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.4.1.tgz\",\n \"integrity\": \"sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ms\": \"^2.1.3\"\n },\n \"engines\": {\n \"node\": \">=6.0\"\n },\n \"peerDependenciesMeta\": {\n \"supports-color\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/deep-eql\": {\n \"version\": \"4.1.4\",\n \"resolved\": \"https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz\",\n \"integrity\": \"sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"type-detect\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/detect-libc\": {\n \"version\": \"2.0.4\",\n \"resolved\": \"https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz\",\n \"integrity\": \"sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==\",\n \"license\": \"Apache-2.0\",\n \"optional\": true,\n \"peer\": true,\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/diff-sequences\": {\n \"version\": \"29.6.3\",\n \"resolved\": \"https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz\",\n \"integrity\": \"sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n }\n },\n \"node_modules/electron-to-chromium\": {\n \"version\": \"1.5.183\",\n \"resolved\": \"https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.183.tgz\",\n \"integrity\": \"sha512-vCrDBYjQCAEefWGjlK3EpoSKfKbT10pR4XXPdn65q7snuNOZnthoVpBfZPykmDapOKfoD+MMIPG8ZjKyyc9oHA==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/emoji-regex\": {\n \"version\": \"8.0.0\",\n \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/esbuild\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.25.6.tgz\",\n \"integrity\": \"sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"esbuild\": \"bin/esbuild\"\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"optionalDependencies\": {\n \"@esbuild/aix-ppc64\": \"0.25.6\",\n \"@esbuild/android-arm\": \"0.25.6\",\n \"@esbuild/android-arm64\": \"0.25.6\",\n \"@esbuild/android-x64\": \"0.25.6\",\n \"@esbuild/darwin-arm64\": \"0.25.6\",\n \"@esbuild/darwin-x64\": \"0.25.6\",\n \"@esbuild/freebsd-arm64\": \"0.25.6\",\n \"@esbuild/freebsd-x64\": \"0.25.6\",\n \"@esbuild/linux-arm\": \"0.25.6\",\n \"@esbuild/linux-arm64\": \"0.25.6\",\n \"@esbuild/linux-ia32\": \"0.25.6\",\n \"@esbuild/linux-loong64\": \"0.25.6\",\n \"@esbuild/linux-mips64el\": \"0.25.6\",\n \"@esbuild/linux-ppc64\": \"0.25.6\",\n \"@esbuild/linux-riscv64\": \"0.25.6\",\n \"@esbuild/linux-s390x\": \"0.25.6\",\n \"@esbuild/linux-x64\": \"0.25.6\",\n \"@esbuild/netbsd-arm64\": \"0.25.6\",\n \"@esbuild/netbsd-x64\": \"0.25.6\",\n \"@esbuild/openbsd-arm64\": \"0.25.6\",\n \"@esbuild/openbsd-x64\": \"0.25.6\",\n \"@esbuild/openharmony-arm64\": \"0.25.6\",\n \"@esbuild/sunos-x64\": \"0.25.6\",\n \"@esbuild/win32-arm64\": \"0.25.6\",\n \"@esbuild/win32-ia32\": \"0.25.6\",\n \"@esbuild/win32-x64\": \"0.25.6\"\n }\n },\n \"node_modules/escalade\": {\n \"version\": \"3.2.0\",\n \"resolved\": \"https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz\",\n \"integrity\": \"sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/estree-walker\": {\n \"version\": \"3.0.3\",\n \"resolved\": \"https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz\",\n \"integrity\": \"sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/estree\": \"^1.0.0\"\n }\n },\n \"node_modules/execa\": {\n \"version\": \"8.0.1\",\n \"resolved\": \"https://registry.npmjs.org/execa/-/execa-8.0.1.tgz\",\n \"integrity\": \"sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"cross-spawn\": \"^7.0.3\",\n \"get-stream\": \"^8.0.1\",\n \"human-signals\": \"^5.0.0\",\n \"is-stream\": \"^3.0.0\",\n \"merge-stream\": \"^2.0.0\",\n \"npm-run-path\": \"^5.1.0\",\n \"onetime\": \"^6.0.0\",\n \"signal-exit\": \"^4.1.0\",\n \"strip-final-newline\": \"^3.0.0\"\n },\n \"engines\": {\n \"node\": \">=16.17\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sindresorhus/execa?sponsor=1\"\n }\n },\n \"node_modules/fsevents\": {\n \"version\": \"2.3.3\",\n \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz\",\n \"integrity\": \"sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n }\n },\n \"node_modules/gensync\": {\n \"version\": \"1.0.0-beta.2\",\n \"resolved\": \"https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz\",\n \"integrity\": \"sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/get-caller-file\": {\n \"version\": \"2.0.5\",\n \"resolved\": \"https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz\",\n \"integrity\": \"sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \"6.* || 8.* || >= 10.*\"\n }\n },\n \"node_modules/get-func-name\": {\n \"version\": \"2.0.2\",\n \"resolved\": \"https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz\",\n \"integrity\": \"sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \"*\"\n }\n },\n \"node_modules/get-stream\": {\n \"version\": \"8.0.1\",\n \"resolved\": \"https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz\",\n \"integrity\": \"sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=16\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/get-tsconfig\": {\n \"version\": \"4.10.1\",\n \"resolved\": \"https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz\",\n \"integrity\": \"sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"resolve-pkg-maps\": \"^1.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/privatenumber/get-tsconfig?sponsor=1\"\n }\n },\n \"node_modules/has-flag\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz\",\n \"integrity\": \"sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/human-signals\": {\n \"version\": \"5.0.0\",\n \"resolved\": \"https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz\",\n \"integrity\": \"sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"engines\": {\n \"node\": \">=16.17.0\"\n }\n },\n \"node_modules/invariant\": {\n \"version\": \"2.2.4\",\n \"resolved\": \"https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz\",\n \"integrity\": \"sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"dependencies\": {\n \"loose-envify\": \"^1.0.0\"\n }\n },\n \"node_modules/is-fullwidth-code-point\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz\",\n \"integrity\": \"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/is-network-error\": {\n \"version\": \"1.1.0\",\n \"resolved\": \"https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz\",\n \"integrity\": \"sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">=16\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/is-stream\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz\",\n \"integrity\": \"sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/isexe\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz\",\n \"integrity\": \"sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/js-tokens\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz\",\n \"integrity\": \"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==\",\n \"license\": \"MIT\"\n },\n \"node_modules/jsesc\": {\n \"version\": \"3.1.0\",\n \"resolved\": \"https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz\",\n \"integrity\": \"sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"jsesc\": \"bin/jsesc\"\n },\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/json5\": {\n \"version\": \"2.2.3\",\n \"resolved\": \"https://registry.npmjs.org/json5/-/json5-2.2.3.tgz\",\n \"integrity\": \"sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"json5\": \"lib/cli.js\"\n },\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/local-pkg\": {\n \"version\": \"0.5.1\",\n \"resolved\": \"https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz\",\n \"integrity\": \"sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"mlly\": \"^1.7.3\",\n \"pkg-types\": \"^1.2.1\"\n },\n \"engines\": {\n \"node\": \">=14\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/antfu\"\n }\n },\n \"node_modules/lodash\": {\n \"version\": \"4.17.21\",\n \"resolved\": \"https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz\",\n \"integrity\": \"sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/loose-envify\": {\n \"version\": \"1.4.0\",\n \"resolved\": \"https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz\",\n \"integrity\": \"sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"js-tokens\": \"^3.0.0 || ^4.0.0\"\n },\n \"bin\": {\n \"loose-envify\": \"cli.js\"\n }\n },\n \"node_modules/loupe\": {\n \"version\": \"2.3.7\",\n \"resolved\": \"https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz\",\n \"integrity\": \"sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"get-func-name\": \"^2.0.1\"\n }\n },\n \"node_modules/lru-cache\": {\n \"version\": \"5.1.1\",\n \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz\",\n \"integrity\": \"sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"dependencies\": {\n \"yallist\": \"^3.0.2\"\n }\n },\n \"node_modules/magic-string\": {\n \"version\": \"0.30.17\",\n \"resolved\": \"https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz\",\n \"integrity\": \"sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/sourcemap-codec\": \"^1.5.0\"\n }\n },\n \"node_modules/merge-stream\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz\",\n \"integrity\": \"sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/mimic-fn\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz\",\n \"integrity\": \"sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=12\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/mlly\": {\n \"version\": \"1.7.4\",\n \"resolved\": \"https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz\",\n \"integrity\": \"sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"acorn\": \"^8.14.0\",\n \"pathe\": \"^2.0.1\",\n \"pkg-types\": \"^1.3.0\",\n \"ufo\": \"^1.5.4\"\n }\n },\n \"node_modules/mlly/node_modules/pathe\": {\n \"version\": \"2.0.3\",\n \"resolved\": \"https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz\",\n \"integrity\": \"sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/ms\": {\n \"version\": \"2.1.3\",\n \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz\",\n \"integrity\": \"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/nanoid\": {\n \"version\": \"3.3.11\",\n \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz\",\n \"integrity\": \"sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"bin\": {\n \"nanoid\": \"bin/nanoid.cjs\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || ^13.7 || ^14 || >=15.0.1\"\n }\n },\n \"node_modules/node-gyp-build-optional-packages\": {\n \"version\": \"5.1.1\",\n \"resolved\": \"https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz\",\n \"integrity\": \"sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==\",\n \"license\": \"MIT\",\n \"optional\": true,\n \"peer\": true,\n \"dependencies\": {\n \"detect-libc\": \"^2.0.1\"\n },\n \"bin\": {\n \"node-gyp-build-optional-packages\": \"bin.js\",\n \"node-gyp-build-optional-packages-optional\": \"optional.js\",\n \"node-gyp-build-optional-packages-test\": \"build-test.js\"\n }\n },\n \"node_modules/node-releases\": {\n \"version\": \"2.0.19\",\n \"resolved\": \"https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz\",\n \"integrity\": \"sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/npm-run-path\": {\n \"version\": \"5.3.0\",\n \"resolved\": \"https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz\",\n \"integrity\": \"sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"path-key\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/npm-run-path/node_modules/path-key\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz\",\n \"integrity\": \"sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=12\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/on-change\": {\n \"version\": \"5.0.1\",\n \"resolved\": \"https://registry.npmjs.org/on-change/-/on-change-5.0.1.tgz\",\n \"integrity\": \"sha512-n7THCP7RkyReRSLkJb8kUWoNsxUIBxTkIp3JKno+sEz6o/9AJ3w3P9fzQkITEkMwyTKJjZciF3v/pVoouxZZMg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">=18\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sindresorhus/on-change?sponsor=1\"\n }\n },\n \"node_modules/onetime\": {\n \"version\": \"6.0.0\",\n \"resolved\": \"https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz\",\n \"integrity\": \"sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"mimic-fn\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/p-limit\": {\n \"version\": \"5.0.0\",\n \"resolved\": \"https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz\",\n \"integrity\": \"sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"yocto-queue\": \"^1.0.0\"\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/p-retry\": {\n \"version\": \"6.2.1\",\n \"resolved\": \"https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz\",\n \"integrity\": \"sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"dependencies\": {\n \"@types/retry\": \"0.12.2\",\n \"is-network-error\": \"^1.0.0\",\n \"retry\": \"^0.13.1\"\n },\n \"engines\": {\n \"node\": \">=16.17\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/path-key\": {\n \"version\": \"3.1.1\",\n \"resolved\": \"https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz\",\n \"integrity\": \"sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/pathe\": {\n \"version\": \"1.1.2\",\n \"resolved\": \"https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz\",\n \"integrity\": \"sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/pathval\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz\",\n \"integrity\": \"sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \"*\"\n }\n },\n \"node_modules/picocolors\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz\",\n \"integrity\": \"sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/pkg-types\": {\n \"version\": \"1.3.1\",\n \"resolved\": \"https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz\",\n \"integrity\": \"sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"confbox\": \"^0.1.8\",\n \"mlly\": \"^1.7.4\",\n \"pathe\": \"^2.0.1\"\n }\n },\n \"node_modules/pkg-types/node_modules/pathe\": {\n \"version\": \"2.0.3\",\n \"resolved\": \"https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz\",\n \"integrity\": \"sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/postcss\": {\n \"version\": \"8.5.6\",\n \"resolved\": \"https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz\",\n \"integrity\": \"sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/postcss/\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/postcss\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"nanoid\": \"^3.3.11\",\n \"picocolors\": \"^1.1.1\",\n \"source-map-js\": \"^1.2.1\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || >=14\"\n }\n },\n \"node_modules/pretty-format\": {\n \"version\": \"29.7.0\",\n \"resolved\": \"https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz\",\n \"integrity\": \"sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jest/schemas\": \"^29.6.3\",\n \"ansi-styles\": \"^5.0.0\",\n \"react-is\": \"^18.0.0\"\n },\n \"engines\": {\n \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n }\n },\n \"node_modules/pretty-format/node_modules/ansi-styles\": {\n \"version\": \"5.2.0\",\n \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz\",\n \"integrity\": \"sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n }\n },\n \"node_modules/react\": {\n \"version\": \"18.3.1\",\n \"resolved\": \"https://registry.npmjs.org/react/-/react-18.3.1.tgz\",\n \"integrity\": \"sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\"\n },\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/react-dom\": {\n \"version\": \"18.3.1\",\n \"resolved\": \"https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz\",\n \"integrity\": \"sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\",\n \"scheduler\": \"^0.23.2\"\n },\n \"peerDependencies\": {\n \"react\": \"^18.3.1\"\n }\n },\n \"node_modules/react-is\": {\n \"version\": \"18.3.1\",\n \"resolved\": \"https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz\",\n \"integrity\": \"sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/react-refresh\": {\n \"version\": \"0.17.0\",\n \"resolved\": \"https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz\",\n \"integrity\": \"sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/require-directory\": {\n \"version\": \"2.1.1\",\n \"resolved\": \"https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz\",\n \"integrity\": \"sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/resolve-pkg-maps\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz\",\n \"integrity\": \"sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"funding\": {\n \"url\": \"https://github.com/privatenumber/resolve-pkg-maps?sponsor=1\"\n }\n },\n \"node_modules/retry\": {\n \"version\": \"0.13.1\",\n \"resolved\": \"https://registry.npmjs.org/retry/-/retry-0.13.1.tgz\",\n \"integrity\": \"sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">= 4\"\n }\n },\n \"node_modules/rollup\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/rollup/-/rollup-4.45.0.tgz\",\n \"integrity\": \"sha512-WLjEcJRIo7i3WDDgOIJqVI2d+lAC3EwvOGy+Xfq6hs+GQuAA4Di/H72xmXkOhrIWFg2PFYSKZYfH0f4vfKXN4A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/estree\": \"1.0.8\"\n },\n \"bin\": {\n \"rollup\": \"dist/bin/rollup\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\",\n \"npm\": \">=8.0.0\"\n },\n \"optionalDependencies\": {\n \"@rollup/rollup-android-arm-eabi\": \"4.45.0\",\n \"@rollup/rollup-android-arm64\": \"4.45.0\",\n \"@rollup/rollup-darwin-arm64\": \"4.45.0\",\n \"@rollup/rollup-darwin-x64\": \"4.45.0\",\n \"@rollup/rollup-freebsd-arm64\": \"4.45.0\",\n \"@rollup/rollup-freebsd-x64\": \"4.45.0\",\n \"@rollup/rollup-linux-arm-gnueabihf\": \"4.45.0\",\n \"@rollup/rollup-linux-arm-musleabihf\": \"4.45.0\",\n \"@rollup/rollup-linux-arm64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-arm64-musl\": \"4.45.0\",\n \"@rollup/rollup-linux-loongarch64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-powerpc64le-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-riscv64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-riscv64-musl\": \"4.45.0\",\n \"@rollup/rollup-linux-s390x-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-x64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-x64-musl\": \"4.45.0\",\n \"@rollup/rollup-win32-arm64-msvc\": \"4.45.0\",\n \"@rollup/rollup-win32-ia32-msvc\": \"4.45.0\",\n \"@rollup/rollup-win32-x64-msvc\": \"4.45.0\",\n \"fsevents\": \"~2.3.2\"\n }\n },\n \"node_modules/rxjs\": {\n \"version\": \"7.8.2\",\n \"resolved\": \"https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz\",\n \"integrity\": \"sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"tslib\": \"^2.1.0\"\n }\n },\n \"node_modules/scheduler\": {\n \"version\": \"0.23.2\",\n \"resolved\": \"https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz\",\n \"integrity\": \"sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\"\n }\n },\n \"node_modules/semver\": {\n \"version\": \"6.3.1\",\n \"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n \"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"bin\": {\n \"semver\": \"bin/semver.js\"\n }\n },\n \"node_modules/shebang-command\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz\",\n \"integrity\": \"sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"shebang-regex\": \"^3.0.0\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/shebang-regex\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz\",\n \"integrity\": \"sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/shell-quote\": {\n \"version\": \"1.8.3\",\n \"resolved\": \"https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz\",\n \"integrity\": \"sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">= 0.4\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/ljharb\"\n }\n },\n \"node_modules/siginfo\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz\",\n \"integrity\": \"sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/signal-exit\": {\n \"version\": \"4.1.0\",\n \"resolved\": \"https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz\",\n \"integrity\": \"sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \">=14\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/isaacs\"\n }\n },\n \"node_modules/source-map-js\": {\n \"version\": \"1.2.1\",\n \"resolved\": \"https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz\",\n \"integrity\": \"sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==\",\n \"dev\": true,\n \"license\": \"BSD-3-Clause\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/spawn-command\": {\n \"version\": \"0.0.2\",\n \"resolved\": \"https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz\",\n \"integrity\": \"sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==\",\n \"dev\": true\n },\n \"node_modules/stackback\": {\n \"version\": \"0.0.2\",\n \"resolved\": \"https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz\",\n \"integrity\": \"sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/std-env\": {\n \"version\": \"3.9.0\",\n \"resolved\": \"https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz\",\n \"integrity\": \"sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/string-width\": {\n \"version\": \"4.2.3\",\n \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"emoji-regex\": \"^8.0.0\",\n \"is-fullwidth-code-point\": \"^3.0.0\",\n \"strip-ansi\": \"^6.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/strip-ansi\": {\n \"version\": \"6.0.1\",\n \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-regex\": \"^5.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/strip-final-newline\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz\",\n \"integrity\": \"sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=12\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/strip-literal\": {\n \"version\": \"2.1.1\",\n \"resolved\": \"https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz\",\n \"integrity\": \"sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"js-tokens\": \"^9.0.1\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/antfu\"\n }\n },\n \"node_modules/strip-literal/node_modules/js-tokens\": {\n \"version\": \"9.0.1\",\n \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz\",\n \"integrity\": \"sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/supports-color\": {\n \"version\": \"8.1.1\",\n \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz\",\n \"integrity\": \"sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"has-flag\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/supports-color?sponsor=1\"\n }\n },\n \"node_modules/tinybench\": {\n \"version\": \"2.9.0\",\n \"resolved\": \"https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz\",\n \"integrity\": \"sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/tinypool\": {\n \"version\": \"0.8.4\",\n \"resolved\": \"https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz\",\n \"integrity\": \"sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=14.0.0\"\n }\n },\n \"node_modules/tinyspy\": {\n \"version\": \"2.2.1\",\n \"resolved\": \"https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz\",\n \"integrity\": \"sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=14.0.0\"\n }\n },\n \"node_modules/tree-kill\": {\n \"version\": \"1.2.2\",\n \"resolved\": \"https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz\",\n \"integrity\": \"sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"tree-kill\": \"cli.js\"\n }\n },\n \"node_modules/tslib\": {\n \"version\": \"2.8.1\",\n \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz\",\n \"integrity\": \"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==\",\n \"dev\": true,\n \"license\": \"0BSD\"\n },\n \"node_modules/tsx\": {\n \"version\": \"4.20.3\",\n \"resolved\": \"https://registry.npmjs.org/tsx/-/tsx-4.20.3.tgz\",\n \"integrity\": \"sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"esbuild\": \"~0.25.0\",\n \"get-tsconfig\": \"^4.7.5\"\n },\n \"bin\": {\n \"tsx\": \"dist/cli.mjs\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"optionalDependencies\": {\n \"fsevents\": \"~2.3.3\"\n }\n },\n \"node_modules/type-detect\": {\n \"version\": \"4.1.0\",\n \"resolved\": \"https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz\",\n \"integrity\": \"sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=4\"\n }\n },\n \"node_modules/typescript\": {\n \"version\": \"5.8.3\",\n \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz\",\n \"integrity\": \"sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"bin\": {\n \"tsc\": \"bin/tsc\",\n \"tsserver\": \"bin/tsserver\"\n },\n \"engines\": {\n \"node\": \">=14.17\"\n }\n },\n \"node_modules/ufo\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz\",\n \"integrity\": \"sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/undici-types\": {\n \"version\": \"6.21.0\",\n \"resolved\": \"https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz\",\n \"integrity\": \"sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/update-browserslist-db\": {\n \"version\": \"1.1.3\",\n \"resolved\": \"https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz\",\n \"integrity\": \"sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"escalade\": \"^3.2.0\",\n \"picocolors\": \"^1.1.1\"\n },\n \"bin\": {\n \"update-browserslist-db\": \"cli.js\"\n },\n \"peerDependencies\": {\n \"browserslist\": \">= 4.21.0\"\n }\n },\n \"node_modules/use-sync-external-store\": {\n \"version\": \"1.5.0\",\n \"resolved\": \"https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz\",\n \"integrity\": \"sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==\",\n \"license\": \"MIT\",\n \"peerDependencies\": {\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\"\n }\n },\n \"node_modules/vite\": {\n \"version\": \"5.4.19\",\n \"resolved\": \"https://registry.npmjs.org/vite/-/vite-5.4.19.tgz\",\n \"integrity\": \"sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"esbuild\": \"^0.21.3\",\n \"postcss\": \"^8.4.43\",\n \"rollup\": \"^4.20.0\"\n },\n \"bin\": {\n \"vite\": \"bin/vite.js\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/vitejs/vite?sponsor=1\"\n },\n \"optionalDependencies\": {\n \"fsevents\": \"~2.3.3\"\n },\n \"peerDependencies\": {\n \"@types/node\": \"^18.0.0 || >=20.0.0\",\n \"less\": \"*\",\n \"lightningcss\": \"^1.21.0\",\n \"sass\": \"*\",\n \"sass-embedded\": \"*\",\n \"stylus\": \"*\",\n \"sugarss\": \"*\",\n \"terser\": \"^5.4.0\"\n },\n \"peerDependenciesMeta\": {\n \"@types/node\": {\n \"optional\": true\n },\n \"less\": {\n \"optional\": true\n },\n \"lightningcss\": {\n \"optional\": true\n },\n \"sass\": {\n \"optional\": true\n },\n \"sass-embedded\": {\n \"optional\": true\n },\n \"stylus\": {\n \"optional\": true\n },\n \"sugarss\": {\n \"optional\": true\n },\n \"terser\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/vite-node\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/vite-node/-/vite-node-1.6.1.tgz\",\n \"integrity\": \"sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"cac\": \"^6.7.14\",\n \"debug\": \"^4.3.4\",\n \"pathe\": \"^1.1.1\",\n \"picocolors\": \"^1.0.0\",\n \"vite\": \"^5.0.0\"\n },\n \"bin\": {\n \"vite-node\": \"vite-node.mjs\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/aix-ppc64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz\",\n \"integrity\": \"sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"aix\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-arm\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz\",\n \"integrity\": \"sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/darwin-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/darwin-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/freebsd-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/freebsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-arm\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz\",\n \"integrity\": \"sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-ia32\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz\",\n \"integrity\": \"sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-loong64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz\",\n \"integrity\": \"sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-mips64el\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz\",\n \"integrity\": \"sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==\",\n \"cpu\": [\n \"mips64el\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-ppc64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz\",\n \"integrity\": \"sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-riscv64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz\",\n \"integrity\": \"sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-s390x\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz\",\n \"integrity\": \"sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/netbsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"netbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/openbsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"openbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/sunos-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"sunos\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-ia32\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz\",\n \"integrity\": \"sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/esbuild\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz\",\n \"integrity\": \"sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"esbuild\": \"bin/esbuild\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"optionalDependencies\": {\n \"@esbuild/aix-ppc64\": \"0.21.5\",\n \"@esbuild/android-arm\": \"0.21.5\",\n \"@esbuild/android-arm64\": \"0.21.5\",\n \"@esbuild/android-x64\": \"0.21.5\",\n \"@esbuild/darwin-arm64\": \"0.21.5\",\n \"@esbuild/darwin-x64\": \"0.21.5\",\n \"@esbuild/freebsd-arm64\": \"0.21.5\",\n \"@esbuild/freebsd-x64\": \"0.21.5\",\n \"@esbuild/linux-arm\": \"0.21.5\",\n \"@esbuild/linux-arm64\": \"0.21.5\",\n \"@esbuild/linux-ia32\": \"0.21.5\",\n \"@esbuild/linux-loong64\": \"0.21.5\",\n \"@esbuild/linux-mips64el\": \"0.21.5\",\n \"@esbuild/linux-ppc64\": \"0.21.5\",\n \"@esbuild/linux-riscv64\": \"0.21.5\",\n \"@esbuild/linux-s390x\": \"0.21.5\",\n \"@esbuild/linux-x64\": \"0.21.5\",\n \"@esbuild/netbsd-x64\": \"0.21.5\",\n \"@esbuild/openbsd-x64\": \"0.21.5\",\n \"@esbuild/sunos-x64\": \"0.21.5\",\n \"@esbuild/win32-arm64\": \"0.21.5\",\n \"@esbuild/win32-ia32\": \"0.21.5\",\n \"@esbuild/win32-x64\": \"0.21.5\"\n }\n },\n \"node_modules/vitest\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/vitest/-/vitest-1.6.1.tgz\",\n \"integrity\": \"sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/expect\": \"1.6.1\",\n \"@vitest/runner\": \"1.6.1\",\n \"@vitest/snapshot\": \"1.6.1\",\n \"@vitest/spy\": \"1.6.1\",\n \"@vitest/utils\": \"1.6.1\",\n \"acorn-walk\": \"^8.3.2\",\n \"chai\": \"^4.3.10\",\n \"debug\": \"^4.3.4\",\n \"execa\": \"^8.0.1\",\n \"local-pkg\": \"^0.5.0\",\n \"magic-string\": \"^0.30.5\",\n \"pathe\": \"^1.1.1\",\n \"picocolors\": \"^1.0.0\",\n \"std-env\": \"^3.5.0\",\n \"strip-literal\": \"^2.0.0\",\n \"tinybench\": \"^2.5.1\",\n \"tinypool\": \"^0.8.3\",\n \"vite\": \"^5.0.0\",\n \"vite-node\": \"1.6.1\",\n \"why-is-node-running\": \"^2.2.2\"\n },\n \"bin\": {\n \"vitest\": \"vitest.mjs\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n },\n \"peerDependencies\": {\n \"@edge-runtime/vm\": \"*\",\n \"@types/node\": \"^18.0.0 || >=20.0.0\",\n \"@vitest/browser\": \"1.6.1\",\n \"@vitest/ui\": \"1.6.1\",\n \"happy-dom\": \"*\",\n \"jsdom\": \"*\"\n },\n \"peerDependenciesMeta\": {\n \"@edge-runtime/vm\": {\n \"optional\": true\n },\n \"@types/node\": {\n \"optional\": true\n },\n \"@vitest/browser\": {\n \"optional\": true\n },\n \"@vitest/ui\": {\n \"optional\": true\n },\n \"happy-dom\": {\n \"optional\": true\n },\n \"jsdom\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/which\": {\n \"version\": \"2.0.2\",\n \"resolved\": \"https://registry.npmjs.org/which/-/which-2.0.2.tgz\",\n \"integrity\": \"sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"dependencies\": {\n \"isexe\": \"^2.0.0\"\n },\n \"bin\": {\n \"node-which\": \"bin/node-which\"\n },\n \"engines\": {\n \"node\": \">= 8\"\n }\n },\n \"node_modules/why-is-node-running\": {\n \"version\": \"2.3.0\",\n \"resolved\": \"https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz\",\n \"integrity\": \"sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"siginfo\": \"^2.0.0\",\n \"stackback\": \"0.0.2\"\n },\n \"bin\": {\n \"why-is-node-running\": \"cli.js\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/wrap-ansi\": {\n \"version\": \"7.0.0\",\n \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\n \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-styles\": \"^4.0.0\",\n \"string-width\": \"^4.1.0\",\n \"strip-ansi\": \"^6.0.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n }\n },\n \"node_modules/y18n\": {\n \"version\": \"5.0.8\",\n \"resolved\": \"https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz\",\n \"integrity\": \"sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \">=10\"\n }\n },\n \"node_modules/yallist\": {\n \"version\": \"3.1.1\",\n \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz\",\n \"integrity\": \"sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/yargs\": {\n \"version\": \"17.7.2\",\n \"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz\",\n \"integrity\": \"sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"cliui\": \"^8.0.1\",\n \"escalade\": \"^3.1.1\",\n \"get-caller-file\": \"^2.0.5\",\n \"require-directory\": \"^2.1.1\",\n \"string-width\": \"^4.2.3\",\n \"y18n\": \"^5.0.5\",\n \"yargs-parser\": \"^21.1.1\"\n },\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/yargs-parser\": {\n \"version\": \"21.1.1\",\n \"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz\",\n \"integrity\": \"sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/yocto-queue\": {\n \"version\": \"1.2.1\",\n \"resolved\": \"https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz\",\n \"integrity\": \"sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=12.20\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/zod\": {\n \"version\": \"3.25.76\",\n \"resolved\": \"https://registry.npmjs.org/zod/-/zod-3.25.76.tgz\",\n \"integrity\": \"sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"funding\": {\n \"url\": \"https://github.com/sponsors/colinhacks\"\n }\n }\n }\n}\n", "package.json": "{\n \"name\": \"example-sync\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"concurrently \\\"tsx --watch src/backend/server.ts\\\" \\\"vite\\\"\",\n \"build\": \"vite build\",\n \"preview\": \"vite preview\",\n \"check-types\": \"tsc --noEmit\",\n \"test\": \"vitest\"\n },\n \"dependencies\": {\n \"rivetkit\": \"^0.9.1\",\n \"@rivetkit/react\": \"^0.9.1\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^20.0.0\",\n \"@types/react\": \"^18.2.0\",\n \"@types/react-dom\": \"^18.2.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"concurrently\": \"^8.2.0\",\n \"tsx\": \"^4.0.0\",\n \"typescript\": \"^5.0.0\",\n \"vite\": \"^5.0.0\",\n \"vitest\": \"^1.0.0\"\n }\n}\n", "tsconfig.json": "{\n \"compilerOptions\": {\n \"target\": \"ES2020\",\n \"lib\": [\"ES2020\", \"DOM\", \"DOM.Iterable\"],\n \"module\": \"ESNext\",\n \"skipLibCheck\": true,\n \"moduleResolution\": \"bundler\",\n \"allowImportingTsExtensions\": true,\n \"resolveJsonModule\": true,\n \"isolatedModules\": true,\n \"noEmit\": true,\n \"jsx\": \"react-jsx\",\n \"strict\": true,\n \"noUnusedLocals\": true,\n \"noUnusedParameters\": true,\n \"noFallthroughCasesInSwitch\": true\n },\n \"include\": [\"src\", \"tests\"],\n \"exclude\": [\"node_modules\", \"dist\"]\n}\n", @@ -133,7 +133,7 @@ export const examples: ExampleData[] = [ "src/frontend/App.tsx": "import { createClient, createRivetKit } from \"@rivetkit/react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport type { Contact, registry } from \"../backend/registry\";\n\nconst client = createClient(\"http://localhost:8080\");\nconst { useActor } = createRivetKit(client);\n\nexport function App() {\n\tconst [contacts, setContacts] = useState([]);\n\tconst [name, setName] = useState(\"\");\n\tconst [email, setEmail] = useState(\"\");\n\tconst [phone, setPhone] = useState(\"\");\n\tconst [syncStatus, setSyncStatus] = useState<\"Idle\" | \"Syncing\" | \"Synced\" | \"Offline\">(\"Idle\");\n\tconst [stats, setStats] = useState({ totalContacts: 0, lastSyncTime: 0, deletedContacts: 0 });\n\n\tconst lastSyncTime = useRef(0);\n\tconst syncIntervalRef = useRef(null);\n\n\tconst contactsActor = useActor({\n\t\tname: \"contacts\",\n\t\tkey: [\"global\"],\n\t});\n\n\t// Load initial contacts and stats\n\tuseEffect(() => {\n\t\tif (!contactsActor.connection) return;\n\n\t\tconst loadInitialData = async () => {\n\t\t\ttry {\n\t\t\t\tconst data = await contactsActor.connection!.getChanges(0);\n\t\t\t\tsetContacts(data.changes);\n\t\t\t\tlastSyncTime.current = data.timestamp;\n\t\t\t\tsetSyncStatus(\"Synced\");\n\n\t\t\t\tconst statsData = await contactsActor.connection!.getSyncStats();\n\t\t\t\tsetStats(statsData);\n\t\t\t} catch (error) {\n\t\t\t\tsetSyncStatus(\"Offline\");\n\t\t\t}\n\t\t};\n\n\t\tloadInitialData();\n\t}, [contactsActor.connection]);\n\n\t// Handle contact events from other clients\n\tcontactsActor.useEvent(\"contactsChanged\", ({ contacts: updatedContacts }: { contacts: Contact[] }) => {\n\t\tsetContacts((prev) => {\n\t\t\tconst contactMap = new Map(prev.map((c) => [c.id, c]));\n\n\t\t\tupdatedContacts.forEach((contact) => {\n\t\t\t\tconst existing = contactMap.get(contact.id);\n\t\t\t\tif (!existing || existing.updatedAt < contact.updatedAt) {\n\t\t\t\t\tcontactMap.set(contact.id, contact);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn Array.from(contactMap.values()).filter(c => c.name !== \"\");\n\t\t});\n\n\t\t// Update stats when contacts change\n\t\tif (contactsActor.connection) {\n\t\t\tcontactsActor.connection.getSyncStats().then(setStats);\n\t\t}\n\t});\n\n\t// Periodic sync - every 5 seconds\n\tuseEffect(() => {\n\t\tif (!contactsActor.connection) return;\n\n\t\tconst sync = async () => {\n\t\t\tsetSyncStatus(\"Syncing\");\n\n\t\t\ttry {\n\t\t\t\t// Get remote changes\n\t\t\t\tconst changes = await contactsActor.connection!.getChanges(lastSyncTime.current);\n\n\t\t\t\t// Apply remote changes\n\t\t\t\tif (changes.changes.length > 0) {\n\t\t\t\t\tsetContacts((prev) => {\n\t\t\t\t\t\tconst contactMap = new Map(prev.map((c) => [c.id, c]));\n\n\t\t\t\t\t\tchanges.changes.forEach((contact) => {\n\t\t\t\t\t\t\tconst existing = contactMap.get(contact.id);\n\t\t\t\t\t\t\tif (!existing || existing.updatedAt < contact.updatedAt) {\n\t\t\t\t\t\t\t\tcontactMap.set(contact.id, contact);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn Array.from(contactMap.values()).filter(c => c.name !== \"\");\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Push local changes\n\t\t\t\tconst localChanges = contacts.filter(\n\t\t\t\t\t(c) => c.updatedAt > lastSyncTime.current,\n\t\t\t\t);\n\t\t\t\tif (localChanges.length > 0) {\n\t\t\t\t\tawait contactsActor.connection!.pushChanges(localChanges);\n\t\t\t\t}\n\n\t\t\t\tlastSyncTime.current = changes.timestamp;\n\t\t\t\tsetSyncStatus(\"Synced\");\n\n\t\t\t\t// Update stats\n\t\t\t\tconst statsData = await contactsActor.connection!.getSyncStats();\n\t\t\t\tsetStats(statsData);\n\t\t\t} catch (error) {\n\t\t\t\tsetSyncStatus(\"Offline\");\n\t\t\t}\n\t\t};\n\n\t\tsyncIntervalRef.current = setInterval(sync, 5000);\n\n\t\treturn () => {\n\t\t\tif (syncIntervalRef.current) {\n\t\t\t\tclearInterval(syncIntervalRef.current);\n\t\t\t\tsyncIntervalRef.current = null;\n\t\t\t}\n\t\t};\n\t}, [contactsActor.connection, contacts]);\n\n\t// Add new contact (local first)\n\tconst addContact = async () => {\n\t\tif (!name.trim()) return;\n\n\t\tconst newContact: Contact = {\n\t\t\tid: Date.now().toString(),\n\t\t\tname,\n\t\t\temail,\n\t\t\tphone,\n\t\t\tupdatedAt: Date.now(),\n\t\t};\n\n\t\t// Add locally first for immediate UI feedback\n\t\tsetContacts((prev) => [...prev, newContact]);\n\n\t\t// Then sync to server\n\t\tif (contactsActor.connection) {\n\t\t\ttry {\n\t\t\t\tawait contactsActor.connection.pushChanges([newContact]);\n\t\t\t\tconst statsData = await contactsActor.connection.getSyncStats();\n\t\t\t\tsetStats(statsData);\n\t\t\t} catch (error) {\n\t\t\t\tsetSyncStatus(\"Offline\");\n\t\t\t}\n\t\t}\n\n\t\tsetName(\"\");\n\t\tsetEmail(\"\");\n\t\tsetPhone(\"\");\n\t};\n\n\t// Delete contact (implemented as update with empty name)\n\tconst deleteContact = async (id: string) => {\n\t\tconst deletedContact = contacts.find(c => c.id === id);\n\t\tif (!deletedContact) return;\n\n\t\tconst updatedContact: Contact = {\n\t\t\t...deletedContact,\n\t\t\tname: \"\", // Mark as deleted\n\t\t\tupdatedAt: Date.now()\n\t\t};\n\n\t\t// Remove locally first for immediate UI feedback\n\t\tsetContacts((prev) => prev.filter((c) => c.id !== id));\n\n\t\t// Then sync to server\n\t\tif (contactsActor.connection) {\n\t\t\ttry {\n\t\t\t\tawait contactsActor.connection.pushChanges([updatedContact]);\n\t\t\t\tconst statsData = await contactsActor.connection.getSyncStats();\n\t\t\t\tsetStats(statsData);\n\t\t\t} catch (error) {\n\t\t\t\tsetSyncStatus(\"Offline\");\n\t\t\t}\n\t\t}\n\t};\n\n\t// Manual sync\n\tconst handleSync = async () => {\n\t\tif (!contactsActor.connection) return;\n\n\t\tsetSyncStatus(\"Syncing\");\n\n\t\ttry {\n\t\t\t// Push all contacts\n\t\t\tawait contactsActor.connection.pushChanges(contacts);\n\n\t\t\t// Get all changes\n\t\t\tconst changes = await contactsActor.connection.getChanges(0);\n\n\t\t\tsetContacts(changes.changes.filter(c => c.name !== \"\"));\n\t\t\tlastSyncTime.current = changes.timestamp;\n\t\t\tsetSyncStatus(\"Synced\");\n\n\t\t\t// Update stats\n\t\t\tconst statsData = await contactsActor.connection.getSyncStats();\n\t\t\tsetStats(statsData);\n\t\t} catch (error) {\n\t\t\tsetSyncStatus(\"Offline\");\n\t\t}\n\t};\n\n\t// Reset all data\n\tconst handleReset = async () => {\n\t\tif (!contactsActor.connection) return;\n\n\t\ttry {\n\t\t\tawait contactsActor.connection.reset();\n\t\t\tsetContacts([]);\n\t\t\tlastSyncTime.current = Date.now();\n\t\t\tsetSyncStatus(\"Synced\");\n\t\t\tsetStats({ totalContacts: 0, lastSyncTime: Date.now(), deletedContacts: 0 });\n\t\t} catch (error) {\n\t\t\tsetSyncStatus(\"Offline\");\n\t\t}\n\t};\n\n\t// Handle form submission\n\tconst handleSubmit = (e: React.FormEvent) => {\n\t\te.preventDefault();\n\t\taddContact();\n\t};\n\n\treturn (\n\t\t
\n\t\t\t
\n\t\t\t\t

Sync Contacts

\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t{syncStatus}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t

How it works

\n\t\t\t\t

\n\t\t\t\t\tThis contact sync system demonstrates offline-first synchronization with conflict resolution. \n\t\t\t\t\tAdd contacts and they'll sync across all connected clients. The system handles conflicts using \n\t\t\t\t\t\"last write wins\" based on timestamps, and supports offline operation with automatic sync when reconnected.\n\t\t\t\t

\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t

Add New Contact

\n\t\t\t\t
\n\t\t\t\t\t setName(e.target.value)}\n\t\t\t\t\t\trequired\n\t\t\t\t\t\tdisabled={!contactsActor.connection}\n\t\t\t\t\t/>\n\t\t\t\t\t setEmail(e.target.value)}\n\t\t\t\t\t\tdisabled={!contactsActor.connection}\n\t\t\t\t\t/>\n\t\t\t\t\t setPhone(e.target.value)}\n\t\t\t\t\t\tdisabled={!contactsActor.connection}\n\t\t\t\t\t/>\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t

Contacts ({contacts.length})

\n\t\t\t\t{contacts.length === 0 ? (\n\t\t\t\t\t
\n\t\t\t\t\t\tNo contacts yet. Add some contacts to get started!\n\t\t\t\t\t
\n\t\t\t\t) : (\n\t\t\t\t\tcontacts.map((contact) => (\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t
{contact.name}
\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t{contact.email && (\n\t\t\t\t\t\t\t\t\t\t
📧 {contact.email}
\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{contact.phone && (\n\t\t\t\t\t\t\t\t\t\t
📞 {contact.phone}
\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t deleteContact(contact.id)}\n\t\t\t\t\t\t\t\tdisabled={!contactsActor.connection}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tDelete\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t))\n\t\t\t\t)}\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
{stats.totalContacts}
\n\t\t\t\t\t
Total Contacts
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
{stats.deletedContacts}
\n\t\t\t\t\t
Deleted Items
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t{stats.lastSyncTime ? new Date(stats.lastSyncTime).toLocaleTimeString() : \"—\"}\n\t\t\t\t\t
\n\t\t\t\t\t
Last Sync
\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t);\n}", "src/frontend/main.tsx": "import { StrictMode } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { App } from \"./App\";\n\nconst root = document.getElementById(\"root\");\nif (!root) throw new Error(\"Root element not found\");\n\ncreateRoot(root).render(\n\t\n\t\t\n\t\n);", "src/frontend/index.html": "\n\n\n \n \n Sync Contacts - RivetKit\n \n\n\n
\n \n\n", - "src/backend/registry.ts": "import { actor, setup } from \"rivetkit\";\n\nexport type Contact = {\n\tid: string;\n\tname: string;\n\temail: string;\n\tphone: string;\n\tupdatedAt: number;\n};\n\nconst contacts = actor({\n\tonAuth: () => {},\n\t// State is automatically persisted\n\t// Persistent state that survives restarts: https://rivet.gg/docs/actors/state\n\tstate: {\n\t\tcontacts: {} as Record,\n\t\tlastSyncTime: Date.now(),\n\t},\n\n\tactions: {\n\t\t// Callable functions from clients: https://rivet.gg/docs/actors/actions\n\t\tgetChanges: (c, after = 0) => {\n\t\t\tconst changes = Object.values(c.state.contacts).filter(\n\t\t\t\t(contact) => contact.updatedAt > after,\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tchanges,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t},\n\n\t\tpushChanges: (c, contactList: Contact[]) => {\n\t\t\tlet changed = false;\n\n\t\t\tcontactList.forEach((contact) => {\n\t\t\t\tconst existing = c.state.contacts[contact.id];\n\n\t\t\t\t// Last write wins conflict resolution based on timestamp\n\t\t\t\tif (!existing || existing.updatedAt < contact.updatedAt) {\n\t\t\t\t\t// State changes are automatically persisted\n\t\t\t\t\tc.state.contacts[contact.id] = contact;\n\t\t\t\t\tchanged = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Update last sync time\n\t\t\tc.state.lastSyncTime = Date.now();\n\n\t\t\tif (changed) {\n\t\t\t\t// Send events to all connected clients: https://rivet.gg/docs/actors/events\n\t\t\t\tc.broadcast(\"contactsChanged\", {\n\t\t\t\t\tcontacts: Object.values(c.state.contacts).filter(\n\t\t\t\t\t\t(c) => c.name !== \"\",\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn { timestamp: c.state.lastSyncTime };\n\t\t},\n\n\t\tgetAllContacts: (c) => {\n\t\t\treturn Object.values(c.state.contacts).filter(\n\t\t\t\t(contact) => contact.name !== \"\",\n\t\t\t);\n\t\t},\n\n\t\tgetSyncStats: (c) => {\n\t\t\tconst allContacts = Object.values(c.state.contacts);\n\t\t\tconst activeContacts = allContacts.filter(\n\t\t\t\t(contact) => contact.name !== \"\",\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\ttotalContacts: activeContacts.length,\n\t\t\t\tlastSyncTime: c.state.lastSyncTime,\n\t\t\t\tdeletedContacts: allContacts.filter((contact) => contact.name === \"\")\n\t\t\t\t\t.length,\n\t\t\t};\n\t\t},\n\n\t\treset: (c) => {\n\t\t\tc.state.contacts = {};\n\t\t\tc.state.lastSyncTime = Date.now();\n\n\t\t\tc.broadcast(\"contactsChanged\", {\n\t\t\t\tcontacts: [],\n\t\t\t});\n\n\t\t\treturn { timestamp: c.state.lastSyncTime };\n\t\t},\n\t},\n});\n\n// Register actors for use: https://rivet.gg/docs/setup\nexport const registry = setup({\n\tuse: { contacts },\n});\n", + "src/backend/registry.ts": "import { actor, setup } from \"rivetkit\";\n\nexport type Contact = {\n\tid: string;\n\tname: string;\n\temail: string;\n\tphone: string;\n\tupdatedAt: number;\n};\n\nconst contacts = actor({\n\tonAuth: () => {},\n\t// State is automatically persisted\n\t// Persistent state that survives restarts: https://rivet.dev/docs/actors/state\n\tstate: {\n\t\tcontacts: {} as Record,\n\t\tlastSyncTime: Date.now(),\n\t},\n\n\tactions: {\n\t\t// Callable functions from clients: https://rivet.dev/docs/actors/actions\n\t\tgetChanges: (c, after = 0) => {\n\t\t\tconst changes = Object.values(c.state.contacts).filter(\n\t\t\t\t(contact) => contact.updatedAt > after,\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tchanges,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t},\n\n\t\tpushChanges: (c, contactList: Contact[]) => {\n\t\t\tlet changed = false;\n\n\t\t\tcontactList.forEach((contact) => {\n\t\t\t\tconst existing = c.state.contacts[contact.id];\n\n\t\t\t\t// Last write wins conflict resolution based on timestamp\n\t\t\t\tif (!existing || existing.updatedAt < contact.updatedAt) {\n\t\t\t\t\t// State changes are automatically persisted\n\t\t\t\t\tc.state.contacts[contact.id] = contact;\n\t\t\t\t\tchanged = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Update last sync time\n\t\t\tc.state.lastSyncTime = Date.now();\n\n\t\t\tif (changed) {\n\t\t\t\t// Send events to all connected clients: https://rivet.dev/docs/actors/events\n\t\t\t\tc.broadcast(\"contactsChanged\", {\n\t\t\t\t\tcontacts: Object.values(c.state.contacts).filter(\n\t\t\t\t\t\t(c) => c.name !== \"\",\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn { timestamp: c.state.lastSyncTime };\n\t\t},\n\n\t\tgetAllContacts: (c) => {\n\t\t\treturn Object.values(c.state.contacts).filter(\n\t\t\t\t(contact) => contact.name !== \"\",\n\t\t\t);\n\t\t},\n\n\t\tgetSyncStats: (c) => {\n\t\t\tconst allContacts = Object.values(c.state.contacts);\n\t\t\tconst activeContacts = allContacts.filter(\n\t\t\t\t(contact) => contact.name !== \"\",\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\ttotalContacts: activeContacts.length,\n\t\t\t\tlastSyncTime: c.state.lastSyncTime,\n\t\t\t\tdeletedContacts: allContacts.filter((contact) => contact.name === \"\")\n\t\t\t\t\t.length,\n\t\t\t};\n\t\t},\n\n\t\treset: (c) => {\n\t\t\tc.state.contacts = {};\n\t\t\tc.state.lastSyncTime = Date.now();\n\n\t\t\tc.broadcast(\"contactsChanged\", {\n\t\t\t\tcontacts: [],\n\t\t\t});\n\n\t\t\treturn { timestamp: c.state.lastSyncTime };\n\t\t},\n\t},\n});\n\n// Register actors for use: https://rivet.dev/docs/setup\nexport const registry = setup({\n\tuse: { contacts },\n});\n", "src/backend/server.ts": "import { registry } from \"./registry\";\n\nregistry.runServer({\n\tcors: {\n\t\torigin: \"*\",\n\t},\n});\n" } }, @@ -148,7 +148,7 @@ export const examples: ExampleData[] = [ "tab": "memory", "files": { "tests/rate.test.ts": "import { setupTest } from \"rivetkit/test\";\nimport { expect, test, vi } from \"vitest\";\nimport { registry } from \"../src/backend/registry\";\n\ntest(\"Rate limiter allows requests under limit\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst limiter = client.rateLimiter.getOrCreate([\"test-limit\"]);\n\n\t// Test first request - should be allowed\n\tconst result1 = await limiter.checkLimit();\n\texpect(result1).toMatchObject({\n\t\tallowed: true,\n\t\tremaining: 4, // 5 total - 1 used = 4 remaining\n\t\tresetsIn: expect.any(Number),\n\t});\n\n\t// Test additional requests\n\tconst result2 = await limiter.checkLimit();\n\texpect(result2.allowed).toBe(true);\n\texpect(result2.remaining).toBe(3);\n\n\tconst result3 = await limiter.checkLimit();\n\texpect(result3.allowed).toBe(true);\n\texpect(result3.remaining).toBe(2);\n});\n\ntest(\"Rate limiter blocks requests over limit\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst limiter = client.rateLimiter.getOrCreate([\"test-block\"]);\n\n\t// Use up all 5 requests\n\tfor (let i = 0; i < 5; i++) {\n\t\tconst result = await limiter.checkLimit();\n\t\texpect(result.allowed).toBe(true);\n\t}\n\n\t// 6th request should be blocked\n\tconst blocked = await limiter.checkLimit();\n\texpect(blocked.allowed).toBe(false);\n\texpect(blocked.remaining).toBe(0);\n\texpect(blocked.resetsIn).toBeGreaterThan(0);\n\n\t// 7th request should also be blocked\n\tconst blocked2 = await limiter.checkLimit();\n\texpect(blocked2.allowed).toBe(false);\n\texpect(blocked2.remaining).toBe(0);\n});\n\ntest(\"Rate limiter status reflects current state\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst limiter = client.rateLimiter.getOrCreate([\"test-status\"]);\n\n\t// Initial status\n\tconst initial = await limiter.getStatus();\n\texpect(initial).toMatchObject({\n\t\tcount: 0,\n\t\tremaining: 5,\n\t\tresetsIn: 0, // No reset time set yet\n\t});\n\n\t// After some requests\n\tawait limiter.checkLimit();\n\tawait limiter.checkLimit();\n\n\tconst afterRequests = await limiter.getStatus();\n\texpect(afterRequests.count).toBe(2);\n\texpect(afterRequests.remaining).toBe(3);\n\texpect(afterRequests.resetsIn).toBeGreaterThan(0);\n});\n\ntest(\"Rate limiter reset functionality\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst limiter = client.rateLimiter.getOrCreate([\"test-reset\"]);\n\n\t// Use up some requests\n\tawait limiter.checkLimit();\n\tawait limiter.checkLimit();\n\tawait limiter.checkLimit();\n\n\tconst beforeReset = await limiter.getStatus();\n\texpect(beforeReset.count).toBe(3);\n\texpect(beforeReset.remaining).toBe(2);\n\n\t// Reset the limiter\n\tconst resetResult = await limiter.reset();\n\texpect(resetResult.success).toBe(true);\n\n\t// Check status after reset\n\tconst afterReset = await limiter.getStatus();\n\texpect(afterReset.count).toBe(0);\n\texpect(afterReset.remaining).toBe(5);\n\texpect(afterReset.resetsIn).toBe(0);\n\n\t// Should be able to make requests again\n\tconst newRequest = await limiter.checkLimit();\n\texpect(newRequest.allowed).toBe(true);\n\texpect(newRequest.remaining).toBe(4);\n});\n", - "README.md": "# Rate Limiter for RivetKit\n\nExample project demonstrating API rate limiting with [RivetKit](https://rivetkit.org).\n\n[Learn More →](https://github.com/rivet-gg/rivetkit)\n\n[Discord](https://rivet.gg/discord) — [Documentation](https://rivetkit.org) — [Issues](https://github.com/rivet-gg/rivetkit/issues)\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 18+\n\n### Installation\n\n```sh\ngit clone https://github.com/rivet-gg/rivetkit\ncd rivetkit/examples/rate\nnpm install\n```\n\n### Development\n\n```sh\nnpm run dev\n```\n\nOpen your browser to `http://localhost:3000`\n\n## Features\n\n- **Per-User Rate Limiting**: Each user/client gets independent rate limits\n- **Sliding Window**: 5 requests per 60-second window\n- **Real-time Status**: Live updates of remaining requests and reset time\n- **Visual Progress**: Progress bar showing rate limit usage\n- **Multiple Users**: Switch between users to test isolation\n- **Admin Reset**: Reset rate limits for testing purposes\n\n## How it works\n\nThis rate limiter demonstrates:\n\n1. **Per-Actor Rate Limiting**: Each user gets their own actor instance with independent counters\n2. **Time Window Management**: Automatic reset of counters when the time window expires\n3. **Request Counting**: Track and limit the number of requests within the window\n4. **Graceful Degradation**: Blocks requests when limits are exceeded\n5. **Status Reporting**: Provide detailed information about current limits and reset times\n\n## Architecture\n\n- **Backend**: RivetKit actor that maintains rate limit state per user\n- **Frontend**: React application with real-time rate limit status\n- **State Management**: Persistent rate limit counters with automatic window resets\n- **User Isolation**: Each user/API client gets independent rate limiting\n\n## Usage\n\n1. Start the development server\n2. Select a user from the dropdown\n3. Click \"Make API Request\" to test the rate limiter\n4. Watch the status update in real-time\n5. Try making more than 5 requests within a minute to see blocking\n6. Switch users to see independent rate limits\n7. Use \"Reset Rate Limiter\" to clear limits for testing\n\n## Rate Limiting Strategy\n\nThis example uses a **Fixed Window** approach:\n\n- **Window Size**: 60 seconds\n- **Request Limit**: 5 requests per window\n- **Reset Behavior**: Counter resets to 0 when window expires\n- **Granularity**: Per-user/client isolation\n\n## Extending\n\nThis rate limiter can be extended with:\n\n- Different rate limiting algorithms (sliding window, token bucket, etc.)\n- Multiple rate limit tiers (basic/premium users)\n- Geographic or IP-based limiting\n- Dynamic rate limits based on user behavior\n- Rate limit bypass for admin users\n- Metrics and monitoring integration\n- Redis backend for distributed rate limiting\n\n## License\n\nApache 2.0", + "README.md": "# Rate Limiter for RivetKit\n\nExample project demonstrating API rate limiting with [RivetKit](https://rivetkit.org).\n\n[Learn More →](https://github.com/rivet-dev/rivetkit)\n\n[Discord](https://rivet.dev/discord) — [Documentation](https://rivetkit.org) — [Issues](https://github.com/rivet-dev/rivetkit/issues)\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 18+\n\n### Installation\n\n```sh\ngit clone https://github.com/rivet-dev/rivetkit\ncd rivetkit/examples/rate\nnpm install\n```\n\n### Development\n\n```sh\nnpm run dev\n```\n\nOpen your browser to `http://localhost:3000`\n\n## Features\n\n- **Per-User Rate Limiting**: Each user/client gets independent rate limits\n- **Sliding Window**: 5 requests per 60-second window\n- **Real-time Status**: Live updates of remaining requests and reset time\n- **Visual Progress**: Progress bar showing rate limit usage\n- **Multiple Users**: Switch between users to test isolation\n- **Admin Reset**: Reset rate limits for testing purposes\n\n## How it works\n\nThis rate limiter demonstrates:\n\n1. **Per-Actor Rate Limiting**: Each user gets their own actor instance with independent counters\n2. **Time Window Management**: Automatic reset of counters when the time window expires\n3. **Request Counting**: Track and limit the number of requests within the window\n4. **Graceful Degradation**: Blocks requests when limits are exceeded\n5. **Status Reporting**: Provide detailed information about current limits and reset times\n\n## Architecture\n\n- **Backend**: RivetKit actor that maintains rate limit state per user\n- **Frontend**: React application with real-time rate limit status\n- **State Management**: Persistent rate limit counters with automatic window resets\n- **User Isolation**: Each user/API client gets independent rate limiting\n\n## Usage\n\n1. Start the development server\n2. Select a user from the dropdown\n3. Click \"Make API Request\" to test the rate limiter\n4. Watch the status update in real-time\n5. Try making more than 5 requests within a minute to see blocking\n6. Switch users to see independent rate limits\n7. Use \"Reset Rate Limiter\" to clear limits for testing\n\n## Rate Limiting Strategy\n\nThis example uses a **Fixed Window** approach:\n\n- **Window Size**: 60 seconds\n- **Request Limit**: 5 requests per window\n- **Reset Behavior**: Counter resets to 0 when window expires\n- **Granularity**: Per-user/client isolation\n\n## Extending\n\nThis rate limiter can be extended with:\n\n- Different rate limiting algorithms (sliding window, token bucket, etc.)\n- Multiple rate limit tiers (basic/premium users)\n- Geographic or IP-based limiting\n- Dynamic rate limits based on user behavior\n- Rate limit bypass for admin users\n- Metrics and monitoring integration\n- Redis backend for distributed rate limiting\n\n## License\n\nApache 2.0", "package-lock.json": "{\n \"name\": \"example-rate\",\n \"version\": \"0.9.1\",\n \"lockfileVersion\": 3,\n \"requires\": true,\n \"packages\": {\n \"\": {\n \"name\": \"example-rate\",\n \"version\": \"0.9.1\",\n \"dependencies\": {\n \"@rivetkit/react\": \"^0.9.1\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\"\n },\n \"devDependencies\": {\n \"rivetkit\": \"^0.9.1\",\n \"@types/node\": \"^22.13.9\",\n \"@types/react\": \"^18.2.0\",\n \"@types/react-dom\": \"^18.2.0\",\n \"@vitejs/plugin-react\": \"^4.2.0\",\n \"concurrently\": \"^8.2.2\",\n \"tsx\": \"^3.12.7\",\n \"typescript\": \"^5.5.2\",\n \"vite\": \"^5.0.0\",\n \"vitest\": \"^3.1.1\"\n }\n },\n \"node_modules/@ampproject/remapping\": {\n \"version\": \"2.3.0\",\n \"resolved\": \"https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz\",\n \"integrity\": \"sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@jridgewell/gen-mapping\": \"^0.3.5\",\n \"@jridgewell/trace-mapping\": \"^0.3.24\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@babel/code-frame\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz\",\n \"integrity\": \"sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-validator-identifier\": \"^7.27.1\",\n \"js-tokens\": \"^4.0.0\",\n \"picocolors\": \"^1.1.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/compat-data\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz\",\n \"integrity\": \"sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/core\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz\",\n \"integrity\": \"sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@ampproject/remapping\": \"^2.2.0\",\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/generator\": \"^7.28.0\",\n \"@babel/helper-compilation-targets\": \"^7.27.2\",\n \"@babel/helper-module-transforms\": \"^7.27.3\",\n \"@babel/helpers\": \"^7.27.6\",\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/template\": \"^7.27.2\",\n \"@babel/traverse\": \"^7.28.0\",\n \"@babel/types\": \"^7.28.0\",\n \"convert-source-map\": \"^2.0.0\",\n \"debug\": \"^4.1.0\",\n \"gensync\": \"^1.0.0-beta.2\",\n \"json5\": \"^2.2.3\",\n \"semver\": \"^6.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"funding\": {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/babel\"\n }\n },\n \"node_modules/@babel/generator\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz\",\n \"integrity\": \"sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/types\": \"^7.28.0\",\n \"@jridgewell/gen-mapping\": \"^0.3.12\",\n \"@jridgewell/trace-mapping\": \"^0.3.28\",\n \"jsesc\": \"^3.0.2\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-compilation-targets\": {\n \"version\": \"7.27.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz\",\n \"integrity\": \"sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/compat-data\": \"^7.27.2\",\n \"@babel/helper-validator-option\": \"^7.27.1\",\n \"browserslist\": \"^4.24.0\",\n \"lru-cache\": \"^5.1.1\",\n \"semver\": \"^6.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-globals\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz\",\n \"integrity\": \"sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-module-imports\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz\",\n \"integrity\": \"sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/traverse\": \"^7.27.1\",\n \"@babel/types\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-module-transforms\": {\n \"version\": \"7.27.3\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz\",\n \"integrity\": \"sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-module-imports\": \"^7.27.1\",\n \"@babel/helper-validator-identifier\": \"^7.27.1\",\n \"@babel/traverse\": \"^7.27.3\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0\"\n }\n },\n \"node_modules/@babel/helper-plugin-utils\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz\",\n \"integrity\": \"sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-string-parser\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz\",\n \"integrity\": \"sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-validator-identifier\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz\",\n \"integrity\": \"sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-validator-option\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz\",\n \"integrity\": \"sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helpers\": {\n \"version\": \"7.27.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz\",\n \"integrity\": \"sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/template\": \"^7.27.2\",\n \"@babel/types\": \"^7.27.6\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/parser\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz\",\n \"integrity\": \"sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.28.0\"\n },\n \"bin\": {\n \"parser\": \"bin/babel-parser.js\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@babel/plugin-transform-react-jsx-self\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz\",\n \"integrity\": \"sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-plugin-utils\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/plugin-transform-react-jsx-source\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz\",\n \"integrity\": \"sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-plugin-utils\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/runtime\": {\n \"version\": \"7.27.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz\",\n \"integrity\": \"sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/template\": {\n \"version\": \"7.27.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz\",\n \"integrity\": \"sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/parser\": \"^7.27.2\",\n \"@babel/types\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/traverse\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz\",\n \"integrity\": \"sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/generator\": \"^7.28.0\",\n \"@babel/helper-globals\": \"^7.28.0\",\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/template\": \"^7.27.2\",\n \"@babel/types\": \"^7.28.0\",\n \"debug\": \"^4.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/types\": {\n \"version\": \"7.28.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/types/-/types-7.28.1.tgz\",\n \"integrity\": \"sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-string-parser\": \"^7.27.1\",\n \"@babel/helper-validator-identifier\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@cbor-extract/cbor-extract-darwin-arm64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.0.tgz\",\n \"integrity\": \"sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-darwin-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-arm\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.2.0.tgz\",\n \"integrity\": \"sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==\",\n \"cpu\": [\n \"arm\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-arm64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.2.0.tgz\",\n \"integrity\": \"sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-win32-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"peer\": true\n },\n \"node_modules/@esbuild/aix-ppc64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz\",\n \"integrity\": \"sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"aix\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/android-arm\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz\",\n \"integrity\": \"sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/android-arm64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz\",\n \"integrity\": \"sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/android-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/darwin-arm64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz\",\n \"integrity\": \"sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/darwin-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/freebsd-arm64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz\",\n \"integrity\": \"sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/freebsd-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-arm\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz\",\n \"integrity\": \"sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-arm64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz\",\n \"integrity\": \"sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-ia32\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz\",\n \"integrity\": \"sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-loong64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz\",\n \"integrity\": \"sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-mips64el\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz\",\n \"integrity\": \"sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==\",\n \"cpu\": [\n \"mips64el\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-ppc64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz\",\n \"integrity\": \"sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-riscv64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz\",\n \"integrity\": \"sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-s390x\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz\",\n \"integrity\": \"sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/netbsd-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"netbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/openbsd-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"openbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/sunos-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"sunos\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/win32-arm64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz\",\n \"integrity\": \"sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/win32-ia32\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz\",\n \"integrity\": \"sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/win32-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@jridgewell/gen-mapping\": {\n \"version\": \"0.3.12\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz\",\n \"integrity\": \"sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/sourcemap-codec\": \"^1.5.0\",\n \"@jridgewell/trace-mapping\": \"^0.3.24\"\n }\n },\n \"node_modules/@jridgewell/resolve-uri\": {\n \"version\": \"3.1.2\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz\",\n \"integrity\": \"sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@jridgewell/sourcemap-codec\": {\n \"version\": \"1.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz\",\n \"integrity\": \"sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@jridgewell/trace-mapping\": {\n \"version\": \"0.3.29\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz\",\n \"integrity\": \"sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/resolve-uri\": \"^3.1.0\",\n \"@jridgewell/sourcemap-codec\": \"^1.4.14\"\n }\n },\n \"node_modules/rivetkit\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/rivetkit/-/actor-0.9.1.tgz\",\n \"integrity\": \"sha512-aVoWO81JrYql6hhXX+vRor0B+aeWrnh+9zkcrxbh0EXFBbS5XM8YE4sSFxNKmZThLbGNqfZ5enm1zuA92c7I1w==\",\n \"dev\": true,\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\"\n }\n },\n \"node_modules/@rivetkit/core\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/core/-/core-0.9.1.tgz\",\n \"integrity\": \"sha512-0zYFKo08CQ72Rm6MaVKxcJSEEfn/ypGkkxTX06Q4meCGHuDJFbPA5wopa3NdxrKBPttcGg1QAmDd+1FZnlpubA==\",\n \"license\": \"Apache-2.0\",\n \"peer\": true,\n \"dependencies\": {\n \"cbor-x\": \"^1.6.0\",\n \"invariant\": \"^2.2.4\",\n \"on-change\": \"^5.0.1\",\n \"p-retry\": \"^6.2.1\",\n \"zod\": \"^3.25.67\"\n },\n \"engines\": {\n \"node\": \">=22.0.0\"\n },\n \"peerDependencies\": {\n \"@hono/node-server\": \"^1.14.0\",\n \"@hono/node-ws\": \"^1.1.1\",\n \"@hono/zod-openapi\": \"^0.19.6\",\n \"eventsource\": \"^3.0.5\",\n \"hono\": \"^4.7.0\",\n \"ws\": \"^8.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@hono/node-server\": {\n \"optional\": true\n },\n \"@hono/node-ws\": {\n \"optional\": true\n },\n \"@hono/zod-openapi\": {\n \"optional\": true\n },\n \"eventsource\": {\n \"optional\": true\n },\n \"hono\": {\n \"optional\": true\n },\n \"ws\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/@rivetkit/framework-base\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/framework-base/-/framework-base-0.9.1.tgz\",\n \"integrity\": \"sha512-FxhSqGAtDsD4k7gKS2EhJ5hHsEwI1+QR0vYThUBOLcmXM7zjMZndqIjVperQO4ck/zfjRqjm3lw7znkc+k0wNQ==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@tanstack/store\": \"^0.7.1\"\n },\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\"\n }\n },\n \"node_modules/@rivetkit/react\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/react/-/react-0.9.1.tgz\",\n \"integrity\": \"sha512-0e0gNNj3qCrXHNIxE6ggEEX+E6HjdsSt9pJbWbaQQg+1bsywupRTSdgSDguDHjBvi9qhR9mh7UbNN3A9wYqXuA==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@rivetkit/framework-base\": \"0.9.1\",\n \"@tanstack/react-store\": \"^0.7.1\"\n },\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\",\n \"react\": \"^18 || ^19\",\n \"react-dom\": \"^18 || ^19\"\n }\n },\n \"node_modules/@rolldown/pluginutils\": {\n \"version\": \"1.0.0-beta.19\",\n \"resolved\": \"https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz\",\n \"integrity\": \"sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@rollup/rollup-android-arm-eabi\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.0.tgz\",\n \"integrity\": \"sha512-2o/FgACbji4tW1dzXOqAV15Eu7DdgbKsF2QKcxfG4xbh5iwU7yr5RRP5/U+0asQliSYv5M4o7BevlGIoSL0LXg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ]\n },\n \"node_modules/@rollup/rollup-android-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-PSZ0SvMOjEAxwZeTx32eI/j5xSYtDCRxGu5k9zvzoY77xUNssZM+WV6HYBLROpY5CkXsbQjvz40fBb7WPwDqtQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ]\n },\n \"node_modules/@rollup/rollup-darwin-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-BA4yPIPssPB2aRAWzmqzQ3y2/KotkLyZukVB7j3psK/U3nVJdceo6qr9pLM2xN6iRP/wKfxEbOb1yrlZH6sYZg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ]\n },\n \"node_modules/@rollup/rollup-darwin-x64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.0.tgz\",\n \"integrity\": \"sha512-Pr2o0lvTwsiG4HCr43Zy9xXrHspyMvsvEw4FwKYqhli4FuLE5FjcZzuQ4cfPe0iUFCvSQG6lACI0xj74FDZKRA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ]\n },\n \"node_modules/@rollup/rollup-freebsd-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-lYE8LkE5h4a/+6VnnLiL14zWMPnx6wNbDG23GcYFpRW1V9hYWHAw9lBZ6ZUIrOaoK7NliF1sdwYGiVmziUF4vA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ]\n },\n \"node_modules/@rollup/rollup-freebsd-x64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.0.tgz\",\n \"integrity\": \"sha512-PVQWZK9sbzpvqC9Q0GlehNNSVHR+4m7+wET+7FgSnKG3ci5nAMgGmr9mGBXzAuE5SvguCKJ6mHL6vq1JaJ/gvw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm-gnueabihf\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.0.tgz\",\n \"integrity\": \"sha512-hLrmRl53prCcD+YXTfNvXd776HTxNh8wPAMllusQ+amcQmtgo3V5i/nkhPN6FakW+QVLoUUr2AsbtIRPFU3xIA==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm-musleabihf\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.0.tgz\",\n \"integrity\": \"sha512-XBKGSYcrkdiRRjl+8XvrUR3AosXU0NvF7VuqMsm7s5nRy+nt58ZMB19Jdp1RdqewLcaYnpk8zeVs/4MlLZEJxw==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-fRvZZPUiBz7NztBE/2QnCS5AtqLVhXmUOPj9IHlfGEXkapgImf4W9+FSkL8cWqoAjozyUzqFmSc4zh2ooaeF6g==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-Btv2WRZOcUGi8XU80XwIvzTg4U6+l6D0V6sZTrZx214nrwxw5nAi8hysaXj/mctyClWgesyuxbeLylCBNauimg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-loongarch64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-Li0emNnwtUZdLwHjQPBxn4VWztcrw/h7mgLyHiEI5Z0MhpeFGlzaiBHpSNVOMB/xucjXTTcO+dhv469Djr16KA==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-powerpc64le-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-sB8+pfkYx2kvpDCfd63d5ScYT0Fz1LO6jIb2zLZvmK9ob2D8DeVqrmBDE0iDK8KlBVmsTNzrjr3G1xV4eUZhSw==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-riscv64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-5GQ6PFhh7E6jQm70p1aW05G2cap5zMOvO0se5JMecHeAdj5ZhWEHbJ4hiKpfi1nnnEdTauDXxPgXae/mqjow9w==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-riscv64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-N/euLsBd1rekWcuduakTo/dJw6U6sBP3eUq+RXM9RNfPuWTvG2w/WObDkIvJ2KChy6oxZmOSC08Ak2OJA0UiAA==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-s390x-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-2l9sA7d7QdikL0xQwNMO3xURBUNEWyHVHfAsHsUdq+E/pgLTUcCE+gih5PCdmyHmfTDeXUWVhqL0WZzg0nua3g==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-x64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-XZdD3fEEQcwG2KrJDdEQu7NrHonPxxaV0/w2HpvINBdcqebz1aL+0vM2WFJq4DeiAVT6F5SUQas65HY5JDqoPw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-x64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-7ayfgvtmmWgKWBkCGg5+xTQ0r5V1owVm67zTrsEY1008L5ro7mCyGYORomARt/OquB9KY7LpxVBZes+oSniAAQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-arm64-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-B+IJgcBnE2bm93jEW5kHisqvPITs4ddLOROAcOc/diBgrEiQJJ6Qcjby75rFSmH5eMGrqJryUgJDhrfj942apQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-ia32-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-+CXwwG66g0/FpWOnP/v1HnrGVSOygK/osUbu3wPRy8ECXjoYKjRAyfxYpDQOfghC5qPJYLPH0oN4MCOjwgdMug==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-x64-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-SRf1cytG7wqcHVLrBc9VtPK4pU5wxiB/lNIkNmW2ApKXIg+RpqwHfsaEK+e7eH4A1BpI6BX/aBWXxZCIrJg3uA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@tanstack/react-store\": {\n \"version\": \"0.7.3\",\n \"resolved\": \"https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.7.3.tgz\",\n \"integrity\": \"sha512-3Dnqtbw9P2P0gw8uUM8WP2fFfg8XMDSZCTsywRPZe/XqqYW8PGkXKZTvP0AHkE4mpqP9Y43GpOg9vwO44azu6Q==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@tanstack/store\": \"0.7.2\",\n \"use-sync-external-store\": \"^1.5.0\"\n },\n \"funding\": {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/tannerlinsley\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\",\n \"react-dom\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\"\n }\n },\n \"node_modules/@tanstack/store\": {\n \"version\": \"0.7.2\",\n \"resolved\": \"https://registry.npmjs.org/@tanstack/store/-/store-0.7.2.tgz\",\n \"integrity\": \"sha512-RP80Z30BYiPX2Pyo0Nyw4s1SJFH2jyM6f9i3HfX4pA+gm5jsnYryscdq2aIQLnL4TaGuQMO+zXmN9nh1Qck+Pg==\",\n \"license\": \"MIT\",\n \"funding\": {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/tannerlinsley\"\n }\n },\n \"node_modules/@types/babel__core\": {\n \"version\": \"7.20.5\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz\",\n \"integrity\": \"sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.20.7\",\n \"@babel/types\": \"^7.20.7\",\n \"@types/babel__generator\": \"*\",\n \"@types/babel__template\": \"*\",\n \"@types/babel__traverse\": \"*\"\n }\n },\n \"node_modules/@types/babel__generator\": {\n \"version\": \"7.27.0\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz\",\n \"integrity\": \"sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.0.0\"\n }\n },\n \"node_modules/@types/babel__template\": {\n \"version\": \"7.4.4\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz\",\n \"integrity\": \"sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.1.0\",\n \"@babel/types\": \"^7.0.0\"\n }\n },\n \"node_modules/@types/babel__traverse\": {\n \"version\": \"7.20.7\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz\",\n \"integrity\": \"sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.20.7\"\n }\n },\n \"node_modules/@types/chai\": {\n \"version\": \"5.2.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz\",\n \"integrity\": \"sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/deep-eql\": \"*\"\n }\n },\n \"node_modules/@types/deep-eql\": {\n \"version\": \"4.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz\",\n \"integrity\": \"sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@types/estree\": {\n \"version\": \"1.0.8\",\n \"resolved\": \"https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz\",\n \"integrity\": \"sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@types/node\": {\n \"version\": \"22.16.3\",\n \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-22.16.3.tgz\",\n \"integrity\": \"sha512-sr4Xz74KOUeYadexo1r8imhRtlVXcs+j3XK3TcoiYk7B1t3YRVJgtaD3cwX73NYb71pmVuMLNRhJ9XKdoDB74g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"undici-types\": \"~6.21.0\"\n }\n },\n \"node_modules/@types/prop-types\": {\n \"version\": \"15.7.15\",\n \"resolved\": \"https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz\",\n \"integrity\": \"sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@types/react\": {\n \"version\": \"18.3.23\",\n \"resolved\": \"https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz\",\n \"integrity\": \"sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/prop-types\": \"*\",\n \"csstype\": \"^3.0.2\"\n }\n },\n \"node_modules/@types/react-dom\": {\n \"version\": \"18.3.7\",\n \"resolved\": \"https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz\",\n \"integrity\": \"sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"peerDependencies\": {\n \"@types/react\": \"^18.0.0\"\n }\n },\n \"node_modules/@types/retry\": {\n \"version\": \"0.12.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz\",\n \"integrity\": \"sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==\",\n \"license\": \"MIT\",\n \"peer\": true\n },\n \"node_modules/@vitejs/plugin-react\": {\n \"version\": \"4.6.0\",\n \"resolved\": \"https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.6.0.tgz\",\n \"integrity\": \"sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/core\": \"^7.27.4\",\n \"@babel/plugin-transform-react-jsx-self\": \"^7.27.1\",\n \"@babel/plugin-transform-react-jsx-source\": \"^7.27.1\",\n \"@rolldown/pluginutils\": \"1.0.0-beta.19\",\n \"@types/babel__core\": \"^7.20.5\",\n \"react-refresh\": \"^0.17.0\"\n },\n \"engines\": {\n \"node\": \"^14.18.0 || >=16.0.0\"\n },\n \"peerDependencies\": {\n \"vite\": \"^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0\"\n }\n },\n \"node_modules/@vitest/expect\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz\",\n \"integrity\": \"sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/chai\": \"^5.2.2\",\n \"@vitest/spy\": \"3.2.4\",\n \"@vitest/utils\": \"3.2.4\",\n \"chai\": \"^5.2.0\",\n \"tinyrainbow\": \"^2.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/mocker\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz\",\n \"integrity\": \"sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/spy\": \"3.2.4\",\n \"estree-walker\": \"^3.0.3\",\n \"magic-string\": \"^0.30.17\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n },\n \"peerDependencies\": {\n \"msw\": \"^2.4.9\",\n \"vite\": \"^5.0.0 || ^6.0.0 || ^7.0.0-0\"\n },\n \"peerDependenciesMeta\": {\n \"msw\": {\n \"optional\": true\n },\n \"vite\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/@vitest/pretty-format\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz\",\n \"integrity\": \"sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"tinyrainbow\": \"^2.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/runner\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz\",\n \"integrity\": \"sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/utils\": \"3.2.4\",\n \"pathe\": \"^2.0.3\",\n \"strip-literal\": \"^3.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/snapshot\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz\",\n \"integrity\": \"sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/pretty-format\": \"3.2.4\",\n \"magic-string\": \"^0.30.17\",\n \"pathe\": \"^2.0.3\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/spy\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz\",\n \"integrity\": \"sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"tinyspy\": \"^4.0.3\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/utils\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz\",\n \"integrity\": \"sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/pretty-format\": \"3.2.4\",\n \"loupe\": \"^3.1.4\",\n \"tinyrainbow\": \"^2.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/ansi-regex\": {\n \"version\": \"5.0.1\",\n \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/ansi-styles\": {\n \"version\": \"4.3.0\",\n \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\n \"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"color-convert\": \"^2.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n }\n },\n \"node_modules/assertion-error\": {\n \"version\": \"2.0.1\",\n \"resolved\": \"https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz\",\n \"integrity\": \"sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/browserslist\": {\n \"version\": \"4.25.1\",\n \"resolved\": \"https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz\",\n \"integrity\": \"sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"caniuse-lite\": \"^1.0.30001726\",\n \"electron-to-chromium\": \"^1.5.173\",\n \"node-releases\": \"^2.0.19\",\n \"update-browserslist-db\": \"^1.1.3\"\n },\n \"bin\": {\n \"browserslist\": \"cli.js\"\n },\n \"engines\": {\n \"node\": \"^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7\"\n }\n },\n \"node_modules/buffer-from\": {\n \"version\": \"1.1.2\",\n \"resolved\": \"https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz\",\n \"integrity\": \"sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/cac\": {\n \"version\": \"6.7.14\",\n \"resolved\": \"https://registry.npmjs.org/cac/-/cac-6.7.14.tgz\",\n \"integrity\": \"sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/caniuse-lite\": {\n \"version\": \"1.0.30001727\",\n \"resolved\": \"https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz\",\n \"integrity\": \"sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/caniuse-lite\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"CC-BY-4.0\"\n },\n \"node_modules/cbor-extract\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/cbor-extract/-/cbor-extract-2.2.0.tgz\",\n \"integrity\": \"sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==\",\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"peer\": true,\n \"dependencies\": {\n \"node-gyp-build-optional-packages\": \"5.1.1\"\n },\n \"bin\": {\n \"download-cbor-prebuilds\": \"bin/download-prebuilds.js\"\n },\n \"optionalDependencies\": {\n \"@cbor-extract/cbor-extract-darwin-arm64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-darwin-x64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-arm\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-arm64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-x64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-win32-x64\": \"2.2.0\"\n }\n },\n \"node_modules/cbor-x\": {\n \"version\": \"1.6.0\",\n \"resolved\": \"https://registry.npmjs.org/cbor-x/-/cbor-x-1.6.0.tgz\",\n \"integrity\": \"sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"optionalDependencies\": {\n \"cbor-extract\": \"^2.2.0\"\n }\n },\n \"node_modules/chai\": {\n \"version\": \"5.2.1\",\n \"resolved\": \"https://registry.npmjs.org/chai/-/chai-5.2.1.tgz\",\n \"integrity\": \"sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"assertion-error\": \"^2.0.1\",\n \"check-error\": \"^2.1.1\",\n \"deep-eql\": \"^5.0.1\",\n \"loupe\": \"^3.1.0\",\n \"pathval\": \"^2.0.0\"\n },\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/chalk\": {\n \"version\": \"4.1.2\",\n \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz\",\n \"integrity\": \"sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-styles\": \"^4.1.0\",\n \"supports-color\": \"^7.1.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/chalk?sponsor=1\"\n }\n },\n \"node_modules/chalk/node_modules/supports-color\": {\n \"version\": \"7.2.0\",\n \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz\",\n \"integrity\": \"sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"has-flag\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/check-error\": {\n \"version\": \"2.1.1\",\n \"resolved\": \"https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz\",\n \"integrity\": \"sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">= 16\"\n }\n },\n \"node_modules/cliui\": {\n \"version\": \"8.0.1\",\n \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz\",\n \"integrity\": \"sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"dependencies\": {\n \"string-width\": \"^4.2.0\",\n \"strip-ansi\": \"^6.0.1\",\n \"wrap-ansi\": \"^7.0.0\"\n },\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/color-convert\": {\n \"version\": \"2.0.1\",\n \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\n \"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"color-name\": \"~1.1.4\"\n },\n \"engines\": {\n \"node\": \">=7.0.0\"\n }\n },\n \"node_modules/color-name\": {\n \"version\": \"1.1.4\",\n \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\n \"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/concurrently\": {\n \"version\": \"8.2.2\",\n \"resolved\": \"https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz\",\n \"integrity\": \"sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"chalk\": \"^4.1.2\",\n \"date-fns\": \"^2.30.0\",\n \"lodash\": \"^4.17.21\",\n \"rxjs\": \"^7.8.1\",\n \"shell-quote\": \"^1.8.1\",\n \"spawn-command\": \"0.0.2\",\n \"supports-color\": \"^8.1.1\",\n \"tree-kill\": \"^1.2.2\",\n \"yargs\": \"^17.7.2\"\n },\n \"bin\": {\n \"conc\": \"dist/bin/concurrently.js\",\n \"concurrently\": \"dist/bin/concurrently.js\"\n },\n \"engines\": {\n \"node\": \"^14.13.0 || >=16.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/open-cli-tools/concurrently?sponsor=1\"\n }\n },\n \"node_modules/convert-source-map\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz\",\n \"integrity\": \"sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/csstype\": {\n \"version\": \"3.1.3\",\n \"resolved\": \"https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz\",\n \"integrity\": \"sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/date-fns\": {\n \"version\": \"2.30.0\",\n \"resolved\": \"https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz\",\n \"integrity\": \"sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.21.0\"\n },\n \"engines\": {\n \"node\": \">=0.11\"\n },\n \"funding\": {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/date-fns\"\n }\n },\n \"node_modules/debug\": {\n \"version\": \"4.4.1\",\n \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.4.1.tgz\",\n \"integrity\": \"sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ms\": \"^2.1.3\"\n },\n \"engines\": {\n \"node\": \">=6.0\"\n },\n \"peerDependenciesMeta\": {\n \"supports-color\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/deep-eql\": {\n \"version\": \"5.0.2\",\n \"resolved\": \"https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz\",\n \"integrity\": \"sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/detect-libc\": {\n \"version\": \"2.0.4\",\n \"resolved\": \"https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz\",\n \"integrity\": \"sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==\",\n \"license\": \"Apache-2.0\",\n \"optional\": true,\n \"peer\": true,\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/electron-to-chromium\": {\n \"version\": \"1.5.183\",\n \"resolved\": \"https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.183.tgz\",\n \"integrity\": \"sha512-vCrDBYjQCAEefWGjlK3EpoSKfKbT10pR4XXPdn65q7snuNOZnthoVpBfZPykmDapOKfoD+MMIPG8ZjKyyc9oHA==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/emoji-regex\": {\n \"version\": \"8.0.0\",\n \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/es-module-lexer\": {\n \"version\": \"1.7.0\",\n \"resolved\": \"https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz\",\n \"integrity\": \"sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/esbuild\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz\",\n \"integrity\": \"sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"esbuild\": \"bin/esbuild\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"optionalDependencies\": {\n \"@esbuild/android-arm\": \"0.18.20\",\n \"@esbuild/android-arm64\": \"0.18.20\",\n \"@esbuild/android-x64\": \"0.18.20\",\n \"@esbuild/darwin-arm64\": \"0.18.20\",\n \"@esbuild/darwin-x64\": \"0.18.20\",\n \"@esbuild/freebsd-arm64\": \"0.18.20\",\n \"@esbuild/freebsd-x64\": \"0.18.20\",\n \"@esbuild/linux-arm\": \"0.18.20\",\n \"@esbuild/linux-arm64\": \"0.18.20\",\n \"@esbuild/linux-ia32\": \"0.18.20\",\n \"@esbuild/linux-loong64\": \"0.18.20\",\n \"@esbuild/linux-mips64el\": \"0.18.20\",\n \"@esbuild/linux-ppc64\": \"0.18.20\",\n \"@esbuild/linux-riscv64\": \"0.18.20\",\n \"@esbuild/linux-s390x\": \"0.18.20\",\n \"@esbuild/linux-x64\": \"0.18.20\",\n \"@esbuild/netbsd-x64\": \"0.18.20\",\n \"@esbuild/openbsd-x64\": \"0.18.20\",\n \"@esbuild/sunos-x64\": \"0.18.20\",\n \"@esbuild/win32-arm64\": \"0.18.20\",\n \"@esbuild/win32-ia32\": \"0.18.20\",\n \"@esbuild/win32-x64\": \"0.18.20\"\n }\n },\n \"node_modules/escalade\": {\n \"version\": \"3.2.0\",\n \"resolved\": \"https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz\",\n \"integrity\": \"sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/estree-walker\": {\n \"version\": \"3.0.3\",\n \"resolved\": \"https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz\",\n \"integrity\": \"sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/estree\": \"^1.0.0\"\n }\n },\n \"node_modules/expect-type\": {\n \"version\": \"1.2.2\",\n \"resolved\": \"https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz\",\n \"integrity\": \"sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"engines\": {\n \"node\": \">=12.0.0\"\n }\n },\n \"node_modules/fdir\": {\n \"version\": \"6.4.6\",\n \"resolved\": \"https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz\",\n \"integrity\": \"sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"peerDependencies\": {\n \"picomatch\": \"^3 || ^4\"\n },\n \"peerDependenciesMeta\": {\n \"picomatch\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/fsevents\": {\n \"version\": \"2.3.3\",\n \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz\",\n \"integrity\": \"sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n }\n },\n \"node_modules/gensync\": {\n \"version\": \"1.0.0-beta.2\",\n \"resolved\": \"https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz\",\n \"integrity\": \"sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/get-caller-file\": {\n \"version\": \"2.0.5\",\n \"resolved\": \"https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz\",\n \"integrity\": \"sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \"6.* || 8.* || >= 10.*\"\n }\n },\n \"node_modules/get-tsconfig\": {\n \"version\": \"4.10.1\",\n \"resolved\": \"https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz\",\n \"integrity\": \"sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"resolve-pkg-maps\": \"^1.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/privatenumber/get-tsconfig?sponsor=1\"\n }\n },\n \"node_modules/has-flag\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz\",\n \"integrity\": \"sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/invariant\": {\n \"version\": \"2.2.4\",\n \"resolved\": \"https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz\",\n \"integrity\": \"sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"dependencies\": {\n \"loose-envify\": \"^1.0.0\"\n }\n },\n \"node_modules/is-fullwidth-code-point\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz\",\n \"integrity\": \"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/is-network-error\": {\n \"version\": \"1.1.0\",\n \"resolved\": \"https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz\",\n \"integrity\": \"sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">=16\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/js-tokens\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz\",\n \"integrity\": \"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==\",\n \"license\": \"MIT\"\n },\n \"node_modules/jsesc\": {\n \"version\": \"3.1.0\",\n \"resolved\": \"https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz\",\n \"integrity\": \"sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"jsesc\": \"bin/jsesc\"\n },\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/json5\": {\n \"version\": \"2.2.3\",\n \"resolved\": \"https://registry.npmjs.org/json5/-/json5-2.2.3.tgz\",\n \"integrity\": \"sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"json5\": \"lib/cli.js\"\n },\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/lodash\": {\n \"version\": \"4.17.21\",\n \"resolved\": \"https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz\",\n \"integrity\": \"sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/loose-envify\": {\n \"version\": \"1.4.0\",\n \"resolved\": \"https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz\",\n \"integrity\": \"sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"js-tokens\": \"^3.0.0 || ^4.0.0\"\n },\n \"bin\": {\n \"loose-envify\": \"cli.js\"\n }\n },\n \"node_modules/loupe\": {\n \"version\": \"3.1.4\",\n \"resolved\": \"https://registry.npmjs.org/loupe/-/loupe-3.1.4.tgz\",\n \"integrity\": \"sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/lru-cache\": {\n \"version\": \"5.1.1\",\n \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz\",\n \"integrity\": \"sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"dependencies\": {\n \"yallist\": \"^3.0.2\"\n }\n },\n \"node_modules/magic-string\": {\n \"version\": \"0.30.17\",\n \"resolved\": \"https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz\",\n \"integrity\": \"sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/sourcemap-codec\": \"^1.5.0\"\n }\n },\n \"node_modules/ms\": {\n \"version\": \"2.1.3\",\n \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz\",\n \"integrity\": \"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/nanoid\": {\n \"version\": \"3.3.11\",\n \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz\",\n \"integrity\": \"sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"bin\": {\n \"nanoid\": \"bin/nanoid.cjs\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || ^13.7 || ^14 || >=15.0.1\"\n }\n },\n \"node_modules/node-gyp-build-optional-packages\": {\n \"version\": \"5.1.1\",\n \"resolved\": \"https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz\",\n \"integrity\": \"sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==\",\n \"license\": \"MIT\",\n \"optional\": true,\n \"peer\": true,\n \"dependencies\": {\n \"detect-libc\": \"^2.0.1\"\n },\n \"bin\": {\n \"node-gyp-build-optional-packages\": \"bin.js\",\n \"node-gyp-build-optional-packages-optional\": \"optional.js\",\n \"node-gyp-build-optional-packages-test\": \"build-test.js\"\n }\n },\n \"node_modules/node-releases\": {\n \"version\": \"2.0.19\",\n \"resolved\": \"https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz\",\n \"integrity\": \"sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/on-change\": {\n \"version\": \"5.0.1\",\n \"resolved\": \"https://registry.npmjs.org/on-change/-/on-change-5.0.1.tgz\",\n \"integrity\": \"sha512-n7THCP7RkyReRSLkJb8kUWoNsxUIBxTkIp3JKno+sEz6o/9AJ3w3P9fzQkITEkMwyTKJjZciF3v/pVoouxZZMg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">=18\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sindresorhus/on-change?sponsor=1\"\n }\n },\n \"node_modules/p-retry\": {\n \"version\": \"6.2.1\",\n \"resolved\": \"https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz\",\n \"integrity\": \"sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"dependencies\": {\n \"@types/retry\": \"0.12.2\",\n \"is-network-error\": \"^1.0.0\",\n \"retry\": \"^0.13.1\"\n },\n \"engines\": {\n \"node\": \">=16.17\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/pathe\": {\n \"version\": \"2.0.3\",\n \"resolved\": \"https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz\",\n \"integrity\": \"sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/pathval\": {\n \"version\": \"2.0.1\",\n \"resolved\": \"https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz\",\n \"integrity\": \"sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">= 14.16\"\n }\n },\n \"node_modules/picocolors\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz\",\n \"integrity\": \"sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/picomatch\": {\n \"version\": \"4.0.2\",\n \"resolved\": \"https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz\",\n \"integrity\": \"sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=12\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/jonschlinkert\"\n }\n },\n \"node_modules/postcss\": {\n \"version\": \"8.5.6\",\n \"resolved\": \"https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz\",\n \"integrity\": \"sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/postcss/\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/postcss\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"nanoid\": \"^3.3.11\",\n \"picocolors\": \"^1.1.1\",\n \"source-map-js\": \"^1.2.1\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || >=14\"\n }\n },\n \"node_modules/react\": {\n \"version\": \"18.3.1\",\n \"resolved\": \"https://registry.npmjs.org/react/-/react-18.3.1.tgz\",\n \"integrity\": \"sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\"\n },\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/react-dom\": {\n \"version\": \"18.3.1\",\n \"resolved\": \"https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz\",\n \"integrity\": \"sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\",\n \"scheduler\": \"^0.23.2\"\n },\n \"peerDependencies\": {\n \"react\": \"^18.3.1\"\n }\n },\n \"node_modules/react-refresh\": {\n \"version\": \"0.17.0\",\n \"resolved\": \"https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz\",\n \"integrity\": \"sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/require-directory\": {\n \"version\": \"2.1.1\",\n \"resolved\": \"https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz\",\n \"integrity\": \"sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/resolve-pkg-maps\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz\",\n \"integrity\": \"sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"funding\": {\n \"url\": \"https://github.com/privatenumber/resolve-pkg-maps?sponsor=1\"\n }\n },\n \"node_modules/retry\": {\n \"version\": \"0.13.1\",\n \"resolved\": \"https://registry.npmjs.org/retry/-/retry-0.13.1.tgz\",\n \"integrity\": \"sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">= 4\"\n }\n },\n \"node_modules/rollup\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/rollup/-/rollup-4.45.0.tgz\",\n \"integrity\": \"sha512-WLjEcJRIo7i3WDDgOIJqVI2d+lAC3EwvOGy+Xfq6hs+GQuAA4Di/H72xmXkOhrIWFg2PFYSKZYfH0f4vfKXN4A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/estree\": \"1.0.8\"\n },\n \"bin\": {\n \"rollup\": \"dist/bin/rollup\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\",\n \"npm\": \">=8.0.0\"\n },\n \"optionalDependencies\": {\n \"@rollup/rollup-android-arm-eabi\": \"4.45.0\",\n \"@rollup/rollup-android-arm64\": \"4.45.0\",\n \"@rollup/rollup-darwin-arm64\": \"4.45.0\",\n \"@rollup/rollup-darwin-x64\": \"4.45.0\",\n \"@rollup/rollup-freebsd-arm64\": \"4.45.0\",\n \"@rollup/rollup-freebsd-x64\": \"4.45.0\",\n \"@rollup/rollup-linux-arm-gnueabihf\": \"4.45.0\",\n \"@rollup/rollup-linux-arm-musleabihf\": \"4.45.0\",\n \"@rollup/rollup-linux-arm64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-arm64-musl\": \"4.45.0\",\n \"@rollup/rollup-linux-loongarch64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-powerpc64le-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-riscv64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-riscv64-musl\": \"4.45.0\",\n \"@rollup/rollup-linux-s390x-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-x64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-x64-musl\": \"4.45.0\",\n \"@rollup/rollup-win32-arm64-msvc\": \"4.45.0\",\n \"@rollup/rollup-win32-ia32-msvc\": \"4.45.0\",\n \"@rollup/rollup-win32-x64-msvc\": \"4.45.0\",\n \"fsevents\": \"~2.3.2\"\n }\n },\n \"node_modules/rxjs\": {\n \"version\": \"7.8.2\",\n \"resolved\": \"https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz\",\n \"integrity\": \"sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"tslib\": \"^2.1.0\"\n }\n },\n \"node_modules/scheduler\": {\n \"version\": \"0.23.2\",\n \"resolved\": \"https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz\",\n \"integrity\": \"sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\"\n }\n },\n \"node_modules/semver\": {\n \"version\": \"6.3.1\",\n \"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n \"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"bin\": {\n \"semver\": \"bin/semver.js\"\n }\n },\n \"node_modules/shell-quote\": {\n \"version\": \"1.8.3\",\n \"resolved\": \"https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz\",\n \"integrity\": \"sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">= 0.4\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/ljharb\"\n }\n },\n \"node_modules/siginfo\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz\",\n \"integrity\": \"sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/source-map\": {\n \"version\": \"0.6.1\",\n \"resolved\": \"https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz\",\n \"integrity\": \"sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==\",\n \"dev\": true,\n \"license\": \"BSD-3-Clause\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/source-map-js\": {\n \"version\": \"1.2.1\",\n \"resolved\": \"https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz\",\n \"integrity\": \"sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==\",\n \"dev\": true,\n \"license\": \"BSD-3-Clause\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/source-map-support\": {\n \"version\": \"0.5.21\",\n \"resolved\": \"https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz\",\n \"integrity\": \"sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"buffer-from\": \"^1.0.0\",\n \"source-map\": \"^0.6.0\"\n }\n },\n \"node_modules/spawn-command\": {\n \"version\": \"0.0.2\",\n \"resolved\": \"https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz\",\n \"integrity\": \"sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==\",\n \"dev\": true\n },\n \"node_modules/stackback\": {\n \"version\": \"0.0.2\",\n \"resolved\": \"https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz\",\n \"integrity\": \"sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/std-env\": {\n \"version\": \"3.9.0\",\n \"resolved\": \"https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz\",\n \"integrity\": \"sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/string-width\": {\n \"version\": \"4.2.3\",\n \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"emoji-regex\": \"^8.0.0\",\n \"is-fullwidth-code-point\": \"^3.0.0\",\n \"strip-ansi\": \"^6.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/strip-ansi\": {\n \"version\": \"6.0.1\",\n \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-regex\": \"^5.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/strip-literal\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz\",\n \"integrity\": \"sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"js-tokens\": \"^9.0.1\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/antfu\"\n }\n },\n \"node_modules/strip-literal/node_modules/js-tokens\": {\n \"version\": \"9.0.1\",\n \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz\",\n \"integrity\": \"sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/supports-color\": {\n \"version\": \"8.1.1\",\n \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz\",\n \"integrity\": \"sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"has-flag\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/supports-color?sponsor=1\"\n }\n },\n \"node_modules/tinybench\": {\n \"version\": \"2.9.0\",\n \"resolved\": \"https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz\",\n \"integrity\": \"sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/tinyexec\": {\n \"version\": \"0.3.2\",\n \"resolved\": \"https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz\",\n \"integrity\": \"sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/tinyglobby\": {\n \"version\": \"0.2.14\",\n \"resolved\": \"https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz\",\n \"integrity\": \"sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"fdir\": \"^6.4.4\",\n \"picomatch\": \"^4.0.2\"\n },\n \"engines\": {\n \"node\": \">=12.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/SuperchupuDev\"\n }\n },\n \"node_modules/tinypool\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz\",\n \"integrity\": \"sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n }\n },\n \"node_modules/tinyrainbow\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz\",\n \"integrity\": \"sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=14.0.0\"\n }\n },\n \"node_modules/tinyspy\": {\n \"version\": \"4.0.3\",\n \"resolved\": \"https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz\",\n \"integrity\": \"sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=14.0.0\"\n }\n },\n \"node_modules/tree-kill\": {\n \"version\": \"1.2.2\",\n \"resolved\": \"https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz\",\n \"integrity\": \"sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"tree-kill\": \"cli.js\"\n }\n },\n \"node_modules/tslib\": {\n \"version\": \"2.8.1\",\n \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz\",\n \"integrity\": \"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==\",\n \"dev\": true,\n \"license\": \"0BSD\"\n },\n \"node_modules/tsx\": {\n \"version\": \"3.14.0\",\n \"resolved\": \"https://registry.npmjs.org/tsx/-/tsx-3.14.0.tgz\",\n \"integrity\": \"sha512-xHtFaKtHxM9LOklMmJdI3BEnQq/D5F73Of2E1GDrITi9sgoVkvIsrQUTY1G8FlmGtA+awCI4EBlTRRYxkL2sRg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"esbuild\": \"~0.18.20\",\n \"get-tsconfig\": \"^4.7.2\",\n \"source-map-support\": \"^0.5.21\"\n },\n \"bin\": {\n \"tsx\": \"dist/cli.mjs\"\n },\n \"optionalDependencies\": {\n \"fsevents\": \"~2.3.3\"\n }\n },\n \"node_modules/typescript\": {\n \"version\": \"5.8.3\",\n \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz\",\n \"integrity\": \"sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"bin\": {\n \"tsc\": \"bin/tsc\",\n \"tsserver\": \"bin/tsserver\"\n },\n \"engines\": {\n \"node\": \">=14.17\"\n }\n },\n \"node_modules/undici-types\": {\n \"version\": \"6.21.0\",\n \"resolved\": \"https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz\",\n \"integrity\": \"sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/update-browserslist-db\": {\n \"version\": \"1.1.3\",\n \"resolved\": \"https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz\",\n \"integrity\": \"sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"escalade\": \"^3.2.0\",\n \"picocolors\": \"^1.1.1\"\n },\n \"bin\": {\n \"update-browserslist-db\": \"cli.js\"\n },\n \"peerDependencies\": {\n \"browserslist\": \">= 4.21.0\"\n }\n },\n \"node_modules/use-sync-external-store\": {\n \"version\": \"1.5.0\",\n \"resolved\": \"https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz\",\n \"integrity\": \"sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==\",\n \"license\": \"MIT\",\n \"peerDependencies\": {\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\"\n }\n },\n \"node_modules/vite\": {\n \"version\": \"5.4.19\",\n \"resolved\": \"https://registry.npmjs.org/vite/-/vite-5.4.19.tgz\",\n \"integrity\": \"sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"esbuild\": \"^0.21.3\",\n \"postcss\": \"^8.4.43\",\n \"rollup\": \"^4.20.0\"\n },\n \"bin\": {\n \"vite\": \"bin/vite.js\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/vitejs/vite?sponsor=1\"\n },\n \"optionalDependencies\": {\n \"fsevents\": \"~2.3.3\"\n },\n \"peerDependencies\": {\n \"@types/node\": \"^18.0.0 || >=20.0.0\",\n \"less\": \"*\",\n \"lightningcss\": \"^1.21.0\",\n \"sass\": \"*\",\n \"sass-embedded\": \"*\",\n \"stylus\": \"*\",\n \"sugarss\": \"*\",\n \"terser\": \"^5.4.0\"\n },\n \"peerDependenciesMeta\": {\n \"@types/node\": {\n \"optional\": true\n },\n \"less\": {\n \"optional\": true\n },\n \"lightningcss\": {\n \"optional\": true\n },\n \"sass\": {\n \"optional\": true\n },\n \"sass-embedded\": {\n \"optional\": true\n },\n \"stylus\": {\n \"optional\": true\n },\n \"sugarss\": {\n \"optional\": true\n },\n \"terser\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/vite-node\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz\",\n \"integrity\": \"sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"cac\": \"^6.7.14\",\n \"debug\": \"^4.4.1\",\n \"es-module-lexer\": \"^1.7.0\",\n \"pathe\": \"^2.0.3\",\n \"vite\": \"^5.0.0 || ^6.0.0 || ^7.0.0-0\"\n },\n \"bin\": {\n \"vite-node\": \"vite-node.mjs\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || ^20.0.0 || >=22.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-arm\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz\",\n \"integrity\": \"sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/darwin-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/darwin-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/freebsd-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/freebsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-arm\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz\",\n \"integrity\": \"sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-ia32\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz\",\n \"integrity\": \"sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-loong64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz\",\n \"integrity\": \"sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-mips64el\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz\",\n \"integrity\": \"sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==\",\n \"cpu\": [\n \"mips64el\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-ppc64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz\",\n \"integrity\": \"sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-riscv64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz\",\n \"integrity\": \"sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-s390x\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz\",\n \"integrity\": \"sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/netbsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"netbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/openbsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"openbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/sunos-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"sunos\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-ia32\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz\",\n \"integrity\": \"sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/esbuild\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz\",\n \"integrity\": \"sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"esbuild\": \"bin/esbuild\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"optionalDependencies\": {\n \"@esbuild/aix-ppc64\": \"0.21.5\",\n \"@esbuild/android-arm\": \"0.21.5\",\n \"@esbuild/android-arm64\": \"0.21.5\",\n \"@esbuild/android-x64\": \"0.21.5\",\n \"@esbuild/darwin-arm64\": \"0.21.5\",\n \"@esbuild/darwin-x64\": \"0.21.5\",\n \"@esbuild/freebsd-arm64\": \"0.21.5\",\n \"@esbuild/freebsd-x64\": \"0.21.5\",\n \"@esbuild/linux-arm\": \"0.21.5\",\n \"@esbuild/linux-arm64\": \"0.21.5\",\n \"@esbuild/linux-ia32\": \"0.21.5\",\n \"@esbuild/linux-loong64\": \"0.21.5\",\n \"@esbuild/linux-mips64el\": \"0.21.5\",\n \"@esbuild/linux-ppc64\": \"0.21.5\",\n \"@esbuild/linux-riscv64\": \"0.21.5\",\n \"@esbuild/linux-s390x\": \"0.21.5\",\n \"@esbuild/linux-x64\": \"0.21.5\",\n \"@esbuild/netbsd-x64\": \"0.21.5\",\n \"@esbuild/openbsd-x64\": \"0.21.5\",\n \"@esbuild/sunos-x64\": \"0.21.5\",\n \"@esbuild/win32-arm64\": \"0.21.5\",\n \"@esbuild/win32-ia32\": \"0.21.5\",\n \"@esbuild/win32-x64\": \"0.21.5\"\n }\n },\n \"node_modules/vitest\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz\",\n \"integrity\": \"sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/chai\": \"^5.2.2\",\n \"@vitest/expect\": \"3.2.4\",\n \"@vitest/mocker\": \"3.2.4\",\n \"@vitest/pretty-format\": \"^3.2.4\",\n \"@vitest/runner\": \"3.2.4\",\n \"@vitest/snapshot\": \"3.2.4\",\n \"@vitest/spy\": \"3.2.4\",\n \"@vitest/utils\": \"3.2.4\",\n \"chai\": \"^5.2.0\",\n \"debug\": \"^4.4.1\",\n \"expect-type\": \"^1.2.1\",\n \"magic-string\": \"^0.30.17\",\n \"pathe\": \"^2.0.3\",\n \"picomatch\": \"^4.0.2\",\n \"std-env\": \"^3.9.0\",\n \"tinybench\": \"^2.9.0\",\n \"tinyexec\": \"^0.3.2\",\n \"tinyglobby\": \"^0.2.14\",\n \"tinypool\": \"^1.1.1\",\n \"tinyrainbow\": \"^2.0.0\",\n \"vite\": \"^5.0.0 || ^6.0.0 || ^7.0.0-0\",\n \"vite-node\": \"3.2.4\",\n \"why-is-node-running\": \"^2.3.0\"\n },\n \"bin\": {\n \"vitest\": \"vitest.mjs\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || ^20.0.0 || >=22.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n },\n \"peerDependencies\": {\n \"@edge-runtime/vm\": \"*\",\n \"@types/debug\": \"^4.1.12\",\n \"@types/node\": \"^18.0.0 || ^20.0.0 || >=22.0.0\",\n \"@vitest/browser\": \"3.2.4\",\n \"@vitest/ui\": \"3.2.4\",\n \"happy-dom\": \"*\",\n \"jsdom\": \"*\"\n },\n \"peerDependenciesMeta\": {\n \"@edge-runtime/vm\": {\n \"optional\": true\n },\n \"@types/debug\": {\n \"optional\": true\n },\n \"@types/node\": {\n \"optional\": true\n },\n \"@vitest/browser\": {\n \"optional\": true\n },\n \"@vitest/ui\": {\n \"optional\": true\n },\n \"happy-dom\": {\n \"optional\": true\n },\n \"jsdom\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/why-is-node-running\": {\n \"version\": \"2.3.0\",\n \"resolved\": \"https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz\",\n \"integrity\": \"sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"siginfo\": \"^2.0.0\",\n \"stackback\": \"0.0.2\"\n },\n \"bin\": {\n \"why-is-node-running\": \"cli.js\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/wrap-ansi\": {\n \"version\": \"7.0.0\",\n \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\n \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-styles\": \"^4.0.0\",\n \"string-width\": \"^4.1.0\",\n \"strip-ansi\": \"^6.0.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n }\n },\n \"node_modules/y18n\": {\n \"version\": \"5.0.8\",\n \"resolved\": \"https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz\",\n \"integrity\": \"sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \">=10\"\n }\n },\n \"node_modules/yallist\": {\n \"version\": \"3.1.1\",\n \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz\",\n \"integrity\": \"sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/yargs\": {\n \"version\": \"17.7.2\",\n \"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz\",\n \"integrity\": \"sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"cliui\": \"^8.0.1\",\n \"escalade\": \"^3.1.1\",\n \"get-caller-file\": \"^2.0.5\",\n \"require-directory\": \"^2.1.1\",\n \"string-width\": \"^4.2.3\",\n \"y18n\": \"^5.0.5\",\n \"yargs-parser\": \"^21.1.1\"\n },\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/yargs-parser\": {\n \"version\": \"21.1.1\",\n \"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz\",\n \"integrity\": \"sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/zod\": {\n \"version\": \"3.25.76\",\n \"resolved\": \"https://registry.npmjs.org/zod/-/zod-3.25.76.tgz\",\n \"integrity\": \"sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"funding\": {\n \"url\": \"https://github.com/sponsors/colinhacks\"\n }\n }\n }\n}\n", "package.json": "{\n \"name\": \"example-rate\",\n \"version\": \"0.9.1\",\n \"private\": true,\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"concurrently \\\"npm run dev:backend\\\" \\\"npm run dev:frontend\\\"\",\n \"dev:backend\": \"tsx --watch src/backend/server.ts\",\n \"dev:frontend\": \"vite\",\n \"build\": \"vite build\",\n \"check-types\": \"tsc --noEmit\",\n \"test\": \"vitest run\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.13.9\",\n \"@types/react\": \"^18.2.0\",\n \"@types/react-dom\": \"^18.2.0\",\n \"@vitejs/plugin-react\": \"^4.2.0\",\n \"concurrently\": \"^8.2.2\",\n \"rivetkit\": \"^0.9.1\",\n \"tsx\": \"^3.12.7\",\n \"typescript\": \"^5.5.2\",\n \"vite\": \"^5.0.0\",\n \"vitest\": \"^3.1.1\"\n },\n \"dependencies\": {\n \"@rivetkit/react\": \"^0.9.1\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\"\n },\n \"stableVersion\": \"0.8.0\"\n}\n", "tsconfig.json": "{\n \"compilerOptions\": {\n \"target\": \"esnext\",\n \"lib\": [\"esnext\", \"dom\"],\n \"jsx\": \"react-jsx\",\n \"module\": \"esnext\",\n \"moduleResolution\": \"bundler\",\n \"types\": [\"node\", \"vite/client\"],\n \"resolveJsonModule\": true,\n \"allowJs\": true,\n \"checkJs\": false,\n \"noEmit\": true,\n \"isolatedModules\": true,\n \"allowSyntheticDefaultImports\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"strict\": true,\n \"skipLibCheck\": true\n },\n \"include\": [\"src/**/*\"],\n \"exclude\": [\"node_modules\", \"dist\"]\n}\n", @@ -157,7 +157,7 @@ export const examples: ExampleData[] = [ "src/frontend/App.tsx": "import { createClient, createRivetKit } from \"@rivetkit/react\";\nimport { useEffect, useState } from \"react\";\nimport type { RateLimitResult, registry } from \"../backend/registry\";\n\nconst client = createClient(\"http://localhost:8080\");\nconst { useActor } = createRivetKit(client);\n\nfunction RateLimiterDemo({ userId }: { userId: string }) {\n\tconst [result, setResult] = useState(null);\n\tconst [loading, setLoading] = useState(false);\n\n\tconst rateLimiter = useActor({\n\t\tname: \"rateLimiter\",\n\t\tkey: [userId],\n\t});\n\n\tuseEffect(() => {\n\t\tif (rateLimiter.connection) {\n\t\t\t// Get initial status\n\t\t\trateLimiter.connection.getStatus().then((status) => {\n\t\t\t\tsetResult({\n\t\t\t\t\tallowed: status.remaining > 0,\n\t\t\t\t\tremaining: status.remaining,\n\t\t\t\t\tresetsIn: status.resetsIn,\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}, [rateLimiter.connection]);\n\n\tconst makeRequest = async () => {\n\t\tif (!rateLimiter.connection || loading) return;\n\n\t\tsetLoading(true);\n\t\ttry {\n\t\t\tconst response = await rateLimiter.connection.checkLimit();\n\t\t\tsetResult(response);\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t};\n\n\tconst resetLimiter = async () => {\n\t\tif (!rateLimiter.connection) return;\n\n\t\tawait rateLimiter.connection.reset();\n\t\t// Get updated status\n\t\tconst status = await rateLimiter.connection.getStatus();\n\t\tsetResult({\n\t\t\tallowed: status.remaining > 0,\n\t\t\tremaining: status.remaining,\n\t\t\tresetsIn: status.resetsIn,\n\t\t});\n\t};\n\n\tconst usagePercentage = result ? ((5 - result.remaining) / 5) * 100 : 0;\n\n\treturn (\n\t\t
\n\t\t\t\n\t\t\t\t{loading ? \"Making Request...\" : \"Make API Request\"}\n\t\t\t\n\n\t\t\t{result && (\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\tStatus:\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{result.allowed ? \"✓ Request Allowed\" : \"✖ Request Blocked\"}\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\tRemaining Requests:\n\t\t\t\t\t\t{result.remaining} / 5\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\tRate Limit Usage:\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\tResets In:\n\t\t\t\t\t\t{result.resetsIn} seconds\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t)}\n\n\t\t\t\n\t\t
\n\t);\n}\n\nexport function App() {\n\tconst [selectedUser, setSelectedUser] = useState(\"user-1\");\n\n\tconst users = [\n\t\t{ id: \"user-1\", name: \"User 1\" },\n\t\t{ id: \"user-2\", name: \"User 2\" },\n\t\t{ id: \"user-3\", name: \"User 3\" },\n\t\t{ id: \"api-client-1\", name: \"API Client 1\" },\n\t\t{ id: \"api-client-2\", name: \"API Client 2\" },\n\t];\n\n\treturn (\n\t\t
\n\t\t\t
\n\t\t\t\t

Rate Limiter Demo

\n\t\t\t\t

5 requests per minute per user/client

\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t

How it works

\n\t\t\t\t\t

\n\t\t\t\t\t\tThis rate limiter allows 5 requests per minute per user. Each user gets their own \n\t\t\t\t\t\tindependent rate limit counter. When the limit is exceeded, further requests are \n\t\t\t\t\t\tblocked until the window resets. Switch between users to see isolated rate limiting.\n\t\t\t\t\t

\n\t\t\t\t
\n\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t setSelectedUser(e.target.value)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{users.map((user) => (\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t))}\n\t\t\t\t\t\n\t\t\t\t
\n\n\t\t\t\t\n\t\t\t
\n\t\t
\n\t);\n}", "src/frontend/main.tsx": "import { StrictMode } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { App } from \"./App\";\n\nconst root = document.getElementById(\"root\");\nif (!root) throw new Error(\"Root element not found\");\n\ncreateRoot(root).render(\n\t\n\t\t\n\t\n);", "src/frontend/index.html": "\n\n\n \n \n Rate Limiter Example\n \n\n\n
\n \n\n", - "src/backend/registry.ts": "import { actor, setup } from \"rivetkit\";\n\nexport type RateLimitResult = {\n\tallowed: boolean;\n\tremaining: number;\n\tresetsIn: number;\n};\n\nexport const rateLimiter = actor({\n\tonAuth: () => {},\n\t// Persistent state that survives restarts: https://rivet.gg/docs/actors/state\n\tstate: {\n\t\tcount: 0,\n\t\tresetAt: 0,\n\t},\n\n\tactions: {\n\t\t// Callable functions from clients: https://rivet.gg/docs/actors/actions\n\t\tcheckLimit: (c): RateLimitResult => {\n\t\t\tconst now = Date.now();\n\n\t\t\t// Reset if expired\n\t\t\tif (now > c.state.resetAt) {\n\t\t\t\t// State changes are automatically persisted\n\t\t\t\tc.state.count = 0;\n\t\t\t\tc.state.resetAt = now + 60000; // 1 minute window\n\t\t\t}\n\n\t\t\tconst allowed = c.state.count < 5;\n\n\t\t\t// Increment if allowed\n\t\t\tif (allowed) {\n\t\t\t\tc.state.count++;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tallowed,\n\t\t\t\tremaining: Math.max(0, 5 - c.state.count),\n\t\t\t\tresetsIn: Math.max(0, Math.round((c.state.resetAt - now) / 1000)),\n\t\t\t};\n\t\t},\n\n\t\tgetStatus: (c) => ({\n\t\t\tcount: c.state.count,\n\t\t\tresetAt: c.state.resetAt,\n\t\t\tremaining: Math.max(0, 5 - c.state.count),\n\t\t\tresetsIn: Math.max(0, Math.round((c.state.resetAt - Date.now()) / 1000)),\n\t\t}),\n\n\t\treset: (c) => {\n\t\t\tc.state.count = 0;\n\t\t\tc.state.resetAt = 0;\n\t\t\treturn { success: true };\n\t\t},\n\t},\n});\n\n// Register actors for use: https://rivet.gg/docs/setup\nexport const registry = setup({\n\tuse: { rateLimiter },\n});\n", + "src/backend/registry.ts": "import { actor, setup } from \"rivetkit\";\n\nexport type RateLimitResult = {\n\tallowed: boolean;\n\tremaining: number;\n\tresetsIn: number;\n};\n\nexport const rateLimiter = actor({\n\tonAuth: () => {},\n\t// Persistent state that survives restarts: https://rivet.dev/docs/actors/state\n\tstate: {\n\t\tcount: 0,\n\t\tresetAt: 0,\n\t},\n\n\tactions: {\n\t\t// Callable functions from clients: https://rivet.dev/docs/actors/actions\n\t\tcheckLimit: (c): RateLimitResult => {\n\t\t\tconst now = Date.now();\n\n\t\t\t// Reset if expired\n\t\t\tif (now > c.state.resetAt) {\n\t\t\t\t// State changes are automatically persisted\n\t\t\t\tc.state.count = 0;\n\t\t\t\tc.state.resetAt = now + 60000; // 1 minute window\n\t\t\t}\n\n\t\t\tconst allowed = c.state.count < 5;\n\n\t\t\t// Increment if allowed\n\t\t\tif (allowed) {\n\t\t\t\tc.state.count++;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tallowed,\n\t\t\t\tremaining: Math.max(0, 5 - c.state.count),\n\t\t\t\tresetsIn: Math.max(0, Math.round((c.state.resetAt - now) / 1000)),\n\t\t\t};\n\t\t},\n\n\t\tgetStatus: (c) => ({\n\t\t\tcount: c.state.count,\n\t\t\tresetAt: c.state.resetAt,\n\t\t\tremaining: Math.max(0, 5 - c.state.count),\n\t\t\tresetsIn: Math.max(0, Math.round((c.state.resetAt - Date.now()) / 1000)),\n\t\t}),\n\n\t\treset: (c) => {\n\t\t\tc.state.count = 0;\n\t\t\tc.state.resetAt = 0;\n\t\t\treturn { success: true };\n\t\t},\n\t},\n});\n\n// Register actors for use: https://rivet.dev/docs/setup\nexport const registry = setup({\n\tuse: { rateLimiter },\n});\n", "src/backend/server.ts": "import { registry } from \"./registry\";\n\nregistry.runServer({\n\tcors: {\n\t\torigin: \"*\",\n\t},\n});\n" } }, @@ -172,7 +172,7 @@ export const examples: ExampleData[] = [ "tab": "sqlite", "files": { "tests/database.test.ts": "import { setupTest } from \"rivetkit/test\";\nimport { expect, test, vi } from \"vitest\";\nimport { registry } from \"../src/backend/registry\";\n\n// Mock authentication\nvi.mock(\"../src/backend/my-utils\", () => ({\n\tauthenticate: vi.fn().mockResolvedValue(\"user123\"),\n}));\n\ntest(\"Database notes can handle basic CRUD operations\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst notes = client.notes.getOrCreate([\"test-notes\"]);\n\n\t// Test initial empty state\n\tconst initialNotes = await notes.getNotes();\n\texpect(initialNotes).toEqual([]);\n\n\t// Create a new note\n\tconst newNote = await notes.updateNote({ content: \"My first note\" });\n\texpect(newNote).toMatchObject({\n\t\tid: expect.stringMatching(/^note-\\d+$/),\n\t\tcontent: \"My first note\",\n\t\tupdatedAt: expect.any(Number),\n\t});\n\n\t// Verify note was added\n\tconst notesAfterAdd = await notes.getNotes();\n\texpect(notesAfterAdd).toHaveLength(1);\n\texpect(notesAfterAdd[0]).toEqual(newNote);\n});\n\ntest(\"Database notes can update existing notes\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst notes = client.notes.getOrCreate([\"test-update\"]);\n\n\t// Create a note\n\tconst originalNote = await notes.updateNote({ content: \"Original content\" });\n\tconst originalTime = originalNote.updatedAt;\n\n\t// Update the note\n\tconst updatedNote = await notes.updateNote({\n\t\tid: originalNote.id,\n\t\tcontent: \"Updated content\",\n\t});\n\n\texpect(updatedNote).toMatchObject({\n\t\tid: originalNote.id,\n\t\tcontent: \"Updated content\",\n\t\tupdatedAt: expect.any(Number),\n\t});\n\texpect(updatedNote.updatedAt).toBeGreaterThanOrEqual(originalTime);\n\n\t// Verify only one note exists\n\tconst allNotes = await notes.getNotes();\n\texpect(allNotes).toHaveLength(1);\n\texpect(allNotes[0]).toEqual(updatedNote);\n});\n\ntest(\"Database notes can delete notes\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst notes = client.notes.getOrCreate([\"test-delete\"]);\n\n\t// Create multiple notes\n\tconst note1 = await notes.updateNote({ content: \"Note 1\" });\n\tconst note2 = await notes.updateNote({ content: \"Note 2\" });\n\tconst note3 = await notes.updateNote({ content: \"Note 3\" });\n\n\t// Verify all notes exist\n\tlet allNotes = await notes.getNotes();\n\texpect(allNotes).toHaveLength(3);\n\n\t// Delete middle note\n\tconst deleteResult = await notes.deleteNote({ id: note2.id });\n\texpect(deleteResult).toBe(true);\n\n\t// Verify note was deleted\n\tallNotes = await notes.getNotes();\n\texpect(allNotes).toHaveLength(2);\n\texpect(allNotes.map((n) => n.id)).toEqual([note1.id, note3.id]);\n\n\t// Try to delete non-existent note\n\tconst deleteNonExistent = await notes.deleteNote({ id: \"non-existent\" });\n\texpect(deleteNonExistent).toBe(false);\n});\n\ntest(\"Database notes maintains proper timestamps\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst notes = client.notes.getOrCreate([\"test-timestamps\"]);\n\n\tconst note1 = await notes.updateNote({ content: \"First note\" });\n\tconst note2 = await notes.updateNote({ content: \"Second note\" });\n\tconst note3 = await notes.updateNote({ content: \"Third note\" });\n\n\texpect(note2.updatedAt).toBeGreaterThanOrEqual(note1.updatedAt);\n\texpect(note3.updatedAt).toBeGreaterThanOrEqual(note2.updatedAt);\n\n\tconst allNotes = await notes.getNotes();\n\tfor (let i = 1; i < allNotes.length; i++) {\n\t\texpect(allNotes[i].updatedAt).toBeGreaterThanOrEqual(\n\t\t\tallNotes[i - 1].updatedAt,\n\t\t);\n\t}\n});\n\ntest(\"Database notes handles empty content\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst notes = client.notes.getOrCreate([\"test-empty\"]);\n\n\t// Create note with empty content\n\tconst emptyNote = await notes.updateNote({ content: \"\" });\n\texpect(emptyNote.content).toBe(\"\");\n\texpect(emptyNote.id).toBeTruthy();\n\texpect(emptyNote.updatedAt).toBeGreaterThan(0);\n\n\t// Verify it was stored\n\tconst allNotes = await notes.getNotes();\n\texpect(allNotes).toHaveLength(1);\n\texpect(allNotes[0]).toEqual(emptyNote);\n});\n", - "README.md": "# Database Notes for RivetKit\n\nExample project demonstrating persistent data storage and real-time updates with [RivetKit](https://rivetkit.org).\n\n[Learn More →](https://github.com/rivet-gg/rivetkit)\n\n[Discord](https://rivet.gg/discord) — [Documentation](https://rivetkit.org) — [Issues](https://github.com/rivet-gg/rivetkit/issues)\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 18+\n\n### Installation\n\n```sh\ngit clone https://github.com/rivet-gg/rivetkit\ncd rivetkit/examples/database\nnpm install\n```\n\n### Development\n\n```sh\nnpm run dev\n```\n\nOpen your browser to `http://localhost:3000`\n\n## Features\n\n- **Persistent Storage**: Notes are automatically saved and persist across sessions\n- **Real-time Updates**: Changes are instantly synchronized across all connected clients\n- **User Authentication**: Demonstrates basic authentication with token validation\n- **Multi-user Support**: Switch between different users to see isolated data\n- **CRUD Operations**: Create, read, update, and delete notes\n- **Edit in Place**: Click edit to modify notes inline\n- **Auto-sorting**: Notes are automatically sorted by last modified date\n\n## How it works\n\nThis example demonstrates:\n\n1. **Actor State Management**: Using RivetKit actors to manage persistent application state\n2. **Authentication**: Basic token-based authentication for user identification\n3. **Real-time Events**: Broadcasting changes to all connected clients using actor events\n4. **State Persistence**: Actor state is automatically persisted between sessions\n5. **Connection State**: Handle connection status and graceful degradation\n\n## Architecture\n\n- **Backend**: RivetKit actor that manages note storage and user authentication\n- **Frontend**: React application with real-time updates via RivetKit hooks\n- **State Management**: Each user gets their own actor instance for data isolation\n- **Authentication**: Mock token-based auth (replace with real auth in production)\n\n## Usage\n\n1. Start the development server\n2. Select a user from the dropdown to see their notes\n3. Add new notes using the input field\n4. Edit notes by clicking the \"Edit\" button\n5. Delete notes with the \"Delete\" button\n6. Open multiple tabs or users to see real-time synchronization\n\n## Extending\n\nThis example can be extended with:\n\n- Real database integration (PostgreSQL, MongoDB, etc.)\n- Proper JWT authentication\n- User registration and management\n- Note sharing and collaboration\n- Rich text editing\n- File attachments\n- Search and filtering\n\n## License\n\nApache 2.0", + "README.md": "# Database Notes for RivetKit\n\nExample project demonstrating persistent data storage and real-time updates with [RivetKit](https://rivetkit.org).\n\n[Learn More →](https://github.com/rivet-dev/rivetkit)\n\n[Discord](https://rivet.dev/discord) — [Documentation](https://rivetkit.org) — [Issues](https://github.com/rivet-dev/rivetkit/issues)\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 18+\n\n### Installation\n\n```sh\ngit clone https://github.com/rivet-dev/rivetkit\ncd rivetkit/examples/database\nnpm install\n```\n\n### Development\n\n```sh\nnpm run dev\n```\n\nOpen your browser to `http://localhost:3000`\n\n## Features\n\n- **Persistent Storage**: Notes are automatically saved and persist across sessions\n- **Real-time Updates**: Changes are instantly synchronized across all connected clients\n- **User Authentication**: Demonstrates basic authentication with token validation\n- **Multi-user Support**: Switch between different users to see isolated data\n- **CRUD Operations**: Create, read, update, and delete notes\n- **Edit in Place**: Click edit to modify notes inline\n- **Auto-sorting**: Notes are automatically sorted by last modified date\n\n## How it works\n\nThis example demonstrates:\n\n1. **Actor State Management**: Using RivetKit actors to manage persistent application state\n2. **Authentication**: Basic token-based authentication for user identification\n3. **Real-time Events**: Broadcasting changes to all connected clients using actor events\n4. **State Persistence**: Actor state is automatically persisted between sessions\n5. **Connection State**: Handle connection status and graceful degradation\n\n## Architecture\n\n- **Backend**: RivetKit actor that manages note storage and user authentication\n- **Frontend**: React application with real-time updates via RivetKit hooks\n- **State Management**: Each user gets their own actor instance for data isolation\n- **Authentication**: Mock token-based auth (replace with real auth in production)\n\n## Usage\n\n1. Start the development server\n2. Select a user from the dropdown to see their notes\n3. Add new notes using the input field\n4. Edit notes by clicking the \"Edit\" button\n5. Delete notes with the \"Delete\" button\n6. Open multiple tabs or users to see real-time synchronization\n\n## Extending\n\nThis example can be extended with:\n\n- Real database integration (PostgreSQL, MongoDB, etc.)\n- Proper JWT authentication\n- User registration and management\n- Note sharing and collaboration\n- Rich text editing\n- File attachments\n- Search and filtering\n\n## License\n\nApache 2.0", "package-lock.json": "{\n \"name\": \"example-database\",\n \"version\": \"0.9.1\",\n \"lockfileVersion\": 3,\n \"requires\": true,\n \"packages\": {\n \"\": {\n \"name\": \"example-database\",\n \"version\": \"0.9.1\",\n \"dependencies\": {\n \"@rivetkit/react\": \"^0.9.1\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\"\n },\n \"devDependencies\": {\n \"rivetkit\": \"^0.9.1\",\n \"@types/node\": \"^22.13.9\",\n \"@types/react\": \"^18.2.0\",\n \"@types/react-dom\": \"^18.2.0\",\n \"@vitejs/plugin-react\": \"^4.2.0\",\n \"concurrently\": \"^8.2.2\",\n \"tsx\": \"^3.12.7\",\n \"typescript\": \"^5.5.2\",\n \"vite\": \"^5.0.0\",\n \"vitest\": \"^3.1.1\"\n }\n },\n \"node_modules/@ampproject/remapping\": {\n \"version\": \"2.3.0\",\n \"resolved\": \"https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz\",\n \"integrity\": \"sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@jridgewell/gen-mapping\": \"^0.3.5\",\n \"@jridgewell/trace-mapping\": \"^0.3.24\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@babel/code-frame\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz\",\n \"integrity\": \"sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-validator-identifier\": \"^7.27.1\",\n \"js-tokens\": \"^4.0.0\",\n \"picocolors\": \"^1.1.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/compat-data\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz\",\n \"integrity\": \"sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/core\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz\",\n \"integrity\": \"sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@ampproject/remapping\": \"^2.2.0\",\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/generator\": \"^7.28.0\",\n \"@babel/helper-compilation-targets\": \"^7.27.2\",\n \"@babel/helper-module-transforms\": \"^7.27.3\",\n \"@babel/helpers\": \"^7.27.6\",\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/template\": \"^7.27.2\",\n \"@babel/traverse\": \"^7.28.0\",\n \"@babel/types\": \"^7.28.0\",\n \"convert-source-map\": \"^2.0.0\",\n \"debug\": \"^4.1.0\",\n \"gensync\": \"^1.0.0-beta.2\",\n \"json5\": \"^2.2.3\",\n \"semver\": \"^6.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"funding\": {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/babel\"\n }\n },\n \"node_modules/@babel/generator\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz\",\n \"integrity\": \"sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/types\": \"^7.28.0\",\n \"@jridgewell/gen-mapping\": \"^0.3.12\",\n \"@jridgewell/trace-mapping\": \"^0.3.28\",\n \"jsesc\": \"^3.0.2\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-compilation-targets\": {\n \"version\": \"7.27.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz\",\n \"integrity\": \"sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/compat-data\": \"^7.27.2\",\n \"@babel/helper-validator-option\": \"^7.27.1\",\n \"browserslist\": \"^4.24.0\",\n \"lru-cache\": \"^5.1.1\",\n \"semver\": \"^6.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-globals\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz\",\n \"integrity\": \"sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-module-imports\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz\",\n \"integrity\": \"sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/traverse\": \"^7.27.1\",\n \"@babel/types\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-module-transforms\": {\n \"version\": \"7.27.3\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz\",\n \"integrity\": \"sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-module-imports\": \"^7.27.1\",\n \"@babel/helper-validator-identifier\": \"^7.27.1\",\n \"@babel/traverse\": \"^7.27.3\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0\"\n }\n },\n \"node_modules/@babel/helper-plugin-utils\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz\",\n \"integrity\": \"sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-string-parser\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz\",\n \"integrity\": \"sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-validator-identifier\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz\",\n \"integrity\": \"sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-validator-option\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz\",\n \"integrity\": \"sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helpers\": {\n \"version\": \"7.27.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz\",\n \"integrity\": \"sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/template\": \"^7.27.2\",\n \"@babel/types\": \"^7.27.6\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/parser\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz\",\n \"integrity\": \"sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.28.0\"\n },\n \"bin\": {\n \"parser\": \"bin/babel-parser.js\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@babel/plugin-transform-react-jsx-self\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz\",\n \"integrity\": \"sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-plugin-utils\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/plugin-transform-react-jsx-source\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz\",\n \"integrity\": \"sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-plugin-utils\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/runtime\": {\n \"version\": \"7.27.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz\",\n \"integrity\": \"sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/template\": {\n \"version\": \"7.27.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz\",\n \"integrity\": \"sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/parser\": \"^7.27.2\",\n \"@babel/types\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/traverse\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz\",\n \"integrity\": \"sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/generator\": \"^7.28.0\",\n \"@babel/helper-globals\": \"^7.28.0\",\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/template\": \"^7.27.2\",\n \"@babel/types\": \"^7.28.0\",\n \"debug\": \"^4.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/types\": {\n \"version\": \"7.28.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/types/-/types-7.28.1.tgz\",\n \"integrity\": \"sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-string-parser\": \"^7.27.1\",\n \"@babel/helper-validator-identifier\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@cbor-extract/cbor-extract-darwin-arm64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.0.tgz\",\n \"integrity\": \"sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-darwin-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-arm\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.2.0.tgz\",\n \"integrity\": \"sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==\",\n \"cpu\": [\n \"arm\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-arm64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.2.0.tgz\",\n \"integrity\": \"sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-win32-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"peer\": true\n },\n \"node_modules/@esbuild/aix-ppc64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz\",\n \"integrity\": \"sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"aix\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/android-arm\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz\",\n \"integrity\": \"sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/android-arm64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz\",\n \"integrity\": \"sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/android-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/darwin-arm64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz\",\n \"integrity\": \"sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/darwin-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/freebsd-arm64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz\",\n \"integrity\": \"sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/freebsd-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-arm\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz\",\n \"integrity\": \"sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-arm64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz\",\n \"integrity\": \"sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-ia32\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz\",\n \"integrity\": \"sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-loong64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz\",\n \"integrity\": \"sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-mips64el\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz\",\n \"integrity\": \"sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==\",\n \"cpu\": [\n \"mips64el\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-ppc64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz\",\n \"integrity\": \"sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-riscv64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz\",\n \"integrity\": \"sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-s390x\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz\",\n \"integrity\": \"sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/netbsd-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"netbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/openbsd-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"openbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/sunos-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"sunos\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/win32-arm64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz\",\n \"integrity\": \"sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/win32-ia32\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz\",\n \"integrity\": \"sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/win32-x64\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz\",\n \"integrity\": \"sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@jridgewell/gen-mapping\": {\n \"version\": \"0.3.12\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz\",\n \"integrity\": \"sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/sourcemap-codec\": \"^1.5.0\",\n \"@jridgewell/trace-mapping\": \"^0.3.24\"\n }\n },\n \"node_modules/@jridgewell/resolve-uri\": {\n \"version\": \"3.1.2\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz\",\n \"integrity\": \"sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@jridgewell/sourcemap-codec\": {\n \"version\": \"1.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz\",\n \"integrity\": \"sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@jridgewell/trace-mapping\": {\n \"version\": \"0.3.29\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz\",\n \"integrity\": \"sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/resolve-uri\": \"^3.1.0\",\n \"@jridgewell/sourcemap-codec\": \"^1.4.14\"\n }\n },\n \"node_modules/rivetkit\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/rivetkit/-/actor-0.9.1.tgz\",\n \"integrity\": \"sha512-aVoWO81JrYql6hhXX+vRor0B+aeWrnh+9zkcrxbh0EXFBbS5XM8YE4sSFxNKmZThLbGNqfZ5enm1zuA92c7I1w==\",\n \"dev\": true,\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\"\n }\n },\n \"node_modules/@rivetkit/core\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/core/-/core-0.9.1.tgz\",\n \"integrity\": \"sha512-0zYFKo08CQ72Rm6MaVKxcJSEEfn/ypGkkxTX06Q4meCGHuDJFbPA5wopa3NdxrKBPttcGg1QAmDd+1FZnlpubA==\",\n \"license\": \"Apache-2.0\",\n \"peer\": true,\n \"dependencies\": {\n \"cbor-x\": \"^1.6.0\",\n \"invariant\": \"^2.2.4\",\n \"on-change\": \"^5.0.1\",\n \"p-retry\": \"^6.2.1\",\n \"zod\": \"^3.25.67\"\n },\n \"engines\": {\n \"node\": \">=22.0.0\"\n },\n \"peerDependencies\": {\n \"@hono/node-server\": \"^1.14.0\",\n \"@hono/node-ws\": \"^1.1.1\",\n \"@hono/zod-openapi\": \"^0.19.6\",\n \"eventsource\": \"^3.0.5\",\n \"hono\": \"^4.7.0\",\n \"ws\": \"^8.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@hono/node-server\": {\n \"optional\": true\n },\n \"@hono/node-ws\": {\n \"optional\": true\n },\n \"@hono/zod-openapi\": {\n \"optional\": true\n },\n \"eventsource\": {\n \"optional\": true\n },\n \"hono\": {\n \"optional\": true\n },\n \"ws\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/@rivetkit/framework-base\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/framework-base/-/framework-base-0.9.1.tgz\",\n \"integrity\": \"sha512-FxhSqGAtDsD4k7gKS2EhJ5hHsEwI1+QR0vYThUBOLcmXM7zjMZndqIjVperQO4ck/zfjRqjm3lw7znkc+k0wNQ==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@tanstack/store\": \"^0.7.1\"\n },\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\"\n }\n },\n \"node_modules/@rivetkit/react\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/react/-/react-0.9.1.tgz\",\n \"integrity\": \"sha512-0e0gNNj3qCrXHNIxE6ggEEX+E6HjdsSt9pJbWbaQQg+1bsywupRTSdgSDguDHjBvi9qhR9mh7UbNN3A9wYqXuA==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@rivetkit/framework-base\": \"0.9.1\",\n \"@tanstack/react-store\": \"^0.7.1\"\n },\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\",\n \"react\": \"^18 || ^19\",\n \"react-dom\": \"^18 || ^19\"\n }\n },\n \"node_modules/@rolldown/pluginutils\": {\n \"version\": \"1.0.0-beta.19\",\n \"resolved\": \"https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz\",\n \"integrity\": \"sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@rollup/rollup-android-arm-eabi\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.0.tgz\",\n \"integrity\": \"sha512-2o/FgACbji4tW1dzXOqAV15Eu7DdgbKsF2QKcxfG4xbh5iwU7yr5RRP5/U+0asQliSYv5M4o7BevlGIoSL0LXg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ]\n },\n \"node_modules/@rollup/rollup-android-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-PSZ0SvMOjEAxwZeTx32eI/j5xSYtDCRxGu5k9zvzoY77xUNssZM+WV6HYBLROpY5CkXsbQjvz40fBb7WPwDqtQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ]\n },\n \"node_modules/@rollup/rollup-darwin-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-BA4yPIPssPB2aRAWzmqzQ3y2/KotkLyZukVB7j3psK/U3nVJdceo6qr9pLM2xN6iRP/wKfxEbOb1yrlZH6sYZg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ]\n },\n \"node_modules/@rollup/rollup-darwin-x64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.0.tgz\",\n \"integrity\": \"sha512-Pr2o0lvTwsiG4HCr43Zy9xXrHspyMvsvEw4FwKYqhli4FuLE5FjcZzuQ4cfPe0iUFCvSQG6lACI0xj74FDZKRA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ]\n },\n \"node_modules/@rollup/rollup-freebsd-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-lYE8LkE5h4a/+6VnnLiL14zWMPnx6wNbDG23GcYFpRW1V9hYWHAw9lBZ6ZUIrOaoK7NliF1sdwYGiVmziUF4vA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ]\n },\n \"node_modules/@rollup/rollup-freebsd-x64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.0.tgz\",\n \"integrity\": \"sha512-PVQWZK9sbzpvqC9Q0GlehNNSVHR+4m7+wET+7FgSnKG3ci5nAMgGmr9mGBXzAuE5SvguCKJ6mHL6vq1JaJ/gvw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm-gnueabihf\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.0.tgz\",\n \"integrity\": \"sha512-hLrmRl53prCcD+YXTfNvXd776HTxNh8wPAMllusQ+amcQmtgo3V5i/nkhPN6FakW+QVLoUUr2AsbtIRPFU3xIA==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm-musleabihf\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.0.tgz\",\n \"integrity\": \"sha512-XBKGSYcrkdiRRjl+8XvrUR3AosXU0NvF7VuqMsm7s5nRy+nt58ZMB19Jdp1RdqewLcaYnpk8zeVs/4MlLZEJxw==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-fRvZZPUiBz7NztBE/2QnCS5AtqLVhXmUOPj9IHlfGEXkapgImf4W9+FSkL8cWqoAjozyUzqFmSc4zh2ooaeF6g==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-Btv2WRZOcUGi8XU80XwIvzTg4U6+l6D0V6sZTrZx214nrwxw5nAi8hysaXj/mctyClWgesyuxbeLylCBNauimg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-loongarch64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-Li0emNnwtUZdLwHjQPBxn4VWztcrw/h7mgLyHiEI5Z0MhpeFGlzaiBHpSNVOMB/xucjXTTcO+dhv469Djr16KA==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-powerpc64le-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-sB8+pfkYx2kvpDCfd63d5ScYT0Fz1LO6jIb2zLZvmK9ob2D8DeVqrmBDE0iDK8KlBVmsTNzrjr3G1xV4eUZhSw==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-riscv64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-5GQ6PFhh7E6jQm70p1aW05G2cap5zMOvO0se5JMecHeAdj5ZhWEHbJ4hiKpfi1nnnEdTauDXxPgXae/mqjow9w==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-riscv64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-N/euLsBd1rekWcuduakTo/dJw6U6sBP3eUq+RXM9RNfPuWTvG2w/WObDkIvJ2KChy6oxZmOSC08Ak2OJA0UiAA==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-s390x-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-2l9sA7d7QdikL0xQwNMO3xURBUNEWyHVHfAsHsUdq+E/pgLTUcCE+gih5PCdmyHmfTDeXUWVhqL0WZzg0nua3g==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-x64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-XZdD3fEEQcwG2KrJDdEQu7NrHonPxxaV0/w2HpvINBdcqebz1aL+0vM2WFJq4DeiAVT6F5SUQas65HY5JDqoPw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-x64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-7ayfgvtmmWgKWBkCGg5+xTQ0r5V1owVm67zTrsEY1008L5ro7mCyGYORomARt/OquB9KY7LpxVBZes+oSniAAQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-arm64-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-B+IJgcBnE2bm93jEW5kHisqvPITs4ddLOROAcOc/diBgrEiQJJ6Qcjby75rFSmH5eMGrqJryUgJDhrfj942apQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-ia32-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-+CXwwG66g0/FpWOnP/v1HnrGVSOygK/osUbu3wPRy8ECXjoYKjRAyfxYpDQOfghC5qPJYLPH0oN4MCOjwgdMug==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-x64-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-SRf1cytG7wqcHVLrBc9VtPK4pU5wxiB/lNIkNmW2ApKXIg+RpqwHfsaEK+e7eH4A1BpI6BX/aBWXxZCIrJg3uA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@tanstack/react-store\": {\n \"version\": \"0.7.3\",\n \"resolved\": \"https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.7.3.tgz\",\n \"integrity\": \"sha512-3Dnqtbw9P2P0gw8uUM8WP2fFfg8XMDSZCTsywRPZe/XqqYW8PGkXKZTvP0AHkE4mpqP9Y43GpOg9vwO44azu6Q==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@tanstack/store\": \"0.7.2\",\n \"use-sync-external-store\": \"^1.5.0\"\n },\n \"funding\": {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/tannerlinsley\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\",\n \"react-dom\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\"\n }\n },\n \"node_modules/@tanstack/store\": {\n \"version\": \"0.7.2\",\n \"resolved\": \"https://registry.npmjs.org/@tanstack/store/-/store-0.7.2.tgz\",\n \"integrity\": \"sha512-RP80Z30BYiPX2Pyo0Nyw4s1SJFH2jyM6f9i3HfX4pA+gm5jsnYryscdq2aIQLnL4TaGuQMO+zXmN9nh1Qck+Pg==\",\n \"license\": \"MIT\",\n \"funding\": {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/tannerlinsley\"\n }\n },\n \"node_modules/@types/babel__core\": {\n \"version\": \"7.20.5\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz\",\n \"integrity\": \"sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.20.7\",\n \"@babel/types\": \"^7.20.7\",\n \"@types/babel__generator\": \"*\",\n \"@types/babel__template\": \"*\",\n \"@types/babel__traverse\": \"*\"\n }\n },\n \"node_modules/@types/babel__generator\": {\n \"version\": \"7.27.0\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz\",\n \"integrity\": \"sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.0.0\"\n }\n },\n \"node_modules/@types/babel__template\": {\n \"version\": \"7.4.4\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz\",\n \"integrity\": \"sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.1.0\",\n \"@babel/types\": \"^7.0.0\"\n }\n },\n \"node_modules/@types/babel__traverse\": {\n \"version\": \"7.20.7\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz\",\n \"integrity\": \"sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.20.7\"\n }\n },\n \"node_modules/@types/chai\": {\n \"version\": \"5.2.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz\",\n \"integrity\": \"sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/deep-eql\": \"*\"\n }\n },\n \"node_modules/@types/deep-eql\": {\n \"version\": \"4.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz\",\n \"integrity\": \"sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@types/estree\": {\n \"version\": \"1.0.8\",\n \"resolved\": \"https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz\",\n \"integrity\": \"sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@types/node\": {\n \"version\": \"22.16.3\",\n \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-22.16.3.tgz\",\n \"integrity\": \"sha512-sr4Xz74KOUeYadexo1r8imhRtlVXcs+j3XK3TcoiYk7B1t3YRVJgtaD3cwX73NYb71pmVuMLNRhJ9XKdoDB74g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"undici-types\": \"~6.21.0\"\n }\n },\n \"node_modules/@types/prop-types\": {\n \"version\": \"15.7.15\",\n \"resolved\": \"https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz\",\n \"integrity\": \"sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@types/react\": {\n \"version\": \"18.3.23\",\n \"resolved\": \"https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz\",\n \"integrity\": \"sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/prop-types\": \"*\",\n \"csstype\": \"^3.0.2\"\n }\n },\n \"node_modules/@types/react-dom\": {\n \"version\": \"18.3.7\",\n \"resolved\": \"https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz\",\n \"integrity\": \"sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"peerDependencies\": {\n \"@types/react\": \"^18.0.0\"\n }\n },\n \"node_modules/@types/retry\": {\n \"version\": \"0.12.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz\",\n \"integrity\": \"sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==\",\n \"license\": \"MIT\",\n \"peer\": true\n },\n \"node_modules/@vitejs/plugin-react\": {\n \"version\": \"4.6.0\",\n \"resolved\": \"https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.6.0.tgz\",\n \"integrity\": \"sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/core\": \"^7.27.4\",\n \"@babel/plugin-transform-react-jsx-self\": \"^7.27.1\",\n \"@babel/plugin-transform-react-jsx-source\": \"^7.27.1\",\n \"@rolldown/pluginutils\": \"1.0.0-beta.19\",\n \"@types/babel__core\": \"^7.20.5\",\n \"react-refresh\": \"^0.17.0\"\n },\n \"engines\": {\n \"node\": \"^14.18.0 || >=16.0.0\"\n },\n \"peerDependencies\": {\n \"vite\": \"^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0\"\n }\n },\n \"node_modules/@vitest/expect\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz\",\n \"integrity\": \"sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/chai\": \"^5.2.2\",\n \"@vitest/spy\": \"3.2.4\",\n \"@vitest/utils\": \"3.2.4\",\n \"chai\": \"^5.2.0\",\n \"tinyrainbow\": \"^2.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/mocker\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz\",\n \"integrity\": \"sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/spy\": \"3.2.4\",\n \"estree-walker\": \"^3.0.3\",\n \"magic-string\": \"^0.30.17\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n },\n \"peerDependencies\": {\n \"msw\": \"^2.4.9\",\n \"vite\": \"^5.0.0 || ^6.0.0 || ^7.0.0-0\"\n },\n \"peerDependenciesMeta\": {\n \"msw\": {\n \"optional\": true\n },\n \"vite\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/@vitest/pretty-format\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz\",\n \"integrity\": \"sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"tinyrainbow\": \"^2.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/runner\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz\",\n \"integrity\": \"sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/utils\": \"3.2.4\",\n \"pathe\": \"^2.0.3\",\n \"strip-literal\": \"^3.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/snapshot\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz\",\n \"integrity\": \"sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/pretty-format\": \"3.2.4\",\n \"magic-string\": \"^0.30.17\",\n \"pathe\": \"^2.0.3\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/spy\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz\",\n \"integrity\": \"sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"tinyspy\": \"^4.0.3\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/utils\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz\",\n \"integrity\": \"sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/pretty-format\": \"3.2.4\",\n \"loupe\": \"^3.1.4\",\n \"tinyrainbow\": \"^2.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/ansi-regex\": {\n \"version\": \"5.0.1\",\n \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/ansi-styles\": {\n \"version\": \"4.3.0\",\n \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\n \"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"color-convert\": \"^2.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n }\n },\n \"node_modules/assertion-error\": {\n \"version\": \"2.0.1\",\n \"resolved\": \"https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz\",\n \"integrity\": \"sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/browserslist\": {\n \"version\": \"4.25.1\",\n \"resolved\": \"https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz\",\n \"integrity\": \"sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"caniuse-lite\": \"^1.0.30001726\",\n \"electron-to-chromium\": \"^1.5.173\",\n \"node-releases\": \"^2.0.19\",\n \"update-browserslist-db\": \"^1.1.3\"\n },\n \"bin\": {\n \"browserslist\": \"cli.js\"\n },\n \"engines\": {\n \"node\": \"^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7\"\n }\n },\n \"node_modules/buffer-from\": {\n \"version\": \"1.1.2\",\n \"resolved\": \"https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz\",\n \"integrity\": \"sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/cac\": {\n \"version\": \"6.7.14\",\n \"resolved\": \"https://registry.npmjs.org/cac/-/cac-6.7.14.tgz\",\n \"integrity\": \"sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/caniuse-lite\": {\n \"version\": \"1.0.30001727\",\n \"resolved\": \"https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz\",\n \"integrity\": \"sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/caniuse-lite\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"CC-BY-4.0\"\n },\n \"node_modules/cbor-extract\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/cbor-extract/-/cbor-extract-2.2.0.tgz\",\n \"integrity\": \"sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==\",\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"peer\": true,\n \"dependencies\": {\n \"node-gyp-build-optional-packages\": \"5.1.1\"\n },\n \"bin\": {\n \"download-cbor-prebuilds\": \"bin/download-prebuilds.js\"\n },\n \"optionalDependencies\": {\n \"@cbor-extract/cbor-extract-darwin-arm64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-darwin-x64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-arm\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-arm64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-x64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-win32-x64\": \"2.2.0\"\n }\n },\n \"node_modules/cbor-x\": {\n \"version\": \"1.6.0\",\n \"resolved\": \"https://registry.npmjs.org/cbor-x/-/cbor-x-1.6.0.tgz\",\n \"integrity\": \"sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"optionalDependencies\": {\n \"cbor-extract\": \"^2.2.0\"\n }\n },\n \"node_modules/chai\": {\n \"version\": \"5.2.1\",\n \"resolved\": \"https://registry.npmjs.org/chai/-/chai-5.2.1.tgz\",\n \"integrity\": \"sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"assertion-error\": \"^2.0.1\",\n \"check-error\": \"^2.1.1\",\n \"deep-eql\": \"^5.0.1\",\n \"loupe\": \"^3.1.0\",\n \"pathval\": \"^2.0.0\"\n },\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/chalk\": {\n \"version\": \"4.1.2\",\n \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz\",\n \"integrity\": \"sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-styles\": \"^4.1.0\",\n \"supports-color\": \"^7.1.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/chalk?sponsor=1\"\n }\n },\n \"node_modules/chalk/node_modules/supports-color\": {\n \"version\": \"7.2.0\",\n \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz\",\n \"integrity\": \"sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"has-flag\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/check-error\": {\n \"version\": \"2.1.1\",\n \"resolved\": \"https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz\",\n \"integrity\": \"sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">= 16\"\n }\n },\n \"node_modules/cliui\": {\n \"version\": \"8.0.1\",\n \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz\",\n \"integrity\": \"sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"dependencies\": {\n \"string-width\": \"^4.2.0\",\n \"strip-ansi\": \"^6.0.1\",\n \"wrap-ansi\": \"^7.0.0\"\n },\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/color-convert\": {\n \"version\": \"2.0.1\",\n \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\n \"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"color-name\": \"~1.1.4\"\n },\n \"engines\": {\n \"node\": \">=7.0.0\"\n }\n },\n \"node_modules/color-name\": {\n \"version\": \"1.1.4\",\n \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\n \"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/concurrently\": {\n \"version\": \"8.2.2\",\n \"resolved\": \"https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz\",\n \"integrity\": \"sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"chalk\": \"^4.1.2\",\n \"date-fns\": \"^2.30.0\",\n \"lodash\": \"^4.17.21\",\n \"rxjs\": \"^7.8.1\",\n \"shell-quote\": \"^1.8.1\",\n \"spawn-command\": \"0.0.2\",\n \"supports-color\": \"^8.1.1\",\n \"tree-kill\": \"^1.2.2\",\n \"yargs\": \"^17.7.2\"\n },\n \"bin\": {\n \"conc\": \"dist/bin/concurrently.js\",\n \"concurrently\": \"dist/bin/concurrently.js\"\n },\n \"engines\": {\n \"node\": \"^14.13.0 || >=16.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/open-cli-tools/concurrently?sponsor=1\"\n }\n },\n \"node_modules/convert-source-map\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz\",\n \"integrity\": \"sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/csstype\": {\n \"version\": \"3.1.3\",\n \"resolved\": \"https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz\",\n \"integrity\": \"sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/date-fns\": {\n \"version\": \"2.30.0\",\n \"resolved\": \"https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz\",\n \"integrity\": \"sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.21.0\"\n },\n \"engines\": {\n \"node\": \">=0.11\"\n },\n \"funding\": {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/date-fns\"\n }\n },\n \"node_modules/debug\": {\n \"version\": \"4.4.1\",\n \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.4.1.tgz\",\n \"integrity\": \"sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ms\": \"^2.1.3\"\n },\n \"engines\": {\n \"node\": \">=6.0\"\n },\n \"peerDependenciesMeta\": {\n \"supports-color\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/deep-eql\": {\n \"version\": \"5.0.2\",\n \"resolved\": \"https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz\",\n \"integrity\": \"sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/detect-libc\": {\n \"version\": \"2.0.4\",\n \"resolved\": \"https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz\",\n \"integrity\": \"sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==\",\n \"license\": \"Apache-2.0\",\n \"optional\": true,\n \"peer\": true,\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/electron-to-chromium\": {\n \"version\": \"1.5.183\",\n \"resolved\": \"https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.183.tgz\",\n \"integrity\": \"sha512-vCrDBYjQCAEefWGjlK3EpoSKfKbT10pR4XXPdn65q7snuNOZnthoVpBfZPykmDapOKfoD+MMIPG8ZjKyyc9oHA==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/emoji-regex\": {\n \"version\": \"8.0.0\",\n \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/es-module-lexer\": {\n \"version\": \"1.7.0\",\n \"resolved\": \"https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz\",\n \"integrity\": \"sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/esbuild\": {\n \"version\": \"0.18.20\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz\",\n \"integrity\": \"sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"esbuild\": \"bin/esbuild\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"optionalDependencies\": {\n \"@esbuild/android-arm\": \"0.18.20\",\n \"@esbuild/android-arm64\": \"0.18.20\",\n \"@esbuild/android-x64\": \"0.18.20\",\n \"@esbuild/darwin-arm64\": \"0.18.20\",\n \"@esbuild/darwin-x64\": \"0.18.20\",\n \"@esbuild/freebsd-arm64\": \"0.18.20\",\n \"@esbuild/freebsd-x64\": \"0.18.20\",\n \"@esbuild/linux-arm\": \"0.18.20\",\n \"@esbuild/linux-arm64\": \"0.18.20\",\n \"@esbuild/linux-ia32\": \"0.18.20\",\n \"@esbuild/linux-loong64\": \"0.18.20\",\n \"@esbuild/linux-mips64el\": \"0.18.20\",\n \"@esbuild/linux-ppc64\": \"0.18.20\",\n \"@esbuild/linux-riscv64\": \"0.18.20\",\n \"@esbuild/linux-s390x\": \"0.18.20\",\n \"@esbuild/linux-x64\": \"0.18.20\",\n \"@esbuild/netbsd-x64\": \"0.18.20\",\n \"@esbuild/openbsd-x64\": \"0.18.20\",\n \"@esbuild/sunos-x64\": \"0.18.20\",\n \"@esbuild/win32-arm64\": \"0.18.20\",\n \"@esbuild/win32-ia32\": \"0.18.20\",\n \"@esbuild/win32-x64\": \"0.18.20\"\n }\n },\n \"node_modules/escalade\": {\n \"version\": \"3.2.0\",\n \"resolved\": \"https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz\",\n \"integrity\": \"sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/estree-walker\": {\n \"version\": \"3.0.3\",\n \"resolved\": \"https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz\",\n \"integrity\": \"sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/estree\": \"^1.0.0\"\n }\n },\n \"node_modules/expect-type\": {\n \"version\": \"1.2.2\",\n \"resolved\": \"https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz\",\n \"integrity\": \"sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"engines\": {\n \"node\": \">=12.0.0\"\n }\n },\n \"node_modules/fdir\": {\n \"version\": \"6.4.6\",\n \"resolved\": \"https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz\",\n \"integrity\": \"sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"peerDependencies\": {\n \"picomatch\": \"^3 || ^4\"\n },\n \"peerDependenciesMeta\": {\n \"picomatch\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/fsevents\": {\n \"version\": \"2.3.3\",\n \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz\",\n \"integrity\": \"sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n }\n },\n \"node_modules/gensync\": {\n \"version\": \"1.0.0-beta.2\",\n \"resolved\": \"https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz\",\n \"integrity\": \"sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/get-caller-file\": {\n \"version\": \"2.0.5\",\n \"resolved\": \"https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz\",\n \"integrity\": \"sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \"6.* || 8.* || >= 10.*\"\n }\n },\n \"node_modules/get-tsconfig\": {\n \"version\": \"4.10.1\",\n \"resolved\": \"https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz\",\n \"integrity\": \"sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"resolve-pkg-maps\": \"^1.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/privatenumber/get-tsconfig?sponsor=1\"\n }\n },\n \"node_modules/has-flag\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz\",\n \"integrity\": \"sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/invariant\": {\n \"version\": \"2.2.4\",\n \"resolved\": \"https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz\",\n \"integrity\": \"sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"dependencies\": {\n \"loose-envify\": \"^1.0.0\"\n }\n },\n \"node_modules/is-fullwidth-code-point\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz\",\n \"integrity\": \"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/is-network-error\": {\n \"version\": \"1.1.0\",\n \"resolved\": \"https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz\",\n \"integrity\": \"sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">=16\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/js-tokens\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz\",\n \"integrity\": \"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==\",\n \"license\": \"MIT\"\n },\n \"node_modules/jsesc\": {\n \"version\": \"3.1.0\",\n \"resolved\": \"https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz\",\n \"integrity\": \"sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"jsesc\": \"bin/jsesc\"\n },\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/json5\": {\n \"version\": \"2.2.3\",\n \"resolved\": \"https://registry.npmjs.org/json5/-/json5-2.2.3.tgz\",\n \"integrity\": \"sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"json5\": \"lib/cli.js\"\n },\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/lodash\": {\n \"version\": \"4.17.21\",\n \"resolved\": \"https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz\",\n \"integrity\": \"sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/loose-envify\": {\n \"version\": \"1.4.0\",\n \"resolved\": \"https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz\",\n \"integrity\": \"sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"js-tokens\": \"^3.0.0 || ^4.0.0\"\n },\n \"bin\": {\n \"loose-envify\": \"cli.js\"\n }\n },\n \"node_modules/loupe\": {\n \"version\": \"3.1.4\",\n \"resolved\": \"https://registry.npmjs.org/loupe/-/loupe-3.1.4.tgz\",\n \"integrity\": \"sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/lru-cache\": {\n \"version\": \"5.1.1\",\n \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz\",\n \"integrity\": \"sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"dependencies\": {\n \"yallist\": \"^3.0.2\"\n }\n },\n \"node_modules/magic-string\": {\n \"version\": \"0.30.17\",\n \"resolved\": \"https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz\",\n \"integrity\": \"sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/sourcemap-codec\": \"^1.5.0\"\n }\n },\n \"node_modules/ms\": {\n \"version\": \"2.1.3\",\n \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz\",\n \"integrity\": \"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/nanoid\": {\n \"version\": \"3.3.11\",\n \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz\",\n \"integrity\": \"sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"bin\": {\n \"nanoid\": \"bin/nanoid.cjs\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || ^13.7 || ^14 || >=15.0.1\"\n }\n },\n \"node_modules/node-gyp-build-optional-packages\": {\n \"version\": \"5.1.1\",\n \"resolved\": \"https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz\",\n \"integrity\": \"sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==\",\n \"license\": \"MIT\",\n \"optional\": true,\n \"peer\": true,\n \"dependencies\": {\n \"detect-libc\": \"^2.0.1\"\n },\n \"bin\": {\n \"node-gyp-build-optional-packages\": \"bin.js\",\n \"node-gyp-build-optional-packages-optional\": \"optional.js\",\n \"node-gyp-build-optional-packages-test\": \"build-test.js\"\n }\n },\n \"node_modules/node-releases\": {\n \"version\": \"2.0.19\",\n \"resolved\": \"https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz\",\n \"integrity\": \"sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/on-change\": {\n \"version\": \"5.0.1\",\n \"resolved\": \"https://registry.npmjs.org/on-change/-/on-change-5.0.1.tgz\",\n \"integrity\": \"sha512-n7THCP7RkyReRSLkJb8kUWoNsxUIBxTkIp3JKno+sEz6o/9AJ3w3P9fzQkITEkMwyTKJjZciF3v/pVoouxZZMg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">=18\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sindresorhus/on-change?sponsor=1\"\n }\n },\n \"node_modules/p-retry\": {\n \"version\": \"6.2.1\",\n \"resolved\": \"https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz\",\n \"integrity\": \"sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"dependencies\": {\n \"@types/retry\": \"0.12.2\",\n \"is-network-error\": \"^1.0.0\",\n \"retry\": \"^0.13.1\"\n },\n \"engines\": {\n \"node\": \">=16.17\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/pathe\": {\n \"version\": \"2.0.3\",\n \"resolved\": \"https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz\",\n \"integrity\": \"sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/pathval\": {\n \"version\": \"2.0.1\",\n \"resolved\": \"https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz\",\n \"integrity\": \"sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">= 14.16\"\n }\n },\n \"node_modules/picocolors\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz\",\n \"integrity\": \"sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/picomatch\": {\n \"version\": \"4.0.2\",\n \"resolved\": \"https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz\",\n \"integrity\": \"sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=12\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/jonschlinkert\"\n }\n },\n \"node_modules/postcss\": {\n \"version\": \"8.5.6\",\n \"resolved\": \"https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz\",\n \"integrity\": \"sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/postcss/\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/postcss\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"nanoid\": \"^3.3.11\",\n \"picocolors\": \"^1.1.1\",\n \"source-map-js\": \"^1.2.1\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || >=14\"\n }\n },\n \"node_modules/react\": {\n \"version\": \"18.3.1\",\n \"resolved\": \"https://registry.npmjs.org/react/-/react-18.3.1.tgz\",\n \"integrity\": \"sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\"\n },\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/react-dom\": {\n \"version\": \"18.3.1\",\n \"resolved\": \"https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz\",\n \"integrity\": \"sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\",\n \"scheduler\": \"^0.23.2\"\n },\n \"peerDependencies\": {\n \"react\": \"^18.3.1\"\n }\n },\n \"node_modules/react-refresh\": {\n \"version\": \"0.17.0\",\n \"resolved\": \"https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz\",\n \"integrity\": \"sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/require-directory\": {\n \"version\": \"2.1.1\",\n \"resolved\": \"https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz\",\n \"integrity\": \"sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/resolve-pkg-maps\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz\",\n \"integrity\": \"sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"funding\": {\n \"url\": \"https://github.com/privatenumber/resolve-pkg-maps?sponsor=1\"\n }\n },\n \"node_modules/retry\": {\n \"version\": \"0.13.1\",\n \"resolved\": \"https://registry.npmjs.org/retry/-/retry-0.13.1.tgz\",\n \"integrity\": \"sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">= 4\"\n }\n },\n \"node_modules/rollup\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/rollup/-/rollup-4.45.0.tgz\",\n \"integrity\": \"sha512-WLjEcJRIo7i3WDDgOIJqVI2d+lAC3EwvOGy+Xfq6hs+GQuAA4Di/H72xmXkOhrIWFg2PFYSKZYfH0f4vfKXN4A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/estree\": \"1.0.8\"\n },\n \"bin\": {\n \"rollup\": \"dist/bin/rollup\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\",\n \"npm\": \">=8.0.0\"\n },\n \"optionalDependencies\": {\n \"@rollup/rollup-android-arm-eabi\": \"4.45.0\",\n \"@rollup/rollup-android-arm64\": \"4.45.0\",\n \"@rollup/rollup-darwin-arm64\": \"4.45.0\",\n \"@rollup/rollup-darwin-x64\": \"4.45.0\",\n \"@rollup/rollup-freebsd-arm64\": \"4.45.0\",\n \"@rollup/rollup-freebsd-x64\": \"4.45.0\",\n \"@rollup/rollup-linux-arm-gnueabihf\": \"4.45.0\",\n \"@rollup/rollup-linux-arm-musleabihf\": \"4.45.0\",\n \"@rollup/rollup-linux-arm64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-arm64-musl\": \"4.45.0\",\n \"@rollup/rollup-linux-loongarch64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-powerpc64le-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-riscv64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-riscv64-musl\": \"4.45.0\",\n \"@rollup/rollup-linux-s390x-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-x64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-x64-musl\": \"4.45.0\",\n \"@rollup/rollup-win32-arm64-msvc\": \"4.45.0\",\n \"@rollup/rollup-win32-ia32-msvc\": \"4.45.0\",\n \"@rollup/rollup-win32-x64-msvc\": \"4.45.0\",\n \"fsevents\": \"~2.3.2\"\n }\n },\n \"node_modules/rxjs\": {\n \"version\": \"7.8.2\",\n \"resolved\": \"https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz\",\n \"integrity\": \"sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"tslib\": \"^2.1.0\"\n }\n },\n \"node_modules/scheduler\": {\n \"version\": \"0.23.2\",\n \"resolved\": \"https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz\",\n \"integrity\": \"sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\"\n }\n },\n \"node_modules/semver\": {\n \"version\": \"6.3.1\",\n \"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n \"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"bin\": {\n \"semver\": \"bin/semver.js\"\n }\n },\n \"node_modules/shell-quote\": {\n \"version\": \"1.8.3\",\n \"resolved\": \"https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz\",\n \"integrity\": \"sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">= 0.4\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/ljharb\"\n }\n },\n \"node_modules/siginfo\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz\",\n \"integrity\": \"sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/source-map\": {\n \"version\": \"0.6.1\",\n \"resolved\": \"https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz\",\n \"integrity\": \"sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==\",\n \"dev\": true,\n \"license\": \"BSD-3-Clause\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/source-map-js\": {\n \"version\": \"1.2.1\",\n \"resolved\": \"https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz\",\n \"integrity\": \"sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==\",\n \"dev\": true,\n \"license\": \"BSD-3-Clause\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/source-map-support\": {\n \"version\": \"0.5.21\",\n \"resolved\": \"https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz\",\n \"integrity\": \"sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"buffer-from\": \"^1.0.0\",\n \"source-map\": \"^0.6.0\"\n }\n },\n \"node_modules/spawn-command\": {\n \"version\": \"0.0.2\",\n \"resolved\": \"https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz\",\n \"integrity\": \"sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==\",\n \"dev\": true\n },\n \"node_modules/stackback\": {\n \"version\": \"0.0.2\",\n \"resolved\": \"https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz\",\n \"integrity\": \"sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/std-env\": {\n \"version\": \"3.9.0\",\n \"resolved\": \"https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz\",\n \"integrity\": \"sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/string-width\": {\n \"version\": \"4.2.3\",\n \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"emoji-regex\": \"^8.0.0\",\n \"is-fullwidth-code-point\": \"^3.0.0\",\n \"strip-ansi\": \"^6.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/strip-ansi\": {\n \"version\": \"6.0.1\",\n \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-regex\": \"^5.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/strip-literal\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz\",\n \"integrity\": \"sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"js-tokens\": \"^9.0.1\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/antfu\"\n }\n },\n \"node_modules/strip-literal/node_modules/js-tokens\": {\n \"version\": \"9.0.1\",\n \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz\",\n \"integrity\": \"sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/supports-color\": {\n \"version\": \"8.1.1\",\n \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz\",\n \"integrity\": \"sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"has-flag\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/supports-color?sponsor=1\"\n }\n },\n \"node_modules/tinybench\": {\n \"version\": \"2.9.0\",\n \"resolved\": \"https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz\",\n \"integrity\": \"sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/tinyexec\": {\n \"version\": \"0.3.2\",\n \"resolved\": \"https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz\",\n \"integrity\": \"sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/tinyglobby\": {\n \"version\": \"0.2.14\",\n \"resolved\": \"https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz\",\n \"integrity\": \"sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"fdir\": \"^6.4.4\",\n \"picomatch\": \"^4.0.2\"\n },\n \"engines\": {\n \"node\": \">=12.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/SuperchupuDev\"\n }\n },\n \"node_modules/tinypool\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz\",\n \"integrity\": \"sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n }\n },\n \"node_modules/tinyrainbow\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz\",\n \"integrity\": \"sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=14.0.0\"\n }\n },\n \"node_modules/tinyspy\": {\n \"version\": \"4.0.3\",\n \"resolved\": \"https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz\",\n \"integrity\": \"sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=14.0.0\"\n }\n },\n \"node_modules/tree-kill\": {\n \"version\": \"1.2.2\",\n \"resolved\": \"https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz\",\n \"integrity\": \"sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"tree-kill\": \"cli.js\"\n }\n },\n \"node_modules/tslib\": {\n \"version\": \"2.8.1\",\n \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz\",\n \"integrity\": \"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==\",\n \"dev\": true,\n \"license\": \"0BSD\"\n },\n \"node_modules/tsx\": {\n \"version\": \"3.14.0\",\n \"resolved\": \"https://registry.npmjs.org/tsx/-/tsx-3.14.0.tgz\",\n \"integrity\": \"sha512-xHtFaKtHxM9LOklMmJdI3BEnQq/D5F73Of2E1GDrITi9sgoVkvIsrQUTY1G8FlmGtA+awCI4EBlTRRYxkL2sRg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"esbuild\": \"~0.18.20\",\n \"get-tsconfig\": \"^4.7.2\",\n \"source-map-support\": \"^0.5.21\"\n },\n \"bin\": {\n \"tsx\": \"dist/cli.mjs\"\n },\n \"optionalDependencies\": {\n \"fsevents\": \"~2.3.3\"\n }\n },\n \"node_modules/typescript\": {\n \"version\": \"5.8.3\",\n \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz\",\n \"integrity\": \"sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"bin\": {\n \"tsc\": \"bin/tsc\",\n \"tsserver\": \"bin/tsserver\"\n },\n \"engines\": {\n \"node\": \">=14.17\"\n }\n },\n \"node_modules/undici-types\": {\n \"version\": \"6.21.0\",\n \"resolved\": \"https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz\",\n \"integrity\": \"sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/update-browserslist-db\": {\n \"version\": \"1.1.3\",\n \"resolved\": \"https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz\",\n \"integrity\": \"sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"escalade\": \"^3.2.0\",\n \"picocolors\": \"^1.1.1\"\n },\n \"bin\": {\n \"update-browserslist-db\": \"cli.js\"\n },\n \"peerDependencies\": {\n \"browserslist\": \">= 4.21.0\"\n }\n },\n \"node_modules/use-sync-external-store\": {\n \"version\": \"1.5.0\",\n \"resolved\": \"https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz\",\n \"integrity\": \"sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==\",\n \"license\": \"MIT\",\n \"peerDependencies\": {\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\"\n }\n },\n \"node_modules/vite\": {\n \"version\": \"5.4.19\",\n \"resolved\": \"https://registry.npmjs.org/vite/-/vite-5.4.19.tgz\",\n \"integrity\": \"sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"esbuild\": \"^0.21.3\",\n \"postcss\": \"^8.4.43\",\n \"rollup\": \"^4.20.0\"\n },\n \"bin\": {\n \"vite\": \"bin/vite.js\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/vitejs/vite?sponsor=1\"\n },\n \"optionalDependencies\": {\n \"fsevents\": \"~2.3.3\"\n },\n \"peerDependencies\": {\n \"@types/node\": \"^18.0.0 || >=20.0.0\",\n \"less\": \"*\",\n \"lightningcss\": \"^1.21.0\",\n \"sass\": \"*\",\n \"sass-embedded\": \"*\",\n \"stylus\": \"*\",\n \"sugarss\": \"*\",\n \"terser\": \"^5.4.0\"\n },\n \"peerDependenciesMeta\": {\n \"@types/node\": {\n \"optional\": true\n },\n \"less\": {\n \"optional\": true\n },\n \"lightningcss\": {\n \"optional\": true\n },\n \"sass\": {\n \"optional\": true\n },\n \"sass-embedded\": {\n \"optional\": true\n },\n \"stylus\": {\n \"optional\": true\n },\n \"sugarss\": {\n \"optional\": true\n },\n \"terser\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/vite-node\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz\",\n \"integrity\": \"sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"cac\": \"^6.7.14\",\n \"debug\": \"^4.4.1\",\n \"es-module-lexer\": \"^1.7.0\",\n \"pathe\": \"^2.0.3\",\n \"vite\": \"^5.0.0 || ^6.0.0 || ^7.0.0-0\"\n },\n \"bin\": {\n \"vite-node\": \"vite-node.mjs\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || ^20.0.0 || >=22.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-arm\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz\",\n \"integrity\": \"sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/darwin-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/darwin-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/freebsd-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/freebsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-arm\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz\",\n \"integrity\": \"sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-ia32\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz\",\n \"integrity\": \"sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-loong64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz\",\n \"integrity\": \"sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-mips64el\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz\",\n \"integrity\": \"sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==\",\n \"cpu\": [\n \"mips64el\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-ppc64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz\",\n \"integrity\": \"sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-riscv64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz\",\n \"integrity\": \"sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-s390x\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz\",\n \"integrity\": \"sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/netbsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"netbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/openbsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"openbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/sunos-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"sunos\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-ia32\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz\",\n \"integrity\": \"sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/esbuild\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz\",\n \"integrity\": \"sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"esbuild\": \"bin/esbuild\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"optionalDependencies\": {\n \"@esbuild/aix-ppc64\": \"0.21.5\",\n \"@esbuild/android-arm\": \"0.21.5\",\n \"@esbuild/android-arm64\": \"0.21.5\",\n \"@esbuild/android-x64\": \"0.21.5\",\n \"@esbuild/darwin-arm64\": \"0.21.5\",\n \"@esbuild/darwin-x64\": \"0.21.5\",\n \"@esbuild/freebsd-arm64\": \"0.21.5\",\n \"@esbuild/freebsd-x64\": \"0.21.5\",\n \"@esbuild/linux-arm\": \"0.21.5\",\n \"@esbuild/linux-arm64\": \"0.21.5\",\n \"@esbuild/linux-ia32\": \"0.21.5\",\n \"@esbuild/linux-loong64\": \"0.21.5\",\n \"@esbuild/linux-mips64el\": \"0.21.5\",\n \"@esbuild/linux-ppc64\": \"0.21.5\",\n \"@esbuild/linux-riscv64\": \"0.21.5\",\n \"@esbuild/linux-s390x\": \"0.21.5\",\n \"@esbuild/linux-x64\": \"0.21.5\",\n \"@esbuild/netbsd-x64\": \"0.21.5\",\n \"@esbuild/openbsd-x64\": \"0.21.5\",\n \"@esbuild/sunos-x64\": \"0.21.5\",\n \"@esbuild/win32-arm64\": \"0.21.5\",\n \"@esbuild/win32-ia32\": \"0.21.5\",\n \"@esbuild/win32-x64\": \"0.21.5\"\n }\n },\n \"node_modules/vitest\": {\n \"version\": \"3.2.4\",\n \"resolved\": \"https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz\",\n \"integrity\": \"sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/chai\": \"^5.2.2\",\n \"@vitest/expect\": \"3.2.4\",\n \"@vitest/mocker\": \"3.2.4\",\n \"@vitest/pretty-format\": \"^3.2.4\",\n \"@vitest/runner\": \"3.2.4\",\n \"@vitest/snapshot\": \"3.2.4\",\n \"@vitest/spy\": \"3.2.4\",\n \"@vitest/utils\": \"3.2.4\",\n \"chai\": \"^5.2.0\",\n \"debug\": \"^4.4.1\",\n \"expect-type\": \"^1.2.1\",\n \"magic-string\": \"^0.30.17\",\n \"pathe\": \"^2.0.3\",\n \"picomatch\": \"^4.0.2\",\n \"std-env\": \"^3.9.0\",\n \"tinybench\": \"^2.9.0\",\n \"tinyexec\": \"^0.3.2\",\n \"tinyglobby\": \"^0.2.14\",\n \"tinypool\": \"^1.1.1\",\n \"tinyrainbow\": \"^2.0.0\",\n \"vite\": \"^5.0.0 || ^6.0.0 || ^7.0.0-0\",\n \"vite-node\": \"3.2.4\",\n \"why-is-node-running\": \"^2.3.0\"\n },\n \"bin\": {\n \"vitest\": \"vitest.mjs\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || ^20.0.0 || >=22.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n },\n \"peerDependencies\": {\n \"@edge-runtime/vm\": \"*\",\n \"@types/debug\": \"^4.1.12\",\n \"@types/node\": \"^18.0.0 || ^20.0.0 || >=22.0.0\",\n \"@vitest/browser\": \"3.2.4\",\n \"@vitest/ui\": \"3.2.4\",\n \"happy-dom\": \"*\",\n \"jsdom\": \"*\"\n },\n \"peerDependenciesMeta\": {\n \"@edge-runtime/vm\": {\n \"optional\": true\n },\n \"@types/debug\": {\n \"optional\": true\n },\n \"@types/node\": {\n \"optional\": true\n },\n \"@vitest/browser\": {\n \"optional\": true\n },\n \"@vitest/ui\": {\n \"optional\": true\n },\n \"happy-dom\": {\n \"optional\": true\n },\n \"jsdom\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/why-is-node-running\": {\n \"version\": \"2.3.0\",\n \"resolved\": \"https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz\",\n \"integrity\": \"sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"siginfo\": \"^2.0.0\",\n \"stackback\": \"0.0.2\"\n },\n \"bin\": {\n \"why-is-node-running\": \"cli.js\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/wrap-ansi\": {\n \"version\": \"7.0.0\",\n \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\n \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-styles\": \"^4.0.0\",\n \"string-width\": \"^4.1.0\",\n \"strip-ansi\": \"^6.0.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n }\n },\n \"node_modules/y18n\": {\n \"version\": \"5.0.8\",\n \"resolved\": \"https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz\",\n \"integrity\": \"sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \">=10\"\n }\n },\n \"node_modules/yallist\": {\n \"version\": \"3.1.1\",\n \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz\",\n \"integrity\": \"sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/yargs\": {\n \"version\": \"17.7.2\",\n \"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz\",\n \"integrity\": \"sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"cliui\": \"^8.0.1\",\n \"escalade\": \"^3.1.1\",\n \"get-caller-file\": \"^2.0.5\",\n \"require-directory\": \"^2.1.1\",\n \"string-width\": \"^4.2.3\",\n \"y18n\": \"^5.0.5\",\n \"yargs-parser\": \"^21.1.1\"\n },\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/yargs-parser\": {\n \"version\": \"21.1.1\",\n \"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz\",\n \"integrity\": \"sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/zod\": {\n \"version\": \"3.25.76\",\n \"resolved\": \"https://registry.npmjs.org/zod/-/zod-3.25.76.tgz\",\n \"integrity\": \"sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"funding\": {\n \"url\": \"https://github.com/sponsors/colinhacks\"\n }\n }\n }\n}\n", "package.json": "{\n \"name\": \"example-database\",\n \"version\": \"0.9.1\",\n \"private\": true,\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"concurrently \\\"npm run dev:backend\\\" \\\"npm run dev:frontend\\\"\",\n \"dev:backend\": \"tsx --watch src/backend/server.ts\",\n \"dev:frontend\": \"vite\",\n \"build\": \"vite build\",\n \"check-types\": \"tsc --noEmit\",\n \"test\": \"vitest run\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.13.9\",\n \"@types/react\": \"^18.2.0\",\n \"@types/react-dom\": \"^18.2.0\",\n \"@vitejs/plugin-react\": \"^4.2.0\",\n \"concurrently\": \"^8.2.2\",\n \"rivetkit\": \"^0.9.1\",\n \"tsx\": \"^3.12.7\",\n \"typescript\": \"^5.5.2\",\n \"vite\": \"^5.0.0\",\n \"vitest\": \"^3.1.1\"\n },\n \"dependencies\": {\n \"@rivetkit/react\": \"^0.9.1\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\"\n },\n \"stableVersion\": \"0.8.0\"\n}\n", "tsconfig.json": "{\n \"compilerOptions\": {\n \"target\": \"esnext\",\n \"lib\": [\"esnext\", \"dom\"],\n \"jsx\": \"react-jsx\",\n \"module\": \"esnext\",\n \"moduleResolution\": \"bundler\",\n \"types\": [\"node\", \"vite/client\"],\n \"resolveJsonModule\": true,\n \"allowJs\": true,\n \"checkJs\": false,\n \"noEmit\": true,\n \"isolatedModules\": true,\n \"allowSyntheticDefaultImports\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"strict\": true,\n \"skipLibCheck\": true\n },\n \"include\": [\"src/**/*\"],\n \"exclude\": [\"node_modules\", \"dist\"]\n}\n", @@ -181,7 +181,7 @@ export const examples: ExampleData[] = [ "src/frontend/App.tsx": "import { createClient, createRivetKit } from \"@rivetkit/react\";\nimport { useEffect, useState } from \"react\";\nimport type { Note, registry } from \"../backend/registry\";\n\nconst client = createClient(\"http://localhost:8080\");\nconst { useActor } = createRivetKit(client);\n\nfunction NotesApp({ userId }: { userId: string }) {\n\tconst [notes, setNotes] = useState([]);\n\tconst [newNote, setNewNote] = useState(\"\");\n\tconst [editingNote, setEditingNote] = useState(null);\n\tconst [editContent, setEditContent] = useState(\"\");\n\n\tconst notesActor = useActor({\n\t\tname: \"notes\",\n\t\tkey: [userId],\n\t\tparams: { userId, token: \"demo-token\" },\n\t});\n\n\tuseEffect(() => {\n\t\tif (notesActor.connection) {\n\t\t\tnotesActor.connection.getNotes().then(setNotes);\n\t\t}\n\t}, [notesActor.connection]);\n\n\tnotesActor.useEvent(\"noteAdded\", (note: Note) => {\n\t\tsetNotes((prev) => [...prev, note]);\n\t});\n\n\tnotesActor.useEvent(\"noteUpdated\", (updatedNote: Note) => {\n\t\tsetNotes((prev) =>\n\t\t\tprev.map((note) => (note.id === updatedNote.id ? updatedNote : note))\n\t\t);\n\t\tsetEditingNote(null);\n\t});\n\n\tnotesActor.useEvent(\"noteDeleted\", ({ id }: { id: string }) => {\n\t\tsetNotes((prev) => prev.filter((note) => note.id !== id));\n\t});\n\n\tconst addNote = async () => {\n\t\tif (notesActor.connection && newNote.trim()) {\n\t\t\tawait notesActor.connection.updateNote({ \n\t\t\t\tid: `note-${Date.now()}`, \n\t\t\t\tcontent: newNote \n\t\t\t});\n\t\t\tsetNewNote(\"\");\n\t\t}\n\t};\n\n\tconst startEdit = (note: Note) => {\n\t\tsetEditingNote(note.id);\n\t\tsetEditContent(note.content);\n\t};\n\n\tconst saveEdit = async () => {\n\t\tif (notesActor.connection && editingNote) {\n\t\t\tawait notesActor.connection.updateNote({ \n\t\t\t\tid: editingNote, \n\t\t\t\tcontent: editContent \n\t\t\t});\n\t\t}\n\t};\n\n\tconst cancelEdit = () => {\n\t\tsetEditingNote(null);\n\t\tsetEditContent(\"\");\n\t};\n\n\tconst deleteNote = async (id: string) => {\n\t\tif (notesActor.connection && confirm(\"Are you sure you want to delete this note?\")) {\n\t\t\tawait notesActor.connection.deleteNote({ id });\n\t\t}\n\t};\n\n\tconst handleKeyPress = (e: React.KeyboardEvent, action: () => void) => {\n\t\tif (e.key === \"Enter\") {\n\t\t\taction();\n\t\t}\n\t};\n\n\treturn (\n\t\t
\n\t\t\t
\n\t\t\t\t{notesActor.connection ? '✓ Connected' : '⚠ Disconnected'}\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t setNewNote(e.target.value)}\n\t\t\t\t\tonKeyPress={(e) => handleKeyPress(e, addNote)}\n\t\t\t\t\tplaceholder=\"Enter a new note...\"\n\t\t\t\t\tdisabled={!notesActor.connection}\n\t\t\t\t/>\n\t\t\t\t\n\t\t\t\t\tAdd Note\n\t\t\t\t\n\t\t\t
\n\n\t\t\t{notes.length === 0 ? (\n\t\t\t\t
\n\t\t\t\t\tNo notes yet. Add your first note above!\n\t\t\t\t
\n\t\t\t) : (\n\t\t\t\t
    \n\t\t\t\t\t{notes\n\t\t\t\t\t\t.sort((a, b) => b.updatedAt - a.updatedAt)\n\t\t\t\t\t\t.map((note) => (\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\t{editingNote === note.id ? (\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t setEditContent(e.target.value)}\n\t\t\t\t\t\t\t\t\t\tonKeyPress={(e) => handleKeyPress(e, saveEdit)}\n\t\t\t\t\t\t\t\t\t\tclassName=\"edit-input\"\n\t\t\t\t\t\t\t\t\t\tautoFocus\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t
    {note.content}
    \n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\tLast updated: {new Date(note.updatedAt).toLocaleString()}\n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t startEdit(note)}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"edit-btn\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\tEdit\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t deleteNote(note.id)}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"delete-btn\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\tDelete\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t
  • \n\t\t\t\t\t))}\n\t\t\t\t
\n\t\t\t)}\n\t\t
\n\t);\n}\n\nexport function App() {\n\tconst [selectedUser, setSelectedUser] = useState(\"user1\");\n\n\tconst users = [\n\t\t{ id: \"user1\", name: \"Alice\" },\n\t\t{ id: \"user2\", name: \"Bob\" },\n\t\t{ id: \"user3\", name: \"Charlie\" },\n\t];\n\n\treturn (\n\t\t
\n\t\t\t
\n\t\t\t\t

Database Notes

\n\t\t\t\t

Persistent note-taking with real-time updates

\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t\n\t\t\t\t setSelectedUser(e.target.value)}\n\t\t\t\t>\n\t\t\t\t\t{users.map((user) => (\n\t\t\t\t\t\t\n\t\t\t\t\t))}\n\t\t\t\t\n\t\t\t
\n\n\t\t\t\n\t\t
\n\t);\n}", "src/frontend/main.tsx": "import { StrictMode } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { App } from \"./App\";\n\nconst root = document.getElementById(\"root\");\nif (!root) throw new Error(\"Root element not found\");\n\ncreateRoot(root).render(\n\t\n\t\t\n\t\n);", "src/frontend/index.html": "\n\n\n \n \n Database Notes Example\n \n\n\n
\n \n\n", - "src/backend/registry.ts": "import { actor, setup } from \"rivetkit\";\nimport { authenticate } from \"./my-utils\";\n\nexport type Note = { id: string; content: string; updatedAt: number };\n\nexport const notes = actor({\n\tonAuth: () => {},\n\t// Persistent state that survives restarts: https://rivet.gg/docs/actors/state\n\tstate: {\n\t\tnotes: [] as Note[],\n\t},\n\n\tactions: {\n\t\t// Callable functions from clients: https://rivet.gg/docs/actors/actions\n\t\tgetNotes: (c) => c.state.notes,\n\n\t\tupdateNote: (c, { id, content }: { id?: string; content: string }) => {\n\t\t\tconst noteIndex = c.state.notes.findIndex((note) => note.id === id);\n\t\t\tlet note: Note;\n\n\t\t\tif (noteIndex >= 0) {\n\t\t\t\t// Update existing note\n\t\t\t\tnote = c.state.notes[noteIndex];\n\t\t\t\tnote.content = content;\n\t\t\t\tnote.updatedAt = Date.now();\n\t\t\t\t// Send events to all connected clients: https://rivet.gg/docs/actors/events\n\t\t\t\tc.broadcast(\"noteUpdated\", note);\n\t\t\t} else {\n\t\t\t\t// Create new note\n\t\t\t\tnote = {\n\t\t\t\t\tid: id || `note-${Date.now()}`,\n\t\t\t\t\tcontent,\n\t\t\t\t\tupdatedAt: Date.now(),\n\t\t\t\t};\n\t\t\t\t// State changes are automatically persisted\n\t\t\t\tc.state.notes.push(note);\n\t\t\t\tc.broadcast(\"noteAdded\", note);\n\t\t\t}\n\n\t\t\treturn note;\n\t\t},\n\n\t\tdeleteNote: (c, { id }: { id: string }) => {\n\t\t\tconst noteIndex = c.state.notes.findIndex((note) => note.id === id);\n\t\t\tif (noteIndex >= 0) {\n\t\t\t\tc.state.notes.splice(noteIndex, 1);\n\t\t\t\tc.broadcast(\"noteDeleted\", { id });\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t},\n});\n\n// Register actors for use: https://rivet.gg/docs/setup\nexport const registry = setup({\n\tuse: { notes },\n});\n", + "src/backend/registry.ts": "import { actor, setup } from \"rivetkit\";\nimport { authenticate } from \"./my-utils\";\n\nexport type Note = { id: string; content: string; updatedAt: number };\n\nexport const notes = actor({\n\tonAuth: () => {},\n\t// Persistent state that survives restarts: https://rivet.dev/docs/actors/state\n\tstate: {\n\t\tnotes: [] as Note[],\n\t},\n\n\tactions: {\n\t\t// Callable functions from clients: https://rivet.dev/docs/actors/actions\n\t\tgetNotes: (c) => c.state.notes,\n\n\t\tupdateNote: (c, { id, content }: { id?: string; content: string }) => {\n\t\t\tconst noteIndex = c.state.notes.findIndex((note) => note.id === id);\n\t\t\tlet note: Note;\n\n\t\t\tif (noteIndex >= 0) {\n\t\t\t\t// Update existing note\n\t\t\t\tnote = c.state.notes[noteIndex];\n\t\t\t\tnote.content = content;\n\t\t\t\tnote.updatedAt = Date.now();\n\t\t\t\t// Send events to all connected clients: https://rivet.dev/docs/actors/events\n\t\t\t\tc.broadcast(\"noteUpdated\", note);\n\t\t\t} else {\n\t\t\t\t// Create new note\n\t\t\t\tnote = {\n\t\t\t\t\tid: id || `note-${Date.now()}`,\n\t\t\t\t\tcontent,\n\t\t\t\t\tupdatedAt: Date.now(),\n\t\t\t\t};\n\t\t\t\t// State changes are automatically persisted\n\t\t\t\tc.state.notes.push(note);\n\t\t\t\tc.broadcast(\"noteAdded\", note);\n\t\t\t}\n\n\t\t\treturn note;\n\t\t},\n\n\t\tdeleteNote: (c, { id }: { id: string }) => {\n\t\t\tconst noteIndex = c.state.notes.findIndex((note) => note.id === id);\n\t\t\tif (noteIndex >= 0) {\n\t\t\t\tc.state.notes.splice(noteIndex, 1);\n\t\t\t\tc.broadcast(\"noteDeleted\", { id });\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t},\n});\n\n// Register actors for use: https://rivet.dev/docs/setup\nexport const registry = setup({\n\tuse: { notes },\n});\n", "src/backend/my-utils.ts": "export async function authenticate(token: string): Promise {\n\t// Mock authentication - in real app, verify JWT or session token\n\tif (token === \"demo-token\") {\n\t\treturn \"user123\";\n\t}\n\tthrow new Error(\"Invalid token\");\n}\n", "src/backend/server.ts": "import { registry } from \"./registry\";\n\nregistry.runServer({\n\tcors: {\n\t\torigin: \"*\",\n\t},\n});\n" } @@ -197,7 +197,7 @@ export const examples: ExampleData[] = [ "tab": "memory", "files": { "tests/tenant.test.ts": "import { setupTest } from \"rivetkit/test\";\nimport { expect, test, vi } from \"vitest\";\nimport { registry } from \"../src/backend/registry\";\n\n// Mock authentication function\nvi.mock(\"../src/backend/registry\", async (importOriginal) => {\n\tconst mod = await importOriginal();\n\treturn {\n\t\t...mod,\n\t\t// We'll need to test without connection state since it requires auth\n\t};\n});\n\ntest(\"Tenant organization can provide basic info\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst tenant = client.tenant.getOrCreate([\"test-org\"]);\n\n\t// Get organization info\n\tconst orgInfo = await tenant.getOrganization();\n\texpect(orgInfo).toMatchObject({\n\t\tid: expect.any(String),\n\t\tname: expect.any(String),\n\t\tmemberCount: expect.any(Number),\n\t});\n\texpect(orgInfo.memberCount).toBeGreaterThan(0);\n});\n\ntest(\"Tenant organization tracks members\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst tenant = client.tenant.getOrCreate([\"test-members\"]);\n\n\t// Get all members\n\tconst members = await tenant.getMembers();\n\texpect(Array.isArray(members)).toBe(true);\n\texpect(members.length).toBeGreaterThan(0);\n\n\t// Verify member structure\n\tmembers.forEach((member) => {\n\t\texpect(member).toMatchObject({\n\t\t\tid: expect.any(String),\n\t\t\tname: expect.any(String),\n\t\t\temail: expect.any(String),\n\t\t\trole: expect.stringMatching(/^(admin|member)$/),\n\t\t});\n\t});\n});\n\ntest(\"Tenant organization provides dashboard stats\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst tenant = client.tenant.getOrCreate([\"test-stats\"]);\n\n\t// Get dashboard stats (without admin privileges)\n\tconst stats = await tenant.getDashboardStats();\n\texpect(stats).toMatchObject({\n\t\ttotalMembers: expect.any(Number),\n\t\tadminCount: expect.any(Number),\n\t\tmemberCount: expect.any(Number),\n\t});\n\n\t// Verify member counts add up\n\texpect(stats.adminCount + stats.memberCount).toBe(stats.totalMembers);\n\texpect(stats.totalMembers).toBeGreaterThan(0);\n\texpect(stats.adminCount).toBeGreaterThan(0);\n});\n\ntest(\"Tenant organization validates member roles\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst tenant = client.tenant.getOrCreate([\"test-roles\"]);\n\n\tconst members = await tenant.getMembers();\n\tconst orgInfo = await tenant.getOrganization();\n\n\t// Verify at least one admin exists\n\tconst admins = members.filter((m) => m.role === \"admin\");\n\tconst regularMembers = members.filter((m) => m.role === \"member\");\n\n\texpect(admins.length).toBeGreaterThan(0);\n\texpect(members.length).toBe(orgInfo.memberCount);\n\texpect(admins.length + regularMembers.length).toBe(members.length);\n});\n\ntest(\"Tenant organization handles initial data correctly\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst tenant = client.tenant.getOrCreate([\"test-initial-data\"]);\n\n\t// Verify initial state has expected structure\n\tconst members = await tenant.getMembers();\n\tconst orgInfo = await tenant.getOrganization();\n\n\texpect(orgInfo.name).toBeTruthy();\n\texpect(orgInfo.id).toBeTruthy();\n\texpect(members.length).toBe(orgInfo.memberCount);\n\n\t// Verify we have the expected sample data\n\texpect(members.some((m) => m.role === \"admin\")).toBe(true);\n\texpect(members.some((m) => m.role === \"member\")).toBe(true);\n\n\t// Verify email formats\n\tmembers.forEach((member) => {\n\t\texpect(member.email).toMatch(/@/);\n\t\texpect(member.name).toBeTruthy();\n\t\texpect(member.id).toBeTruthy();\n\t});\n});\n\ntest(\"Tenant organization member data consistency\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst tenant = client.tenant.getOrCreate([\"test-consistency\"]);\n\n\t// Get data multiple times to verify consistency\n\tconst members1 = await tenant.getMembers();\n\tconst members2 = await tenant.getMembers();\n\tconst orgInfo1 = await tenant.getOrganization();\n\tconst orgInfo2 = await tenant.getOrganization();\n\n\texpect(members1).toEqual(members2);\n\texpect(orgInfo1).toEqual(orgInfo2);\n\texpect(members1.length).toBe(orgInfo1.memberCount);\n});\n", - "README.md": "# Tenant Dashboard for RivetKit\n\nExample project demonstrating multi-tenant organization management with role-based access control using [RivetKit](https://rivetkit.org).\n\n[Learn More →](https://github.com/rivet-gg/rivetkit)\n\n[Discord](https://rivet.gg/discord) — [Documentation](https://rivetkit.org) — [Issues](https://github.com/rivet-gg/rivetkit/issues)\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 18+\n\n### Installation\n\n```sh\ngit clone https://github.com/rivet-gg/rivetkit\ncd rivetkit/examples/tenant\nnpm install\n```\n\n### Development\n\n```sh\nnpm run dev\n```\n\nOpen your browser to `http://localhost:3000`\n\n## Features\n\n- **Role-Based Access Control**: Different permissions for admin and member roles\n- **Multi-Tenant Architecture**: Organization-scoped data and permissions\n- **Authentication**: Token-based authentication with connection state\n- **Real-time Updates**: Live updates when data changes across clients\n- **Permission Enforcement**: Server-side permission checks for all operations\n- **User Management**: Admin can add members and update roles\n- **Invoice Management**: Admin-only access to billing information\n- **Dashboard Analytics**: Role-specific statistics and insights\n\n## How it works\n\nThis tenant system demonstrates:\n\n1. **Authentication**: Token-based authentication with `createConnState`\n2. **Authorization**: Role-based access control with server-side permission checks\n3. **Multi-Tenancy**: Organization-scoped data isolation\n4. **Real-time Collaboration**: Live updates across connected clients\n5. **Permission Enforcement**: Different UI and API access based on user roles\n\n## Architecture\n\n- **Backend**: RivetKit actor with authentication and role-based permissions\n- **Frontend**: React application with conditional rendering based on user roles\n- **Authentication**: Token-based with connection state for user context\n- **Authorization**: Server-side permission checks for all sensitive operations\n\n## User Roles\n\n### Admin Users\n- **Full Access**: Can view all data and perform all operations\n- **Member Management**: Add new members and update member roles\n- **Invoice Access**: View and manage organization invoices\n- **Dashboard Stats**: Access to comprehensive analytics including revenue\n\n### Member Users\n- **Limited Access**: Can only view basic organization information\n- **Member List**: View team members and their roles\n- **Dashboard Stats**: Access to basic member statistics only\n- **No Invoice Access**: Cannot view or manage billing information\n\n## Security Features\n\n### Authentication\n```typescript\n// Token-based authentication\ncreateConnState: async (c, { params }) => {\n const token = params.token;\n const { userId, role } = await authenticate(token);\n return { userId, role };\n}\n```\n\n### Authorization\n```typescript\n// Server-side permission checks\ngetInvoices: (c) => {\n if (c.conn.role !== \"admin\") {\n throw new UserError(\"Permission denied: Admin role required\");\n }\n return c.state.invoices;\n}\n```\n\n### Data Isolation\n- Organization-scoped data using actor keys\n- User context stored in connection state\n- Role-based data filtering and access control\n\n## API Endpoints\n\n### Public (All Authenticated Users)\n- `getOrganization()` - Get organization information\n- `getMembers()` - Get list of all members\n- `getCurrentUser()` - Get current user information\n- `getDashboardStats()` - Get basic statistics\n\n### Admin Only\n- `getInvoices()` - Get all invoices\n- `addMember(member)` - Add new member\n- `updateMemberRole(memberId, role)` - Update member role\n- `markInvoicePaid(invoiceId)` - Mark invoice as paid\n\n## Real-time Updates\n\nThe system broadcasts updates to all connected clients:\n\n```typescript\n// When member is added\nc.broadcast(\"memberAdded\", { member: newMember });\n\n// When member role is updated\nc.broadcast(\"memberUpdated\", { member });\n\n// When invoice is updated\nc.broadcast(\"invoiceUpdated\", { invoice });\n```\n\n## Use Cases\n\nThis tenant pattern is perfect for:\n\n- **SaaS Applications**: Multi-tenant software with organization accounts\n- **Team Management**: Internal tools with role-based access\n- **Project Management**: Collaborative tools with permission levels\n- **CRM Systems**: Customer relationship management with user roles\n- **Enterprise Software**: Business applications with admin/user hierarchies\n- **Learning Management**: Educational platforms with teacher/student roles\n\n## Extending\n\nThis tenant system can be enhanced with:\n\n### Advanced Authentication\n- **OAuth Integration**: Google, GitHub, Microsoft authentication\n- **JWT Tokens**: Stateless authentication with signed tokens\n- **Multi-Factor Auth**: SMS, email, or authenticator app verification\n- **Session Management**: Secure session handling and expiration\n\n### Enhanced Authorization\n- **Custom Roles**: Define custom roles beyond admin/member\n- **Permissions**: Granular permissions for specific operations\n- **Role Hierarchy**: Nested roles with inheritance\n- **Resource-Level Access**: Per-resource permissions\n\n### Multi-Tenancy Features\n- **Organization Settings**: Configurable organization preferences\n- **Billing Integration**: Stripe, PayPal, or other payment processors\n- **Usage Tracking**: Monitor and limit resource usage per tenant\n- **Data Export**: Allow tenants to export their data\n\n### Advanced Features\n- **Audit Logging**: Track all user actions and changes\n- **Activity Feeds**: Real-time activity notifications\n- **Team Invitations**: Invite users via email with signup flow\n- **API Keys**: Generate API keys for external integrations\n- **Webhooks**: Notify external systems of events\n\n## Testing Different Roles\n\nTo test the role-based access control:\n\n1. **Login as Alice (Admin)**:\n - Can view members and invoices\n - Can add new members\n - Can update member roles\n - Can mark invoices as paid\n - Sees full dashboard statistics\n\n2. **Login as Bob/Charlie (Member)**:\n - Can view members only\n - Cannot access invoices\n - Cannot manage members\n - Sees limited dashboard statistics\n - Gets permission denied errors for admin operations\n\n## Security Considerations\n\n### Server-Side Validation\n- All permission checks happen on the server\n- Client-side UI is for user experience only\n- Never trust client-side role information\n\n### Token Management\n- Use secure token storage (httpOnly cookies in production)\n- Implement token refresh mechanisms\n- Add token expiration and revocation\n\n### Data Protection\n- Sanitize all user inputs\n- Use parameterized queries for database operations\n- Implement rate limiting for API endpoints\n- Log security events and failed authentication attempts\n\n## Performance Considerations\n\n### Caching\n- Cache user roles and permissions\n- Use Redis for session storage in production\n- Implement query result caching\n\n### Scalability\n- Separate read and write operations\n- Use database read replicas for heavy read workloads\n- Implement proper indexing for user and organization queries\n\n## License\n\nApache 2.0", + "README.md": "# Tenant Dashboard for RivetKit\n\nExample project demonstrating multi-tenant organization management with role-based access control using [RivetKit](https://rivetkit.org).\n\n[Learn More →](https://github.com/rivet-dev/rivetkit)\n\n[Discord](https://rivet.dev/discord) — [Documentation](https://rivetkit.org) — [Issues](https://github.com/rivet-dev/rivetkit/issues)\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 18+\n\n### Installation\n\n```sh\ngit clone https://github.com/rivet-dev/rivetkit\ncd rivetkit/examples/tenant\nnpm install\n```\n\n### Development\n\n```sh\nnpm run dev\n```\n\nOpen your browser to `http://localhost:3000`\n\n## Features\n\n- **Role-Based Access Control**: Different permissions for admin and member roles\n- **Multi-Tenant Architecture**: Organization-scoped data and permissions\n- **Authentication**: Token-based authentication with connection state\n- **Real-time Updates**: Live updates when data changes across clients\n- **Permission Enforcement**: Server-side permission checks for all operations\n- **User Management**: Admin can add members and update roles\n- **Invoice Management**: Admin-only access to billing information\n- **Dashboard Analytics**: Role-specific statistics and insights\n\n## How it works\n\nThis tenant system demonstrates:\n\n1. **Authentication**: Token-based authentication with `createConnState`\n2. **Authorization**: Role-based access control with server-side permission checks\n3. **Multi-Tenancy**: Organization-scoped data isolation\n4. **Real-time Collaboration**: Live updates across connected clients\n5. **Permission Enforcement**: Different UI and API access based on user roles\n\n## Architecture\n\n- **Backend**: RivetKit actor with authentication and role-based permissions\n- **Frontend**: React application with conditional rendering based on user roles\n- **Authentication**: Token-based with connection state for user context\n- **Authorization**: Server-side permission checks for all sensitive operations\n\n## User Roles\n\n### Admin Users\n- **Full Access**: Can view all data and perform all operations\n- **Member Management**: Add new members and update member roles\n- **Invoice Access**: View and manage organization invoices\n- **Dashboard Stats**: Access to comprehensive analytics including revenue\n\n### Member Users\n- **Limited Access**: Can only view basic organization information\n- **Member List**: View team members and their roles\n- **Dashboard Stats**: Access to basic member statistics only\n- **No Invoice Access**: Cannot view or manage billing information\n\n## Security Features\n\n### Authentication\n```typescript\n// Token-based authentication\ncreateConnState: async (c, { params }) => {\n const token = params.token;\n const { userId, role } = await authenticate(token);\n return { userId, role };\n}\n```\n\n### Authorization\n```typescript\n// Server-side permission checks\ngetInvoices: (c) => {\n if (c.conn.role !== \"admin\") {\n throw new UserError(\"Permission denied: Admin role required\");\n }\n return c.state.invoices;\n}\n```\n\n### Data Isolation\n- Organization-scoped data using actor keys\n- User context stored in connection state\n- Role-based data filtering and access control\n\n## API Endpoints\n\n### Public (All Authenticated Users)\n- `getOrganization()` - Get organization information\n- `getMembers()` - Get list of all members\n- `getCurrentUser()` - Get current user information\n- `getDashboardStats()` - Get basic statistics\n\n### Admin Only\n- `getInvoices()` - Get all invoices\n- `addMember(member)` - Add new member\n- `updateMemberRole(memberId, role)` - Update member role\n- `markInvoicePaid(invoiceId)` - Mark invoice as paid\n\n## Real-time Updates\n\nThe system broadcasts updates to all connected clients:\n\n```typescript\n// When member is added\nc.broadcast(\"memberAdded\", { member: newMember });\n\n// When member role is updated\nc.broadcast(\"memberUpdated\", { member });\n\n// When invoice is updated\nc.broadcast(\"invoiceUpdated\", { invoice });\n```\n\n## Use Cases\n\nThis tenant pattern is perfect for:\n\n- **SaaS Applications**: Multi-tenant software with organization accounts\n- **Team Management**: Internal tools with role-based access\n- **Project Management**: Collaborative tools with permission levels\n- **CRM Systems**: Customer relationship management with user roles\n- **Enterprise Software**: Business applications with admin/user hierarchies\n- **Learning Management**: Educational platforms with teacher/student roles\n\n## Extending\n\nThis tenant system can be enhanced with:\n\n### Advanced Authentication\n- **OAuth Integration**: Google, GitHub, Microsoft authentication\n- **JWT Tokens**: Stateless authentication with signed tokens\n- **Multi-Factor Auth**: SMS, email, or authenticator app verification\n- **Session Management**: Secure session handling and expiration\n\n### Enhanced Authorization\n- **Custom Roles**: Define custom roles beyond admin/member\n- **Permissions**: Granular permissions for specific operations\n- **Role Hierarchy**: Nested roles with inheritance\n- **Resource-Level Access**: Per-resource permissions\n\n### Multi-Tenancy Features\n- **Organization Settings**: Configurable organization preferences\n- **Billing Integration**: Stripe, PayPal, or other payment processors\n- **Usage Tracking**: Monitor and limit resource usage per tenant\n- **Data Export**: Allow tenants to export their data\n\n### Advanced Features\n- **Audit Logging**: Track all user actions and changes\n- **Activity Feeds**: Real-time activity notifications\n- **Team Invitations**: Invite users via email with signup flow\n- **API Keys**: Generate API keys for external integrations\n- **Webhooks**: Notify external systems of events\n\n## Testing Different Roles\n\nTo test the role-based access control:\n\n1. **Login as Alice (Admin)**:\n - Can view members and invoices\n - Can add new members\n - Can update member roles\n - Can mark invoices as paid\n - Sees full dashboard statistics\n\n2. **Login as Bob/Charlie (Member)**:\n - Can view members only\n - Cannot access invoices\n - Cannot manage members\n - Sees limited dashboard statistics\n - Gets permission denied errors for admin operations\n\n## Security Considerations\n\n### Server-Side Validation\n- All permission checks happen on the server\n- Client-side UI is for user experience only\n- Never trust client-side role information\n\n### Token Management\n- Use secure token storage (httpOnly cookies in production)\n- Implement token refresh mechanisms\n- Add token expiration and revocation\n\n### Data Protection\n- Sanitize all user inputs\n- Use parameterized queries for database operations\n- Implement rate limiting for API endpoints\n- Log security events and failed authentication attempts\n\n## Performance Considerations\n\n### Caching\n- Cache user roles and permissions\n- Use Redis for session storage in production\n- Implement query result caching\n\n### Scalability\n- Separate read and write operations\n- Use database read replicas for heavy read workloads\n- Implement proper indexing for user and organization queries\n\n## License\n\nApache 2.0", "package-lock.json": "{\n \"name\": \"example-tenant\",\n \"version\": \"1.0.0\",\n \"lockfileVersion\": 3,\n \"requires\": true,\n \"packages\": {\n \"\": {\n \"name\": \"example-tenant\",\n \"version\": \"1.0.0\",\n \"dependencies\": {\n \"rivetkit\": \"^0.9.1\",\n \"@rivetkit/react\": \"^0.9.1\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^20.0.0\",\n \"@types/react\": \"^18.2.0\",\n \"@types/react-dom\": \"^18.2.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"concurrently\": \"^8.2.0\",\n \"tsx\": \"^4.0.0\",\n \"typescript\": \"^5.0.0\",\n \"vite\": \"^5.0.0\",\n \"vitest\": \"^1.0.0\"\n }\n },\n \"node_modules/@ampproject/remapping\": {\n \"version\": \"2.3.0\",\n \"resolved\": \"https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz\",\n \"integrity\": \"sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@jridgewell/gen-mapping\": \"^0.3.5\",\n \"@jridgewell/trace-mapping\": \"^0.3.24\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@babel/code-frame\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz\",\n \"integrity\": \"sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-validator-identifier\": \"^7.27.1\",\n \"js-tokens\": \"^4.0.0\",\n \"picocolors\": \"^1.1.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/compat-data\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz\",\n \"integrity\": \"sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/core\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz\",\n \"integrity\": \"sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@ampproject/remapping\": \"^2.2.0\",\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/generator\": \"^7.28.0\",\n \"@babel/helper-compilation-targets\": \"^7.27.2\",\n \"@babel/helper-module-transforms\": \"^7.27.3\",\n \"@babel/helpers\": \"^7.27.6\",\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/template\": \"^7.27.2\",\n \"@babel/traverse\": \"^7.28.0\",\n \"@babel/types\": \"^7.28.0\",\n \"convert-source-map\": \"^2.0.0\",\n \"debug\": \"^4.1.0\",\n \"gensync\": \"^1.0.0-beta.2\",\n \"json5\": \"^2.2.3\",\n \"semver\": \"^6.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"funding\": {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/babel\"\n }\n },\n \"node_modules/@babel/generator\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz\",\n \"integrity\": \"sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/types\": \"^7.28.0\",\n \"@jridgewell/gen-mapping\": \"^0.3.12\",\n \"@jridgewell/trace-mapping\": \"^0.3.28\",\n \"jsesc\": \"^3.0.2\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-compilation-targets\": {\n \"version\": \"7.27.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz\",\n \"integrity\": \"sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/compat-data\": \"^7.27.2\",\n \"@babel/helper-validator-option\": \"^7.27.1\",\n \"browserslist\": \"^4.24.0\",\n \"lru-cache\": \"^5.1.1\",\n \"semver\": \"^6.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-globals\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz\",\n \"integrity\": \"sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-module-imports\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz\",\n \"integrity\": \"sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/traverse\": \"^7.27.1\",\n \"@babel/types\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-module-transforms\": {\n \"version\": \"7.27.3\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz\",\n \"integrity\": \"sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-module-imports\": \"^7.27.1\",\n \"@babel/helper-validator-identifier\": \"^7.27.1\",\n \"@babel/traverse\": \"^7.27.3\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0\"\n }\n },\n \"node_modules/@babel/helper-plugin-utils\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz\",\n \"integrity\": \"sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-string-parser\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz\",\n \"integrity\": \"sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-validator-identifier\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz\",\n \"integrity\": \"sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-validator-option\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz\",\n \"integrity\": \"sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helpers\": {\n \"version\": \"7.27.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz\",\n \"integrity\": \"sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/template\": \"^7.27.2\",\n \"@babel/types\": \"^7.27.6\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/parser\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz\",\n \"integrity\": \"sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.28.0\"\n },\n \"bin\": {\n \"parser\": \"bin/babel-parser.js\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@babel/plugin-transform-react-jsx-self\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz\",\n \"integrity\": \"sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-plugin-utils\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/plugin-transform-react-jsx-source\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz\",\n \"integrity\": \"sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-plugin-utils\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/runtime\": {\n \"version\": \"7.27.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz\",\n \"integrity\": \"sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/template\": {\n \"version\": \"7.27.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz\",\n \"integrity\": \"sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/parser\": \"^7.27.2\",\n \"@babel/types\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/traverse\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz\",\n \"integrity\": \"sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/generator\": \"^7.28.0\",\n \"@babel/helper-globals\": \"^7.28.0\",\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/template\": \"^7.27.2\",\n \"@babel/types\": \"^7.28.0\",\n \"debug\": \"^4.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/types\": {\n \"version\": \"7.28.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/types/-/types-7.28.1.tgz\",\n \"integrity\": \"sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-string-parser\": \"^7.27.1\",\n \"@babel/helper-validator-identifier\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@cbor-extract/cbor-extract-darwin-arm64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.0.tgz\",\n \"integrity\": \"sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-darwin-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-arm\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.2.0.tgz\",\n \"integrity\": \"sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==\",\n \"cpu\": [\n \"arm\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-arm64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.2.0.tgz\",\n \"integrity\": \"sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-win32-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"peer\": true\n },\n \"node_modules/@esbuild/aix-ppc64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.6.tgz\",\n \"integrity\": \"sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"aix\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/android-arm\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.6.tgz\",\n \"integrity\": \"sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/android-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/android-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/darwin-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/darwin-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/freebsd-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/freebsd-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-arm\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.6.tgz\",\n \"integrity\": \"sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-ia32\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.6.tgz\",\n \"integrity\": \"sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-loong64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.6.tgz\",\n \"integrity\": \"sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-mips64el\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.6.tgz\",\n \"integrity\": \"sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==\",\n \"cpu\": [\n \"mips64el\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-ppc64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.6.tgz\",\n \"integrity\": \"sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-riscv64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.6.tgz\",\n \"integrity\": \"sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-s390x\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.6.tgz\",\n \"integrity\": \"sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/netbsd-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"netbsd\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/netbsd-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"netbsd\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/openbsd-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"openbsd\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/openbsd-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"openbsd\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/openharmony-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"openharmony\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/sunos-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"sunos\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/win32-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/win32-ia32\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.6.tgz\",\n \"integrity\": \"sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/win32-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@jest/schemas\": {\n \"version\": \"29.6.3\",\n \"resolved\": \"https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz\",\n \"integrity\": \"sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@sinclair/typebox\": \"^0.27.8\"\n },\n \"engines\": {\n \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n }\n },\n \"node_modules/@jridgewell/gen-mapping\": {\n \"version\": \"0.3.12\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz\",\n \"integrity\": \"sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/sourcemap-codec\": \"^1.5.0\",\n \"@jridgewell/trace-mapping\": \"^0.3.24\"\n }\n },\n \"node_modules/@jridgewell/resolve-uri\": {\n \"version\": \"3.1.2\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz\",\n \"integrity\": \"sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@jridgewell/sourcemap-codec\": {\n \"version\": \"1.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz\",\n \"integrity\": \"sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@jridgewell/trace-mapping\": {\n \"version\": \"0.3.29\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz\",\n \"integrity\": \"sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/resolve-uri\": \"^3.1.0\",\n \"@jridgewell/sourcemap-codec\": \"^1.4.14\"\n }\n },\n \"node_modules/rivetkit\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/rivetkit/-/actor-0.9.1.tgz\",\n \"integrity\": \"sha512-aVoWO81JrYql6hhXX+vRor0B+aeWrnh+9zkcrxbh0EXFBbS5XM8YE4sSFxNKmZThLbGNqfZ5enm1zuA92c7I1w==\",\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\"\n }\n },\n \"node_modules/@rivetkit/core\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/core/-/core-0.9.1.tgz\",\n \"integrity\": \"sha512-0zYFKo08CQ72Rm6MaVKxcJSEEfn/ypGkkxTX06Q4meCGHuDJFbPA5wopa3NdxrKBPttcGg1QAmDd+1FZnlpubA==\",\n \"license\": \"Apache-2.0\",\n \"peer\": true,\n \"dependencies\": {\n \"cbor-x\": \"^1.6.0\",\n \"invariant\": \"^2.2.4\",\n \"on-change\": \"^5.0.1\",\n \"p-retry\": \"^6.2.1\",\n \"zod\": \"^3.25.67\"\n },\n \"engines\": {\n \"node\": \">=22.0.0\"\n },\n \"peerDependencies\": {\n \"@hono/node-server\": \"^1.14.0\",\n \"@hono/node-ws\": \"^1.1.1\",\n \"@hono/zod-openapi\": \"^0.19.6\",\n \"eventsource\": \"^3.0.5\",\n \"hono\": \"^4.7.0\",\n \"ws\": \"^8.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@hono/node-server\": {\n \"optional\": true\n },\n \"@hono/node-ws\": {\n \"optional\": true\n },\n \"@hono/zod-openapi\": {\n \"optional\": true\n },\n \"eventsource\": {\n \"optional\": true\n },\n \"hono\": {\n \"optional\": true\n },\n \"ws\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/@rivetkit/framework-base\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/framework-base/-/framework-base-0.9.1.tgz\",\n \"integrity\": \"sha512-FxhSqGAtDsD4k7gKS2EhJ5hHsEwI1+QR0vYThUBOLcmXM7zjMZndqIjVperQO4ck/zfjRqjm3lw7znkc+k0wNQ==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@tanstack/store\": \"^0.7.1\"\n },\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\"\n }\n },\n \"node_modules/@rivetkit/react\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/react/-/react-0.9.1.tgz\",\n \"integrity\": \"sha512-0e0gNNj3qCrXHNIxE6ggEEX+E6HjdsSt9pJbWbaQQg+1bsywupRTSdgSDguDHjBvi9qhR9mh7UbNN3A9wYqXuA==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@rivetkit/framework-base\": \"0.9.1\",\n \"@tanstack/react-store\": \"^0.7.1\"\n },\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\",\n \"react\": \"^18 || ^19\",\n \"react-dom\": \"^18 || ^19\"\n }\n },\n \"node_modules/@rolldown/pluginutils\": {\n \"version\": \"1.0.0-beta.19\",\n \"resolved\": \"https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz\",\n \"integrity\": \"sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@rollup/rollup-android-arm-eabi\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.0.tgz\",\n \"integrity\": \"sha512-2o/FgACbji4tW1dzXOqAV15Eu7DdgbKsF2QKcxfG4xbh5iwU7yr5RRP5/U+0asQliSYv5M4o7BevlGIoSL0LXg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ]\n },\n \"node_modules/@rollup/rollup-android-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-PSZ0SvMOjEAxwZeTx32eI/j5xSYtDCRxGu5k9zvzoY77xUNssZM+WV6HYBLROpY5CkXsbQjvz40fBb7WPwDqtQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ]\n },\n \"node_modules/@rollup/rollup-darwin-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-BA4yPIPssPB2aRAWzmqzQ3y2/KotkLyZukVB7j3psK/U3nVJdceo6qr9pLM2xN6iRP/wKfxEbOb1yrlZH6sYZg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ]\n },\n \"node_modules/@rollup/rollup-darwin-x64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.0.tgz\",\n \"integrity\": \"sha512-Pr2o0lvTwsiG4HCr43Zy9xXrHspyMvsvEw4FwKYqhli4FuLE5FjcZzuQ4cfPe0iUFCvSQG6lACI0xj74FDZKRA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ]\n },\n \"node_modules/@rollup/rollup-freebsd-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-lYE8LkE5h4a/+6VnnLiL14zWMPnx6wNbDG23GcYFpRW1V9hYWHAw9lBZ6ZUIrOaoK7NliF1sdwYGiVmziUF4vA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ]\n },\n \"node_modules/@rollup/rollup-freebsd-x64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.0.tgz\",\n \"integrity\": \"sha512-PVQWZK9sbzpvqC9Q0GlehNNSVHR+4m7+wET+7FgSnKG3ci5nAMgGmr9mGBXzAuE5SvguCKJ6mHL6vq1JaJ/gvw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm-gnueabihf\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.0.tgz\",\n \"integrity\": \"sha512-hLrmRl53prCcD+YXTfNvXd776HTxNh8wPAMllusQ+amcQmtgo3V5i/nkhPN6FakW+QVLoUUr2AsbtIRPFU3xIA==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm-musleabihf\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.0.tgz\",\n \"integrity\": \"sha512-XBKGSYcrkdiRRjl+8XvrUR3AosXU0NvF7VuqMsm7s5nRy+nt58ZMB19Jdp1RdqewLcaYnpk8zeVs/4MlLZEJxw==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-fRvZZPUiBz7NztBE/2QnCS5AtqLVhXmUOPj9IHlfGEXkapgImf4W9+FSkL8cWqoAjozyUzqFmSc4zh2ooaeF6g==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-Btv2WRZOcUGi8XU80XwIvzTg4U6+l6D0V6sZTrZx214nrwxw5nAi8hysaXj/mctyClWgesyuxbeLylCBNauimg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-loongarch64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-Li0emNnwtUZdLwHjQPBxn4VWztcrw/h7mgLyHiEI5Z0MhpeFGlzaiBHpSNVOMB/xucjXTTcO+dhv469Djr16KA==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-powerpc64le-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-sB8+pfkYx2kvpDCfd63d5ScYT0Fz1LO6jIb2zLZvmK9ob2D8DeVqrmBDE0iDK8KlBVmsTNzrjr3G1xV4eUZhSw==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-riscv64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-5GQ6PFhh7E6jQm70p1aW05G2cap5zMOvO0se5JMecHeAdj5ZhWEHbJ4hiKpfi1nnnEdTauDXxPgXae/mqjow9w==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-riscv64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-N/euLsBd1rekWcuduakTo/dJw6U6sBP3eUq+RXM9RNfPuWTvG2w/WObDkIvJ2KChy6oxZmOSC08Ak2OJA0UiAA==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-s390x-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-2l9sA7d7QdikL0xQwNMO3xURBUNEWyHVHfAsHsUdq+E/pgLTUcCE+gih5PCdmyHmfTDeXUWVhqL0WZzg0nua3g==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-x64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-XZdD3fEEQcwG2KrJDdEQu7NrHonPxxaV0/w2HpvINBdcqebz1aL+0vM2WFJq4DeiAVT6F5SUQas65HY5JDqoPw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-x64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-7ayfgvtmmWgKWBkCGg5+xTQ0r5V1owVm67zTrsEY1008L5ro7mCyGYORomARt/OquB9KY7LpxVBZes+oSniAAQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-arm64-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-B+IJgcBnE2bm93jEW5kHisqvPITs4ddLOROAcOc/diBgrEiQJJ6Qcjby75rFSmH5eMGrqJryUgJDhrfj942apQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-ia32-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-+CXwwG66g0/FpWOnP/v1HnrGVSOygK/osUbu3wPRy8ECXjoYKjRAyfxYpDQOfghC5qPJYLPH0oN4MCOjwgdMug==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-x64-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-SRf1cytG7wqcHVLrBc9VtPK4pU5wxiB/lNIkNmW2ApKXIg+RpqwHfsaEK+e7eH4A1BpI6BX/aBWXxZCIrJg3uA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@sinclair/typebox\": {\n \"version\": \"0.27.8\",\n \"resolved\": \"https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz\",\n \"integrity\": \"sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@tanstack/react-store\": {\n \"version\": \"0.7.3\",\n \"resolved\": \"https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.7.3.tgz\",\n \"integrity\": \"sha512-3Dnqtbw9P2P0gw8uUM8WP2fFfg8XMDSZCTsywRPZe/XqqYW8PGkXKZTvP0AHkE4mpqP9Y43GpOg9vwO44azu6Q==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@tanstack/store\": \"0.7.2\",\n \"use-sync-external-store\": \"^1.5.0\"\n },\n \"funding\": {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/tannerlinsley\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\",\n \"react-dom\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\"\n }\n },\n \"node_modules/@tanstack/store\": {\n \"version\": \"0.7.2\",\n \"resolved\": \"https://registry.npmjs.org/@tanstack/store/-/store-0.7.2.tgz\",\n \"integrity\": \"sha512-RP80Z30BYiPX2Pyo0Nyw4s1SJFH2jyM6f9i3HfX4pA+gm5jsnYryscdq2aIQLnL4TaGuQMO+zXmN9nh1Qck+Pg==\",\n \"license\": \"MIT\",\n \"funding\": {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/tannerlinsley\"\n }\n },\n \"node_modules/@types/babel__core\": {\n \"version\": \"7.20.5\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz\",\n \"integrity\": \"sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.20.7\",\n \"@babel/types\": \"^7.20.7\",\n \"@types/babel__generator\": \"*\",\n \"@types/babel__template\": \"*\",\n \"@types/babel__traverse\": \"*\"\n }\n },\n \"node_modules/@types/babel__generator\": {\n \"version\": \"7.27.0\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz\",\n \"integrity\": \"sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.0.0\"\n }\n },\n \"node_modules/@types/babel__template\": {\n \"version\": \"7.4.4\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz\",\n \"integrity\": \"sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.1.0\",\n \"@babel/types\": \"^7.0.0\"\n }\n },\n \"node_modules/@types/babel__traverse\": {\n \"version\": \"7.20.7\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz\",\n \"integrity\": \"sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.20.7\"\n }\n },\n \"node_modules/@types/estree\": {\n \"version\": \"1.0.8\",\n \"resolved\": \"https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz\",\n \"integrity\": \"sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@types/node\": {\n \"version\": \"20.19.7\",\n \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-20.19.7.tgz\",\n \"integrity\": \"sha512-1GM9z6BJOv86qkPvzh2i6VW5+VVrXxCLknfmTkWEqz+6DqosiY28XUWCTmBcJ0ACzKqx/iwdIREfo1fwExIlkA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"undici-types\": \"~6.21.0\"\n }\n },\n \"node_modules/@types/prop-types\": {\n \"version\": \"15.7.15\",\n \"resolved\": \"https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz\",\n \"integrity\": \"sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@types/react\": {\n \"version\": \"18.3.23\",\n \"resolved\": \"https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz\",\n \"integrity\": \"sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/prop-types\": \"*\",\n \"csstype\": \"^3.0.2\"\n }\n },\n \"node_modules/@types/react-dom\": {\n \"version\": \"18.3.7\",\n \"resolved\": \"https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz\",\n \"integrity\": \"sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"peerDependencies\": {\n \"@types/react\": \"^18.0.0\"\n }\n },\n \"node_modules/@types/retry\": {\n \"version\": \"0.12.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz\",\n \"integrity\": \"sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==\",\n \"license\": \"MIT\",\n \"peer\": true\n },\n \"node_modules/@vitejs/plugin-react\": {\n \"version\": \"4.6.0\",\n \"resolved\": \"https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.6.0.tgz\",\n \"integrity\": \"sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/core\": \"^7.27.4\",\n \"@babel/plugin-transform-react-jsx-self\": \"^7.27.1\",\n \"@babel/plugin-transform-react-jsx-source\": \"^7.27.1\",\n \"@rolldown/pluginutils\": \"1.0.0-beta.19\",\n \"@types/babel__core\": \"^7.20.5\",\n \"react-refresh\": \"^0.17.0\"\n },\n \"engines\": {\n \"node\": \"^14.18.0 || >=16.0.0\"\n },\n \"peerDependencies\": {\n \"vite\": \"^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0\"\n }\n },\n \"node_modules/@vitest/expect\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/expect/-/expect-1.6.1.tgz\",\n \"integrity\": \"sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/spy\": \"1.6.1\",\n \"@vitest/utils\": \"1.6.1\",\n \"chai\": \"^4.3.10\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/runner\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/runner/-/runner-1.6.1.tgz\",\n \"integrity\": \"sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/utils\": \"1.6.1\",\n \"p-limit\": \"^5.0.0\",\n \"pathe\": \"^1.1.1\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/snapshot\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.1.tgz\",\n \"integrity\": \"sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"magic-string\": \"^0.30.5\",\n \"pathe\": \"^1.1.1\",\n \"pretty-format\": \"^29.7.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/spy\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/spy/-/spy-1.6.1.tgz\",\n \"integrity\": \"sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"tinyspy\": \"^2.2.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/utils\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/utils/-/utils-1.6.1.tgz\",\n \"integrity\": \"sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"diff-sequences\": \"^29.6.3\",\n \"estree-walker\": \"^3.0.3\",\n \"loupe\": \"^2.3.7\",\n \"pretty-format\": \"^29.7.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/acorn\": {\n \"version\": \"8.15.0\",\n \"resolved\": \"https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz\",\n \"integrity\": \"sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"acorn\": \"bin/acorn\"\n },\n \"engines\": {\n \"node\": \">=0.4.0\"\n }\n },\n \"node_modules/acorn-walk\": {\n \"version\": \"8.3.4\",\n \"resolved\": \"https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz\",\n \"integrity\": \"sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"acorn\": \"^8.11.0\"\n },\n \"engines\": {\n \"node\": \">=0.4.0\"\n }\n },\n \"node_modules/ansi-regex\": {\n \"version\": \"5.0.1\",\n \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/ansi-styles\": {\n \"version\": \"4.3.0\",\n \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\n \"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"color-convert\": \"^2.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n }\n },\n \"node_modules/assertion-error\": {\n \"version\": \"1.1.0\",\n \"resolved\": \"https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz\",\n \"integrity\": \"sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \"*\"\n }\n },\n \"node_modules/browserslist\": {\n \"version\": \"4.25.1\",\n \"resolved\": \"https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz\",\n \"integrity\": \"sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"caniuse-lite\": \"^1.0.30001726\",\n \"electron-to-chromium\": \"^1.5.173\",\n \"node-releases\": \"^2.0.19\",\n \"update-browserslist-db\": \"^1.1.3\"\n },\n \"bin\": {\n \"browserslist\": \"cli.js\"\n },\n \"engines\": {\n \"node\": \"^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7\"\n }\n },\n \"node_modules/cac\": {\n \"version\": \"6.7.14\",\n \"resolved\": \"https://registry.npmjs.org/cac/-/cac-6.7.14.tgz\",\n \"integrity\": \"sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/caniuse-lite\": {\n \"version\": \"1.0.30001727\",\n \"resolved\": \"https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz\",\n \"integrity\": \"sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/caniuse-lite\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"CC-BY-4.0\"\n },\n \"node_modules/cbor-extract\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/cbor-extract/-/cbor-extract-2.2.0.tgz\",\n \"integrity\": \"sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==\",\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"peer\": true,\n \"dependencies\": {\n \"node-gyp-build-optional-packages\": \"5.1.1\"\n },\n \"bin\": {\n \"download-cbor-prebuilds\": \"bin/download-prebuilds.js\"\n },\n \"optionalDependencies\": {\n \"@cbor-extract/cbor-extract-darwin-arm64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-darwin-x64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-arm\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-arm64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-x64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-win32-x64\": \"2.2.0\"\n }\n },\n \"node_modules/cbor-x\": {\n \"version\": \"1.6.0\",\n \"resolved\": \"https://registry.npmjs.org/cbor-x/-/cbor-x-1.6.0.tgz\",\n \"integrity\": \"sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"optionalDependencies\": {\n \"cbor-extract\": \"^2.2.0\"\n }\n },\n \"node_modules/chai\": {\n \"version\": \"4.5.0\",\n \"resolved\": \"https://registry.npmjs.org/chai/-/chai-4.5.0.tgz\",\n \"integrity\": \"sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"assertion-error\": \"^1.1.0\",\n \"check-error\": \"^1.0.3\",\n \"deep-eql\": \"^4.1.3\",\n \"get-func-name\": \"^2.0.2\",\n \"loupe\": \"^2.3.6\",\n \"pathval\": \"^1.1.1\",\n \"type-detect\": \"^4.1.0\"\n },\n \"engines\": {\n \"node\": \">=4\"\n }\n },\n \"node_modules/chalk\": {\n \"version\": \"4.1.2\",\n \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz\",\n \"integrity\": \"sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-styles\": \"^4.1.0\",\n \"supports-color\": \"^7.1.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/chalk?sponsor=1\"\n }\n },\n \"node_modules/chalk/node_modules/supports-color\": {\n \"version\": \"7.2.0\",\n \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz\",\n \"integrity\": \"sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"has-flag\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/check-error\": {\n \"version\": \"1.0.3\",\n \"resolved\": \"https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz\",\n \"integrity\": \"sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"get-func-name\": \"^2.0.2\"\n },\n \"engines\": {\n \"node\": \"*\"\n }\n },\n \"node_modules/cliui\": {\n \"version\": \"8.0.1\",\n \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz\",\n \"integrity\": \"sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"dependencies\": {\n \"string-width\": \"^4.2.0\",\n \"strip-ansi\": \"^6.0.1\",\n \"wrap-ansi\": \"^7.0.0\"\n },\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/color-convert\": {\n \"version\": \"2.0.1\",\n \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\n \"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"color-name\": \"~1.1.4\"\n },\n \"engines\": {\n \"node\": \">=7.0.0\"\n }\n },\n \"node_modules/color-name\": {\n \"version\": \"1.1.4\",\n \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\n \"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/concurrently\": {\n \"version\": \"8.2.2\",\n \"resolved\": \"https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz\",\n \"integrity\": \"sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"chalk\": \"^4.1.2\",\n \"date-fns\": \"^2.30.0\",\n \"lodash\": \"^4.17.21\",\n \"rxjs\": \"^7.8.1\",\n \"shell-quote\": \"^1.8.1\",\n \"spawn-command\": \"0.0.2\",\n \"supports-color\": \"^8.1.1\",\n \"tree-kill\": \"^1.2.2\",\n \"yargs\": \"^17.7.2\"\n },\n \"bin\": {\n \"conc\": \"dist/bin/concurrently.js\",\n \"concurrently\": \"dist/bin/concurrently.js\"\n },\n \"engines\": {\n \"node\": \"^14.13.0 || >=16.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/open-cli-tools/concurrently?sponsor=1\"\n }\n },\n \"node_modules/confbox\": {\n \"version\": \"0.1.8\",\n \"resolved\": \"https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz\",\n \"integrity\": \"sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/convert-source-map\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz\",\n \"integrity\": \"sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/cross-spawn\": {\n \"version\": \"7.0.6\",\n \"resolved\": \"https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz\",\n \"integrity\": \"sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"path-key\": \"^3.1.0\",\n \"shebang-command\": \"^2.0.0\",\n \"which\": \"^2.0.1\"\n },\n \"engines\": {\n \"node\": \">= 8\"\n }\n },\n \"node_modules/csstype\": {\n \"version\": \"3.1.3\",\n \"resolved\": \"https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz\",\n \"integrity\": \"sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/date-fns\": {\n \"version\": \"2.30.0\",\n \"resolved\": \"https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz\",\n \"integrity\": \"sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.21.0\"\n },\n \"engines\": {\n \"node\": \">=0.11\"\n },\n \"funding\": {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/date-fns\"\n }\n },\n \"node_modules/debug\": {\n \"version\": \"4.4.1\",\n \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.4.1.tgz\",\n \"integrity\": \"sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ms\": \"^2.1.3\"\n },\n \"engines\": {\n \"node\": \">=6.0\"\n },\n \"peerDependenciesMeta\": {\n \"supports-color\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/deep-eql\": {\n \"version\": \"4.1.4\",\n \"resolved\": \"https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz\",\n \"integrity\": \"sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"type-detect\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/detect-libc\": {\n \"version\": \"2.0.4\",\n \"resolved\": \"https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz\",\n \"integrity\": \"sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==\",\n \"license\": \"Apache-2.0\",\n \"optional\": true,\n \"peer\": true,\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/diff-sequences\": {\n \"version\": \"29.6.3\",\n \"resolved\": \"https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz\",\n \"integrity\": \"sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n }\n },\n \"node_modules/electron-to-chromium\": {\n \"version\": \"1.5.183\",\n \"resolved\": \"https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.183.tgz\",\n \"integrity\": \"sha512-vCrDBYjQCAEefWGjlK3EpoSKfKbT10pR4XXPdn65q7snuNOZnthoVpBfZPykmDapOKfoD+MMIPG8ZjKyyc9oHA==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/emoji-regex\": {\n \"version\": \"8.0.0\",\n \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/esbuild\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.25.6.tgz\",\n \"integrity\": \"sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"esbuild\": \"bin/esbuild\"\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"optionalDependencies\": {\n \"@esbuild/aix-ppc64\": \"0.25.6\",\n \"@esbuild/android-arm\": \"0.25.6\",\n \"@esbuild/android-arm64\": \"0.25.6\",\n \"@esbuild/android-x64\": \"0.25.6\",\n \"@esbuild/darwin-arm64\": \"0.25.6\",\n \"@esbuild/darwin-x64\": \"0.25.6\",\n \"@esbuild/freebsd-arm64\": \"0.25.6\",\n \"@esbuild/freebsd-x64\": \"0.25.6\",\n \"@esbuild/linux-arm\": \"0.25.6\",\n \"@esbuild/linux-arm64\": \"0.25.6\",\n \"@esbuild/linux-ia32\": \"0.25.6\",\n \"@esbuild/linux-loong64\": \"0.25.6\",\n \"@esbuild/linux-mips64el\": \"0.25.6\",\n \"@esbuild/linux-ppc64\": \"0.25.6\",\n \"@esbuild/linux-riscv64\": \"0.25.6\",\n \"@esbuild/linux-s390x\": \"0.25.6\",\n \"@esbuild/linux-x64\": \"0.25.6\",\n \"@esbuild/netbsd-arm64\": \"0.25.6\",\n \"@esbuild/netbsd-x64\": \"0.25.6\",\n \"@esbuild/openbsd-arm64\": \"0.25.6\",\n \"@esbuild/openbsd-x64\": \"0.25.6\",\n \"@esbuild/openharmony-arm64\": \"0.25.6\",\n \"@esbuild/sunos-x64\": \"0.25.6\",\n \"@esbuild/win32-arm64\": \"0.25.6\",\n \"@esbuild/win32-ia32\": \"0.25.6\",\n \"@esbuild/win32-x64\": \"0.25.6\"\n }\n },\n \"node_modules/escalade\": {\n \"version\": \"3.2.0\",\n \"resolved\": \"https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz\",\n \"integrity\": \"sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/estree-walker\": {\n \"version\": \"3.0.3\",\n \"resolved\": \"https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz\",\n \"integrity\": \"sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/estree\": \"^1.0.0\"\n }\n },\n \"node_modules/execa\": {\n \"version\": \"8.0.1\",\n \"resolved\": \"https://registry.npmjs.org/execa/-/execa-8.0.1.tgz\",\n \"integrity\": \"sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"cross-spawn\": \"^7.0.3\",\n \"get-stream\": \"^8.0.1\",\n \"human-signals\": \"^5.0.0\",\n \"is-stream\": \"^3.0.0\",\n \"merge-stream\": \"^2.0.0\",\n \"npm-run-path\": \"^5.1.0\",\n \"onetime\": \"^6.0.0\",\n \"signal-exit\": \"^4.1.0\",\n \"strip-final-newline\": \"^3.0.0\"\n },\n \"engines\": {\n \"node\": \">=16.17\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sindresorhus/execa?sponsor=1\"\n }\n },\n \"node_modules/fsevents\": {\n \"version\": \"2.3.3\",\n \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz\",\n \"integrity\": \"sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n }\n },\n \"node_modules/gensync\": {\n \"version\": \"1.0.0-beta.2\",\n \"resolved\": \"https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz\",\n \"integrity\": \"sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/get-caller-file\": {\n \"version\": \"2.0.5\",\n \"resolved\": \"https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz\",\n \"integrity\": \"sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \"6.* || 8.* || >= 10.*\"\n }\n },\n \"node_modules/get-func-name\": {\n \"version\": \"2.0.2\",\n \"resolved\": \"https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz\",\n \"integrity\": \"sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \"*\"\n }\n },\n \"node_modules/get-stream\": {\n \"version\": \"8.0.1\",\n \"resolved\": \"https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz\",\n \"integrity\": \"sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=16\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/get-tsconfig\": {\n \"version\": \"4.10.1\",\n \"resolved\": \"https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz\",\n \"integrity\": \"sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"resolve-pkg-maps\": \"^1.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/privatenumber/get-tsconfig?sponsor=1\"\n }\n },\n \"node_modules/has-flag\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz\",\n \"integrity\": \"sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/human-signals\": {\n \"version\": \"5.0.0\",\n \"resolved\": \"https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz\",\n \"integrity\": \"sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"engines\": {\n \"node\": \">=16.17.0\"\n }\n },\n \"node_modules/invariant\": {\n \"version\": \"2.2.4\",\n \"resolved\": \"https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz\",\n \"integrity\": \"sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"dependencies\": {\n \"loose-envify\": \"^1.0.0\"\n }\n },\n \"node_modules/is-fullwidth-code-point\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz\",\n \"integrity\": \"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/is-network-error\": {\n \"version\": \"1.1.0\",\n \"resolved\": \"https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz\",\n \"integrity\": \"sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">=16\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/is-stream\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz\",\n \"integrity\": \"sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/isexe\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz\",\n \"integrity\": \"sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/js-tokens\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz\",\n \"integrity\": \"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==\",\n \"license\": \"MIT\"\n },\n \"node_modules/jsesc\": {\n \"version\": \"3.1.0\",\n \"resolved\": \"https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz\",\n \"integrity\": \"sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"jsesc\": \"bin/jsesc\"\n },\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/json5\": {\n \"version\": \"2.2.3\",\n \"resolved\": \"https://registry.npmjs.org/json5/-/json5-2.2.3.tgz\",\n \"integrity\": \"sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"json5\": \"lib/cli.js\"\n },\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/local-pkg\": {\n \"version\": \"0.5.1\",\n \"resolved\": \"https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz\",\n \"integrity\": \"sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"mlly\": \"^1.7.3\",\n \"pkg-types\": \"^1.2.1\"\n },\n \"engines\": {\n \"node\": \">=14\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/antfu\"\n }\n },\n \"node_modules/lodash\": {\n \"version\": \"4.17.21\",\n \"resolved\": \"https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz\",\n \"integrity\": \"sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/loose-envify\": {\n \"version\": \"1.4.0\",\n \"resolved\": \"https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz\",\n \"integrity\": \"sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"js-tokens\": \"^3.0.0 || ^4.0.0\"\n },\n \"bin\": {\n \"loose-envify\": \"cli.js\"\n }\n },\n \"node_modules/loupe\": {\n \"version\": \"2.3.7\",\n \"resolved\": \"https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz\",\n \"integrity\": \"sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"get-func-name\": \"^2.0.1\"\n }\n },\n \"node_modules/lru-cache\": {\n \"version\": \"5.1.1\",\n \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz\",\n \"integrity\": \"sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"dependencies\": {\n \"yallist\": \"^3.0.2\"\n }\n },\n \"node_modules/magic-string\": {\n \"version\": \"0.30.17\",\n \"resolved\": \"https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz\",\n \"integrity\": \"sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/sourcemap-codec\": \"^1.5.0\"\n }\n },\n \"node_modules/merge-stream\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz\",\n \"integrity\": \"sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/mimic-fn\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz\",\n \"integrity\": \"sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=12\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/mlly\": {\n \"version\": \"1.7.4\",\n \"resolved\": \"https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz\",\n \"integrity\": \"sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"acorn\": \"^8.14.0\",\n \"pathe\": \"^2.0.1\",\n \"pkg-types\": \"^1.3.0\",\n \"ufo\": \"^1.5.4\"\n }\n },\n \"node_modules/mlly/node_modules/pathe\": {\n \"version\": \"2.0.3\",\n \"resolved\": \"https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz\",\n \"integrity\": \"sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/ms\": {\n \"version\": \"2.1.3\",\n \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz\",\n \"integrity\": \"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/nanoid\": {\n \"version\": \"3.3.11\",\n \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz\",\n \"integrity\": \"sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"bin\": {\n \"nanoid\": \"bin/nanoid.cjs\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || ^13.7 || ^14 || >=15.0.1\"\n }\n },\n \"node_modules/node-gyp-build-optional-packages\": {\n \"version\": \"5.1.1\",\n \"resolved\": \"https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz\",\n \"integrity\": \"sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==\",\n \"license\": \"MIT\",\n \"optional\": true,\n \"peer\": true,\n \"dependencies\": {\n \"detect-libc\": \"^2.0.1\"\n },\n \"bin\": {\n \"node-gyp-build-optional-packages\": \"bin.js\",\n \"node-gyp-build-optional-packages-optional\": \"optional.js\",\n \"node-gyp-build-optional-packages-test\": \"build-test.js\"\n }\n },\n \"node_modules/node-releases\": {\n \"version\": \"2.0.19\",\n \"resolved\": \"https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz\",\n \"integrity\": \"sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/npm-run-path\": {\n \"version\": \"5.3.0\",\n \"resolved\": \"https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz\",\n \"integrity\": \"sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"path-key\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/npm-run-path/node_modules/path-key\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz\",\n \"integrity\": \"sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=12\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/on-change\": {\n \"version\": \"5.0.1\",\n \"resolved\": \"https://registry.npmjs.org/on-change/-/on-change-5.0.1.tgz\",\n \"integrity\": \"sha512-n7THCP7RkyReRSLkJb8kUWoNsxUIBxTkIp3JKno+sEz6o/9AJ3w3P9fzQkITEkMwyTKJjZciF3v/pVoouxZZMg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">=18\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sindresorhus/on-change?sponsor=1\"\n }\n },\n \"node_modules/onetime\": {\n \"version\": \"6.0.0\",\n \"resolved\": \"https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz\",\n \"integrity\": \"sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"mimic-fn\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/p-limit\": {\n \"version\": \"5.0.0\",\n \"resolved\": \"https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz\",\n \"integrity\": \"sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"yocto-queue\": \"^1.0.0\"\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/p-retry\": {\n \"version\": \"6.2.1\",\n \"resolved\": \"https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz\",\n \"integrity\": \"sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"dependencies\": {\n \"@types/retry\": \"0.12.2\",\n \"is-network-error\": \"^1.0.0\",\n \"retry\": \"^0.13.1\"\n },\n \"engines\": {\n \"node\": \">=16.17\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/path-key\": {\n \"version\": \"3.1.1\",\n \"resolved\": \"https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz\",\n \"integrity\": \"sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/pathe\": {\n \"version\": \"1.1.2\",\n \"resolved\": \"https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz\",\n \"integrity\": \"sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/pathval\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz\",\n \"integrity\": \"sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \"*\"\n }\n },\n \"node_modules/picocolors\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz\",\n \"integrity\": \"sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/pkg-types\": {\n \"version\": \"1.3.1\",\n \"resolved\": \"https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz\",\n \"integrity\": \"sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"confbox\": \"^0.1.8\",\n \"mlly\": \"^1.7.4\",\n \"pathe\": \"^2.0.1\"\n }\n },\n \"node_modules/pkg-types/node_modules/pathe\": {\n \"version\": \"2.0.3\",\n \"resolved\": \"https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz\",\n \"integrity\": \"sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/postcss\": {\n \"version\": \"8.5.6\",\n \"resolved\": \"https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz\",\n \"integrity\": \"sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/postcss/\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/postcss\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"nanoid\": \"^3.3.11\",\n \"picocolors\": \"^1.1.1\",\n \"source-map-js\": \"^1.2.1\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || >=14\"\n }\n },\n \"node_modules/pretty-format\": {\n \"version\": \"29.7.0\",\n \"resolved\": \"https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz\",\n \"integrity\": \"sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jest/schemas\": \"^29.6.3\",\n \"ansi-styles\": \"^5.0.0\",\n \"react-is\": \"^18.0.0\"\n },\n \"engines\": {\n \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n }\n },\n \"node_modules/pretty-format/node_modules/ansi-styles\": {\n \"version\": \"5.2.0\",\n \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz\",\n \"integrity\": \"sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n }\n },\n \"node_modules/react\": {\n \"version\": \"18.3.1\",\n \"resolved\": \"https://registry.npmjs.org/react/-/react-18.3.1.tgz\",\n \"integrity\": \"sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\"\n },\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/react-dom\": {\n \"version\": \"18.3.1\",\n \"resolved\": \"https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz\",\n \"integrity\": \"sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\",\n \"scheduler\": \"^0.23.2\"\n },\n \"peerDependencies\": {\n \"react\": \"^18.3.1\"\n }\n },\n \"node_modules/react-is\": {\n \"version\": \"18.3.1\",\n \"resolved\": \"https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz\",\n \"integrity\": \"sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/react-refresh\": {\n \"version\": \"0.17.0\",\n \"resolved\": \"https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz\",\n \"integrity\": \"sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/require-directory\": {\n \"version\": \"2.1.1\",\n \"resolved\": \"https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz\",\n \"integrity\": \"sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/resolve-pkg-maps\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz\",\n \"integrity\": \"sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"funding\": {\n \"url\": \"https://github.com/privatenumber/resolve-pkg-maps?sponsor=1\"\n }\n },\n \"node_modules/retry\": {\n \"version\": \"0.13.1\",\n \"resolved\": \"https://registry.npmjs.org/retry/-/retry-0.13.1.tgz\",\n \"integrity\": \"sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">= 4\"\n }\n },\n \"node_modules/rollup\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/rollup/-/rollup-4.45.0.tgz\",\n \"integrity\": \"sha512-WLjEcJRIo7i3WDDgOIJqVI2d+lAC3EwvOGy+Xfq6hs+GQuAA4Di/H72xmXkOhrIWFg2PFYSKZYfH0f4vfKXN4A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/estree\": \"1.0.8\"\n },\n \"bin\": {\n \"rollup\": \"dist/bin/rollup\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\",\n \"npm\": \">=8.0.0\"\n },\n \"optionalDependencies\": {\n \"@rollup/rollup-android-arm-eabi\": \"4.45.0\",\n \"@rollup/rollup-android-arm64\": \"4.45.0\",\n \"@rollup/rollup-darwin-arm64\": \"4.45.0\",\n \"@rollup/rollup-darwin-x64\": \"4.45.0\",\n \"@rollup/rollup-freebsd-arm64\": \"4.45.0\",\n \"@rollup/rollup-freebsd-x64\": \"4.45.0\",\n \"@rollup/rollup-linux-arm-gnueabihf\": \"4.45.0\",\n \"@rollup/rollup-linux-arm-musleabihf\": \"4.45.0\",\n \"@rollup/rollup-linux-arm64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-arm64-musl\": \"4.45.0\",\n \"@rollup/rollup-linux-loongarch64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-powerpc64le-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-riscv64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-riscv64-musl\": \"4.45.0\",\n \"@rollup/rollup-linux-s390x-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-x64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-x64-musl\": \"4.45.0\",\n \"@rollup/rollup-win32-arm64-msvc\": \"4.45.0\",\n \"@rollup/rollup-win32-ia32-msvc\": \"4.45.0\",\n \"@rollup/rollup-win32-x64-msvc\": \"4.45.0\",\n \"fsevents\": \"~2.3.2\"\n }\n },\n \"node_modules/rxjs\": {\n \"version\": \"7.8.2\",\n \"resolved\": \"https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz\",\n \"integrity\": \"sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"tslib\": \"^2.1.0\"\n }\n },\n \"node_modules/scheduler\": {\n \"version\": \"0.23.2\",\n \"resolved\": \"https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz\",\n \"integrity\": \"sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\"\n }\n },\n \"node_modules/semver\": {\n \"version\": \"6.3.1\",\n \"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n \"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"bin\": {\n \"semver\": \"bin/semver.js\"\n }\n },\n \"node_modules/shebang-command\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz\",\n \"integrity\": \"sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"shebang-regex\": \"^3.0.0\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/shebang-regex\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz\",\n \"integrity\": \"sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/shell-quote\": {\n \"version\": \"1.8.3\",\n \"resolved\": \"https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz\",\n \"integrity\": \"sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">= 0.4\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/ljharb\"\n }\n },\n \"node_modules/siginfo\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz\",\n \"integrity\": \"sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/signal-exit\": {\n \"version\": \"4.1.0\",\n \"resolved\": \"https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz\",\n \"integrity\": \"sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \">=14\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/isaacs\"\n }\n },\n \"node_modules/source-map-js\": {\n \"version\": \"1.2.1\",\n \"resolved\": \"https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz\",\n \"integrity\": \"sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==\",\n \"dev\": true,\n \"license\": \"BSD-3-Clause\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/spawn-command\": {\n \"version\": \"0.0.2\",\n \"resolved\": \"https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz\",\n \"integrity\": \"sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==\",\n \"dev\": true\n },\n \"node_modules/stackback\": {\n \"version\": \"0.0.2\",\n \"resolved\": \"https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz\",\n \"integrity\": \"sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/std-env\": {\n \"version\": \"3.9.0\",\n \"resolved\": \"https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz\",\n \"integrity\": \"sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/string-width\": {\n \"version\": \"4.2.3\",\n \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"emoji-regex\": \"^8.0.0\",\n \"is-fullwidth-code-point\": \"^3.0.0\",\n \"strip-ansi\": \"^6.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/strip-ansi\": {\n \"version\": \"6.0.1\",\n \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-regex\": \"^5.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/strip-final-newline\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz\",\n \"integrity\": \"sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=12\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/strip-literal\": {\n \"version\": \"2.1.1\",\n \"resolved\": \"https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz\",\n \"integrity\": \"sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"js-tokens\": \"^9.0.1\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/antfu\"\n }\n },\n \"node_modules/strip-literal/node_modules/js-tokens\": {\n \"version\": \"9.0.1\",\n \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz\",\n \"integrity\": \"sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/supports-color\": {\n \"version\": \"8.1.1\",\n \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz\",\n \"integrity\": \"sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"has-flag\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/supports-color?sponsor=1\"\n }\n },\n \"node_modules/tinybench\": {\n \"version\": \"2.9.0\",\n \"resolved\": \"https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz\",\n \"integrity\": \"sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/tinypool\": {\n \"version\": \"0.8.4\",\n \"resolved\": \"https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz\",\n \"integrity\": \"sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=14.0.0\"\n }\n },\n \"node_modules/tinyspy\": {\n \"version\": \"2.2.1\",\n \"resolved\": \"https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz\",\n \"integrity\": \"sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=14.0.0\"\n }\n },\n \"node_modules/tree-kill\": {\n \"version\": \"1.2.2\",\n \"resolved\": \"https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz\",\n \"integrity\": \"sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"tree-kill\": \"cli.js\"\n }\n },\n \"node_modules/tslib\": {\n \"version\": \"2.8.1\",\n \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz\",\n \"integrity\": \"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==\",\n \"dev\": true,\n \"license\": \"0BSD\"\n },\n \"node_modules/tsx\": {\n \"version\": \"4.20.3\",\n \"resolved\": \"https://registry.npmjs.org/tsx/-/tsx-4.20.3.tgz\",\n \"integrity\": \"sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"esbuild\": \"~0.25.0\",\n \"get-tsconfig\": \"^4.7.5\"\n },\n \"bin\": {\n \"tsx\": \"dist/cli.mjs\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"optionalDependencies\": {\n \"fsevents\": \"~2.3.3\"\n }\n },\n \"node_modules/type-detect\": {\n \"version\": \"4.1.0\",\n \"resolved\": \"https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz\",\n \"integrity\": \"sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=4\"\n }\n },\n \"node_modules/typescript\": {\n \"version\": \"5.8.3\",\n \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz\",\n \"integrity\": \"sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"bin\": {\n \"tsc\": \"bin/tsc\",\n \"tsserver\": \"bin/tsserver\"\n },\n \"engines\": {\n \"node\": \">=14.17\"\n }\n },\n \"node_modules/ufo\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz\",\n \"integrity\": \"sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/undici-types\": {\n \"version\": \"6.21.0\",\n \"resolved\": \"https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz\",\n \"integrity\": \"sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/update-browserslist-db\": {\n \"version\": \"1.1.3\",\n \"resolved\": \"https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz\",\n \"integrity\": \"sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"escalade\": \"^3.2.0\",\n \"picocolors\": \"^1.1.1\"\n },\n \"bin\": {\n \"update-browserslist-db\": \"cli.js\"\n },\n \"peerDependencies\": {\n \"browserslist\": \">= 4.21.0\"\n }\n },\n \"node_modules/use-sync-external-store\": {\n \"version\": \"1.5.0\",\n \"resolved\": \"https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz\",\n \"integrity\": \"sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==\",\n \"license\": \"MIT\",\n \"peerDependencies\": {\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\"\n }\n },\n \"node_modules/vite\": {\n \"version\": \"5.4.19\",\n \"resolved\": \"https://registry.npmjs.org/vite/-/vite-5.4.19.tgz\",\n \"integrity\": \"sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"esbuild\": \"^0.21.3\",\n \"postcss\": \"^8.4.43\",\n \"rollup\": \"^4.20.0\"\n },\n \"bin\": {\n \"vite\": \"bin/vite.js\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/vitejs/vite?sponsor=1\"\n },\n \"optionalDependencies\": {\n \"fsevents\": \"~2.3.3\"\n },\n \"peerDependencies\": {\n \"@types/node\": \"^18.0.0 || >=20.0.0\",\n \"less\": \"*\",\n \"lightningcss\": \"^1.21.0\",\n \"sass\": \"*\",\n \"sass-embedded\": \"*\",\n \"stylus\": \"*\",\n \"sugarss\": \"*\",\n \"terser\": \"^5.4.0\"\n },\n \"peerDependenciesMeta\": {\n \"@types/node\": {\n \"optional\": true\n },\n \"less\": {\n \"optional\": true\n },\n \"lightningcss\": {\n \"optional\": true\n },\n \"sass\": {\n \"optional\": true\n },\n \"sass-embedded\": {\n \"optional\": true\n },\n \"stylus\": {\n \"optional\": true\n },\n \"sugarss\": {\n \"optional\": true\n },\n \"terser\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/vite-node\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/vite-node/-/vite-node-1.6.1.tgz\",\n \"integrity\": \"sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"cac\": \"^6.7.14\",\n \"debug\": \"^4.3.4\",\n \"pathe\": \"^1.1.1\",\n \"picocolors\": \"^1.0.0\",\n \"vite\": \"^5.0.0\"\n },\n \"bin\": {\n \"vite-node\": \"vite-node.mjs\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/aix-ppc64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz\",\n \"integrity\": \"sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"aix\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-arm\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz\",\n \"integrity\": \"sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/darwin-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/darwin-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/freebsd-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/freebsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-arm\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz\",\n \"integrity\": \"sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-ia32\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz\",\n \"integrity\": \"sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-loong64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz\",\n \"integrity\": \"sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-mips64el\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz\",\n \"integrity\": \"sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==\",\n \"cpu\": [\n \"mips64el\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-ppc64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz\",\n \"integrity\": \"sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-riscv64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz\",\n \"integrity\": \"sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-s390x\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz\",\n \"integrity\": \"sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/netbsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"netbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/openbsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"openbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/sunos-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"sunos\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-ia32\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz\",\n \"integrity\": \"sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/esbuild\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz\",\n \"integrity\": \"sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"esbuild\": \"bin/esbuild\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"optionalDependencies\": {\n \"@esbuild/aix-ppc64\": \"0.21.5\",\n \"@esbuild/android-arm\": \"0.21.5\",\n \"@esbuild/android-arm64\": \"0.21.5\",\n \"@esbuild/android-x64\": \"0.21.5\",\n \"@esbuild/darwin-arm64\": \"0.21.5\",\n \"@esbuild/darwin-x64\": \"0.21.5\",\n \"@esbuild/freebsd-arm64\": \"0.21.5\",\n \"@esbuild/freebsd-x64\": \"0.21.5\",\n \"@esbuild/linux-arm\": \"0.21.5\",\n \"@esbuild/linux-arm64\": \"0.21.5\",\n \"@esbuild/linux-ia32\": \"0.21.5\",\n \"@esbuild/linux-loong64\": \"0.21.5\",\n \"@esbuild/linux-mips64el\": \"0.21.5\",\n \"@esbuild/linux-ppc64\": \"0.21.5\",\n \"@esbuild/linux-riscv64\": \"0.21.5\",\n \"@esbuild/linux-s390x\": \"0.21.5\",\n \"@esbuild/linux-x64\": \"0.21.5\",\n \"@esbuild/netbsd-x64\": \"0.21.5\",\n \"@esbuild/openbsd-x64\": \"0.21.5\",\n \"@esbuild/sunos-x64\": \"0.21.5\",\n \"@esbuild/win32-arm64\": \"0.21.5\",\n \"@esbuild/win32-ia32\": \"0.21.5\",\n \"@esbuild/win32-x64\": \"0.21.5\"\n }\n },\n \"node_modules/vitest\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/vitest/-/vitest-1.6.1.tgz\",\n \"integrity\": \"sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/expect\": \"1.6.1\",\n \"@vitest/runner\": \"1.6.1\",\n \"@vitest/snapshot\": \"1.6.1\",\n \"@vitest/spy\": \"1.6.1\",\n \"@vitest/utils\": \"1.6.1\",\n \"acorn-walk\": \"^8.3.2\",\n \"chai\": \"^4.3.10\",\n \"debug\": \"^4.3.4\",\n \"execa\": \"^8.0.1\",\n \"local-pkg\": \"^0.5.0\",\n \"magic-string\": \"^0.30.5\",\n \"pathe\": \"^1.1.1\",\n \"picocolors\": \"^1.0.0\",\n \"std-env\": \"^3.5.0\",\n \"strip-literal\": \"^2.0.0\",\n \"tinybench\": \"^2.5.1\",\n \"tinypool\": \"^0.8.3\",\n \"vite\": \"^5.0.0\",\n \"vite-node\": \"1.6.1\",\n \"why-is-node-running\": \"^2.2.2\"\n },\n \"bin\": {\n \"vitest\": \"vitest.mjs\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n },\n \"peerDependencies\": {\n \"@edge-runtime/vm\": \"*\",\n \"@types/node\": \"^18.0.0 || >=20.0.0\",\n \"@vitest/browser\": \"1.6.1\",\n \"@vitest/ui\": \"1.6.1\",\n \"happy-dom\": \"*\",\n \"jsdom\": \"*\"\n },\n \"peerDependenciesMeta\": {\n \"@edge-runtime/vm\": {\n \"optional\": true\n },\n \"@types/node\": {\n \"optional\": true\n },\n \"@vitest/browser\": {\n \"optional\": true\n },\n \"@vitest/ui\": {\n \"optional\": true\n },\n \"happy-dom\": {\n \"optional\": true\n },\n \"jsdom\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/which\": {\n \"version\": \"2.0.2\",\n \"resolved\": \"https://registry.npmjs.org/which/-/which-2.0.2.tgz\",\n \"integrity\": \"sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"dependencies\": {\n \"isexe\": \"^2.0.0\"\n },\n \"bin\": {\n \"node-which\": \"bin/node-which\"\n },\n \"engines\": {\n \"node\": \">= 8\"\n }\n },\n \"node_modules/why-is-node-running\": {\n \"version\": \"2.3.0\",\n \"resolved\": \"https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz\",\n \"integrity\": \"sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"siginfo\": \"^2.0.0\",\n \"stackback\": \"0.0.2\"\n },\n \"bin\": {\n \"why-is-node-running\": \"cli.js\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/wrap-ansi\": {\n \"version\": \"7.0.0\",\n \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\n \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-styles\": \"^4.0.0\",\n \"string-width\": \"^4.1.0\",\n \"strip-ansi\": \"^6.0.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n }\n },\n \"node_modules/y18n\": {\n \"version\": \"5.0.8\",\n \"resolved\": \"https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz\",\n \"integrity\": \"sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \">=10\"\n }\n },\n \"node_modules/yallist\": {\n \"version\": \"3.1.1\",\n \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz\",\n \"integrity\": \"sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/yargs\": {\n \"version\": \"17.7.2\",\n \"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz\",\n \"integrity\": \"sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"cliui\": \"^8.0.1\",\n \"escalade\": \"^3.1.1\",\n \"get-caller-file\": \"^2.0.5\",\n \"require-directory\": \"^2.1.1\",\n \"string-width\": \"^4.2.3\",\n \"y18n\": \"^5.0.5\",\n \"yargs-parser\": \"^21.1.1\"\n },\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/yargs-parser\": {\n \"version\": \"21.1.1\",\n \"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz\",\n \"integrity\": \"sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/yocto-queue\": {\n \"version\": \"1.2.1\",\n \"resolved\": \"https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz\",\n \"integrity\": \"sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=12.20\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/zod\": {\n \"version\": \"3.25.76\",\n \"resolved\": \"https://registry.npmjs.org/zod/-/zod-3.25.76.tgz\",\n \"integrity\": \"sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"funding\": {\n \"url\": \"https://github.com/sponsors/colinhacks\"\n }\n }\n }\n}\n", "package.json": "{\n \"name\": \"example-tenant\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"concurrently \\\"tsx --watch src/backend/server.ts\\\" \\\"vite\\\"\",\n \"build\": \"vite build\",\n \"preview\": \"vite preview\",\n \"check-types\": \"tsc --noEmit\",\n \"test\": \"vitest\"\n },\n \"dependencies\": {\n \"rivetkit\": \"^0.9.1\",\n \"@rivetkit/react\": \"^0.9.1\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^20.0.0\",\n \"@types/react\": \"^18.2.0\",\n \"@types/react-dom\": \"^18.2.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"concurrently\": \"^8.2.0\",\n \"tsx\": \"^4.0.0\",\n \"typescript\": \"^5.0.0\",\n \"vite\": \"^5.0.0\",\n \"vitest\": \"^1.0.0\"\n }\n}\n", "tsconfig.json": "{\n \"compilerOptions\": {\n \"target\": \"ES2020\",\n \"lib\": [\"ES2020\", \"DOM\", \"DOM.Iterable\"],\n \"module\": \"ESNext\",\n \"skipLibCheck\": true,\n \"moduleResolution\": \"bundler\",\n \"allowImportingTsExtensions\": true,\n \"resolveJsonModule\": true,\n \"isolatedModules\": true,\n \"noEmit\": true,\n \"jsx\": \"react-jsx\",\n \"strict\": true,\n \"noUnusedLocals\": true,\n \"noUnusedParameters\": true,\n \"noFallthroughCasesInSwitch\": true\n },\n \"include\": [\"src\", \"tests\"],\n \"exclude\": [\"node_modules\", \"dist\"]\n}\n", @@ -206,7 +206,7 @@ export const examples: ExampleData[] = [ "src/frontend/App.tsx": "import { createClient, createRivetKit } from \"@rivetkit/react\";\nimport { useEffect, useState } from \"react\";\nimport type { Member, Invoice, registry } from \"../backend/registry\";\n\nconst client = createClient(\"http://localhost:8080\");\nconst { useActor } = createRivetKit(client);\n\nconst ORG_ID = \"org-1\";\n\nexport function App() {\n\t// Authentication state\n\tconst [token, setToken] = useState(\"\");\n\tconst [currentUser, setCurrentUser] = useState(null);\n\t\n\t// Data state\n\tconst [organization, setOrganization] = useState(null);\n\tconst [members, setMembers] = useState([]);\n\tconst [invoices, setInvoices] = useState([]);\n\tconst [dashboardStats, setDashboardStats] = useState(null);\n\tconst [error, setError] = useState(\"\");\n\tconst [loading, setLoading] = useState(false);\n\n\t// Connect to tenant actor with authentication token\n\tconst tenant = useActor({\n\t\tname: \"tenant\",\n\t\tkey: [ORG_ID],\n\t\tparams: { token },\n\t});\n\n\t// Login functions\n\tconst loginAsAdmin = () => {\n\t\tsetToken(\"auth:user-1\"); // Alice is admin\n\t\tsetError(\"\");\n\t};\n\n\tconst loginAsMember = () => {\n\t\tsetToken(\"auth:user-2\"); // Bob is member\n\t\tsetError(\"\");\n\t};\n\n\tconst loginAsCharlie = () => {\n\t\tsetToken(\"auth:user-3\"); // Charlie is member\n\t\tsetError(\"\");\n\t};\n\n\tconst logout = () => {\n\t\tsetToken(\"\");\n\t\tsetCurrentUser(null);\n\t\tsetOrganization(null);\n\t\tsetMembers([]);\n\t\tsetInvoices([]);\n\t\tsetDashboardStats(null);\n\t\tsetError(\"\");\n\t};\n\n\t// Load data when actor is available\n\tuseEffect(() => {\n\t\tif (!tenant.connection || !token) return;\n\n\t\tconst loadData = async () => {\n\t\t\tsetLoading(true);\n\t\t\ttry {\n\t\t\t\t// Get current user info\n\t\t\t\tconst user = await tenant.connection!.getCurrentUser();\n\t\t\t\tsetCurrentUser(user);\n\n\t\t\t\t// Get organization info\n\t\t\t\tconst org = await tenant.connection!.getOrganization();\n\t\t\t\tsetOrganization(org);\n\n\t\t\t\t// Get members (available to all users)\n\t\t\t\tconst membersList = await tenant.connection!.getMembers();\n\t\t\t\tsetMembers(membersList);\n\n\t\t\t\t// Get dashboard stats\n\t\t\t\tconst stats = await tenant.connection!.getDashboardStats();\n\t\t\t\tsetDashboardStats(stats);\n\n\t\t\t\t// Try to get invoices (only available to admins)\n\t\t\t\ttry {\n\t\t\t\t\tconst invoicesList = await tenant.connection!.getInvoices();\n\t\t\t\t\tsetInvoices(invoicesList);\n\t\t\t\t\tsetError(\"\");\n\t\t\t\t} catch (err: any) {\n\t\t\t\t\tsetError(err.message || \"Failed to load invoices\");\n\t\t\t\t\tsetInvoices([]);\n\t\t\t\t}\n\t\t\t} catch (err: any) {\n\t\t\t\tsetError(err.message || \"Failed to load data\");\n\t\t\t} finally {\n\t\t\t\tsetLoading(false);\n\t\t\t}\n\t\t};\n\n\t\tloadData();\n\t}, [tenant.connection, token]);\n\n\t// Listen for real-time updates\n\ttenant.useEvent(\"memberAdded\", ({ member }: { member: Member }) => {\n\t\tsetMembers(prev => [...prev, member]);\n\t});\n\n\ttenant.useEvent(\"memberUpdated\", ({ member }: { member: Member }) => {\n\t\tsetMembers(prev => prev.map(m => m.id === member.id ? member : m));\n\t});\n\n\ttenant.useEvent(\"invoiceUpdated\", ({ invoice }: { invoice: Invoice }) => {\n\t\tsetInvoices(prev => prev.map(inv => inv.id === invoice.id ? invoice : inv));\n\t});\n\n\t// Admin functions\n\tconst markInvoicePaid = async (invoiceId: string) => {\n\t\tif (!tenant.connection) return;\n\t\t\n\t\ttry {\n\t\t\tawait tenant.connection.markInvoicePaid(invoiceId);\n\t\t\tsetError(\"\");\n\t\t} catch (err: any) {\n\t\t\tsetError(err.message || \"Failed to mark invoice as paid\");\n\t\t}\n\t};\n\n\tconst addMember = async () => {\n\t\tif (!tenant.connection) return;\n\t\t\n\t\tconst name = prompt(\"Enter member name:\");\n\t\tconst email = prompt(\"Enter member email:\");\n\t\t\n\t\tif (!name || !email) return;\n\t\t\n\t\ttry {\n\t\t\tawait tenant.connection.addMember({\n\t\t\t\tname,\n\t\t\t\temail,\n\t\t\t\trole: \"member\",\n\t\t\t});\n\t\t\tsetError(\"\");\n\t\t} catch (err: any) {\n\t\t\tsetError(err.message || \"Failed to add member\");\n\t\t}\n\t};\n\n\tconst updateMemberRole = async (memberId: string, currentRole: string) => {\n\t\tif (!tenant.connection) return;\n\t\t\n\t\tconst newRole = currentRole === \"admin\" ? \"member\" : \"admin\";\n\t\t\n\t\ttry {\n\t\t\tawait tenant.connection.updateMemberRole(memberId, newRole);\n\t\t\tsetError(\"\");\n\t\t} catch (err: any) {\n\t\t\tsetError(err.message || \"Failed to update member role\");\n\t\t}\n\t};\n\n\t// Login screen when not authenticated\n\tif (!token) {\n\t\treturn (\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t

Organization Dashboard

\n\t\t\t\t\t

Multi-tenant role-based access control with RivetKit

\n\t\t\t\t
\n\n\t\t\t\t
\n\t\t\t\t\t

How it works

\n\t\t\t\t\t

\n\t\t\t\t\t\tThis tenant system demonstrates role-based access control in a multi-tenant environment. \n\t\t\t\t\t\tDifferent user roles have different permissions - admins can access invoices and manage members, \n\t\t\t\t\t\twhile regular members can only view member information.\n\t\t\t\t\t

\n\t\t\t\t
\n\n\t\t\t\t
\n\t\t\t\t\t

Choose a User to Login

\n\t\t\t\t\t

Select a user to see different permission levels:

\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t);\n\t}\n\n\treturn (\n\t\t
\n\t\t\t
\n\t\t\t\t

Organization Dashboard

\n\t\t\t\t

Multi-tenant role-based access control with RivetKit

\n\t\t\t
\n\n\t\t\t{/* User Info */}\n\t\t\t{currentUser && (\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\tLogged in as: {currentUser.name}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{currentUser.role}\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t)}\n\n\t\t\t{/* Organization Header */}\n\t\t\t{organization && (\n\t\t\t\t
\n\t\t\t\t\t

{organization.name}

\n\t\t\t\t\t

Organization ID: {organization.id} • {organization.memberCount} members

\n\t\t\t\t
\n\t\t\t)}\n\n\t\t\t{/* Loading State */}\n\t\t\t{loading &&
Loading...
}\n\n\t\t\t{/* Error Display */}\n\t\t\t{error && (\n\t\t\t\t
\n\t\t\t\t\t

Access Denied

\n\t\t\t\t\t

{error}

\n\t\t\t\t
\n\t\t\t)}\n\n\t\t\t{/* Dashboard Stats */}\n\t\t\t{dashboardStats && (\n\t\t\t\t
\n\t\t\t\t\t

Dashboard Statistics

\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t{dashboardStats.totalMembers}\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
Total Members
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t{dashboardStats.adminCount}\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
Admins
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t{dashboardStats.memberCount}\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
Members
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t{dashboardStats.totalRevenue !== undefined && (\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t${dashboardStats.totalRevenue.toFixed(2)}\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t
Total Revenue
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t)}\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t)}\n\n\t\t\t{/* Members Section - available to all users */}\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t

Team Members

\n\t\t\t\t\t{currentUser?.role === \"admin\" && (\n\t\t\t\t\t\t\n\t\t\t\t\t)}\n\t\t\t\t
\n\n\t\t\t\t{members.length === 0 ? (\n\t\t\t\t\t
No members found
\n\t\t\t\t) : (\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{currentUser?.role === \"admin\" && }\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{members.map((member) => (\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{currentUser?.role === \"admin\" && (\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\n\t\t\t\t\t
NameEmailRoleActions
{member.name}{member.email}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t{member.role}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t updateMemberRole(member.id, member.role)}\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\t\tpadding: \"4px 8px\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tbackgroundColor: \"#6c757d\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: \"white\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tborder: \"none\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tborderRadius: \"4px\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tfontSize: \"12px\"\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\tToggle Role\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t)}\n\t\t\t
\n\n\t\t\t{/* Invoices Section - only displayed to admins */}\n\t\t\t{currentUser?.role === \"admin\" && (\n\t\t\t\t
\n\t\t\t\t\t

Invoices (Admin Only)

\n\t\t\t\t\t{invoices.length === 0 ? (\n\t\t\t\t\t\t
No invoices found
\n\t\t\t\t\t) : (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{invoices.map((invoice) => (\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
Invoice #DescriptionDateAmountStatusActions
{invoice.id}{invoice.description}{new Date(invoice.date).toLocaleDateString()}${invoice.amount.toFixed(2)}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t{invoice.paid ? \"Paid\" : \"Unpaid\"}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t{!invoice.paid && (\n\t\t\t\t\t\t\t\t\t\t\t\t markInvoicePaid(invoice.id)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpadding: \"4px 8px\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbackgroundColor: \"#28a745\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: \"white\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tborder: \"none\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tborderRadius: \"4px\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tfontSize: \"12px\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\tMark Paid\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t)}\n\t\t\t\t
\n\t\t\t)}\n\t\t
\n\t);\n}", "src/frontend/main.tsx": "import { StrictMode } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { App } from \"./App\";\n\nconst root = document.getElementById(\"root\");\nif (!root) throw new Error(\"Root element not found\");\n\ncreateRoot(root).render(\n\t\n\t\t\n\t\n);", "src/frontend/index.html": "\n\n\n \n \n Tenant Dashboard - RivetKit\n \n\n\n
\n \n\n", - "src/backend/registry.ts": "import { actor, setup } from \"rivetkit\";\nimport { UserError } from \"rivetkit/errors\";\n\nexport type Member = {\n\tid: string;\n\tname: string;\n\temail: string;\n\trole: \"admin\" | \"member\";\n};\n\nexport type Invoice = {\n\tid: string;\n\tamount: number;\n\tdate: number;\n\tpaid: boolean;\n\tdescription: string;\n};\n\nexport type ConnState = {\n\tuserId: string;\n\trole: \"admin\" | \"member\";\n};\n\n// Simple authentication function\nasync function authenticate(\n\ttoken: string,\n): Promise<{ userId: string; role: \"admin\" | \"member\" }> {\n\t// Simple token parsing - in production, verify JWT or session\n\tif (token.startsWith(\"auth:\")) {\n\t\tconst userId = token.split(\":\")[1];\n\n\t\t// Hardcoded user roles for demo\n\t\tconst userRoles: Record = {\n\t\t\t\"user-1\": \"admin\", // Alice\n\t\t\t\"user-2\": \"member\", // Bob\n\t\t\t\"user-3\": \"member\", // Charlie\n\t\t};\n\n\t\tconst role = userRoles[userId];\n\t\tif (!role) {\n\t\t\tthrow new UserError(\"Invalid authentication token\");\n\t\t}\n\n\t\treturn { userId, role };\n\t}\n\n\tthrow new UserError(\"Invalid authentication token format\");\n}\n\nconst tenant = actor({\n\tonAuth: () => {},\n\t// Persistent state that survives restarts: https://rivet.gg/docs/actors/state\n\tstate: {\n\t\torgId: \"org-1\",\n\t\torgName: \"Acme Corporation\",\n\t\tmembers: [\n\t\t\t{\n\t\t\t\tid: \"user-1\",\n\t\t\t\tname: \"Alice Johnson\",\n\t\t\t\temail: \"alice@acme.com\",\n\t\t\t\trole: \"admin\" as const,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"user-2\",\n\t\t\t\tname: \"Bob Smith\",\n\t\t\t\temail: \"bob@acme.com\",\n\t\t\t\trole: \"member\" as const,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"user-3\",\n\t\t\t\tname: \"Charlie Brown\",\n\t\t\t\temail: \"charlie@acme.com\",\n\t\t\t\trole: \"member\" as const,\n\t\t\t},\n\t\t],\n\t\tinvoices: [\n\t\t\t{\n\t\t\t\tid: \"inv-001\",\n\t\t\t\tamount: 1200.0,\n\t\t\t\tdate: Date.now() - 86400000 * 30, // 30 days ago\n\t\t\t\tpaid: true,\n\t\t\t\tdescription: \"Monthly subscription - Enterprise plan\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"inv-002\",\n\t\t\t\tamount: 1200.0,\n\t\t\t\tdate: Date.now() - 86400000 * 7, // 7 days ago\n\t\t\t\tpaid: false,\n\t\t\t\tdescription: \"Monthly subscription - Enterprise plan\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"inv-003\",\n\t\t\t\tamount: 250.0,\n\t\t\t\tdate: Date.now() - 86400000 * 3, // 3 days ago\n\t\t\t\tpaid: true,\n\t\t\t\tdescription: \"Additional storage - 500GB\",\n\t\t\t},\n\t\t],\n\t},\n\n\tactions: {\n\t\t// Callable functions from clients: https://rivet.gg/docs/actors/actions\n\t\tgetOrganization: (c) => {\n\t\t\treturn {\n\t\t\t\tid: c.state.orgId,\n\t\t\t\tname: c.state.orgName,\n\t\t\t\tmemberCount: c.state.members.length,\n\t\t\t};\n\t\t},\n\n\t\tgetMembers: (c) => {\n\t\t\treturn c.state.members;\n\t\t},\n\n\t\tgetDashboardStats: (c) => {\n\t\t\tconst stats = {\n\t\t\t\ttotalMembers: c.state.members.length,\n\t\t\t\tadminCount: c.state.members.filter((m) => m.role === \"admin\").length,\n\t\t\t\tmemberCount: c.state.members.filter((m) => m.role === \"member\").length,\n\t\t\t};\n\n\t\t\t// For testing, always return basic stats\n\t\t\treturn stats;\n\t\t},\n\t},\n});\n\n// Register actors for use: https://rivet.gg/docs/setup\nexport const registry = setup({\n\tuse: { tenant },\n});\n", + "src/backend/registry.ts": "import { actor, setup } from \"rivetkit\";\nimport { UserError } from \"rivetkit/errors\";\n\nexport type Member = {\n\tid: string;\n\tname: string;\n\temail: string;\n\trole: \"admin\" | \"member\";\n};\n\nexport type Invoice = {\n\tid: string;\n\tamount: number;\n\tdate: number;\n\tpaid: boolean;\n\tdescription: string;\n};\n\nexport type ConnState = {\n\tuserId: string;\n\trole: \"admin\" | \"member\";\n};\n\n// Simple authentication function\nasync function authenticate(\n\ttoken: string,\n): Promise<{ userId: string; role: \"admin\" | \"member\" }> {\n\t// Simple token parsing - in production, verify JWT or session\n\tif (token.startsWith(\"auth:\")) {\n\t\tconst userId = token.split(\":\")[1];\n\n\t\t// Hardcoded user roles for demo\n\t\tconst userRoles: Record = {\n\t\t\t\"user-1\": \"admin\", // Alice\n\t\t\t\"user-2\": \"member\", // Bob\n\t\t\t\"user-3\": \"member\", // Charlie\n\t\t};\n\n\t\tconst role = userRoles[userId];\n\t\tif (!role) {\n\t\t\tthrow new UserError(\"Invalid authentication token\");\n\t\t}\n\n\t\treturn { userId, role };\n\t}\n\n\tthrow new UserError(\"Invalid authentication token format\");\n}\n\nconst tenant = actor({\n\tonAuth: () => {},\n\t// Persistent state that survives restarts: https://rivet.dev/docs/actors/state\n\tstate: {\n\t\torgId: \"org-1\",\n\t\torgName: \"Acme Corporation\",\n\t\tmembers: [\n\t\t\t{\n\t\t\t\tid: \"user-1\",\n\t\t\t\tname: \"Alice Johnson\",\n\t\t\t\temail: \"alice@acme.com\",\n\t\t\t\trole: \"admin\" as const,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"user-2\",\n\t\t\t\tname: \"Bob Smith\",\n\t\t\t\temail: \"bob@acme.com\",\n\t\t\t\trole: \"member\" as const,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"user-3\",\n\t\t\t\tname: \"Charlie Brown\",\n\t\t\t\temail: \"charlie@acme.com\",\n\t\t\t\trole: \"member\" as const,\n\t\t\t},\n\t\t],\n\t\tinvoices: [\n\t\t\t{\n\t\t\t\tid: \"inv-001\",\n\t\t\t\tamount: 1200.0,\n\t\t\t\tdate: Date.now() - 86400000 * 30, // 30 days ago\n\t\t\t\tpaid: true,\n\t\t\t\tdescription: \"Monthly subscription - Enterprise plan\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"inv-002\",\n\t\t\t\tamount: 1200.0,\n\t\t\t\tdate: Date.now() - 86400000 * 7, // 7 days ago\n\t\t\t\tpaid: false,\n\t\t\t\tdescription: \"Monthly subscription - Enterprise plan\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"inv-003\",\n\t\t\t\tamount: 250.0,\n\t\t\t\tdate: Date.now() - 86400000 * 3, // 3 days ago\n\t\t\t\tpaid: true,\n\t\t\t\tdescription: \"Additional storage - 500GB\",\n\t\t\t},\n\t\t],\n\t},\n\n\tactions: {\n\t\t// Callable functions from clients: https://rivet.dev/docs/actors/actions\n\t\tgetOrganization: (c) => {\n\t\t\treturn {\n\t\t\t\tid: c.state.orgId,\n\t\t\t\tname: c.state.orgName,\n\t\t\t\tmemberCount: c.state.members.length,\n\t\t\t};\n\t\t},\n\n\t\tgetMembers: (c) => {\n\t\t\treturn c.state.members;\n\t\t},\n\n\t\tgetDashboardStats: (c) => {\n\t\t\tconst stats = {\n\t\t\t\ttotalMembers: c.state.members.length,\n\t\t\t\tadminCount: c.state.members.filter((m) => m.role === \"admin\").length,\n\t\t\t\tmemberCount: c.state.members.filter((m) => m.role === \"member\").length,\n\t\t\t};\n\n\t\t\t// For testing, always return basic stats\n\t\t\treturn stats;\n\t\t},\n\t},\n});\n\n// Register actors for use: https://rivet.dev/docs/setup\nexport const registry = setup({\n\tuse: { tenant },\n});\n", "src/backend/server.ts": "import { registry } from \"./registry\";\n\nregistry.runServer({\n\tcors: {\n\t\torigin: \"*\",\n\t},\n});\n" } }, @@ -221,7 +221,7 @@ export const examples: ExampleData[] = [ "tab": "memory", "files": { "tests/stream.test.ts": "import { setupTest } from \"rivetkit/test\";\nimport { expect, test } from \"vitest\";\nimport { registry } from \"../src/backend/registry\";\n\ntest(\"Stream processor maintains top 3 values\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst stream = client.streamProcessor.getOrCreate([\"test-top3\"]);\n\n\t// Initial state should be empty\n\tconst initial = await stream.getTopValues();\n\texpect(initial).toEqual([]);\n\n\t// Add first value\n\tconst result1 = await stream.addValue(10);\n\texpect(result1).toEqual([10]);\n\n\t// Add second value (lower)\n\tconst result2 = await stream.addValue(5);\n\texpect(result2).toEqual([10, 5]);\n\n\t// Add third value (higher)\n\tconst result3 = await stream.addValue(15);\n\texpect(result3).toEqual([15, 10, 5]);\n\n\t// Add fourth value (should replace lowest)\n\tconst result4 = await stream.addValue(8);\n\texpect(result4).toEqual([15, 10, 8]);\n\n\t// Add fifth value (should replace middle)\n\tconst result5 = await stream.addValue(12);\n\texpect(result5).toEqual([15, 12, 10]);\n});\n\ntest(\"Stream processor tracks statistics correctly\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst stream = client.streamProcessor.getOrCreate([\"test-stats\"]);\n\n\t// Initial stats\n\tconst initialStats = await stream.getStats();\n\texpect(initialStats).toEqual({\n\t\ttopValues: [],\n\t\ttotalCount: 0,\n\t\thighestValue: null,\n\t});\n\n\t// Add some values\n\tawait stream.addValue(20);\n\tawait stream.addValue(30);\n\tawait stream.addValue(10);\n\n\tconst stats = await stream.getStats();\n\texpect(stats).toEqual({\n\t\ttopValues: [30, 20, 10],\n\t\ttotalCount: 3,\n\t\thighestValue: 30,\n\t});\n\n\t// Add more values to test count tracking\n\tawait stream.addValue(5);\n\tawait stream.addValue(25);\n\n\tconst finalStats = await stream.getStats();\n\texpect(finalStats.totalCount).toBe(5);\n\texpect(finalStats.topValues).toEqual([30, 25, 20]);\n\texpect(finalStats.highestValue).toBe(30);\n});\n\ntest(\"Stream processor handles duplicate values\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst stream = client.streamProcessor.getOrCreate([\"test-duplicates\"]);\n\n\t// Add duplicate values\n\tawait stream.addValue(10);\n\tawait stream.addValue(10);\n\tawait stream.addValue(10);\n\n\tconst result = await stream.getTopValues();\n\texpect(result).toEqual([10, 10, 10]);\n\n\tconst stats = await stream.getStats();\n\texpect(stats.totalCount).toBe(3);\n\texpect(stats.highestValue).toBe(10);\n});\n\ntest(\"Stream processor reset functionality\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst stream = client.streamProcessor.getOrCreate([\"test-reset\"]);\n\n\t// Add some values\n\tawait stream.addValue(100);\n\tawait stream.addValue(200);\n\tawait stream.addValue(50);\n\n\t// Verify state before reset\n\tconst beforeReset = await stream.getStats();\n\texpect(beforeReset.totalCount).toBe(3);\n\texpect(beforeReset.topValues).toEqual([200, 100, 50]);\n\n\t// Reset the stream\n\tconst resetResult = await stream.reset();\n\texpect(resetResult).toEqual({\n\t\ttopValues: [],\n\t\ttotalCount: 0,\n\t\thighestValue: null,\n\t});\n\n\t// Verify state after reset\n\tconst afterReset = await stream.getStats();\n\texpect(afterReset).toEqual({\n\t\ttopValues: [],\n\t\ttotalCount: 0,\n\t\thighestValue: null,\n\t});\n});\n\ntest(\"Stream processor handles edge case values\", async (ctx) => {\n\tconst { client } = await setupTest(ctx, registry);\n\tconst stream = client.streamProcessor.getOrCreate([\"test-edge-cases\"]);\n\n\t// Test with zero\n\tawait stream.addValue(0);\n\texpect(await stream.getTopValues()).toEqual([0]);\n\n\t// Test with negative numbers\n\tawait stream.addValue(-5);\n\tawait stream.addValue(-1);\n\texpect(await stream.getTopValues()).toEqual([0, -1, -5]);\n\n\t// Test with very large numbers\n\tawait stream.addValue(1000000);\n\texpect(await stream.getTopValues()).toEqual([1000000, 0, -1]);\n\n\tconst stats = await stream.getStats();\n\texpect(stats.totalCount).toBe(4);\n\texpect(stats.highestValue).toBe(1000000);\n});\n", - "README.md": "# Stream Processor for RivetKit\n\nExample project demonstrating real-time top-K stream processing with [RivetKit](https://rivetkit.org).\n\n[Learn More →](https://github.com/rivet-gg/rivetkit)\n\n[Discord](https://rivet.gg/discord) — [Documentation](https://rivetkit.org) — [Issues](https://github.com/rivet-gg/rivetkit/issues)\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 18+\n\n### Installation\n\n```sh\ngit clone https://github.com/rivet-gg/rivetkit\ncd rivetkit/examples/stream\nnpm install\n```\n\n### Development\n\n```sh\nnpm run dev\n```\n\nOpen your browser to `http://localhost:3000`\n\n## Features\n\n- **Top-K Processing**: Maintains the top 3 highest values in real-time\n- **Real-time Updates**: All connected clients see changes immediately\n- **Stream Statistics**: Total count, highest value, and live metrics\n- **Interactive Input**: Add custom values or generate random numbers\n- **Reset Functionality**: Clear the stream and start fresh\n- **Responsive Design**: Clean, modern interface with live statistics\n\n## How it works\n\nThis stream processor demonstrates:\n\n1. **Top-K Algorithm**: Efficiently maintains the top 3 values using insertion sort\n2. **Real-time Broadcasting**: Updates are instantly sent to all connected clients\n3. **State Management**: Persistent tracking of values and statistics\n4. **Event-driven Updates**: Live UI updates when new values are processed\n5. **Collaborative Experience**: Multiple users can add values simultaneously\n\n## Architecture\n\n- **Backend**: RivetKit actor managing stream state and top-K algorithm\n- **Frontend**: React application with real-time stream visualization\n- **State Management**: Server-side state with client-side event subscriptions\n- **Algorithm**: Insertion-based top-K maintenance with O(k) complexity\n\n## Stream Processing Algorithm\n\n### Value Insertion\n```typescript\n// Insert new value maintaining sorted order\nconst insertAt = topValues.findIndex(v => value > v);\nif (insertAt !== -1) {\n topValues.splice(insertAt, 0, value);\n}\n\n// Keep only top 3 values\nif (topValues.length > 3) {\n topValues.length = 3;\n}\n```\n\n### Performance Characteristics\n- **Time Complexity**: O(k) per insertion where k=3\n- **Space Complexity**: O(k) for storing top values\n- **Memory Efficient**: Only stores top values, not entire stream\n- **Real-time**: Sub-millisecond processing for new values\n\n## Use Cases\n\nThis pattern is perfect for:\n\n- **Leaderboards**: Gaming high scores, competition rankings\n- **Metrics Monitoring**: Top error rates, highest traffic spikes\n- **Social Features**: Most popular posts, trending content\n- **Analytics Dashboards**: Key performance indicators\n- **Real-time Alerts**: Threshold monitoring and notifications\n\n## Extending\n\nThis stream processor can be enhanced with:\n\n- **Configurable K**: Allow different top-K sizes (top 5, top 10, etc.)\n- **Time Windows**: Top values within specific time periods\n- **Multiple Streams**: Separate processors for different categories\n- **Persistence**: Database storage for stream history\n- **Complex Events**: Pattern detection and complex event processing\n- **Aggregations**: Sum, average, and other statistical operations\n- **Filters**: Value range filtering and validation\n- **Rate Limiting**: Throttle input to prevent spam\n\n## Stream Processing Concepts\n\n### Top-K Algorithms\n- **Heap-based**: Efficient for large K values\n- **Sort-based**: Simple implementation for small K\n- **Probabilistic**: Approximate results for massive streams\n\n### Real-time Considerations\n- **Latency**: Sub-millisecond processing requirements\n- **Throughput**: Handling high-volume input streams\n- **Memory**: Bounded memory usage regardless of stream size\n- **Accuracy**: Exact vs. approximate results trade-offs\n\n## Testing\n\nThe example includes basic structural tests. For production use, consider adding:\n\n- **Algorithm correctness**: Verify top-K accuracy\n- **Concurrency testing**: Multiple simultaneous inputs\n- **Performance testing**: High-volume stream simulation\n- **Edge cases**: Duplicate values, negative numbers, overflow handling\n\n## License\n\nApache 2.0", + "README.md": "# Stream Processor for RivetKit\n\nExample project demonstrating real-time top-K stream processing with [RivetKit](https://rivetkit.org).\n\n[Learn More →](https://github.com/rivet-dev/rivetkit)\n\n[Discord](https://rivet.dev/discord) — [Documentation](https://rivetkit.org) — [Issues](https://github.com/rivet-dev/rivetkit/issues)\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 18+\n\n### Installation\n\n```sh\ngit clone https://github.com/rivet-dev/rivetkit\ncd rivetkit/examples/stream\nnpm install\n```\n\n### Development\n\n```sh\nnpm run dev\n```\n\nOpen your browser to `http://localhost:3000`\n\n## Features\n\n- **Top-K Processing**: Maintains the top 3 highest values in real-time\n- **Real-time Updates**: All connected clients see changes immediately\n- **Stream Statistics**: Total count, highest value, and live metrics\n- **Interactive Input**: Add custom values or generate random numbers\n- **Reset Functionality**: Clear the stream and start fresh\n- **Responsive Design**: Clean, modern interface with live statistics\n\n## How it works\n\nThis stream processor demonstrates:\n\n1. **Top-K Algorithm**: Efficiently maintains the top 3 values using insertion sort\n2. **Real-time Broadcasting**: Updates are instantly sent to all connected clients\n3. **State Management**: Persistent tracking of values and statistics\n4. **Event-driven Updates**: Live UI updates when new values are processed\n5. **Collaborative Experience**: Multiple users can add values simultaneously\n\n## Architecture\n\n- **Backend**: RivetKit actor managing stream state and top-K algorithm\n- **Frontend**: React application with real-time stream visualization\n- **State Management**: Server-side state with client-side event subscriptions\n- **Algorithm**: Insertion-based top-K maintenance with O(k) complexity\n\n## Stream Processing Algorithm\n\n### Value Insertion\n```typescript\n// Insert new value maintaining sorted order\nconst insertAt = topValues.findIndex(v => value > v);\nif (insertAt !== -1) {\n topValues.splice(insertAt, 0, value);\n}\n\n// Keep only top 3 values\nif (topValues.length > 3) {\n topValues.length = 3;\n}\n```\n\n### Performance Characteristics\n- **Time Complexity**: O(k) per insertion where k=3\n- **Space Complexity**: O(k) for storing top values\n- **Memory Efficient**: Only stores top values, not entire stream\n- **Real-time**: Sub-millisecond processing for new values\n\n## Use Cases\n\nThis pattern is perfect for:\n\n- **Leaderboards**: Gaming high scores, competition rankings\n- **Metrics Monitoring**: Top error rates, highest traffic spikes\n- **Social Features**: Most popular posts, trending content\n- **Analytics Dashboards**: Key performance indicators\n- **Real-time Alerts**: Threshold monitoring and notifications\n\n## Extending\n\nThis stream processor can be enhanced with:\n\n- **Configurable K**: Allow different top-K sizes (top 5, top 10, etc.)\n- **Time Windows**: Top values within specific time periods\n- **Multiple Streams**: Separate processors for different categories\n- **Persistence**: Database storage for stream history\n- **Complex Events**: Pattern detection and complex event processing\n- **Aggregations**: Sum, average, and other statistical operations\n- **Filters**: Value range filtering and validation\n- **Rate Limiting**: Throttle input to prevent spam\n\n## Stream Processing Concepts\n\n### Top-K Algorithms\n- **Heap-based**: Efficient for large K values\n- **Sort-based**: Simple implementation for small K\n- **Probabilistic**: Approximate results for massive streams\n\n### Real-time Considerations\n- **Latency**: Sub-millisecond processing requirements\n- **Throughput**: Handling high-volume input streams\n- **Memory**: Bounded memory usage regardless of stream size\n- **Accuracy**: Exact vs. approximate results trade-offs\n\n## Testing\n\nThe example includes basic structural tests. For production use, consider adding:\n\n- **Algorithm correctness**: Verify top-K accuracy\n- **Concurrency testing**: Multiple simultaneous inputs\n- **Performance testing**: High-volume stream simulation\n- **Edge cases**: Duplicate values, negative numbers, overflow handling\n\n## License\n\nApache 2.0", "package-lock.json": "{\n \"name\": \"example-stream\",\n \"version\": \"1.0.0\",\n \"lockfileVersion\": 3,\n \"requires\": true,\n \"packages\": {\n \"\": {\n \"name\": \"example-stream\",\n \"version\": \"1.0.0\",\n \"dependencies\": {\n \"rivetkit\": \"^0.9.1\",\n \"@rivetkit/react\": \"^0.9.1\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^20.0.0\",\n \"@types/react\": \"^18.2.0\",\n \"@types/react-dom\": \"^18.2.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"concurrently\": \"^8.2.0\",\n \"tsx\": \"^4.0.0\",\n \"typescript\": \"^5.0.0\",\n \"vite\": \"^5.0.0\",\n \"vitest\": \"^1.0.0\"\n }\n },\n \"node_modules/@ampproject/remapping\": {\n \"version\": \"2.3.0\",\n \"resolved\": \"https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz\",\n \"integrity\": \"sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@jridgewell/gen-mapping\": \"^0.3.5\",\n \"@jridgewell/trace-mapping\": \"^0.3.24\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@babel/code-frame\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz\",\n \"integrity\": \"sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-validator-identifier\": \"^7.27.1\",\n \"js-tokens\": \"^4.0.0\",\n \"picocolors\": \"^1.1.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/compat-data\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz\",\n \"integrity\": \"sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/core\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz\",\n \"integrity\": \"sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@ampproject/remapping\": \"^2.2.0\",\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/generator\": \"^7.28.0\",\n \"@babel/helper-compilation-targets\": \"^7.27.2\",\n \"@babel/helper-module-transforms\": \"^7.27.3\",\n \"@babel/helpers\": \"^7.27.6\",\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/template\": \"^7.27.2\",\n \"@babel/traverse\": \"^7.28.0\",\n \"@babel/types\": \"^7.28.0\",\n \"convert-source-map\": \"^2.0.0\",\n \"debug\": \"^4.1.0\",\n \"gensync\": \"^1.0.0-beta.2\",\n \"json5\": \"^2.2.3\",\n \"semver\": \"^6.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"funding\": {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/babel\"\n }\n },\n \"node_modules/@babel/generator\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz\",\n \"integrity\": \"sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/types\": \"^7.28.0\",\n \"@jridgewell/gen-mapping\": \"^0.3.12\",\n \"@jridgewell/trace-mapping\": \"^0.3.28\",\n \"jsesc\": \"^3.0.2\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-compilation-targets\": {\n \"version\": \"7.27.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz\",\n \"integrity\": \"sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/compat-data\": \"^7.27.2\",\n \"@babel/helper-validator-option\": \"^7.27.1\",\n \"browserslist\": \"^4.24.0\",\n \"lru-cache\": \"^5.1.1\",\n \"semver\": \"^6.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-globals\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz\",\n \"integrity\": \"sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-module-imports\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz\",\n \"integrity\": \"sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/traverse\": \"^7.27.1\",\n \"@babel/types\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-module-transforms\": {\n \"version\": \"7.27.3\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz\",\n \"integrity\": \"sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-module-imports\": \"^7.27.1\",\n \"@babel/helper-validator-identifier\": \"^7.27.1\",\n \"@babel/traverse\": \"^7.27.3\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0\"\n }\n },\n \"node_modules/@babel/helper-plugin-utils\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz\",\n \"integrity\": \"sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-string-parser\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz\",\n \"integrity\": \"sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-validator-identifier\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz\",\n \"integrity\": \"sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-validator-option\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz\",\n \"integrity\": \"sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helpers\": {\n \"version\": \"7.27.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz\",\n \"integrity\": \"sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/template\": \"^7.27.2\",\n \"@babel/types\": \"^7.27.6\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/parser\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz\",\n \"integrity\": \"sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.28.0\"\n },\n \"bin\": {\n \"parser\": \"bin/babel-parser.js\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@babel/plugin-transform-react-jsx-self\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz\",\n \"integrity\": \"sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-plugin-utils\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/plugin-transform-react-jsx-source\": {\n \"version\": \"7.27.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz\",\n \"integrity\": \"sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-plugin-utils\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/runtime\": {\n \"version\": \"7.27.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz\",\n \"integrity\": \"sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/template\": {\n \"version\": \"7.27.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz\",\n \"integrity\": \"sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/parser\": \"^7.27.2\",\n \"@babel/types\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/traverse\": {\n \"version\": \"7.28.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz\",\n \"integrity\": \"sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/code-frame\": \"^7.27.1\",\n \"@babel/generator\": \"^7.28.0\",\n \"@babel/helper-globals\": \"^7.28.0\",\n \"@babel/parser\": \"^7.28.0\",\n \"@babel/template\": \"^7.27.2\",\n \"@babel/types\": \"^7.28.0\",\n \"debug\": \"^4.3.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/types\": {\n \"version\": \"7.28.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/types/-/types-7.28.1.tgz\",\n \"integrity\": \"sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/helper-string-parser\": \"^7.27.1\",\n \"@babel/helper-validator-identifier\": \"^7.27.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@cbor-extract/cbor-extract-darwin-arm64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.0.tgz\",\n \"integrity\": \"sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-darwin-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-arm\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.2.0.tgz\",\n \"integrity\": \"sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==\",\n \"cpu\": [\n \"arm\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-arm64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.2.0.tgz\",\n \"integrity\": \"sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-linux-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"peer\": true\n },\n \"node_modules/@cbor-extract/cbor-extract-win32-x64\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.2.0.tgz\",\n \"integrity\": \"sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==\",\n \"cpu\": [\n \"x64\"\n ],\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"peer\": true\n },\n \"node_modules/@esbuild/aix-ppc64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.6.tgz\",\n \"integrity\": \"sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"aix\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/android-arm\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.6.tgz\",\n \"integrity\": \"sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/android-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/android-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/darwin-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/darwin-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/freebsd-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/freebsd-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-arm\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.6.tgz\",\n \"integrity\": \"sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-ia32\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.6.tgz\",\n \"integrity\": \"sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-loong64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.6.tgz\",\n \"integrity\": \"sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-mips64el\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.6.tgz\",\n \"integrity\": \"sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==\",\n \"cpu\": [\n \"mips64el\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-ppc64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.6.tgz\",\n \"integrity\": \"sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-riscv64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.6.tgz\",\n \"integrity\": \"sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-s390x\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.6.tgz\",\n \"integrity\": \"sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/linux-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/netbsd-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"netbsd\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/netbsd-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"netbsd\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/openbsd-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"openbsd\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/openbsd-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"openbsd\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/openharmony-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"openharmony\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/sunos-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"sunos\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/win32-arm64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.6.tgz\",\n \"integrity\": \"sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/win32-ia32\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.6.tgz\",\n \"integrity\": \"sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@esbuild/win32-x64\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.6.tgz\",\n \"integrity\": \"sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n }\n },\n \"node_modules/@jest/schemas\": {\n \"version\": \"29.6.3\",\n \"resolved\": \"https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz\",\n \"integrity\": \"sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@sinclair/typebox\": \"^0.27.8\"\n },\n \"engines\": {\n \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n }\n },\n \"node_modules/@jridgewell/gen-mapping\": {\n \"version\": \"0.3.12\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz\",\n \"integrity\": \"sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/sourcemap-codec\": \"^1.5.0\",\n \"@jridgewell/trace-mapping\": \"^0.3.24\"\n }\n },\n \"node_modules/@jridgewell/resolve-uri\": {\n \"version\": \"3.1.2\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz\",\n \"integrity\": \"sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@jridgewell/sourcemap-codec\": {\n \"version\": \"1.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz\",\n \"integrity\": \"sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@jridgewell/trace-mapping\": {\n \"version\": \"0.3.29\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz\",\n \"integrity\": \"sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/resolve-uri\": \"^3.1.0\",\n \"@jridgewell/sourcemap-codec\": \"^1.4.14\"\n }\n },\n \"node_modules/rivetkit\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/rivetkit/-/actor-0.9.1.tgz\",\n \"integrity\": \"sha512-aVoWO81JrYql6hhXX+vRor0B+aeWrnh+9zkcrxbh0EXFBbS5XM8YE4sSFxNKmZThLbGNqfZ5enm1zuA92c7I1w==\",\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\"\n }\n },\n \"node_modules/@rivetkit/core\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/core/-/core-0.9.1.tgz\",\n \"integrity\": \"sha512-0zYFKo08CQ72Rm6MaVKxcJSEEfn/ypGkkxTX06Q4meCGHuDJFbPA5wopa3NdxrKBPttcGg1QAmDd+1FZnlpubA==\",\n \"license\": \"Apache-2.0\",\n \"peer\": true,\n \"dependencies\": {\n \"cbor-x\": \"^1.6.0\",\n \"invariant\": \"^2.2.4\",\n \"on-change\": \"^5.0.1\",\n \"p-retry\": \"^6.2.1\",\n \"zod\": \"^3.25.67\"\n },\n \"engines\": {\n \"node\": \">=22.0.0\"\n },\n \"peerDependencies\": {\n \"@hono/node-server\": \"^1.14.0\",\n \"@hono/node-ws\": \"^1.1.1\",\n \"@hono/zod-openapi\": \"^0.19.6\",\n \"eventsource\": \"^3.0.5\",\n \"hono\": \"^4.7.0\",\n \"ws\": \"^8.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@hono/node-server\": {\n \"optional\": true\n },\n \"@hono/node-ws\": {\n \"optional\": true\n },\n \"@hono/zod-openapi\": {\n \"optional\": true\n },\n \"eventsource\": {\n \"optional\": true\n },\n \"hono\": {\n \"optional\": true\n },\n \"ws\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/@rivetkit/framework-base\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/framework-base/-/framework-base-0.9.1.tgz\",\n \"integrity\": \"sha512-FxhSqGAtDsD4k7gKS2EhJ5hHsEwI1+QR0vYThUBOLcmXM7zjMZndqIjVperQO4ck/zfjRqjm3lw7znkc+k0wNQ==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@tanstack/store\": \"^0.7.1\"\n },\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\"\n }\n },\n \"node_modules/@rivetkit/react\": {\n \"version\": \"0.9.1\",\n \"resolved\": \"https://registry.npmjs.org/@rivetkit/react/-/react-0.9.1.tgz\",\n \"integrity\": \"sha512-0e0gNNj3qCrXHNIxE6ggEEX+E6HjdsSt9pJbWbaQQg+1bsywupRTSdgSDguDHjBvi9qhR9mh7UbNN3A9wYqXuA==\",\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"@rivetkit/framework-base\": \"0.9.1\",\n \"@tanstack/react-store\": \"^0.7.1\"\n },\n \"peerDependencies\": {\n \"@rivetkit/core\": \"*\",\n \"react\": \"^18 || ^19\",\n \"react-dom\": \"^18 || ^19\"\n }\n },\n \"node_modules/@rolldown/pluginutils\": {\n \"version\": \"1.0.0-beta.19\",\n \"resolved\": \"https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz\",\n \"integrity\": \"sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@rollup/rollup-android-arm-eabi\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.0.tgz\",\n \"integrity\": \"sha512-2o/FgACbji4tW1dzXOqAV15Eu7DdgbKsF2QKcxfG4xbh5iwU7yr5RRP5/U+0asQliSYv5M4o7BevlGIoSL0LXg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ]\n },\n \"node_modules/@rollup/rollup-android-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-PSZ0SvMOjEAxwZeTx32eI/j5xSYtDCRxGu5k9zvzoY77xUNssZM+WV6HYBLROpY5CkXsbQjvz40fBb7WPwDqtQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ]\n },\n \"node_modules/@rollup/rollup-darwin-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-BA4yPIPssPB2aRAWzmqzQ3y2/KotkLyZukVB7j3psK/U3nVJdceo6qr9pLM2xN6iRP/wKfxEbOb1yrlZH6sYZg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ]\n },\n \"node_modules/@rollup/rollup-darwin-x64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.0.tgz\",\n \"integrity\": \"sha512-Pr2o0lvTwsiG4HCr43Zy9xXrHspyMvsvEw4FwKYqhli4FuLE5FjcZzuQ4cfPe0iUFCvSQG6lACI0xj74FDZKRA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ]\n },\n \"node_modules/@rollup/rollup-freebsd-arm64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.0.tgz\",\n \"integrity\": \"sha512-lYE8LkE5h4a/+6VnnLiL14zWMPnx6wNbDG23GcYFpRW1V9hYWHAw9lBZ6ZUIrOaoK7NliF1sdwYGiVmziUF4vA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ]\n },\n \"node_modules/@rollup/rollup-freebsd-x64\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.0.tgz\",\n \"integrity\": \"sha512-PVQWZK9sbzpvqC9Q0GlehNNSVHR+4m7+wET+7FgSnKG3ci5nAMgGmr9mGBXzAuE5SvguCKJ6mHL6vq1JaJ/gvw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm-gnueabihf\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.0.tgz\",\n \"integrity\": \"sha512-hLrmRl53prCcD+YXTfNvXd776HTxNh8wPAMllusQ+amcQmtgo3V5i/nkhPN6FakW+QVLoUUr2AsbtIRPFU3xIA==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm-musleabihf\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.0.tgz\",\n \"integrity\": \"sha512-XBKGSYcrkdiRRjl+8XvrUR3AosXU0NvF7VuqMsm7s5nRy+nt58ZMB19Jdp1RdqewLcaYnpk8zeVs/4MlLZEJxw==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-fRvZZPUiBz7NztBE/2QnCS5AtqLVhXmUOPj9IHlfGEXkapgImf4W9+FSkL8cWqoAjozyUzqFmSc4zh2ooaeF6g==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-arm64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-Btv2WRZOcUGi8XU80XwIvzTg4U6+l6D0V6sZTrZx214nrwxw5nAi8hysaXj/mctyClWgesyuxbeLylCBNauimg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-loongarch64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-Li0emNnwtUZdLwHjQPBxn4VWztcrw/h7mgLyHiEI5Z0MhpeFGlzaiBHpSNVOMB/xucjXTTcO+dhv469Djr16KA==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-powerpc64le-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-sB8+pfkYx2kvpDCfd63d5ScYT0Fz1LO6jIb2zLZvmK9ob2D8DeVqrmBDE0iDK8KlBVmsTNzrjr3G1xV4eUZhSw==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-riscv64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-5GQ6PFhh7E6jQm70p1aW05G2cap5zMOvO0se5JMecHeAdj5ZhWEHbJ4hiKpfi1nnnEdTauDXxPgXae/mqjow9w==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-riscv64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-N/euLsBd1rekWcuduakTo/dJw6U6sBP3eUq+RXM9RNfPuWTvG2w/WObDkIvJ2KChy6oxZmOSC08Ak2OJA0UiAA==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-s390x-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-2l9sA7d7QdikL0xQwNMO3xURBUNEWyHVHfAsHsUdq+E/pgLTUcCE+gih5PCdmyHmfTDeXUWVhqL0WZzg0nua3g==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-x64-gnu\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.0.tgz\",\n \"integrity\": \"sha512-XZdD3fEEQcwG2KrJDdEQu7NrHonPxxaV0/w2HpvINBdcqebz1aL+0vM2WFJq4DeiAVT6F5SUQas65HY5JDqoPw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-linux-x64-musl\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.0.tgz\",\n \"integrity\": \"sha512-7ayfgvtmmWgKWBkCGg5+xTQ0r5V1owVm67zTrsEY1008L5ro7mCyGYORomARt/OquB9KY7LpxVBZes+oSniAAQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-arm64-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-B+IJgcBnE2bm93jEW5kHisqvPITs4ddLOROAcOc/diBgrEiQJJ6Qcjby75rFSmH5eMGrqJryUgJDhrfj942apQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-ia32-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-+CXwwG66g0/FpWOnP/v1HnrGVSOygK/osUbu3wPRy8ECXjoYKjRAyfxYpDQOfghC5qPJYLPH0oN4MCOjwgdMug==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@rollup/rollup-win32-x64-msvc\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.0.tgz\",\n \"integrity\": \"sha512-SRf1cytG7wqcHVLrBc9VtPK4pU5wxiB/lNIkNmW2ApKXIg+RpqwHfsaEK+e7eH4A1BpI6BX/aBWXxZCIrJg3uA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ]\n },\n \"node_modules/@sinclair/typebox\": {\n \"version\": \"0.27.8\",\n \"resolved\": \"https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz\",\n \"integrity\": \"sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@tanstack/react-store\": {\n \"version\": \"0.7.3\",\n \"resolved\": \"https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.7.3.tgz\",\n \"integrity\": \"sha512-3Dnqtbw9P2P0gw8uUM8WP2fFfg8XMDSZCTsywRPZe/XqqYW8PGkXKZTvP0AHkE4mpqP9Y43GpOg9vwO44azu6Q==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@tanstack/store\": \"0.7.2\",\n \"use-sync-external-store\": \"^1.5.0\"\n },\n \"funding\": {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/tannerlinsley\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\",\n \"react-dom\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\"\n }\n },\n \"node_modules/@tanstack/store\": {\n \"version\": \"0.7.2\",\n \"resolved\": \"https://registry.npmjs.org/@tanstack/store/-/store-0.7.2.tgz\",\n \"integrity\": \"sha512-RP80Z30BYiPX2Pyo0Nyw4s1SJFH2jyM6f9i3HfX4pA+gm5jsnYryscdq2aIQLnL4TaGuQMO+zXmN9nh1Qck+Pg==\",\n \"license\": \"MIT\",\n \"funding\": {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/tannerlinsley\"\n }\n },\n \"node_modules/@types/babel__core\": {\n \"version\": \"7.20.5\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz\",\n \"integrity\": \"sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.20.7\",\n \"@babel/types\": \"^7.20.7\",\n \"@types/babel__generator\": \"*\",\n \"@types/babel__template\": \"*\",\n \"@types/babel__traverse\": \"*\"\n }\n },\n \"node_modules/@types/babel__generator\": {\n \"version\": \"7.27.0\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz\",\n \"integrity\": \"sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.0.0\"\n }\n },\n \"node_modules/@types/babel__template\": {\n \"version\": \"7.4.4\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz\",\n \"integrity\": \"sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.1.0\",\n \"@babel/types\": \"^7.0.0\"\n }\n },\n \"node_modules/@types/babel__traverse\": {\n \"version\": \"7.20.7\",\n \"resolved\": \"https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz\",\n \"integrity\": \"sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/types\": \"^7.20.7\"\n }\n },\n \"node_modules/@types/estree\": {\n \"version\": \"1.0.8\",\n \"resolved\": \"https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz\",\n \"integrity\": \"sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@types/node\": {\n \"version\": \"20.19.7\",\n \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-20.19.7.tgz\",\n \"integrity\": \"sha512-1GM9z6BJOv86qkPvzh2i6VW5+VVrXxCLknfmTkWEqz+6DqosiY28XUWCTmBcJ0ACzKqx/iwdIREfo1fwExIlkA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"undici-types\": \"~6.21.0\"\n }\n },\n \"node_modules/@types/prop-types\": {\n \"version\": \"15.7.15\",\n \"resolved\": \"https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz\",\n \"integrity\": \"sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/@types/react\": {\n \"version\": \"18.3.23\",\n \"resolved\": \"https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz\",\n \"integrity\": \"sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/prop-types\": \"*\",\n \"csstype\": \"^3.0.2\"\n }\n },\n \"node_modules/@types/react-dom\": {\n \"version\": \"18.3.7\",\n \"resolved\": \"https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz\",\n \"integrity\": \"sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"peerDependencies\": {\n \"@types/react\": \"^18.0.0\"\n }\n },\n \"node_modules/@types/retry\": {\n \"version\": \"0.12.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz\",\n \"integrity\": \"sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==\",\n \"license\": \"MIT\",\n \"peer\": true\n },\n \"node_modules/@vitejs/plugin-react\": {\n \"version\": \"4.6.0\",\n \"resolved\": \"https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.6.0.tgz\",\n \"integrity\": \"sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/core\": \"^7.27.4\",\n \"@babel/plugin-transform-react-jsx-self\": \"^7.27.1\",\n \"@babel/plugin-transform-react-jsx-source\": \"^7.27.1\",\n \"@rolldown/pluginutils\": \"1.0.0-beta.19\",\n \"@types/babel__core\": \"^7.20.5\",\n \"react-refresh\": \"^0.17.0\"\n },\n \"engines\": {\n \"node\": \"^14.18.0 || >=16.0.0\"\n },\n \"peerDependencies\": {\n \"vite\": \"^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0\"\n }\n },\n \"node_modules/@vitest/expect\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/expect/-/expect-1.6.1.tgz\",\n \"integrity\": \"sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/spy\": \"1.6.1\",\n \"@vitest/utils\": \"1.6.1\",\n \"chai\": \"^4.3.10\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/runner\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/runner/-/runner-1.6.1.tgz\",\n \"integrity\": \"sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/utils\": \"1.6.1\",\n \"p-limit\": \"^5.0.0\",\n \"pathe\": \"^1.1.1\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/snapshot\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.1.tgz\",\n \"integrity\": \"sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"magic-string\": \"^0.30.5\",\n \"pathe\": \"^1.1.1\",\n \"pretty-format\": \"^29.7.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/spy\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/spy/-/spy-1.6.1.tgz\",\n \"integrity\": \"sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"tinyspy\": \"^2.2.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/@vitest/utils\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/@vitest/utils/-/utils-1.6.1.tgz\",\n \"integrity\": \"sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"diff-sequences\": \"^29.6.3\",\n \"estree-walker\": \"^3.0.3\",\n \"loupe\": \"^2.3.7\",\n \"pretty-format\": \"^29.7.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/acorn\": {\n \"version\": \"8.15.0\",\n \"resolved\": \"https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz\",\n \"integrity\": \"sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"acorn\": \"bin/acorn\"\n },\n \"engines\": {\n \"node\": \">=0.4.0\"\n }\n },\n \"node_modules/acorn-walk\": {\n \"version\": \"8.3.4\",\n \"resolved\": \"https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz\",\n \"integrity\": \"sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"acorn\": \"^8.11.0\"\n },\n \"engines\": {\n \"node\": \">=0.4.0\"\n }\n },\n \"node_modules/ansi-regex\": {\n \"version\": \"5.0.1\",\n \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/ansi-styles\": {\n \"version\": \"4.3.0\",\n \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\n \"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"color-convert\": \"^2.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n }\n },\n \"node_modules/assertion-error\": {\n \"version\": \"1.1.0\",\n \"resolved\": \"https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz\",\n \"integrity\": \"sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \"*\"\n }\n },\n \"node_modules/browserslist\": {\n \"version\": \"4.25.1\",\n \"resolved\": \"https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz\",\n \"integrity\": \"sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"caniuse-lite\": \"^1.0.30001726\",\n \"electron-to-chromium\": \"^1.5.173\",\n \"node-releases\": \"^2.0.19\",\n \"update-browserslist-db\": \"^1.1.3\"\n },\n \"bin\": {\n \"browserslist\": \"cli.js\"\n },\n \"engines\": {\n \"node\": \"^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7\"\n }\n },\n \"node_modules/cac\": {\n \"version\": \"6.7.14\",\n \"resolved\": \"https://registry.npmjs.org/cac/-/cac-6.7.14.tgz\",\n \"integrity\": \"sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/caniuse-lite\": {\n \"version\": \"1.0.30001727\",\n \"resolved\": \"https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz\",\n \"integrity\": \"sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/caniuse-lite\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"CC-BY-4.0\"\n },\n \"node_modules/cbor-extract\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/cbor-extract/-/cbor-extract-2.2.0.tgz\",\n \"integrity\": \"sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==\",\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"peer\": true,\n \"dependencies\": {\n \"node-gyp-build-optional-packages\": \"5.1.1\"\n },\n \"bin\": {\n \"download-cbor-prebuilds\": \"bin/download-prebuilds.js\"\n },\n \"optionalDependencies\": {\n \"@cbor-extract/cbor-extract-darwin-arm64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-darwin-x64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-arm\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-arm64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-linux-x64\": \"2.2.0\",\n \"@cbor-extract/cbor-extract-win32-x64\": \"2.2.0\"\n }\n },\n \"node_modules/cbor-x\": {\n \"version\": \"1.6.0\",\n \"resolved\": \"https://registry.npmjs.org/cbor-x/-/cbor-x-1.6.0.tgz\",\n \"integrity\": \"sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"optionalDependencies\": {\n \"cbor-extract\": \"^2.2.0\"\n }\n },\n \"node_modules/chai\": {\n \"version\": \"4.5.0\",\n \"resolved\": \"https://registry.npmjs.org/chai/-/chai-4.5.0.tgz\",\n \"integrity\": \"sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"assertion-error\": \"^1.1.0\",\n \"check-error\": \"^1.0.3\",\n \"deep-eql\": \"^4.1.3\",\n \"get-func-name\": \"^2.0.2\",\n \"loupe\": \"^2.3.6\",\n \"pathval\": \"^1.1.1\",\n \"type-detect\": \"^4.1.0\"\n },\n \"engines\": {\n \"node\": \">=4\"\n }\n },\n \"node_modules/chalk\": {\n \"version\": \"4.1.2\",\n \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz\",\n \"integrity\": \"sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-styles\": \"^4.1.0\",\n \"supports-color\": \"^7.1.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/chalk?sponsor=1\"\n }\n },\n \"node_modules/chalk/node_modules/supports-color\": {\n \"version\": \"7.2.0\",\n \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz\",\n \"integrity\": \"sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"has-flag\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/check-error\": {\n \"version\": \"1.0.3\",\n \"resolved\": \"https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz\",\n \"integrity\": \"sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"get-func-name\": \"^2.0.2\"\n },\n \"engines\": {\n \"node\": \"*\"\n }\n },\n \"node_modules/cliui\": {\n \"version\": \"8.0.1\",\n \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz\",\n \"integrity\": \"sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"dependencies\": {\n \"string-width\": \"^4.2.0\",\n \"strip-ansi\": \"^6.0.1\",\n \"wrap-ansi\": \"^7.0.0\"\n },\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/color-convert\": {\n \"version\": \"2.0.1\",\n \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\n \"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"color-name\": \"~1.1.4\"\n },\n \"engines\": {\n \"node\": \">=7.0.0\"\n }\n },\n \"node_modules/color-name\": {\n \"version\": \"1.1.4\",\n \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\n \"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/concurrently\": {\n \"version\": \"8.2.2\",\n \"resolved\": \"https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz\",\n \"integrity\": \"sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"chalk\": \"^4.1.2\",\n \"date-fns\": \"^2.30.0\",\n \"lodash\": \"^4.17.21\",\n \"rxjs\": \"^7.8.1\",\n \"shell-quote\": \"^1.8.1\",\n \"spawn-command\": \"0.0.2\",\n \"supports-color\": \"^8.1.1\",\n \"tree-kill\": \"^1.2.2\",\n \"yargs\": \"^17.7.2\"\n },\n \"bin\": {\n \"conc\": \"dist/bin/concurrently.js\",\n \"concurrently\": \"dist/bin/concurrently.js\"\n },\n \"engines\": {\n \"node\": \"^14.13.0 || >=16.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/open-cli-tools/concurrently?sponsor=1\"\n }\n },\n \"node_modules/confbox\": {\n \"version\": \"0.1.8\",\n \"resolved\": \"https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz\",\n \"integrity\": \"sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/convert-source-map\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz\",\n \"integrity\": \"sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/cross-spawn\": {\n \"version\": \"7.0.6\",\n \"resolved\": \"https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz\",\n \"integrity\": \"sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"path-key\": \"^3.1.0\",\n \"shebang-command\": \"^2.0.0\",\n \"which\": \"^2.0.1\"\n },\n \"engines\": {\n \"node\": \">= 8\"\n }\n },\n \"node_modules/csstype\": {\n \"version\": \"3.1.3\",\n \"resolved\": \"https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz\",\n \"integrity\": \"sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/date-fns\": {\n \"version\": \"2.30.0\",\n \"resolved\": \"https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz\",\n \"integrity\": \"sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.21.0\"\n },\n \"engines\": {\n \"node\": \">=0.11\"\n },\n \"funding\": {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/date-fns\"\n }\n },\n \"node_modules/debug\": {\n \"version\": \"4.4.1\",\n \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.4.1.tgz\",\n \"integrity\": \"sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ms\": \"^2.1.3\"\n },\n \"engines\": {\n \"node\": \">=6.0\"\n },\n \"peerDependenciesMeta\": {\n \"supports-color\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/deep-eql\": {\n \"version\": \"4.1.4\",\n \"resolved\": \"https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz\",\n \"integrity\": \"sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"type-detect\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/detect-libc\": {\n \"version\": \"2.0.4\",\n \"resolved\": \"https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz\",\n \"integrity\": \"sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==\",\n \"license\": \"Apache-2.0\",\n \"optional\": true,\n \"peer\": true,\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/diff-sequences\": {\n \"version\": \"29.6.3\",\n \"resolved\": \"https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz\",\n \"integrity\": \"sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n }\n },\n \"node_modules/electron-to-chromium\": {\n \"version\": \"1.5.183\",\n \"resolved\": \"https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.183.tgz\",\n \"integrity\": \"sha512-vCrDBYjQCAEefWGjlK3EpoSKfKbT10pR4XXPdn65q7snuNOZnthoVpBfZPykmDapOKfoD+MMIPG8ZjKyyc9oHA==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/emoji-regex\": {\n \"version\": \"8.0.0\",\n \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/esbuild\": {\n \"version\": \"0.25.6\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.25.6.tgz\",\n \"integrity\": \"sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"esbuild\": \"bin/esbuild\"\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"optionalDependencies\": {\n \"@esbuild/aix-ppc64\": \"0.25.6\",\n \"@esbuild/android-arm\": \"0.25.6\",\n \"@esbuild/android-arm64\": \"0.25.6\",\n \"@esbuild/android-x64\": \"0.25.6\",\n \"@esbuild/darwin-arm64\": \"0.25.6\",\n \"@esbuild/darwin-x64\": \"0.25.6\",\n \"@esbuild/freebsd-arm64\": \"0.25.6\",\n \"@esbuild/freebsd-x64\": \"0.25.6\",\n \"@esbuild/linux-arm\": \"0.25.6\",\n \"@esbuild/linux-arm64\": \"0.25.6\",\n \"@esbuild/linux-ia32\": \"0.25.6\",\n \"@esbuild/linux-loong64\": \"0.25.6\",\n \"@esbuild/linux-mips64el\": \"0.25.6\",\n \"@esbuild/linux-ppc64\": \"0.25.6\",\n \"@esbuild/linux-riscv64\": \"0.25.6\",\n \"@esbuild/linux-s390x\": \"0.25.6\",\n \"@esbuild/linux-x64\": \"0.25.6\",\n \"@esbuild/netbsd-arm64\": \"0.25.6\",\n \"@esbuild/netbsd-x64\": \"0.25.6\",\n \"@esbuild/openbsd-arm64\": \"0.25.6\",\n \"@esbuild/openbsd-x64\": \"0.25.6\",\n \"@esbuild/openharmony-arm64\": \"0.25.6\",\n \"@esbuild/sunos-x64\": \"0.25.6\",\n \"@esbuild/win32-arm64\": \"0.25.6\",\n \"@esbuild/win32-ia32\": \"0.25.6\",\n \"@esbuild/win32-x64\": \"0.25.6\"\n }\n },\n \"node_modules/escalade\": {\n \"version\": \"3.2.0\",\n \"resolved\": \"https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz\",\n \"integrity\": \"sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/estree-walker\": {\n \"version\": \"3.0.3\",\n \"resolved\": \"https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz\",\n \"integrity\": \"sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/estree\": \"^1.0.0\"\n }\n },\n \"node_modules/execa\": {\n \"version\": \"8.0.1\",\n \"resolved\": \"https://registry.npmjs.org/execa/-/execa-8.0.1.tgz\",\n \"integrity\": \"sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"cross-spawn\": \"^7.0.3\",\n \"get-stream\": \"^8.0.1\",\n \"human-signals\": \"^5.0.0\",\n \"is-stream\": \"^3.0.0\",\n \"merge-stream\": \"^2.0.0\",\n \"npm-run-path\": \"^5.1.0\",\n \"onetime\": \"^6.0.0\",\n \"signal-exit\": \"^4.1.0\",\n \"strip-final-newline\": \"^3.0.0\"\n },\n \"engines\": {\n \"node\": \">=16.17\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sindresorhus/execa?sponsor=1\"\n }\n },\n \"node_modules/fsevents\": {\n \"version\": \"2.3.3\",\n \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz\",\n \"integrity\": \"sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n }\n },\n \"node_modules/gensync\": {\n \"version\": \"1.0.0-beta.2\",\n \"resolved\": \"https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz\",\n \"integrity\": \"sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/get-caller-file\": {\n \"version\": \"2.0.5\",\n \"resolved\": \"https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz\",\n \"integrity\": \"sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \"6.* || 8.* || >= 10.*\"\n }\n },\n \"node_modules/get-func-name\": {\n \"version\": \"2.0.2\",\n \"resolved\": \"https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz\",\n \"integrity\": \"sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \"*\"\n }\n },\n \"node_modules/get-stream\": {\n \"version\": \"8.0.1\",\n \"resolved\": \"https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz\",\n \"integrity\": \"sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=16\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/get-tsconfig\": {\n \"version\": \"4.10.1\",\n \"resolved\": \"https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz\",\n \"integrity\": \"sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"resolve-pkg-maps\": \"^1.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/privatenumber/get-tsconfig?sponsor=1\"\n }\n },\n \"node_modules/has-flag\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz\",\n \"integrity\": \"sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/human-signals\": {\n \"version\": \"5.0.0\",\n \"resolved\": \"https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz\",\n \"integrity\": \"sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"engines\": {\n \"node\": \">=16.17.0\"\n }\n },\n \"node_modules/invariant\": {\n \"version\": \"2.2.4\",\n \"resolved\": \"https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz\",\n \"integrity\": \"sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"dependencies\": {\n \"loose-envify\": \"^1.0.0\"\n }\n },\n \"node_modules/is-fullwidth-code-point\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz\",\n \"integrity\": \"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/is-network-error\": {\n \"version\": \"1.1.0\",\n \"resolved\": \"https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz\",\n \"integrity\": \"sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">=16\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/is-stream\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz\",\n \"integrity\": \"sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/isexe\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz\",\n \"integrity\": \"sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/js-tokens\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz\",\n \"integrity\": \"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==\",\n \"license\": \"MIT\"\n },\n \"node_modules/jsesc\": {\n \"version\": \"3.1.0\",\n \"resolved\": \"https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz\",\n \"integrity\": \"sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"jsesc\": \"bin/jsesc\"\n },\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/json5\": {\n \"version\": \"2.2.3\",\n \"resolved\": \"https://registry.npmjs.org/json5/-/json5-2.2.3.tgz\",\n \"integrity\": \"sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"json5\": \"lib/cli.js\"\n },\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/local-pkg\": {\n \"version\": \"0.5.1\",\n \"resolved\": \"https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz\",\n \"integrity\": \"sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"mlly\": \"^1.7.3\",\n \"pkg-types\": \"^1.2.1\"\n },\n \"engines\": {\n \"node\": \">=14\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/antfu\"\n }\n },\n \"node_modules/lodash\": {\n \"version\": \"4.17.21\",\n \"resolved\": \"https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz\",\n \"integrity\": \"sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/loose-envify\": {\n \"version\": \"1.4.0\",\n \"resolved\": \"https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz\",\n \"integrity\": \"sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"js-tokens\": \"^3.0.0 || ^4.0.0\"\n },\n \"bin\": {\n \"loose-envify\": \"cli.js\"\n }\n },\n \"node_modules/loupe\": {\n \"version\": \"2.3.7\",\n \"resolved\": \"https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz\",\n \"integrity\": \"sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"get-func-name\": \"^2.0.1\"\n }\n },\n \"node_modules/lru-cache\": {\n \"version\": \"5.1.1\",\n \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz\",\n \"integrity\": \"sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"dependencies\": {\n \"yallist\": \"^3.0.2\"\n }\n },\n \"node_modules/magic-string\": {\n \"version\": \"0.30.17\",\n \"resolved\": \"https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz\",\n \"integrity\": \"sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jridgewell/sourcemap-codec\": \"^1.5.0\"\n }\n },\n \"node_modules/merge-stream\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz\",\n \"integrity\": \"sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/mimic-fn\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz\",\n \"integrity\": \"sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=12\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/mlly\": {\n \"version\": \"1.7.4\",\n \"resolved\": \"https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz\",\n \"integrity\": \"sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"acorn\": \"^8.14.0\",\n \"pathe\": \"^2.0.1\",\n \"pkg-types\": \"^1.3.0\",\n \"ufo\": \"^1.5.4\"\n }\n },\n \"node_modules/mlly/node_modules/pathe\": {\n \"version\": \"2.0.3\",\n \"resolved\": \"https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz\",\n \"integrity\": \"sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/ms\": {\n \"version\": \"2.1.3\",\n \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz\",\n \"integrity\": \"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/nanoid\": {\n \"version\": \"3.3.11\",\n \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz\",\n \"integrity\": \"sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"bin\": {\n \"nanoid\": \"bin/nanoid.cjs\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || ^13.7 || ^14 || >=15.0.1\"\n }\n },\n \"node_modules/node-gyp-build-optional-packages\": {\n \"version\": \"5.1.1\",\n \"resolved\": \"https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz\",\n \"integrity\": \"sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==\",\n \"license\": \"MIT\",\n \"optional\": true,\n \"peer\": true,\n \"dependencies\": {\n \"detect-libc\": \"^2.0.1\"\n },\n \"bin\": {\n \"node-gyp-build-optional-packages\": \"bin.js\",\n \"node-gyp-build-optional-packages-optional\": \"optional.js\",\n \"node-gyp-build-optional-packages-test\": \"build-test.js\"\n }\n },\n \"node_modules/node-releases\": {\n \"version\": \"2.0.19\",\n \"resolved\": \"https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz\",\n \"integrity\": \"sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/npm-run-path\": {\n \"version\": \"5.3.0\",\n \"resolved\": \"https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz\",\n \"integrity\": \"sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"path-key\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/npm-run-path/node_modules/path-key\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz\",\n \"integrity\": \"sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=12\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/on-change\": {\n \"version\": \"5.0.1\",\n \"resolved\": \"https://registry.npmjs.org/on-change/-/on-change-5.0.1.tgz\",\n \"integrity\": \"sha512-n7THCP7RkyReRSLkJb8kUWoNsxUIBxTkIp3JKno+sEz6o/9AJ3w3P9fzQkITEkMwyTKJjZciF3v/pVoouxZZMg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">=18\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sindresorhus/on-change?sponsor=1\"\n }\n },\n \"node_modules/onetime\": {\n \"version\": \"6.0.0\",\n \"resolved\": \"https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz\",\n \"integrity\": \"sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"mimic-fn\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/p-limit\": {\n \"version\": \"5.0.0\",\n \"resolved\": \"https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz\",\n \"integrity\": \"sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"yocto-queue\": \"^1.0.0\"\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/p-retry\": {\n \"version\": \"6.2.1\",\n \"resolved\": \"https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz\",\n \"integrity\": \"sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"dependencies\": {\n \"@types/retry\": \"0.12.2\",\n \"is-network-error\": \"^1.0.0\",\n \"retry\": \"^0.13.1\"\n },\n \"engines\": {\n \"node\": \">=16.17\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/path-key\": {\n \"version\": \"3.1.1\",\n \"resolved\": \"https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz\",\n \"integrity\": \"sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/pathe\": {\n \"version\": \"1.1.2\",\n \"resolved\": \"https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz\",\n \"integrity\": \"sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/pathval\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz\",\n \"integrity\": \"sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \"*\"\n }\n },\n \"node_modules/picocolors\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz\",\n \"integrity\": \"sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/pkg-types\": {\n \"version\": \"1.3.1\",\n \"resolved\": \"https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz\",\n \"integrity\": \"sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"confbox\": \"^0.1.8\",\n \"mlly\": \"^1.7.4\",\n \"pathe\": \"^2.0.1\"\n }\n },\n \"node_modules/pkg-types/node_modules/pathe\": {\n \"version\": \"2.0.3\",\n \"resolved\": \"https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz\",\n \"integrity\": \"sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/postcss\": {\n \"version\": \"8.5.6\",\n \"resolved\": \"https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz\",\n \"integrity\": \"sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/postcss/\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/postcss\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"nanoid\": \"^3.3.11\",\n \"picocolors\": \"^1.1.1\",\n \"source-map-js\": \"^1.2.1\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || >=14\"\n }\n },\n \"node_modules/pretty-format\": {\n \"version\": \"29.7.0\",\n \"resolved\": \"https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz\",\n \"integrity\": \"sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@jest/schemas\": \"^29.6.3\",\n \"ansi-styles\": \"^5.0.0\",\n \"react-is\": \"^18.0.0\"\n },\n \"engines\": {\n \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n }\n },\n \"node_modules/pretty-format/node_modules/ansi-styles\": {\n \"version\": \"5.2.0\",\n \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz\",\n \"integrity\": \"sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n }\n },\n \"node_modules/react\": {\n \"version\": \"18.3.1\",\n \"resolved\": \"https://registry.npmjs.org/react/-/react-18.3.1.tgz\",\n \"integrity\": \"sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\"\n },\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/react-dom\": {\n \"version\": \"18.3.1\",\n \"resolved\": \"https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz\",\n \"integrity\": \"sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\",\n \"scheduler\": \"^0.23.2\"\n },\n \"peerDependencies\": {\n \"react\": \"^18.3.1\"\n }\n },\n \"node_modules/react-is\": {\n \"version\": \"18.3.1\",\n \"resolved\": \"https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz\",\n \"integrity\": \"sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/react-refresh\": {\n \"version\": \"0.17.0\",\n \"resolved\": \"https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz\",\n \"integrity\": \"sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/require-directory\": {\n \"version\": \"2.1.1\",\n \"resolved\": \"https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz\",\n \"integrity\": \"sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/resolve-pkg-maps\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz\",\n \"integrity\": \"sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"funding\": {\n \"url\": \"https://github.com/privatenumber/resolve-pkg-maps?sponsor=1\"\n }\n },\n \"node_modules/retry\": {\n \"version\": \"0.13.1\",\n \"resolved\": \"https://registry.npmjs.org/retry/-/retry-0.13.1.tgz\",\n \"integrity\": \"sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"engines\": {\n \"node\": \">= 4\"\n }\n },\n \"node_modules/rollup\": {\n \"version\": \"4.45.0\",\n \"resolved\": \"https://registry.npmjs.org/rollup/-/rollup-4.45.0.tgz\",\n \"integrity\": \"sha512-WLjEcJRIo7i3WDDgOIJqVI2d+lAC3EwvOGy+Xfq6hs+GQuAA4Di/H72xmXkOhrIWFg2PFYSKZYfH0f4vfKXN4A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@types/estree\": \"1.0.8\"\n },\n \"bin\": {\n \"rollup\": \"dist/bin/rollup\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\",\n \"npm\": \">=8.0.0\"\n },\n \"optionalDependencies\": {\n \"@rollup/rollup-android-arm-eabi\": \"4.45.0\",\n \"@rollup/rollup-android-arm64\": \"4.45.0\",\n \"@rollup/rollup-darwin-arm64\": \"4.45.0\",\n \"@rollup/rollup-darwin-x64\": \"4.45.0\",\n \"@rollup/rollup-freebsd-arm64\": \"4.45.0\",\n \"@rollup/rollup-freebsd-x64\": \"4.45.0\",\n \"@rollup/rollup-linux-arm-gnueabihf\": \"4.45.0\",\n \"@rollup/rollup-linux-arm-musleabihf\": \"4.45.0\",\n \"@rollup/rollup-linux-arm64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-arm64-musl\": \"4.45.0\",\n \"@rollup/rollup-linux-loongarch64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-powerpc64le-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-riscv64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-riscv64-musl\": \"4.45.0\",\n \"@rollup/rollup-linux-s390x-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-x64-gnu\": \"4.45.0\",\n \"@rollup/rollup-linux-x64-musl\": \"4.45.0\",\n \"@rollup/rollup-win32-arm64-msvc\": \"4.45.0\",\n \"@rollup/rollup-win32-ia32-msvc\": \"4.45.0\",\n \"@rollup/rollup-win32-x64-msvc\": \"4.45.0\",\n \"fsevents\": \"~2.3.2\"\n }\n },\n \"node_modules/rxjs\": {\n \"version\": \"7.8.2\",\n \"resolved\": \"https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz\",\n \"integrity\": \"sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"dependencies\": {\n \"tslib\": \"^2.1.0\"\n }\n },\n \"node_modules/scheduler\": {\n \"version\": \"0.23.2\",\n \"resolved\": \"https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz\",\n \"integrity\": \"sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\"\n }\n },\n \"node_modules/semver\": {\n \"version\": \"6.3.1\",\n \"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n \"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"bin\": {\n \"semver\": \"bin/semver.js\"\n }\n },\n \"node_modules/shebang-command\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz\",\n \"integrity\": \"sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"shebang-regex\": \"^3.0.0\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/shebang-regex\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz\",\n \"integrity\": \"sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/shell-quote\": {\n \"version\": \"1.8.3\",\n \"resolved\": \"https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz\",\n \"integrity\": \"sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">= 0.4\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/ljharb\"\n }\n },\n \"node_modules/siginfo\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz\",\n \"integrity\": \"sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/signal-exit\": {\n \"version\": \"4.1.0\",\n \"resolved\": \"https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz\",\n \"integrity\": \"sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \">=14\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/isaacs\"\n }\n },\n \"node_modules/source-map-js\": {\n \"version\": \"1.2.1\",\n \"resolved\": \"https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz\",\n \"integrity\": \"sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==\",\n \"dev\": true,\n \"license\": \"BSD-3-Clause\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/spawn-command\": {\n \"version\": \"0.0.2\",\n \"resolved\": \"https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz\",\n \"integrity\": \"sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==\",\n \"dev\": true\n },\n \"node_modules/stackback\": {\n \"version\": \"0.0.2\",\n \"resolved\": \"https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz\",\n \"integrity\": \"sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/std-env\": {\n \"version\": \"3.9.0\",\n \"resolved\": \"https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz\",\n \"integrity\": \"sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/string-width\": {\n \"version\": \"4.2.3\",\n \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"emoji-regex\": \"^8.0.0\",\n \"is-fullwidth-code-point\": \"^3.0.0\",\n \"strip-ansi\": \"^6.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/strip-ansi\": {\n \"version\": \"6.0.1\",\n \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-regex\": \"^5.0.1\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/strip-final-newline\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz\",\n \"integrity\": \"sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=12\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/strip-literal\": {\n \"version\": \"2.1.1\",\n \"resolved\": \"https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz\",\n \"integrity\": \"sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"js-tokens\": \"^9.0.1\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/antfu\"\n }\n },\n \"node_modules/strip-literal/node_modules/js-tokens\": {\n \"version\": \"9.0.1\",\n \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz\",\n \"integrity\": \"sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/supports-color\": {\n \"version\": \"8.1.1\",\n \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz\",\n \"integrity\": \"sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"has-flag\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/supports-color?sponsor=1\"\n }\n },\n \"node_modules/tinybench\": {\n \"version\": \"2.9.0\",\n \"resolved\": \"https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz\",\n \"integrity\": \"sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/tinypool\": {\n \"version\": \"0.8.4\",\n \"resolved\": \"https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz\",\n \"integrity\": \"sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=14.0.0\"\n }\n },\n \"node_modules/tinyspy\": {\n \"version\": \"2.2.1\",\n \"resolved\": \"https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz\",\n \"integrity\": \"sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=14.0.0\"\n }\n },\n \"node_modules/tree-kill\": {\n \"version\": \"1.2.2\",\n \"resolved\": \"https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz\",\n \"integrity\": \"sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"tree-kill\": \"cli.js\"\n }\n },\n \"node_modules/tslib\": {\n \"version\": \"2.8.1\",\n \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz\",\n \"integrity\": \"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==\",\n \"dev\": true,\n \"license\": \"0BSD\"\n },\n \"node_modules/tsx\": {\n \"version\": \"4.20.3\",\n \"resolved\": \"https://registry.npmjs.org/tsx/-/tsx-4.20.3.tgz\",\n \"integrity\": \"sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"esbuild\": \"~0.25.0\",\n \"get-tsconfig\": \"^4.7.5\"\n },\n \"bin\": {\n \"tsx\": \"dist/cli.mjs\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"optionalDependencies\": {\n \"fsevents\": \"~2.3.3\"\n }\n },\n \"node_modules/type-detect\": {\n \"version\": \"4.1.0\",\n \"resolved\": \"https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz\",\n \"integrity\": \"sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=4\"\n }\n },\n \"node_modules/typescript\": {\n \"version\": \"5.8.3\",\n \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz\",\n \"integrity\": \"sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==\",\n \"dev\": true,\n \"license\": \"Apache-2.0\",\n \"bin\": {\n \"tsc\": \"bin/tsc\",\n \"tsserver\": \"bin/tsserver\"\n },\n \"engines\": {\n \"node\": \">=14.17\"\n }\n },\n \"node_modules/ufo\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz\",\n \"integrity\": \"sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/undici-types\": {\n \"version\": \"6.21.0\",\n \"resolved\": \"https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz\",\n \"integrity\": \"sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==\",\n \"dev\": true,\n \"license\": \"MIT\"\n },\n \"node_modules/update-browserslist-db\": {\n \"version\": \"1.1.3\",\n \"resolved\": \"https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz\",\n \"integrity\": \"sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"escalade\": \"^3.2.0\",\n \"picocolors\": \"^1.1.1\"\n },\n \"bin\": {\n \"update-browserslist-db\": \"cli.js\"\n },\n \"peerDependencies\": {\n \"browserslist\": \">= 4.21.0\"\n }\n },\n \"node_modules/use-sync-external-store\": {\n \"version\": \"1.5.0\",\n \"resolved\": \"https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz\",\n \"integrity\": \"sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==\",\n \"license\": \"MIT\",\n \"peerDependencies\": {\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\"\n }\n },\n \"node_modules/vite\": {\n \"version\": \"5.4.19\",\n \"resolved\": \"https://registry.npmjs.org/vite/-/vite-5.4.19.tgz\",\n \"integrity\": \"sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"esbuild\": \"^0.21.3\",\n \"postcss\": \"^8.4.43\",\n \"rollup\": \"^4.20.0\"\n },\n \"bin\": {\n \"vite\": \"bin/vite.js\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/vitejs/vite?sponsor=1\"\n },\n \"optionalDependencies\": {\n \"fsevents\": \"~2.3.3\"\n },\n \"peerDependencies\": {\n \"@types/node\": \"^18.0.0 || >=20.0.0\",\n \"less\": \"*\",\n \"lightningcss\": \"^1.21.0\",\n \"sass\": \"*\",\n \"sass-embedded\": \"*\",\n \"stylus\": \"*\",\n \"sugarss\": \"*\",\n \"terser\": \"^5.4.0\"\n },\n \"peerDependenciesMeta\": {\n \"@types/node\": {\n \"optional\": true\n },\n \"less\": {\n \"optional\": true\n },\n \"lightningcss\": {\n \"optional\": true\n },\n \"sass\": {\n \"optional\": true\n },\n \"sass-embedded\": {\n \"optional\": true\n },\n \"stylus\": {\n \"optional\": true\n },\n \"sugarss\": {\n \"optional\": true\n },\n \"terser\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/vite-node\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/vite-node/-/vite-node-1.6.1.tgz\",\n \"integrity\": \"sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"cac\": \"^6.7.14\",\n \"debug\": \"^4.3.4\",\n \"pathe\": \"^1.1.1\",\n \"picocolors\": \"^1.0.0\",\n \"vite\": \"^5.0.0\"\n },\n \"bin\": {\n \"vite-node\": \"vite-node.mjs\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/aix-ppc64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz\",\n \"integrity\": \"sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"aix\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-arm\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz\",\n \"integrity\": \"sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/android-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/darwin-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/darwin-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/freebsd-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/freebsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-arm\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz\",\n \"integrity\": \"sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-ia32\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz\",\n \"integrity\": \"sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-loong64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz\",\n \"integrity\": \"sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-mips64el\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz\",\n \"integrity\": \"sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==\",\n \"cpu\": [\n \"mips64el\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-ppc64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz\",\n \"integrity\": \"sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-riscv64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz\",\n \"integrity\": \"sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-s390x\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz\",\n \"integrity\": \"sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/linux-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/netbsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"netbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/openbsd-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"openbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/sunos-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"sunos\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-arm64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz\",\n \"integrity\": \"sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-ia32\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz\",\n \"integrity\": \"sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/@esbuild/win32-x64\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz\",\n \"integrity\": \"sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"license\": \"MIT\",\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/vite/node_modules/esbuild\": {\n \"version\": \"0.21.5\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz\",\n \"integrity\": \"sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"license\": \"MIT\",\n \"bin\": {\n \"esbuild\": \"bin/esbuild\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"optionalDependencies\": {\n \"@esbuild/aix-ppc64\": \"0.21.5\",\n \"@esbuild/android-arm\": \"0.21.5\",\n \"@esbuild/android-arm64\": \"0.21.5\",\n \"@esbuild/android-x64\": \"0.21.5\",\n \"@esbuild/darwin-arm64\": \"0.21.5\",\n \"@esbuild/darwin-x64\": \"0.21.5\",\n \"@esbuild/freebsd-arm64\": \"0.21.5\",\n \"@esbuild/freebsd-x64\": \"0.21.5\",\n \"@esbuild/linux-arm\": \"0.21.5\",\n \"@esbuild/linux-arm64\": \"0.21.5\",\n \"@esbuild/linux-ia32\": \"0.21.5\",\n \"@esbuild/linux-loong64\": \"0.21.5\",\n \"@esbuild/linux-mips64el\": \"0.21.5\",\n \"@esbuild/linux-ppc64\": \"0.21.5\",\n \"@esbuild/linux-riscv64\": \"0.21.5\",\n \"@esbuild/linux-s390x\": \"0.21.5\",\n \"@esbuild/linux-x64\": \"0.21.5\",\n \"@esbuild/netbsd-x64\": \"0.21.5\",\n \"@esbuild/openbsd-x64\": \"0.21.5\",\n \"@esbuild/sunos-x64\": \"0.21.5\",\n \"@esbuild/win32-arm64\": \"0.21.5\",\n \"@esbuild/win32-ia32\": \"0.21.5\",\n \"@esbuild/win32-x64\": \"0.21.5\"\n }\n },\n \"node_modules/vitest\": {\n \"version\": \"1.6.1\",\n \"resolved\": \"https://registry.npmjs.org/vitest/-/vitest-1.6.1.tgz\",\n \"integrity\": \"sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@vitest/expect\": \"1.6.1\",\n \"@vitest/runner\": \"1.6.1\",\n \"@vitest/snapshot\": \"1.6.1\",\n \"@vitest/spy\": \"1.6.1\",\n \"@vitest/utils\": \"1.6.1\",\n \"acorn-walk\": \"^8.3.2\",\n \"chai\": \"^4.3.10\",\n \"debug\": \"^4.3.4\",\n \"execa\": \"^8.0.1\",\n \"local-pkg\": \"^0.5.0\",\n \"magic-string\": \"^0.30.5\",\n \"pathe\": \"^1.1.1\",\n \"picocolors\": \"^1.0.0\",\n \"std-env\": \"^3.5.0\",\n \"strip-literal\": \"^2.0.0\",\n \"tinybench\": \"^2.5.1\",\n \"tinypool\": \"^0.8.3\",\n \"vite\": \"^5.0.0\",\n \"vite-node\": \"1.6.1\",\n \"why-is-node-running\": \"^2.2.2\"\n },\n \"bin\": {\n \"vitest\": \"vitest.mjs\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n },\n \"funding\": {\n \"url\": \"https://opencollective.com/vitest\"\n },\n \"peerDependencies\": {\n \"@edge-runtime/vm\": \"*\",\n \"@types/node\": \"^18.0.0 || >=20.0.0\",\n \"@vitest/browser\": \"1.6.1\",\n \"@vitest/ui\": \"1.6.1\",\n \"happy-dom\": \"*\",\n \"jsdom\": \"*\"\n },\n \"peerDependenciesMeta\": {\n \"@edge-runtime/vm\": {\n \"optional\": true\n },\n \"@types/node\": {\n \"optional\": true\n },\n \"@vitest/browser\": {\n \"optional\": true\n },\n \"@vitest/ui\": {\n \"optional\": true\n },\n \"happy-dom\": {\n \"optional\": true\n },\n \"jsdom\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/which\": {\n \"version\": \"2.0.2\",\n \"resolved\": \"https://registry.npmjs.org/which/-/which-2.0.2.tgz\",\n \"integrity\": \"sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"dependencies\": {\n \"isexe\": \"^2.0.0\"\n },\n \"bin\": {\n \"node-which\": \"bin/node-which\"\n },\n \"engines\": {\n \"node\": \">= 8\"\n }\n },\n \"node_modules/why-is-node-running\": {\n \"version\": \"2.3.0\",\n \"resolved\": \"https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz\",\n \"integrity\": \"sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"siginfo\": \"^2.0.0\",\n \"stackback\": \"0.0.2\"\n },\n \"bin\": {\n \"why-is-node-running\": \"cli.js\"\n },\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/wrap-ansi\": {\n \"version\": \"7.0.0\",\n \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\n \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"ansi-styles\": \"^4.0.0\",\n \"string-width\": \"^4.1.0\",\n \"strip-ansi\": \"^6.0.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"funding\": {\n \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n }\n },\n \"node_modules/y18n\": {\n \"version\": \"5.0.8\",\n \"resolved\": \"https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz\",\n \"integrity\": \"sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \">=10\"\n }\n },\n \"node_modules/yallist\": {\n \"version\": \"3.1.1\",\n \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz\",\n \"integrity\": \"sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==\",\n \"dev\": true,\n \"license\": \"ISC\"\n },\n \"node_modules/yargs\": {\n \"version\": \"17.7.2\",\n \"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz\",\n \"integrity\": \"sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"dependencies\": {\n \"cliui\": \"^8.0.1\",\n \"escalade\": \"^3.1.1\",\n \"get-caller-file\": \"^2.0.5\",\n \"require-directory\": \"^2.1.1\",\n \"string-width\": \"^4.2.3\",\n \"y18n\": \"^5.0.5\",\n \"yargs-parser\": \"^21.1.1\"\n },\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/yargs-parser\": {\n \"version\": \"21.1.1\",\n \"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz\",\n \"integrity\": \"sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==\",\n \"dev\": true,\n \"license\": \"ISC\",\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/yocto-queue\": {\n \"version\": \"1.2.1\",\n \"resolved\": \"https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz\",\n \"integrity\": \"sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==\",\n \"dev\": true,\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=12.20\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/sindresorhus\"\n }\n },\n \"node_modules/zod\": {\n \"version\": \"3.25.76\",\n \"resolved\": \"https://registry.npmjs.org/zod/-/zod-3.25.76.tgz\",\n \"integrity\": \"sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==\",\n \"license\": \"MIT\",\n \"peer\": true,\n \"funding\": {\n \"url\": \"https://github.com/sponsors/colinhacks\"\n }\n }\n }\n}\n", "package.json": "{\n \"name\": \"example-stream\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"concurrently \\\"tsx --watch src/backend/server.ts\\\" \\\"vite\\\"\",\n \"build\": \"vite build\",\n \"preview\": \"vite preview\",\n \"check-types\": \"tsc --noEmit\",\n \"test\": \"vitest\"\n },\n \"dependencies\": {\n \"rivetkit\": \"^0.9.1\",\n \"@rivetkit/react\": \"^0.9.1\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^20.0.0\",\n \"@types/react\": \"^18.2.0\",\n \"@types/react-dom\": \"^18.2.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"concurrently\": \"^8.2.0\",\n \"tsx\": \"^4.0.0\",\n \"typescript\": \"^5.0.0\",\n \"vite\": \"^5.0.0\",\n \"vitest\": \"^1.0.0\"\n }\n}\n", "tsconfig.json": "{\n \"compilerOptions\": {\n \"target\": \"ES2020\",\n \"lib\": [\"ES2020\", \"DOM\", \"DOM.Iterable\"],\n \"module\": \"ESNext\",\n \"skipLibCheck\": true,\n \"moduleResolution\": \"bundler\",\n \"allowImportingTsExtensions\": true,\n \"resolveJsonModule\": true,\n \"isolatedModules\": true,\n \"noEmit\": true,\n \"jsx\": \"react-jsx\",\n \"strict\": true,\n \"noUnusedLocals\": true,\n \"noUnusedParameters\": true,\n \"noFallthroughCasesInSwitch\": true\n },\n \"include\": [\"src\", \"tests\"],\n \"exclude\": [\"node_modules\", \"dist\"]\n}\n", @@ -230,7 +230,7 @@ export const examples: ExampleData[] = [ "src/frontend/App.tsx": "import { createClient, createRivetKit } from \"@rivetkit/react\";\nimport { useEffect, useState } from \"react\";\nimport type { registry } from \"../backend/registry\";\n\nconst client = createClient(\"http://localhost:8080\");\nconst { useActor } = createRivetKit(client);\n\nexport function App() {\n\tconst [topValues, setTopValues] = useState([]);\n\tconst [newValue, setNewValue] = useState(0);\n\tconst [totalCount, setTotalCount] = useState(0);\n\tconst [highestValue, setHighestValue] = useState(null);\n\n\tconst streamProcessor = useActor({\n\t\tname: \"streamProcessor\",\n\t\tkey: [\"global\"],\n\t});\n\n\t// Load initial stats\n\tuseEffect(() => {\n\t\tif (streamProcessor.connection) {\n\t\t\tstreamProcessor.connection.getStats().then((stats) => {\n\t\t\t\tsetTopValues(stats.topValues);\n\t\t\t\tsetTotalCount(stats.totalCount);\n\t\t\t\tsetHighestValue(stats.highestValue);\n\t\t\t});\n\t\t}\n\t}, [streamProcessor.connection]);\n\n\t// Listen for updates from other clients\n\tstreamProcessor.useEvent(\"updated\", ({ topValues, totalCount, highestValue }: {\n\t\ttopValues: number[];\n\t\ttotalCount: number;\n\t\thighestValue: number | null;\n\t}) => {\n\t\tsetTopValues(topValues);\n\t\tsetTotalCount(totalCount);\n\t\tsetHighestValue(highestValue);\n\t});\n\n\t// Add a new value to the stream\n\tconst handleAddValue = async () => {\n\t\tif (streamProcessor.connection && !isNaN(newValue)) {\n\t\t\tawait streamProcessor.connection.addValue(newValue);\n\t\t\tsetNewValue(0);\n\t\t}\n\t};\n\n\t// Reset the stream\n\tconst handleReset = async () => {\n\t\tif (streamProcessor.connection) {\n\t\t\tconst result = await streamProcessor.connection.reset();\n\t\t\tsetTopValues(result.topValues);\n\t\t\tsetTotalCount(result.totalCount);\n\t\t\tsetHighestValue(result.highestValue);\n\t\t}\n\t};\n\n\t// Handle form submission\n\tconst handleSubmit = (e: React.FormEvent) => {\n\t\te.preventDefault();\n\t\thandleAddValue();\n\t};\n\n\t// Handle random value generation\n\tconst handleRandomValue = () => {\n\t\tconst randomValue = Math.floor(Math.random() * 1000) + 1;\n\t\tsetNewValue(randomValue);\n\t};\n\n\treturn (\n\t\t
\n\t\t\t
\n\t\t\t\t

Stream Processor

\n\t\t\t\t

Real-time top-3 value tracking with RivetKit

\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t

How it works

\n\t\t\t\t

\n\t\t\t\t\tThis stream processor maintains the top 3 highest values in real-time. \n\t\t\t\t\tAdd numbers and watch as the system automatically keeps track of the highest values. \n\t\t\t\t\tAll connected clients see updates immediately when new values are added.\n\t\t\t\t

\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t

🏆 Top 3 Values

\n\t\t\t\t\t\t{topValues.length === 0 ? (\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\tNo values added yet.
\n\t\t\t\t\t\t\t\tAdd some numbers to get started!\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\ttopValues.map((value, index) => (\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t#{index + 1}\n\t\t\t\t\t\t\t\t\t{value.toLocaleString()}\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t))\n\t\t\t\t\t\t)}\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t

Add New Value

\n\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t setNewValue(Number(e.target.value))}\n\t\t\t\t\t\t\t\tplaceholder=\"Enter any number...\"\n\t\t\t\t\t\t\t\tdisabled={!streamProcessor.connection}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t
\n\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
{totalCount}
\n\t\t\t\t\t
Total Values
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
{highestValue?.toLocaleString() || \"—\"}
\n\t\t\t\t\t
Highest Value
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
{topValues.length}
\n\t\t\t\t\t
Top Values Count
\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t);\n}", "src/frontend/main.tsx": "import { StrictMode } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { App } from \"./App\";\n\nconst root = document.getElementById(\"root\");\nif (!root) throw new Error(\"Root element not found\");\n\ncreateRoot(root).render(\n\t\n\t\t\n\t\n);", "src/frontend/index.html": "\n\n\n \n \n Stream Processor - RivetKit\n \n\n\n
\n \n\n", - "src/backend/registry.ts": "import { actor, setup } from \"rivetkit\";\n\nexport type StreamState = {\n\ttopValues: number[];\n};\n\nconst streamProcessor = actor({\n\tonAuth: () => {},\n\t// Persistent state that survives restarts: https://rivet.gg/docs/actors/state\n\tstate: {\n\t\ttopValues: [] as number[],\n\t\ttotalValues: 0,\n\t},\n\n\tactions: {\n\t\t// Callable functions from clients: https://rivet.gg/docs/actors/actions\n\t\tgetTopValues: (c) => c.state.topValues,\n\n\t\tgetStats: (c) => ({\n\t\t\ttopValues: c.state.topValues,\n\t\t\ttotalCount: c.state.totalValues,\n\t\t\thighestValue: c.state.topValues.length > 0 ? c.state.topValues[0] : null,\n\t\t}),\n\n\t\taddValue: (c, value: number) => {\n\t\t\t// State changes are automatically persisted\n\t\t\tc.state.totalValues++;\n\n\t\t\t// Insert new value if needed\n\t\t\tconst insertAt = c.state.topValues.findIndex((v) => value > v);\n\t\t\tif (insertAt === -1 && c.state.topValues.length < 3) {\n\t\t\t\t// Add to end if not better than existing values but we have space\n\t\t\t\tc.state.topValues.push(value);\n\t\t\t} else if (insertAt !== -1) {\n\t\t\t\t// Insert at the correct position\n\t\t\t\tc.state.topValues.splice(insertAt, 0, value);\n\t\t\t}\n\n\t\t\t// Keep only top 3\n\t\t\tif (c.state.topValues.length > 3) {\n\t\t\t\tc.state.topValues.length = 3;\n\t\t\t}\n\n\t\t\t// Sort descending to ensure correct order\n\t\t\tc.state.topValues.sort((a, b) => b - a);\n\n\t\t\tconst result = {\n\t\t\t\ttopValues: c.state.topValues,\n\t\t\t\ttotalCount: c.state.totalValues,\n\t\t\t\thighestValue:\n\t\t\t\t\tc.state.topValues.length > 0 ? c.state.topValues[0] : null,\n\t\t\t};\n\n\t\t\t// Send events to all connected clients: https://rivet.gg/docs/actors/events\n\t\t\tc.broadcast(\"updated\", result);\n\n\t\t\treturn c.state.topValues;\n\t\t},\n\n\t\treset: (c) => {\n\t\t\tc.state.topValues = [];\n\t\t\tc.state.totalValues = 0;\n\n\t\t\tconst result = {\n\t\t\t\ttopValues: c.state.topValues,\n\t\t\t\ttotalCount: c.state.totalValues,\n\t\t\t\thighestValue: null,\n\t\t\t};\n\n\t\t\tc.broadcast(\"updated\", result);\n\n\t\t\treturn result;\n\t\t},\n\t},\n});\n\n// Register actors for use: https://rivet.gg/docs/setup\nexport const registry = setup({\n\tuse: { streamProcessor },\n});\n", + "src/backend/registry.ts": "import { actor, setup } from \"rivetkit\";\n\nexport type StreamState = {\n\ttopValues: number[];\n};\n\nconst streamProcessor = actor({\n\tonAuth: () => {},\n\t// Persistent state that survives restarts: https://rivet.dev/docs/actors/state\n\tstate: {\n\t\ttopValues: [] as number[],\n\t\ttotalValues: 0,\n\t},\n\n\tactions: {\n\t\t// Callable functions from clients: https://rivet.dev/docs/actors/actions\n\t\tgetTopValues: (c) => c.state.topValues,\n\n\t\tgetStats: (c) => ({\n\t\t\ttopValues: c.state.topValues,\n\t\t\ttotalCount: c.state.totalValues,\n\t\t\thighestValue: c.state.topValues.length > 0 ? c.state.topValues[0] : null,\n\t\t}),\n\n\t\taddValue: (c, value: number) => {\n\t\t\t// State changes are automatically persisted\n\t\t\tc.state.totalValues++;\n\n\t\t\t// Insert new value if needed\n\t\t\tconst insertAt = c.state.topValues.findIndex((v) => value > v);\n\t\t\tif (insertAt === -1 && c.state.topValues.length < 3) {\n\t\t\t\t// Add to end if not better than existing values but we have space\n\t\t\t\tc.state.topValues.push(value);\n\t\t\t} else if (insertAt !== -1) {\n\t\t\t\t// Insert at the correct position\n\t\t\t\tc.state.topValues.splice(insertAt, 0, value);\n\t\t\t}\n\n\t\t\t// Keep only top 3\n\t\t\tif (c.state.topValues.length > 3) {\n\t\t\t\tc.state.topValues.length = 3;\n\t\t\t}\n\n\t\t\t// Sort descending to ensure correct order\n\t\t\tc.state.topValues.sort((a, b) => b - a);\n\n\t\t\tconst result = {\n\t\t\t\ttopValues: c.state.topValues,\n\t\t\t\ttotalCount: c.state.totalValues,\n\t\t\t\thighestValue:\n\t\t\t\t\tc.state.topValues.length > 0 ? c.state.topValues[0] : null,\n\t\t\t};\n\n\t\t\t// Send events to all connected clients: https://rivet.dev/docs/actors/events\n\t\t\tc.broadcast(\"updated\", result);\n\n\t\t\treturn c.state.topValues;\n\t\t},\n\n\t\treset: (c) => {\n\t\t\tc.state.topValues = [];\n\t\t\tc.state.totalValues = 0;\n\n\t\t\tconst result = {\n\t\t\t\ttopValues: c.state.topValues,\n\t\t\t\ttotalCount: c.state.totalValues,\n\t\t\t\thighestValue: null,\n\t\t\t};\n\n\t\t\tc.broadcast(\"updated\", result);\n\n\t\t\treturn result;\n\t\t},\n\t},\n});\n\n// Register actors for use: https://rivet.dev/docs/setup\nexport const registry = setup({\n\tuse: { streamProcessor },\n});\n", "src/backend/server.ts": "import { registry } from \"./registry\";\n\nregistry.runServer({\n\tcors: {\n\t\torigin: \"*\",\n\t},\n});\n" } } diff --git a/site/src/data/integrations/shared.ts b/site/src/data/integrations/shared.ts new file mode 100644 index 0000000000..d62b689fdc --- /dev/null +++ b/site/src/data/integrations/shared.ts @@ -0,0 +1,73 @@ +export interface Integration { + title: string; + href: string; + description: string; +} + +export interface IntegrationGroup { + title: string; + items: Integration[]; +} + +export const integrationGroups: IntegrationGroup[] = [ + { + title: "Backend", + items: [ + { + title: "Hono", + href: "/docs/integrations/hono", + description: "Lightweight and fast web framework for modern JavaScript", + }, + { + title: "Express", + href: "/docs/integrations/express", + description: + "Popular Node.js web framework with extensive middleware support", + }, + { + title: "Elysia", + href: "/docs/integrations/elysia", + description: "Fast and type-safe TypeScript web framework", + }, + { + title: "tRPC", + href: "/docs/integrations/trpc", + description: "End-to-end type-safe API development", + }, + { + title: "Next.js", + href: "/docs/integrations/next-js", + description: + "Full-stack React framework that brings Rivet into the Next.js runtime", + }, + ], + }, + { + title: "Auth", + items: [ + { + title: "Better Auth", + href: "/docs/integrations/better-auth", + description: + "Modern authentication library with TypeScript support", + }, + ], + }, + { + title: "Misc", + items: [ + { + title: "Vitest", + href: "/docs/integrations/vitest", + description: + "Fast unit testing framework for JavaScript and TypeScript", + }, + { + title: "Pino", + href: "/docs/integrations/pino", + description: + "High-performance structured logger for Node.js services", + }, + ], + }, +]; diff --git a/site/src/lib/cloud-api/client.ts b/site/src/lib/cloud-api/client.ts index 60056d4d8e..19a0450348 100644 --- a/site/src/lib/cloud-api/client.ts +++ b/site/src/lib/cloud-api/client.ts @@ -6,7 +6,7 @@ import type { } from "./types"; const CLOUD_API_URL = - process.env.NEXT_PUBLIC_CLOUD_API_URL || "https://cloud.rivet.gg"; + process.env.NEXT_PUBLIC_CLOUD_API_URL || "https://cloud.rivet.dev"; class CloudApiClient { private baseUrl: string; diff --git a/site/src/lib/siteUrl.js b/site/src/lib/siteUrl.js index 847312b85c..72a3bf04a1 100644 --- a/site/src/lib/siteUrl.js +++ b/site/src/lib/siteUrl.js @@ -1,5 +1,5 @@ export function getSiteUrl() { - // let siteUrl = process.env.CF_PAGES_URL ?? 'https://www.rivet.gg'; // CF_PAGES_URL returns the pages.dev URL for prod - const siteUrl = "https://www.rivet.gg"; + // let siteUrl = process.env.CF_PAGES_URL ?? 'https://www.rivet.dev'; // CF_PAGES_URL returns the pages.dev URL for prod + const siteUrl = "https://www.rivet.dev"; return siteUrl; } diff --git a/site/src/posts/2024-02-12-usage-pricing-update/page.mdx b/site/src/posts/2024-02-12-usage-pricing-update/page.mdx index 3bea55287a..b48069a150 100644 --- a/site/src/posts/2024-02-12-usage-pricing-update/page.mdx +++ b/site/src/posts/2024-02-12-usage-pricing-update/page.mdx @@ -28,8 +28,8 @@ Our new pricing structure is designed to be straightforward and predictable: - Storage Reads: 1M + $0.20/million -For more details about our pricing, visit our [pricing page](https://rivet.gg/pricing). +For more details about our pricing, visit our [pricing page](https://rivet.dev/pricing). ## Questions? -If you have any questions about the new pricing model, feel free to reach out to us on [Discord](https://rivet.gg/discord) or [support](https://rivet.gg/support). \ No newline at end of file +If you have any questions about the new pricing model, feel free to reach out to us on [Discord](https://rivet.dev/discord) or [support](https://rivet.dev/support). \ No newline at end of file diff --git a/site/src/posts/2024-12-21-rivet-actors-launch/page.mdx b/site/src/posts/2024-12-21-rivet-actors-launch/page.mdx index bfbedc110e..8a6a46af72 100644 --- a/site/src/posts/2024-12-21-rivet-actors-launch/page.mdx +++ b/site/src/posts/2024-12-21-rivet-actors-launch/page.mdx @@ -13,6 +13,6 @@ Today we are launching Rivet Actors to help developers build and scale realtime - Open-source - Self-hostable -Learn more: [Rivet Actors Documentation](https://rivet.gg/docs/actors) +Learn more: [Rivet Actors Documentation](https://rivet.dev/docs/actors) diff --git a/site/src/posts/2025-02-16-sqlite-on-the-server-is-misunderstood/page.mdx b/site/src/posts/2025-02-16-sqlite-on-the-server-is-misunderstood/page.mdx index 88e3f22ab1..b6ff3a61fd 100644 --- a/site/src/posts/2025-02-16-sqlite-on-the-server-is-misunderstood/page.mdx +++ b/site/src/posts/2025-02-16-sqlite-on-the-server-is-misunderstood/page.mdx @@ -201,7 +201,7 @@ Despite its benefits, SQLite at scale presents a few challenges: - There are no case studies like Cassandra & DynamoDB have of using SQLite with this architecture at hyper-scale. This will change with time. - We're shipping an open-source & self-hostable alternative to Cloudflare Durable Objects with SQLite in the near future. Follow us on [X](https://x.com/rivet_dev), [Bluesky](https://bsky.app/profile/rivet.gg), or [Discord](https://rivet.gg/discord) to get notified on updates. + We're shipping an open-source & self-hostable alternative to Cloudflare Durable Objects with SQLite in the near future. Follow us on [X](https://x.com/rivet_dev), [Bluesky](https://bsky.app/profile/rivet.dev), or [Discord](https://rivet.dev/discord) to get notified on updates. ## Conclusion diff --git a/site/src/posts/2025-03-15-writing-docs-for-ai/page.mdx b/site/src/posts/2025-03-15-writing-docs-for-ai/page.mdx index 198a95aa1f..196f5c1af7 100644 --- a/site/src/posts/2025-03-15-writing-docs-for-ai/page.mdx +++ b/site/src/posts/2025-03-15-writing-docs-for-ai/page.mdx @@ -7,7 +7,7 @@ export const keywords = ["Documentation", "AI", "LLM", "Developer Experience", " Developers increasingly rely on AI-powered tools like Cursor, Windsurf, and Claude Code to streamline coding, debugging, and automation. But if you want your product to integrate smoothly into these AI-driven workflows, you need to structure your documentation in a way that's optimized for Large Language Models (LLMs). -In this post, I'll share how we structure our documentation for [Rivet](https://rivet.gg) to make it easy for AI-powered tools to understand and use. +In this post, I'll share how we structure our documentation for [Rivet](https://rivet.dev) to make it easy for AI-powered tools to understand and use. ## Why Write Docs for AI? diff --git a/site/src/posts/2025-03-23-what-would-a-w3c-standard-look-like-for-stateful-serverless-/page.mdx b/site/src/posts/2025-03-23-what-would-a-w3c-standard-look-like-for-stateful-serverless-/page.mdx index f3131ebdef..9dff0252bd 100644 --- a/site/src/posts/2025-03-23-what-would-a-w3c-standard-look-like-for-stateful-serverless-/page.mdx +++ b/site/src/posts/2025-03-23-what-would-a-w3c-standard-look-like-for-stateful-serverless-/page.mdx @@ -10,19 +10,19 @@ export const keywords = ["durable-objects","rivetkit","standard","w3c"] # Considering A W3C Standard For Stateful Serverless -**We're Rivet, a new open-source, self-hostable serverless platform with a focus on stateful serverless. If you want to support our mission of building a production-ready and self-hostable serverless runtime, give us a star on GitHub.** +**We're Rivet, a new open-source, self-hostable serverless platform with a focus on stateful serverless. If you want to support our mission of building a production-ready and self-hostable serverless runtime, give us a star on GitHub.** Earlier today, I was called upon by Cloudflare's @threepointone and @janwilmake regarding my thoughts on a standard for stateful serverless. threepointone tweet -Having implemented a cloud-agnostic stateful serverless library called RivetKit, I have a lot of experience with what's required to build a portable standard. And thus, I derailed my Saturday to write them down here. +Having implemented a cloud-agnostic stateful serverless library called RivetKit, I have a lot of experience with what's required to build a portable standard. And thus, I derailed my Saturday to write them down here. This specification is intended as step 1 to start the conversation about what is required to develop a stateful serverless specification that makes stateful serverless easier for companies to adopt. I don't expect this to be the end result. See _Specification Goals_ for more information. ## What Is Stateful Serverless? -Unless you're deep in to Cloudflare Durable Objects or Rivet Actors, there's a good chance you've never heard of "stateful serverless." +Unless you're deep in to Cloudflare Durable Objects or Rivet Actors, there's a good chance you've never heard of "stateful serverless." **Stateful serverless** allows serverless functions to maintain state across multiple invocations. They're very similar to **Web Workers (specifically `SharedWorker`) on the server** and share characteristics with the **actor model**. The most popular implementation of this today is Durable Objects. @@ -79,7 +79,7 @@ The primary use cases of stateful serverless are: * **Horizontal Scalability**: Systems that need to scale by distributing load across many instances. For example, **Realtime Stream Processing** for stateful event handling. * **Local-First Architecture**: Systems that synchronize state between offline clients. For example, **Local-First Sync** between devices. -Read more about stateful serverless here. +Read more about stateful serverless here. ### Scope Of This Proposal @@ -164,9 +164,9 @@ Purely theorizing: a standard for stateful serverless might provide the foundati I'm the founder of Rivet and have a vested interest in seeing stateful serverless become a standard. Rivet provides an open-source stateful serverless platform that can be easily self-hosted. -We also provide a handful of features in our runtime that don't make sense to be part of a standard, since the best W3C standards build on existing web standards: [Docker containers for non-JavaScript applications](https://rivet.gg/docs/cloud/containers), [HTTP, UDP, and TCP support](https://rivet.gg/docs/cloud/networking), [advanced lifecycle management](https://rivet.gg/docs/cloud/durability), [actor tagging](https://rivet.gg/docs/cloud/api/actors/create) for advanced multi-tenant applications, [advanced control over actor upgrades](https://rivet.gg/docs/cloud/api/actors/upgrade-all) for companies with specific use cases, [fine-grained control over where your actor is running](https://rivet.gg/docs/cloud/api/regions/list), and a developer-friendly REST API for managing Rivet Actors. +We also provide a handful of features in our runtime that don't make sense to be part of a standard, since the best W3C standards build on existing web standards: [Docker containers for non-JavaScript applications](https://rivet.dev/docs/cloud/containers), [HTTP, UDP, and TCP support](https://rivet.dev/docs/cloud/networking), [advanced lifecycle management](https://rivet.dev/docs/cloud/durability), [actor tagging](https://rivet.dev/docs/cloud/api/actors/create) for advanced multi-tenant applications, [advanced control over actor upgrades](https://rivet.dev/docs/cloud/api/actors/upgrade-all) for companies with specific use cases, [fine-grained control over where your actor is running](https://rivet.dev/docs/cloud/api/regions/list), and a developer-friendly REST API for managing Rivet Actors. -We encourage developers building on Rivet to use [RivetKit](https://github.com/rivet-gg/rivetkit). However, we also provide a [low-level API](https://rivet.gg/docs/cloud/actors) for defining actors: +We encourage developers building on Rivet to use [RivetKit](https://github.com/rivet-dev/rivetkit). However, we also provide a [low-level API](https://rivet.dev/docs/cloud/actors) for defining actors: ```typescript import type { ActorContext } from "@rivet-gg/actor"; @@ -192,11 +192,11 @@ export default { Unlike Durable Objects, Rivet's core API design opts to lean into Unix-like patterns such as using `SIGINT` signals, leveraging `process.exit`, and using environment variables. -Check out the [source code on GitHub](https://github.com/rivet-gg/rivet). +Check out the [source code on GitHub](https://github.com/rivet-dev/rivet). ### RivetKit Framework: Stateful Serverless On Any Cloud -At Rivet, we also manage a framework called [RivetKit](https://github.com/rivet-gg/rivetkit) that provides a Durable Object-like experience on any cloud that provides _stateless_ serverless. +At Rivet, we also manage a framework called [RivetKit](https://github.com/rivet-dev/rivetkit) that provides a Durable Object-like experience on any cloud that provides _stateless_ serverless. A Rivet Actor definition looks something like this: @@ -224,7 +224,7 @@ Under the hood is where it gets interesting: RivetKit is intended to support as These drivers provide a **peek at what a standard might require**, since they're already abstracted to be platform-agnostic: -**[ActorDriver](https://github.com/rivet-gg/rivetkit/blob/a9a5cfa5b91aff73889bbbee965d52221f89c2c7/packages/actor-core/src/actor/driver.ts#L12)**: Manages actor state, lifecycle, and persistence +**[ActorDriver](https://github.com/rivet-dev/rivetkit/blob/a9a5cfa5b91aff73889bbbee965d52221f89c2c7/packages/actor-core/src/actor/driver.ts#L12)**: Manages actor state, lifecycle, and persistence ```typescript export interface ActorDriver { @@ -238,7 +238,7 @@ export interface ActorDriver { } ``` -**[ManagerDriver](https://github.com/rivet-gg/rivetkit/blob/a9a5cfa5b91aff73889bbbee965d52221f89c2c7/packages/actor-core/src/manager/driver.ts#L5)**: Handles actor discovery, routing, and scaling +**[ManagerDriver](https://github.com/rivet-dev/rivetkit/blob/a9a5cfa5b91aff73889bbbee965d52221f89c2c7/packages/actor-core/src/manager/driver.ts#L5)**: Handles actor discovery, routing, and scaling ```typescript export interface ManagerDriver { @@ -280,11 +280,11 @@ export interface CreateActorOutput { } ``` -There is also a **[CoordinatedDriver](https://github.com/rivet-gg/rivetkit/blob/a9a5cfa5b91aff73889bbbee965d52221f89c2c7/packages/actor-core/src/topologies/coordinate/driver.ts#L29)** that provides support for implementing actors over peer-to-peer for platforms that don't natively support stateful serverless. This would not apply to an actor standard. +There is also a **[CoordinatedDriver](https://github.com/rivet-dev/rivetkit/blob/a9a5cfa5b91aff73889bbbee965d52221f89c2c7/packages/actor-core/src/topologies/coordinate/driver.ts#L29)** that provides support for implementing actors over peer-to-peer for platforms that don't natively support stateful serverless. This would not apply to an actor standard. -Read more about [building your own RivetKit drivers](https://github.com/rivet-gg/rivetkit/tree/main/docs). +Read more about [building your own RivetKit drivers](https://github.com/rivet-dev/rivetkit/tree/main/docs). -Check out the [source code on GitHub](https://github.com/rivet-gg/rivet). +Check out the [source code on GitHub](https://github.com/rivet-dev/rivet). ### Other Actor Runtimes: The Precursor To Stateful Serverless @@ -298,7 +298,7 @@ The goals of this proposal are: - **Simplicity Of Implementation**: Implementing standards correctly is difficult, expensive, and highly error prone. Simpler is better. - **Simplicity Of Usage**: Stateful serverless is not a concept that is easy for many developers to understand. Prefer simplicity vs advanced features to keep the API as simple as possible for greater adoption. -- **Build For Frameworks**: Hono and itty-router already proved that frameworks are almost always used with serverless runtimes. Stateful serverless is already used widely with PartyKit, RivetKit, Agents, and misc tools like TinyBase. If possible, leave functionality up to frameworks to implement. +- **Build For Frameworks**: Hono and itty-router already proved that frameworks are almost always used with serverless runtimes. Stateful serverless is already used widely with PartyKit, RivetKit, Agents, and misc tools like TinyBase. If possible, leave functionality up to frameworks to implement. - **Built On Existing Web Development Paradigms**: Stateful serverless is very similar to Web Workers. Where possible refer to Web Workers to see what works well. - **Focus On Stateful Workloads, Not Actors**: I love building distributed systems with the actor model, but actors require extra consideration around message handling, concurrency, and backpressure. @@ -436,9 +436,9 @@ The key differences are: Rivet and RivetKit provide a tagging system for organizing actors. This allows you to build more manageable multi-tenant applications with complex requirements. For example: -Rivet allows you to create actors with the [`actors.create`](https://rivet.gg/docs/cloud/api/actors/create) endpoint. The API accepts environment variables to configure how the actor behaves. +Rivet allows you to create actors with the [`actors.create`](https://rivet.dev/docs/cloud/api/actors/create) endpoint. The API accepts environment variables to configure how the actor behaves. -RivetKit allows passing tags to [`client.get({ /* tags */ })`](https://github.com/rivet-gg/rivetkit) to get or create an actor, but does not provide environment variables. You can also use the `client.create` method to create a fresh actor. Actors can read their own tags to configure behavior accordingly: +RivetKit allows passing tags to [`client.get({ /* tags */ })`](https://github.com/rivet-dev/rivetkit) to get or create an actor, but does not provide environment variables. You can also use the `client.create` method to create a fresh actor. Actors can read their own tags to configure behavior accordingly: ```typescript const client = createClient("http://localhost:6420"); @@ -505,7 +505,7 @@ console.log(self.name); **Current Implementation: Rivet** -Rivet provides two ways to destroy an actor: use `process.exit(0)` or call [`actors.destroy`](https://rivet.gg/docs/cloud/api/actors/destroy) from the API. +Rivet provides two ways to destroy an actor: use `process.exit(0)` or call [`actors.destroy`](https://rivet.dev/docs/cloud/api/actors/destroy) from the API. RivetKit will provide a `ctx.shutdown` method that delegates to `ActorDriver`, though is not currently implemented. @@ -535,7 +535,7 @@ export default { Both Rivet Actors & Durable Objects provide a way to serve requests to actors based on web standards. -Rivet provides flexible networking infrastructure, including [UDP, TCP, and host networking](https://rivet.gg/docs/cloud/networking). To remain widely compatible, Rivet relies on the Deno implementation of the fetch handler with [`Deno.serve`](https://docs.deno.com/api/deno/~/Deno.serve). +Rivet provides flexible networking infrastructure, including [UDP, TCP, and host networking](https://rivet.dev/docs/cloud/networking). To remain widely compatible, Rivet relies on the Deno implementation of the fetch handler with [`Deno.serve`](https://docs.deno.com/api/deno/~/Deno.serve). **Current Implementation: Cloudflare** @@ -771,7 +771,7 @@ Items out of the scope for this spec: - **Supervisors**: Traditional actor runtimes use "supervisors" to automatically restart crashed actors. `ServerlessWorker` cannot crash, and instead will automatically log and disregard thrown errors -- similar to service workers. - **SQLite Storage**: Many serious use cases of Durable Objects rely on SQLite. This is out of the scope for this web standard. - **Versioning**: Cloudflare and Rivet each have significantly different ways of implementing versioning. Rivet is more like AWS AMI, while Cloudflare uses a simpler but less flexible version history. -- **Upgrades & Rolling Deploys**: Leave it up to the platform to decide what code is running. Under the hood, the Rivet implementation of this standard would automatically call [`actors.upgrade`](https://rivet.gg/docs/cloud/api/actors/upgrade) +- **Upgrades & Rolling Deploys**: Leave it up to the platform to decide what code is running. Under the hood, the Rivet implementation of this standard would automatically call [`actors.upgrade`](https://rivet.dev/docs/cloud/api/actors/upgrade) - **Logging**: Leave this up to the platform to decide how to ship logs. ## Full Examples @@ -1309,11 +1309,11 @@ The storage is the most rough section of this spec. It probably justifies its ow ## Next Steps -We [uploaded this proposal to GitHub](https://github.com/rivet-gg/proposal-stateful-serverless-api) for feedback and iteration. Once there's more momentum, I hope to move this out of the `rivet-gg` organization in to an official W3C process. +We [uploaded this proposal to GitHub](https://github.com/rivet-dev/proposal-stateful-serverless-api) for feedback and iteration. Once there's more momentum, I hope to move this out of the `rivet-gg` organization in to an official W3C process. ### Feedback On GitHub -Please add feedback as a issue or pull request on the [proposal GitHub](https://github.com/rivet-gg/proposal-stateful-serverless-api). +Please add feedback as a issue or pull request on the [proposal GitHub](https://github.com/rivet-dev/proposal-stateful-serverless-api). ### Reference Implementation @@ -1321,7 +1321,7 @@ Once a general specification is implemented, a reference specification is trivia ## Survey: Help Shape the Specification -If you are either (a) a user of Durable Objects/Rivet actors or (b) want to aid in the direction, it'd be helpful to take the time to answer these questions as a [GitHub issue](https://github.com/rivet-gg/proposal-stateful-serverless-api/issues) on the proposal: +If you are either (a) a user of Durable Objects/Rivet actors or (b) want to aid in the direction, it'd be helpful to take the time to answer these questions as a [GitHub issue](https://github.com/rivet-dev/proposal-stateful-serverless-api/issues) on the proposal: - **Do we attempt to specify existing APIs or implement based on existing work by W3C?** This spec aims to build on patterns already defined by W3C, however it might make sense to stick to better documenting overlap between existing providers (currently only Durable Objects & Rivet as far as I know). My understanding is WinterTC attempted to create a spec that matched existing APIs. I'd be happy to rewrite this spec based on the `fetch` API if the answer to this is _yes_. - **What are the most common hesitations for companies adopting stateful serverless?** Is there something this spec can address? diff --git a/site/src/posts/2025-05-28-building-linear-agents-in-node-js-and-rivet-full-walkthrough-and-starter-kit/page.mdx b/site/src/posts/2025-05-28-building-linear-agents-in-node-js-and-rivet-full-walkthrough-and-starter-kit/page.mdx index 17aa98af06..4ffde0d5ad 100644 --- a/site/src/posts/2025-05-28-building-linear-agents-in-node-js-and-rivet-full-walkthrough-and-starter-kit/page.mdx +++ b/site/src/posts/2025-05-28-building-linear-agents-in-node-js-and-rivet-full-walkthrough-and-starter-kit/page.mdx @@ -17,11 +17,11 @@ This project is built with: - [Linear SDK](https://developers.linear.app/docs/sdk/installation) for Linear API integration - [AI SDK](https://ai-sdk.dev) for AI-powered responses -[View Source Code on GitHub →](https://github.com/rivet-gg/rivet/tree/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter). +[View Source Code on GitHub →](https://github.com/rivet-dev/rivet/tree/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter). ## TL;DR -The core functionality is in [`src/actors/issue-agent.ts`](https://github.com/rivet-gg/rivet/blob/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter/src/actors/issue-agent.ts), where the agent handles different types of Linear events and interfaces with the LLM. +The core functionality is in [`src/actors/issue-agent.ts`](https://github.com/rivet-dev/rivet/blob/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter/src/actors/issue-agent.ts), where the agent handles different types of Linear events and interfaces with the LLM. ## Walkthrough @@ -34,18 +34,18 @@ The Linear integration works through the following steps: The system exposes three endpoints: -- `GET /connect-linear`: Initiates the Linear OAuth flow ([src/server/index.ts](https://github.com/rivet-gg/rivet/blob/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter/src/server/index.ts#L41)) -- `GET /oauth/callback/linear`: OAuth callback endpoint ([src/server/index.ts](https://github.com/rivet-gg/rivet/blob/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter/src/server/index.ts#L82)) -- `POST /webhook/linear`: Receives Linear webhook events ([src/server/index.ts](https://github.com/rivet-gg/rivet/blob/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter/src/server/index.ts#L116)) +- `GET /connect-linear`: Initiates the Linear OAuth flow ([src/server/index.ts](https://github.com/rivet-dev/rivet/blob/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter/src/server/index.ts#L41)) +- `GET /oauth/callback/linear`: OAuth callback endpoint ([src/server/index.ts](https://github.com/rivet-dev/rivet/blob/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter/src/server/index.ts#L82)) +- `POST /webhook/linear`: Receives Linear webhook events ([src/server/index.ts](https://github.com/rivet-dev/rivet/blob/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter/src/server/index.ts#L116)) And maintains state using three main Rivet Actors: -1. **Issue Agent**: Handles Linear issue events and generates responses ([src/actors/issue-agent.ts](https://github.com/rivet-gg/rivet/blob/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter/src/actors/issue-agent.ts#L11)) -2. **Linear App User**: Manages authentication state for the application ([src/actors/linear-app-user.ts](https://github.com/rivet-gg/rivet/blob/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter/src/actors/linear-app-user.ts#L6)) -3. **OAuth Session**: Handles OAuth flow state ([src/actors/oauth-session.ts](https://github.com/rivet-gg/rivet/blob/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter/src/actors/oauth-session.ts#L10)) +1. **Issue Agent**: Handles Linear issue events and generates responses ([src/actors/issue-agent.ts](https://github.com/rivet-dev/rivet/blob/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter/src/actors/issue-agent.ts#L11)) +2. **Linear App User**: Manages authentication state for the application ([src/actors/linear-app-user.ts](https://github.com/rivet-dev/rivet/blob/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter/src/actors/linear-app-user.ts#L6)) +3. **OAuth Session**: Handles OAuth flow state ([src/actors/oauth-session.ts](https://github.com/rivet-dev/rivet/blob/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter/src/actors/oauth-session.ts#L10)) - You can read more about actors [in the Rivet Actors documentation](https://rivet.gg/docs/actors). + You can read more about actors [in the Rivet Actors documentation](https://rivet.dev/docs/actors). We'll dive in to how these work together next. @@ -56,9 +56,9 @@ Before our agent can interact with a Linear workspace, we need to set up authent **Step 1: Initial OAuth Request** -The user is directed to `GET /connect-linear` ([src/server/index.ts](https://github.com/rivet-gg/rivet/blob/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter/src/server/index.ts#L41)) to initiate the OAuth flow: +The user is directed to `GET /connect-linear` ([src/server/index.ts](https://github.com/rivet-dev/rivet/blob/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter/src/server/index.ts#L41)) to initiate the OAuth flow: - We generate a secure session with a unique ID and nonce -- We store this state in an [`oauthSession`](https://github.com/rivet-gg/rivet/blob/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter/src/actors/oauth-session.ts#L10) Rivet Actor +- We store this state in an [`oauthSession`](https://github.com/rivet-dev/rivet/blob/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter/src/actors/oauth-session.ts#L10) Rivet Actor - We redirect to Linear's authorization page with our OAuth parameters ```typescript {{"title":"src/server/index.ts"}} @@ -113,7 +113,7 @@ When the user completes authentication, Linear redirects to our callback URL wit - We validate the state parameter for security - We exchange the code for an access token - We get the app user ID for the agent in this workspace (our unique identifier for this workspace) -- We store the access token in the [`linearAppUser`](https://github.com/rivet-gg/rivet/blob/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter/src/actors/linear-app-user.ts#L6) Rivet Actor +- We store the access token in the [`linearAppUser`](https://github.com/rivet-dev/rivet/blob/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter/src/actors/linear-app-user.ts#L6) Rivet Actor ```typescript {{"title":"src/server/index.ts"}} router.get("/oauth/callback/linear", async (c) => { @@ -156,7 +156,7 @@ After OAuth completes, our agent is fully integrated with the Linear workspace: Once a user has authorized our application in their Linear workspace, Linear sends webhook events to our endpoint whenever something happens that involves our agent. -The server parses these events and routes them to the appropriate handlers in [`src/actors/issue-agent.ts`](https://github.com/rivet-gg/rivet/blob/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter/src/actors/issue-agent.ts#L11): +The server parses these events and routes them to the appropriate handlers in [`src/actors/issue-agent.ts`](https://github.com/rivet-dev/rivet/blob/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter/src/actors/issue-agent.ts#L11): - **`issueMention`**: Triggered when the agent is mentioned in an issue description - **`issueEmojiReaction`**: Triggered when someone reacts with an emoji to an issue @@ -313,7 +313,7 @@ Before getting started with building your own Linear agent, make sure you have: 1. Clone the repository and navigate to the example: ```bash - git clone https://github.com/rivet-gg/rivet.git + git clone https://github.com/rivet-dev/rivet.git cd rivet/examples/linear-agent-starter ``` @@ -365,7 +365,7 @@ Before getting started with building your own Linear agent, make sure you have: ### Adding Your Own Functionality -The core of the agent is in [`src/actors/issue-agent.ts`](https://github.com/rivet-gg/rivet/blob/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter/src/actors/issue-agent.ts#L11). You can customize: +The core of the agent is in [`src/actors/issue-agent.ts`](https://github.com/rivet-dev/rivet/blob/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter/src/actors/issue-agent.ts#L11). You can customize: 1. **Event Handlers**: Modify actions for different Linear events: @@ -441,5 +441,5 @@ When building a Linear agent, consider these practices for a better developer ex You can find the complete source code for this Linear agent starter kit on GitHub: -[View Source Code on GitHub →](https://github.com/rivet-gg/rivet/tree/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter) +[View Source Code on GitHub →](https://github.com/rivet-dev/rivet/tree/e13e6e95c56ea63bc73312fa7d01a647412ac507/examples/linear-agent-starter) diff --git a/site/src/posts/2025-06-02-faster-route-propagation-by-rewriting-our-traefik-gateway-in-rust/page.mdx b/site/src/posts/2025-06-02-faster-route-propagation-by-rewriting-our-traefik-gateway-in-rust/page.mdx index 2441d246a6..b52d1678d4 100644 --- a/site/src/posts/2025-06-02-faster-route-propagation-by-rewriting-our-traefik-gateway-in-rust/page.mdx +++ b/site/src/posts/2025-06-02-faster-route-propagation-by-rewriting-our-traefik-gateway-in-rust/page.mdx @@ -360,7 +360,7 @@ Why we went with our own custom solution: - Gateways are always on the bleeding edge of networking standards — if we want to support WebTransport or other new technologies, we don't want to have fork Envoy - We have use cases that include TCP & UDP that's not included in this piece. This is not Envoy's strong suite — we'd likely have to also incorporate [Quilkin](https://github.com/googleforgames/quilkin) to make UDP work - Less moving parts: this is a single binary with fewer points of failure (no need for a gRPC or REST server) -- We care a lot about portability & being able to run all of Rivet in a single container for a full local dev environment ([single container docs](https://rivet.gg/docs/cloud/self-hosting/single-container)) +- We care a lot about portability & being able to run all of Rivet in a single container for a full local dev environment ([single container docs](https://rivet.dev/docs/cloud/self-hosting/single-container)) - Faster & easier to write it from scratch than parse Envoy's obscure documentation; past experiences with Envoy require reading the source to understand how to configure it ### Cloudflare Pingora diff --git a/site/src/posts/2025-06-10-rivet-functions-launch/page.mdx b/site/src/posts/2025-06-10-rivet-functions-launch/page.mdx index 9b589a9c57..15f2244017 100644 --- a/site/src/posts/2025-06-10-rivet-functions-launch/page.mdx +++ b/site/src/posts/2025-06-10-rivet-functions-launch/page.mdx @@ -16,4 +16,4 @@ Announcing Rivet Functions – open-source serverless for your backend logic. ## Getting Started -Ready to deploy your first function? Check out the Functions docs at [rivet.gg/docs/cloud/functions](https://rivet.gg/docs/cloud/functions) to get up and running in minutes. \ No newline at end of file +Ready to deploy your first function? Check out the Functions docs at [rivet.dev/docs/cloud/functions](https://rivet.dev/docs/cloud/functions) to get up and running in minutes. \ No newline at end of file diff --git a/site/src/posts/2025-06-24-cloudflare-containers-vs-rivet-containers-vs-fly-machines/page.mdx b/site/src/posts/2025-06-24-cloudflare-containers-vs-rivet-containers-vs-fly-machines/page.mdx index 7798bedffe..d62d8140a5 100644 --- a/site/src/posts/2025-06-24-cloudflare-containers-vs-rivet-containers-vs-fly-machines/page.mdx +++ b/site/src/posts/2025-06-24-cloudflare-containers-vs-rivet-containers-vs-fly-machines/page.mdx @@ -10,7 +10,7 @@ import imgFlyArch from "./fly-arch.png"; # Container Platform Comparison: Cloudflare Containers vs Rivet Containers vs Fly Machines -**Rivet is an open-source, self-hostable serverless alternative to Cloudflare Workers, Durable Objects, and Containers. Check out [Rivet Containers](/docs/cloud/containers) and [visit our GitHub](https://github.com/rivet-gg/rivet).** +**Rivet is an open-source, self-hostable serverless alternative to Cloudflare Workers, Durable Objects, and Containers. Check out [Rivet Containers](/docs/cloud/containers) and [visit our GitHub](https://github.com/rivet-dev/rivet).** Cloudflare just launched [Cloudflare Containers](https://developers.cloudflare.com/containers/), a platform with many similarities to [Rivet Containers](/docs/cloud/containers) and [Fly Machines](https://fly.io/docs/machines). @@ -90,7 +90,7 @@ Cloudflare Containers only supports HTTP & WebSockets — not UDP & TCP. Rivet provides a flexible option for running containers with robust network configuration, datacenter configurations, and optional Cloudflare Container-like orchestration. Rivet Containers can be created via a simple HTTP API from any language, instead of the proprietary JavaScript API like Cloudflare Containers. Additionally — unlike Cloudflare Containers, Rivet Containers also supports TCP & UDP connections. -A simple Rivet Container has a very straightforward architecture: containers are created via a [simple HTTP API](https://rivet.gg/docs/cloud/api/actors/create), then requests are proxied through Rivet Guard (the load balancer) and sent directly to the container itself. +A simple Rivet Container has a very straightforward architecture: containers are created via a [simple HTTP API](https://rivet.dev/docs/cloud/api/actors/create), then requests are proxied through Rivet Guard (the load balancer) and sent directly to the container itself. Rivet architecture showing request going directly to a container @@ -186,7 +186,7 @@ Cloudflare Containers currently requires defining a fixed instance count at depl **Rivet Containers** -Rivet Containers can either be created on-demand using the [containers API](https://rivet.gg/docs/cloud/api/actors/create) or autoscale as needed. Request- & resource-based autoscaling works by leveraging a tight integration between Rivet Guard and Rivet Containers. This can be configured using [routes](https://rivet.gg/docs/cloud/api/routes/update). +Rivet Containers can either be created on-demand using the [containers API](https://rivet.dev/docs/cloud/api/actors/create) or autoscale as needed. Request- & resource-based autoscaling works by leveraging a tight integration between Rivet Guard and Rivet Containers. This can be configured using [routes](https://rivet.dev/docs/cloud/api/routes/update). **Fly Machines** @@ -283,7 +283,7 @@ Similarly, traffic to Cloudflare Containers must be routed via the Cloudflare Wo **Rivet Containers** -Rivet provides a straightforward [REST API for container management](https://rivet.gg/docs/cloud/api) that can be used with any language. +Rivet provides a straightforward [REST API for container management](https://rivet.dev/docs/cloud/api) that can be used with any language. Rivet Containers can be accessed either via a public endpoint or privately via other Rivet Functions, Workers, or Containers. @@ -303,7 +303,7 @@ Cloudflare Containers leverages the `wrangler dev` command providing a similar e **Rivet Containers** -Rivet allows you to run a [complete Rivet cluster locally in one command](https://rivet.gg/docs/cloud/self-hosting/single-container) or within your own Docker Compose. This enables you to: +Rivet allows you to run a [complete Rivet cluster locally in one command](https://rivet.dev/docs/cloud/self-hosting/single-container) or within your own Docker Compose. This enables you to: - Work with full feature parity to what you'll get in production - Use the full suite of monitoring tools provided with Rivet. @@ -359,7 +359,7 @@ _Note that Durable Objects currently deploy inconsistently with containers. Read Rivet offers flexibility on deployment options. By default, containers are upgraded immediately. -Upgrades can be controlled manually by using the [upgrade API](https://rivet.gg/docs/cloud/api/actors/upgrade-all) to selectively upgrade containers. This can be combined with actor tagging to build sophisticated deployment strategies — which are often important for stateful workloads like agents, batch jobs, game servers, and more. +Upgrades can be controlled manually by using the [upgrade API](https://rivet.dev/docs/cloud/api/actors/upgrade-all) to selectively upgrade containers. This can be combined with actor tagging to build sophisticated deployment strategies — which are often important for stateful workloads like agents, batch jobs, game servers, and more. **Fly Machines** diff --git a/site/src/posts/2025-07-01-introducing-rivetkit-backend-libraries-that-replace-saas/page.mdx b/site/src/posts/2025-07-01-introducing-rivetkit-backend-libraries-that-replace-saas/page.mdx index e7ca42a0c0..3e2657f3ff 100644 --- a/site/src/posts/2025-07-01-introducing-rivetkit-backend-libraries-that-replace-saas/page.mdx +++ b/site/src/posts/2025-07-01-introducing-rivetkit-backend-libraries-that-replace-saas/page.mdx @@ -356,14 +356,14 @@ Parameters & input data to actors are now end-to-end encrypted securely. Previou ### OpenAPI Spec -RivetKit now provides an OpenAPI spec to integrate your own clients. See the full [openapi.json](https://github.com/rivet-gg/rivetkit/blob/d21e3ec447654a921a72cb47c9dca480ce6d78df/docs/openapi.json). +RivetKit now provides an OpenAPI spec to integrate your own clients. See the full [openapi.json](https://github.com/rivet-dev/rivetkit/blob/d21e3ec447654a921a72cb47c9dca480ce6d78df/docs/openapi.json). ## More Information RivetKit will be a collection of powerful lightweight libraries directly into your codebase for better performance, control, and cost efficiency. No SaaS fees or API dependencies. -- **Documentation**: [rivet.gg/docs](https://rivet.gg/docs) -- **GitHub**: [github.com/rivet-gg/rivetkit](https://github.com/rivet-gg/rivetkit) +- **Documentation**: [rivet.dev/docs](https://rivet.dev/docs) +- **GitHub**: [github.com/rivet-dev/rivetkit](https://github.com/rivet-dev/rivetkit) - **Discord**: [discord.gg/rivet](https://discord.gg/rivet) --- diff --git a/site/src/posts/2025-09-04-rivet-v2-launch/page.mdx b/site/src/posts/2025-09-04-rivet-v2-launch/page.mdx index 4be2a3fdc2..be1448471b 100644 --- a/site/src/posts/2025-09-04-rivet-v2-launch/page.mdx +++ b/site/src/posts/2025-09-04-rivet-v2-launch/page.mdx @@ -52,10 +52,10 @@ Rivet is now distributed as a library rather than a platform service: ## Documentation -- [Actor Quickstart](https://rivet.gg/docs/actors/quickstart) -- [Self-Hosting Guide](https://rivet.gg/docs/self-hosting) +- [Actor Quickstart](https://rivet.dev/docs/actors/quickstart) +- [Self-Hosting Guide](https://rivet.dev/docs/self-hosting) ## Support -- [GitHub Issues](https://github.com/rivet-gg/rivet/issues) -- [Discord](https://rivet.gg/discord) +- [GitHub Issues](https://github.com/rivet-dev/rivet/issues) +- [Discord](https://rivet.dev/discord) diff --git a/site/src/posts/2025-09-12-performance-lifecycle-updates/page.mdx b/site/src/posts/2025-09-12-performance-lifecycle-updates/page.mdx index 2dc65deacb..8a3e2850f4 100644 --- a/site/src/posts/2025-09-12-performance-lifecycle-updates/page.mdx +++ b/site/src/posts/2025-09-12-performance-lifecycle-updates/page.mdx @@ -13,5 +13,5 @@ export const keywords = ["actor-sleeping", "standalone", "lifecycle", "performan ## Support -- [GitHub Issues](https://github.com/rivet-gg/rivet/issues) -- [Discord](https://rivet.gg/discord) +- [GitHub Issues](https://github.com/rivet-dev/rivet/issues) +- [Discord](https://rivet.dev/discord) diff --git a/site/src/posts/2025-10-01-railway-selfhost/page.mdx b/site/src/posts/2025-10-01-railway-selfhost/page.mdx index 0e98cb052c..efc4bff98b 100644 --- a/site/src/posts/2025-10-01-railway-selfhost/page.mdx +++ b/site/src/posts/2025-10-01-railway-selfhost/page.mdx @@ -56,5 +56,5 @@ For detailed deployment instructions, see the [Railway deployment documentation] ## Support -- [GitHub Issues](https://github.com/rivet-gg/rivet/issues) -- [Discord](https://rivet.gg/discord) \ No newline at end of file +- [GitHub Issues](https://github.com/rivet-dev/rivet/issues) +- [Discord](https://rivet.dev/discord) \ No newline at end of file diff --git a/site/src/posts/godot-multiplayer-compared-to-unity/page.mdx b/site/src/posts/godot-multiplayer-compared-to-unity/page.mdx index c7e894348b..ce2910cf4a 100644 --- a/site/src/posts/godot-multiplayer-compared-to-unity/page.mdx +++ b/site/src/posts/godot-multiplayer-compared-to-unity/page.mdx @@ -336,7 +336,7 @@ _This section includes self-promotion._ One of the most challenging parts of building a multiplayer game is deploying & scaling dedicated game servers. -[Rivet](https://github.com/rivet-gg/rivet) provides the features required to build a production-ready multiplayer game. +[Rivet](https://github.com/rivet-dev/rivet) provides the features required to build a production-ready multiplayer game. Spot an issue with this article? Please reach out on our [Discord](https://discord.gg/aXYfyNxYVn)! diff --git a/site/src/sitemap/mod.ts b/site/src/sitemap/mod.ts index 5f861775e1..1282e50910 100644 --- a/site/src/sitemap/mod.ts +++ b/site/src/sitemap/mod.ts @@ -1,4 +1,7 @@ import apiData from "@/generated/apiPages.json" assert { type: "json" }; +import { deployOptions } from "@/data/deploy-options"; +import type { DeployOption } from "@/data/deploy-options"; +import { integrationGroups } from "@/data/integrations/shared"; import nextjs from "@/images/vendors/next-js.svg"; import type { SidebarItem, Sitemap } from "@/lib/sitemap"; import { @@ -58,6 +61,9 @@ import { faSquareRootVariable, faCloudflare, faRocket, + faCloud, + faRailway, + faLightbulb, } from "@rivet-gg/icons"; // Goals: @@ -71,657 +77,620 @@ import { // - Just want to jump in // - People who want to run Open Source +const deployHosts: DeployOption[] = deployOptions; + +const integrationSidebarSections: SidebarItem[] = integrationGroups.map( + ({ title: groupTitle, items }) => ({ + title: groupTitle, + pages: items.map(({ title, href }) => ({ + title, + href, + })), + }), +); + export const sitemap = [ + { - title: "Documentation", + title: "Overview", href: "/docs", sidebar: [ { - title: "Actors", - //icon: faActorsBorderless, + title: "Overview", + href: "/docs", + icon: faSquareInfo, + }, + { + title: "Use Cases", + icon: faLightbulb, + collapsible: true, + pages: [ + { title: "AI Agents", href: "/docs/use-cases/ai-agents" }, + { title: "Realtime", href: "/docs/use-cases/realtime" }, + { title: "Durable Compute", href: "/docs/use-cases/durable-compute" }, + { title: "Per-Tenant Databases", href: "/docs/use-cases/per-tenant-databases" }, + { title: "Rate Limiting", href: "/docs/use-cases/rate-limiting" }, + { title: "Bots", href: "/docs/use-cases/bots" }, + ] + }, + { + // TOOD: These are product pages + // - https://tanstack.com/query/latest + // - https://docs.restate.dev/use-cases/ai-agents + title: "Tools", + pages: [ + { title: "Actors", href: "/docs/tools/actors", icon: faActorsBorderless }, + // { title: "Workflows", href: "/docs/what-are-workflows", }, + // { title: "Agent Orchestration", href: "/docs/what-are-agents", }, + ] + }, + { + title: "Deploy", + pages: deployHosts.map(({ title, href }) => ({ + title, + href, + })), + }, + { + title: "Reference", pages: [ { - title: "Overview", - href: "/docs/actors", - icon: faSquareInfo, - }, - { - title: "Quickstart", - icon: faForward, + title: "Cloud", + icon: faCloud, collapsible: true, - href: "/docs/actors/quickstart", pages: [ { - title: "Node.js & Bun", - href: "/docs/actors/quickstart/backend", - icon: faNodeJs, - }, - { - title: "React", - href: "/docs/actors/quickstart/react", - icon: faReact, - }, - { - title: "Next.js", - href: "/docs/actors/quickstart/next-js", - icon: nextjs, - }, - { - title: "Cloudflare Workers", - href: "/docs/actors/quickstart/cloudflare-workers", - icon: faCloudflare, + title: "Overview", + href: "/docs/cloud", + // icon: faSquareInfo, }, ], }, { - title: "State", - href: "/docs/actors/state", - icon: faFloppyDisk, - }, - { - title: "Actions", - href: "/docs/actors/actions", - icon: faBolt, - }, - { - title: "Events", - href: "/docs/actors/events", - icon: faTowerBroadcast, - }, - { - title: "Schedule", - href: "/docs/actors/schedule", - icon: faClock, - }, - { - title: "More", + title: "Self-Hosting", + icon: faServer, collapsible: true, pages: [ { - title: "Clients", - href: "/docs/actors/clients", - icon: faCode, + title: "Overview", + href: "/docs/self-hosting", + // icon: faSquareInfo, + }, + { + title: "Install", + href: "/docs/self-hosting/install", + // icon: faDownload, }, { - title: "Lifecycle & Config", - icon: faSlidersHSquare, + title: "Concepts", collapsible: true, pages: [ { - title: "Lifecycle", - href: "/docs/actors/lifecycle", - //icon: faRotate, + title: "Connect Backend", + href: "/docs/self-hosting/connect-backend", + // icon: faNetworkWired, }, { - title: "Input Parameters", - href: "/docs/actors/input", - //icon: faFileImport, + title: "Configuration", + href: "/docs/self-hosting/configuration", + // icon: faGear, }, { - title: "Keys", - href: "/docs/actors/keys", - //icon: faKey, - }, - { - title: "Metadata", - href: "/docs/actors/metadata", - //icon: faTag, - }, - { - title: "Helper Types", - href: "/docs/actors/helper-types", - //icon: faCode, + title: "Multi-Region", + href: "/docs/self-hosting/multi-region", + // icon: faGlobe, }, ], }, { - title: "Communication", - icon: faArrowRightArrowLeft, + title: "Platforms", collapsible: true, pages: [ { - title: "Authentication", - href: "/docs/actors/authentication", - //icon: faFingerprint, + title: "Docker Container", + href: "/docs/self-hosting/docker-container", }, { - title: "Connections", - href: "/docs/actors/connections", - //icon: faNetworkWired, + title: "Docker Compose", + href: "/docs/self-hosting/docker-compose", }, { - title: "Actor-Actor Communication", - href: "/docs/actors/communicating-between-actors", - //icon: faArrowsTurnToDots, + title: "Railway", + href: "/docs/self-hosting/railway", }, { - title: "Fetch & WebSocket Handler", - href: "/docs/actors/fetch-and-websocket-handler", - //icon: faLink, - }, - ], - }, - { - title: "State Management", - icon: faDatabase, - collapsible: true, - pages: [ - { - title: "Ephemeral Variables", - href: "/docs/actors/ephemeral-variables", - //icon: faMemory, + title: "Kubernetes", + href: "/docs/self-hosting/kubernetes", }, { - title: "Sharing & Joining State", - href: "/docs/actors/sharing-and-joining-state", - //icon: faMerge, + title: "AWS Fargate", + href: "/docs/self-hosting/aws-fargate", }, { - title: "External SQL", - href: "/docs/actors/external-sql", - //icon: faDatabase, + title: "Google Cloud Run", + href: "/docs/self-hosting/google-cloud-run", }, - ], - }, - { - title: "Architecture", - icon: faSitemap, - collapsible: true, - pages: [ { - title: "Scaling & Concurrency", - href: "/docs/actors/scaling", - //icon: faMaximize, + title: "Hetzner", + href: "/docs/self-hosting/hetzner", }, ], }, - { - title: "Testing", - href: "/docs/actors/testing", - icon: faVialCircleCheck, - }, + //{ + // title: "Advanced", + // pages: [ + // // TODO: Scaling + // // TODO: Architecture + // // TODO: Networking (exposed ports, how data gets routed to actors, etc) + // ], + //}, ], }, + // { + // title: "Rivet Inspector", + // href: "/docs/general/studio", + // icon: faPalette, + // }, + { + title: "Docs for LLMs", + href: "/docs/general/docs-for-llms", + icon: faSquareBinary, + }, + // { + // title: "System Architecture", + // href: "/docs/general/system-architecture", + // icon: faLayerGroup, + // }, + ], + }, + ], + }, + { + title: "Actors", + href: "/docs/actors", + //icon: faActorsBorderless, + sidebar: [ + { + title: "Overview", + href: "/docs/actors", + icon: faSquareInfo, + }, + { + title: "Quickstart", + icon: faForward, + collapsible: true, + href: "/docs/actors/quickstart", + pages: [ + { + title: "Node.js & Bun", + href: "/docs/actors/quickstart/backend", + icon: faNodeJs, + }, + { + title: "React", + href: "/docs/actors/quickstart/react", + icon: faReact, + }, + { + title: "Next.js", + href: "/docs/actors/quickstart/next-js", + icon: nextjs, + }, + { + title: "Cloudflare Workers", + href: "/docs/actors/quickstart/cloudflare-workers", + icon: faCloudflare, + }, ], }, { - title: "Integrations", - // IMPORTANT: Also update integrations/index.mdx + title: "Concepts", pages: [ { - title: "Overview", - href: "/docs/integrations", - icon: faSquareInfo, + title: "State", + href: "/docs/actors/state", + icon: faFloppyDisk, }, { - title: "Frontend & Clients", - icon: faCode, + title: "Actions", + href: "/docs/actors/actions", + icon: faBolt, + }, + { + title: "Events", + href: "/docs/actors/events", + icon: faTowerBroadcast, + }, + { + title: "Schedule", + href: "/docs/actors/schedule", + icon: faClock, + }, + { + title: "Lifecycle & Config", + icon: faSlidersHSquare, collapsible: true, pages: [ { - title: "JavaScript", - href: "/docs/clients/javascript", - icon: faNodeJs, + title: "Lifecycle", + href: "/docs/actors/lifecycle", + //icon: faRotate, }, { - title: "React", - href: "/docs/clients/react", - icon: faReact, + title: "Input Parameters", + href: "/docs/actors/input", + //icon: faFileImport, }, { - title: "Next.js", - href: "/docs/clients/next-js", - icon: nextjs, + title: "Keys", + href: "/docs/actors/keys", + //icon: faKey, }, { - title: "Rust", - href: "/docs/clients/rust", - icon: faRust, + title: "Metadata", + href: "/docs/actors/metadata", + //icon: faTag, }, { - title: "OpenAPI", - href: "/docs/clients/openapi", - icon: faFileImport, + title: "Helper Types", + href: "/docs/actors/helper-types", + //icon: faCode, }, ], }, { - title: "Backend", - icon: faServer, + title: "Communication", + icon: faArrowRightArrowLeft, collapsible: true, pages: [ { - title: "Hono", - href: "/docs/integrations/hono", - }, - { - title: "Express", - href: "/docs/integrations/express", - }, - { - title: "Elysia", - href: "/docs/integrations/elysia", + title: "Authentication", + href: "/docs/actors/authentication", + //icon: faFingerprint, }, { - title: "tRPC", - href: "/docs/integrations/trpc", + title: "Connections", + href: "/docs/actors/connections", + //icon: faNetworkWired, }, { - title: "Next.js", - href: "/docs/integrations/next-js", + title: "Actor-Actor Communication", + href: "/docs/actors/communicating-between-actors", + //icon: faArrowsTurnToDots, }, { - title: "Cloudflare Workers", - href: "/docs/integrations/cloudflare-workers", + title: "Fetch & WebSocket Handler", + href: "/docs/actors/fetch-and-websocket-handler", + //icon: faLink, }, ], }, { - title: "Deploy", - icon: faRocket, + title: "Data Management", + icon: faDatabase, collapsible: true, pages: [ { - title: "Freestyle", - href: "/docs/deploy/freestyle", + title: "Ephemeral Variables", + href: "/docs/actors/ephemeral-variables", + //icon: faMemory, }, { - title: "Railway", - href: "/docs/deploy/railway", + title: "Sharing & Joining State", + href: "/docs/actors/sharing-and-joining-state", + //icon: faMerge, }, - ], - }, - { - title: "Auth", - icon: faKey, - collapsible: true, - pages: [ { - title: "Better Auth", - href: "/docs/integrations/better-auth", + title: "External SQL", + href: "/docs/actors/external-sql", + //icon: faDatabase, }, ], }, { - title: "Misc", - collapsible: true, - pages: [ - { - title: "Vitest", - href: "/docs/integrations/vitest", - }, - { - title: "Pino", - href: "/docs/integrations/pino", - }, - ], - }, - ], - }, - //{ - // title: "Self-Hosting", - // // IMPORTANT: Also update integrations/index.mdx - // pages: [ - // { - // title: "Overview", - // icon: faInfoSquare, - // href: "/docs/general/self-hosting", - // }, - // { - // title: "Hosting Providers", - // icon: faServer, - // collapsible: true, - // pages: [ - // { - // title: "Railway", - // href: "/docs/hosting-providers/railway", - // }, - // // TODO: AWS ECS - // // TODO: Vercel - // { - // title: "Cloudflare Workers", - // href: "/docs/hosting-providers/cloudflare-workers", - // }, - // { - // title: "Rivet Cloud (Enterprise)", - // href: "/docs/hosting-providers/rivet-cloud", - // }, - // - // // TODO: Hetzner - // // TODO: AWS - // // TODO: Cloudflare Workers - // // TODO: Railway - // // TODO: Coolify - // // TODO: Rivet - // ], - // }, - // { - // title: "Drivers", - // icon: faScrewdriverWrench, - // collapsible: true, - // pages: [ - // { - // title: "Redis", - // href: "/docs/drivers/redis", - // }, - // { - // title: "File System", - // href: "/docs/drivers/file-system", - // }, - // { - // title: "Memory", - // href: "/docs/drivers/memory", - // }, - // { - // title: "Build Your Own", - // href: "/docs/drivers/build-your-own", - // }, - // ], - // }, - // ], - //}, - { - title: "Reference", - pages: [ - { - title: "Rivet Studio", - href: "/docs/general/studio", - icon: faPalette, - }, - { - title: "Docs for LLMs", - href: "/docs/general/docs-for-llms", - icon: faSquareBinary, - }, - { - title: "System Architecture", - href: "/docs/general/system-architecture", - icon: faLayerGroup, - }, - { - title: "More", + title: "Architecture", + icon: faSitemap, collapsible: true, pages: [ { - title: "CORS", - href: "/docs/general/cors", - icon: faShareNodes, - }, - { - title: "Logging", - href: "/docs/general/logging", - icon: faListUl, + title: "Scaling & Concurrency", + href: "/docs/actors/scaling", + //icon: faMaximize, }, ], }, - ], + ] }, ], }, + + // { + // title: "Workflows", + // href: "/docs/workflows", + // //icon: faActorsBorderless, + // sidebar: [ + // ] + // }, + // + // { + // title: "Agents", + // href: "/docs/agents", + // //icon: faActorsBorderless, + // sidebar: [ + // ] + // }, + { - title: "Self-Hosting", - href: "/docs/self-hosting", + title: "Integrations", + href: "/docs/integrations", + // IMPORTANT: Also update integrations/index.mdx sidebar: [ { - title: "General", - pages: [ - { - title: "Overview", - href: "/docs/self-hosting", - icon: faSquareInfo, - }, - { - title: "Install", - href: "/docs/self-hosting/install", - icon: faDownload, - }, - { - title: "Connect Backend", - href: "/docs/self-hosting/connect-backend", - icon: faNetworkWired, - }, - { - title: "Configuration", - href: "/docs/self-hosting/configuration", - icon: faGear, - }, - { - title: "Multi-Region", - href: "/docs/self-hosting/multi-region", - icon: faGlobe, - }, - ], - }, - { - title: "Platforms", - pages: [ - { - title: "Docker Container", - href: "/docs/self-hosting/docker-container", - }, - { - title: "Docker Compose", - href: "/docs/self-hosting/docker-compose", - }, - { - title: "Railway", - href: "/docs/self-hosting/railway", - }, - { - title: "Kubernetes", - href: "/docs/self-hosting/kubernetes", - }, - { - title: "AWS Fargate", - href: "/docs/self-hosting/aws-fargate", - }, - { - title: "Google Cloud Run", - href: "/docs/self-hosting/google-cloud-run", - }, - { - title: "Hetzner", - href: "/docs/self-hosting/hetzner", - }, - ], + title: "Overview", + href: "/docs/integrations", + icon: faSquareInfo, }, - //{ - // title: "Advanced", - // pages: [ - // // TODO: Scaling - // // TODO: Architecture - // // TODO: Networking (expoed ports, how data gets routed to actors, etc) - // ], - //}, + ...integrationSidebarSections, ], }, + { - title: "Enterprise Cloud", - href: "/docs/cloud", + title: "API Reference", + href: "/docs/api", + //icon: faActorsBorderless, sidebar: [ { title: "Overview", - href: "/docs/cloud", - icon: faSquareInfo, - }, - { - title: "Install CLI", - href: "/docs/cloud/install", - icon: faDownload, + href: "/docs/api" }, { - title: "Getting Started", + title: "General", pages: [ { - title: "Functions", - href: "/docs/cloud/functions", - icon: faFunction, - }, - { - title: "Actors", - href: "/docs/cloud/actors", - icon: faActorsBorderless, - }, - { - title: "Containers", - href: "/docs/cloud/containers", - icon: faServer, + title: "Clients", + href: "/docs/actors/clients", + icon: faCode, }, - ], - }, - { - title: "Runtime", - pages: [ { - title: "Networking", - href: "/docs/cloud/networking", - icon: faNetworkWired, + title: "Testing", + href: "/docs/actors/testing", + icon: faVialCircleCheck, }, { - title: "Environment Variables", - href: "/docs/cloud/environment-variables", - icon: faLeaf, + title: "CORS", + href: "/docs/general/cors", + icon: faShareNodes, }, { - title: "Durability & Rescheduling", - href: "/docs/cloud/durability", - icon: faRecycle, + title: "Logging", + href: "/docs/general/logging", + icon: faListUl, }, ], }, { - title: "Reference", + title: "Clients", + // icon: faCode, + // collapsible: true, pages: [ { - title: "Configuration", - href: "/docs/cloud/config", - icon: faSquareSliders, - }, - { - title: "CLI", - href: "/docs/cloud/cli", - icon: faSquareTerminal, - }, - { - title: "CI/CD", - href: "/docs/cloud/continuous-delivery", - icon: faCodePullRequest, - }, - { - title: "Tokens", - href: "/docs/cloud/tokens", - icon: faKey, - }, - { - title: "Local Development", - href: "/docs/cloud/local-development", - icon: faCode, - }, - { - title: "Edge Regions", - href: "/docs/cloud/edge", - icon: faGlobe, + title: "JavaScript", + href: "/docs/clients/javascript", + icon: faNodeJs, }, { - title: "Billing", - href: "/docs/cloud/pricing", - icon: faCoin, + title: "React", + href: "/docs/clients/react", + icon: faReact, }, { - title: "Troubleshooting", - href: "/docs/cloud/troubleshooting", - icon: faClipboardListCheck, + title: "Next.js", + href: "/docs/clients/next-js", + icon: nextjs, }, { - title: "FAQ", - href: "/docs/cloud/faq", - icon: faBlockQuestion, + title: "Rust", + href: "/docs/clients/rust", + icon: faRust, }, - ], - }, - //{ - // title: "Use Cases", - // pages: [ - // { - // title: "Game Servers", - // href: "/docs/cloud/solutions/game-servers", - // }, - // ], - //}, - //{ - // title: "Self-Hosting", - // pages: [ - // { - // title: "Overview", - // href: "/docs/cloud/self-hosting", - // icon: faSquareInfo, - // }, - // { - // title: "Single Container", - // href: "/docs/cloud/self-hosting/single-container", - // icon: faDocker, - // }, - // { - // title: "Docker Compose", - // href: "/docs/cloud/self-hosting/docker-compose", - // icon: faDocker, - // }, - // { - // title: "Manual Deployment", - // href: "/docs/cloud/self-hosting/manual-deployment", - // icon: faGear, - // }, - // { - // title: "Client Config", - // href: "/docs/cloud/self-hosting/client-config", - // icon: faSliders, - // }, - // { - // title: "Server Config", - // href: "/docs/cloud/self-hosting/server-config", - // icon: faSliders, - // }, - // { - // title: "Networking", - // href: "/docs/cloud/self-hosting/network-modes", - // icon: faNetworkWired, - // }, - // ], - //}, - { - title: "Advanced", - pages: [ { - title: "Limitations", - href: "/docs/cloud/limitations", + title: "OpenAPI", + href: "/docs/clients/openapi", + icon: faFileImport, }, ], }, - { - title: "API", - pages: [ - { - title: "Overview", - collapsible: true, - pages: [ - { - title: "Overview", - href: "/docs/cloud/api", - }, - { - title: "Errors", - href: "/docs/cloud/api/errors", - }, - ], - }, - ...(apiData.groups as SidebarItem[]).map((x) => { - x.collapsible = true; - return x; - }), - ], - }, - ], + ] }, + + // { + // title: "Enterprise Cloud", + // href: "/docs/cloud", + // sidebar: [ + // { + // title: "Overview", + // href: "/docs/cloud", + // icon: faSquareInfo, + // }, + // { + // title: "Install CLI", + // href: "/docs/cloud/install", + // icon: faDownload, + // }, + // { + // title: "Getting Started", + // pages: [ + // { + // title: "Functions", + // href: "/docs/cloud/functions", + // icon: faFunction, + // }, + // { + // title: "Actors", + // href: "/docs/cloud/actors", + // icon: faActorsBorderless, + // }, + // { + // title: "Containers", + // href: "/docs/cloud/containers", + // icon: faServer, + // }, + // ], + // }, + // { + // title: "Runtime", + // pages: [ + // { + // title: "Networking", + // href: "/docs/cloud/networking", + // icon: faNetworkWired, + // }, + // { + // title: "Environment Variables", + // href: "/docs/cloud/environment-variables", + // icon: faLeaf, + // }, + // { + // title: "Durability & Rescheduling", + // href: "/docs/cloud/durability", + // icon: faRecycle, + // }, + // ], + // }, + // { + // title: "Reference", + // pages: [ + // { + // title: "Configuration", + // href: "/docs/cloud/config", + // icon: faSquareSliders, + // }, + // { + // title: "CLI", + // href: "/docs/cloud/cli", + // icon: faSquareTerminal, + // }, + // { + // title: "CI/CD", + // href: "/docs/cloud/continuous-delivery", + // icon: faCodePullRequest, + // }, + // { + // title: "Tokens", + // href: "/docs/cloud/tokens", + // icon: faKey, + // }, + // { + // title: "Local Development", + // href: "/docs/cloud/local-development", + // icon: faCode, + // }, + // { + // title: "Edge Regions", + // href: "/docs/cloud/edge", + // icon: faGlobe, + // }, + // { + // title: "Billing", + // href: "/docs/cloud/pricing", + // icon: faCoin, + // }, + // { + // title: "Troubleshooting", + // href: "/docs/cloud/troubleshooting", + // icon: faClipboardListCheck, + // }, + // { + // title: "FAQ", + // href: "/docs/cloud/faq", + // icon: faBlockQuestion, + // }, + // ], + // }, + // //{ + // // title: "Use Cases", + // // pages: [ + // // { + // // title: "Game Servers", + // // href: "/docs/cloud/solutions/game-servers", + // // }, + // // ], + // //}, + // //{ + // // title: "Self-Hosting", + // // pages: [ + // // { + // // title: "Overview", + // // href: "/docs/cloud/self-hosting", + // // icon: faSquareInfo, + // // }, + // // { + // // title: "Single Container", + // // href: "/docs/cloud/self-hosting/single-container", + // // icon: faDocker, + // // }, + // // { + // // title: "Docker Compose", + // // href: "/docs/cloud/self-hosting/docker-compose", + // // icon: faDocker, + // // }, + // // { + // // title: "Manual Deployment", + // // href: "/docs/cloud/self-hosting/manual-deployment", + // // icon: faGear, + // // }, + // // { + // // title: "Client Config", + // // href: "/docs/cloud/self-hosting/client-config", + // // icon: faSliders, + // // }, + // // { + // // title: "Server Config", + // // href: "/docs/cloud/self-hosting/server-config", + // // icon: faSliders, + // // }, + // // { + // // title: "Networking", + // // href: "/docs/cloud/self-hosting/network-modes", + // // icon: faNetworkWired, + // // }, + // // ], + // //}, + // { + // title: "Advanced", + // pages: [ + // { + // title: "Limitations", + // href: "/docs/cloud/limitations", + // }, + // ], + // }, + // { + // title: "API", + // pages: [ + // { + // title: "Overview", + // collapsible: true, + // pages: [ + // { + // title: "Overview", + // href: "/docs/cloud/api", + // }, + // { + // title: "Errors", + // href: "/docs/cloud/api/errors", + // }, + // ], + // }, + // ...(apiData.groups as SidebarItem[]).map((x) => { + // x.collapsible = true; + // return x; + // }), + // ], + // }, + // ], + // }, + // { // title: "Integrations", // href: "/integrations",