From 6baff7be3dc8f2473d93d17862b6d0b2df5c4d15 Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 10 Jun 2026 18:28:34 +0200 Subject: [PATCH] feat: add MCP server for AI assistant integration (#5882) --- .../plans/revert_demo_mcp_8d8927a6.plan.md | 197 + .cursor/rules/mcp-integration.mdc | 103 + apps/nextjs/package.json | 6 +- .../oauth-authorization-server/route.ts | 32 + .../oauth-protected-resource/route.ts | 25 + .../tools/api/components/api-page-tabs.tsx | 58 + .../tools/api/components/mcp-instructions.tsx | 343 + .../components/mcp-tools-accordion.module.css | 6 + .../api/components/scalar-api-reference.tsx | 35 + .../tools/api/components/scalar-theme.css | 51 + .../tools/api/components/swagger-ui.tsx | 23 - .../app/[locale]/manage/tools/api/page.tsx | 72 +- .../manage/tools/api/swagger-ui-dark.css | 1719 --- .../manage/tools/api/swagger-ui-overrides.css | 4 - .../[locale]/manage/tools/api/swagger-ui.css | 9293 ----------------- .../src/app/api/mcp/[transport]/route.ts | 300 + apps/nextjs/src/app/api/mcp/_extract-tools.ts | 23 + apps/nextjs/src/app/api/mcp/oauth/_store.ts | 157 + .../src/app/api/mcp/oauth/authorize/route.ts | 143 + .../src/app/api/mcp/oauth/register/route.ts | 107 + .../src/app/api/mcp/oauth/token/route.ts | 143 + apps/nextjs/src/app/api/trpc/[trpc]/route.ts | 3 +- packages/api/package.json | 4 +- packages/api/src/mcp.ts | 36 + packages/api/src/open-api.ts | 2 + packages/api/src/router/apiKeys.ts | 78 +- packages/api/src/router/app.ts | 101 +- packages/api/src/router/board.ts | 285 +- .../api/src/router/docker/docker-router.ts | 43 +- packages/api/src/router/icons.ts | 49 +- packages/api/src/router/info.ts | 8 +- .../router/integration/integration-router.ts | 312 +- packages/api/src/router/invite.ts | 38 +- packages/api/src/router/user.ts | 159 +- packages/api/src/router/widgets/calendar.ts | 11 +- packages/api/src/router/widgets/dns-hole.ts | 25 +- packages/api/src/router/widgets/downloads.ts | 61 +- .../src/router/widgets/health-monitoring.ts | 28 +- .../api/src/router/widgets/media-requests.ts | 66 +- .../api/src/router/widgets/media-server.ts | 11 +- packages/api/src/router/widgets/smart-home.ts | 25 +- packages/api/src/test/mcp.spec.ts | 41 + packages/api/src/trpc.ts | 9 +- packages/translation/src/lang/en.json | 91 +- packages/validation/src/board.ts | 25 + pnpm-lock.yaml | 3989 ++++--- pnpm-workspace.yaml | 6 +- 47 files changed, 5722 insertions(+), 12624 deletions(-) create mode 100644 .cursor/plans/revert_demo_mcp_8d8927a6.plan.md create mode 100644 .cursor/rules/mcp-integration.mdc create mode 100644 apps/nextjs/src/app/.well-known/oauth-authorization-server/route.ts create mode 100644 apps/nextjs/src/app/.well-known/oauth-protected-resource/route.ts create mode 100644 apps/nextjs/src/app/[locale]/manage/tools/api/components/api-page-tabs.tsx create mode 100644 apps/nextjs/src/app/[locale]/manage/tools/api/components/mcp-instructions.tsx create mode 100644 apps/nextjs/src/app/[locale]/manage/tools/api/components/mcp-tools-accordion.module.css create mode 100644 apps/nextjs/src/app/[locale]/manage/tools/api/components/scalar-api-reference.tsx create mode 100644 apps/nextjs/src/app/[locale]/manage/tools/api/components/scalar-theme.css delete mode 100644 apps/nextjs/src/app/[locale]/manage/tools/api/components/swagger-ui.tsx delete mode 100644 apps/nextjs/src/app/[locale]/manage/tools/api/swagger-ui-dark.css delete mode 100644 apps/nextjs/src/app/[locale]/manage/tools/api/swagger-ui-overrides.css delete mode 100644 apps/nextjs/src/app/[locale]/manage/tools/api/swagger-ui.css create mode 100644 apps/nextjs/src/app/api/mcp/[transport]/route.ts create mode 100644 apps/nextjs/src/app/api/mcp/_extract-tools.ts create mode 100644 apps/nextjs/src/app/api/mcp/oauth/_store.ts create mode 100644 apps/nextjs/src/app/api/mcp/oauth/authorize/route.ts create mode 100644 apps/nextjs/src/app/api/mcp/oauth/register/route.ts create mode 100644 apps/nextjs/src/app/api/mcp/oauth/token/route.ts create mode 100644 packages/api/src/mcp.ts create mode 100644 packages/api/src/test/mcp.spec.ts diff --git a/.cursor/plans/revert_demo_mcp_8d8927a6.plan.md b/.cursor/plans/revert_demo_mcp_8d8927a6.plan.md new file mode 100644 index 000000000..2bd9a49ef --- /dev/null +++ b/.cursor/plans/revert_demo_mcp_8d8927a6.plan.md @@ -0,0 +1,197 @@ +--- +name: Revert Demo MCP +overview: Revert the demo-specific MCP accommodations (API key bypass, read-only filtering, demo UI) since demo MCP is an edge case with poor ROI. Replace with a clear "MCP not available in demo mode" message. Keep the core MCP feature intact for real instances. +todos: + - id: revert-backend + content: Revert demoSafe procedure, apiKeys demo bypass, isDemoMode export from mcp.ts + status: pending + - id: revert-mcp-route + content: Remove isDemoMode filtering and demo SERVER_INSTRUCTIONS from MCP route + status: pending + - id: revert-ui + content: Remove isDemoMode prop plumbing; add demo-not-supported Alert via info.isDemoMode + status: pending + - id: verify + content: Run lint + typecheck; smoke-test demo vs non-demo MCP tab + status: pending +isProject: false +--- + +# Revert Demo MCP Accommodations + +## Why Docker works but integrations do not + +Demo mode has **two different mock mechanisms**: + +```mermaid +flowchart TB + subgraph dockerPath [Docker - works in demo] + MCP1[MCP docker_getContainers] + Handler[docker.ts request handler] + MockContainers[Hardcoded mockContainers] + MCP1 --> Handler + Handler -->|"if DEMO_MODE"| MockContainers + end + + subgraph integrationPath [Integrations - confusing in demo] + MCP2[MCP widget tools e.g. calendar_findAllEvents] + TRPC[tRPC procedure] + RH[cached-integration-request-handler] + Kind{integration.kind} + Mock[MockIntegration fake data] + Real[Sonarr/Radarr HTTP - fails] + MCP2 --> TRPC --> RH --> Kind + Kind -->|mock| Mock + Kind -->|sonarr/radarr| Real + end +``` + +- **Docker**: + [`packages/request-handler/src/docker.ts`](packages/request-handler/src/docker.ts) + checks `DEMO_MODE` directly and returns inline fake containers. No integration + record needed. +- **Everything else**: Demo seed creates **one** integration with `kind: "mock"` + ([`packages/db/migrations/seed.ts`](packages/db/migrations/seed.ts)), not + Sonarr/Radarr/Overseerr. + [`MockIntegration`](packages/integrations/src/mock/mock-integration.ts) can + serve calendar, downloads, health, DNS, media server, etc. **if** callers pass + that integration ID. +- **Why it felt broken**: MCP tool descriptions tell AI clients to look for + "Overseerr/Sonarr IDs". Demo has none. Tools like + `integration_searchMediaRequests` hard-filter to `mediaSearch` kinds + (`overseerr`, `jellyseerr`, `seerr`) — `mock` is excluded from that category + in + [`packages/definitions/src/integration.ts`](packages/definitions/src/integration.ts). + +Fixing this properly means extending the mock integration system (new +`searchAsync`, category changes, middleware relaxations, instruction rewrites) +for a feature almost nobody will use on the public demo. + +## Option comparison + +| | **Revert (chosen)** | **Minimal fix** | **Full fix** | +| -------------------- | --------------------------- | ---------------------------------------------- | --------------------------------------------------- | +| **Effort** | ~1 hour, ~100 lines removed | ~2 hours | 1-2 days | +| **Files touched** | 8 MCP/demo-specific files | 8 + route instructions | 15+ across integrations, definitions, seed, routers | +| **Risk** | Low | Low-medium | Medium (mock/search semantics) | +| **Demo MCP outcome** | Clearly unsupported | Partial (widget reads only, no search/request) | Near-full read coverage | +| **Maintenance** | None ongoing | Instructions drift with tool changes | Mock parity with real integrations | + +**Recommendation: Revert.** The demo accommodation code added special-case +plumbing (`demoSafePermissionRequiredProcedure`, dual mutation guards, hardcoded +UI strings) for a workflow that still cannot deliver a convincing "homelab AI" +experience without substantial integration-layer work. + +## What to revert (demo MCP accommodations only) + +These changes were added specifically for demo + MCP. **Do not revert** the core +MCP server, OAuth, Scalar docs, tool descriptions, or `normalizeSchema`. + +### Backend (3 files) + +1. [`packages/api/src/trpc.ts`](packages/api/src/trpc.ts) + - Remove `demoSafePermissionRequiredProcedure` export (~12 lines) + - Keep existing `enforceDemoModeReadOnly` (pre-dates MCP; used by whole app) + +2. [`packages/api/src/router/apiKeys.ts`](packages/api/src/router/apiKeys.ts) + - Change `create` back to `permissionRequiredProcedure` (mutations blocked in + demo again) + - Remove `isDemoMode` guard on `delete` (global demo middleware already + blocks delete mutations) + - Remove `TRPCError` / `isDemoMode` imports if unused + +3. [`packages/api/src/mcp.ts`](packages/api/src/mcp.ts) + - Stop exporting `isDemoMode`; keep only `createTRPCContext` and `mcpRouter` + +### MCP route (1 file) + +4. [`apps/nextjs/src/app/api/mcp/[transport]/route.ts`](apps/nextjs/src/app/api/mcp/[transport]/route.ts) + - Remove `isDemoMode` import and all demo branches: + - `ListToolsRequestSchema` mutation filter + - `CallToolRequestSchema` mutation rejection + - `SERVER_INSTRUCTIONS` demo section + - Keep `getToolType` / `buildToolTypeMap` only if still needed elsewhere; + otherwise remove dead code from demo-only filtering + +### UI (4 files) + +5. [`apps/nextjs/src/app/[locale]/manage/tools/api/page.tsx`](apps/nextjs/src/app/[locale]/manage/tools/api/page.tsx) + - Remove `isDemoMode` import from `@homarr/api/mcp` + - Stop passing `isDemoMode` to child components + +6. [`apps/nextjs/src/app/[locale]/manage/tools/api/components/api-page-tabs.tsx`](apps/nextjs/src/app/[locale]/manage/tools/api/components/api-page-tabs.tsx) + - Remove `isDemoMode` prop from interface and `McpInstructions` call + +7. [`apps/nextjs/src/app/[locale]/manage/tools/api/components/mcp-instructions.tsx`](apps/nextjs/src/app/[locale]/manage/tools/api/components/mcp-instructions.tsx) + - Remove `isDemoMode` prop + - Replace current demo banner with a single **Alert**: MCP requires a + self-hosted instance; demo mode does not support MCP (API key creation and + write tools are disabled) + - Use `clientApi.info.isDemoMode.useQuery()` or pass `isDemoMode` from server + via existing `api.info.isDemoMode()` tRPC query (already exists in + [`packages/api/src/router/info.ts`](packages/api/src/router/info.ts)) — + avoids re-exporting from `@homarr/api/mcp` + +8. [`apps/nextjs/src/app/[locale]/manage/tools/api/components/api-keys.tsx`](apps/nextjs/src/app/[locale]/manage/tools/api/components/api-keys.tsx) + - Remove `isDemoMode` prop and conditional delete-column spread + - Delete button hidden automatically in demo because `apiKeys.delete` + mutation is blocked by global `enforceDemoModeReadOnly` + +## What to add instead + +- **MCP tab**: When `info.isDemoMode` is true, show a prominent notice at the + top of + [`mcp-instructions.tsx`](apps/nextjs/src/app/[locale]/manage/tools/api/components/mcp-instructions.tsx) + explaining MCP is for self-hosted instances only. +- **Optional**: Disable/hide the "Create API Key" button on the MCP tab in demo + (mutations will fail anyway). +- **No changes** to integrations, definitions, seed, or mock services. + +## Files NOT impacted by revert + +Core MCP feature stays as-is: + +- [`apps/nextjs/src/app/api/mcp/[transport]/route.ts`](apps/nextjs/src/app/api/mcp/[transport]/route.ts) + — auth, rate limiting, `normalizeSchema`, `SERVER_INSTRUCTIONS` (minus demo + section) +- OAuth routes under `apps/nextjs/src/app/api/mcp/oauth/` +- All MCP-enabled routers in `packages/api/src/router/` +- [`packages/api/src/mcp.ts`](packages/api/src/mcp.ts) — eager router (minus + `isDemoMode` export) +- Scalar UI, dynamic tools table, + [`.cursor/rules/mcp-integration.mdc`](.cursor/rules/mcp-integration.mdc) + +Pre-existing demo infrastructure (unchanged): + +- [`packages/request-handler/src/docker.ts`](packages/request-handler/src/docker.ts) + — Docker mock containers +- [`packages/db/migrations/seed.ts`](packages/db/migrations/seed.ts) — mock + integration + demo board +- [`packages/integrations/src/mock/`](packages/integrations/src/mock/) — mock + services for widgets on demo board UI + +## Verification + +1. `pnpm lint` and `pnpm typecheck` pass +2. Demo mode (`DEMO_MODE=true`): + - MCP tab shows "not supported" notice + - API key create fails with existing "Mutations are disabled in demo mode" + - `docker_getContainers` still works on demo board UI (unchanged; separate + code path) +3. Non-demo mode: MCP unchanged (all tools listed, mutations work with + permissions) + +## Commit strategy + +Single focused commit on `feat/add-mcp-server`: + +``` +revert(mcp): drop demo-mode accommodations for MCP + +MCP is intended for self-hosted instances. Remove demo-specific API key +bypass, read-only tool filtering, and demo UI plumbing. Show a clear +notice on the MCP tab when demo mode is active. +``` + +Then push to the existing PR (no force-push needed unless you want another +squash). diff --git a/.cursor/rules/mcp-integration.mdc b/.cursor/rules/mcp-integration.mdc new file mode 100644 index 000000000..989b0c4f6 --- /dev/null +++ b/.cursor/rules/mcp-integration.mdc @@ -0,0 +1,103 @@ +--- +description: How to expose tRPC procedures as MCP tools for AI clients +globs: packages/api/src/router/**/*.ts +alwaysApply: false +--- + +# MCP Integration Guide + +Every new tRPC procedure that provides useful functionality should be exposed as an MCP tool so AI assistants (Claude, Cursor, etc.) can use it. This is a first-class feature of Homarr. + +## Adding MCP to a procedure + +Add `.meta({ mcp: { enabled: true, description: "..." } })` to the procedure chain: + +```typescript +// Read-only tool (query) +myProcedure: protectedProcedure + .meta({ mcp: { enabled: true, description: "Get all items with their status and metadata" } }) + .input(z.object({ limit: z.number().default(50) })) + .query(async ({ ctx, input }) => { ... }) + +// Write tool (mutation) +myAction: protectedProcedure + .meta({ mcp: { enabled: true, description: "Delete an item by ID. Requires interact permission on the integration" } }) + .input(z.object({ id: z.string() })) + .mutation(async ({ ctx, input }) => { ... }) + +// No-input procedure (z.void) — works fine, no .input() needed +getAll: protectedProcedure + .meta({ mcp: { enabled: true, description: "List all resources" } }) + .query(async ({ ctx }) => { ... }) +``` + +The `.meta()` call must come **before** `.input()` and `.query()`/`.mutation()` in the chain. + +## Writing good descriptions + +The description is the **only thing** an AI sees to decide when and how to use the tool. Write it like you're explaining to a colleague who has never used Homarr. + +**Must include:** +- What the tool returns or does +- Which integrations/services it works with (if applicable) +- How to get required IDs (e.g., "Use integration_all to get the integrationId") +- Permission requirements (if non-obvious) + +**Good:** +``` +"Get calendar events for upcoming and recent media releases. Fetches from all connected Sonarr (TV), Radarr (movies), Lidarr (music), and Readarr (books) integrations. Requires integrationIds from integration_all" +``` + +**Bad:** +``` +"Get calendar events" +``` + +**For tools that return permission fields**, explain what they mean: +``` +"List all integrations. Returns permissions.hasUseAccess (read) and permissions.hasInteractAccess (actions) — false means the API key lacks that permission, not an error" +``` + +## Registering in the MCP router + +After adding `.meta()` to procedures, you must register the router in `packages/api/src/mcp.ts`. This file uses **eager imports** (no `lazy()`) because MCP tool extraction requires synchronous access to all procedure definitions. + +```typescript +// packages/api/src/mcp.ts +import { myNewRouter } from "./router/my-new-feature"; + +export const mcpRouter = createTRPCRouter({ + // ... existing routers + myFeature: myNewRouter, +}); +``` + +**If your router is nested** (e.g., widget sub-routers), import and register the sub-router directly — do not import a parent that uses `lazy()`. + +## What to expose vs. what to skip + +**Expose:** +- Data queries (list, search, get by ID) +- Actions users would ask an AI to do (toggle, create, delete, approve) +- Status checks (health, stats, summaries) + +**Skip:** +- Subscriptions (WebSocket-only, not supported by MCP) +- Internal procedures (session management, onboarding steps) +- File upload/download procedures +- Procedures that return non-serializable data (streams, blobs) + +## Input schema rules + +- Use `z.object({...})` for inputs — this maps cleanly to MCP tool parameters +- `z.void()` (no `.input()`) works — the MCP handler patches these to accept empty objects +- Avoid `z.union()` or `z.discriminatedUnion()` at the top level — AI clients struggle with these +- Use `.default()` on optional fields so the AI doesn't need to guess values + +## Checklist for new features + +1. Add `.meta({ mcp: { enabled: true, description: "..." } })` to relevant procedures +2. Import and register the router in `packages/api/src/mcp.ts` (eager, no lazy) +3. Write descriptions that explain what the tool does, what it needs, and what it returns +4. If the tool requires an ID from another tool, say which one in the description +5. Test with `curl` against `/api/mcp/mcp` to verify the tool appears in `tools/list` diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index be5ff450b..4a9ab466d 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -56,6 +56,8 @@ "@mantine/hooks": "catalog:", "@mantine/modals": "catalog:", "@mantine/tiptap": "catalog:", + "@modelcontextprotocol/sdk": "catalog:", + "@scalar/api-reference-react": "catalog:", "@tabler/icons-react": "catalog:", "@tanstack/react-query": "catalog:", "@tanstack/react-query-devtools": "catalog:", @@ -83,6 +85,7 @@ "lucide-react": "catalog:", "mantine-datatable": "catalog:", "mantine-react-table": "catalog:", + "mcp-handler": "catalog:", "next": "catalog:", "postcss-preset-mantine": "catalog:", "prismjs": "catalog:", @@ -93,7 +96,7 @@ "sass": "catalog:", "sql.js": "catalog:", "superjson": "catalog:", - "swagger-ui-react": "catalog:", + "trpc-to-mcp": "catalog:", "use-deep-compare-effect": "catalog:", "yaml": "catalog:", "zod": "catalog:" @@ -107,7 +110,6 @@ "@types/prismjs": "catalog:", "@types/react": "catalog:", "@types/react-dom": "catalog:", - "@types/swagger-ui-react": "catalog:", "concurrently": "catalog:", "node-loader": "catalog:", "typescript": "catalog:" diff --git a/apps/nextjs/src/app/.well-known/oauth-authorization-server/route.ts b/apps/nextjs/src/app/.well-known/oauth-authorization-server/route.ts new file mode 100644 index 000000000..c400b4020 --- /dev/null +++ b/apps/nextjs/src/app/.well-known/oauth-authorization-server/route.ts @@ -0,0 +1,32 @@ +import { headers } from "next/headers"; + +import { extractBaseUrlFromHeaders } from "@homarr/common"; + +const corsHeaders = { + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Methods": "GET, OPTIONS", + "Access-Control-Allow-Headers": "*", +}; + +export async function GET() { + const baseUrl = extractBaseUrlFromHeaders(await headers()); + + return Response.json( + { + issuer: baseUrl, + authorization_endpoint: `${baseUrl}/api/mcp/oauth/authorize`, + token_endpoint: `${baseUrl}/api/mcp/oauth/token`, + registration_endpoint: `${baseUrl}/api/mcp/oauth/register`, + response_types_supported: ["code"], + grant_types_supported: ["authorization_code"], + code_challenge_methods_supported: ["S256"], + token_endpoint_auth_methods_supported: ["none"], + scopes_supported: ["mcp:tools"], + }, + { headers: corsHeaders }, + ); +} + +export async function OPTIONS() { + return new Response(null, { status: 204, headers: corsHeaders }); +} diff --git a/apps/nextjs/src/app/.well-known/oauth-protected-resource/route.ts b/apps/nextjs/src/app/.well-known/oauth-protected-resource/route.ts new file mode 100644 index 000000000..ca66ee1a3 --- /dev/null +++ b/apps/nextjs/src/app/.well-known/oauth-protected-resource/route.ts @@ -0,0 +1,25 @@ +import { headers } from "next/headers"; + +import { extractBaseUrlFromHeaders } from "@homarr/common"; + +const corsHeaders = { + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Methods": "GET, OPTIONS", + "Access-Control-Allow-Headers": "*", +}; + +export async function GET() { + const baseUrl = extractBaseUrlFromHeaders(await headers()); + + return Response.json( + { + resource: baseUrl, + authorization_servers: [baseUrl], + }, + { headers: corsHeaders }, + ); +} + +export async function OPTIONS() { + return new Response(null, { status: 204, headers: corsHeaders }); +} diff --git a/apps/nextjs/src/app/[locale]/manage/tools/api/components/api-page-tabs.tsx b/apps/nextjs/src/app/[locale]/manage/tools/api/components/api-page-tabs.tsx new file mode 100644 index 000000000..c56dfc916 --- /dev/null +++ b/apps/nextjs/src/app/[locale]/manage/tools/api/components/api-page-tabs.tsx @@ -0,0 +1,58 @@ +"use client"; + +import { useState } from "react"; +import type { ReactNode } from "react"; +import { Tabs, TabsList, TabsPanel, TabsTab } from "@mantine/core"; +import { IconBrain, IconCode, IconKey } from "@tabler/icons-react"; + +import { McpInstructions } from "./mcp-instructions"; + +export interface McpToolGroup { + namespace: string; + tools: { name: string; description: string; type: "query" | "mutation" }[]; +} + +interface ApiPageTabsProps { + documentationLabel: string; + apiKeyLabel: string; + mcpLabel: string; + documentationPanel: ReactNode; + authenticationPanel: ReactNode; + baseUrl: string; + hasApiKeys: boolean; + toolGroups: McpToolGroup[]; +} + +export function ApiPageTabs({ + documentationLabel, + apiKeyLabel, + mcpLabel, + documentationPanel, + authenticationPanel, + baseUrl, + hasApiKeys, + toolGroups, +}: ApiPageTabsProps) { + const [activeTab, setActiveTab] = useState("documentation"); + + return ( + + + }> + {documentationLabel} + + }> + {apiKeyLabel} + + }> + {mcpLabel} + + + {authenticationPanel} + {documentationPanel} + + + + + ); +} diff --git a/apps/nextjs/src/app/[locale]/manage/tools/api/components/mcp-instructions.tsx b/apps/nextjs/src/app/[locale]/manage/tools/api/components/mcp-instructions.tsx new file mode 100644 index 000000000..f3ac4ea6d --- /dev/null +++ b/apps/nextjs/src/app/[locale]/manage/tools/api/components/mcp-instructions.tsx @@ -0,0 +1,343 @@ +"use client"; + +import { + Accordion, + AccordionControl, + AccordionItem, + AccordionPanel, + ActionIcon, + Alert, + Badge, + Button, + Code, + CopyButton, + Group, + List, + ListItem, + Stack, + Text, + ThemeIcon, + Title, +} from "@mantine/core"; +import { + IconAlertTriangle, + IconBrain, + IconCheck, + IconCopy, + IconKey, + IconLock, + IconPlus, + IconPlugConnected, + IconSparkles, + IconTerminal, + IconTools, + IconWorld, +} from "@tabler/icons-react"; + +import { clientApi } from "@homarr/api/client"; +import { revalidatePathActionAsync } from "@homarr/common/client"; +import { useModalAction } from "@homarr/modals"; +import { useScopedI18n } from "@homarr/translation/client"; + +import { CopyApiKeyModal } from "./copy-api-key-modal"; +import type { McpToolGroup } from "./api-page-tabs"; +import classes from "./mcp-tools-accordion.module.css"; + +const toolTypeDisplay: Record<"query" | "mutation", { color: string; method: string }> = { + query: { color: "blue", method: "GET" }, + mutation: { color: "orange", method: "POST" }, +}; + +interface McpInstructionsProps { + baseUrl: string; + hasApiKeys: boolean; + toolGroups: McpToolGroup[]; +} + +export function McpInstructions({ baseUrl, hasApiKeys, toolGroups }: McpInstructionsProps) { + const t = useScopedI18n("management.page.tool.api.tab.mcp"); + const { openModal } = useModalAction(CopyApiKeyModal); + const { mutate: createApiKey, isPending } = clientApi.apiKeys.create.useMutation({ + async onSuccess(data) { + openModal({ apiKey: data.apiKey }); + await revalidatePathActionAsync("/manage/tools/api"); + }, + }); + const mcpUrl = `${baseUrl}/api/mcp/mcp`; + + const streamableHttpConfig = JSON.stringify( + { + mcpServers: { + homarr: { + url: mcpUrl, + headers: { + ApiKey: "", + }, + }, + }, + }, + null, + 2, + ); + + const stdioConfig = JSON.stringify( + { + mcpServers: { + homarr: { + command: "npx", + args: ["-y", "mcp-remote", mcpUrl, "--header", "ApiKey:"], + }, + }, + }, + null, + 2, + ); + + const testCommand = `curl -s -X POST -H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" -H "ApiKey: " -d '{"jsonrpc":"2.0","method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}},"id":1}' ${mcpUrl}`; + + return ( + + + + + +
+ {t("title")} + + {t("subtitle")} + +
+
+ + }> + {t("description")} + + + {!hasApiKeys && ( + }> + + {t("noApiKey")} + + + + )} + +
+ + <Group gap="xs"> + <IconPlugConnected size={16} /> + {t("endpoint.title")} + </Group> + + +
+ +
+ + <Group gap="xs"> + <IconLock size={16} /> + {t("authentication.title")} + </Group> + + + {t("authentication.intro")} + + + + + + + + {t("authentication.apiKey.title")} + + + + + {t("authentication.apiKey.description")} + + {t("authentication.permissions")} + + + + + + + + + + {t("authentication.oauth.title")} + + + + + {t("authentication.oauth.description")} + + {t("authentication.oauth.hint")} + + + + + +
+ +
+ + {t("clientConfig.title")} + + + + + + + {t("clientConfig.streamableHttp.recommended")} + + {t("clientConfig.streamableHttp.title")} + + + + + + {t("clientConfig.streamableHttp.worksWith")} + + + {t("clientConfig.streamableHttp.addToConfig")} + + + + {t("clientConfig.streamableHttp.cursor", { + name: "Cursor", + file: ".cursor/mcp.json", + })} + + + {t("clientConfig.streamableHttp.claudeDesktop", { + name: "Claude Desktop", + file: "claude_desktop_config.json", + })} + + + {t("clientConfig.streamableHttp.claudeCode", { + name: "Claude Code", + file: ".claude/mcp.json", + command: "claude mcp add homarr", + })} + + + {t("clientConfig.streamableHttp.vsCodeCopilot", { + name: "VS Code Copilot", + file: ".vscode/mcp.json", + })} + + + + } p="xs"> + {t("clientConfig.streamableHttp.replaceHint")} + + + + + + + {t("clientConfig.stdio.title")} + + + + {t("clientConfig.stdio.description", { dependency: "npx" })} + + + + + + +
+ +
+ + <Group gap="xs"> + <IconTerminal size={16} /> + {t("testConnection.title")} + </Group> + + + {t("testConnection.description")} + + + + {t("testConnection.hint")} + +
+ +
+ + <Group gap="xs"> + <IconTools size={16} /> + {t("availableTools.title")} + </Group> + + + {t("availableTools.description", { + count: String(toolGroups.reduce((sum, g) => sum + g.tools.length, 0)), + })} + + + {toolGroups.map((group) => ( + + + + + {group.namespace} + + + {group.tools.length} + + + + + + {group.tools.map((tool) => ( +
+ + {toolTypeDisplay[tool.type].method} + +
+ + {tool.name} + + + {tool.description} + +
+
+ ))} +
+
+
+ ))} +
+
+
+ ); +} + +function CopyableCode({ value, copyLabel }: { value: string; copyLabel: string }) { + return ( + + {value} + + {({ copied, copy }) => ( + + {copied ? : } + + )} + + + ); +} diff --git a/apps/nextjs/src/app/[locale]/manage/tools/api/components/mcp-tools-accordion.module.css b/apps/nextjs/src/app/[locale]/manage/tools/api/components/mcp-tools-accordion.module.css new file mode 100644 index 000000000..9cb951b52 --- /dev/null +++ b/apps/nextjs/src/app/[locale]/manage/tools/api/components/mcp-tools-accordion.module.css @@ -0,0 +1,6 @@ +.toolRow { + display: grid; + grid-template-columns: 42px 1fr; + align-items: first baseline; + gap: var(--mantine-spacing-xs); +} diff --git a/apps/nextjs/src/app/[locale]/manage/tools/api/components/scalar-api-reference.tsx b/apps/nextjs/src/app/[locale]/manage/tools/api/components/scalar-api-reference.tsx new file mode 100644 index 000000000..c4958d125 --- /dev/null +++ b/apps/nextjs/src/app/[locale]/manage/tools/api/components/scalar-api-reference.tsx @@ -0,0 +1,35 @@ +"use client"; + +import { useComputedColorScheme } from "@mantine/core"; +import { ApiReferenceReact } from "@scalar/api-reference-react"; + +import "@scalar/api-reference-react/style.css"; +import "./scalar-theme.css"; + +interface ScalarApiReferenceProps { + document: object; +} + +export function ScalarApiReference({ document }: ScalarApiReferenceProps) { + const colorScheme = useComputedColorScheme("light"); + + return ( + + ); +} diff --git a/apps/nextjs/src/app/[locale]/manage/tools/api/components/scalar-theme.css b/apps/nextjs/src/app/[locale]/manage/tools/api/components/scalar-theme.css new file mode 100644 index 000000000..b795f7ad9 --- /dev/null +++ b/apps/nextjs/src/app/[locale]/manage/tools/api/components/scalar-theme.css @@ -0,0 +1,51 @@ +.light-mode { + --scalar-background-1: var(--mantine-color-body); + --scalar-background-2: var(--mantine-color-gray-0); + --scalar-background-3: var(--mantine-color-gray-1); + --scalar-background-card: var(--mantine-color-white); + --scalar-background-accent: rgba(0, 0, 0, 0.04); + + --scalar-color-1: var(--mantine-color-text); + --scalar-color-2: var(--mantine-color-dimmed); + --scalar-color-3: var(--mantine-color-dimmed); + --scalar-color-accent: var(--mantine-color-red-6); + + --scalar-border-color: var(--mantine-color-gray-3); + + --scalar-button-1: var(--mantine-color-dark-7); + --scalar-button-1-hover: var(--mantine-color-dark-5); + --scalar-button-1-color: var(--mantine-color-white); + + --scalar-scrollbar-color: rgba(0, 0, 0, 0.18); + --scalar-scrollbar-color-active: rgba(0, 0, 0, 0.36); +} + +.dark-mode { + --scalar-background-1: var(--mantine-color-body); + --scalar-background-2: var(--mantine-color-dark-6); + --scalar-background-3: var(--mantine-color-dark-5); + --scalar-background-card: var(--mantine-color-dark-6); + --scalar-background-accent: rgba(255, 255, 255, 0.06); + + --scalar-color-1: var(--mantine-color-text); + --scalar-color-2: var(--mantine-color-dimmed); + --scalar-color-3: var(--mantine-color-dimmed); + --scalar-color-accent: var(--mantine-color-red-6); + + --scalar-border-color: var(--mantine-color-dark-4); + + --scalar-button-1: rgba(255, 255, 255, 0.9); + --scalar-button-1-hover: rgba(255, 255, 255, 0.8); + --scalar-button-1-color: var(--mantine-color-dark-7); + + --scalar-scrollbar-color: rgba(255, 255, 255, 0.18); + --scalar-scrollbar-color-active: rgba(255, 255, 255, 0.36); +} + +.scalar-card, +.scalar-api-client__item, +.dark-mode .dark-mode.scalar-card { + --scalar-background-1: var(--scalar-background-card); + --scalar-background-2: var(--scalar-background-card); + --scalar-background-3: var(--scalar-background-card); +} diff --git a/apps/nextjs/src/app/[locale]/manage/tools/api/components/swagger-ui.tsx b/apps/nextjs/src/app/[locale]/manage/tools/api/components/swagger-ui.tsx deleted file mode 100644 index 1f0073df6..000000000 --- a/apps/nextjs/src/app/[locale]/manage/tools/api/components/swagger-ui.tsx +++ /dev/null @@ -1,23 +0,0 @@ -"use client"; - -import type { OpenAPIObject } from "openapi3-ts/oas31"; -import SwaggerUI from "swagger-ui-react"; - -// workaround for CSS that cannot be processed by next.js, https://github.com/swagger-api/swagger-ui/issues/10045 -import "../swagger-ui-dark.css"; -import "../swagger-ui-overrides.css"; -import "../swagger-ui.css"; - -interface SwaggerUIClientProps { - document: OpenAPIObject; -} - -export const SwaggerUIClient = ({ document }: SwaggerUIClientProps) => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const requestInterceptor = (req: Record) => { - req.credentials = "omit"; - return req; - }; - - return ; -}; diff --git a/apps/nextjs/src/app/[locale]/manage/tools/api/page.tsx b/apps/nextjs/src/app/[locale]/manage/tools/api/page.tsx index f3fe3b825..bdd86cc7c 100644 --- a/apps/nextjs/src/app/[locale]/manage/tools/api/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/tools/api/page.tsx @@ -1,16 +1,57 @@ import { headers } from "next/headers"; import { notFound } from "next/navigation"; -import { Stack, Tabs, TabsList, TabsPanel, TabsTab } from "@mantine/core"; +import { Stack } from "@mantine/core"; +import { mcpRouter } from "@homarr/api/mcp"; import { openApiDocument } from "@homarr/api/open-api"; import { api } from "@homarr/api/server"; import { auth } from "@homarr/auth/next"; import { extractBaseUrlFromHeaders } from "@homarr/common"; import { getScopedI18n } from "@homarr/translation/server"; -import { SwaggerUIClient } from "~/app/[locale]/manage/tools/api/components/swagger-ui"; import { createMetaTitle } from "~/metadata"; +import { extractMcpTools } from "~/app/api/mcp/_extract-tools"; import { ApiKeysManagement } from "./components/api-keys"; +import { ApiPageTabs } from "./components/api-page-tabs"; +import { ScalarApiReference } from "./components/scalar-api-reference"; + +import type { McpToolGroup } from "./components/api-page-tabs"; + +let cachedToolGroups: McpToolGroup[] | null = null; + +function getMcpToolGroups(): McpToolGroup[] { + if (cachedToolGroups) return cachedToolGroups; + + const tools = extractMcpTools(); + + const procedures = (mcpRouter as any)._def.procedures as Record; + const procedureTypeMap = new Map(); + for (const [key, proc] of Object.entries(procedures)) { + const type = proc?._def?.type; + if (type === "query" || type === "mutation") { + procedureTypeMap.set(key, type); + } + } + + const groups = new Map(); + for (const tool of tools) { + const namespace = tool.pathInRouter[0] ?? "other"; + if (!groups.has(namespace)) { + groups.set(namespace, []); + } + const procedureKey = tool.pathInRouter.join("."); + groups.get(namespace)?.push({ + name: tool.name, + description: tool.description, + type: procedureTypeMap.get(procedureKey) ?? "query", + }); + } + cachedToolGroups = Array.from(groups.entries()).map(([namespace, items]) => ({ + namespace, + tools: items, + })); + return cachedToolGroups; +} export async function generateMetadata() { const session = await auth(); @@ -30,24 +71,25 @@ export default async function ApiPage() { if (!session?.user.permissions.includes("admin")) { notFound(); } - const document = openApiDocument(extractBaseUrlFromHeaders(await headers())); + const requestHeaders = await headers(); + const baseUrl = extractBaseUrlFromHeaders(requestHeaders); + const document = openApiDocument(baseUrl); const apiKeys = await api.apiKeys.getAll(); const t = await getScopedI18n("management.page.tool.api.tab"); + const toolGroups = getMcpToolGroups(); return ( - - - {t("documentation.label")} - {t("apiKey.label")} - - - - - - - - + } + authenticationPanel={} + baseUrl={baseUrl} + hasApiKeys={apiKeys.length > 0} + toolGroups={toolGroups} + /> ); } diff --git a/apps/nextjs/src/app/[locale]/manage/tools/api/swagger-ui-dark.css b/apps/nextjs/src/app/[locale]/manage/tools/api/swagger-ui-dark.css deleted file mode 100644 index 33277c081..000000000 --- a/apps/nextjs/src/app/[locale]/manage/tools/api/swagger-ui-dark.css +++ /dev/null @@ -1,1719 +0,0 @@ -[data-mantine-color-scheme="dark"] { - @media only screen { - .swagger-ui a { - color: #d0d0d0; - } - - .swagger-ui ::-webkit-scrollbar-track-piece { - background-color: rgba(255, 255, 255, 0.2) !important; - } - - .swagger-ui ::-webkit-scrollbar-track { - background-color: rgba(255, 255, 255, 0.3) !important; - } - - .swagger-ui ::-webkit-scrollbar-thumb { - background-color: rgba(255, 255, 255, 0.5) !important; - } - - .swagger-ui embed[type="application/pdf"] { - filter: invert(90%); - } - - .swagger-ui, - .swagger-ui section h3 { - color: #b5bac9; - } - - .swagger-ui a { - background-color: transparent; - } - - .swagger-ui mark { - background-color: #664b00; - color: #bfbfbf; - } - - .swagger-ui legend { - color: inherit; - } - - .swagger-ui .debug * { - outline: #e6da99 solid 1px; - } - - .swagger-ui .debug-white * { - outline: #fff solid 1px; - } - - .swagger-ui .debug-black * { - outline: #bfbfbf solid 1px; - } - - .swagger-ui .debug-grid { - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTRDOTY4N0U2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTRDOTY4N0Q2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3NjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3NzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsBS+GMAAAAjSURBVHjaYvz//z8DLsD4gcGXiYEAGBIKGBne//fFpwAgwAB98AaF2pjlUQAAAABJRU5ErkJggg==) - 0 0; - } - - .swagger-ui .debug-grid-16 { - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODYyRjhERDU2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODYyRjhERDQ2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QTY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3QjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvCS01IAAABMSURBVHjaYmR4/5+BFPBfAMFm/MBgx8RAGWCn1AAmSg34Q6kBDKMGMDCwICeMIemF/5QawEipAWwUhwEjMDvbAWlWkvVBwu8vQIABAEwBCph8U6c0AAAAAElFTkSuQmCC) - 0 0; - } - - .swagger-ui .debug-grid-8-solid { - background: url(data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAAAAD/4QMxaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzExMSA3OS4xNTgzMjUsIDIwMTUvMDkvMTAtMDE6MTA6MjAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkIxMjI0OTczNjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIxMjI0OTc0NjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjEyMjQ5NzE2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjEyMjQ5NzI2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAbGhopHSlBJiZBQi8vL0JHPz4+P0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHAR0pKTQmND8oKD9HPzU/R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0f/wAARCAAIAAgDASIAAhEBAxEB/8QAWQABAQAAAAAAAAAAAAAAAAAAAAYBAQEAAAAAAAAAAAAAAAAAAAIEEAEBAAMBAAAAAAAAAAAAAAABADECA0ERAAEDBQAAAAAAAAAAAAAAAAARITFBUWESIv/aAAwDAQACEQMRAD8AoOnTV1QTD7JJshP3vSM3P//Z) - 0 0 #1c1c21; - } - - .swagger-ui .debug-grid-16-solid { - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzY3MkJEN0U2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzY3MkJEN0Y2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3RDY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pve6J3kAAAAzSURBVHjaYvz//z8D0UDsMwMjSRoYP5Gq4SPNbRjVMEQ1fCRDg+in/6+J1AJUxsgAEGAA31BAJMS0GYEAAAAASUVORK5CYII=) - 0 0 #1c1c21; - } - - .swagger-ui .b--black { - border-color: #000; - } - - .swagger-ui .b--near-black { - border-color: #121212; - } - - .swagger-ui .b--dark-gray { - border-color: #333; - } - - .swagger-ui .b--mid-gray { - border-color: #545454; - } - - .swagger-ui .b--gray { - border-color: #787878; - } - - .swagger-ui .b--silver { - border-color: #999; - } - - .swagger-ui .b--light-silver { - border-color: #6e6e6e; - } - - .swagger-ui .b--moon-gray { - border-color: #4d4d4d; - } - - .swagger-ui .b--light-gray { - border-color: #2b2b2b; - } - - .swagger-ui .b--near-white { - border-color: #242424; - } - - .swagger-ui .b--white { - border-color: #1c1c21; - } - - .swagger-ui .b--white-90 { - border-color: rgba(28, 28, 33, 0.9); - } - - .swagger-ui .b--white-80 { - border-color: rgba(28, 28, 33, 0.8); - } - - .swagger-ui .b--white-70 { - border-color: rgba(28, 28, 33, 0.7); - } - - .swagger-ui .b--white-60 { - border-color: rgba(28, 28, 33, 0.6); - } - - .swagger-ui .b--white-50 { - border-color: rgba(28, 28, 33, 0.5); - } - - .swagger-ui .b--white-40 { - border-color: rgba(28, 28, 33, 0.4); - } - - .swagger-ui .b--white-30 { - border-color: rgba(28, 28, 33, 0.3); - } - - .swagger-ui .b--white-20 { - border-color: rgba(28, 28, 33, 0.2); - } - - .swagger-ui .b--white-10 { - border-color: rgba(28, 28, 33, 0.1); - } - - .swagger-ui .b--white-05 { - border-color: rgba(28, 28, 33, 0.05); - } - - .swagger-ui .b--white-025 { - border-color: rgba(28, 28, 33, 0.024); - } - - .swagger-ui .b--white-0125 { - border-color: rgba(28, 28, 33, 0.01); - } - - .swagger-ui .b--black-90 { - border-color: rgba(0, 0, 0, 0.9); - } - - .swagger-ui .b--black-80 { - border-color: rgba(0, 0, 0, 0.8); - } - - .swagger-ui .b--black-70 { - border-color: rgba(0, 0, 0, 0.7); - } - - .swagger-ui .b--black-60 { - border-color: rgba(0, 0, 0, 0.6); - } - - .swagger-ui .b--black-50 { - border-color: rgba(0, 0, 0, 0.5); - } - - .swagger-ui .b--black-40 { - border-color: rgba(0, 0, 0, 0.4); - } - - .swagger-ui .b--black-30 { - border-color: rgba(0, 0, 0, 0.3); - } - - .swagger-ui .b--black-20 { - border-color: rgba(0, 0, 0, 0.2); - } - - .swagger-ui .b--black-10 { - border-color: rgba(0, 0, 0, 0.1); - } - - .swagger-ui .b--black-05 { - border-color: rgba(0, 0, 0, 0.05); - } - - .swagger-ui .b--black-025 { - border-color: rgba(0, 0, 0, 0.024); - } - - .swagger-ui .b--black-0125 { - border-color: rgba(0, 0, 0, 0.01); - } - - .swagger-ui .b--dark-red { - border-color: #bc2f36; - } - - .swagger-ui .b--red { - border-color: #c83932; - } - - .swagger-ui .b--light-red { - border-color: #ab3c2b; - } - - .swagger-ui .b--orange { - border-color: #cc6e33; - } - - .swagger-ui .b--purple { - border-color: #5e2ca5; - } - - .swagger-ui .b--light-purple { - border-color: #672caf; - } - - .swagger-ui .b--dark-pink { - border-color: #ab2b81; - } - - .swagger-ui .b--hot-pink { - border-color: #c03086; - } - - .swagger-ui .b--pink { - border-color: #8f2464; - } - - .swagger-ui .b--light-pink { - border-color: #721d4d; - } - - .swagger-ui .b--dark-green { - border-color: #1c6e50; - } - - .swagger-ui .b--green { - border-color: #279b70; - } - - .swagger-ui .b--light-green { - border-color: #228762; - } - - .swagger-ui .b--navy { - border-color: #0d1d35; - } - - .swagger-ui .b--dark-blue { - border-color: #20497e; - } - - .swagger-ui .b--blue { - border-color: #4380d0; - } - - .swagger-ui .b--light-blue { - border-color: #20517e; - } - - .swagger-ui .b--lightest-blue { - border-color: #143a52; - } - - .swagger-ui .b--washed-blue { - border-color: #0c312d; - } - - .swagger-ui .b--washed-green { - border-color: #0f3d2c; - } - - .swagger-ui .b--washed-red { - border-color: #411010; - } - - .swagger-ui .b--transparent { - border-color: transparent; - } - - .swagger-ui .b--gold, - .swagger-ui .b--light-yellow, - .swagger-ui .b--washed-yellow, - .swagger-ui .b--yellow { - border-color: #664b00; - } - - .swagger-ui .shadow-1 { - box-shadow: rgba(0, 0, 0, 0.2) 0 0 4px 2px; - } - - .swagger-ui .shadow-2 { - box-shadow: rgba(0, 0, 0, 0.2) 0 0 8px 2px; - } - - .swagger-ui .shadow-3 { - box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 4px 2px; - } - - .swagger-ui .shadow-4 { - box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 8px 0; - } - - .swagger-ui .shadow-5 { - box-shadow: rgba(0, 0, 0, 0.2) 4px 4px 8px 0; - } - - @media screen and (min-width: 30em) { - .swagger-ui .shadow-1-ns { - box-shadow: rgba(0, 0, 0, 0.2) 0 0 4px 2px; - } - - .swagger-ui .shadow-2-ns { - box-shadow: rgba(0, 0, 0, 0.2) 0 0 8px 2px; - } - - .swagger-ui .shadow-3-ns { - box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 4px 2px; - } - - .swagger-ui .shadow-4-ns { - box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 8px 0; - } - - .swagger-ui .shadow-5-ns { - box-shadow: rgba(0, 0, 0, 0.2) 4px 4px 8px 0; - } - } - - @media screen and (max-width: 60em) and (min-width: 30em) { - .swagger-ui .shadow-1-m { - box-shadow: rgba(0, 0, 0, 0.2) 0 0 4px 2px; - } - - .swagger-ui .shadow-2-m { - box-shadow: rgba(0, 0, 0, 0.2) 0 0 8px 2px; - } - - .swagger-ui .shadow-3-m { - box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 4px 2px; - } - - .swagger-ui .shadow-4-m { - box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 8px 0; - } - - .swagger-ui .shadow-5-m { - box-shadow: rgba(0, 0, 0, 0.2) 4px 4px 8px 0; - } - } - - @media screen and (min-width: 60em) { - .swagger-ui .shadow-1-l { - box-shadow: rgba(0, 0, 0, 0.2) 0 0 4px 2px; - } - - .swagger-ui .shadow-2-l { - box-shadow: rgba(0, 0, 0, 0.2) 0 0 8px 2px; - } - - .swagger-ui .shadow-3-l { - box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 4px 2px; - } - - .swagger-ui .shadow-4-l { - box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 8px 0; - } - - .swagger-ui .shadow-5-l { - box-shadow: rgba(0, 0, 0, 0.2) 4px 4px 8px 0; - } - } - - .swagger-ui .black-05 { - color: rgba(191, 191, 191, 0.05); - } - - .swagger-ui .bg-black-05 { - background-color: rgba(0, 0, 0, 0.05); - } - - .swagger-ui .black-90, - .swagger-ui .hover-black-90:focus, - .swagger-ui .hover-black-90:hover { - color: rgba(191, 191, 191, 0.9); - } - - .swagger-ui .black-80, - .swagger-ui .hover-black-80:focus, - .swagger-ui .hover-black-80:hover { - color: rgba(191, 191, 191, 0.8); - } - - .swagger-ui .black-70, - .swagger-ui .hover-black-70:focus, - .swagger-ui .hover-black-70:hover { - color: rgba(191, 191, 191, 0.7); - } - - .swagger-ui .black-60, - .swagger-ui .hover-black-60:focus, - .swagger-ui .hover-black-60:hover { - color: rgba(191, 191, 191, 0.6); - } - - .swagger-ui .black-50, - .swagger-ui .hover-black-50:focus, - .swagger-ui .hover-black-50:hover { - color: rgba(191, 191, 191, 0.5); - } - - .swagger-ui .black-40, - .swagger-ui .hover-black-40:focus, - .swagger-ui .hover-black-40:hover { - color: rgba(191, 191, 191, 0.4); - } - - .swagger-ui .black-30, - .swagger-ui .hover-black-30:focus, - .swagger-ui .hover-black-30:hover { - color: rgba(191, 191, 191, 0.3); - } - - .swagger-ui .black-20, - .swagger-ui .hover-black-20:focus, - .swagger-ui .hover-black-20:hover { - color: rgba(191, 191, 191, 0.2); - } - - .swagger-ui .black-10, - .swagger-ui .hover-black-10:focus, - .swagger-ui .hover-black-10:hover { - color: rgba(191, 191, 191, 0.1); - } - - .swagger-ui .hover-white-90:focus, - .swagger-ui .hover-white-90:hover, - .swagger-ui .white-90 { - color: rgba(255, 255, 255, 0.9); - } - - .swagger-ui .hover-white-80:focus, - .swagger-ui .hover-white-80:hover, - .swagger-ui .white-80 { - color: rgba(255, 255, 255, 0.8); - } - - .swagger-ui .hover-white-70:focus, - .swagger-ui .hover-white-70:hover, - .swagger-ui .white-70 { - color: rgba(255, 255, 255, 0.7); - } - - .swagger-ui .hover-white-60:focus, - .swagger-ui .hover-white-60:hover, - .swagger-ui .white-60 { - color: rgba(255, 255, 255, 0.6); - } - - .swagger-ui .hover-white-50:focus, - .swagger-ui .hover-white-50:hover, - .swagger-ui .white-50 { - color: rgba(255, 255, 255, 0.5); - } - - .swagger-ui .hover-white-40:focus, - .swagger-ui .hover-white-40:hover, - .swagger-ui .white-40 { - color: rgba(255, 255, 255, 0.4); - } - - .swagger-ui .hover-white-30:focus, - .swagger-ui .hover-white-30:hover, - .swagger-ui .white-30 { - color: rgba(255, 255, 255, 0.3); - } - - .swagger-ui .hover-white-20:focus, - .swagger-ui .hover-white-20:hover, - .swagger-ui .white-20 { - color: rgba(255, 255, 255, 0.2); - } - - .swagger-ui .hover-white-10:focus, - .swagger-ui .hover-white-10:hover, - .swagger-ui .white-10 { - color: rgba(255, 255, 255, 0.1); - } - - .swagger-ui .hover-moon-gray:focus, - .swagger-ui .hover-moon-gray:hover, - .swagger-ui .moon-gray { - color: #ccc; - } - - .swagger-ui .hover-light-gray:focus, - .swagger-ui .hover-light-gray:hover, - .swagger-ui .light-gray { - color: #ededed; - } - - .swagger-ui .hover-near-white:focus, - .swagger-ui .hover-near-white:hover, - .swagger-ui .near-white { - color: #f5f5f5; - } - - .swagger-ui .dark-red, - .swagger-ui .hover-dark-red:focus, - .swagger-ui .hover-dark-red:hover { - color: #e6999d; - } - - .swagger-ui .hover-red:focus, - .swagger-ui .hover-red:hover, - .swagger-ui .red { - color: #e69d99; - } - - .swagger-ui .hover-light-red:focus, - .swagger-ui .hover-light-red:hover, - .swagger-ui .light-red { - color: #e6a399; - } - - .swagger-ui .hover-orange:focus, - .swagger-ui .hover-orange:hover, - .swagger-ui .orange { - color: #e6b699; - } - - .swagger-ui .gold, - .swagger-ui .hover-gold:focus, - .swagger-ui .hover-gold:hover { - color: #e6d099; - } - - .swagger-ui .hover-yellow:focus, - .swagger-ui .hover-yellow:hover, - .swagger-ui .yellow { - color: #e6da99; - } - - .swagger-ui .hover-light-yellow:focus, - .swagger-ui .hover-light-yellow:hover, - .swagger-ui .light-yellow { - color: #ede6b6; - } - - .swagger-ui .hover-purple:focus, - .swagger-ui .hover-purple:hover, - .swagger-ui .purple { - color: #b99ae4; - } - - .swagger-ui .hover-light-purple:focus, - .swagger-ui .hover-light-purple:hover, - .swagger-ui .light-purple { - color: #bb99e6; - } - - .swagger-ui .dark-pink, - .swagger-ui .hover-dark-pink:focus, - .swagger-ui .hover-dark-pink:hover { - color: #e699cc; - } - - .swagger-ui .hot-pink, - .swagger-ui .hover-hot-pink:focus, - .swagger-ui .hover-hot-pink:hover, - .swagger-ui .hover-pink:focus, - .swagger-ui .hover-pink:hover, - .swagger-ui .pink { - color: #e699c7; - } - - .swagger-ui .hover-light-pink:focus, - .swagger-ui .hover-light-pink:hover, - .swagger-ui .light-pink { - color: #edb6d5; - } - - .swagger-ui .dark-green, - .swagger-ui .green, - .swagger-ui .hover-dark-green:focus, - .swagger-ui .hover-dark-green:hover, - .swagger-ui .hover-green:focus, - .swagger-ui .hover-green:hover { - color: #99e6c9; - } - - .swagger-ui .hover-light-green:focus, - .swagger-ui .hover-light-green:hover, - .swagger-ui .light-green { - color: #a1e8ce; - } - - .swagger-ui .hover-navy:focus, - .swagger-ui .hover-navy:hover, - .swagger-ui .navy { - color: #99b8e6; - } - - .swagger-ui .blue, - .swagger-ui .dark-blue, - .swagger-ui .hover-blue:focus, - .swagger-ui .hover-blue:hover, - .swagger-ui .hover-dark-blue:focus, - .swagger-ui .hover-dark-blue:hover { - color: #99bae6; - } - - .swagger-ui .hover-light-blue:focus, - .swagger-ui .hover-light-blue:hover, - .swagger-ui .light-blue { - color: #a9cbea; - } - - .swagger-ui .hover-lightest-blue:focus, - .swagger-ui .hover-lightest-blue:hover, - .swagger-ui .lightest-blue { - color: #d6e9f5; - } - - .swagger-ui .hover-washed-blue:focus, - .swagger-ui .hover-washed-blue:hover, - .swagger-ui .washed-blue { - color: #f7fdfc; - } - - .swagger-ui .hover-washed-green:focus, - .swagger-ui .hover-washed-green:hover, - .swagger-ui .washed-green { - color: #ebfaf4; - } - - .swagger-ui .hover-washed-yellow:focus, - .swagger-ui .hover-washed-yellow:hover, - .swagger-ui .washed-yellow { - color: #fbf9ef; - } - - .swagger-ui .hover-washed-red:focus, - .swagger-ui .hover-washed-red:hover, - .swagger-ui .washed-red { - color: #f9e7e7; - } - - .swagger-ui .color-inherit, - .swagger-ui .hover-inherit:focus, - .swagger-ui .hover-inherit:hover { - color: inherit; - } - - .swagger-ui .bg-black-90, - .swagger-ui .hover-bg-black-90:focus, - .swagger-ui .hover-bg-black-90:hover { - background-color: rgba(0, 0, 0, 0.9); - } - - .swagger-ui .bg-black-80, - .swagger-ui .hover-bg-black-80:focus, - .swagger-ui .hover-bg-black-80:hover { - background-color: rgba(0, 0, 0, 0.8); - } - - .swagger-ui .bg-black-70, - .swagger-ui .hover-bg-black-70:focus, - .swagger-ui .hover-bg-black-70:hover { - background-color: rgba(0, 0, 0, 0.7); - } - - .swagger-ui .bg-black-60, - .swagger-ui .hover-bg-black-60:focus, - .swagger-ui .hover-bg-black-60:hover { - background-color: rgba(0, 0, 0, 0.6); - } - - .swagger-ui .bg-black-50, - .swagger-ui .hover-bg-black-50:focus, - .swagger-ui .hover-bg-black-50:hover { - background-color: rgba(0, 0, 0, 0.5); - } - - .swagger-ui .bg-black-40, - .swagger-ui .hover-bg-black-40:focus, - .swagger-ui .hover-bg-black-40:hover { - background-color: rgba(0, 0, 0, 0.4); - } - - .swagger-ui .bg-black-30, - .swagger-ui .hover-bg-black-30:focus, - .swagger-ui .hover-bg-black-30:hover { - background-color: rgba(0, 0, 0, 0.3); - } - - .swagger-ui .bg-black-20, - .swagger-ui .hover-bg-black-20:focus, - .swagger-ui .hover-bg-black-20:hover { - background-color: rgba(0, 0, 0, 0.2); - } - - .swagger-ui .bg-white-90, - .swagger-ui .hover-bg-white-90:focus, - .swagger-ui .hover-bg-white-90:hover { - background-color: rgba(28, 28, 33, 0.9); - } - - .swagger-ui .bg-white-80, - .swagger-ui .hover-bg-white-80:focus, - .swagger-ui .hover-bg-white-80:hover { - background-color: rgba(28, 28, 33, 0.8); - } - - .swagger-ui .bg-white-70, - .swagger-ui .hover-bg-white-70:focus, - .swagger-ui .hover-bg-white-70:hover { - background-color: rgba(28, 28, 33, 0.7); - } - - .swagger-ui .bg-white-60, - .swagger-ui .hover-bg-white-60:focus, - .swagger-ui .hover-bg-white-60:hover { - background-color: rgba(28, 28, 33, 0.6); - } - - .swagger-ui .bg-white-50, - .swagger-ui .hover-bg-white-50:focus, - .swagger-ui .hover-bg-white-50:hover { - background-color: rgba(28, 28, 33, 0.5); - } - - .swagger-ui .bg-white-40, - .swagger-ui .hover-bg-white-40:focus, - .swagger-ui .hover-bg-white-40:hover { - background-color: rgba(28, 28, 33, 0.4); - } - - .swagger-ui .bg-white-30, - .swagger-ui .hover-bg-white-30:focus, - .swagger-ui .hover-bg-white-30:hover { - background-color: rgba(28, 28, 33, 0.3); - } - - .swagger-ui .bg-white-20, - .swagger-ui .hover-bg-white-20:focus, - .swagger-ui .hover-bg-white-20:hover { - background-color: rgba(28, 28, 33, 0.2); - } - - .swagger-ui .bg-black, - .swagger-ui .hover-bg-black:focus, - .swagger-ui .hover-bg-black:hover { - background-color: #000; - } - - .swagger-ui .bg-near-black, - .swagger-ui .hover-bg-near-black:focus, - .swagger-ui .hover-bg-near-black:hover { - background-color: #121212; - } - - .swagger-ui .bg-dark-gray, - .swagger-ui .hover-bg-dark-gray:focus, - .swagger-ui .hover-bg-dark-gray:hover { - background-color: #333; - } - - .swagger-ui .bg-mid-gray, - .swagger-ui .hover-bg-mid-gray:focus, - .swagger-ui .hover-bg-mid-gray:hover { - background-color: #545454; - } - - .swagger-ui .bg-gray, - .swagger-ui .hover-bg-gray:focus, - .swagger-ui .hover-bg-gray:hover { - background-color: #787878; - } - - .swagger-ui .bg-silver, - .swagger-ui .hover-bg-silver:focus, - .swagger-ui .hover-bg-silver:hover { - background-color: #999; - } - - .swagger-ui .bg-white, - .swagger-ui .hover-bg-white:focus, - .swagger-ui .hover-bg-white:hover { - background-color: #1c1c21; - } - - .swagger-ui .bg-transparent, - .swagger-ui .hover-bg-transparent:focus, - .swagger-ui .hover-bg-transparent:hover { - background-color: transparent; - } - - .swagger-ui .bg-dark-red, - .swagger-ui .hover-bg-dark-red:focus, - .swagger-ui .hover-bg-dark-red:hover { - background-color: #bc2f36; - } - - .swagger-ui .bg-red, - .swagger-ui .hover-bg-red:focus, - .swagger-ui .hover-bg-red:hover { - background-color: #c83932; - } - - .swagger-ui .bg-light-red, - .swagger-ui .hover-bg-light-red:focus, - .swagger-ui .hover-bg-light-red:hover { - background-color: #ab3c2b; - } - - .swagger-ui .bg-orange, - .swagger-ui .hover-bg-orange:focus, - .swagger-ui .hover-bg-orange:hover { - background-color: #cc6e33; - } - - .swagger-ui .bg-gold, - .swagger-ui .bg-light-yellow, - .swagger-ui .bg-washed-yellow, - .swagger-ui .bg-yellow, - .swagger-ui .hover-bg-gold:focus, - .swagger-ui .hover-bg-gold:hover, - .swagger-ui .hover-bg-light-yellow:focus, - .swagger-ui .hover-bg-light-yellow:hover, - .swagger-ui .hover-bg-washed-yellow:focus, - .swagger-ui .hover-bg-washed-yellow:hover, - .swagger-ui .hover-bg-yellow:focus, - .swagger-ui .hover-bg-yellow:hover { - background-color: #664b00; - } - - .swagger-ui .bg-purple, - .swagger-ui .hover-bg-purple:focus, - .swagger-ui .hover-bg-purple:hover { - background-color: #5e2ca5; - } - - .swagger-ui .bg-light-purple, - .swagger-ui .hover-bg-light-purple:focus, - .swagger-ui .hover-bg-light-purple:hover { - background-color: #672caf; - } - - .swagger-ui .bg-dark-pink, - .swagger-ui .hover-bg-dark-pink:focus, - .swagger-ui .hover-bg-dark-pink:hover { - background-color: #ab2b81; - } - - .swagger-ui .bg-hot-pink, - .swagger-ui .hover-bg-hot-pink:focus, - .swagger-ui .hover-bg-hot-pink:hover { - background-color: #c03086; - } - - .swagger-ui .bg-pink, - .swagger-ui .hover-bg-pink:focus, - .swagger-ui .hover-bg-pink:hover { - background-color: #8f2464; - } - - .swagger-ui .bg-light-pink, - .swagger-ui .hover-bg-light-pink:focus, - .swagger-ui .hover-bg-light-pink:hover { - background-color: #721d4d; - } - - .swagger-ui .bg-dark-green, - .swagger-ui .hover-bg-dark-green:focus, - .swagger-ui .hover-bg-dark-green:hover { - background-color: #1c6e50; - } - - .swagger-ui .bg-green, - .swagger-ui .hover-bg-green:focus, - .swagger-ui .hover-bg-green:hover { - background-color: #279b70; - } - - .swagger-ui .bg-light-green, - .swagger-ui .hover-bg-light-green:focus, - .swagger-ui .hover-bg-light-green:hover { - background-color: #228762; - } - - .swagger-ui .bg-navy, - .swagger-ui .hover-bg-navy:focus, - .swagger-ui .hover-bg-navy:hover { - background-color: #0d1d35; - } - - .swagger-ui .bg-dark-blue, - .swagger-ui .hover-bg-dark-blue:focus, - .swagger-ui .hover-bg-dark-blue:hover { - background-color: #20497e; - } - - .swagger-ui .bg-blue, - .swagger-ui .hover-bg-blue:focus, - .swagger-ui .hover-bg-blue:hover { - background-color: #4380d0; - } - - .swagger-ui .bg-light-blue, - .swagger-ui .hover-bg-light-blue:focus, - .swagger-ui .hover-bg-light-blue:hover { - background-color: #20517e; - } - - .swagger-ui .bg-lightest-blue, - .swagger-ui .hover-bg-lightest-blue:focus, - .swagger-ui .hover-bg-lightest-blue:hover { - background-color: #143a52; - } - - .swagger-ui .bg-washed-blue, - .swagger-ui .hover-bg-washed-blue:focus, - .swagger-ui .hover-bg-washed-blue:hover { - background-color: #0c312d; - } - - .swagger-ui .bg-washed-green, - .swagger-ui .hover-bg-washed-green:focus, - .swagger-ui .hover-bg-washed-green:hover { - background-color: #0f3d2c; - } - - .swagger-ui .bg-washed-red, - .swagger-ui .hover-bg-washed-red:focus, - .swagger-ui .hover-bg-washed-red:hover { - background-color: #411010; - } - - .swagger-ui .bg-inherit, - .swagger-ui .hover-bg-inherit:focus, - .swagger-ui .hover-bg-inherit:hover { - background-color: inherit; - } - - .swagger-ui .shadow-hover { - transition: all 0.5s cubic-bezier(0.165, 0.84, 0.44, 1) 0s; - } - - .swagger-ui .shadow-hover::after { - border-radius: inherit; - box-shadow: rgba(0, 0, 0, 0.2) 0 0 16px 2px; - content: ""; - height: 100%; - left: 0; - opacity: 0; - position: absolute; - top: 0; - transition: opacity 0.5s cubic-bezier(0.165, 0.84, 0.44, 1) 0s; - width: 100%; - z-index: -1; - } - - .swagger-ui .bg-animate, - .swagger-ui .bg-animate:focus, - .swagger-ui .bg-animate:hover { - transition: background-color 0.15s ease-in-out 0s; - } - - .swagger-ui .nested-links a { - color: #99bae6; - transition: color 0.15s ease-in 0s; - } - - .swagger-ui .nested-links a:focus, - .swagger-ui .nested-links a:hover { - color: #a9cbea; - transition: color 0.15s ease-in 0s; - } - - .swagger-ui .opblock-tag { - border-bottom: 1px solid rgba(58, 64, 80, 0.3); - color: #b5bac9; - transition: all 0.2s ease 0s; - } - - .swagger-ui .opblock-tag svg, - .swagger-ui section.models h4 svg { - transition: all 0.4s ease 0s; - } - - .swagger-ui .opblock { - border: 1px solid #000; - border-radius: 4px; - box-shadow: rgba(0, 0, 0, 0.19) 0 0 3px; - margin: 0 0 15px; - } - - .swagger-ui .opblock .tab-header .tab-item.active h4 span::after { - background: gray; - } - - .swagger-ui .opblock.is-open .opblock-summary { - border-bottom: 1px solid #000; - } - - .swagger-ui .opblock .opblock-section-header { - background: rgba(28, 28, 33, 0.8); - box-shadow: rgba(0, 0, 0, 0.1) 0 1px 2px; - } - - .swagger-ui .opblock .opblock-section-header > label > span { - padding: 0 10px 0 0; - } - - .swagger-ui .opblock .opblock-summary-method { - background: #000; - color: #fff; - text-shadow: rgba(0, 0, 0, 0.1) 0 1px 0; - } - - .swagger-ui .opblock.opblock-post { - background: rgba(72, 203, 144, 0.1); - border-color: #48cb90; - } - - .swagger-ui .opblock.opblock-post .opblock-summary-method, - .swagger-ui .opblock.opblock-post .tab-header .tab-item.active h4 span::after { - background: #48cb90; - } - - .swagger-ui .opblock.opblock-post .opblock-summary { - border-color: #48cb90; - } - - .swagger-ui .opblock.opblock-put { - background: rgba(213, 157, 88, 0.1); - border-color: #d59d58; - } - - .swagger-ui .opblock.opblock-put .opblock-summary-method, - .swagger-ui .opblock.opblock-put .tab-header .tab-item.active h4 span::after { - background: #d59d58; - } - - .swagger-ui .opblock.opblock-put .opblock-summary { - border-color: #d59d58; - } - - .swagger-ui .opblock.opblock-delete { - background: rgba(200, 50, 50, 0.1); - border-color: #c83232; - } - - .swagger-ui .opblock.opblock-delete .opblock-summary-method, - .swagger-ui .opblock.opblock-delete .tab-header .tab-item.active h4 span::after { - background: #c83232; - } - - .swagger-ui .opblock.opblock-delete .opblock-summary { - border-color: #c83232; - } - - .swagger-ui .opblock.opblock-get { - background: rgba(42, 105, 167, 0.1); - border-color: #2a69a7; - } - - .swagger-ui .opblock.opblock-get .opblock-summary-method, - .swagger-ui .opblock.opblock-get .tab-header .tab-item.active h4 span::after { - background: #2a69a7; - } - - .swagger-ui .opblock.opblock-get .opblock-summary { - border-color: #2a69a7; - } - - .swagger-ui .opblock.opblock-patch { - background: rgba(92, 214, 188, 0.1); - border-color: #5cd6bc; - } - - .swagger-ui .opblock.opblock-patch .opblock-summary-method, - .swagger-ui .opblock.opblock-patch .tab-header .tab-item.active h4 span::after { - background: #5cd6bc; - } - - .swagger-ui .opblock.opblock-patch .opblock-summary { - border-color: #5cd6bc; - } - - .swagger-ui .opblock.opblock-head { - background: rgba(140, 63, 207, 0.1); - border-color: #8c3fcf; - } - - .swagger-ui .opblock.opblock-head .opblock-summary-method, - .swagger-ui .opblock.opblock-head .tab-header .tab-item.active h4 span::after { - background: #8c3fcf; - } - - .swagger-ui .opblock.opblock-head .opblock-summary { - border-color: #8c3fcf; - } - - .swagger-ui .opblock.opblock-options { - background: rgba(36, 89, 143, 0.1); - border-color: #24598f; - } - - .swagger-ui .opblock.opblock-options .opblock-summary-method, - .swagger-ui .opblock.opblock-options .tab-header .tab-item.active h4 span::after { - background: #24598f; - } - - .swagger-ui .opblock.opblock-options .opblock-summary { - border-color: #24598f; - } - - .swagger-ui .opblock.opblock-deprecated { - background: rgba(46, 46, 46, 0.1); - border-color: #2e2e2e; - opacity: 0.6; - } - - .swagger-ui .opblock.opblock-deprecated .opblock-summary-method, - .swagger-ui .opblock.opblock-deprecated .tab-header .tab-item.active h4 span::after { - background: #2e2e2e; - } - - .swagger-ui .opblock.opblock-deprecated .opblock-summary { - border-color: #2e2e2e; - } - - .swagger-ui .filter .operation-filter-input { - border: 2px solid #2b3446; - } - - .swagger-ui .tab li:first-of-type::after { - background: rgba(0, 0, 0, 0.2); - } - - .swagger-ui .download-contents { - background: #7c8192; - color: #fff; - } - - .swagger-ui .scheme-container { - background: #1c1c21; - box-shadow: rgba(0, 0, 0, 0.15) 0 1px 2px 0; - } - - .swagger-ui .loading-container .loading::before { - animation: - 1s linear 0s infinite normal none running rotation, - 0.5s ease 0s 1 normal none running opacity; - border-color: rgba(0, 0, 0, 0.6) rgba(84, 84, 84, 0.1) rgba(84, 84, 84, 0.1); - } - - .swagger-ui .response-control-media-type--accept-controller select { - border-color: #196619; - } - - .swagger-ui .response-control-media-type__accept-message { - color: #99e699; - } - - .swagger-ui .version-pragma__message code { - background-color: #3b3b3b; - } - - .swagger-ui .btn { - background: 0 0; - border: 2px solid gray; - box-shadow: rgba(0, 0, 0, 0.1) 0 1px 2px; - color: #b5bac9; - } - - .swagger-ui .btn:hover { - box-shadow: rgba(0, 0, 0, 0.3) 0 0 5px; - } - - .swagger-ui .btn.authorize, - .swagger-ui .btn.cancel { - background-color: transparent; - border-color: #a72a2a; - color: #e69999; - } - - .swagger-ui .btn.cancel:hover { - background-color: #a72a2a; - color: #fff; - } - - .swagger-ui .btn.authorize { - border-color: #48cb90; - color: #9ce3c3; - } - - .swagger-ui .btn.authorize svg { - fill: #9ce3c3; - } - - .btn.authorize.unlocked:hover { - background-color: #48cb90; - color: #fff; - } - - .btn.authorize.unlocked:hover svg { - fill: #fbfbfb; - } - - .swagger-ui .btn.execute { - background-color: #5892d5; - border-color: #5892d5; - color: #fff; - } - - .swagger-ui .copy-to-clipboard { - background: #7c8192; - } - - .swagger-ui .copy-to-clipboard button { - background: url('data:image/svg+xml;charset=utf-8,') - 50% center no-repeat; - } - - .swagger-ui select { - background: url('data:image/svg+xml;charset=utf-8,') - right 10px center/20px no-repeat #212121; - background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMS4wICg0MDM1YTRmYjQ5LCAyMDIwLTA1LTAxKSIKICAgc29kaXBvZGk6ZG9jbmFtZT0iZG93bmxvYWQuc3ZnIgogICBpZD0ic3ZnNCIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMjAgMjAiPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTEwIj4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzOCIgLz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnNCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIGlua3NjYXBlOndpbmRvdy15PSItOSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTkiCiAgICAgaW5rc2NhcGU6Y3k9IjEwIgogICAgIGlua3NjYXBlOmN4PSIxMCIKICAgICBpbmtzY2FwZTp6b29tPSI0MS41IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpZD0ibmFtZWR2aWV3NiIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDAxIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMCIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIiAvPgogIDxwYXRoCiAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZiIKICAgICBpZD0icGF0aDIiCiAgICAgZD0iTTEzLjQxOCA3Ljg1OWEuNjk1LjY5NSAwIDAxLjk3OCAwIC42OC42OCAwIDAxMCAuOTY5bC0zLjkwOCAzLjgzYS42OTcuNjk3IDAgMDEtLjk3OSAwbC0zLjkwOC0zLjgzYS42OC42OCAwIDAxMC0uOTY5LjY5NS42OTUgMCAwMS45NzggMEwxMCAxMWwzLjQxOC0zLjE0MXoiIC8+Cjwvc3ZnPgo=) - right 10px center/20px no-repeat #1c1c21; - border: 2px solid #41444e; - } - - .swagger-ui select[multiple] { - background: #212121; - } - - .swagger-ui button.invalid, - .swagger-ui input[type="email"].invalid, - .swagger-ui input[type="file"].invalid, - .swagger-ui input[type="password"].invalid, - .swagger-ui input[type="search"].invalid, - .swagger-ui input[type="text"].invalid, - .swagger-ui select.invalid, - .swagger-ui textarea.invalid { - background: #390e0e; - border-color: #c83232; - } - - .swagger-ui input[type="email"], - .swagger-ui input[type="file"], - .swagger-ui input[type="password"], - .swagger-ui input[type="search"], - .swagger-ui input[type="text"], - .swagger-ui textarea { - background: #1c1c21; - border: 1px solid #404040; - } - - .swagger-ui textarea { - background: rgba(28, 28, 33, 0.8); - color: #b5bac9; - } - - .swagger-ui input[disabled], - .swagger-ui select[disabled] { - background-color: #1f1f1f; - color: #bfbfbf; - } - - .swagger-ui textarea[disabled] { - background-color: #41444e; - color: #fff; - } - - .swagger-ui select[disabled] { - border-color: #878787; - } - - .swagger-ui textarea:focus { - border: 2px solid #2a69a7; - } - - .swagger-ui .checkbox input[type="checkbox"] + label > .item { - background: #303030; - box-shadow: #303030 0 0 0 2px; - } - - .swagger-ui .checkbox input[type="checkbox"]:checked + label > .item { - background: url('data:image/svg+xml;charset=utf-8,') - 50% center no-repeat #303030; - } - - .swagger-ui .dialog-ux .backdrop-ux { - background: rgba(0, 0, 0, 0.8); - } - - .swagger-ui .dialog-ux .modal-ux { - background: #1c1c21; - border: 1px solid #2e2e2e; - box-shadow: rgba(0, 0, 0, 0.2) 0 10px 30px 0; - } - - .swagger-ui .dialog-ux .modal-ux-header .close-modal { - background: 0 0; - } - - .swagger-ui .model .deprecated span, - .swagger-ui .model .deprecated td { - color: #bfbfbf !important; - } - - .swagger-ui .model-toggle::after { - background: url('data:image/svg+xml;charset=utf-8,') - 50% center/100% no-repeat; - } - - .swagger-ui .model-hint { - background: rgba(0, 0, 0, 0.7); - color: #ebebeb; - } - - .swagger-ui section.models { - border: 1px solid rgba(58, 64, 80, 0.3); - } - - .swagger-ui section.models.is-open h4 { - border-bottom: 1px solid rgba(58, 64, 80, 0.3); - } - - .swagger-ui section.models .model-container { - background: rgba(0, 0, 0, 0.05); - } - - .swagger-ui section.models .model-container:hover { - background: rgba(0, 0, 0, 0.07); - } - - .swagger-ui .model-box { - background: rgba(0, 0, 0, 0.1); - } - - .swagger-ui .prop-type { - color: #aaaad4; - } - - .swagger-ui table thead tr td, - .swagger-ui table thead tr th { - border-bottom: 1px solid rgba(58, 64, 80, 0.2); - color: #b5bac9; - } - - .swagger-ui .parameter__name.required::after { - color: rgba(230, 153, 153, 0.6); - } - - .swagger-ui .topbar .download-url-wrapper .select-label { - color: #f0f0f0; - } - - .swagger-ui .topbar .download-url-wrapper .download-url-button { - background: #63a040; - color: #fff; - } - - .swagger-ui .info .title small { - background: #7c8492; - } - - .swagger-ui .info .title small.version-stamp { - background-color: #7a9b27; - } - - .swagger-ui .auth-container .errors { - background-color: #350d0d; - color: #b5bac9; - } - - .swagger-ui .errors-wrapper { - background: rgba(200, 50, 50, 0.1); - border: 2px solid #c83232; - } - - .swagger-ui .markdown code, - .swagger-ui .renderedmarkdown code { - background: rgba(0, 0, 0, 0.05); - color: #c299e6; - } - - .swagger-ui .model-toggle:after { - background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMS4wICg0MDM1YTRmYjQ5LCAyMDIwLTA1LTAxKSIKICAgc29kaXBvZGk6ZG9jbmFtZT0iZG93bmxvYWQyLnN2ZyIKICAgaWQ9InN2ZzQiCiAgIHZlcnNpb249IjEuMSIKICAgaGVpZ2h0PSIyNCIKICAgd2lkdGg9IjI0Ij4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGExMCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGRlZnMKICAgICBpZD0iZGVmczgiIC8+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzQiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iLTkiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii05IgogICAgIGlua3NjYXBlOmN5PSIxMiIKICAgICBpbmtzY2FwZTpjeD0iMTIiCiAgICAgaW5rc2NhcGU6em9vbT0iMzQuNTgzMzMzIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpZD0ibmFtZWR2aWV3NiIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDAxIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMCIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIiAvPgogIDxwYXRoCiAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZiIKICAgICBpZD0icGF0aDIiCiAgICAgZD0iTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02eiIgLz4KPC9zdmc+Cg==) - 50% no-repeat; - } - - /* arrows for each operation and request are now white */ - .arrow, - #large-arrow-up { - fill: #fff; - } - - #unlocked { - fill: #fff; - } - - ::-webkit-scrollbar-track { - background-color: #646464 !important; - } - - ::-webkit-scrollbar-thumb { - background-color: #242424 !important; - border: 2px solid #3e4346 !important; - } - - ::-webkit-scrollbar-button:vertical:start:decrement { - background: - linear-gradient(130deg, #696969 40%, rgba(255, 0, 0, 0) 41%), - linear-gradient(230deg, #696969 40%, transparent 41%), linear-gradient(0deg, #696969 40%, transparent 31%); - background-color: #b6b6b6; - } - - ::-webkit-scrollbar-button:vertical:end:increment { - background: - linear-gradient(310deg, #696969 40%, transparent 41%), linear-gradient(50deg, #696969 40%, transparent 41%), - linear-gradient(180deg, #696969 40%, transparent 31%); - background-color: #b6b6b6; - } - - ::-webkit-scrollbar-button:horizontal:end:increment { - background: - linear-gradient(210deg, #696969 40%, transparent 41%), linear-gradient(330deg, #696969 40%, transparent 41%), - linear-gradient(90deg, #696969 30%, transparent 31%); - background-color: #b6b6b6; - } - - ::-webkit-scrollbar-button:horizontal:start:decrement { - background: - linear-gradient(30deg, #696969 40%, transparent 41%), linear-gradient(150deg, #696969 40%, transparent 41%), - linear-gradient(270deg, #696969 30%, transparent 31%); - background-color: #b6b6b6; - } - - ::-webkit-scrollbar-button, - ::-webkit-scrollbar-track-piece { - background-color: #3e4346 !important; - } - - .swagger-ui .black, - .swagger-ui .checkbox, - .swagger-ui .dark-gray, - .swagger-ui .download-url-wrapper .loading, - .swagger-ui .errors-wrapper .errors small, - .swagger-ui .fallback, - .swagger-ui .filter .loading, - .swagger-ui .gray, - .swagger-ui .hover-black:focus, - .swagger-ui .hover-black:hover, - .swagger-ui .hover-dark-gray:focus, - .swagger-ui .hover-dark-gray:hover, - .swagger-ui .hover-gray:focus, - .swagger-ui .hover-gray:hover, - .swagger-ui .hover-light-silver:focus, - .swagger-ui .hover-light-silver:hover, - .swagger-ui .hover-mid-gray:focus, - .swagger-ui .hover-mid-gray:hover, - .swagger-ui .hover-near-black:focus, - .swagger-ui .hover-near-black:hover, - .swagger-ui .hover-silver:focus, - .swagger-ui .hover-silver:hover, - .swagger-ui .light-silver, - .swagger-ui .markdown pre, - .swagger-ui .mid-gray, - .swagger-ui .model .property, - .swagger-ui .model .property.primitive, - .swagger-ui .model-title, - .swagger-ui .near-black, - .swagger-ui .parameter__extension, - .swagger-ui .parameter__in, - .swagger-ui .prop-format, - .swagger-ui .renderedmarkdown pre, - .swagger-ui .response-col_links .response-undocumented, - .swagger-ui .response-col_status .response-undocumented, - .swagger-ui .silver, - .swagger-ui section.models h4, - .swagger-ui section.models h5, - .swagger-ui span.token-not-formatted, - .swagger-ui span.token-string, - .swagger-ui table.headers .header-example, - .swagger-ui table.model tr.description, - .swagger-ui table.model tr.extension { - color: #bfbfbf; - } - - .swagger-ui .hover-white:focus, - .swagger-ui .hover-white:hover, - .swagger-ui .info .title small pre, - .swagger-ui .topbar a, - .swagger-ui .white { - color: #fff; - } - - .swagger-ui .bg-black-10, - .swagger-ui .hover-bg-black-10:focus, - .swagger-ui .hover-bg-black-10:hover, - .swagger-ui .stripe-dark:nth-child(2n + 1) { - background-color: rgba(0, 0, 0, 0.1); - } - - .swagger-ui .bg-white-10, - .swagger-ui .hover-bg-white-10:focus, - .swagger-ui .hover-bg-white-10:hover, - .swagger-ui .stripe-light:nth-child(2n + 1) { - background-color: rgba(28, 28, 33, 0.1); - } - - .swagger-ui .bg-light-silver, - .swagger-ui .hover-bg-light-silver:focus, - .swagger-ui .hover-bg-light-silver:hover, - .swagger-ui .striped--light-silver:nth-child(2n + 1) { - background-color: #6e6e6e; - } - - .swagger-ui .bg-moon-gray, - .swagger-ui .hover-bg-moon-gray:focus, - .swagger-ui .hover-bg-moon-gray:hover, - .swagger-ui .striped--moon-gray:nth-child(2n + 1) { - background-color: #4d4d4d; - } - - .swagger-ui .bg-light-gray, - .swagger-ui .hover-bg-light-gray:focus, - .swagger-ui .hover-bg-light-gray:hover, - .swagger-ui .striped--light-gray:nth-child(2n + 1) { - background-color: #2b2b2b; - } - - .swagger-ui .bg-near-white, - .swagger-ui .hover-bg-near-white:focus, - .swagger-ui .hover-bg-near-white:hover, - .swagger-ui .striped--near-white:nth-child(2n + 1) { - background-color: #242424; - } - - .swagger-ui .opblock-tag:hover, - .swagger-ui section.models h4:hover { - background: rgba(0, 0, 0, 0.02); - } - - .swagger-ui .checkbox p, - .swagger-ui .dialog-ux .modal-ux-content h4, - .swagger-ui .dialog-ux .modal-ux-content p, - .swagger-ui .dialog-ux .modal-ux-header h3, - .swagger-ui .errors-wrapper .errors h4, - .swagger-ui .errors-wrapper hgroup h4, - .swagger-ui .info .base-url, - .swagger-ui .info .title, - .swagger-ui .info h1, - .swagger-ui .info h2, - .swagger-ui .info h3, - .swagger-ui .info h4, - .swagger-ui .info h5, - .swagger-ui .info li, - .swagger-ui .info p, - .swagger-ui .info table, - .swagger-ui .loading-container .loading::after, - .swagger-ui .model, - .swagger-ui .opblock .opblock-section-header h4, - .swagger-ui .opblock .opblock-section-header > label, - .swagger-ui .opblock .opblock-summary-description, - .swagger-ui .opblock .opblock-summary-operation-id, - .swagger-ui .opblock .opblock-summary-path, - .swagger-ui .opblock .opblock-summary-path__deprecated, - .swagger-ui .opblock-description-wrapper, - .swagger-ui .opblock-description-wrapper h4, - .swagger-ui .opblock-description-wrapper p, - .swagger-ui .opblock-external-docs-wrapper, - .swagger-ui .opblock-external-docs-wrapper h4, - .swagger-ui .opblock-external-docs-wrapper p, - .swagger-ui .opblock-tag small, - .swagger-ui .opblock-title_normal, - .swagger-ui .opblock-title_normal h4, - .swagger-ui .opblock-title_normal p, - .swagger-ui .parameter__name, - .swagger-ui .parameter__type, - .swagger-ui .response-col_links, - .swagger-ui .response-col_status, - .swagger-ui .responses-inner h4, - .swagger-ui .responses-inner h5, - .swagger-ui .scheme-container .schemes > label, - .swagger-ui .scopes h2, - .swagger-ui .servers > label, - .swagger-ui .tab li, - .swagger-ui label, - .swagger-ui select, - .swagger-ui table.headers td { - color: #b5bac9; - } - - .swagger-ui .download-url-wrapper .failed, - .swagger-ui .filter .failed, - .swagger-ui .model-deprecated-warning, - .swagger-ui .parameter__deprecated, - .swagger-ui .parameter__name.required span, - .swagger-ui table.model tr.property-row .star { - color: #e69999; - } - - .swagger-ui .opblock-body pre.microlight, - .swagger-ui textarea.curl { - background: #41444e; - border-radius: 4px; - color: #fff; - } - - .swagger-ui .expand-methods svg, - .swagger-ui .expand-methods:hover svg { - fill: #bfbfbf; - } - - .swagger-ui .auth-container, - .swagger-ui .dialog-ux .modal-ux-header { - border-bottom: 1px solid #2e2e2e; - } - - .swagger-ui .topbar .download-url-wrapper .select-label select, - .swagger-ui .topbar .download-url-wrapper input[type="text"] { - border: 2px solid #63a040; - } - - .swagger-ui .info a, - .swagger-ui .info a:hover, - .swagger-ui .scopes h2 a { - color: #99bde6; - } - - /* Dark Scrollbar */ - ::-webkit-scrollbar { - width: 14px; - height: 14px; - } - - ::-webkit-scrollbar-button { - background-color: #3e4346 !important; - } - - ::-webkit-scrollbar-track { - background-color: #646464 !important; - } - - ::-webkit-scrollbar-track-piece { - background-color: #3e4346 !important; - } - - ::-webkit-scrollbar-thumb { - height: 50px; - background-color: #242424 !important; - border: 2px solid #3e4346 !important; - } - - ::-webkit-scrollbar-corner { - } - - ::-webkit-resizer { - } - - ::-webkit-scrollbar-button:vertical:start:decrement { - background: - linear-gradient(130deg, #696969 40%, rgba(255, 0, 0, 0) 41%), - linear-gradient(230deg, #696969 40%, rgba(0, 0, 0, 0) 41%), - linear-gradient(0deg, #696969 40%, rgba(0, 0, 0, 0) 31%); - background-color: #b6b6b6; - } - - ::-webkit-scrollbar-button:vertical:end:increment { - background: - linear-gradient(310deg, #696969 40%, rgba(0, 0, 0, 0) 41%), - linear-gradient(50deg, #696969 40%, rgba(0, 0, 0, 0) 41%), - linear-gradient(180deg, #696969 40%, rgba(0, 0, 0, 0) 31%); - background-color: #b6b6b6; - } - - ::-webkit-scrollbar-button:horizontal:end:increment { - background: - linear-gradient(210deg, #696969 40%, rgba(0, 0, 0, 0) 41%), - linear-gradient(330deg, #696969 40%, rgba(0, 0, 0, 0) 41%), - linear-gradient(90deg, #696969 30%, rgba(0, 0, 0, 0) 31%); - background-color: #b6b6b6; - } - - ::-webkit-scrollbar-button:horizontal:start:decrement { - background: - linear-gradient(30deg, #696969 40%, rgba(0, 0, 0, 0) 41%), - linear-gradient(150deg, #696969 40%, rgba(0, 0, 0, 0) 41%), - linear-gradient(270deg, #696969 30%, rgba(0, 0, 0, 0) 31%); - background-color: #b6b6b6; - } - } -} diff --git a/apps/nextjs/src/app/[locale]/manage/tools/api/swagger-ui-overrides.css b/apps/nextjs/src/app/[locale]/manage/tools/api/swagger-ui-overrides.css deleted file mode 100644 index 74a997407..000000000 --- a/apps/nextjs/src/app/[locale]/manage/tools/api/swagger-ui-overrides.css +++ /dev/null @@ -1,4 +0,0 @@ -.swagger-ui .info { - margin: 0 !important; - margin-bottom: 20px !important; -} diff --git a/apps/nextjs/src/app/[locale]/manage/tools/api/swagger-ui.css b/apps/nextjs/src/app/[locale]/manage/tools/api/swagger-ui.css deleted file mode 100644 index e02e30307..000000000 --- a/apps/nextjs/src/app/[locale]/manage/tools/api/swagger-ui.css +++ /dev/null @@ -1,9293 +0,0 @@ -.swagger-ui { - color: #3b4151; - font-family: sans-serif; /*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */ -} -.swagger-ui html { - line-height: 1.15; - -ms-text-size-adjust: 100%; - -webkit-text-size-adjust: 100%; -} -.swagger-ui body { - margin: 0; -} -.swagger-ui article, -.swagger-ui aside, -.swagger-ui footer, -.swagger-ui header, -.swagger-ui nav, -.swagger-ui section { - display: block; -} -.swagger-ui h1 { - font-size: 2em; - margin: 0.67em 0; -} -.swagger-ui figcaption, -.swagger-ui figure, -.swagger-ui main { - display: block; -} -.swagger-ui figure { - margin: 1em 40px; -} -.swagger-ui hr { - box-sizing: content-box; - height: 0; - overflow: visible; -} -.swagger-ui pre { - font-family: monospace, monospace; - font-size: 1em; -} -.swagger-ui a { - background-color: transparent; - -webkit-text-decoration-skip: objects; -} -.swagger-ui abbr[title] { - border-bottom: none; - text-decoration: underline; - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; -} -.swagger-ui b, -.swagger-ui strong { - font-weight: inherit; - font-weight: bolder; -} -.swagger-ui code, -.swagger-ui kbd, -.swagger-ui samp { - font-family: monospace, monospace; - font-size: 1em; -} -.swagger-ui dfn { - font-style: italic; -} -.swagger-ui mark { - background-color: #ff0; - color: #000; -} -.swagger-ui small { - font-size: 80%; -} -.swagger-ui sub, -.swagger-ui sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} -.swagger-ui sub { - bottom: -0.25em; -} -.swagger-ui sup { - top: -0.5em; -} -.swagger-ui audio, -.swagger-ui video { - display: inline-block; -} -.swagger-ui audio:not([controls]) { - display: none; - height: 0; -} -.swagger-ui img { - border-style: none; -} -.swagger-ui svg:not(:root) { - overflow: hidden; -} -.swagger-ui button, -.swagger-ui input, -.swagger-ui optgroup, -.swagger-ui select, -.swagger-ui textarea { - font-family: sans-serif; - font-size: 100%; - line-height: 1.15; - margin: 0; -} -.swagger-ui button, -.swagger-ui input { - overflow: visible; -} -.swagger-ui button, -.swagger-ui select { - text-transform: none; -} -.swagger-ui [type="reset"], -.swagger-ui [type="submit"], -.swagger-ui button, -.swagger-ui html [type="button"] { - -webkit-appearance: button; -} -.swagger-ui [type="button"]::-moz-focus-inner, -.swagger-ui [type="reset"]::-moz-focus-inner, -.swagger-ui [type="submit"]::-moz-focus-inner, -.swagger-ui button::-moz-focus-inner { - border-style: none; - padding: 0; -} -.swagger-ui [type="button"]:-moz-focusring, -.swagger-ui [type="reset"]:-moz-focusring, -.swagger-ui [type="submit"]:-moz-focusring, -.swagger-ui button:-moz-focusring { - outline: 1px dotted ButtonText; -} -.swagger-ui fieldset { - padding: 0.35em 0.75em 0.625em; -} -.swagger-ui legend { - box-sizing: border-box; - color: inherit; - display: table; - max-width: 100%; - padding: 0; - white-space: normal; -} -.swagger-ui progress { - display: inline-block; - vertical-align: baseline; -} -.swagger-ui textarea { - overflow: auto; -} -.swagger-ui [type="checkbox"], -.swagger-ui [type="radio"] { - box-sizing: border-box; - padding: 0; -} -.swagger-ui [type="number"]::-webkit-inner-spin-button, -.swagger-ui [type="number"]::-webkit-outer-spin-button { - height: auto; -} -.swagger-ui [type="search"] { - -webkit-appearance: textfield; - outline-offset: -2px; -} -.swagger-ui [type="search"]::-webkit-search-cancel-button, -.swagger-ui [type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} -.swagger-ui ::-webkit-file-upload-button { - -webkit-appearance: button; - font: inherit; -} -.swagger-ui details, -.swagger-ui menu { - display: block; -} -.swagger-ui summary { - display: list-item; -} -.swagger-ui canvas { - display: inline-block; -} -.swagger-ui [hidden], -.swagger-ui template { - display: none; -} -.swagger-ui .debug * { - outline: 1px solid gold; -} -.swagger-ui .debug-white * { - outline: 1px solid #fff; -} -.swagger-ui .debug-black * { - outline: 1px solid #000; -} -.swagger-ui .debug-grid { - background: transparent - url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTRDOTY4N0U2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTRDOTY4N0Q2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3NjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3NzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsBS+GMAAAAjSURBVHjaYvz//z8DLsD4gcGXiYEAGBIKGBne//fFpwAgwAB98AaF2pjlUQAAAABJRU5ErkJggg==) - repeat 0 0; -} -.swagger-ui .debug-grid-16 { - background: transparent - url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODYyRjhERDU2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODYyRjhERDQ2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QTY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3QjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvCS01IAAABMSURBVHjaYmR4/5+BFPBfAMFm/MBgx8RAGWCn1AAmSg34Q6kBDKMGMDCwICeMIemF/5QawEipAWwUhwEjMDvbAWlWkvVBwu8vQIABAEwBCph8U6c0AAAAAElFTkSuQmCC) - repeat 0 0; -} -.swagger-ui .debug-grid-8-solid { - background: #fff - url(data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAAAAD/4QMxaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzExMSA3OS4xNTgzMjUsIDIwMTUvMDkvMTAtMDE6MTA6MjAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkIxMjI0OTczNjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIxMjI0OTc0NjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjEyMjQ5NzE2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjEyMjQ5NzI2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAbGhopHSlBJiZBQi8vL0JHPz4+P0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHAR0pKTQmND8oKD9HPzU/R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0f/wAARCAAIAAgDASIAAhEBAxEB/8QAWQABAQAAAAAAAAAAAAAAAAAAAAYBAQEAAAAAAAAAAAAAAAAAAAIEEAEBAAMBAAAAAAAAAAAAAAABADECA0ERAAEDBQAAAAAAAAAAAAAAAAARITFBUWESIv/aAAwDAQACEQMRAD8AoOnTV1QTD7JJshP3vSM3P//Z) - repeat 0 0; -} -.swagger-ui .debug-grid-16-solid { - background: #fff - url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzY3MkJEN0U2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzY3MkJEN0Y2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3RDY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pve6J3kAAAAzSURBVHjaYvz//z8D0UDsMwMjSRoYP5Gq4SPNbRjVMEQ1fCRDg+in/6+J1AJUxsgAEGAA31BAJMS0GYEAAAAASUVORK5CYII=) - repeat 0 0; -} -.swagger-ui .border-box, -.swagger-ui a, -.swagger-ui article, -.swagger-ui body, -.swagger-ui code, -.swagger-ui dd, -.swagger-ui div, -.swagger-ui dl, -.swagger-ui dt, -.swagger-ui fieldset, -.swagger-ui footer, -.swagger-ui form, -.swagger-ui h1, -.swagger-ui h2, -.swagger-ui h3, -.swagger-ui h4, -.swagger-ui h5, -.swagger-ui h6, -.swagger-ui header, -.swagger-ui html, -.swagger-ui input[type="email"], -.swagger-ui input[type="number"], -.swagger-ui input[type="password"], -.swagger-ui input[type="tel"], -.swagger-ui input[type="text"], -.swagger-ui input[type="url"], -.swagger-ui legend, -.swagger-ui li, -.swagger-ui main, -.swagger-ui ol, -.swagger-ui p, -.swagger-ui pre, -.swagger-ui section, -.swagger-ui table, -.swagger-ui td, -.swagger-ui textarea, -.swagger-ui th, -.swagger-ui tr, -.swagger-ui ul { - box-sizing: border-box; -} -.swagger-ui .aspect-ratio { - height: 0; - position: relative; -} -.swagger-ui .aspect-ratio--16x9 { - padding-bottom: 56.25%; -} -.swagger-ui .aspect-ratio--9x16 { - padding-bottom: 177.77%; -} -.swagger-ui .aspect-ratio--4x3 { - padding-bottom: 75%; -} -.swagger-ui .aspect-ratio--3x4 { - padding-bottom: 133.33%; -} -.swagger-ui .aspect-ratio--6x4 { - padding-bottom: 66.6%; -} -.swagger-ui .aspect-ratio--4x6 { - padding-bottom: 150%; -} -.swagger-ui .aspect-ratio--8x5 { - padding-bottom: 62.5%; -} -.swagger-ui .aspect-ratio--5x8 { - padding-bottom: 160%; -} -.swagger-ui .aspect-ratio--7x5 { - padding-bottom: 71.42%; -} -.swagger-ui .aspect-ratio--5x7 { - padding-bottom: 140%; -} -.swagger-ui .aspect-ratio--1x1 { - padding-bottom: 100%; -} -.swagger-ui .aspect-ratio--object { - bottom: 0; - height: 100%; - left: 0; - position: absolute; - right: 0; - top: 0; - width: 100%; - z-index: 100; -} -@media screen and (min-width: 30em) { - .swagger-ui .aspect-ratio-ns { - height: 0; - position: relative; - } - .swagger-ui .aspect-ratio--16x9-ns { - padding-bottom: 56.25%; - } - .swagger-ui .aspect-ratio--9x16-ns { - padding-bottom: 177.77%; - } - .swagger-ui .aspect-ratio--4x3-ns { - padding-bottom: 75%; - } - .swagger-ui .aspect-ratio--3x4-ns { - padding-bottom: 133.33%; - } - .swagger-ui .aspect-ratio--6x4-ns { - padding-bottom: 66.6%; - } - .swagger-ui .aspect-ratio--4x6-ns { - padding-bottom: 150%; - } - .swagger-ui .aspect-ratio--8x5-ns { - padding-bottom: 62.5%; - } - .swagger-ui .aspect-ratio--5x8-ns { - padding-bottom: 160%; - } - .swagger-ui .aspect-ratio--7x5-ns { - padding-bottom: 71.42%; - } - .swagger-ui .aspect-ratio--5x7-ns { - padding-bottom: 140%; - } - .swagger-ui .aspect-ratio--1x1-ns { - padding-bottom: 100%; - } - .swagger-ui .aspect-ratio--object-ns { - bottom: 0; - height: 100%; - left: 0; - position: absolute; - right: 0; - top: 0; - width: 100%; - z-index: 100; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .aspect-ratio-m { - height: 0; - position: relative; - } - .swagger-ui .aspect-ratio--16x9-m { - padding-bottom: 56.25%; - } - .swagger-ui .aspect-ratio--9x16-m { - padding-bottom: 177.77%; - } - .swagger-ui .aspect-ratio--4x3-m { - padding-bottom: 75%; - } - .swagger-ui .aspect-ratio--3x4-m { - padding-bottom: 133.33%; - } - .swagger-ui .aspect-ratio--6x4-m { - padding-bottom: 66.6%; - } - .swagger-ui .aspect-ratio--4x6-m { - padding-bottom: 150%; - } - .swagger-ui .aspect-ratio--8x5-m { - padding-bottom: 62.5%; - } - .swagger-ui .aspect-ratio--5x8-m { - padding-bottom: 160%; - } - .swagger-ui .aspect-ratio--7x5-m { - padding-bottom: 71.42%; - } - .swagger-ui .aspect-ratio--5x7-m { - padding-bottom: 140%; - } - .swagger-ui .aspect-ratio--1x1-m { - padding-bottom: 100%; - } - .swagger-ui .aspect-ratio--object-m { - bottom: 0; - height: 100%; - left: 0; - position: absolute; - right: 0; - top: 0; - width: 100%; - z-index: 100; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .aspect-ratio-l { - height: 0; - position: relative; - } - .swagger-ui .aspect-ratio--16x9-l { - padding-bottom: 56.25%; - } - .swagger-ui .aspect-ratio--9x16-l { - padding-bottom: 177.77%; - } - .swagger-ui .aspect-ratio--4x3-l { - padding-bottom: 75%; - } - .swagger-ui .aspect-ratio--3x4-l { - padding-bottom: 133.33%; - } - .swagger-ui .aspect-ratio--6x4-l { - padding-bottom: 66.6%; - } - .swagger-ui .aspect-ratio--4x6-l { - padding-bottom: 150%; - } - .swagger-ui .aspect-ratio--8x5-l { - padding-bottom: 62.5%; - } - .swagger-ui .aspect-ratio--5x8-l { - padding-bottom: 160%; - } - .swagger-ui .aspect-ratio--7x5-l { - padding-bottom: 71.42%; - } - .swagger-ui .aspect-ratio--5x7-l { - padding-bottom: 140%; - } - .swagger-ui .aspect-ratio--1x1-l { - padding-bottom: 100%; - } - .swagger-ui .aspect-ratio--object-l { - bottom: 0; - height: 100%; - left: 0; - position: absolute; - right: 0; - top: 0; - width: 100%; - z-index: 100; - } -} -.swagger-ui img { - max-width: 100%; -} -.swagger-ui .cover { - background-size: cover !important; -} -.swagger-ui .contain { - background-size: contain !important; -} -@media screen and (min-width: 30em) { - .swagger-ui .cover-ns { - background-size: cover !important; - } - .swagger-ui .contain-ns { - background-size: contain !important; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .cover-m { - background-size: cover !important; - } - .swagger-ui .contain-m { - background-size: contain !important; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .cover-l { - background-size: cover !important; - } - .swagger-ui .contain-l { - background-size: contain !important; - } -} -.swagger-ui .bg-center { - background-position: 50%; - background-repeat: no-repeat; -} -.swagger-ui .bg-top { - background-position: top; - background-repeat: no-repeat; -} -.swagger-ui .bg-right { - background-position: 100%; - background-repeat: no-repeat; -} -.swagger-ui .bg-bottom { - background-position: bottom; - background-repeat: no-repeat; -} -.swagger-ui .bg-left { - background-position: 0; - background-repeat: no-repeat; -} -@media screen and (min-width: 30em) { - .swagger-ui .bg-center-ns { - background-position: 50%; - background-repeat: no-repeat; - } - .swagger-ui .bg-top-ns { - background-position: top; - background-repeat: no-repeat; - } - .swagger-ui .bg-right-ns { - background-position: 100%; - background-repeat: no-repeat; - } - .swagger-ui .bg-bottom-ns { - background-position: bottom; - background-repeat: no-repeat; - } - .swagger-ui .bg-left-ns { - background-position: 0; - background-repeat: no-repeat; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .bg-center-m { - background-position: 50%; - background-repeat: no-repeat; - } - .swagger-ui .bg-top-m { - background-position: top; - background-repeat: no-repeat; - } - .swagger-ui .bg-right-m { - background-position: 100%; - background-repeat: no-repeat; - } - .swagger-ui .bg-bottom-m { - background-position: bottom; - background-repeat: no-repeat; - } - .swagger-ui .bg-left-m { - background-position: 0; - background-repeat: no-repeat; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .bg-center-l { - background-position: 50%; - background-repeat: no-repeat; - } - .swagger-ui .bg-top-l { - background-position: top; - background-repeat: no-repeat; - } - .swagger-ui .bg-right-l { - background-position: 100%; - background-repeat: no-repeat; - } - .swagger-ui .bg-bottom-l { - background-position: bottom; - background-repeat: no-repeat; - } - .swagger-ui .bg-left-l { - background-position: 0; - background-repeat: no-repeat; - } -} -.swagger-ui .outline { - outline: 1px solid; -} -.swagger-ui .outline-transparent { - outline: 1px solid transparent; -} -.swagger-ui .outline-0 { - outline: 0; -} -@media screen and (min-width: 30em) { - .swagger-ui .outline-ns { - outline: 1px solid; - } - .swagger-ui .outline-transparent-ns { - outline: 1px solid transparent; - } - .swagger-ui .outline-0-ns { - outline: 0; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .outline-m { - outline: 1px solid; - } - .swagger-ui .outline-transparent-m { - outline: 1px solid transparent; - } - .swagger-ui .outline-0-m { - outline: 0; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .outline-l { - outline: 1px solid; - } - .swagger-ui .outline-transparent-l { - outline: 1px solid transparent; - } - .swagger-ui .outline-0-l { - outline: 0; - } -} -.swagger-ui .ba { - border-style: solid; - border-width: 1px; -} -.swagger-ui .bt { - border-top-style: solid; - border-top-width: 1px; -} -.swagger-ui .br { - border-right-style: solid; - border-right-width: 1px; -} -.swagger-ui .bb { - border-bottom-style: solid; - border-bottom-width: 1px; -} -.swagger-ui .bl { - border-left-style: solid; - border-left-width: 1px; -} -.swagger-ui .bn { - border-style: none; - border-width: 0; -} -@media screen and (min-width: 30em) { - .swagger-ui .ba-ns { - border-style: solid; - border-width: 1px; - } - .swagger-ui .bt-ns { - border-top-style: solid; - border-top-width: 1px; - } - .swagger-ui .br-ns { - border-right-style: solid; - border-right-width: 1px; - } - .swagger-ui .bb-ns { - border-bottom-style: solid; - border-bottom-width: 1px; - } - .swagger-ui .bl-ns { - border-left-style: solid; - border-left-width: 1px; - } - .swagger-ui .bn-ns { - border-style: none; - border-width: 0; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .ba-m { - border-style: solid; - border-width: 1px; - } - .swagger-ui .bt-m { - border-top-style: solid; - border-top-width: 1px; - } - .swagger-ui .br-m { - border-right-style: solid; - border-right-width: 1px; - } - .swagger-ui .bb-m { - border-bottom-style: solid; - border-bottom-width: 1px; - } - .swagger-ui .bl-m { - border-left-style: solid; - border-left-width: 1px; - } - .swagger-ui .bn-m { - border-style: none; - border-width: 0; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .ba-l { - border-style: solid; - border-width: 1px; - } - .swagger-ui .bt-l { - border-top-style: solid; - border-top-width: 1px; - } - .swagger-ui .br-l { - border-right-style: solid; - border-right-width: 1px; - } - .swagger-ui .bb-l { - border-bottom-style: solid; - border-bottom-width: 1px; - } - .swagger-ui .bl-l { - border-left-style: solid; - border-left-width: 1px; - } - .swagger-ui .bn-l { - border-style: none; - border-width: 0; - } -} -.swagger-ui .b--black { - border-color: #000; -} -.swagger-ui .b--near-black { - border-color: #111; -} -.swagger-ui .b--dark-gray { - border-color: #333; -} -.swagger-ui .b--mid-gray { - border-color: #555; -} -.swagger-ui .b--gray { - border-color: #777; -} -.swagger-ui .b--silver { - border-color: #999; -} -.swagger-ui .b--light-silver { - border-color: #aaa; -} -.swagger-ui .b--moon-gray { - border-color: #ccc; -} -.swagger-ui .b--light-gray { - border-color: #eee; -} -.swagger-ui .b--near-white { - border-color: #f4f4f4; -} -.swagger-ui .b--white { - border-color: #fff; -} -.swagger-ui .b--white-90 { - border-color: hsla(0, 0%, 100%, 0.9); -} -.swagger-ui .b--white-80 { - border-color: hsla(0, 0%, 100%, 0.8); -} -.swagger-ui .b--white-70 { - border-color: hsla(0, 0%, 100%, 0.7); -} -.swagger-ui .b--white-60 { - border-color: hsla(0, 0%, 100%, 0.6); -} -.swagger-ui .b--white-50 { - border-color: hsla(0, 0%, 100%, 0.5); -} -.swagger-ui .b--white-40 { - border-color: hsla(0, 0%, 100%, 0.4); -} -.swagger-ui .b--white-30 { - border-color: hsla(0, 0%, 100%, 0.3); -} -.swagger-ui .b--white-20 { - border-color: hsla(0, 0%, 100%, 0.2); -} -.swagger-ui .b--white-10 { - border-color: hsla(0, 0%, 100%, 0.1); -} -.swagger-ui .b--white-05 { - border-color: hsla(0, 0%, 100%, 0.05); -} -.swagger-ui .b--white-025 { - border-color: hsla(0, 0%, 100%, 0.025); -} -.swagger-ui .b--white-0125 { - border-color: hsla(0, 0%, 100%, 0.013); -} -.swagger-ui .b--black-90 { - border-color: rgba(0, 0, 0, 0.9); -} -.swagger-ui .b--black-80 { - border-color: rgba(0, 0, 0, 0.8); -} -.swagger-ui .b--black-70 { - border-color: rgba(0, 0, 0, 0.7); -} -.swagger-ui .b--black-60 { - border-color: rgba(0, 0, 0, 0.6); -} -.swagger-ui .b--black-50 { - border-color: rgba(0, 0, 0, 0.5); -} -.swagger-ui .b--black-40 { - border-color: rgba(0, 0, 0, 0.4); -} -.swagger-ui .b--black-30 { - border-color: rgba(0, 0, 0, 0.3); -} -.swagger-ui .b--black-20 { - border-color: rgba(0, 0, 0, 0.2); -} -.swagger-ui .b--black-10 { - border-color: rgba(0, 0, 0, 0.1); -} -.swagger-ui .b--black-05 { - border-color: rgba(0, 0, 0, 0.05); -} -.swagger-ui .b--black-025 { - border-color: rgba(0, 0, 0, 0.025); -} -.swagger-ui .b--black-0125 { - border-color: rgba(0, 0, 0, 0.013); -} -.swagger-ui .b--dark-red { - border-color: #e7040f; -} -.swagger-ui .b--red { - border-color: #ff4136; -} -.swagger-ui .b--light-red { - border-color: #ff725c; -} -.swagger-ui .b--orange { - border-color: #ff6300; -} -.swagger-ui .b--gold { - border-color: #ffb700; -} -.swagger-ui .b--yellow { - border-color: gold; -} -.swagger-ui .b--light-yellow { - border-color: #fbf1a9; -} -.swagger-ui .b--purple { - border-color: #5e2ca5; -} -.swagger-ui .b--light-purple { - border-color: #a463f2; -} -.swagger-ui .b--dark-pink { - border-color: #d5008f; -} -.swagger-ui .b--hot-pink { - border-color: #ff41b4; -} -.swagger-ui .b--pink { - border-color: #ff80cc; -} -.swagger-ui .b--light-pink { - border-color: #ffa3d7; -} -.swagger-ui .b--dark-green { - border-color: #137752; -} -.swagger-ui .b--green { - border-color: #19a974; -} -.swagger-ui .b--light-green { - border-color: #9eebcf; -} -.swagger-ui .b--navy { - border-color: #001b44; -} -.swagger-ui .b--dark-blue { - border-color: #00449e; -} -.swagger-ui .b--blue { - border-color: #357edd; -} -.swagger-ui .b--light-blue { - border-color: #96ccff; -} -.swagger-ui .b--lightest-blue { - border-color: #cdecff; -} -.swagger-ui .b--washed-blue { - border-color: #f6fffe; -} -.swagger-ui .b--washed-green { - border-color: #e8fdf5; -} -.swagger-ui .b--washed-yellow { - border-color: #fffceb; -} -.swagger-ui .b--washed-red { - border-color: #ffdfdf; -} -.swagger-ui .b--transparent { - border-color: transparent; -} -.swagger-ui .b--inherit { - border-color: inherit; -} -.swagger-ui .br0 { - border-radius: 0; -} -.swagger-ui .br1 { - border-radius: 0.125rem; -} -.swagger-ui .br2 { - border-radius: 0.25rem; -} -.swagger-ui .br3 { - border-radius: 0.5rem; -} -.swagger-ui .br4 { - border-radius: 1rem; -} -.swagger-ui .br-100 { - border-radius: 100%; -} -.swagger-ui .br-pill { - border-radius: 9999px; -} -.swagger-ui .br--bottom { - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.swagger-ui .br--top { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; -} -.swagger-ui .br--right { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} -.swagger-ui .br--left { - border-bottom-right-radius: 0; - border-top-right-radius: 0; -} -@media screen and (min-width: 30em) { - .swagger-ui .br0-ns { - border-radius: 0; - } - .swagger-ui .br1-ns { - border-radius: 0.125rem; - } - .swagger-ui .br2-ns { - border-radius: 0.25rem; - } - .swagger-ui .br3-ns { - border-radius: 0.5rem; - } - .swagger-ui .br4-ns { - border-radius: 1rem; - } - .swagger-ui .br-100-ns { - border-radius: 100%; - } - .swagger-ui .br-pill-ns { - border-radius: 9999px; - } - .swagger-ui .br--bottom-ns { - border-top-left-radius: 0; - border-top-right-radius: 0; - } - .swagger-ui .br--top-ns { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - } - .swagger-ui .br--right-ns { - border-bottom-left-radius: 0; - border-top-left-radius: 0; - } - .swagger-ui .br--left-ns { - border-bottom-right-radius: 0; - border-top-right-radius: 0; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .br0-m { - border-radius: 0; - } - .swagger-ui .br1-m { - border-radius: 0.125rem; - } - .swagger-ui .br2-m { - border-radius: 0.25rem; - } - .swagger-ui .br3-m { - border-radius: 0.5rem; - } - .swagger-ui .br4-m { - border-radius: 1rem; - } - .swagger-ui .br-100-m { - border-radius: 100%; - } - .swagger-ui .br-pill-m { - border-radius: 9999px; - } - .swagger-ui .br--bottom-m { - border-top-left-radius: 0; - border-top-right-radius: 0; - } - .swagger-ui .br--top-m { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - } - .swagger-ui .br--right-m { - border-bottom-left-radius: 0; - border-top-left-radius: 0; - } - .swagger-ui .br--left-m { - border-bottom-right-radius: 0; - border-top-right-radius: 0; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .br0-l { - border-radius: 0; - } - .swagger-ui .br1-l { - border-radius: 0.125rem; - } - .swagger-ui .br2-l { - border-radius: 0.25rem; - } - .swagger-ui .br3-l { - border-radius: 0.5rem; - } - .swagger-ui .br4-l { - border-radius: 1rem; - } - .swagger-ui .br-100-l { - border-radius: 100%; - } - .swagger-ui .br-pill-l { - border-radius: 9999px; - } - .swagger-ui .br--bottom-l { - border-top-left-radius: 0; - border-top-right-radius: 0; - } - .swagger-ui .br--top-l { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - } - .swagger-ui .br--right-l { - border-bottom-left-radius: 0; - border-top-left-radius: 0; - } - .swagger-ui .br--left-l { - border-bottom-right-radius: 0; - border-top-right-radius: 0; - } -} -.swagger-ui .b--dotted { - border-style: dotted; -} -.swagger-ui .b--dashed { - border-style: dashed; -} -.swagger-ui .b--solid { - border-style: solid; -} -.swagger-ui .b--none { - border-style: none; -} -@media screen and (min-width: 30em) { - .swagger-ui .b--dotted-ns { - border-style: dotted; - } - .swagger-ui .b--dashed-ns { - border-style: dashed; - } - .swagger-ui .b--solid-ns { - border-style: solid; - } - .swagger-ui .b--none-ns { - border-style: none; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .b--dotted-m { - border-style: dotted; - } - .swagger-ui .b--dashed-m { - border-style: dashed; - } - .swagger-ui .b--solid-m { - border-style: solid; - } - .swagger-ui .b--none-m { - border-style: none; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .b--dotted-l { - border-style: dotted; - } - .swagger-ui .b--dashed-l { - border-style: dashed; - } - .swagger-ui .b--solid-l { - border-style: solid; - } - .swagger-ui .b--none-l { - border-style: none; - } -} -.swagger-ui .bw0 { - border-width: 0; -} -.swagger-ui .bw1 { - border-width: 0.125rem; -} -.swagger-ui .bw2 { - border-width: 0.25rem; -} -.swagger-ui .bw3 { - border-width: 0.5rem; -} -.swagger-ui .bw4 { - border-width: 1rem; -} -.swagger-ui .bw5 { - border-width: 2rem; -} -.swagger-ui .bt-0 { - border-top-width: 0; -} -.swagger-ui .br-0 { - border-right-width: 0; -} -.swagger-ui .bb-0 { - border-bottom-width: 0; -} -.swagger-ui .bl-0 { - border-left-width: 0; -} -@media screen and (min-width: 30em) { - .swagger-ui .bw0-ns { - border-width: 0; - } - .swagger-ui .bw1-ns { - border-width: 0.125rem; - } - .swagger-ui .bw2-ns { - border-width: 0.25rem; - } - .swagger-ui .bw3-ns { - border-width: 0.5rem; - } - .swagger-ui .bw4-ns { - border-width: 1rem; - } - .swagger-ui .bw5-ns { - border-width: 2rem; - } - .swagger-ui .bt-0-ns { - border-top-width: 0; - } - .swagger-ui .br-0-ns { - border-right-width: 0; - } - .swagger-ui .bb-0-ns { - border-bottom-width: 0; - } - .swagger-ui .bl-0-ns { - border-left-width: 0; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .bw0-m { - border-width: 0; - } - .swagger-ui .bw1-m { - border-width: 0.125rem; - } - .swagger-ui .bw2-m { - border-width: 0.25rem; - } - .swagger-ui .bw3-m { - border-width: 0.5rem; - } - .swagger-ui .bw4-m { - border-width: 1rem; - } - .swagger-ui .bw5-m { - border-width: 2rem; - } - .swagger-ui .bt-0-m { - border-top-width: 0; - } - .swagger-ui .br-0-m { - border-right-width: 0; - } - .swagger-ui .bb-0-m { - border-bottom-width: 0; - } - .swagger-ui .bl-0-m { - border-left-width: 0; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .bw0-l { - border-width: 0; - } - .swagger-ui .bw1-l { - border-width: 0.125rem; - } - .swagger-ui .bw2-l { - border-width: 0.25rem; - } - .swagger-ui .bw3-l { - border-width: 0.5rem; - } - .swagger-ui .bw4-l { - border-width: 1rem; - } - .swagger-ui .bw5-l { - border-width: 2rem; - } - .swagger-ui .bt-0-l { - border-top-width: 0; - } - .swagger-ui .br-0-l { - border-right-width: 0; - } - .swagger-ui .bb-0-l { - border-bottom-width: 0; - } - .swagger-ui .bl-0-l { - border-left-width: 0; - } -} -.swagger-ui .shadow-1 { - box-shadow: 0 0 4px 2px rgba(0, 0, 0, 0.2); -} -.swagger-ui .shadow-2 { - box-shadow: 0 0 8px 2px rgba(0, 0, 0, 0.2); -} -.swagger-ui .shadow-3 { - box-shadow: 2px 2px 4px 2px rgba(0, 0, 0, 0.2); -} -.swagger-ui .shadow-4 { - box-shadow: 2px 2px 8px 0 rgba(0, 0, 0, 0.2); -} -.swagger-ui .shadow-5 { - box-shadow: 4px 4px 8px 0 rgba(0, 0, 0, 0.2); -} -@media screen and (min-width: 30em) { - .swagger-ui .shadow-1-ns { - box-shadow: 0 0 4px 2px rgba(0, 0, 0, 0.2); - } - .swagger-ui .shadow-2-ns { - box-shadow: 0 0 8px 2px rgba(0, 0, 0, 0.2); - } - .swagger-ui .shadow-3-ns { - box-shadow: 2px 2px 4px 2px rgba(0, 0, 0, 0.2); - } - .swagger-ui .shadow-4-ns { - box-shadow: 2px 2px 8px 0 rgba(0, 0, 0, 0.2); - } - .swagger-ui .shadow-5-ns { - box-shadow: 4px 4px 8px 0 rgba(0, 0, 0, 0.2); - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .shadow-1-m { - box-shadow: 0 0 4px 2px rgba(0, 0, 0, 0.2); - } - .swagger-ui .shadow-2-m { - box-shadow: 0 0 8px 2px rgba(0, 0, 0, 0.2); - } - .swagger-ui .shadow-3-m { - box-shadow: 2px 2px 4px 2px rgba(0, 0, 0, 0.2); - } - .swagger-ui .shadow-4-m { - box-shadow: 2px 2px 8px 0 rgba(0, 0, 0, 0.2); - } - .swagger-ui .shadow-5-m { - box-shadow: 4px 4px 8px 0 rgba(0, 0, 0, 0.2); - } -} -@media screen and (min-width: 60em) { - .swagger-ui .shadow-1-l { - box-shadow: 0 0 4px 2px rgba(0, 0, 0, 0.2); - } - .swagger-ui .shadow-2-l { - box-shadow: 0 0 8px 2px rgba(0, 0, 0, 0.2); - } - .swagger-ui .shadow-3-l { - box-shadow: 2px 2px 4px 2px rgba(0, 0, 0, 0.2); - } - .swagger-ui .shadow-4-l { - box-shadow: 2px 2px 8px 0 rgba(0, 0, 0, 0.2); - } - .swagger-ui .shadow-5-l { - box-shadow: 4px 4px 8px 0 rgba(0, 0, 0, 0.2); - } -} -.swagger-ui .pre { - overflow-x: auto; - overflow-y: hidden; - overflow: scroll; -} -.swagger-ui .top-0 { - top: 0; -} -.swagger-ui .right-0 { - right: 0; -} -.swagger-ui .bottom-0 { - bottom: 0; -} -.swagger-ui .left-0 { - left: 0; -} -.swagger-ui .top-1 { - top: 1rem; -} -.swagger-ui .right-1 { - right: 1rem; -} -.swagger-ui .bottom-1 { - bottom: 1rem; -} -.swagger-ui .left-1 { - left: 1rem; -} -.swagger-ui .top-2 { - top: 2rem; -} -.swagger-ui .right-2 { - right: 2rem; -} -.swagger-ui .bottom-2 { - bottom: 2rem; -} -.swagger-ui .left-2 { - left: 2rem; -} -.swagger-ui .top--1 { - top: -1rem; -} -.swagger-ui .right--1 { - right: -1rem; -} -.swagger-ui .bottom--1 { - bottom: -1rem; -} -.swagger-ui .left--1 { - left: -1rem; -} -.swagger-ui .top--2 { - top: -2rem; -} -.swagger-ui .right--2 { - right: -2rem; -} -.swagger-ui .bottom--2 { - bottom: -2rem; -} -.swagger-ui .left--2 { - left: -2rem; -} -.swagger-ui .absolute--fill { - bottom: 0; - left: 0; - right: 0; - top: 0; -} -@media screen and (min-width: 30em) { - .swagger-ui .top-0-ns { - top: 0; - } - .swagger-ui .left-0-ns { - left: 0; - } - .swagger-ui .right-0-ns { - right: 0; - } - .swagger-ui .bottom-0-ns { - bottom: 0; - } - .swagger-ui .top-1-ns { - top: 1rem; - } - .swagger-ui .left-1-ns { - left: 1rem; - } - .swagger-ui .right-1-ns { - right: 1rem; - } - .swagger-ui .bottom-1-ns { - bottom: 1rem; - } - .swagger-ui .top-2-ns { - top: 2rem; - } - .swagger-ui .left-2-ns { - left: 2rem; - } - .swagger-ui .right-2-ns { - right: 2rem; - } - .swagger-ui .bottom-2-ns { - bottom: 2rem; - } - .swagger-ui .top--1-ns { - top: -1rem; - } - .swagger-ui .right--1-ns { - right: -1rem; - } - .swagger-ui .bottom--1-ns { - bottom: -1rem; - } - .swagger-ui .left--1-ns { - left: -1rem; - } - .swagger-ui .top--2-ns { - top: -2rem; - } - .swagger-ui .right--2-ns { - right: -2rem; - } - .swagger-ui .bottom--2-ns { - bottom: -2rem; - } - .swagger-ui .left--2-ns { - left: -2rem; - } - .swagger-ui .absolute--fill-ns { - bottom: 0; - left: 0; - right: 0; - top: 0; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .top-0-m { - top: 0; - } - .swagger-ui .left-0-m { - left: 0; - } - .swagger-ui .right-0-m { - right: 0; - } - .swagger-ui .bottom-0-m { - bottom: 0; - } - .swagger-ui .top-1-m { - top: 1rem; - } - .swagger-ui .left-1-m { - left: 1rem; - } - .swagger-ui .right-1-m { - right: 1rem; - } - .swagger-ui .bottom-1-m { - bottom: 1rem; - } - .swagger-ui .top-2-m { - top: 2rem; - } - .swagger-ui .left-2-m { - left: 2rem; - } - .swagger-ui .right-2-m { - right: 2rem; - } - .swagger-ui .bottom-2-m { - bottom: 2rem; - } - .swagger-ui .top--1-m { - top: -1rem; - } - .swagger-ui .right--1-m { - right: -1rem; - } - .swagger-ui .bottom--1-m { - bottom: -1rem; - } - .swagger-ui .left--1-m { - left: -1rem; - } - .swagger-ui .top--2-m { - top: -2rem; - } - .swagger-ui .right--2-m { - right: -2rem; - } - .swagger-ui .bottom--2-m { - bottom: -2rem; - } - .swagger-ui .left--2-m { - left: -2rem; - } - .swagger-ui .absolute--fill-m { - bottom: 0; - left: 0; - right: 0; - top: 0; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .top-0-l { - top: 0; - } - .swagger-ui .left-0-l { - left: 0; - } - .swagger-ui .right-0-l { - right: 0; - } - .swagger-ui .bottom-0-l { - bottom: 0; - } - .swagger-ui .top-1-l { - top: 1rem; - } - .swagger-ui .left-1-l { - left: 1rem; - } - .swagger-ui .right-1-l { - right: 1rem; - } - .swagger-ui .bottom-1-l { - bottom: 1rem; - } - .swagger-ui .top-2-l { - top: 2rem; - } - .swagger-ui .left-2-l { - left: 2rem; - } - .swagger-ui .right-2-l { - right: 2rem; - } - .swagger-ui .bottom-2-l { - bottom: 2rem; - } - .swagger-ui .top--1-l { - top: -1rem; - } - .swagger-ui .right--1-l { - right: -1rem; - } - .swagger-ui .bottom--1-l { - bottom: -1rem; - } - .swagger-ui .left--1-l { - left: -1rem; - } - .swagger-ui .top--2-l { - top: -2rem; - } - .swagger-ui .right--2-l { - right: -2rem; - } - .swagger-ui .bottom--2-l { - bottom: -2rem; - } - .swagger-ui .left--2-l { - left: -2rem; - } - .swagger-ui .absolute--fill-l { - bottom: 0; - left: 0; - right: 0; - top: 0; - } -} -.swagger-ui .cf:after, -.swagger-ui .cf:before { - content: " "; - display: table; -} -.swagger-ui .cf:after { - clear: both; -} -.swagger-ui .cf { - zoom: 1; -} -.swagger-ui .cl { - clear: left; -} -.swagger-ui .cr { - clear: right; -} -.swagger-ui .cb { - clear: both; -} -.swagger-ui .cn { - clear: none; -} -@media screen and (min-width: 30em) { - .swagger-ui .cl-ns { - clear: left; - } - .swagger-ui .cr-ns { - clear: right; - } - .swagger-ui .cb-ns { - clear: both; - } - .swagger-ui .cn-ns { - clear: none; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .cl-m { - clear: left; - } - .swagger-ui .cr-m { - clear: right; - } - .swagger-ui .cb-m { - clear: both; - } - .swagger-ui .cn-m { - clear: none; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .cl-l { - clear: left; - } - .swagger-ui .cr-l { - clear: right; - } - .swagger-ui .cb-l { - clear: both; - } - .swagger-ui .cn-l { - clear: none; - } -} -.swagger-ui .flex { - display: flex; -} -.swagger-ui .inline-flex { - display: inline-flex; -} -.swagger-ui .flex-auto { - flex: 1 1 auto; - min-height: 0; - min-width: 0; -} -.swagger-ui .flex-none { - flex: none; -} -.swagger-ui .flex-column { - flex-direction: column; -} -.swagger-ui .flex-row { - flex-direction: row; -} -.swagger-ui .flex-wrap { - flex-wrap: wrap; -} -.swagger-ui .flex-nowrap { - flex-wrap: nowrap; -} -.swagger-ui .flex-wrap-reverse { - flex-wrap: wrap-reverse; -} -.swagger-ui .flex-column-reverse { - flex-direction: column-reverse; -} -.swagger-ui .flex-row-reverse { - flex-direction: row-reverse; -} -.swagger-ui .items-start { - align-items: flex-start; -} -.swagger-ui .items-end { - align-items: flex-end; -} -.swagger-ui .items-center { - align-items: center; -} -.swagger-ui .items-baseline { - align-items: baseline; -} -.swagger-ui .items-stretch { - align-items: stretch; -} -.swagger-ui .self-start { - align-self: flex-start; -} -.swagger-ui .self-end { - align-self: flex-end; -} -.swagger-ui .self-center { - align-self: center; -} -.swagger-ui .self-baseline { - align-self: baseline; -} -.swagger-ui .self-stretch { - align-self: stretch; -} -.swagger-ui .justify-start { - justify-content: flex-start; -} -.swagger-ui .justify-end { - justify-content: flex-end; -} -.swagger-ui .justify-center { - justify-content: center; -} -.swagger-ui .justify-between { - justify-content: space-between; -} -.swagger-ui .justify-around { - justify-content: space-around; -} -.swagger-ui .content-start { - align-content: flex-start; -} -.swagger-ui .content-end { - align-content: flex-end; -} -.swagger-ui .content-center { - align-content: center; -} -.swagger-ui .content-between { - align-content: space-between; -} -.swagger-ui .content-around { - align-content: space-around; -} -.swagger-ui .content-stretch { - align-content: stretch; -} -.swagger-ui .order-0 { - order: 0; -} -.swagger-ui .order-1 { - order: 1; -} -.swagger-ui .order-2 { - order: 2; -} -.swagger-ui .order-3 { - order: 3; -} -.swagger-ui .order-4 { - order: 4; -} -.swagger-ui .order-5 { - order: 5; -} -.swagger-ui .order-6 { - order: 6; -} -.swagger-ui .order-7 { - order: 7; -} -.swagger-ui .order-8 { - order: 8; -} -.swagger-ui .order-last { - order: 99999; -} -.swagger-ui .flex-grow-0 { - flex-grow: 0; -} -.swagger-ui .flex-grow-1 { - flex-grow: 1; -} -.swagger-ui .flex-shrink-0 { - flex-shrink: 0; -} -.swagger-ui .flex-shrink-1 { - flex-shrink: 1; -} -@media screen and (min-width: 30em) { - .swagger-ui .flex-ns { - display: flex; - } - .swagger-ui .inline-flex-ns { - display: inline-flex; - } - .swagger-ui .flex-auto-ns { - flex: 1 1 auto; - min-height: 0; - min-width: 0; - } - .swagger-ui .flex-none-ns { - flex: none; - } - .swagger-ui .flex-column-ns { - flex-direction: column; - } - .swagger-ui .flex-row-ns { - flex-direction: row; - } - .swagger-ui .flex-wrap-ns { - flex-wrap: wrap; - } - .swagger-ui .flex-nowrap-ns { - flex-wrap: nowrap; - } - .swagger-ui .flex-wrap-reverse-ns { - flex-wrap: wrap-reverse; - } - .swagger-ui .flex-column-reverse-ns { - flex-direction: column-reverse; - } - .swagger-ui .flex-row-reverse-ns { - flex-direction: row-reverse; - } - .swagger-ui .items-start-ns { - align-items: flex-start; - } - .swagger-ui .items-end-ns { - align-items: flex-end; - } - .swagger-ui .items-center-ns { - align-items: center; - } - .swagger-ui .items-baseline-ns { - align-items: baseline; - } - .swagger-ui .items-stretch-ns { - align-items: stretch; - } - .swagger-ui .self-start-ns { - align-self: flex-start; - } - .swagger-ui .self-end-ns { - align-self: flex-end; - } - .swagger-ui .self-center-ns { - align-self: center; - } - .swagger-ui .self-baseline-ns { - align-self: baseline; - } - .swagger-ui .self-stretch-ns { - align-self: stretch; - } - .swagger-ui .justify-start-ns { - justify-content: flex-start; - } - .swagger-ui .justify-end-ns { - justify-content: flex-end; - } - .swagger-ui .justify-center-ns { - justify-content: center; - } - .swagger-ui .justify-between-ns { - justify-content: space-between; - } - .swagger-ui .justify-around-ns { - justify-content: space-around; - } - .swagger-ui .content-start-ns { - align-content: flex-start; - } - .swagger-ui .content-end-ns { - align-content: flex-end; - } - .swagger-ui .content-center-ns { - align-content: center; - } - .swagger-ui .content-between-ns { - align-content: space-between; - } - .swagger-ui .content-around-ns { - align-content: space-around; - } - .swagger-ui .content-stretch-ns { - align-content: stretch; - } - .swagger-ui .order-0-ns { - order: 0; - } - .swagger-ui .order-1-ns { - order: 1; - } - .swagger-ui .order-2-ns { - order: 2; - } - .swagger-ui .order-3-ns { - order: 3; - } - .swagger-ui .order-4-ns { - order: 4; - } - .swagger-ui .order-5-ns { - order: 5; - } - .swagger-ui .order-6-ns { - order: 6; - } - .swagger-ui .order-7-ns { - order: 7; - } - .swagger-ui .order-8-ns { - order: 8; - } - .swagger-ui .order-last-ns { - order: 99999; - } - .swagger-ui .flex-grow-0-ns { - flex-grow: 0; - } - .swagger-ui .flex-grow-1-ns { - flex-grow: 1; - } - .swagger-ui .flex-shrink-0-ns { - flex-shrink: 0; - } - .swagger-ui .flex-shrink-1-ns { - flex-shrink: 1; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .flex-m { - display: flex; - } - .swagger-ui .inline-flex-m { - display: inline-flex; - } - .swagger-ui .flex-auto-m { - flex: 1 1 auto; - min-height: 0; - min-width: 0; - } - .swagger-ui .flex-none-m { - flex: none; - } - .swagger-ui .flex-column-m { - flex-direction: column; - } - .swagger-ui .flex-row-m { - flex-direction: row; - } - .swagger-ui .flex-wrap-m { - flex-wrap: wrap; - } - .swagger-ui .flex-nowrap-m { - flex-wrap: nowrap; - } - .swagger-ui .flex-wrap-reverse-m { - flex-wrap: wrap-reverse; - } - .swagger-ui .flex-column-reverse-m { - flex-direction: column-reverse; - } - .swagger-ui .flex-row-reverse-m { - flex-direction: row-reverse; - } - .swagger-ui .items-start-m { - align-items: flex-start; - } - .swagger-ui .items-end-m { - align-items: flex-end; - } - .swagger-ui .items-center-m { - align-items: center; - } - .swagger-ui .items-baseline-m { - align-items: baseline; - } - .swagger-ui .items-stretch-m { - align-items: stretch; - } - .swagger-ui .self-start-m { - align-self: flex-start; - } - .swagger-ui .self-end-m { - align-self: flex-end; - } - .swagger-ui .self-center-m { - align-self: center; - } - .swagger-ui .self-baseline-m { - align-self: baseline; - } - .swagger-ui .self-stretch-m { - align-self: stretch; - } - .swagger-ui .justify-start-m { - justify-content: flex-start; - } - .swagger-ui .justify-end-m { - justify-content: flex-end; - } - .swagger-ui .justify-center-m { - justify-content: center; - } - .swagger-ui .justify-between-m { - justify-content: space-between; - } - .swagger-ui .justify-around-m { - justify-content: space-around; - } - .swagger-ui .content-start-m { - align-content: flex-start; - } - .swagger-ui .content-end-m { - align-content: flex-end; - } - .swagger-ui .content-center-m { - align-content: center; - } - .swagger-ui .content-between-m { - align-content: space-between; - } - .swagger-ui .content-around-m { - align-content: space-around; - } - .swagger-ui .content-stretch-m { - align-content: stretch; - } - .swagger-ui .order-0-m { - order: 0; - } - .swagger-ui .order-1-m { - order: 1; - } - .swagger-ui .order-2-m { - order: 2; - } - .swagger-ui .order-3-m { - order: 3; - } - .swagger-ui .order-4-m { - order: 4; - } - .swagger-ui .order-5-m { - order: 5; - } - .swagger-ui .order-6-m { - order: 6; - } - .swagger-ui .order-7-m { - order: 7; - } - .swagger-ui .order-8-m { - order: 8; - } - .swagger-ui .order-last-m { - order: 99999; - } - .swagger-ui .flex-grow-0-m { - flex-grow: 0; - } - .swagger-ui .flex-grow-1-m { - flex-grow: 1; - } - .swagger-ui .flex-shrink-0-m { - flex-shrink: 0; - } - .swagger-ui .flex-shrink-1-m { - flex-shrink: 1; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .flex-l { - display: flex; - } - .swagger-ui .inline-flex-l { - display: inline-flex; - } - .swagger-ui .flex-auto-l { - flex: 1 1 auto; - min-height: 0; - min-width: 0; - } - .swagger-ui .flex-none-l { - flex: none; - } - .swagger-ui .flex-column-l { - flex-direction: column; - } - .swagger-ui .flex-row-l { - flex-direction: row; - } - .swagger-ui .flex-wrap-l { - flex-wrap: wrap; - } - .swagger-ui .flex-nowrap-l { - flex-wrap: nowrap; - } - .swagger-ui .flex-wrap-reverse-l { - flex-wrap: wrap-reverse; - } - .swagger-ui .flex-column-reverse-l { - flex-direction: column-reverse; - } - .swagger-ui .flex-row-reverse-l { - flex-direction: row-reverse; - } - .swagger-ui .items-start-l { - align-items: flex-start; - } - .swagger-ui .items-end-l { - align-items: flex-end; - } - .swagger-ui .items-center-l { - align-items: center; - } - .swagger-ui .items-baseline-l { - align-items: baseline; - } - .swagger-ui .items-stretch-l { - align-items: stretch; - } - .swagger-ui .self-start-l { - align-self: flex-start; - } - .swagger-ui .self-end-l { - align-self: flex-end; - } - .swagger-ui .self-center-l { - align-self: center; - } - .swagger-ui .self-baseline-l { - align-self: baseline; - } - .swagger-ui .self-stretch-l { - align-self: stretch; - } - .swagger-ui .justify-start-l { - justify-content: flex-start; - } - .swagger-ui .justify-end-l { - justify-content: flex-end; - } - .swagger-ui .justify-center-l { - justify-content: center; - } - .swagger-ui .justify-between-l { - justify-content: space-between; - } - .swagger-ui .justify-around-l { - justify-content: space-around; - } - .swagger-ui .content-start-l { - align-content: flex-start; - } - .swagger-ui .content-end-l { - align-content: flex-end; - } - .swagger-ui .content-center-l { - align-content: center; - } - .swagger-ui .content-between-l { - align-content: space-between; - } - .swagger-ui .content-around-l { - align-content: space-around; - } - .swagger-ui .content-stretch-l { - align-content: stretch; - } - .swagger-ui .order-0-l { - order: 0; - } - .swagger-ui .order-1-l { - order: 1; - } - .swagger-ui .order-2-l { - order: 2; - } - .swagger-ui .order-3-l { - order: 3; - } - .swagger-ui .order-4-l { - order: 4; - } - .swagger-ui .order-5-l { - order: 5; - } - .swagger-ui .order-6-l { - order: 6; - } - .swagger-ui .order-7-l { - order: 7; - } - .swagger-ui .order-8-l { - order: 8; - } - .swagger-ui .order-last-l { - order: 99999; - } - .swagger-ui .flex-grow-0-l { - flex-grow: 0; - } - .swagger-ui .flex-grow-1-l { - flex-grow: 1; - } - .swagger-ui .flex-shrink-0-l { - flex-shrink: 0; - } - .swagger-ui .flex-shrink-1-l { - flex-shrink: 1; - } -} -.swagger-ui .dn { - display: none; -} -.swagger-ui .di { - display: inline; -} -.swagger-ui .db { - display: block; -} -.swagger-ui .dib { - display: inline-block; -} -.swagger-ui .dit { - display: inline-table; -} -.swagger-ui .dt { - display: table; -} -.swagger-ui .dtc { - display: table-cell; -} -.swagger-ui .dt-row { - display: table-row; -} -.swagger-ui .dt-row-group { - display: table-row-group; -} -.swagger-ui .dt-column { - display: table-column; -} -.swagger-ui .dt-column-group { - display: table-column-group; -} -.swagger-ui .dt--fixed { - table-layout: fixed; - width: 100%; -} -@media screen and (min-width: 30em) { - .swagger-ui .dn-ns { - display: none; - } - .swagger-ui .di-ns { - display: inline; - } - .swagger-ui .db-ns { - display: block; - } - .swagger-ui .dib-ns { - display: inline-block; - } - .swagger-ui .dit-ns { - display: inline-table; - } - .swagger-ui .dt-ns { - display: table; - } - .swagger-ui .dtc-ns { - display: table-cell; - } - .swagger-ui .dt-row-ns { - display: table-row; - } - .swagger-ui .dt-row-group-ns { - display: table-row-group; - } - .swagger-ui .dt-column-ns { - display: table-column; - } - .swagger-ui .dt-column-group-ns { - display: table-column-group; - } - .swagger-ui .dt--fixed-ns { - table-layout: fixed; - width: 100%; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .dn-m { - display: none; - } - .swagger-ui .di-m { - display: inline; - } - .swagger-ui .db-m { - display: block; - } - .swagger-ui .dib-m { - display: inline-block; - } - .swagger-ui .dit-m { - display: inline-table; - } - .swagger-ui .dt-m { - display: table; - } - .swagger-ui .dtc-m { - display: table-cell; - } - .swagger-ui .dt-row-m { - display: table-row; - } - .swagger-ui .dt-row-group-m { - display: table-row-group; - } - .swagger-ui .dt-column-m { - display: table-column; - } - .swagger-ui .dt-column-group-m { - display: table-column-group; - } - .swagger-ui .dt--fixed-m { - table-layout: fixed; - width: 100%; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .dn-l { - display: none; - } - .swagger-ui .di-l { - display: inline; - } - .swagger-ui .db-l { - display: block; - } - .swagger-ui .dib-l { - display: inline-block; - } - .swagger-ui .dit-l { - display: inline-table; - } - .swagger-ui .dt-l { - display: table; - } - .swagger-ui .dtc-l { - display: table-cell; - } - .swagger-ui .dt-row-l { - display: table-row; - } - .swagger-ui .dt-row-group-l { - display: table-row-group; - } - .swagger-ui .dt-column-l { - display: table-column; - } - .swagger-ui .dt-column-group-l { - display: table-column-group; - } - .swagger-ui .dt--fixed-l { - table-layout: fixed; - width: 100%; - } -} -.swagger-ui .fl { - _display: inline; - float: left; -} -.swagger-ui .fr { - _display: inline; - float: right; -} -.swagger-ui .fn { - float: none; -} -@media screen and (min-width: 30em) { - .swagger-ui .fl-ns { - _display: inline; - float: left; - } - .swagger-ui .fr-ns { - _display: inline; - float: right; - } - .swagger-ui .fn-ns { - float: none; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .fl-m { - _display: inline; - float: left; - } - .swagger-ui .fr-m { - _display: inline; - float: right; - } - .swagger-ui .fn-m { - float: none; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .fl-l { - _display: inline; - float: left; - } - .swagger-ui .fr-l { - _display: inline; - float: right; - } - .swagger-ui .fn-l { - float: none; - } -} -.swagger-ui .sans-serif { - font-family: - -apple-system, - BlinkMacSystemFont, - avenir next, - avenir, - helvetica, - helvetica neue, - ubuntu, - roboto, - noto, - segoe ui, - arial, - sans-serif; -} -.swagger-ui .serif { - font-family: georgia, serif; -} -.swagger-ui .system-sans-serif { - font-family: sans-serif; -} -.swagger-ui .system-serif { - font-family: serif; -} -.swagger-ui .code, -.swagger-ui code { - font-family: Consolas, monaco, monospace; -} -.swagger-ui .courier { - font-family: - Courier Next, - courier, - monospace; -} -.swagger-ui .helvetica { - font-family: - helvetica neue, - helvetica, - sans-serif; -} -.swagger-ui .avenir { - font-family: - avenir next, - avenir, - sans-serif; -} -.swagger-ui .athelas { - font-family: athelas, georgia, serif; -} -.swagger-ui .georgia { - font-family: georgia, serif; -} -.swagger-ui .times { - font-family: times, serif; -} -.swagger-ui .bodoni { - font-family: - Bodoni MT, - serif; -} -.swagger-ui .calisto { - font-family: - Calisto MT, - serif; -} -.swagger-ui .garamond { - font-family: garamond, serif; -} -.swagger-ui .baskerville { - font-family: baskerville, serif; -} -.swagger-ui .i { - font-style: italic; -} -.swagger-ui .fs-normal { - font-style: normal; -} -@media screen and (min-width: 30em) { - .swagger-ui .i-ns { - font-style: italic; - } - .swagger-ui .fs-normal-ns { - font-style: normal; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .i-m { - font-style: italic; - } - .swagger-ui .fs-normal-m { - font-style: normal; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .i-l { - font-style: italic; - } - .swagger-ui .fs-normal-l { - font-style: normal; - } -} -.swagger-ui .normal { - font-weight: 400; -} -.swagger-ui .b { - font-weight: 700; -} -.swagger-ui .fw1 { - font-weight: 100; -} -.swagger-ui .fw2 { - font-weight: 200; -} -.swagger-ui .fw3 { - font-weight: 300; -} -.swagger-ui .fw4 { - font-weight: 400; -} -.swagger-ui .fw5 { - font-weight: 500; -} -.swagger-ui .fw6 { - font-weight: 600; -} -.swagger-ui .fw7 { - font-weight: 700; -} -.swagger-ui .fw8 { - font-weight: 800; -} -.swagger-ui .fw9 { - font-weight: 900; -} -@media screen and (min-width: 30em) { - .swagger-ui .normal-ns { - font-weight: 400; - } - .swagger-ui .b-ns { - font-weight: 700; - } - .swagger-ui .fw1-ns { - font-weight: 100; - } - .swagger-ui .fw2-ns { - font-weight: 200; - } - .swagger-ui .fw3-ns { - font-weight: 300; - } - .swagger-ui .fw4-ns { - font-weight: 400; - } - .swagger-ui .fw5-ns { - font-weight: 500; - } - .swagger-ui .fw6-ns { - font-weight: 600; - } - .swagger-ui .fw7-ns { - font-weight: 700; - } - .swagger-ui .fw8-ns { - font-weight: 800; - } - .swagger-ui .fw9-ns { - font-weight: 900; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .normal-m { - font-weight: 400; - } - .swagger-ui .b-m { - font-weight: 700; - } - .swagger-ui .fw1-m { - font-weight: 100; - } - .swagger-ui .fw2-m { - font-weight: 200; - } - .swagger-ui .fw3-m { - font-weight: 300; - } - .swagger-ui .fw4-m { - font-weight: 400; - } - .swagger-ui .fw5-m { - font-weight: 500; - } - .swagger-ui .fw6-m { - font-weight: 600; - } - .swagger-ui .fw7-m { - font-weight: 700; - } - .swagger-ui .fw8-m { - font-weight: 800; - } - .swagger-ui .fw9-m { - font-weight: 900; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .normal-l { - font-weight: 400; - } - .swagger-ui .b-l { - font-weight: 700; - } - .swagger-ui .fw1-l { - font-weight: 100; - } - .swagger-ui .fw2-l { - font-weight: 200; - } - .swagger-ui .fw3-l { - font-weight: 300; - } - .swagger-ui .fw4-l { - font-weight: 400; - } - .swagger-ui .fw5-l { - font-weight: 500; - } - .swagger-ui .fw6-l { - font-weight: 600; - } - .swagger-ui .fw7-l { - font-weight: 700; - } - .swagger-ui .fw8-l { - font-weight: 800; - } - .swagger-ui .fw9-l { - font-weight: 900; - } -} -.swagger-ui .input-reset { - -webkit-appearance: none; - -moz-appearance: none; -} -.swagger-ui .button-reset::-moz-focus-inner, -.swagger-ui .input-reset::-moz-focus-inner { - border: 0; - padding: 0; -} -.swagger-ui .h1 { - height: 1rem; -} -.swagger-ui .h2 { - height: 2rem; -} -.swagger-ui .h3 { - height: 4rem; -} -.swagger-ui .h4 { - height: 8rem; -} -.swagger-ui .h5 { - height: 16rem; -} -.swagger-ui .h-25 { - height: 25%; -} -.swagger-ui .h-50 { - height: 50%; -} -.swagger-ui .h-75 { - height: 75%; -} -.swagger-ui .h-100 { - height: 100%; -} -.swagger-ui .min-h-100 { - min-height: 100%; -} -.swagger-ui .vh-25 { - height: 25vh; -} -.swagger-ui .vh-50 { - height: 50vh; -} -.swagger-ui .vh-75 { - height: 75vh; -} -.swagger-ui .vh-100 { - height: 100vh; -} -.swagger-ui .min-vh-100 { - min-height: 100vh; -} -.swagger-ui .h-auto { - height: auto; -} -.swagger-ui .h-inherit { - height: inherit; -} -@media screen and (min-width: 30em) { - .swagger-ui .h1-ns { - height: 1rem; - } - .swagger-ui .h2-ns { - height: 2rem; - } - .swagger-ui .h3-ns { - height: 4rem; - } - .swagger-ui .h4-ns { - height: 8rem; - } - .swagger-ui .h5-ns { - height: 16rem; - } - .swagger-ui .h-25-ns { - height: 25%; - } - .swagger-ui .h-50-ns { - height: 50%; - } - .swagger-ui .h-75-ns { - height: 75%; - } - .swagger-ui .h-100-ns { - height: 100%; - } - .swagger-ui .min-h-100-ns { - min-height: 100%; - } - .swagger-ui .vh-25-ns { - height: 25vh; - } - .swagger-ui .vh-50-ns { - height: 50vh; - } - .swagger-ui .vh-75-ns { - height: 75vh; - } - .swagger-ui .vh-100-ns { - height: 100vh; - } - .swagger-ui .min-vh-100-ns { - min-height: 100vh; - } - .swagger-ui .h-auto-ns { - height: auto; - } - .swagger-ui .h-inherit-ns { - height: inherit; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .h1-m { - height: 1rem; - } - .swagger-ui .h2-m { - height: 2rem; - } - .swagger-ui .h3-m { - height: 4rem; - } - .swagger-ui .h4-m { - height: 8rem; - } - .swagger-ui .h5-m { - height: 16rem; - } - .swagger-ui .h-25-m { - height: 25%; - } - .swagger-ui .h-50-m { - height: 50%; - } - .swagger-ui .h-75-m { - height: 75%; - } - .swagger-ui .h-100-m { - height: 100%; - } - .swagger-ui .min-h-100-m { - min-height: 100%; - } - .swagger-ui .vh-25-m { - height: 25vh; - } - .swagger-ui .vh-50-m { - height: 50vh; - } - .swagger-ui .vh-75-m { - height: 75vh; - } - .swagger-ui .vh-100-m { - height: 100vh; - } - .swagger-ui .min-vh-100-m { - min-height: 100vh; - } - .swagger-ui .h-auto-m { - height: auto; - } - .swagger-ui .h-inherit-m { - height: inherit; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .h1-l { - height: 1rem; - } - .swagger-ui .h2-l { - height: 2rem; - } - .swagger-ui .h3-l { - height: 4rem; - } - .swagger-ui .h4-l { - height: 8rem; - } - .swagger-ui .h5-l { - height: 16rem; - } - .swagger-ui .h-25-l { - height: 25%; - } - .swagger-ui .h-50-l { - height: 50%; - } - .swagger-ui .h-75-l { - height: 75%; - } - .swagger-ui .h-100-l { - height: 100%; - } - .swagger-ui .min-h-100-l { - min-height: 100%; - } - .swagger-ui .vh-25-l { - height: 25vh; - } - .swagger-ui .vh-50-l { - height: 50vh; - } - .swagger-ui .vh-75-l { - height: 75vh; - } - .swagger-ui .vh-100-l { - height: 100vh; - } - .swagger-ui .min-vh-100-l { - min-height: 100vh; - } - .swagger-ui .h-auto-l { - height: auto; - } - .swagger-ui .h-inherit-l { - height: inherit; - } -} -.swagger-ui .tracked { - letter-spacing: 0.1em; -} -.swagger-ui .tracked-tight { - letter-spacing: -0.05em; -} -.swagger-ui .tracked-mega { - letter-spacing: 0.25em; -} -@media screen and (min-width: 30em) { - .swagger-ui .tracked-ns { - letter-spacing: 0.1em; - } - .swagger-ui .tracked-tight-ns { - letter-spacing: -0.05em; - } - .swagger-ui .tracked-mega-ns { - letter-spacing: 0.25em; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .tracked-m { - letter-spacing: 0.1em; - } - .swagger-ui .tracked-tight-m { - letter-spacing: -0.05em; - } - .swagger-ui .tracked-mega-m { - letter-spacing: 0.25em; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .tracked-l { - letter-spacing: 0.1em; - } - .swagger-ui .tracked-tight-l { - letter-spacing: -0.05em; - } - .swagger-ui .tracked-mega-l { - letter-spacing: 0.25em; - } -} -.swagger-ui .lh-solid { - line-height: 1; -} -.swagger-ui .lh-title { - line-height: 1.25; -} -.swagger-ui .lh-copy { - line-height: 1.5; -} -@media screen and (min-width: 30em) { - .swagger-ui .lh-solid-ns { - line-height: 1; - } - .swagger-ui .lh-title-ns { - line-height: 1.25; - } - .swagger-ui .lh-copy-ns { - line-height: 1.5; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .lh-solid-m { - line-height: 1; - } - .swagger-ui .lh-title-m { - line-height: 1.25; - } - .swagger-ui .lh-copy-m { - line-height: 1.5; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .lh-solid-l { - line-height: 1; - } - .swagger-ui .lh-title-l { - line-height: 1.25; - } - .swagger-ui .lh-copy-l { - line-height: 1.5; - } -} -.swagger-ui .link { - -webkit-text-decoration: none; - text-decoration: none; -} -.swagger-ui .link, -.swagger-ui .link:active, -.swagger-ui .link:focus, -.swagger-ui .link:hover, -.swagger-ui .link:link, -.swagger-ui .link:visited { - transition: color 0.15s ease-in; -} -.swagger-ui .link:focus { - outline: 1px dotted currentColor; -} -.swagger-ui .list { - list-style-type: none; -} -.swagger-ui .mw-100 { - max-width: 100%; -} -.swagger-ui .mw1 { - max-width: 1rem; -} -.swagger-ui .mw2 { - max-width: 2rem; -} -.swagger-ui .mw3 { - max-width: 4rem; -} -.swagger-ui .mw4 { - max-width: 8rem; -} -.swagger-ui .mw5 { - max-width: 16rem; -} -.swagger-ui .mw6 { - max-width: 32rem; -} -.swagger-ui .mw7 { - max-width: 48rem; -} -.swagger-ui .mw8 { - max-width: 64rem; -} -.swagger-ui .mw9 { - max-width: 96rem; -} -.swagger-ui .mw-none { - max-width: none; -} -@media screen and (min-width: 30em) { - .swagger-ui .mw-100-ns { - max-width: 100%; - } - .swagger-ui .mw1-ns { - max-width: 1rem; - } - .swagger-ui .mw2-ns { - max-width: 2rem; - } - .swagger-ui .mw3-ns { - max-width: 4rem; - } - .swagger-ui .mw4-ns { - max-width: 8rem; - } - .swagger-ui .mw5-ns { - max-width: 16rem; - } - .swagger-ui .mw6-ns { - max-width: 32rem; - } - .swagger-ui .mw7-ns { - max-width: 48rem; - } - .swagger-ui .mw8-ns { - max-width: 64rem; - } - .swagger-ui .mw9-ns { - max-width: 96rem; - } - .swagger-ui .mw-none-ns { - max-width: none; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .mw-100-m { - max-width: 100%; - } - .swagger-ui .mw1-m { - max-width: 1rem; - } - .swagger-ui .mw2-m { - max-width: 2rem; - } - .swagger-ui .mw3-m { - max-width: 4rem; - } - .swagger-ui .mw4-m { - max-width: 8rem; - } - .swagger-ui .mw5-m { - max-width: 16rem; - } - .swagger-ui .mw6-m { - max-width: 32rem; - } - .swagger-ui .mw7-m { - max-width: 48rem; - } - .swagger-ui .mw8-m { - max-width: 64rem; - } - .swagger-ui .mw9-m { - max-width: 96rem; - } - .swagger-ui .mw-none-m { - max-width: none; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .mw-100-l { - max-width: 100%; - } - .swagger-ui .mw1-l { - max-width: 1rem; - } - .swagger-ui .mw2-l { - max-width: 2rem; - } - .swagger-ui .mw3-l { - max-width: 4rem; - } - .swagger-ui .mw4-l { - max-width: 8rem; - } - .swagger-ui .mw5-l { - max-width: 16rem; - } - .swagger-ui .mw6-l { - max-width: 32rem; - } - .swagger-ui .mw7-l { - max-width: 48rem; - } - .swagger-ui .mw8-l { - max-width: 64rem; - } - .swagger-ui .mw9-l { - max-width: 96rem; - } - .swagger-ui .mw-none-l { - max-width: none; - } -} -.swagger-ui .w1 { - width: 1rem; -} -.swagger-ui .w2 { - width: 2rem; -} -.swagger-ui .w3 { - width: 4rem; -} -.swagger-ui .w4 { - width: 8rem; -} -.swagger-ui .w5 { - width: 16rem; -} -.swagger-ui .w-10 { - width: 10%; -} -.swagger-ui .w-20 { - width: 20%; -} -.swagger-ui .w-25 { - width: 25%; -} -.swagger-ui .w-30 { - width: 30%; -} -.swagger-ui .w-33 { - width: 33%; -} -.swagger-ui .w-34 { - width: 34%; -} -.swagger-ui .w-40 { - width: 40%; -} -.swagger-ui .w-50 { - width: 50%; -} -.swagger-ui .w-60 { - width: 60%; -} -.swagger-ui .w-70 { - width: 70%; -} -.swagger-ui .w-75 { - width: 75%; -} -.swagger-ui .w-80 { - width: 80%; -} -.swagger-ui .w-90 { - width: 90%; -} -.swagger-ui .w-100 { - width: 100%; -} -.swagger-ui .w-third { - width: 33.3333333333%; -} -.swagger-ui .w-two-thirds { - width: 66.6666666667%; -} -.swagger-ui .w-auto { - width: auto; -} -@media screen and (min-width: 30em) { - .swagger-ui .w1-ns { - width: 1rem; - } - .swagger-ui .w2-ns { - width: 2rem; - } - .swagger-ui .w3-ns { - width: 4rem; - } - .swagger-ui .w4-ns { - width: 8rem; - } - .swagger-ui .w5-ns { - width: 16rem; - } - .swagger-ui .w-10-ns { - width: 10%; - } - .swagger-ui .w-20-ns { - width: 20%; - } - .swagger-ui .w-25-ns { - width: 25%; - } - .swagger-ui .w-30-ns { - width: 30%; - } - .swagger-ui .w-33-ns { - width: 33%; - } - .swagger-ui .w-34-ns { - width: 34%; - } - .swagger-ui .w-40-ns { - width: 40%; - } - .swagger-ui .w-50-ns { - width: 50%; - } - .swagger-ui .w-60-ns { - width: 60%; - } - .swagger-ui .w-70-ns { - width: 70%; - } - .swagger-ui .w-75-ns { - width: 75%; - } - .swagger-ui .w-80-ns { - width: 80%; - } - .swagger-ui .w-90-ns { - width: 90%; - } - .swagger-ui .w-100-ns { - width: 100%; - } - .swagger-ui .w-third-ns { - width: 33.3333333333%; - } - .swagger-ui .w-two-thirds-ns { - width: 66.6666666667%; - } - .swagger-ui .w-auto-ns { - width: auto; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .w1-m { - width: 1rem; - } - .swagger-ui .w2-m { - width: 2rem; - } - .swagger-ui .w3-m { - width: 4rem; - } - .swagger-ui .w4-m { - width: 8rem; - } - .swagger-ui .w5-m { - width: 16rem; - } - .swagger-ui .w-10-m { - width: 10%; - } - .swagger-ui .w-20-m { - width: 20%; - } - .swagger-ui .w-25-m { - width: 25%; - } - .swagger-ui .w-30-m { - width: 30%; - } - .swagger-ui .w-33-m { - width: 33%; - } - .swagger-ui .w-34-m { - width: 34%; - } - .swagger-ui .w-40-m { - width: 40%; - } - .swagger-ui .w-50-m { - width: 50%; - } - .swagger-ui .w-60-m { - width: 60%; - } - .swagger-ui .w-70-m { - width: 70%; - } - .swagger-ui .w-75-m { - width: 75%; - } - .swagger-ui .w-80-m { - width: 80%; - } - .swagger-ui .w-90-m { - width: 90%; - } - .swagger-ui .w-100-m { - width: 100%; - } - .swagger-ui .w-third-m { - width: 33.3333333333%; - } - .swagger-ui .w-two-thirds-m { - width: 66.6666666667%; - } - .swagger-ui .w-auto-m { - width: auto; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .w1-l { - width: 1rem; - } - .swagger-ui .w2-l { - width: 2rem; - } - .swagger-ui .w3-l { - width: 4rem; - } - .swagger-ui .w4-l { - width: 8rem; - } - .swagger-ui .w5-l { - width: 16rem; - } - .swagger-ui .w-10-l { - width: 10%; - } - .swagger-ui .w-20-l { - width: 20%; - } - .swagger-ui .w-25-l { - width: 25%; - } - .swagger-ui .w-30-l { - width: 30%; - } - .swagger-ui .w-33-l { - width: 33%; - } - .swagger-ui .w-34-l { - width: 34%; - } - .swagger-ui .w-40-l { - width: 40%; - } - .swagger-ui .w-50-l { - width: 50%; - } - .swagger-ui .w-60-l { - width: 60%; - } - .swagger-ui .w-70-l { - width: 70%; - } - .swagger-ui .w-75-l { - width: 75%; - } - .swagger-ui .w-80-l { - width: 80%; - } - .swagger-ui .w-90-l { - width: 90%; - } - .swagger-ui .w-100-l { - width: 100%; - } - .swagger-ui .w-third-l { - width: 33.3333333333%; - } - .swagger-ui .w-two-thirds-l { - width: 66.6666666667%; - } - .swagger-ui .w-auto-l { - width: auto; - } -} -.swagger-ui .overflow-visible { - overflow: visible; -} -.swagger-ui .overflow-hidden { - overflow: hidden; -} -.swagger-ui .overflow-scroll { - overflow: scroll; -} -.swagger-ui .overflow-auto { - overflow: auto; -} -.swagger-ui .overflow-x-visible { - overflow-x: visible; -} -.swagger-ui .overflow-x-hidden { - overflow-x: hidden; -} -.swagger-ui .overflow-x-scroll { - overflow-x: scroll; -} -.swagger-ui .overflow-x-auto { - overflow-x: auto; -} -.swagger-ui .overflow-y-visible { - overflow-y: visible; -} -.swagger-ui .overflow-y-hidden { - overflow-y: hidden; -} -.swagger-ui .overflow-y-scroll { - overflow-y: scroll; -} -.swagger-ui .overflow-y-auto { - overflow-y: auto; -} -@media screen and (min-width: 30em) { - .swagger-ui .overflow-visible-ns { - overflow: visible; - } - .swagger-ui .overflow-hidden-ns { - overflow: hidden; - } - .swagger-ui .overflow-scroll-ns { - overflow: scroll; - } - .swagger-ui .overflow-auto-ns { - overflow: auto; - } - .swagger-ui .overflow-x-visible-ns { - overflow-x: visible; - } - .swagger-ui .overflow-x-hidden-ns { - overflow-x: hidden; - } - .swagger-ui .overflow-x-scroll-ns { - overflow-x: scroll; - } - .swagger-ui .overflow-x-auto-ns { - overflow-x: auto; - } - .swagger-ui .overflow-y-visible-ns { - overflow-y: visible; - } - .swagger-ui .overflow-y-hidden-ns { - overflow-y: hidden; - } - .swagger-ui .overflow-y-scroll-ns { - overflow-y: scroll; - } - .swagger-ui .overflow-y-auto-ns { - overflow-y: auto; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .overflow-visible-m { - overflow: visible; - } - .swagger-ui .overflow-hidden-m { - overflow: hidden; - } - .swagger-ui .overflow-scroll-m { - overflow: scroll; - } - .swagger-ui .overflow-auto-m { - overflow: auto; - } - .swagger-ui .overflow-x-visible-m { - overflow-x: visible; - } - .swagger-ui .overflow-x-hidden-m { - overflow-x: hidden; - } - .swagger-ui .overflow-x-scroll-m { - overflow-x: scroll; - } - .swagger-ui .overflow-x-auto-m { - overflow-x: auto; - } - .swagger-ui .overflow-y-visible-m { - overflow-y: visible; - } - .swagger-ui .overflow-y-hidden-m { - overflow-y: hidden; - } - .swagger-ui .overflow-y-scroll-m { - overflow-y: scroll; - } - .swagger-ui .overflow-y-auto-m { - overflow-y: auto; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .overflow-visible-l { - overflow: visible; - } - .swagger-ui .overflow-hidden-l { - overflow: hidden; - } - .swagger-ui .overflow-scroll-l { - overflow: scroll; - } - .swagger-ui .overflow-auto-l { - overflow: auto; - } - .swagger-ui .overflow-x-visible-l { - overflow-x: visible; - } - .swagger-ui .overflow-x-hidden-l { - overflow-x: hidden; - } - .swagger-ui .overflow-x-scroll-l { - overflow-x: scroll; - } - .swagger-ui .overflow-x-auto-l { - overflow-x: auto; - } - .swagger-ui .overflow-y-visible-l { - overflow-y: visible; - } - .swagger-ui .overflow-y-hidden-l { - overflow-y: hidden; - } - .swagger-ui .overflow-y-scroll-l { - overflow-y: scroll; - } - .swagger-ui .overflow-y-auto-l { - overflow-y: auto; - } -} -.swagger-ui .static { - position: static; -} -.swagger-ui .relative { - position: relative; -} -.swagger-ui .absolute { - position: absolute; -} -.swagger-ui .fixed { - position: fixed; -} -@media screen and (min-width: 30em) { - .swagger-ui .static-ns { - position: static; - } - .swagger-ui .relative-ns { - position: relative; - } - .swagger-ui .absolute-ns { - position: absolute; - } - .swagger-ui .fixed-ns { - position: fixed; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .static-m { - position: static; - } - .swagger-ui .relative-m { - position: relative; - } - .swagger-ui .absolute-m { - position: absolute; - } - .swagger-ui .fixed-m { - position: fixed; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .static-l { - position: static; - } - .swagger-ui .relative-l { - position: relative; - } - .swagger-ui .absolute-l { - position: absolute; - } - .swagger-ui .fixed-l { - position: fixed; - } -} -.swagger-ui .o-100 { - opacity: 1; -} -.swagger-ui .o-90 { - opacity: 0.9; -} -.swagger-ui .o-80 { - opacity: 0.8; -} -.swagger-ui .o-70 { - opacity: 0.7; -} -.swagger-ui .o-60 { - opacity: 0.6; -} -.swagger-ui .o-50 { - opacity: 0.5; -} -.swagger-ui .o-40 { - opacity: 0.4; -} -.swagger-ui .o-30 { - opacity: 0.3; -} -.swagger-ui .o-20 { - opacity: 0.2; -} -.swagger-ui .o-10 { - opacity: 0.1; -} -.swagger-ui .o-05 { - opacity: 0.05; -} -.swagger-ui .o-025 { - opacity: 0.025; -} -.swagger-ui .o-0 { - opacity: 0; -} -.swagger-ui .rotate-45 { - transform: rotate(45deg); -} -.swagger-ui .rotate-90 { - transform: rotate(90deg); -} -.swagger-ui .rotate-135 { - transform: rotate(135deg); -} -.swagger-ui .rotate-180 { - transform: rotate(180deg); -} -.swagger-ui .rotate-225 { - transform: rotate(225deg); -} -.swagger-ui .rotate-270 { - transform: rotate(270deg); -} -.swagger-ui .rotate-315 { - transform: rotate(315deg); -} -@media screen and (min-width: 30em) { - .swagger-ui .rotate-45-ns { - transform: rotate(45deg); - } - .swagger-ui .rotate-90-ns { - transform: rotate(90deg); - } - .swagger-ui .rotate-135-ns { - transform: rotate(135deg); - } - .swagger-ui .rotate-180-ns { - transform: rotate(180deg); - } - .swagger-ui .rotate-225-ns { - transform: rotate(225deg); - } - .swagger-ui .rotate-270-ns { - transform: rotate(270deg); - } - .swagger-ui .rotate-315-ns { - transform: rotate(315deg); - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .rotate-45-m { - transform: rotate(45deg); - } - .swagger-ui .rotate-90-m { - transform: rotate(90deg); - } - .swagger-ui .rotate-135-m { - transform: rotate(135deg); - } - .swagger-ui .rotate-180-m { - transform: rotate(180deg); - } - .swagger-ui .rotate-225-m { - transform: rotate(225deg); - } - .swagger-ui .rotate-270-m { - transform: rotate(270deg); - } - .swagger-ui .rotate-315-m { - transform: rotate(315deg); - } -} -@media screen and (min-width: 60em) { - .swagger-ui .rotate-45-l { - transform: rotate(45deg); - } - .swagger-ui .rotate-90-l { - transform: rotate(90deg); - } - .swagger-ui .rotate-135-l { - transform: rotate(135deg); - } - .swagger-ui .rotate-180-l { - transform: rotate(180deg); - } - .swagger-ui .rotate-225-l { - transform: rotate(225deg); - } - .swagger-ui .rotate-270-l { - transform: rotate(270deg); - } - .swagger-ui .rotate-315-l { - transform: rotate(315deg); - } -} -.swagger-ui .black-90 { - color: rgba(0, 0, 0, 0.9); -} -.swagger-ui .black-80 { - color: rgba(0, 0, 0, 0.8); -} -.swagger-ui .black-70 { - color: rgba(0, 0, 0, 0.7); -} -.swagger-ui .black-60 { - color: rgba(0, 0, 0, 0.6); -} -.swagger-ui .black-50 { - color: rgba(0, 0, 0, 0.5); -} -.swagger-ui .black-40 { - color: rgba(0, 0, 0, 0.4); -} -.swagger-ui .black-30 { - color: rgba(0, 0, 0, 0.3); -} -.swagger-ui .black-20 { - color: rgba(0, 0, 0, 0.2); -} -.swagger-ui .black-10 { - color: rgba(0, 0, 0, 0.1); -} -.swagger-ui .black-05 { - color: rgba(0, 0, 0, 0.05); -} -.swagger-ui .white-90 { - color: hsla(0, 0%, 100%, 0.9); -} -.swagger-ui .white-80 { - color: hsla(0, 0%, 100%, 0.8); -} -.swagger-ui .white-70 { - color: hsla(0, 0%, 100%, 0.7); -} -.swagger-ui .white-60 { - color: hsla(0, 0%, 100%, 0.6); -} -.swagger-ui .white-50 { - color: hsla(0, 0%, 100%, 0.5); -} -.swagger-ui .white-40 { - color: hsla(0, 0%, 100%, 0.4); -} -.swagger-ui .white-30 { - color: hsla(0, 0%, 100%, 0.3); -} -.swagger-ui .white-20 { - color: hsla(0, 0%, 100%, 0.2); -} -.swagger-ui .white-10 { - color: hsla(0, 0%, 100%, 0.1); -} -.swagger-ui .black { - color: #000; -} -.swagger-ui .near-black { - color: #111; -} -.swagger-ui .dark-gray { - color: #333; -} -.swagger-ui .mid-gray { - color: #555; -} -.swagger-ui .gray { - color: #777; -} -.swagger-ui .silver { - color: #999; -} -.swagger-ui .light-silver { - color: #aaa; -} -.swagger-ui .moon-gray { - color: #ccc; -} -.swagger-ui .light-gray { - color: #eee; -} -.swagger-ui .near-white { - color: #f4f4f4; -} -.swagger-ui .white { - color: #fff; -} -.swagger-ui .dark-red { - color: #e7040f; -} -.swagger-ui .red { - color: #ff4136; -} -.swagger-ui .light-red { - color: #ff725c; -} -.swagger-ui .orange { - color: #ff6300; -} -.swagger-ui .gold { - color: #ffb700; -} -.swagger-ui .yellow { - color: gold; -} -.swagger-ui .light-yellow { - color: #fbf1a9; -} -.swagger-ui .purple { - color: #5e2ca5; -} -.swagger-ui .light-purple { - color: #a463f2; -} -.swagger-ui .dark-pink { - color: #d5008f; -} -.swagger-ui .hot-pink { - color: #ff41b4; -} -.swagger-ui .pink { - color: #ff80cc; -} -.swagger-ui .light-pink { - color: #ffa3d7; -} -.swagger-ui .dark-green { - color: #137752; -} -.swagger-ui .green { - color: #19a974; -} -.swagger-ui .light-green { - color: #9eebcf; -} -.swagger-ui .navy { - color: #001b44; -} -.swagger-ui .dark-blue { - color: #00449e; -} -.swagger-ui .blue { - color: #357edd; -} -.swagger-ui .light-blue { - color: #96ccff; -} -.swagger-ui .lightest-blue { - color: #cdecff; -} -.swagger-ui .washed-blue { - color: #f6fffe; -} -.swagger-ui .washed-green { - color: #e8fdf5; -} -.swagger-ui .washed-yellow { - color: #fffceb; -} -.swagger-ui .washed-red { - color: #ffdfdf; -} -.swagger-ui .color-inherit { - color: inherit; -} -.swagger-ui .bg-black-90 { - background-color: rgba(0, 0, 0, 0.9); -} -.swagger-ui .bg-black-80 { - background-color: rgba(0, 0, 0, 0.8); -} -.swagger-ui .bg-black-70 { - background-color: rgba(0, 0, 0, 0.7); -} -.swagger-ui .bg-black-60 { - background-color: rgba(0, 0, 0, 0.6); -} -.swagger-ui .bg-black-50 { - background-color: rgba(0, 0, 0, 0.5); -} -.swagger-ui .bg-black-40 { - background-color: rgba(0, 0, 0, 0.4); -} -.swagger-ui .bg-black-30 { - background-color: rgba(0, 0, 0, 0.3); -} -.swagger-ui .bg-black-20 { - background-color: rgba(0, 0, 0, 0.2); -} -.swagger-ui .bg-black-10 { - background-color: rgba(0, 0, 0, 0.1); -} -.swagger-ui .bg-black-05 { - background-color: rgba(0, 0, 0, 0.05); -} -.swagger-ui .bg-white-90 { - background-color: hsla(0, 0%, 100%, 0.9); -} -.swagger-ui .bg-white-80 { - background-color: hsla(0, 0%, 100%, 0.8); -} -.swagger-ui .bg-white-70 { - background-color: hsla(0, 0%, 100%, 0.7); -} -.swagger-ui .bg-white-60 { - background-color: hsla(0, 0%, 100%, 0.6); -} -.swagger-ui .bg-white-50 { - background-color: hsla(0, 0%, 100%, 0.5); -} -.swagger-ui .bg-white-40 { - background-color: hsla(0, 0%, 100%, 0.4); -} -.swagger-ui .bg-white-30 { - background-color: hsla(0, 0%, 100%, 0.3); -} -.swagger-ui .bg-white-20 { - background-color: hsla(0, 0%, 100%, 0.2); -} -.swagger-ui .bg-white-10 { - background-color: hsla(0, 0%, 100%, 0.1); -} -.swagger-ui .bg-black { - background-color: #000; -} -.swagger-ui .bg-near-black { - background-color: #111; -} -.swagger-ui .bg-dark-gray { - background-color: #333; -} -.swagger-ui .bg-mid-gray { - background-color: #555; -} -.swagger-ui .bg-gray { - background-color: #777; -} -.swagger-ui .bg-silver { - background-color: #999; -} -.swagger-ui .bg-light-silver { - background-color: #aaa; -} -.swagger-ui .bg-moon-gray { - background-color: #ccc; -} -.swagger-ui .bg-light-gray { - background-color: #eee; -} -.swagger-ui .bg-near-white { - background-color: #f4f4f4; -} -.swagger-ui .bg-white { - background-color: #fff; -} -.swagger-ui .bg-transparent { - background-color: transparent; -} -.swagger-ui .bg-dark-red { - background-color: #e7040f; -} -.swagger-ui .bg-red { - background-color: #ff4136; -} -.swagger-ui .bg-light-red { - background-color: #ff725c; -} -.swagger-ui .bg-orange { - background-color: #ff6300; -} -.swagger-ui .bg-gold { - background-color: #ffb700; -} -.swagger-ui .bg-yellow { - background-color: gold; -} -.swagger-ui .bg-light-yellow { - background-color: #fbf1a9; -} -.swagger-ui .bg-purple { - background-color: #5e2ca5; -} -.swagger-ui .bg-light-purple { - background-color: #a463f2; -} -.swagger-ui .bg-dark-pink { - background-color: #d5008f; -} -.swagger-ui .bg-hot-pink { - background-color: #ff41b4; -} -.swagger-ui .bg-pink { - background-color: #ff80cc; -} -.swagger-ui .bg-light-pink { - background-color: #ffa3d7; -} -.swagger-ui .bg-dark-green { - background-color: #137752; -} -.swagger-ui .bg-green { - background-color: #19a974; -} -.swagger-ui .bg-light-green { - background-color: #9eebcf; -} -.swagger-ui .bg-navy { - background-color: #001b44; -} -.swagger-ui .bg-dark-blue { - background-color: #00449e; -} -.swagger-ui .bg-blue { - background-color: #357edd; -} -.swagger-ui .bg-light-blue { - background-color: #96ccff; -} -.swagger-ui .bg-lightest-blue { - background-color: #cdecff; -} -.swagger-ui .bg-washed-blue { - background-color: #f6fffe; -} -.swagger-ui .bg-washed-green { - background-color: #e8fdf5; -} -.swagger-ui .bg-washed-yellow { - background-color: #fffceb; -} -.swagger-ui .bg-washed-red { - background-color: #ffdfdf; -} -.swagger-ui .bg-inherit { - background-color: inherit; -} -.swagger-ui .hover-black:focus, -.swagger-ui .hover-black:hover { - color: #000; -} -.swagger-ui .hover-near-black:focus, -.swagger-ui .hover-near-black:hover { - color: #111; -} -.swagger-ui .hover-dark-gray:focus, -.swagger-ui .hover-dark-gray:hover { - color: #333; -} -.swagger-ui .hover-mid-gray:focus, -.swagger-ui .hover-mid-gray:hover { - color: #555; -} -.swagger-ui .hover-gray:focus, -.swagger-ui .hover-gray:hover { - color: #777; -} -.swagger-ui .hover-silver:focus, -.swagger-ui .hover-silver:hover { - color: #999; -} -.swagger-ui .hover-light-silver:focus, -.swagger-ui .hover-light-silver:hover { - color: #aaa; -} -.swagger-ui .hover-moon-gray:focus, -.swagger-ui .hover-moon-gray:hover { - color: #ccc; -} -.swagger-ui .hover-light-gray:focus, -.swagger-ui .hover-light-gray:hover { - color: #eee; -} -.swagger-ui .hover-near-white:focus, -.swagger-ui .hover-near-white:hover { - color: #f4f4f4; -} -.swagger-ui .hover-white:focus, -.swagger-ui .hover-white:hover { - color: #fff; -} -.swagger-ui .hover-black-90:focus, -.swagger-ui .hover-black-90:hover { - color: rgba(0, 0, 0, 0.9); -} -.swagger-ui .hover-black-80:focus, -.swagger-ui .hover-black-80:hover { - color: rgba(0, 0, 0, 0.8); -} -.swagger-ui .hover-black-70:focus, -.swagger-ui .hover-black-70:hover { - color: rgba(0, 0, 0, 0.7); -} -.swagger-ui .hover-black-60:focus, -.swagger-ui .hover-black-60:hover { - color: rgba(0, 0, 0, 0.6); -} -.swagger-ui .hover-black-50:focus, -.swagger-ui .hover-black-50:hover { - color: rgba(0, 0, 0, 0.5); -} -.swagger-ui .hover-black-40:focus, -.swagger-ui .hover-black-40:hover { - color: rgba(0, 0, 0, 0.4); -} -.swagger-ui .hover-black-30:focus, -.swagger-ui .hover-black-30:hover { - color: rgba(0, 0, 0, 0.3); -} -.swagger-ui .hover-black-20:focus, -.swagger-ui .hover-black-20:hover { - color: rgba(0, 0, 0, 0.2); -} -.swagger-ui .hover-black-10:focus, -.swagger-ui .hover-black-10:hover { - color: rgba(0, 0, 0, 0.1); -} -.swagger-ui .hover-white-90:focus, -.swagger-ui .hover-white-90:hover { - color: hsla(0, 0%, 100%, 0.9); -} -.swagger-ui .hover-white-80:focus, -.swagger-ui .hover-white-80:hover { - color: hsla(0, 0%, 100%, 0.8); -} -.swagger-ui .hover-white-70:focus, -.swagger-ui .hover-white-70:hover { - color: hsla(0, 0%, 100%, 0.7); -} -.swagger-ui .hover-white-60:focus, -.swagger-ui .hover-white-60:hover { - color: hsla(0, 0%, 100%, 0.6); -} -.swagger-ui .hover-white-50:focus, -.swagger-ui .hover-white-50:hover { - color: hsla(0, 0%, 100%, 0.5); -} -.swagger-ui .hover-white-40:focus, -.swagger-ui .hover-white-40:hover { - color: hsla(0, 0%, 100%, 0.4); -} -.swagger-ui .hover-white-30:focus, -.swagger-ui .hover-white-30:hover { - color: hsla(0, 0%, 100%, 0.3); -} -.swagger-ui .hover-white-20:focus, -.swagger-ui .hover-white-20:hover { - color: hsla(0, 0%, 100%, 0.2); -} -.swagger-ui .hover-white-10:focus, -.swagger-ui .hover-white-10:hover { - color: hsla(0, 0%, 100%, 0.1); -} -.swagger-ui .hover-inherit:focus, -.swagger-ui .hover-inherit:hover { - color: inherit; -} -.swagger-ui .hover-bg-black:focus, -.swagger-ui .hover-bg-black:hover { - background-color: #000; -} -.swagger-ui .hover-bg-near-black:focus, -.swagger-ui .hover-bg-near-black:hover { - background-color: #111; -} -.swagger-ui .hover-bg-dark-gray:focus, -.swagger-ui .hover-bg-dark-gray:hover { - background-color: #333; -} -.swagger-ui .hover-bg-mid-gray:focus, -.swagger-ui .hover-bg-mid-gray:hover { - background-color: #555; -} -.swagger-ui .hover-bg-gray:focus, -.swagger-ui .hover-bg-gray:hover { - background-color: #777; -} -.swagger-ui .hover-bg-silver:focus, -.swagger-ui .hover-bg-silver:hover { - background-color: #999; -} -.swagger-ui .hover-bg-light-silver:focus, -.swagger-ui .hover-bg-light-silver:hover { - background-color: #aaa; -} -.swagger-ui .hover-bg-moon-gray:focus, -.swagger-ui .hover-bg-moon-gray:hover { - background-color: #ccc; -} -.swagger-ui .hover-bg-light-gray:focus, -.swagger-ui .hover-bg-light-gray:hover { - background-color: #eee; -} -.swagger-ui .hover-bg-near-white:focus, -.swagger-ui .hover-bg-near-white:hover { - background-color: #f4f4f4; -} -.swagger-ui .hover-bg-white:focus, -.swagger-ui .hover-bg-white:hover { - background-color: #fff; -} -.swagger-ui .hover-bg-transparent:focus, -.swagger-ui .hover-bg-transparent:hover { - background-color: transparent; -} -.swagger-ui .hover-bg-black-90:focus, -.swagger-ui .hover-bg-black-90:hover { - background-color: rgba(0, 0, 0, 0.9); -} -.swagger-ui .hover-bg-black-80:focus, -.swagger-ui .hover-bg-black-80:hover { - background-color: rgba(0, 0, 0, 0.8); -} -.swagger-ui .hover-bg-black-70:focus, -.swagger-ui .hover-bg-black-70:hover { - background-color: rgba(0, 0, 0, 0.7); -} -.swagger-ui .hover-bg-black-60:focus, -.swagger-ui .hover-bg-black-60:hover { - background-color: rgba(0, 0, 0, 0.6); -} -.swagger-ui .hover-bg-black-50:focus, -.swagger-ui .hover-bg-black-50:hover { - background-color: rgba(0, 0, 0, 0.5); -} -.swagger-ui .hover-bg-black-40:focus, -.swagger-ui .hover-bg-black-40:hover { - background-color: rgba(0, 0, 0, 0.4); -} -.swagger-ui .hover-bg-black-30:focus, -.swagger-ui .hover-bg-black-30:hover { - background-color: rgba(0, 0, 0, 0.3); -} -.swagger-ui .hover-bg-black-20:focus, -.swagger-ui .hover-bg-black-20:hover { - background-color: rgba(0, 0, 0, 0.2); -} -.swagger-ui .hover-bg-black-10:focus, -.swagger-ui .hover-bg-black-10:hover { - background-color: rgba(0, 0, 0, 0.1); -} -.swagger-ui .hover-bg-white-90:focus, -.swagger-ui .hover-bg-white-90:hover { - background-color: hsla(0, 0%, 100%, 0.9); -} -.swagger-ui .hover-bg-white-80:focus, -.swagger-ui .hover-bg-white-80:hover { - background-color: hsla(0, 0%, 100%, 0.8); -} -.swagger-ui .hover-bg-white-70:focus, -.swagger-ui .hover-bg-white-70:hover { - background-color: hsla(0, 0%, 100%, 0.7); -} -.swagger-ui .hover-bg-white-60:focus, -.swagger-ui .hover-bg-white-60:hover { - background-color: hsla(0, 0%, 100%, 0.6); -} -.swagger-ui .hover-bg-white-50:focus, -.swagger-ui .hover-bg-white-50:hover { - background-color: hsla(0, 0%, 100%, 0.5); -} -.swagger-ui .hover-bg-white-40:focus, -.swagger-ui .hover-bg-white-40:hover { - background-color: hsla(0, 0%, 100%, 0.4); -} -.swagger-ui .hover-bg-white-30:focus, -.swagger-ui .hover-bg-white-30:hover { - background-color: hsla(0, 0%, 100%, 0.3); -} -.swagger-ui .hover-bg-white-20:focus, -.swagger-ui .hover-bg-white-20:hover { - background-color: hsla(0, 0%, 100%, 0.2); -} -.swagger-ui .hover-bg-white-10:focus, -.swagger-ui .hover-bg-white-10:hover { - background-color: hsla(0, 0%, 100%, 0.1); -} -.swagger-ui .hover-dark-red:focus, -.swagger-ui .hover-dark-red:hover { - color: #e7040f; -} -.swagger-ui .hover-red:focus, -.swagger-ui .hover-red:hover { - color: #ff4136; -} -.swagger-ui .hover-light-red:focus, -.swagger-ui .hover-light-red:hover { - color: #ff725c; -} -.swagger-ui .hover-orange:focus, -.swagger-ui .hover-orange:hover { - color: #ff6300; -} -.swagger-ui .hover-gold:focus, -.swagger-ui .hover-gold:hover { - color: #ffb700; -} -.swagger-ui .hover-yellow:focus, -.swagger-ui .hover-yellow:hover { - color: gold; -} -.swagger-ui .hover-light-yellow:focus, -.swagger-ui .hover-light-yellow:hover { - color: #fbf1a9; -} -.swagger-ui .hover-purple:focus, -.swagger-ui .hover-purple:hover { - color: #5e2ca5; -} -.swagger-ui .hover-light-purple:focus, -.swagger-ui .hover-light-purple:hover { - color: #a463f2; -} -.swagger-ui .hover-dark-pink:focus, -.swagger-ui .hover-dark-pink:hover { - color: #d5008f; -} -.swagger-ui .hover-hot-pink:focus, -.swagger-ui .hover-hot-pink:hover { - color: #ff41b4; -} -.swagger-ui .hover-pink:focus, -.swagger-ui .hover-pink:hover { - color: #ff80cc; -} -.swagger-ui .hover-light-pink:focus, -.swagger-ui .hover-light-pink:hover { - color: #ffa3d7; -} -.swagger-ui .hover-dark-green:focus, -.swagger-ui .hover-dark-green:hover { - color: #137752; -} -.swagger-ui .hover-green:focus, -.swagger-ui .hover-green:hover { - color: #19a974; -} -.swagger-ui .hover-light-green:focus, -.swagger-ui .hover-light-green:hover { - color: #9eebcf; -} -.swagger-ui .hover-navy:focus, -.swagger-ui .hover-navy:hover { - color: #001b44; -} -.swagger-ui .hover-dark-blue:focus, -.swagger-ui .hover-dark-blue:hover { - color: #00449e; -} -.swagger-ui .hover-blue:focus, -.swagger-ui .hover-blue:hover { - color: #357edd; -} -.swagger-ui .hover-light-blue:focus, -.swagger-ui .hover-light-blue:hover { - color: #96ccff; -} -.swagger-ui .hover-lightest-blue:focus, -.swagger-ui .hover-lightest-blue:hover { - color: #cdecff; -} -.swagger-ui .hover-washed-blue:focus, -.swagger-ui .hover-washed-blue:hover { - color: #f6fffe; -} -.swagger-ui .hover-washed-green:focus, -.swagger-ui .hover-washed-green:hover { - color: #e8fdf5; -} -.swagger-ui .hover-washed-yellow:focus, -.swagger-ui .hover-washed-yellow:hover { - color: #fffceb; -} -.swagger-ui .hover-washed-red:focus, -.swagger-ui .hover-washed-red:hover { - color: #ffdfdf; -} -.swagger-ui .hover-bg-dark-red:focus, -.swagger-ui .hover-bg-dark-red:hover { - background-color: #e7040f; -} -.swagger-ui .hover-bg-red:focus, -.swagger-ui .hover-bg-red:hover { - background-color: #ff4136; -} -.swagger-ui .hover-bg-light-red:focus, -.swagger-ui .hover-bg-light-red:hover { - background-color: #ff725c; -} -.swagger-ui .hover-bg-orange:focus, -.swagger-ui .hover-bg-orange:hover { - background-color: #ff6300; -} -.swagger-ui .hover-bg-gold:focus, -.swagger-ui .hover-bg-gold:hover { - background-color: #ffb700; -} -.swagger-ui .hover-bg-yellow:focus, -.swagger-ui .hover-bg-yellow:hover { - background-color: gold; -} -.swagger-ui .hover-bg-light-yellow:focus, -.swagger-ui .hover-bg-light-yellow:hover { - background-color: #fbf1a9; -} -.swagger-ui .hover-bg-purple:focus, -.swagger-ui .hover-bg-purple:hover { - background-color: #5e2ca5; -} -.swagger-ui .hover-bg-light-purple:focus, -.swagger-ui .hover-bg-light-purple:hover { - background-color: #a463f2; -} -.swagger-ui .hover-bg-dark-pink:focus, -.swagger-ui .hover-bg-dark-pink:hover { - background-color: #d5008f; -} -.swagger-ui .hover-bg-hot-pink:focus, -.swagger-ui .hover-bg-hot-pink:hover { - background-color: #ff41b4; -} -.swagger-ui .hover-bg-pink:focus, -.swagger-ui .hover-bg-pink:hover { - background-color: #ff80cc; -} -.swagger-ui .hover-bg-light-pink:focus, -.swagger-ui .hover-bg-light-pink:hover { - background-color: #ffa3d7; -} -.swagger-ui .hover-bg-dark-green:focus, -.swagger-ui .hover-bg-dark-green:hover { - background-color: #137752; -} -.swagger-ui .hover-bg-green:focus, -.swagger-ui .hover-bg-green:hover { - background-color: #19a974; -} -.swagger-ui .hover-bg-light-green:focus, -.swagger-ui .hover-bg-light-green:hover { - background-color: #9eebcf; -} -.swagger-ui .hover-bg-navy:focus, -.swagger-ui .hover-bg-navy:hover { - background-color: #001b44; -} -.swagger-ui .hover-bg-dark-blue:focus, -.swagger-ui .hover-bg-dark-blue:hover { - background-color: #00449e; -} -.swagger-ui .hover-bg-blue:focus, -.swagger-ui .hover-bg-blue:hover { - background-color: #357edd; -} -.swagger-ui .hover-bg-light-blue:focus, -.swagger-ui .hover-bg-light-blue:hover { - background-color: #96ccff; -} -.swagger-ui .hover-bg-lightest-blue:focus, -.swagger-ui .hover-bg-lightest-blue:hover { - background-color: #cdecff; -} -.swagger-ui .hover-bg-washed-blue:focus, -.swagger-ui .hover-bg-washed-blue:hover { - background-color: #f6fffe; -} -.swagger-ui .hover-bg-washed-green:focus, -.swagger-ui .hover-bg-washed-green:hover { - background-color: #e8fdf5; -} -.swagger-ui .hover-bg-washed-yellow:focus, -.swagger-ui .hover-bg-washed-yellow:hover { - background-color: #fffceb; -} -.swagger-ui .hover-bg-washed-red:focus, -.swagger-ui .hover-bg-washed-red:hover { - background-color: #ffdfdf; -} -.swagger-ui .hover-bg-inherit:focus, -.swagger-ui .hover-bg-inherit:hover { - background-color: inherit; -} -.swagger-ui .pa0 { - padding: 0; -} -.swagger-ui .pa1 { - padding: 0.25rem; -} -.swagger-ui .pa2 { - padding: 0.5rem; -} -.swagger-ui .pa3 { - padding: 1rem; -} -.swagger-ui .pa4 { - padding: 2rem; -} -.swagger-ui .pa5 { - padding: 4rem; -} -.swagger-ui .pa6 { - padding: 8rem; -} -.swagger-ui .pa7 { - padding: 16rem; -} -.swagger-ui .pl0 { - padding-left: 0; -} -.swagger-ui .pl1 { - padding-left: 0.25rem; -} -.swagger-ui .pl2 { - padding-left: 0.5rem; -} -.swagger-ui .pl3 { - padding-left: 1rem; -} -.swagger-ui .pl4 { - padding-left: 2rem; -} -.swagger-ui .pl5 { - padding-left: 4rem; -} -.swagger-ui .pl6 { - padding-left: 8rem; -} -.swagger-ui .pl7 { - padding-left: 16rem; -} -.swagger-ui .pr0 { - padding-right: 0; -} -.swagger-ui .pr1 { - padding-right: 0.25rem; -} -.swagger-ui .pr2 { - padding-right: 0.5rem; -} -.swagger-ui .pr3 { - padding-right: 1rem; -} -.swagger-ui .pr4 { - padding-right: 2rem; -} -.swagger-ui .pr5 { - padding-right: 4rem; -} -.swagger-ui .pr6 { - padding-right: 8rem; -} -.swagger-ui .pr7 { - padding-right: 16rem; -} -.swagger-ui .pb0 { - padding-bottom: 0; -} -.swagger-ui .pb1 { - padding-bottom: 0.25rem; -} -.swagger-ui .pb2 { - padding-bottom: 0.5rem; -} -.swagger-ui .pb3 { - padding-bottom: 1rem; -} -.swagger-ui .pb4 { - padding-bottom: 2rem; -} -.swagger-ui .pb5 { - padding-bottom: 4rem; -} -.swagger-ui .pb6 { - padding-bottom: 8rem; -} -.swagger-ui .pb7 { - padding-bottom: 16rem; -} -.swagger-ui .pt0 { - padding-top: 0; -} -.swagger-ui .pt1 { - padding-top: 0.25rem; -} -.swagger-ui .pt2 { - padding-top: 0.5rem; -} -.swagger-ui .pt3 { - padding-top: 1rem; -} -.swagger-ui .pt4 { - padding-top: 2rem; -} -.swagger-ui .pt5 { - padding-top: 4rem; -} -.swagger-ui .pt6 { - padding-top: 8rem; -} -.swagger-ui .pt7 { - padding-top: 16rem; -} -.swagger-ui .pv0 { - padding-bottom: 0; - padding-top: 0; -} -.swagger-ui .pv1 { - padding-bottom: 0.25rem; - padding-top: 0.25rem; -} -.swagger-ui .pv2 { - padding-bottom: 0.5rem; - padding-top: 0.5rem; -} -.swagger-ui .pv3 { - padding-bottom: 1rem; - padding-top: 1rem; -} -.swagger-ui .pv4 { - padding-bottom: 2rem; - padding-top: 2rem; -} -.swagger-ui .pv5 { - padding-bottom: 4rem; - padding-top: 4rem; -} -.swagger-ui .pv6 { - padding-bottom: 8rem; - padding-top: 8rem; -} -.swagger-ui .pv7 { - padding-bottom: 16rem; - padding-top: 16rem; -} -.swagger-ui .ph0 { - padding-left: 0; - padding-right: 0; -} -.swagger-ui .ph1 { - padding-left: 0.25rem; - padding-right: 0.25rem; -} -.swagger-ui .ph2 { - padding-left: 0.5rem; - padding-right: 0.5rem; -} -.swagger-ui .ph3 { - padding-left: 1rem; - padding-right: 1rem; -} -.swagger-ui .ph4 { - padding-left: 2rem; - padding-right: 2rem; -} -.swagger-ui .ph5 { - padding-left: 4rem; - padding-right: 4rem; -} -.swagger-ui .ph6 { - padding-left: 8rem; - padding-right: 8rem; -} -.swagger-ui .ph7 { - padding-left: 16rem; - padding-right: 16rem; -} -.swagger-ui .ma0 { - margin: 0; -} -.swagger-ui .ma1 { - margin: 0.25rem; -} -.swagger-ui .ma2 { - margin: 0.5rem; -} -.swagger-ui .ma3 { - margin: 1rem; -} -.swagger-ui .ma4 { - margin: 2rem; -} -.swagger-ui .ma5 { - margin: 4rem; -} -.swagger-ui .ma6 { - margin: 8rem; -} -.swagger-ui .ma7 { - margin: 16rem; -} -.swagger-ui .ml0 { - margin-left: 0; -} -.swagger-ui .ml1 { - margin-left: 0.25rem; -} -.swagger-ui .ml2 { - margin-left: 0.5rem; -} -.swagger-ui .ml3 { - margin-left: 1rem; -} -.swagger-ui .ml4 { - margin-left: 2rem; -} -.swagger-ui .ml5 { - margin-left: 4rem; -} -.swagger-ui .ml6 { - margin-left: 8rem; -} -.swagger-ui .ml7 { - margin-left: 16rem; -} -.swagger-ui .mr0 { - margin-right: 0; -} -.swagger-ui .mr1 { - margin-right: 0.25rem; -} -.swagger-ui .mr2 { - margin-right: 0.5rem; -} -.swagger-ui .mr3 { - margin-right: 1rem; -} -.swagger-ui .mr4 { - margin-right: 2rem; -} -.swagger-ui .mr5 { - margin-right: 4rem; -} -.swagger-ui .mr6 { - margin-right: 8rem; -} -.swagger-ui .mr7 { - margin-right: 16rem; -} -.swagger-ui .mb0 { - margin-bottom: 0; -} -.swagger-ui .mb1 { - margin-bottom: 0.25rem; -} -.swagger-ui .mb2 { - margin-bottom: 0.5rem; -} -.swagger-ui .mb3 { - margin-bottom: 1rem; -} -.swagger-ui .mb4 { - margin-bottom: 2rem; -} -.swagger-ui .mb5 { - margin-bottom: 4rem; -} -.swagger-ui .mb6 { - margin-bottom: 8rem; -} -.swagger-ui .mb7 { - margin-bottom: 16rem; -} -.swagger-ui .mt0 { - margin-top: 0; -} -.swagger-ui .mt1 { - margin-top: 0.25rem; -} -.swagger-ui .mt2 { - margin-top: 0.5rem; -} -.swagger-ui .mt3 { - margin-top: 1rem; -} -.swagger-ui .mt4 { - margin-top: 2rem; -} -.swagger-ui .mt5 { - margin-top: 4rem; -} -.swagger-ui .mt6 { - margin-top: 8rem; -} -.swagger-ui .mt7 { - margin-top: 16rem; -} -.swagger-ui .mv0 { - margin-bottom: 0; - margin-top: 0; -} -.swagger-ui .mv1 { - margin-bottom: 0.25rem; - margin-top: 0.25rem; -} -.swagger-ui .mv2 { - margin-bottom: 0.5rem; - margin-top: 0.5rem; -} -.swagger-ui .mv3 { - margin-bottom: 1rem; - margin-top: 1rem; -} -.swagger-ui .mv4 { - margin-bottom: 2rem; - margin-top: 2rem; -} -.swagger-ui .mv5 { - margin-bottom: 4rem; - margin-top: 4rem; -} -.swagger-ui .mv6 { - margin-bottom: 8rem; - margin-top: 8rem; -} -.swagger-ui .mv7 { - margin-bottom: 16rem; - margin-top: 16rem; -} -.swagger-ui .mh0 { - margin-left: 0; - margin-right: 0; -} -.swagger-ui .mh1 { - margin-left: 0.25rem; - margin-right: 0.25rem; -} -.swagger-ui .mh2 { - margin-left: 0.5rem; - margin-right: 0.5rem; -} -.swagger-ui .mh3 { - margin-left: 1rem; - margin-right: 1rem; -} -.swagger-ui .mh4 { - margin-left: 2rem; - margin-right: 2rem; -} -.swagger-ui .mh5 { - margin-left: 4rem; - margin-right: 4rem; -} -.swagger-ui .mh6 { - margin-left: 8rem; - margin-right: 8rem; -} -.swagger-ui .mh7 { - margin-left: 16rem; - margin-right: 16rem; -} -@media screen and (min-width: 30em) { - .swagger-ui .pa0-ns { - padding: 0; - } - .swagger-ui .pa1-ns { - padding: 0.25rem; - } - .swagger-ui .pa2-ns { - padding: 0.5rem; - } - .swagger-ui .pa3-ns { - padding: 1rem; - } - .swagger-ui .pa4-ns { - padding: 2rem; - } - .swagger-ui .pa5-ns { - padding: 4rem; - } - .swagger-ui .pa6-ns { - padding: 8rem; - } - .swagger-ui .pa7-ns { - padding: 16rem; - } - .swagger-ui .pl0-ns { - padding-left: 0; - } - .swagger-ui .pl1-ns { - padding-left: 0.25rem; - } - .swagger-ui .pl2-ns { - padding-left: 0.5rem; - } - .swagger-ui .pl3-ns { - padding-left: 1rem; - } - .swagger-ui .pl4-ns { - padding-left: 2rem; - } - .swagger-ui .pl5-ns { - padding-left: 4rem; - } - .swagger-ui .pl6-ns { - padding-left: 8rem; - } - .swagger-ui .pl7-ns { - padding-left: 16rem; - } - .swagger-ui .pr0-ns { - padding-right: 0; - } - .swagger-ui .pr1-ns { - padding-right: 0.25rem; - } - .swagger-ui .pr2-ns { - padding-right: 0.5rem; - } - .swagger-ui .pr3-ns { - padding-right: 1rem; - } - .swagger-ui .pr4-ns { - padding-right: 2rem; - } - .swagger-ui .pr5-ns { - padding-right: 4rem; - } - .swagger-ui .pr6-ns { - padding-right: 8rem; - } - .swagger-ui .pr7-ns { - padding-right: 16rem; - } - .swagger-ui .pb0-ns { - padding-bottom: 0; - } - .swagger-ui .pb1-ns { - padding-bottom: 0.25rem; - } - .swagger-ui .pb2-ns { - padding-bottom: 0.5rem; - } - .swagger-ui .pb3-ns { - padding-bottom: 1rem; - } - .swagger-ui .pb4-ns { - padding-bottom: 2rem; - } - .swagger-ui .pb5-ns { - padding-bottom: 4rem; - } - .swagger-ui .pb6-ns { - padding-bottom: 8rem; - } - .swagger-ui .pb7-ns { - padding-bottom: 16rem; - } - .swagger-ui .pt0-ns { - padding-top: 0; - } - .swagger-ui .pt1-ns { - padding-top: 0.25rem; - } - .swagger-ui .pt2-ns { - padding-top: 0.5rem; - } - .swagger-ui .pt3-ns { - padding-top: 1rem; - } - .swagger-ui .pt4-ns { - padding-top: 2rem; - } - .swagger-ui .pt5-ns { - padding-top: 4rem; - } - .swagger-ui .pt6-ns { - padding-top: 8rem; - } - .swagger-ui .pt7-ns { - padding-top: 16rem; - } - .swagger-ui .pv0-ns { - padding-bottom: 0; - padding-top: 0; - } - .swagger-ui .pv1-ns { - padding-bottom: 0.25rem; - padding-top: 0.25rem; - } - .swagger-ui .pv2-ns { - padding-bottom: 0.5rem; - padding-top: 0.5rem; - } - .swagger-ui .pv3-ns { - padding-bottom: 1rem; - padding-top: 1rem; - } - .swagger-ui .pv4-ns { - padding-bottom: 2rem; - padding-top: 2rem; - } - .swagger-ui .pv5-ns { - padding-bottom: 4rem; - padding-top: 4rem; - } - .swagger-ui .pv6-ns { - padding-bottom: 8rem; - padding-top: 8rem; - } - .swagger-ui .pv7-ns { - padding-bottom: 16rem; - padding-top: 16rem; - } - .swagger-ui .ph0-ns { - padding-left: 0; - padding-right: 0; - } - .swagger-ui .ph1-ns { - padding-left: 0.25rem; - padding-right: 0.25rem; - } - .swagger-ui .ph2-ns { - padding-left: 0.5rem; - padding-right: 0.5rem; - } - .swagger-ui .ph3-ns { - padding-left: 1rem; - padding-right: 1rem; - } - .swagger-ui .ph4-ns { - padding-left: 2rem; - padding-right: 2rem; - } - .swagger-ui .ph5-ns { - padding-left: 4rem; - padding-right: 4rem; - } - .swagger-ui .ph6-ns { - padding-left: 8rem; - padding-right: 8rem; - } - .swagger-ui .ph7-ns { - padding-left: 16rem; - padding-right: 16rem; - } - .swagger-ui .ma0-ns { - margin: 0; - } - .swagger-ui .ma1-ns { - margin: 0.25rem; - } - .swagger-ui .ma2-ns { - margin: 0.5rem; - } - .swagger-ui .ma3-ns { - margin: 1rem; - } - .swagger-ui .ma4-ns { - margin: 2rem; - } - .swagger-ui .ma5-ns { - margin: 4rem; - } - .swagger-ui .ma6-ns { - margin: 8rem; - } - .swagger-ui .ma7-ns { - margin: 16rem; - } - .swagger-ui .ml0-ns { - margin-left: 0; - } - .swagger-ui .ml1-ns { - margin-left: 0.25rem; - } - .swagger-ui .ml2-ns { - margin-left: 0.5rem; - } - .swagger-ui .ml3-ns { - margin-left: 1rem; - } - .swagger-ui .ml4-ns { - margin-left: 2rem; - } - .swagger-ui .ml5-ns { - margin-left: 4rem; - } - .swagger-ui .ml6-ns { - margin-left: 8rem; - } - .swagger-ui .ml7-ns { - margin-left: 16rem; - } - .swagger-ui .mr0-ns { - margin-right: 0; - } - .swagger-ui .mr1-ns { - margin-right: 0.25rem; - } - .swagger-ui .mr2-ns { - margin-right: 0.5rem; - } - .swagger-ui .mr3-ns { - margin-right: 1rem; - } - .swagger-ui .mr4-ns { - margin-right: 2rem; - } - .swagger-ui .mr5-ns { - margin-right: 4rem; - } - .swagger-ui .mr6-ns { - margin-right: 8rem; - } - .swagger-ui .mr7-ns { - margin-right: 16rem; - } - .swagger-ui .mb0-ns { - margin-bottom: 0; - } - .swagger-ui .mb1-ns { - margin-bottom: 0.25rem; - } - .swagger-ui .mb2-ns { - margin-bottom: 0.5rem; - } - .swagger-ui .mb3-ns { - margin-bottom: 1rem; - } - .swagger-ui .mb4-ns { - margin-bottom: 2rem; - } - .swagger-ui .mb5-ns { - margin-bottom: 4rem; - } - .swagger-ui .mb6-ns { - margin-bottom: 8rem; - } - .swagger-ui .mb7-ns { - margin-bottom: 16rem; - } - .swagger-ui .mt0-ns { - margin-top: 0; - } - .swagger-ui .mt1-ns { - margin-top: 0.25rem; - } - .swagger-ui .mt2-ns { - margin-top: 0.5rem; - } - .swagger-ui .mt3-ns { - margin-top: 1rem; - } - .swagger-ui .mt4-ns { - margin-top: 2rem; - } - .swagger-ui .mt5-ns { - margin-top: 4rem; - } - .swagger-ui .mt6-ns { - margin-top: 8rem; - } - .swagger-ui .mt7-ns { - margin-top: 16rem; - } - .swagger-ui .mv0-ns { - margin-bottom: 0; - margin-top: 0; - } - .swagger-ui .mv1-ns { - margin-bottom: 0.25rem; - margin-top: 0.25rem; - } - .swagger-ui .mv2-ns { - margin-bottom: 0.5rem; - margin-top: 0.5rem; - } - .swagger-ui .mv3-ns { - margin-bottom: 1rem; - margin-top: 1rem; - } - .swagger-ui .mv4-ns { - margin-bottom: 2rem; - margin-top: 2rem; - } - .swagger-ui .mv5-ns { - margin-bottom: 4rem; - margin-top: 4rem; - } - .swagger-ui .mv6-ns { - margin-bottom: 8rem; - margin-top: 8rem; - } - .swagger-ui .mv7-ns { - margin-bottom: 16rem; - margin-top: 16rem; - } - .swagger-ui .mh0-ns { - margin-left: 0; - margin-right: 0; - } - .swagger-ui .mh1-ns { - margin-left: 0.25rem; - margin-right: 0.25rem; - } - .swagger-ui .mh2-ns { - margin-left: 0.5rem; - margin-right: 0.5rem; - } - .swagger-ui .mh3-ns { - margin-left: 1rem; - margin-right: 1rem; - } - .swagger-ui .mh4-ns { - margin-left: 2rem; - margin-right: 2rem; - } - .swagger-ui .mh5-ns { - margin-left: 4rem; - margin-right: 4rem; - } - .swagger-ui .mh6-ns { - margin-left: 8rem; - margin-right: 8rem; - } - .swagger-ui .mh7-ns { - margin-left: 16rem; - margin-right: 16rem; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .pa0-m { - padding: 0; - } - .swagger-ui .pa1-m { - padding: 0.25rem; - } - .swagger-ui .pa2-m { - padding: 0.5rem; - } - .swagger-ui .pa3-m { - padding: 1rem; - } - .swagger-ui .pa4-m { - padding: 2rem; - } - .swagger-ui .pa5-m { - padding: 4rem; - } - .swagger-ui .pa6-m { - padding: 8rem; - } - .swagger-ui .pa7-m { - padding: 16rem; - } - .swagger-ui .pl0-m { - padding-left: 0; - } - .swagger-ui .pl1-m { - padding-left: 0.25rem; - } - .swagger-ui .pl2-m { - padding-left: 0.5rem; - } - .swagger-ui .pl3-m { - padding-left: 1rem; - } - .swagger-ui .pl4-m { - padding-left: 2rem; - } - .swagger-ui .pl5-m { - padding-left: 4rem; - } - .swagger-ui .pl6-m { - padding-left: 8rem; - } - .swagger-ui .pl7-m { - padding-left: 16rem; - } - .swagger-ui .pr0-m { - padding-right: 0; - } - .swagger-ui .pr1-m { - padding-right: 0.25rem; - } - .swagger-ui .pr2-m { - padding-right: 0.5rem; - } - .swagger-ui .pr3-m { - padding-right: 1rem; - } - .swagger-ui .pr4-m { - padding-right: 2rem; - } - .swagger-ui .pr5-m { - padding-right: 4rem; - } - .swagger-ui .pr6-m { - padding-right: 8rem; - } - .swagger-ui .pr7-m { - padding-right: 16rem; - } - .swagger-ui .pb0-m { - padding-bottom: 0; - } - .swagger-ui .pb1-m { - padding-bottom: 0.25rem; - } - .swagger-ui .pb2-m { - padding-bottom: 0.5rem; - } - .swagger-ui .pb3-m { - padding-bottom: 1rem; - } - .swagger-ui .pb4-m { - padding-bottom: 2rem; - } - .swagger-ui .pb5-m { - padding-bottom: 4rem; - } - .swagger-ui .pb6-m { - padding-bottom: 8rem; - } - .swagger-ui .pb7-m { - padding-bottom: 16rem; - } - .swagger-ui .pt0-m { - padding-top: 0; - } - .swagger-ui .pt1-m { - padding-top: 0.25rem; - } - .swagger-ui .pt2-m { - padding-top: 0.5rem; - } - .swagger-ui .pt3-m { - padding-top: 1rem; - } - .swagger-ui .pt4-m { - padding-top: 2rem; - } - .swagger-ui .pt5-m { - padding-top: 4rem; - } - .swagger-ui .pt6-m { - padding-top: 8rem; - } - .swagger-ui .pt7-m { - padding-top: 16rem; - } - .swagger-ui .pv0-m { - padding-bottom: 0; - padding-top: 0; - } - .swagger-ui .pv1-m { - padding-bottom: 0.25rem; - padding-top: 0.25rem; - } - .swagger-ui .pv2-m { - padding-bottom: 0.5rem; - padding-top: 0.5rem; - } - .swagger-ui .pv3-m { - padding-bottom: 1rem; - padding-top: 1rem; - } - .swagger-ui .pv4-m { - padding-bottom: 2rem; - padding-top: 2rem; - } - .swagger-ui .pv5-m { - padding-bottom: 4rem; - padding-top: 4rem; - } - .swagger-ui .pv6-m { - padding-bottom: 8rem; - padding-top: 8rem; - } - .swagger-ui .pv7-m { - padding-bottom: 16rem; - padding-top: 16rem; - } - .swagger-ui .ph0-m { - padding-left: 0; - padding-right: 0; - } - .swagger-ui .ph1-m { - padding-left: 0.25rem; - padding-right: 0.25rem; - } - .swagger-ui .ph2-m { - padding-left: 0.5rem; - padding-right: 0.5rem; - } - .swagger-ui .ph3-m { - padding-left: 1rem; - padding-right: 1rem; - } - .swagger-ui .ph4-m { - padding-left: 2rem; - padding-right: 2rem; - } - .swagger-ui .ph5-m { - padding-left: 4rem; - padding-right: 4rem; - } - .swagger-ui .ph6-m { - padding-left: 8rem; - padding-right: 8rem; - } - .swagger-ui .ph7-m { - padding-left: 16rem; - padding-right: 16rem; - } - .swagger-ui .ma0-m { - margin: 0; - } - .swagger-ui .ma1-m { - margin: 0.25rem; - } - .swagger-ui .ma2-m { - margin: 0.5rem; - } - .swagger-ui .ma3-m { - margin: 1rem; - } - .swagger-ui .ma4-m { - margin: 2rem; - } - .swagger-ui .ma5-m { - margin: 4rem; - } - .swagger-ui .ma6-m { - margin: 8rem; - } - .swagger-ui .ma7-m { - margin: 16rem; - } - .swagger-ui .ml0-m { - margin-left: 0; - } - .swagger-ui .ml1-m { - margin-left: 0.25rem; - } - .swagger-ui .ml2-m { - margin-left: 0.5rem; - } - .swagger-ui .ml3-m { - margin-left: 1rem; - } - .swagger-ui .ml4-m { - margin-left: 2rem; - } - .swagger-ui .ml5-m { - margin-left: 4rem; - } - .swagger-ui .ml6-m { - margin-left: 8rem; - } - .swagger-ui .ml7-m { - margin-left: 16rem; - } - .swagger-ui .mr0-m { - margin-right: 0; - } - .swagger-ui .mr1-m { - margin-right: 0.25rem; - } - .swagger-ui .mr2-m { - margin-right: 0.5rem; - } - .swagger-ui .mr3-m { - margin-right: 1rem; - } - .swagger-ui .mr4-m { - margin-right: 2rem; - } - .swagger-ui .mr5-m { - margin-right: 4rem; - } - .swagger-ui .mr6-m { - margin-right: 8rem; - } - .swagger-ui .mr7-m { - margin-right: 16rem; - } - .swagger-ui .mb0-m { - margin-bottom: 0; - } - .swagger-ui .mb1-m { - margin-bottom: 0.25rem; - } - .swagger-ui .mb2-m { - margin-bottom: 0.5rem; - } - .swagger-ui .mb3-m { - margin-bottom: 1rem; - } - .swagger-ui .mb4-m { - margin-bottom: 2rem; - } - .swagger-ui .mb5-m { - margin-bottom: 4rem; - } - .swagger-ui .mb6-m { - margin-bottom: 8rem; - } - .swagger-ui .mb7-m { - margin-bottom: 16rem; - } - .swagger-ui .mt0-m { - margin-top: 0; - } - .swagger-ui .mt1-m { - margin-top: 0.25rem; - } - .swagger-ui .mt2-m { - margin-top: 0.5rem; - } - .swagger-ui .mt3-m { - margin-top: 1rem; - } - .swagger-ui .mt4-m { - margin-top: 2rem; - } - .swagger-ui .mt5-m { - margin-top: 4rem; - } - .swagger-ui .mt6-m { - margin-top: 8rem; - } - .swagger-ui .mt7-m { - margin-top: 16rem; - } - .swagger-ui .mv0-m { - margin-bottom: 0; - margin-top: 0; - } - .swagger-ui .mv1-m { - margin-bottom: 0.25rem; - margin-top: 0.25rem; - } - .swagger-ui .mv2-m { - margin-bottom: 0.5rem; - margin-top: 0.5rem; - } - .swagger-ui .mv3-m { - margin-bottom: 1rem; - margin-top: 1rem; - } - .swagger-ui .mv4-m { - margin-bottom: 2rem; - margin-top: 2rem; - } - .swagger-ui .mv5-m { - margin-bottom: 4rem; - margin-top: 4rem; - } - .swagger-ui .mv6-m { - margin-bottom: 8rem; - margin-top: 8rem; - } - .swagger-ui .mv7-m { - margin-bottom: 16rem; - margin-top: 16rem; - } - .swagger-ui .mh0-m { - margin-left: 0; - margin-right: 0; - } - .swagger-ui .mh1-m { - margin-left: 0.25rem; - margin-right: 0.25rem; - } - .swagger-ui .mh2-m { - margin-left: 0.5rem; - margin-right: 0.5rem; - } - .swagger-ui .mh3-m { - margin-left: 1rem; - margin-right: 1rem; - } - .swagger-ui .mh4-m { - margin-left: 2rem; - margin-right: 2rem; - } - .swagger-ui .mh5-m { - margin-left: 4rem; - margin-right: 4rem; - } - .swagger-ui .mh6-m { - margin-left: 8rem; - margin-right: 8rem; - } - .swagger-ui .mh7-m { - margin-left: 16rem; - margin-right: 16rem; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .pa0-l { - padding: 0; - } - .swagger-ui .pa1-l { - padding: 0.25rem; - } - .swagger-ui .pa2-l { - padding: 0.5rem; - } - .swagger-ui .pa3-l { - padding: 1rem; - } - .swagger-ui .pa4-l { - padding: 2rem; - } - .swagger-ui .pa5-l { - padding: 4rem; - } - .swagger-ui .pa6-l { - padding: 8rem; - } - .swagger-ui .pa7-l { - padding: 16rem; - } - .swagger-ui .pl0-l { - padding-left: 0; - } - .swagger-ui .pl1-l { - padding-left: 0.25rem; - } - .swagger-ui .pl2-l { - padding-left: 0.5rem; - } - .swagger-ui .pl3-l { - padding-left: 1rem; - } - .swagger-ui .pl4-l { - padding-left: 2rem; - } - .swagger-ui .pl5-l { - padding-left: 4rem; - } - .swagger-ui .pl6-l { - padding-left: 8rem; - } - .swagger-ui .pl7-l { - padding-left: 16rem; - } - .swagger-ui .pr0-l { - padding-right: 0; - } - .swagger-ui .pr1-l { - padding-right: 0.25rem; - } - .swagger-ui .pr2-l { - padding-right: 0.5rem; - } - .swagger-ui .pr3-l { - padding-right: 1rem; - } - .swagger-ui .pr4-l { - padding-right: 2rem; - } - .swagger-ui .pr5-l { - padding-right: 4rem; - } - .swagger-ui .pr6-l { - padding-right: 8rem; - } - .swagger-ui .pr7-l { - padding-right: 16rem; - } - .swagger-ui .pb0-l { - padding-bottom: 0; - } - .swagger-ui .pb1-l { - padding-bottom: 0.25rem; - } - .swagger-ui .pb2-l { - padding-bottom: 0.5rem; - } - .swagger-ui .pb3-l { - padding-bottom: 1rem; - } - .swagger-ui .pb4-l { - padding-bottom: 2rem; - } - .swagger-ui .pb5-l { - padding-bottom: 4rem; - } - .swagger-ui .pb6-l { - padding-bottom: 8rem; - } - .swagger-ui .pb7-l { - padding-bottom: 16rem; - } - .swagger-ui .pt0-l { - padding-top: 0; - } - .swagger-ui .pt1-l { - padding-top: 0.25rem; - } - .swagger-ui .pt2-l { - padding-top: 0.5rem; - } - .swagger-ui .pt3-l { - padding-top: 1rem; - } - .swagger-ui .pt4-l { - padding-top: 2rem; - } - .swagger-ui .pt5-l { - padding-top: 4rem; - } - .swagger-ui .pt6-l { - padding-top: 8rem; - } - .swagger-ui .pt7-l { - padding-top: 16rem; - } - .swagger-ui .pv0-l { - padding-bottom: 0; - padding-top: 0; - } - .swagger-ui .pv1-l { - padding-bottom: 0.25rem; - padding-top: 0.25rem; - } - .swagger-ui .pv2-l { - padding-bottom: 0.5rem; - padding-top: 0.5rem; - } - .swagger-ui .pv3-l { - padding-bottom: 1rem; - padding-top: 1rem; - } - .swagger-ui .pv4-l { - padding-bottom: 2rem; - padding-top: 2rem; - } - .swagger-ui .pv5-l { - padding-bottom: 4rem; - padding-top: 4rem; - } - .swagger-ui .pv6-l { - padding-bottom: 8rem; - padding-top: 8rem; - } - .swagger-ui .pv7-l { - padding-bottom: 16rem; - padding-top: 16rem; - } - .swagger-ui .ph0-l { - padding-left: 0; - padding-right: 0; - } - .swagger-ui .ph1-l { - padding-left: 0.25rem; - padding-right: 0.25rem; - } - .swagger-ui .ph2-l { - padding-left: 0.5rem; - padding-right: 0.5rem; - } - .swagger-ui .ph3-l { - padding-left: 1rem; - padding-right: 1rem; - } - .swagger-ui .ph4-l { - padding-left: 2rem; - padding-right: 2rem; - } - .swagger-ui .ph5-l { - padding-left: 4rem; - padding-right: 4rem; - } - .swagger-ui .ph6-l { - padding-left: 8rem; - padding-right: 8rem; - } - .swagger-ui .ph7-l { - padding-left: 16rem; - padding-right: 16rem; - } - .swagger-ui .ma0-l { - margin: 0; - } - .swagger-ui .ma1-l { - margin: 0.25rem; - } - .swagger-ui .ma2-l { - margin: 0.5rem; - } - .swagger-ui .ma3-l { - margin: 1rem; - } - .swagger-ui .ma4-l { - margin: 2rem; - } - .swagger-ui .ma5-l { - margin: 4rem; - } - .swagger-ui .ma6-l { - margin: 8rem; - } - .swagger-ui .ma7-l { - margin: 16rem; - } - .swagger-ui .ml0-l { - margin-left: 0; - } - .swagger-ui .ml1-l { - margin-left: 0.25rem; - } - .swagger-ui .ml2-l { - margin-left: 0.5rem; - } - .swagger-ui .ml3-l { - margin-left: 1rem; - } - .swagger-ui .ml4-l { - margin-left: 2rem; - } - .swagger-ui .ml5-l { - margin-left: 4rem; - } - .swagger-ui .ml6-l { - margin-left: 8rem; - } - .swagger-ui .ml7-l { - margin-left: 16rem; - } - .swagger-ui .mr0-l { - margin-right: 0; - } - .swagger-ui .mr1-l { - margin-right: 0.25rem; - } - .swagger-ui .mr2-l { - margin-right: 0.5rem; - } - .swagger-ui .mr3-l { - margin-right: 1rem; - } - .swagger-ui .mr4-l { - margin-right: 2rem; - } - .swagger-ui .mr5-l { - margin-right: 4rem; - } - .swagger-ui .mr6-l { - margin-right: 8rem; - } - .swagger-ui .mr7-l { - margin-right: 16rem; - } - .swagger-ui .mb0-l { - margin-bottom: 0; - } - .swagger-ui .mb1-l { - margin-bottom: 0.25rem; - } - .swagger-ui .mb2-l { - margin-bottom: 0.5rem; - } - .swagger-ui .mb3-l { - margin-bottom: 1rem; - } - .swagger-ui .mb4-l { - margin-bottom: 2rem; - } - .swagger-ui .mb5-l { - margin-bottom: 4rem; - } - .swagger-ui .mb6-l { - margin-bottom: 8rem; - } - .swagger-ui .mb7-l { - margin-bottom: 16rem; - } - .swagger-ui .mt0-l { - margin-top: 0; - } - .swagger-ui .mt1-l { - margin-top: 0.25rem; - } - .swagger-ui .mt2-l { - margin-top: 0.5rem; - } - .swagger-ui .mt3-l { - margin-top: 1rem; - } - .swagger-ui .mt4-l { - margin-top: 2rem; - } - .swagger-ui .mt5-l { - margin-top: 4rem; - } - .swagger-ui .mt6-l { - margin-top: 8rem; - } - .swagger-ui .mt7-l { - margin-top: 16rem; - } - .swagger-ui .mv0-l { - margin-bottom: 0; - margin-top: 0; - } - .swagger-ui .mv1-l { - margin-bottom: 0.25rem; - margin-top: 0.25rem; - } - .swagger-ui .mv2-l { - margin-bottom: 0.5rem; - margin-top: 0.5rem; - } - .swagger-ui .mv3-l { - margin-bottom: 1rem; - margin-top: 1rem; - } - .swagger-ui .mv4-l { - margin-bottom: 2rem; - margin-top: 2rem; - } - .swagger-ui .mv5-l { - margin-bottom: 4rem; - margin-top: 4rem; - } - .swagger-ui .mv6-l { - margin-bottom: 8rem; - margin-top: 8rem; - } - .swagger-ui .mv7-l { - margin-bottom: 16rem; - margin-top: 16rem; - } - .swagger-ui .mh0-l { - margin-left: 0; - margin-right: 0; - } - .swagger-ui .mh1-l { - margin-left: 0.25rem; - margin-right: 0.25rem; - } - .swagger-ui .mh2-l { - margin-left: 0.5rem; - margin-right: 0.5rem; - } - .swagger-ui .mh3-l { - margin-left: 1rem; - margin-right: 1rem; - } - .swagger-ui .mh4-l { - margin-left: 2rem; - margin-right: 2rem; - } - .swagger-ui .mh5-l { - margin-left: 4rem; - margin-right: 4rem; - } - .swagger-ui .mh6-l { - margin-left: 8rem; - margin-right: 8rem; - } - .swagger-ui .mh7-l { - margin-left: 16rem; - margin-right: 16rem; - } -} -.swagger-ui .na1 { - margin: -0.25rem; -} -.swagger-ui .na2 { - margin: -0.5rem; -} -.swagger-ui .na3 { - margin: -1rem; -} -.swagger-ui .na4 { - margin: -2rem; -} -.swagger-ui .na5 { - margin: -4rem; -} -.swagger-ui .na6 { - margin: -8rem; -} -.swagger-ui .na7 { - margin: -16rem; -} -.swagger-ui .nl1 { - margin-left: -0.25rem; -} -.swagger-ui .nl2 { - margin-left: -0.5rem; -} -.swagger-ui .nl3 { - margin-left: -1rem; -} -.swagger-ui .nl4 { - margin-left: -2rem; -} -.swagger-ui .nl5 { - margin-left: -4rem; -} -.swagger-ui .nl6 { - margin-left: -8rem; -} -.swagger-ui .nl7 { - margin-left: -16rem; -} -.swagger-ui .nr1 { - margin-right: -0.25rem; -} -.swagger-ui .nr2 { - margin-right: -0.5rem; -} -.swagger-ui .nr3 { - margin-right: -1rem; -} -.swagger-ui .nr4 { - margin-right: -2rem; -} -.swagger-ui .nr5 { - margin-right: -4rem; -} -.swagger-ui .nr6 { - margin-right: -8rem; -} -.swagger-ui .nr7 { - margin-right: -16rem; -} -.swagger-ui .nb1 { - margin-bottom: -0.25rem; -} -.swagger-ui .nb2 { - margin-bottom: -0.5rem; -} -.swagger-ui .nb3 { - margin-bottom: -1rem; -} -.swagger-ui .nb4 { - margin-bottom: -2rem; -} -.swagger-ui .nb5 { - margin-bottom: -4rem; -} -.swagger-ui .nb6 { - margin-bottom: -8rem; -} -.swagger-ui .nb7 { - margin-bottom: -16rem; -} -.swagger-ui .nt1 { - margin-top: -0.25rem; -} -.swagger-ui .nt2 { - margin-top: -0.5rem; -} -.swagger-ui .nt3 { - margin-top: -1rem; -} -.swagger-ui .nt4 { - margin-top: -2rem; -} -.swagger-ui .nt5 { - margin-top: -4rem; -} -.swagger-ui .nt6 { - margin-top: -8rem; -} -.swagger-ui .nt7 { - margin-top: -16rem; -} -@media screen and (min-width: 30em) { - .swagger-ui .na1-ns { - margin: -0.25rem; - } - .swagger-ui .na2-ns { - margin: -0.5rem; - } - .swagger-ui .na3-ns { - margin: -1rem; - } - .swagger-ui .na4-ns { - margin: -2rem; - } - .swagger-ui .na5-ns { - margin: -4rem; - } - .swagger-ui .na6-ns { - margin: -8rem; - } - .swagger-ui .na7-ns { - margin: -16rem; - } - .swagger-ui .nl1-ns { - margin-left: -0.25rem; - } - .swagger-ui .nl2-ns { - margin-left: -0.5rem; - } - .swagger-ui .nl3-ns { - margin-left: -1rem; - } - .swagger-ui .nl4-ns { - margin-left: -2rem; - } - .swagger-ui .nl5-ns { - margin-left: -4rem; - } - .swagger-ui .nl6-ns { - margin-left: -8rem; - } - .swagger-ui .nl7-ns { - margin-left: -16rem; - } - .swagger-ui .nr1-ns { - margin-right: -0.25rem; - } - .swagger-ui .nr2-ns { - margin-right: -0.5rem; - } - .swagger-ui .nr3-ns { - margin-right: -1rem; - } - .swagger-ui .nr4-ns { - margin-right: -2rem; - } - .swagger-ui .nr5-ns { - margin-right: -4rem; - } - .swagger-ui .nr6-ns { - margin-right: -8rem; - } - .swagger-ui .nr7-ns { - margin-right: -16rem; - } - .swagger-ui .nb1-ns { - margin-bottom: -0.25rem; - } - .swagger-ui .nb2-ns { - margin-bottom: -0.5rem; - } - .swagger-ui .nb3-ns { - margin-bottom: -1rem; - } - .swagger-ui .nb4-ns { - margin-bottom: -2rem; - } - .swagger-ui .nb5-ns { - margin-bottom: -4rem; - } - .swagger-ui .nb6-ns { - margin-bottom: -8rem; - } - .swagger-ui .nb7-ns { - margin-bottom: -16rem; - } - .swagger-ui .nt1-ns { - margin-top: -0.25rem; - } - .swagger-ui .nt2-ns { - margin-top: -0.5rem; - } - .swagger-ui .nt3-ns { - margin-top: -1rem; - } - .swagger-ui .nt4-ns { - margin-top: -2rem; - } - .swagger-ui .nt5-ns { - margin-top: -4rem; - } - .swagger-ui .nt6-ns { - margin-top: -8rem; - } - .swagger-ui .nt7-ns { - margin-top: -16rem; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .na1-m { - margin: -0.25rem; - } - .swagger-ui .na2-m { - margin: -0.5rem; - } - .swagger-ui .na3-m { - margin: -1rem; - } - .swagger-ui .na4-m { - margin: -2rem; - } - .swagger-ui .na5-m { - margin: -4rem; - } - .swagger-ui .na6-m { - margin: -8rem; - } - .swagger-ui .na7-m { - margin: -16rem; - } - .swagger-ui .nl1-m { - margin-left: -0.25rem; - } - .swagger-ui .nl2-m { - margin-left: -0.5rem; - } - .swagger-ui .nl3-m { - margin-left: -1rem; - } - .swagger-ui .nl4-m { - margin-left: -2rem; - } - .swagger-ui .nl5-m { - margin-left: -4rem; - } - .swagger-ui .nl6-m { - margin-left: -8rem; - } - .swagger-ui .nl7-m { - margin-left: -16rem; - } - .swagger-ui .nr1-m { - margin-right: -0.25rem; - } - .swagger-ui .nr2-m { - margin-right: -0.5rem; - } - .swagger-ui .nr3-m { - margin-right: -1rem; - } - .swagger-ui .nr4-m { - margin-right: -2rem; - } - .swagger-ui .nr5-m { - margin-right: -4rem; - } - .swagger-ui .nr6-m { - margin-right: -8rem; - } - .swagger-ui .nr7-m { - margin-right: -16rem; - } - .swagger-ui .nb1-m { - margin-bottom: -0.25rem; - } - .swagger-ui .nb2-m { - margin-bottom: -0.5rem; - } - .swagger-ui .nb3-m { - margin-bottom: -1rem; - } - .swagger-ui .nb4-m { - margin-bottom: -2rem; - } - .swagger-ui .nb5-m { - margin-bottom: -4rem; - } - .swagger-ui .nb6-m { - margin-bottom: -8rem; - } - .swagger-ui .nb7-m { - margin-bottom: -16rem; - } - .swagger-ui .nt1-m { - margin-top: -0.25rem; - } - .swagger-ui .nt2-m { - margin-top: -0.5rem; - } - .swagger-ui .nt3-m { - margin-top: -1rem; - } - .swagger-ui .nt4-m { - margin-top: -2rem; - } - .swagger-ui .nt5-m { - margin-top: -4rem; - } - .swagger-ui .nt6-m { - margin-top: -8rem; - } - .swagger-ui .nt7-m { - margin-top: -16rem; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .na1-l { - margin: -0.25rem; - } - .swagger-ui .na2-l { - margin: -0.5rem; - } - .swagger-ui .na3-l { - margin: -1rem; - } - .swagger-ui .na4-l { - margin: -2rem; - } - .swagger-ui .na5-l { - margin: -4rem; - } - .swagger-ui .na6-l { - margin: -8rem; - } - .swagger-ui .na7-l { - margin: -16rem; - } - .swagger-ui .nl1-l { - margin-left: -0.25rem; - } - .swagger-ui .nl2-l { - margin-left: -0.5rem; - } - .swagger-ui .nl3-l { - margin-left: -1rem; - } - .swagger-ui .nl4-l { - margin-left: -2rem; - } - .swagger-ui .nl5-l { - margin-left: -4rem; - } - .swagger-ui .nl6-l { - margin-left: -8rem; - } - .swagger-ui .nl7-l { - margin-left: -16rem; - } - .swagger-ui .nr1-l { - margin-right: -0.25rem; - } - .swagger-ui .nr2-l { - margin-right: -0.5rem; - } - .swagger-ui .nr3-l { - margin-right: -1rem; - } - .swagger-ui .nr4-l { - margin-right: -2rem; - } - .swagger-ui .nr5-l { - margin-right: -4rem; - } - .swagger-ui .nr6-l { - margin-right: -8rem; - } - .swagger-ui .nr7-l { - margin-right: -16rem; - } - .swagger-ui .nb1-l { - margin-bottom: -0.25rem; - } - .swagger-ui .nb2-l { - margin-bottom: -0.5rem; - } - .swagger-ui .nb3-l { - margin-bottom: -1rem; - } - .swagger-ui .nb4-l { - margin-bottom: -2rem; - } - .swagger-ui .nb5-l { - margin-bottom: -4rem; - } - .swagger-ui .nb6-l { - margin-bottom: -8rem; - } - .swagger-ui .nb7-l { - margin-bottom: -16rem; - } - .swagger-ui .nt1-l { - margin-top: -0.25rem; - } - .swagger-ui .nt2-l { - margin-top: -0.5rem; - } - .swagger-ui .nt3-l { - margin-top: -1rem; - } - .swagger-ui .nt4-l { - margin-top: -2rem; - } - .swagger-ui .nt5-l { - margin-top: -4rem; - } - .swagger-ui .nt6-l { - margin-top: -8rem; - } - .swagger-ui .nt7-l { - margin-top: -16rem; - } -} -.swagger-ui .collapse { - border-collapse: collapse; - border-spacing: 0; -} -.swagger-ui .striped--light-silver:nth-child(odd) { - background-color: #aaa; -} -.swagger-ui .striped--moon-gray:nth-child(odd) { - background-color: #ccc; -} -.swagger-ui .striped--light-gray:nth-child(odd) { - background-color: #eee; -} -.swagger-ui .striped--near-white:nth-child(odd) { - background-color: #f4f4f4; -} -.swagger-ui .stripe-light:nth-child(odd) { - background-color: hsla(0, 0%, 100%, 0.1); -} -.swagger-ui .stripe-dark:nth-child(odd) { - background-color: rgba(0, 0, 0, 0.1); -} -.swagger-ui .strike { - -webkit-text-decoration: line-through; - text-decoration: line-through; -} -.swagger-ui .underline { - -webkit-text-decoration: underline; - text-decoration: underline; -} -.swagger-ui .no-underline { - -webkit-text-decoration: none; - text-decoration: none; -} -@media screen and (min-width: 30em) { - .swagger-ui .strike-ns { - -webkit-text-decoration: line-through; - text-decoration: line-through; - } - .swagger-ui .underline-ns { - -webkit-text-decoration: underline; - text-decoration: underline; - } - .swagger-ui .no-underline-ns { - -webkit-text-decoration: none; - text-decoration: none; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .strike-m { - -webkit-text-decoration: line-through; - text-decoration: line-through; - } - .swagger-ui .underline-m { - -webkit-text-decoration: underline; - text-decoration: underline; - } - .swagger-ui .no-underline-m { - -webkit-text-decoration: none; - text-decoration: none; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .strike-l { - -webkit-text-decoration: line-through; - text-decoration: line-through; - } - .swagger-ui .underline-l { - -webkit-text-decoration: underline; - text-decoration: underline; - } - .swagger-ui .no-underline-l { - -webkit-text-decoration: none; - text-decoration: none; - } -} -.swagger-ui .tl { - text-align: left; -} -.swagger-ui .tr { - text-align: right; -} -.swagger-ui .tc { - text-align: center; -} -.swagger-ui .tj { - text-align: justify; -} -@media screen and (min-width: 30em) { - .swagger-ui .tl-ns { - text-align: left; - } - .swagger-ui .tr-ns { - text-align: right; - } - .swagger-ui .tc-ns { - text-align: center; - } - .swagger-ui .tj-ns { - text-align: justify; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .tl-m { - text-align: left; - } - .swagger-ui .tr-m { - text-align: right; - } - .swagger-ui .tc-m { - text-align: center; - } - .swagger-ui .tj-m { - text-align: justify; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .tl-l { - text-align: left; - } - .swagger-ui .tr-l { - text-align: right; - } - .swagger-ui .tc-l { - text-align: center; - } - .swagger-ui .tj-l { - text-align: justify; - } -} -.swagger-ui .ttc { - text-transform: capitalize; -} -.swagger-ui .ttl { - text-transform: lowercase; -} -.swagger-ui .ttu { - text-transform: uppercase; -} -.swagger-ui .ttn { - text-transform: none; -} -@media screen and (min-width: 30em) { - .swagger-ui .ttc-ns { - text-transform: capitalize; - } - .swagger-ui .ttl-ns { - text-transform: lowercase; - } - .swagger-ui .ttu-ns { - text-transform: uppercase; - } - .swagger-ui .ttn-ns { - text-transform: none; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .ttc-m { - text-transform: capitalize; - } - .swagger-ui .ttl-m { - text-transform: lowercase; - } - .swagger-ui .ttu-m { - text-transform: uppercase; - } - .swagger-ui .ttn-m { - text-transform: none; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .ttc-l { - text-transform: capitalize; - } - .swagger-ui .ttl-l { - text-transform: lowercase; - } - .swagger-ui .ttu-l { - text-transform: uppercase; - } - .swagger-ui .ttn-l { - text-transform: none; - } -} -.swagger-ui .f-6, -.swagger-ui .f-headline { - font-size: 6rem; -} -.swagger-ui .f-5, -.swagger-ui .f-subheadline { - font-size: 5rem; -} -.swagger-ui .f1 { - font-size: 3rem; -} -.swagger-ui .f2 { - font-size: 2.25rem; -} -.swagger-ui .f3 { - font-size: 1.5rem; -} -.swagger-ui .f4 { - font-size: 1.25rem; -} -.swagger-ui .f5 { - font-size: 1rem; -} -.swagger-ui .f6 { - font-size: 0.875rem; -} -.swagger-ui .f7 { - font-size: 0.75rem; -} -@media screen and (min-width: 30em) { - .swagger-ui .f-6-ns, - .swagger-ui .f-headline-ns { - font-size: 6rem; - } - .swagger-ui .f-5-ns, - .swagger-ui .f-subheadline-ns { - font-size: 5rem; - } - .swagger-ui .f1-ns { - font-size: 3rem; - } - .swagger-ui .f2-ns { - font-size: 2.25rem; - } - .swagger-ui .f3-ns { - font-size: 1.5rem; - } - .swagger-ui .f4-ns { - font-size: 1.25rem; - } - .swagger-ui .f5-ns { - font-size: 1rem; - } - .swagger-ui .f6-ns { - font-size: 0.875rem; - } - .swagger-ui .f7-ns { - font-size: 0.75rem; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .f-6-m, - .swagger-ui .f-headline-m { - font-size: 6rem; - } - .swagger-ui .f-5-m, - .swagger-ui .f-subheadline-m { - font-size: 5rem; - } - .swagger-ui .f1-m { - font-size: 3rem; - } - .swagger-ui .f2-m { - font-size: 2.25rem; - } - .swagger-ui .f3-m { - font-size: 1.5rem; - } - .swagger-ui .f4-m { - font-size: 1.25rem; - } - .swagger-ui .f5-m { - font-size: 1rem; - } - .swagger-ui .f6-m { - font-size: 0.875rem; - } - .swagger-ui .f7-m { - font-size: 0.75rem; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .f-6-l, - .swagger-ui .f-headline-l { - font-size: 6rem; - } - .swagger-ui .f-5-l, - .swagger-ui .f-subheadline-l { - font-size: 5rem; - } - .swagger-ui .f1-l { - font-size: 3rem; - } - .swagger-ui .f2-l { - font-size: 2.25rem; - } - .swagger-ui .f3-l { - font-size: 1.5rem; - } - .swagger-ui .f4-l { - font-size: 1.25rem; - } - .swagger-ui .f5-l { - font-size: 1rem; - } - .swagger-ui .f6-l { - font-size: 0.875rem; - } - .swagger-ui .f7-l { - font-size: 0.75rem; - } -} -.swagger-ui .measure { - max-width: 30em; -} -.swagger-ui .measure-wide { - max-width: 34em; -} -.swagger-ui .measure-narrow { - max-width: 20em; -} -.swagger-ui .indent { - margin-bottom: 0; - margin-top: 0; - text-indent: 1em; -} -.swagger-ui .small-caps { - font-feature-settings: "smcp"; - font-variant: small-caps; -} -.swagger-ui .truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -@media screen and (min-width: 30em) { - .swagger-ui .measure-ns { - max-width: 30em; - } - .swagger-ui .measure-wide-ns { - max-width: 34em; - } - .swagger-ui .measure-narrow-ns { - max-width: 20em; - } - .swagger-ui .indent-ns { - margin-bottom: 0; - margin-top: 0; - text-indent: 1em; - } - .swagger-ui .small-caps-ns { - font-feature-settings: "smcp"; - font-variant: small-caps; - } - .swagger-ui .truncate-ns { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .measure-m { - max-width: 30em; - } - .swagger-ui .measure-wide-m { - max-width: 34em; - } - .swagger-ui .measure-narrow-m { - max-width: 20em; - } - .swagger-ui .indent-m { - margin-bottom: 0; - margin-top: 0; - text-indent: 1em; - } - .swagger-ui .small-caps-m { - font-feature-settings: "smcp"; - font-variant: small-caps; - } - .swagger-ui .truncate-m { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .measure-l { - max-width: 30em; - } - .swagger-ui .measure-wide-l { - max-width: 34em; - } - .swagger-ui .measure-narrow-l { - max-width: 20em; - } - .swagger-ui .indent-l { - margin-bottom: 0; - margin-top: 0; - text-indent: 1em; - } - .swagger-ui .small-caps-l { - font-feature-settings: "smcp"; - font-variant: small-caps; - } - .swagger-ui .truncate-l { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } -} -.swagger-ui .overflow-container { - overflow-y: scroll; -} -.swagger-ui .center { - margin-left: auto; - margin-right: auto; -} -.swagger-ui .mr-auto { - margin-right: auto; -} -.swagger-ui .ml-auto { - margin-left: auto; -} -@media screen and (min-width: 30em) { - .swagger-ui .center-ns { - margin-left: auto; - margin-right: auto; - } - .swagger-ui .mr-auto-ns { - margin-right: auto; - } - .swagger-ui .ml-auto-ns { - margin-left: auto; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .center-m { - margin-left: auto; - margin-right: auto; - } - .swagger-ui .mr-auto-m { - margin-right: auto; - } - .swagger-ui .ml-auto-m { - margin-left: auto; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .center-l { - margin-left: auto; - margin-right: auto; - } - .swagger-ui .mr-auto-l { - margin-right: auto; - } - .swagger-ui .ml-auto-l { - margin-left: auto; - } -} -.swagger-ui .clip { - position: fixed !important; - _position: absolute !important; - clip: rect(1px 1px 1px 1px); - clip: rect(1px, 1px, 1px, 1px); -} -@media screen and (min-width: 30em) { - .swagger-ui .clip-ns { - position: fixed !important; - _position: absolute !important; - clip: rect(1px 1px 1px 1px); - clip: rect(1px, 1px, 1px, 1px); - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .clip-m { - position: fixed !important; - _position: absolute !important; - clip: rect(1px 1px 1px 1px); - clip: rect(1px, 1px, 1px, 1px); - } -} -@media screen and (min-width: 60em) { - .swagger-ui .clip-l { - position: fixed !important; - _position: absolute !important; - clip: rect(1px 1px 1px 1px); - clip: rect(1px, 1px, 1px, 1px); - } -} -.swagger-ui .ws-normal { - white-space: normal; -} -.swagger-ui .nowrap { - white-space: nowrap; -} -.swagger-ui .pre { - white-space: pre; -} -@media screen and (min-width: 30em) { - .swagger-ui .ws-normal-ns { - white-space: normal; - } - .swagger-ui .nowrap-ns { - white-space: nowrap; - } - .swagger-ui .pre-ns { - white-space: pre; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .ws-normal-m { - white-space: normal; - } - .swagger-ui .nowrap-m { - white-space: nowrap; - } - .swagger-ui .pre-m { - white-space: pre; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .ws-normal-l { - white-space: normal; - } - .swagger-ui .nowrap-l { - white-space: nowrap; - } - .swagger-ui .pre-l { - white-space: pre; - } -} -.swagger-ui .v-base { - vertical-align: baseline; -} -.swagger-ui .v-mid { - vertical-align: middle; -} -.swagger-ui .v-top { - vertical-align: top; -} -.swagger-ui .v-btm { - vertical-align: bottom; -} -@media screen and (min-width: 30em) { - .swagger-ui .v-base-ns { - vertical-align: baseline; - } - .swagger-ui .v-mid-ns { - vertical-align: middle; - } - .swagger-ui .v-top-ns { - vertical-align: top; - } - .swagger-ui .v-btm-ns { - vertical-align: bottom; - } -} -@media screen and (min-width: 30em) and (max-width: 60em) { - .swagger-ui .v-base-m { - vertical-align: baseline; - } - .swagger-ui .v-mid-m { - vertical-align: middle; - } - .swagger-ui .v-top-m { - vertical-align: top; - } - .swagger-ui .v-btm-m { - vertical-align: bottom; - } -} -@media screen and (min-width: 60em) { - .swagger-ui .v-base-l { - vertical-align: baseline; - } - .swagger-ui .v-mid-l { - vertical-align: middle; - } - .swagger-ui .v-top-l { - vertical-align: top; - } - .swagger-ui .v-btm-l { - vertical-align: bottom; - } -} -.swagger-ui .dim { - opacity: 1; - transition: opacity 0.15s ease-in; -} -.swagger-ui .dim:focus, -.swagger-ui .dim:hover { - opacity: 0.5; - transition: opacity 0.15s ease-in; -} -.swagger-ui .dim:active { - opacity: 0.8; - transition: opacity 0.15s ease-out; -} -.swagger-ui .glow { - transition: opacity 0.15s ease-in; -} -.swagger-ui .glow:focus, -.swagger-ui .glow:hover { - opacity: 1; - transition: opacity 0.15s ease-in; -} -.swagger-ui .hide-child .child { - opacity: 0; - transition: opacity 0.15s ease-in; -} -.swagger-ui .hide-child:active .child, -.swagger-ui .hide-child:focus .child, -.swagger-ui .hide-child:hover .child { - opacity: 1; - transition: opacity 0.15s ease-in; -} -.swagger-ui .underline-hover:focus, -.swagger-ui .underline-hover:hover { - -webkit-text-decoration: underline; - text-decoration: underline; -} -.swagger-ui .grow { - -moz-osx-font-smoothing: grayscale; - backface-visibility: hidden; - transform: translateZ(0); - transition: transform 0.25s ease-out; -} -.swagger-ui .grow:focus, -.swagger-ui .grow:hover { - transform: scale(1.05); -} -.swagger-ui .grow:active { - transform: scale(0.9); -} -.swagger-ui .grow-large { - -moz-osx-font-smoothing: grayscale; - backface-visibility: hidden; - transform: translateZ(0); - transition: transform 0.25s ease-in-out; -} -.swagger-ui .grow-large:focus, -.swagger-ui .grow-large:hover { - transform: scale(1.2); -} -.swagger-ui .grow-large:active { - transform: scale(0.95); -} -.swagger-ui .pointer:hover { - cursor: pointer; -} -.swagger-ui .shadow-hover { - cursor: pointer; - position: relative; - transition: all 0.5s cubic-bezier(0.165, 0.84, 0.44, 1); -} -.swagger-ui .shadow-hover:after { - border-radius: inherit; - box-shadow: 0 0 16px 2px rgba(0, 0, 0, 0.2); - content: ""; - height: 100%; - left: 0; - opacity: 0; - position: absolute; - top: 0; - transition: opacity 0.5s cubic-bezier(0.165, 0.84, 0.44, 1); - width: 100%; - z-index: -1; -} -.swagger-ui .shadow-hover:focus:after, -.swagger-ui .shadow-hover:hover:after { - opacity: 1; -} -.swagger-ui .bg-animate, -.swagger-ui .bg-animate:focus, -.swagger-ui .bg-animate:hover { - transition: background-color 0.15s ease-in-out; -} -.swagger-ui .z-0 { - z-index: 0; -} -.swagger-ui .z-1 { - z-index: 1; -} -.swagger-ui .z-2 { - z-index: 2; -} -.swagger-ui .z-3 { - z-index: 3; -} -.swagger-ui .z-4 { - z-index: 4; -} -.swagger-ui .z-5 { - z-index: 5; -} -.swagger-ui .z-999 { - z-index: 999; -} -.swagger-ui .z-9999 { - z-index: 9999; -} -.swagger-ui .z-max { - z-index: 2147483647; -} -.swagger-ui .z-inherit { - z-index: inherit; -} -.swagger-ui .z-initial, -.swagger-ui .z-unset { - z-index: auto; -} -.swagger-ui .nested-copy-line-height ol, -.swagger-ui .nested-copy-line-height p, -.swagger-ui .nested-copy-line-height ul { - line-height: 1.5; -} -.swagger-ui .nested-headline-line-height h1, -.swagger-ui .nested-headline-line-height h2, -.swagger-ui .nested-headline-line-height h3, -.swagger-ui .nested-headline-line-height h4, -.swagger-ui .nested-headline-line-height h5, -.swagger-ui .nested-headline-line-height h6 { - line-height: 1.25; -} -.swagger-ui .nested-list-reset ol, -.swagger-ui .nested-list-reset ul { - list-style-type: none; - margin-left: 0; - padding-left: 0; -} -.swagger-ui .nested-copy-indent p + p { - margin-bottom: 0; - margin-top: 0; - text-indent: 0.1em; -} -.swagger-ui .nested-copy-seperator p + p { - margin-top: 1.5em; -} -.swagger-ui .nested-img img { - display: block; - max-width: 100%; - width: 100%; -} -.swagger-ui .nested-links a { - color: #357edd; - transition: color 0.15s ease-in; -} -.swagger-ui .nested-links a:focus, -.swagger-ui .nested-links a:hover { - color: #96ccff; - transition: color 0.15s ease-in; -} -.swagger-ui .wrapper { - box-sizing: border-box; - width: 100%; -} -.swagger-ui .opblock-tag-section { - display: flex; - flex-direction: column; -} -.swagger-ui .try-out.btn-group { - display: flex; - flex: 0.1 2 auto; - padding: 0; -} -.swagger-ui .try-out__btn { - margin-left: 1.25rem; -} -.swagger-ui .opblock-tag { - align-items: center; - border-bottom: 1px solid rgba(59, 65, 81, 0.3); - cursor: pointer; - display: flex; - padding: 10px 20px 10px 10px; - transition: all 0.2s; -} -.swagger-ui .opblock-tag:hover { - background: rgba(0, 0, 0, 0.02); -} -.swagger-ui .opblock-tag { - color: #3b4151; - font-family: sans-serif; - font-size: 24px; - margin: 0 0 5px; -} -.swagger-ui .opblock-tag.no-desc span { - flex: 1; -} -.swagger-ui .opblock-tag svg { - transition: all 0.4s; -} -.swagger-ui .opblock-tag small { - color: #3b4151; - flex: 2; - font-family: sans-serif; - font-size: 14px; - font-weight: 400; - padding: 0 10px; -} -.swagger-ui .opblock-tag > div { - flex: 1 1 150px; - font-weight: 400; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -@media (max-width: 640px) { - .swagger-ui .opblock-tag small, - .swagger-ui .opblock-tag > div { - flex: 1; - } -} -.swagger-ui .opblock-tag .info__externaldocs { - text-align: right; -} -.swagger-ui .parameter__type { - color: #3b4151; - font-family: monospace; - font-size: 12px; - font-weight: 600; - padding: 5px 0; -} -.swagger-ui .parameter-controls { - margin-top: 0.75em; -} -.swagger-ui .examples__title { - display: block; - font-size: 1.1em; - font-weight: 700; - margin-bottom: 0.75em; -} -.swagger-ui .examples__section { - margin-top: 1.5em; -} -.swagger-ui .examples__section-header { - font-size: 0.9rem; - font-weight: 700; - margin-bottom: 0.5rem; -} -.swagger-ui .examples-select { - display: inline-block; - margin-bottom: 0.75em; -} -.swagger-ui .examples-select .examples-select-element { - width: 100%; -} -.swagger-ui .examples-select__section-label { - font-size: 0.9rem; - font-weight: 700; - margin-right: 0.5rem; -} -.swagger-ui .example__section { - margin-top: 1.5em; -} -.swagger-ui .example__section-header { - font-size: 0.9rem; - font-weight: 700; - margin-bottom: 0.5rem; -} -.swagger-ui .view-line-link { - cursor: pointer; - margin: 0 5px; - position: relative; - top: 3px; - transition: all 0.5s; - width: 20px; -} -.swagger-ui .opblock { - border: 1px solid #000; - border-radius: 4px; - box-shadow: 0 0 3px rgba(0, 0, 0, 0.19); - margin: 0 0 15px; -} -.swagger-ui .opblock .tab-header { - display: flex; - flex: 1; -} -.swagger-ui .opblock .tab-header .tab-item { - cursor: pointer; - padding: 0 40px; -} -.swagger-ui .opblock .tab-header .tab-item:first-of-type { - padding: 0 40px 0 0; -} -.swagger-ui .opblock .tab-header .tab-item.active h4 span { - position: relative; -} -.swagger-ui .opblock .tab-header .tab-item.active h4 span:after { - background: gray; - bottom: -15px; - content: ""; - height: 4px; - left: 50%; - position: absolute; - transform: translateX(-50%); - width: 120%; -} -.swagger-ui .opblock.is-open .opblock-summary { - border-bottom: 1px solid #000; -} -.swagger-ui .opblock .opblock-section-header { - align-items: center; - background: hsla(0, 0%, 100%, 0.8); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); - display: flex; - min-height: 50px; - padding: 8px 20px; -} -.swagger-ui .opblock .opblock-section-header > label { - align-items: center; - color: #3b4151; - display: flex; - font-family: sans-serif; - font-size: 12px; - font-weight: 700; - margin: 0 0 0 auto; -} -.swagger-ui .opblock .opblock-section-header > label > span { - padding: 0 10px 0 0; -} -.swagger-ui .opblock .opblock-section-header h4 { - color: #3b4151; - flex: 1; - font-family: sans-serif; - font-size: 14px; - margin: 0; -} -.swagger-ui .opblock .opblock-summary-method { - background: #000; - border-radius: 3px; - color: #fff; - font-family: sans-serif; - font-size: 14px; - font-weight: 700; - min-width: 80px; - padding: 6px 0; - text-align: center; - text-shadow: 0 1px 0 rgba(0, 0, 0, 0.1); -} -@media (max-width: 768px) { - .swagger-ui .opblock .opblock-summary-method { - font-size: 12px; - } -} -.swagger-ui .opblock .opblock-summary-operation-id, -.swagger-ui .opblock .opblock-summary-path, -.swagger-ui .opblock .opblock-summary-path__deprecated { - align-items: center; - color: #3b4151; - display: flex; - font-family: monospace; - font-size: 16px; - font-weight: 600; - word-break: break-word; -} -@media (max-width: 768px) { - .swagger-ui .opblock .opblock-summary-operation-id, - .swagger-ui .opblock .opblock-summary-path, - .swagger-ui .opblock .opblock-summary-path__deprecated { - font-size: 12px; - } -} -.swagger-ui .opblock .opblock-summary-path { - flex-shrink: 1; -} -@media (max-width: 640px) { - .swagger-ui .opblock .opblock-summary-path { - max-width: 100%; - } -} -.swagger-ui .opblock .opblock-summary-path__deprecated { - -webkit-text-decoration: line-through; - text-decoration: line-through; -} -.swagger-ui .opblock .opblock-summary-operation-id { - font-size: 14px; -} -.swagger-ui .opblock .opblock-summary-description { - color: #3b4151; - font-family: sans-serif; - font-size: 13px; - word-break: break-word; -} -.swagger-ui .opblock .opblock-summary-path-description-wrapper { - align-items: center; - display: flex; - flex-direction: row; - flex-wrap: wrap; - gap: 0 10px; - padding: 0 10px; - width: 100%; -} -@media (max-width: 550px) { - .swagger-ui .opblock .opblock-summary-path-description-wrapper { - align-items: flex-start; - flex-direction: column; - } -} -.swagger-ui .opblock .opblock-summary { - align-items: center; - cursor: pointer; - display: flex; - padding: 5px; -} -.swagger-ui .opblock .opblock-summary .view-line-link { - cursor: pointer; - margin: 0; - position: relative; - top: 2px; - transition: all 0.5s; - width: 0; -} -.swagger-ui .opblock .opblock-summary:hover .view-line-link { - margin: 0 5px; - width: 18px; -} -.swagger-ui .opblock .opblock-summary:hover .view-line-link.copy-to-clipboard { - width: 24px; -} -.swagger-ui .opblock.opblock-post { - background: rgba(73, 204, 144, 0.1); - border-color: #49cc90; -} -.swagger-ui .opblock.opblock-post .opblock-summary-method { - background: #49cc90; -} -.swagger-ui .opblock.opblock-post .opblock-summary { - border-color: #49cc90; -} -.swagger-ui .opblock.opblock-post .tab-header .tab-item.active h4 span:after { - background: #49cc90; -} -.swagger-ui .opblock.opblock-put { - background: rgba(252, 161, 48, 0.1); - border-color: #fca130; -} -.swagger-ui .opblock.opblock-put .opblock-summary-method { - background: #fca130; -} -.swagger-ui .opblock.opblock-put .opblock-summary { - border-color: #fca130; -} -.swagger-ui .opblock.opblock-put .tab-header .tab-item.active h4 span:after { - background: #fca130; -} -.swagger-ui .opblock.opblock-delete { - background: rgba(249, 62, 62, 0.1); - border-color: #f93e3e; -} -.swagger-ui .opblock.opblock-delete .opblock-summary-method { - background: #f93e3e; -} -.swagger-ui .opblock.opblock-delete .opblock-summary { - border-color: #f93e3e; -} -.swagger-ui .opblock.opblock-delete .tab-header .tab-item.active h4 span:after { - background: #f93e3e; -} -.swagger-ui .opblock.opblock-get { - background: rgba(97, 175, 254, 0.1); - border-color: #61affe; -} -.swagger-ui .opblock.opblock-get .opblock-summary-method { - background: #61affe; -} -.swagger-ui .opblock.opblock-get .opblock-summary { - border-color: #61affe; -} -.swagger-ui .opblock.opblock-get .tab-header .tab-item.active h4 span:after { - background: #61affe; -} -.swagger-ui .opblock.opblock-patch { - background: rgba(80, 227, 194, 0.1); - border-color: #50e3c2; -} -.swagger-ui .opblock.opblock-patch .opblock-summary-method { - background: #50e3c2; -} -.swagger-ui .opblock.opblock-patch .opblock-summary { - border-color: #50e3c2; -} -.swagger-ui .opblock.opblock-patch .tab-header .tab-item.active h4 span:after { - background: #50e3c2; -} -.swagger-ui .opblock.opblock-head { - background: rgba(144, 18, 254, 0.1); - border-color: #9012fe; -} -.swagger-ui .opblock.opblock-head .opblock-summary-method { - background: #9012fe; -} -.swagger-ui .opblock.opblock-head .opblock-summary { - border-color: #9012fe; -} -.swagger-ui .opblock.opblock-head .tab-header .tab-item.active h4 span:after { - background: #9012fe; -} -.swagger-ui .opblock.opblock-options { - background: rgba(13, 90, 167, 0.1); - border-color: #0d5aa7; -} -.swagger-ui .opblock.opblock-options .opblock-summary-method { - background: #0d5aa7; -} -.swagger-ui .opblock.opblock-options .opblock-summary { - border-color: #0d5aa7; -} -.swagger-ui .opblock.opblock-options .tab-header .tab-item.active h4 span:after { - background: #0d5aa7; -} -.swagger-ui .opblock.opblock-deprecated { - background: hsla(0, 0%, 92%, 0.1); - border-color: #ebebeb; - opacity: 0.6; -} -.swagger-ui .opblock.opblock-deprecated .opblock-summary-method { - background: #ebebeb; -} -.swagger-ui .opblock.opblock-deprecated .opblock-summary { - border-color: #ebebeb; -} -.swagger-ui .opblock.opblock-deprecated .tab-header .tab-item.active h4 span:after { - background: #ebebeb; -} -.swagger-ui .opblock .opblock-schemes { - padding: 8px 20px; -} -.swagger-ui .opblock .opblock-schemes .schemes-title { - padding: 0 10px 0 0; -} -.swagger-ui .filter .operation-filter-input { - border: 2px solid #d8dde7; - margin: 20px 0; - padding: 10px; - width: 100%; -} -.swagger-ui .download-url-wrapper .failed, -.swagger-ui .filter .failed { - color: red; -} -.swagger-ui .download-url-wrapper .loading, -.swagger-ui .filter .loading { - color: #aaa; -} -.swagger-ui .model-example { - margin-top: 1em; -} -.swagger-ui .tab { - display: flex; - list-style: none; - padding: 0; -} -.swagger-ui .tab li { - color: #3b4151; - cursor: pointer; - font-family: sans-serif; - font-size: 12px; - min-width: 60px; - padding: 0; -} -.swagger-ui .tab li:first-of-type { - padding-left: 0; - padding-right: 12px; - position: relative; -} -.swagger-ui .tab li:first-of-type:after { - background: rgba(0, 0, 0, 0.2); - content: ""; - height: 100%; - position: absolute; - right: 6px; - top: 0; - width: 1px; -} -.swagger-ui .tab li.active { - font-weight: 700; -} -.swagger-ui .tab li button.tablinks { - background: none; - border: 0; - color: inherit; - font-family: inherit; - font-weight: inherit; - padding: 0; -} -.swagger-ui .opblock-description-wrapper, -.swagger-ui .opblock-external-docs-wrapper, -.swagger-ui .opblock-title_normal { - color: #3b4151; - font-family: sans-serif; - font-size: 12px; - margin: 0 0 5px; - padding: 15px 20px; -} -.swagger-ui .opblock-description-wrapper h4, -.swagger-ui .opblock-external-docs-wrapper h4, -.swagger-ui .opblock-title_normal h4 { - color: #3b4151; - font-family: sans-serif; - font-size: 12px; - margin: 0 0 5px; -} -.swagger-ui .opblock-description-wrapper p, -.swagger-ui .opblock-external-docs-wrapper p, -.swagger-ui .opblock-title_normal p { - color: #3b4151; - font-family: sans-serif; - font-size: 14px; - margin: 0; -} -.swagger-ui .opblock-external-docs-wrapper h4 { - padding-left: 0; -} -.swagger-ui .execute-wrapper { - padding: 20px; - text-align: right; -} -.swagger-ui .execute-wrapper .btn { - padding: 8px 40px; - width: 100%; -} -.swagger-ui .body-param-options { - display: flex; - flex-direction: column; -} -.swagger-ui .body-param-options .body-param-edit { - padding: 10px 0; -} -.swagger-ui .body-param-options label { - padding: 8px 0; -} -.swagger-ui .body-param-options label select { - margin: 3px 0 0; -} -.swagger-ui .responses-inner { - padding: 20px; -} -.swagger-ui .responses-inner h4, -.swagger-ui .responses-inner h5 { - color: #3b4151; - font-family: sans-serif; - font-size: 12px; - margin: 10px 0 5px; -} -.swagger-ui .responses-inner .curl { - max-height: 400px; - min-height: 6em; - overflow-y: auto; -} -.swagger-ui .response-col_status { - color: #3b4151; - font-family: sans-serif; - font-size: 14px; -} -.swagger-ui .response-col_status .response-undocumented { - color: #909090; - font-family: monospace; - font-size: 11px; - font-weight: 600; -} -.swagger-ui .response-col_links { - color: #3b4151; - font-family: sans-serif; - font-size: 14px; - max-width: 40em; - padding-left: 2em; -} -.swagger-ui .response-col_links .response-undocumented { - color: #909090; - font-family: monospace; - font-size: 11px; - font-weight: 600; -} -.swagger-ui .response-col_links .operation-link { - margin-bottom: 1.5em; -} -.swagger-ui .response-col_links .operation-link .description { - margin-bottom: 0.5em; -} -.swagger-ui .opblock-body .opblock-loading-animation { - display: block; - margin: 3em auto; -} -.swagger-ui .opblock-body pre.microlight { - background: #333; - border-radius: 4px; - font-size: 12px; - -webkit-hyphens: auto; - hyphens: auto; - margin: 0; - padding: 10px; - white-space: pre-wrap; - word-break: break-all; - word-break: break-word; - word-wrap: break-word; - color: #fff; - font-family: monospace; - font-weight: 600; -} -.swagger-ui .opblock-body pre.microlight .headerline { - display: block; -} -.swagger-ui .highlight-code { - position: relative; -} -.swagger-ui .highlight-code > .microlight { - max-height: 400px; - min-height: 6em; - overflow-y: auto; -} -.swagger-ui .highlight-code > .microlight code { - white-space: pre-wrap !important; - word-break: break-all; -} -.swagger-ui .curl-command { - position: relative; -} -.swagger-ui .download-contents { - align-items: center; - background: #7d8293; - border: none; - border-radius: 4px; - bottom: 10px; - color: #fff; - display: flex; - font-family: sans-serif; - font-size: 14px; - font-weight: 600; - height: 30px; - justify-content: center; - padding: 5px; - position: absolute; - right: 10px; - text-align: center; -} -.swagger-ui .scheme-container { - background: #fff; - box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.15); - margin: 0 0 20px; - padding: 30px 20px; -} -.swagger-ui .scheme-container .schemes { - align-items: flex-end; - display: flex; - flex-wrap: wrap; - gap: 10px; - justify-content: space-between; -} -.swagger-ui .scheme-container .schemes > .schemes-server-container { - display: flex; - flex-wrap: wrap; - gap: 10px; -} -.swagger-ui .scheme-container .schemes > .schemes-server-container > label { - color: #3b4151; - display: flex; - flex-direction: column; - font-family: sans-serif; - font-size: 12px; - font-weight: 700; - margin: -20px 15px 0 0; -} -.swagger-ui .scheme-container .schemes > .schemes-server-container > label select { - min-width: 130px; - text-transform: uppercase; -} -.swagger-ui .scheme-container .schemes:not(:has(.schemes-server-container)) { - justify-content: flex-end; -} -.swagger-ui .scheme-container .schemes .auth-wrapper { - flex: none; - justify-content: start; -} -.swagger-ui .scheme-container .schemes .auth-wrapper .authorize { - display: flex; - flex-wrap: nowrap; - margin: 0; - padding-right: 20px; -} -.swagger-ui .loading-container { - align-items: center; - display: flex; - flex-direction: column; - justify-content: center; - margin-top: 1em; - min-height: 1px; - padding: 40px 0 60px; -} -.swagger-ui .loading-container .loading { - position: relative; -} -.swagger-ui .loading-container .loading:after { - color: #3b4151; - content: "loading"; - font-family: sans-serif; - font-size: 10px; - font-weight: 700; - left: 50%; - position: absolute; - text-transform: uppercase; - top: 50%; - transform: translate(-50%, -50%); -} -.swagger-ui .loading-container .loading:before { - animation: - rotation 1s linear infinite, - opacity 0.5s; - backface-visibility: hidden; - border: 2px solid rgba(85, 85, 85, 0.1); - border-radius: 100%; - border-top-color: rgba(0, 0, 0, 0.6); - content: ""; - display: block; - height: 60px; - left: 50%; - margin: -30px; - opacity: 1; - position: absolute; - top: 50%; - width: 60px; -} -@keyframes rotation { - to { - transform: rotate(1turn); - } -} -.swagger-ui .response-controls { - display: flex; - padding-top: 1em; -} -.swagger-ui .response-control-media-type { - margin-right: 1em; -} -.swagger-ui .response-control-media-type--accept-controller select { - border-color: green; -} -.swagger-ui .response-control-media-type__accept-message { - color: green; - font-size: 0.7em; -} -.swagger-ui .response-control-examples__title, -.swagger-ui .response-control-media-type__title { - display: block; - font-size: 0.7em; - margin-bottom: 0.2em; -} -@keyframes blinker { - 50% { - opacity: 0; - } -} -.swagger-ui .hidden { - display: none; -} -.swagger-ui .no-margin { - border: none; - height: auto; - margin: 0; - padding: 0; -} -.swagger-ui .float-right { - float: right; -} -.swagger-ui .svg-assets { - height: 0; - position: absolute; - width: 0; -} -.swagger-ui section h3 { - color: #3b4151; - font-family: sans-serif; -} -.swagger-ui a.nostyle { - display: inline; -} -.swagger-ui a.nostyle, -.swagger-ui a.nostyle:visited { - color: inherit; - cursor: pointer; - text-decoration: inherit; -} -.swagger-ui .fallback { - color: #aaa; - padding: 1em; -} -.swagger-ui .version-pragma { - height: 100%; - padding: 5em 0; -} -.swagger-ui .version-pragma__message { - display: flex; - font-size: 1.2em; - height: 100%; - justify-content: center; - line-height: 1.5em; - padding: 0 0.6em; - text-align: center; -} -.swagger-ui .version-pragma__message > div { - flex: 1; - max-width: 55ch; -} -.swagger-ui .version-pragma__message code { - background-color: #dedede; - padding: 4px 4px 2px; - white-space: pre; -} -.swagger-ui .opblock-link { - font-weight: 400; -} -.swagger-ui .opblock-link.shown { - font-weight: 700; -} -.swagger-ui span.token-string { - color: #555; -} -.swagger-ui span.token-not-formatted { - color: #555; - font-weight: 700; -} -.swagger-ui .btn { - background: transparent; - border: 2px solid gray; - border-radius: 4px; - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); - color: #3b4151; - font-family: sans-serif; - font-size: 14px; - font-weight: 700; - padding: 5px 23px; - transition: all 0.3s; -} -.swagger-ui .btn.btn-sm { - font-size: 12px; - padding: 4px 23px; -} -.swagger-ui .btn[disabled] { - cursor: not-allowed; - opacity: 0.3; -} -.swagger-ui .btn:hover { - box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); -} -.swagger-ui .btn.cancel { - background-color: transparent; - border-color: #ff6060; - color: #ff6060; - font-family: sans-serif; -} -.swagger-ui .btn.authorize { - background-color: transparent; - border-color: #49cc90; - color: #49cc90; - display: inline; - line-height: 1; -} -.swagger-ui .btn.authorize span { - float: left; - padding: 4px 20px 0 0; -} -.swagger-ui .btn.authorize svg { - fill: #49cc90; -} -.swagger-ui .btn.execute { - background-color: #4990e2; - border-color: #4990e2; - color: #fff; -} -.swagger-ui .btn-group { - display: flex; - padding: 30px; -} -.swagger-ui .btn-group .btn { - flex: 1; -} -.swagger-ui .btn-group .btn:first-child { - border-radius: 4px 0 0 4px; -} -.swagger-ui .btn-group .btn:last-child { - border-radius: 0 4px 4px 0; -} -.swagger-ui .authorization__btn { - background: none; - border: none; - padding: 0 0 0 10px; -} -.swagger-ui .authorization__btn .locked { - opacity: 1; -} -.swagger-ui .authorization__btn .unlocked { - opacity: 0.4; -} -.swagger-ui .model-box-control, -.swagger-ui .models-control, -.swagger-ui .opblock-summary-control { - all: inherit; - border-bottom: 0; - cursor: pointer; - flex: 1; - padding: 0; -} -.swagger-ui .model-box-control:focus, -.swagger-ui .models-control:focus, -.swagger-ui .opblock-summary-control:focus { - outline: auto; -} -.swagger-ui .expand-methods, -.swagger-ui .expand-operation { - background: none; - border: none; -} -.swagger-ui .expand-methods svg, -.swagger-ui .expand-operation svg { - height: 20px; - width: 20px; -} -.swagger-ui .expand-methods { - padding: 0 10px; -} -.swagger-ui .expand-methods:hover svg { - fill: #404040; -} -.swagger-ui .expand-methods svg { - transition: all 0.3s; - fill: #707070; -} -.swagger-ui button { - cursor: pointer; -} -.swagger-ui button.invalid { - animation: shake 0.4s 1; - background: #feebeb; - border-color: #f93e3e; -} -.swagger-ui .copy-to-clipboard { - align-items: center; - background: #7d8293; - border: none; - border-radius: 4px; - bottom: 10px; - display: flex; - height: 30px; - justify-content: center; - position: absolute; - right: 100px; - width: 30px; -} -.swagger-ui .copy-to-clipboard button { - background: url('data:image/svg+xml;charset=utf-8,') - 50% no-repeat; - border: none; - flex-grow: 1; - flex-shrink: 1; - height: 25px; -} -.swagger-ui .copy-to-clipboard:active { - background: #5e626f; -} -.swagger-ui .opblock-control-arrow { - background: none; - border: none; - text-align: center; -} -.swagger-ui .curl-command .copy-to-clipboard { - bottom: 5px; - height: 20px; - right: 10px; - width: 20px; -} -.swagger-ui .curl-command .copy-to-clipboard button { - height: 18px; -} -.swagger-ui .opblock .opblock-summary .view-line-link.copy-to-clipboard { - height: 26px; - position: static; -} -.swagger-ui select { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - background: #f7f7f7 - url('data:image/svg+xml;charset=utf-8,') - right 10px center no-repeat; - background-size: 20px; - border: 2px solid #41444e; - border-radius: 4px; - box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.25); - color: #3b4151; - font-family: sans-serif; - font-size: 14px; - font-weight: 700; - padding: 5px 40px 5px 10px; -} -.swagger-ui select[multiple] { - background: #f7f7f7; - margin: 5px 0; - padding: 5px; -} -.swagger-ui select.invalid { - animation: shake 0.4s 1; - background: #feebeb; - border-color: #f93e3e; -} -.swagger-ui .opblock-body select { - min-width: 230px; -} -@media (max-width: 768px) { - .swagger-ui .opblock-body select { - min-width: 180px; - } -} -@media (max-width: 640px) { - .swagger-ui .opblock-body select { - min-width: 100%; - width: 100%; - } -} -.swagger-ui label { - color: #3b4151; - font-family: sans-serif; - font-size: 12px; - font-weight: 700; - margin: 0 0 5px; -} -.swagger-ui input[type="email"], -.swagger-ui input[type="file"], -.swagger-ui input[type="password"], -.swagger-ui input[type="search"], -.swagger-ui input[type="text"] { - line-height: 1; -} -@media (max-width: 768px) { - .swagger-ui input[type="email"], - .swagger-ui input[type="file"], - .swagger-ui input[type="password"], - .swagger-ui input[type="search"], - .swagger-ui input[type="text"] { - max-width: 175px; - } -} -.swagger-ui input[type="email"], -.swagger-ui input[type="file"], -.swagger-ui input[type="password"], -.swagger-ui input[type="search"], -.swagger-ui input[type="text"], -.swagger-ui textarea { - background: #fff; - border: 1px solid #d9d9d9; - border-radius: 4px; - margin: 5px 0; - min-width: 100px; - padding: 8px 10px; -} -.swagger-ui input[type="email"].invalid, -.swagger-ui input[type="file"].invalid, -.swagger-ui input[type="password"].invalid, -.swagger-ui input[type="search"].invalid, -.swagger-ui input[type="text"].invalid, -.swagger-ui textarea.invalid { - animation: shake 0.4s 1; - background: #feebeb; - border-color: #f93e3e; -} -.swagger-ui input[disabled], -.swagger-ui select[disabled], -.swagger-ui textarea[disabled] { - background-color: #fafafa; - color: #888; - cursor: not-allowed; -} -.swagger-ui select[disabled] { - border-color: #888; -} -.swagger-ui textarea[disabled] { - background-color: #41444e; - color: #fff; -} -@keyframes shake { - 10%, - 90% { - transform: translate3d(-1px, 0, 0); - } - 20%, - 80% { - transform: translate3d(2px, 0, 0); - } - 30%, - 50%, - 70% { - transform: translate3d(-4px, 0, 0); - } - 40%, - 60% { - transform: translate3d(4px, 0, 0); - } -} -.swagger-ui textarea { - background: hsla(0, 0%, 100%, 0.8); - border: none; - border-radius: 4px; - color: #3b4151; - font-family: monospace; - font-size: 12px; - font-weight: 600; - min-height: 280px; - outline: none; - padding: 10px; - width: 100%; -} -.swagger-ui textarea:focus { - border: 2px solid #61affe; -} -.swagger-ui textarea.curl { - background: #41444e; - border-radius: 4px; - color: #fff; - font-family: monospace; - font-size: 12px; - font-weight: 600; - margin: 0; - min-height: 100px; - padding: 10px; - resize: none; -} -.swagger-ui .checkbox { - color: #303030; - padding: 5px 0 10px; - transition: opacity 0.5s; -} -.swagger-ui .checkbox label { - display: flex; -} -.swagger-ui .checkbox p { - color: #3b4151; - font-family: monospace; - font-style: italic; - font-weight: 400 !important; - font-weight: 600; - margin: 0 !important; -} -.swagger-ui .checkbox input[type="checkbox"] { - display: none; -} -.swagger-ui .checkbox input[type="checkbox"] + label > .item { - background: #e8e8e8; - border-radius: 1px; - box-shadow: 0 0 0 2px #e8e8e8; - cursor: pointer; - display: inline-block; - flex: none; - height: 16px; - margin: 0 8px 0 0; - padding: 5px; - position: relative; - top: 3px; - width: 16px; -} -.swagger-ui .checkbox input[type="checkbox"] + label > .item:active { - transform: scale(0.9); -} -.swagger-ui .checkbox input[type="checkbox"]:checked + label > .item { - background: #e8e8e8 - url('data:image/svg+xml;charset=utf-8,') - 50% no-repeat; -} -.swagger-ui .dialog-ux { - bottom: 0; - left: 0; - position: fixed; - right: 0; - top: 0; - z-index: 9999; -} -.swagger-ui .dialog-ux .backdrop-ux { - background: rgba(0, 0, 0, 0.8); - bottom: 0; - left: 0; - position: fixed; - right: 0; - top: 0; -} -.swagger-ui .dialog-ux .modal-ux { - background: #fff; - border: 1px solid #ebebeb; - border-radius: 4px; - box-shadow: 0 10px 30px 0 rgba(0, 0, 0, 0.2); - left: 50%; - max-width: 650px; - min-width: 300px; - position: absolute; - top: 50%; - transform: translate(-50%, -50%); - width: 100%; - z-index: 9999; -} -.swagger-ui .dialog-ux .modal-ux-content { - max-height: 540px; - overflow-y: auto; - padding: 20px; -} -.swagger-ui .dialog-ux .modal-ux-content p { - color: #41444e; - color: #3b4151; - font-family: sans-serif; - font-size: 12px; - margin: 0 0 5px; -} -.swagger-ui .dialog-ux .modal-ux-content h4 { - color: #3b4151; - font-family: sans-serif; - font-size: 18px; - font-weight: 600; - margin: 15px 0 0; -} -.swagger-ui .dialog-ux .modal-ux-header { - align-items: center; - border-bottom: 1px solid #ebebeb; - display: flex; - padding: 12px 0; -} -.swagger-ui .dialog-ux .modal-ux-header .close-modal { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - background: none; - border: none; - padding: 0 10px; -} -.swagger-ui .dialog-ux .modal-ux-header h3 { - color: #3b4151; - flex: 1; - font-family: sans-serif; - font-size: 20px; - font-weight: 600; - margin: 0; - padding: 0 20px; -} -.swagger-ui .model { - color: #3b4151; - font-family: monospace; - font-size: 12px; - font-weight: 300; - font-weight: 600; -} -.swagger-ui .model .deprecated span, -.swagger-ui .model .deprecated td { - color: #a0a0a0 !important; -} -.swagger-ui .model .deprecated > td:first-of-type { - -webkit-text-decoration: line-through; - text-decoration: line-through; -} -.swagger-ui .model-toggle { - cursor: pointer; - display: inline-block; - font-size: 10px; - margin: auto 0.3em; - position: relative; - top: 6px; - transform: rotate(90deg); - transform-origin: 50% 50%; - transition: transform 0.15s ease-in; -} -.swagger-ui .model-toggle.collapsed { - transform: rotate(0deg); -} -.swagger-ui .model-toggle:after { - background: url('data:image/svg+xml;charset=utf-8,') - 50% no-repeat; - background-size: 100%; - content: ""; - display: block; - height: 20px; - width: 20px; -} -.swagger-ui .model-jump-to-path { - cursor: pointer; - position: relative; -} -.swagger-ui .model-jump-to-path .view-line-link { - cursor: pointer; - position: absolute; - top: -0.4em; -} -.swagger-ui .model-title { - position: relative; -} -.swagger-ui .model-title:hover .model-hint { - visibility: visible; -} -.swagger-ui .model-hint { - background: rgba(0, 0, 0, 0.7); - border-radius: 4px; - color: #ebebeb; - padding: 0.1em 0.5em; - position: absolute; - top: -1.8em; - visibility: hidden; - white-space: nowrap; -} -.swagger-ui .model p { - margin: 0 0 1em; -} -.swagger-ui .model .property { - color: #999; - font-style: italic; -} -.swagger-ui .model .property.primitive { - color: #6b6b6b; -} -.swagger-ui .model .external-docs, -.swagger-ui table.model tr.description { - color: #666; - font-weight: 400; -} -.swagger-ui table.model tr.description td:first-child, -.swagger-ui table.model tr.property-row.required td:first-child { - font-weight: 700; -} -.swagger-ui table.model tr.property-row td { - vertical-align: top; -} -.swagger-ui table.model tr.property-row td:first-child { - padding-right: 0.2em; -} -.swagger-ui table.model tr.property-row .star { - color: red; -} -.swagger-ui table.model tr.extension { - color: #777; -} -.swagger-ui table.model tr.extension td:last-child { - vertical-align: top; -} -.swagger-ui table.model tr.external-docs td:first-child { - font-weight: 700; -} -.swagger-ui table.model tr .renderedMarkdown p:first-child { - margin-top: 0; -} -.swagger-ui section.models { - border: 1px solid rgba(59, 65, 81, 0.3); - border-radius: 4px; - margin: 30px 0; -} -.swagger-ui section.models .pointer { - cursor: pointer; -} -.swagger-ui section.models.is-open { - padding: 0 0 20px; -} -.swagger-ui section.models.is-open h4 { - border-bottom: 1px solid rgba(59, 65, 81, 0.3); - margin: 0 0 5px; -} -.swagger-ui section.models h4 { - align-items: center; - color: #606060; - cursor: pointer; - display: flex; - font-family: sans-serif; - font-size: 16px; - margin: 0; - padding: 10px 20px 10px 10px; - transition: all 0.2s; -} -.swagger-ui section.models h4 svg { - transition: all 0.4s; -} -.swagger-ui section.models h4 span { - flex: 1; -} -.swagger-ui section.models h4:hover { - background: rgba(0, 0, 0, 0.02); -} -.swagger-ui section.models h5 { - color: #707070; - font-family: sans-serif; - font-size: 16px; - margin: 0 0 10px; -} -.swagger-ui section.models .model-jump-to-path { - position: relative; - top: 5px; -} -.swagger-ui section.models .model-container { - background: rgba(0, 0, 0, 0.05); - border-radius: 4px; - margin: 0 20px 15px; - position: relative; - transition: all 0.5s; -} -.swagger-ui section.models .model-container:hover { - background: rgba(0, 0, 0, 0.07); -} -.swagger-ui section.models .model-container:first-of-type { - margin: 20px; -} -.swagger-ui section.models .model-container:last-of-type { - margin: 0 20px; -} -.swagger-ui section.models .model-container .models-jump-to-path { - opacity: 0.65; - position: absolute; - right: 5px; - top: 8px; -} -.swagger-ui section.models .model-box { - background: none; -} -.swagger-ui .model-box { - background: rgba(0, 0, 0, 0.1); - border-radius: 4px; - display: inline-block; - padding: 10px; -} -.swagger-ui .model-box .model-jump-to-path { - position: relative; - top: 4px; -} -.swagger-ui .model-box.deprecated { - opacity: 0.5; -} -.swagger-ui .model-title { - color: #505050; - font-family: sans-serif; - font-size: 16px; -} -.swagger-ui .model-title img { - bottom: 0; - margin-left: 1em; - position: relative; -} -.swagger-ui .model-deprecated-warning { - color: #f93e3e; - font-family: sans-serif; - font-size: 16px; - font-weight: 600; - margin-right: 1em; -} -.swagger-ui span > span.model .brace-close { - padding: 0 0 0 10px; -} -.swagger-ui .prop-name { - display: inline-block; - margin-right: 1em; -} -.swagger-ui .prop-type { - color: #55a; -} -.swagger-ui .prop-enum { - display: block; -} -.swagger-ui .prop-format { - color: #606060; -} -.swagger-ui .servers > label { - color: #3b4151; - font-family: sans-serif; - font-size: 12px; - margin: -20px 15px 0 0; -} -.swagger-ui .servers > label select { - max-width: 100%; - min-width: 130px; - width: 100%; -} -.swagger-ui .servers h4.message { - padding-bottom: 2em; -} -.swagger-ui .servers table tr { - width: 30em; -} -.swagger-ui .servers table td { - display: inline-block; - max-width: 15em; - padding-bottom: 10px; - padding-top: 10px; - vertical-align: middle; -} -.swagger-ui .servers table td:first-of-type { - padding-right: 1em; -} -.swagger-ui .servers table td input { - height: 100%; - width: 100%; -} -.swagger-ui .servers .computed-url { - margin: 2em 0; -} -.swagger-ui .servers .computed-url code { - display: inline-block; - font-size: 16px; - margin: 0 1em; - padding: 4px; -} -.swagger-ui .servers-title { - font-size: 12px; - font-weight: 700; -} -.swagger-ui .operation-servers h4.message { - margin-bottom: 2em; -} -.swagger-ui table { - border-collapse: collapse; - padding: 0 10px; - width: 100%; -} -.swagger-ui table.model tbody tr td { - padding: 0; - vertical-align: top; -} -.swagger-ui table.model tbody tr td:first-of-type { - padding: 0 0 0 2em; - width: 174px; -} -.swagger-ui table.headers td { - color: #3b4151; - font-family: monospace; - font-size: 12px; - font-weight: 300; - font-weight: 600; - vertical-align: middle; -} -.swagger-ui table.headers .header-example { - color: #999; - font-style: italic; -} -.swagger-ui table tbody tr td { - padding: 10px 0 0; - vertical-align: top; -} -.swagger-ui table tbody tr td:first-of-type { - min-width: 6em; - padding: 10px 0; -} -.swagger-ui table thead tr td, -.swagger-ui table thead tr th { - border-bottom: 1px solid rgba(59, 65, 81, 0.2); - color: #3b4151; - font-family: sans-serif; - font-size: 12px; - font-weight: 700; - padding: 12px 0; - text-align: left; -} -.swagger-ui .parameters-col_description { - margin-bottom: 2em; - width: 99%; -} -.swagger-ui .parameters-col_description input { - max-width: 340px; - width: 100%; -} -.swagger-ui .parameters-col_description select { - border-width: 1px; -} -.swagger-ui .parameters-col_description .markdown p, -.swagger-ui .parameters-col_description .renderedMarkdown p { - margin: 0; -} -.swagger-ui .parameter__name { - color: #3b4151; - font-family: sans-serif; - font-size: 16px; - font-weight: 400; - margin-right: 0.75em; -} -.swagger-ui .parameter__name.required { - font-weight: 700; -} -.swagger-ui .parameter__name.required span { - color: red; -} -.swagger-ui .parameter__name.required:after { - color: rgba(255, 0, 0, 0.6); - content: "required"; - font-size: 10px; - padding: 5px; - position: relative; - top: -6px; -} -.swagger-ui .parameter__extension, -.swagger-ui .parameter__in { - color: gray; - font-family: monospace; - font-size: 12px; - font-style: italic; - font-weight: 600; -} -.swagger-ui .parameter__deprecated { - color: red; - font-family: monospace; - font-size: 12px; - font-style: italic; - font-weight: 600; -} -.swagger-ui .parameter__empty_value_toggle { - display: block; - font-size: 13px; - padding-bottom: 12px; - padding-top: 5px; -} -.swagger-ui .parameter__empty_value_toggle input { - margin-right: 7px; - width: auto; -} -.swagger-ui .parameter__empty_value_toggle.disabled { - opacity: 0.7; -} -.swagger-ui .table-container { - padding: 20px; -} -.swagger-ui .response-col_description { - width: 99%; -} -.swagger-ui .response-col_description .markdown p, -.swagger-ui .response-col_description .renderedMarkdown p { - margin: 0; -} -.swagger-ui .response-col_links { - min-width: 6em; -} -.swagger-ui .response__extension { - color: gray; - font-family: monospace; - font-size: 12px; - font-style: italic; - font-weight: 600; -} -.swagger-ui .topbar { - background-color: #1b1b1b; - padding: 10px 0; -} -.swagger-ui .topbar .topbar-wrapper { - align-items: center; - display: flex; - flex-wrap: wrap; - gap: 10px; -} -@media (max-width: 550px) { - .swagger-ui .topbar .topbar-wrapper { - align-items: start; - flex-direction: column; - } -} -.swagger-ui .topbar a { - align-items: center; - color: #fff; - display: flex; - flex: 1; - font-family: sans-serif; - font-size: 1.5em; - font-weight: 700; - max-width: 300px; - -webkit-text-decoration: none; - text-decoration: none; -} -.swagger-ui .topbar a span { - margin: 0; - padding: 0 10px; -} -.swagger-ui .topbar .download-url-wrapper { - display: flex; - flex: 3; - justify-content: flex-end; -} -.swagger-ui .topbar .download-url-wrapper input[type="text"] { - border: 2px solid #62a03f; - border-radius: 4px 0 0 4px; - margin: 0; - max-width: 100%; - outline: none; - width: 100%; -} -.swagger-ui .topbar .download-url-wrapper .select-label { - align-items: center; - color: #f0f0f0; - display: flex; - margin: 0; - max-width: 600px; - width: 100%; -} -.swagger-ui .topbar .download-url-wrapper .select-label span { - flex: 1; - font-size: 16px; - padding: 0 10px 0 0; - text-align: right; -} -.swagger-ui .topbar .download-url-wrapper .select-label select { - border: 2px solid #62a03f; - box-shadow: none; - flex: 2; - outline: none; - width: 100%; -} -.swagger-ui .topbar .download-url-wrapper .download-url-button { - background: #62a03f; - border: none; - border-radius: 0 4px 4px 0; - color: #fff; - font-family: sans-serif; - font-size: 16px; - font-weight: 700; - padding: 4px 30px; -} -@media (max-width: 550px) { - .swagger-ui .topbar .download-url-wrapper { - width: 100%; - } -} -.swagger-ui .info { - margin: 50px 0; -} -.swagger-ui .info.failed-config { - margin-left: auto; - margin-right: auto; - max-width: 880px; - text-align: center; -} -.swagger-ui .info hgroup.main { - margin: 0 0 20px; -} -.swagger-ui .info hgroup.main a { - font-size: 12px; -} -.swagger-ui .info pre { - font-size: 14px; -} -.swagger-ui .info li, -.swagger-ui .info p, -.swagger-ui .info table { - color: #3b4151; - font-family: sans-serif; - font-size: 14px; -} -.swagger-ui .info h1, -.swagger-ui .info h2, -.swagger-ui .info h3, -.swagger-ui .info h4, -.swagger-ui .info h5 { - color: #3b4151; - font-family: sans-serif; -} -.swagger-ui .info a { - color: #4990e2; - font-family: sans-serif; - font-size: 14px; - transition: all 0.4s; -} -.swagger-ui .info a:hover { - color: #1f69c0; -} -.swagger-ui .info > div { - margin: 0 0 5px; -} -.swagger-ui .info .base-url { - color: #3b4151; - font-family: monospace; - font-size: 12px; - font-weight: 300 !important; - font-weight: 600; - margin: 0; -} -.swagger-ui .info .title { - color: #3b4151; - font-family: sans-serif; - font-size: 36px; - margin: 0; -} -.swagger-ui .info .title small { - background: #7d8492; - border-radius: 57px; - display: inline-block; - font-size: 10px; - margin: 0 0 0 5px; - padding: 2px 4px; - position: relative; - top: -5px; - vertical-align: super; -} -.swagger-ui .info .title small.version-stamp { - background-color: #89bf04; -} -.swagger-ui .info .title small pre { - color: #fff; - font-family: sans-serif; - margin: 0; - padding: 0; -} -.swagger-ui .auth-btn-wrapper { - display: flex; - justify-content: center; - padding: 10px 0; -} -.swagger-ui .auth-btn-wrapper .btn-done { - margin-right: 1em; -} -.swagger-ui .auth-wrapper { - display: flex; - flex: 1; - justify-content: flex-end; -} -.swagger-ui .auth-wrapper .authorize { - margin-left: 10px; - margin-right: 10px; - padding-right: 20px; -} -.swagger-ui .auth-container { - border-bottom: 1px solid #ebebeb; - margin: 0 0 10px; - padding: 10px 20px; -} -.swagger-ui .auth-container:last-of-type { - border: 0; - margin: 0; - padding: 10px 20px; -} -.swagger-ui .auth-container h4 { - margin: 5px 0 15px !important; -} -.swagger-ui .auth-container .wrapper { - margin: 0; - padding: 0; -} -.swagger-ui .auth-container input[type="password"], -.swagger-ui .auth-container input[type="text"] { - min-width: 230px; -} -.swagger-ui .auth-container .errors { - background-color: #fee; - border-radius: 4px; - color: red; - color: #3b4151; - font-family: monospace; - font-size: 12px; - font-weight: 600; - margin: 1em; - padding: 10px; -} -.swagger-ui .auth-container .errors b { - margin-right: 1em; - text-transform: capitalize; -} -.swagger-ui .scopes h2 { - color: #3b4151; - font-family: sans-serif; - font-size: 14px; -} -.swagger-ui .scopes h2 a { - color: #4990e2; - cursor: pointer; - font-size: 12px; - padding-left: 10px; - -webkit-text-decoration: underline; - text-decoration: underline; -} -.swagger-ui .scope-def { - padding: 0 0 20px; -} -.swagger-ui .errors-wrapper { - animation: scaleUp 0.5s; - background: rgba(249, 62, 62, 0.1); - border: 2px solid #f93e3e; - border-radius: 4px; - margin: 20px; - padding: 10px 20px; -} -.swagger-ui .errors-wrapper .error-wrapper { - margin: 0 0 10px; -} -.swagger-ui .errors-wrapper .errors h4 { - color: #3b4151; - font-family: monospace; - font-size: 14px; - font-weight: 600; - margin: 0; -} -.swagger-ui .errors-wrapper .errors small { - color: #606060; -} -.swagger-ui .errors-wrapper .errors .message { - white-space: pre-line; -} -.swagger-ui .errors-wrapper .errors .message.thrown { - max-width: 100%; -} -.swagger-ui .errors-wrapper .errors .error-line { - cursor: pointer; - -webkit-text-decoration: underline; - text-decoration: underline; -} -.swagger-ui .errors-wrapper hgroup { - align-items: center; - display: flex; -} -.swagger-ui .errors-wrapper hgroup h4 { - color: #3b4151; - flex: 1; - font-family: sans-serif; - font-size: 20px; - margin: 0; -} -@keyframes scaleUp { - 0% { - opacity: 0; - transform: scale(0.8); - } - to { - opacity: 1; - transform: scale(1); - } -} -.swagger-ui .Resizer.vertical.disabled { - display: none; -} -.swagger-ui .markdown p, -.swagger-ui .markdown pre, -.swagger-ui .renderedMarkdown p, -.swagger-ui .renderedMarkdown pre { - margin: 1em auto; - word-break: break-all; - word-break: break-word; -} -.swagger-ui .markdown pre, -.swagger-ui .renderedMarkdown pre { - background: none; - color: #000; - font-weight: 400; - padding: 0; - white-space: pre-wrap; -} -.swagger-ui .markdown code, -.swagger-ui .renderedMarkdown code { - background: rgba(0, 0, 0, 0.05); - border-radius: 4px; - color: #9012fe; - font-family: monospace; - font-size: 14px; - font-weight: 600; - padding: 5px 7px; -} -.swagger-ui .markdown pre > code, -.swagger-ui .renderedMarkdown pre > code { - display: block; -} -.swagger-ui .json-schema-2020-12 { - background-color: rgba(0, 0, 0, 0.05); - border-radius: 4px; - margin: 0 20px 15px; - padding: 12px 0 12px 20px; -} -.swagger-ui .json-schema-2020-12:first-of-type { - margin: 20px; -} -.swagger-ui .json-schema-2020-12:last-of-type { - margin: 0 20px; -} -.swagger-ui .json-schema-2020-12--embedded { - background-color: inherit; - padding-bottom: 0; - padding-left: inherit; - padding-right: inherit; - padding-top: 0; -} -.swagger-ui .json-schema-2020-12-body { - border-left: 1px dashed rgba(0, 0, 0, 0.1); - margin: 2px 0; -} -.swagger-ui .json-schema-2020-12-body--collapsed { - display: none; -} -.swagger-ui .json-schema-2020-12-accordion { - border: none; - outline: none; - padding-left: 0; -} -.swagger-ui .json-schema-2020-12-accordion__children { - display: inline-block; -} -.swagger-ui .json-schema-2020-12-accordion__icon { - display: inline-block; - height: 18px; - vertical-align: bottom; - width: 18px; -} -.swagger-ui .json-schema-2020-12-accordion__icon--expanded { - transform: rotate(-90deg); - transform-origin: 50% 50%; - transition: transform 0.15s ease-in; -} -.swagger-ui .json-schema-2020-12-accordion__icon--collapsed { - transform: rotate(0deg); - transform-origin: 50% 50%; - transition: transform 0.15s ease-in; -} -.swagger-ui .json-schema-2020-12-accordion__icon svg { - height: 20px; - width: 20px; -} -.swagger-ui .json-schema-2020-12-expand-deep-button { - border: none; - color: #505050; - color: #afaeae; - font-family: sans-serif; - font-size: 12px; - padding-right: 0; -} -.swagger-ui .json-schema-2020-12-keyword { - margin: 5px 0; -} -.swagger-ui .json-schema-2020-12-keyword__children { - border-left: 1px dashed rgba(0, 0, 0, 0.1); - margin: 0 0 0 20px; - padding: 0; -} -.swagger-ui .json-schema-2020-12-keyword__children--collapsed { - display: none; -} -.swagger-ui .json-schema-2020-12-keyword__name { - font-size: 12px; - font-weight: 700; - margin-left: 20px; -} -.swagger-ui .json-schema-2020-12-keyword__name--primary { - color: #3b4151; - font-style: normal; -} -.swagger-ui .json-schema-2020-12-keyword__name--secondary { - color: #6b6b6b; - font-style: italic; -} -.swagger-ui .json-schema-2020-12-keyword__value { - color: #6b6b6b; - font-size: 12px; - font-style: italic; - font-weight: 400; -} -.swagger-ui .json-schema-2020-12-keyword__value--primary { - color: #3b4151; - font-style: normal; -} -.swagger-ui .json-schema-2020-12-keyword__value--secondary { - color: #6b6b6b; - font-style: italic; -} -.swagger-ui .json-schema-2020-12-keyword__value--const, -.swagger-ui .json-schema-2020-12-keyword__value--warning { - border: 1px dashed #6b6b6b; - border-radius: 4px; - color: #3b4151; - color: #6b6b6b; - display: inline-block; - font-family: monospace; - font-style: normal; - font-weight: 600; - line-height: 1.5; - margin-left: 10px; - padding: 1px 4px; -} -.swagger-ui .json-schema-2020-12-keyword__value--warning { - border: 1px dashed red; - color: red; -} -.swagger-ui .json-schema-2020-12-keyword__name--secondary + .json-schema-2020-12-keyword__value--secondary:before { - content: "="; -} -.swagger-ui .json-schema-2020-12__attribute { - color: #3b4151; - font-family: monospace; - font-size: 12px; - padding-left: 10px; - text-transform: lowercase; -} -.swagger-ui .json-schema-2020-12__attribute--primary { - color: #55a; -} -.swagger-ui .json-schema-2020-12__attribute--muted { - color: gray; -} -.swagger-ui .json-schema-2020-12__attribute--warning { - color: red; -} -.swagger-ui .json-schema-2020-12-keyword--description { - color: #6b6b6b; - font-size: 12px; - margin-left: 20px; -} -.swagger-ui .json-schema-2020-12-keyword--description p { - margin: 0; -} -.swagger-ui .json-schema-2020-12__title { - color: #505050; - display: inline-block; - font-family: sans-serif; - font-size: 12px; - font-weight: 700; - line-height: normal; -} -.swagger-ui .json-schema-2020-12__title .json-schema-2020-12-keyword__name { - margin: 0; -} -.swagger-ui .json-schema-2020-12-property { - margin: 7px 0; -} -.swagger-ui .json-schema-2020-12-property .json-schema-2020-12__title { - color: #3b4151; - font-family: monospace; - font-size: 12px; - font-weight: 600; - vertical-align: middle; -} -.swagger-ui .json-schema-2020-12-keyword--properties > ul { - border: none; - margin: 0; - padding: 0; -} -.swagger-ui .json-schema-2020-12-property { - list-style-type: none; -} -.swagger-ui - .json-schema-2020-12-property--required - > .json-schema-2020-12:first-of-type - > .json-schema-2020-12-head - .json-schema-2020-12__title:after { - color: red; - content: "*"; - font-weight: 700; -} -.swagger-ui .json-schema-2020-12-keyword--patternProperties ul { - border: none; - margin: 0; - padding: 0; -} -.swagger-ui .json-schema-2020-12-keyword--patternProperties .json-schema-2020-12__title:first-of-type:after, -.swagger-ui .json-schema-2020-12-keyword--patternProperties .json-schema-2020-12__title:first-of-type:before { - color: #55a; - content: "/"; -} -.swagger-ui .json-schema-2020-12-keyword--enum > ul { - display: inline-block; - margin: 0; - padding: 0; -} -.swagger-ui .json-schema-2020-12-keyword--enum > ul li { - display: inline; - list-style-type: none; -} -.swagger-ui .json-schema-2020-12__constraint { - background-color: #805ad5; - border-radius: 4px; - color: #3b4151; - color: #fff; - font-family: monospace; - font-weight: 600; - line-height: 1.5; - margin-left: 10px; - padding: 1px 3px; -} -.swagger-ui .json-schema-2020-12__constraint--string { - background-color: #d69e2e; - color: #fff; -} -.swagger-ui .json-schema-2020-12-keyword--dependentRequired > ul { - display: inline-block; - margin: 0; - padding: 0; -} -.swagger-ui .json-schema-2020-12-keyword--dependentRequired > ul li { - display: inline; - list-style-type: none; -} -.swagger-ui - .model-box - .json-schema-2020-12:not(.json-schema-2020-12--embedded) - > .json-schema-2020-12-head - .json-schema-2020-12__title:first-of-type { - font-size: 16px; -} -.swagger-ui .model-box > .json-schema-2020-12 { - margin: 0; -} -.swagger-ui .model-box .json-schema-2020-12 { - background-color: transparent; - padding: 0; -} -.swagger-ui .model-box .json-schema-2020-12-accordion, -.swagger-ui .model-box .json-schema-2020-12-expand-deep-button { - background-color: transparent; -} -.swagger-ui - .models - .json-schema-2020-12:not(.json-schema-2020-12--embedded) - > .json-schema-2020-12-head - .json-schema-2020-12__title:first-of-type { - font-size: 16px; -} - -/*# sourceMappingURL=swagger-ui.css.map*/ diff --git a/apps/nextjs/src/app/api/mcp/[transport]/route.ts b/apps/nextjs/src/app/api/mcp/[transport]/route.ts new file mode 100644 index 000000000..2cfcfbb24 --- /dev/null +++ b/apps/nextjs/src/app/api/mcp/[transport]/route.ts @@ -0,0 +1,300 @@ +import { AsyncLocalStorage } from "async_hooks"; +import type { NextRequest } from "next/server"; +import { userAgent } from "next/server"; +import { createMcpHandler } from "mcp-handler"; +import type { McpTool } from "trpc-to-mcp"; +import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js"; + +import { createTRPCContext, mcpRouter } from "@homarr/api/mcp"; +import { API_KEY_HEADER_NAME, getSessionFromApiKeyAsync } from "@homarr/auth/api-key"; +import { extractBaseUrlFromHeaders } from "@homarr/common"; +import { ipAddressFromHeaders } from "@homarr/common/server"; +import { createLogger } from "@homarr/core/infrastructure/logs"; +import { db } from "@homarr/db"; + +import { getPackageVersion } from "~/versions/package-reader"; +import { extractMcpTools } from "../_extract-tools"; + +const logger = createLogger({ module: "mcpRoute" }); + +const AUTH_RATE_WINDOW_MS = 60_000; +const AUTH_MAX_FAILURES = 10; + +interface RateLimitStore { + authFailures: Map; + cleanupTimer: ReturnType | null; +} + +declare global { + var mcpRateLimit: RateLimitStore | undefined; +} + +const rateLimitStore = + globalThis.mcpRateLimit ?? + (globalThis.mcpRateLimit = { + authFailures: new Map(), + cleanupTimer: null, + }); +const authFailures = rateLimitStore.authFailures; + +if (!rateLimitStore.cleanupTimer) { + rateLimitStore.cleanupTimer = setInterval(() => { + const now = Date.now(); + for (const [key, entry] of authFailures) { + if (entry.resetAt < now) authFailures.delete(key); + } + }, AUTH_RATE_WINDOW_MS); + rateLimitStore.cleanupTimer.unref(); +} + +function checkAuthRateLimit(ip: string | null): boolean { + const key = ip ?? "unknown"; + const now = Date.now(); + const entry = authFailures.get(key); + if (!entry || entry.resetAt < now) return true; + return entry.count < AUTH_MAX_FAILURES; +} + +function recordAuthFailure(ip: string | null) { + const key = ip ?? "unknown"; + const now = Date.now(); + const entry = authFailures.get(key); + if (!entry || entry.resetAt < now) { + authFailures.set(key, { count: 1, resetAt: now + AUTH_RATE_WINDOW_MS }); + return; + } + entry.count++; +} + +function clearAuthFailures(ip: string | null) { + authFailures.delete(ip ?? "unknown"); +} + +const callerStorage = new AsyncLocalStorage>(); + +const emptyObjectSchema = { + type: "object" as const, + properties: {}, + required: [] as string[], +}; + +let toolsCache: McpTool[] | null = null; + +function normalizeSchema(schema: McpTool["inputSchema"]) { + if (!schema) return emptyObjectSchema; + const properties = (schema.properties ?? {}) as Record>; + const required = ((schema.required as string[]) ?? []).filter((key) => !("default" in (properties[key] ?? {}))); + return { type: schema.type ?? ("object" as const), properties, required }; +} + +function getTools() { + if (!toolsCache) { + toolsCache = extractMcpTools().map((tool) => ({ + ...tool, + inputSchema: normalizeSchema(tool.inputSchema), + })); + logger.info(`Extracted ${toolsCache.length} MCP tools`); + } + return toolsCache; +} + +const SAFE_ERROR_MESSAGES: Record = { + UNAUTHORIZED: "You do not have permission to perform this action", + FORBIDDEN: "Access denied", + NOT_FOUND: "The requested resource was not found", + BAD_REQUEST: "Invalid request parameters", + INTERNAL_SERVER_ERROR: "An internal error occurred", + TIMEOUT: "The operation timed out", + TOO_MANY_REQUESTS: "Rate limit exceeded, try again later", + CONFLICT: "A conflict occurred with the current state", + PRECONDITION_FAILED: "A precondition for this operation was not met", +}; + +function sanitizeErrorMessage(error: unknown): string { + if (error instanceof Error && "code" in error) { + const trpcCode = (error as Error & { code: string }).code; + const safeMessage = SAFE_ERROR_MESSAGES[trpcCode]; + if (safeMessage) return safeMessage; + } + if (error instanceof Error && error.message.length < 200 && !error.message.includes("/")) { + return error.message; + } + return "Tool execution failed"; +} + +const SERVER_INSTRUCTIONS = `You are connected to Homarr, a self-hosted homelab dashboard. + +## Key Concepts + +**Integrations** are connections to external self-hosted services (Sonarr, Radarr, Plex, Overseerr, Pi-hole, Home Assistant, etc.). Each integration has an \`id\` (integrationId) and a \`kind\` (e.g. "sonarr", "radarr", "overseerr"). Use \`integration_all\` to list them. Many tools require an \`integrationId\` — always fetch it from \`integration_all\` or \`integration_search\` first. + +**Boards** are customizable dashboards containing widgets that display data from integrations. Users can have multiple boards. + +**Apps** are links/bookmarks to self-hosted services displayed on boards. They are separate from integrations — an app is a visual shortcut, an integration is a data connection. + +**Permissions**: Each integration result includes a \`permissions\` object: +- \`hasUseAccess: true\` means you can read data from this integration +- \`hasInteractAccess: true\` means you can perform actions (start/stop, request media, etc.) +- \`hasFullAccess: true\` means you can modify/delete the integration config +If \`hasUseAccess\` is false, the API key owner lacks permission for that integration — this is normal, not an error. Simply skip integrations where you lack the required permission level. + +## Common Workflows + +**"What's coming this week?"** → Use \`calendar_findAllEvents\` to get upcoming media releases from Sonarr (TV), Radarr (movies), Lidarr (music), and Readarr (books). + +**"Search and request a movie/show"** → Use \`integration_searchMediaRequests\` to search across Overseerr/Jellyseerr, then \`integration_requestMedia\` to submit a request. Use \`integration_getMediaRequestOptions\` first for TV shows to pick seasons. + +**"What's streaming right now?"** → Use \`mediaServer_getCurrentStreams\` to see active Plex/Jellyfin/Emby streams. + +**"Check server health"** → Use \`healthMonitoring_getSystemHealthStatus\` for NAS/server metrics or \`healthMonitoring_getClusterHealthStatus\` for Proxmox clusters. + +**"Manage Docker containers"** → Use \`docker_getContainers\` to list containers with status/CPU/memory, then \`docker_startAll\`/\`docker_stopAll\`/\`docker_restartAll\` with container IDs. + +**"Control smart home"** → Use \`smartHome_entityState\` to check a Home Assistant entity, \`smartHome_switchEntity\` to toggle it, or \`smartHome_executeAutomation\` to trigger an automation. + +**"Block/unblock ads"** → Use \`dnsHole_summary\` for Pi-hole/AdGuard stats, \`dnsHole_disable\` to temporarily disable blocking, \`dnsHole_enable\` to re-enable. + +**"Check downloads"** → Use \`downloads_getJobsAndStatuses\` for queue status, \`downloads_pause\`/\`downloads_resume\` to control queues. + +**"Pending media requests"** → Use \`mediaRequests_getLatestRequests\` to see pending/approved/declined requests, \`mediaRequests_answerRequest\` to approve or decline. + +## Tips +- Always call \`integration_all\` first to discover available integrations and their IDs before using integration-dependent tools. +- The \`integrationId\` parameter in widget tools accepts the ID from \`integration_all\`, not the integration name or kind. +- If a tool returns empty results, the user may not have the required integration configured. +- Docker and Kubernetes tools work only if the Homarr instance has access to the Docker socket or Kubernetes cluster.`; + +const mcpHandler = createMcpHandler( + (server) => { + server.server.setRequestHandler(ListToolsRequestSchema, () => ({ + tools: getTools(), + })); + + server.server.setRequestHandler(CallToolRequestSchema, async (request) => { + const { name, arguments: args } = request.params; + const tools = getTools(); + const tool = tools.find((t) => t.name === name); + + if (!tool) { + return { + content: [{ type: "text" as const, text: `Tool "${name}" not found` }], + isError: true, + }; + } + + const caller = callerStorage.getStore(); + if (!caller) { + return { + content: [{ type: "text" as const, text: "Authentication context not available" }], + isError: true, + }; + } + + try { + const procedure = tool.pathInRouter.reduce((acc, part) => acc?.[part], caller); + if (typeof procedure !== "function") { + return { + content: [{ type: "text" as const, text: `Tool "${name}" is not callable` }], + isError: true, + }; + } + const input = args && Object.keys(args).length > 0 ? args : undefined; + const result = await procedure(input); + return { + content: [{ type: "text" as const, text: JSON.stringify(result) }], + }; + } catch (error) { + const message = sanitizeErrorMessage(error); + logger.warn("MCP tool execution failed", { + tool: name, + error: error instanceof Error ? error.message : String(error), + }); + return { + content: [{ type: "text" as const, text: JSON.stringify({ error: message }) }], + isError: true, + }; + } + }); + }, + { + capabilities: { tools: {} }, + instructions: SERVER_INSTRUCTIONS, + serverInfo: { + name: "homarr", + version: getPackageVersion(), + }, + }, + { + basePath: "/api/mcp", + maxDuration: 60, + }, +); + +function extractApiKeyValue(req: NextRequest): string | null { + const apiKeyHeader = req.headers.get(API_KEY_HEADER_NAME); + if (apiKeyHeader) return apiKeyHeader; + + const authHeader = req.headers.get("Authorization"); + if (authHeader?.startsWith("Bearer ")) return authHeader.slice(7); + + return null; +} + +function jsonErrorResponse(status: number, body: Record, extraHeaders: Record = {}) { + return new Response(JSON.stringify(body), { + status, + headers: { "Content-Type": "application/json", ...extraHeaders }, + }); +} + +const handler = async (req: NextRequest) => { + const apiKeyValue = extractApiKeyValue(req); + const ipAddress = ipAddressFromHeaders(req.headers); + const { ua } = userAgent(req); + + if (!checkAuthRateLimit(ipAddress)) { + return jsonErrorResponse( + 429, + { error: "rate_limited", hint: "Too many failed authentication attempts. Try again later." }, + { "Retry-After": "60" }, + ); + } + + if (!apiKeyValue) { + recordAuthFailure(ipAddress); + const baseUrl = extractBaseUrlFromHeaders(req.headers); + return jsonErrorResponse( + 401, + { + error: "unauthorized", + hint: "Authenticate with an ApiKey header or via OAuth at /.well-known/oauth-authorization-server", + }, + { "WWW-Authenticate": `Bearer resource_metadata="${baseUrl}/.well-known/oauth-protected-resource"` }, + ); + } + + if (!apiKeyValue.includes(".")) { + recordAuthFailure(ipAddress); + return jsonErrorResponse(401, { error: "invalid_token", hint: "The token must be in the format '.'." }); + } + + const session = await getSessionFromApiKeyAsync(db, apiKeyValue, ipAddress, ua); + + if (!session) { + recordAuthFailure(ipAddress); + return jsonErrorResponse(401, { + error: "invalid_token", + hint: "The API key was not found or the token is incorrect.", + }); + } + + clearAuthFailures(ipAddress); + logger.info("MCP request authenticated", { userId: session.user.id }); + + const ctx = createTRPCContext({ session, headers: req.headers }); + const caller = mcpRouter.createCaller(ctx); + + return callerStorage.run(caller, () => mcpHandler(req as unknown as Request)); +}; + +export { handler as GET, handler as POST, handler as DELETE }; diff --git a/apps/nextjs/src/app/api/mcp/_extract-tools.ts b/apps/nextjs/src/app/api/mcp/_extract-tools.ts new file mode 100644 index 000000000..431ab9116 --- /dev/null +++ b/apps/nextjs/src/app/api/mcp/_extract-tools.ts @@ -0,0 +1,23 @@ +import { extractToolsFromProcedures } from "trpc-to-mcp"; + +import { mcpRouter } from "@homarr/api/mcp"; + +let cache: ReturnType | null = null; + +export function extractMcpTools() { + if (cache) return cache; + + const originalWarn = console.warn; + console.warn = (...args: unknown[]) => { + if (typeof args[0] === "string" && args[0].includes("[TRPC-TO-MCP]")) return; + originalWarn.apply(console, args); + }; + + try { + cache = extractToolsFromProcedures(mcpRouter); + } finally { + console.warn = originalWarn; + } + + return cache; +} diff --git a/apps/nextjs/src/app/api/mcp/oauth/_store.ts b/apps/nextjs/src/app/api/mcp/oauth/_store.ts new file mode 100644 index 000000000..14352a41b --- /dev/null +++ b/apps/nextjs/src/app/api/mcp/oauth/_store.ts @@ -0,0 +1,157 @@ +import { createHash, randomBytes, timingSafeEqual } from "crypto"; + +interface OAuthClient { + clientId: string; + clientSecret: string; + redirectUris: string[]; + clientName: string; + createdAt: number; +} + +interface AuthCode { + code: string; + clientId: string; + userId: string; + codeChallenge: string; + codeChallengeMethod: string; + redirectUri: string; + expiresAt: number; +} + +interface PendingAuth { + clientId: string; + redirectUri: string; + codeChallenge: string; + codeChallengeMethod: string; + state: string | null; + expiresAt: number; +} + +interface OAuthStore { + clients: Map; + authCodes: Map; + pendingAuths: Map; + cleanupTimer: ReturnType | null; +} + +declare global { + var mcpOAuthStore: OAuthStore | undefined; +} + +const store = + globalThis.mcpOAuthStore ?? + (globalThis.mcpOAuthStore = { + clients: new Map(), + authCodes: new Map(), + pendingAuths: new Map(), + cleanupTimer: null, + }); +const clients = store.clients; +const authCodes = store.authCodes; +const pendingAuths = store.pendingAuths; + +const CLEANUP_INTERVAL_MS = 60_000; +const AUTH_CODE_TTL_MS = 300_000; +const PENDING_AUTH_TTL_MS = 600_000; +const CLIENT_TTL_MS = 24 * 60 * 60 * 1000; + +const MAX_CLIENTS = 1000; +const MAX_AUTH_CODES = 5000; +const MAX_PENDING_AUTHS = 5000; + +if (!store.cleanupTimer) { + store.cleanupTimer = setInterval(() => { + const now = Date.now(); + for (const [key, code] of authCodes) { + if (code.expiresAt < now) authCodes.delete(key); + } + for (const [key, pending] of pendingAuths) { + if (pending.expiresAt < now) pendingAuths.delete(key); + } + for (const [key, client] of clients) { + if (client.createdAt + CLIENT_TTL_MS < now) clients.delete(key); + } + }, CLEANUP_INTERVAL_MS); +} + +export function registerClient(redirectUris: string[], clientName: string) { + if (clients.size >= MAX_CLIENTS) { + return null; + } + + const clientId = randomBytes(16).toString("hex"); + const clientSecret = randomBytes(32).toString("hex"); + const client: OAuthClient = { + clientId, + clientSecret, + redirectUris, + clientName, + createdAt: Date.now(), + }; + clients.set(clientId, client); + return { clientId, clientSecret }; +} + +export function getClient(clientId: string) { + return clients.get(clientId) ?? null; +} + +export function createAuthCode( + clientId: string, + userId: string, + codeChallenge: string, + codeChallengeMethod: string, + redirectUri: string, +) { + if (authCodes.size >= MAX_AUTH_CODES) { + return null; + } + + const code = randomBytes(32).toString("hex"); + authCodes.set(code, { + code, + clientId, + userId, + codeChallenge, + codeChallengeMethod, + redirectUri, + expiresAt: Date.now() + AUTH_CODE_TTL_MS, + }); + return code; +} + +export function consumeAuthCode(code: string) { + const authCode = authCodes.get(code); + if (!authCode) return null; + authCodes.delete(code); + if (authCode.expiresAt < Date.now()) return null; + return authCode; +} + +export function verifyPkce(codeVerifier: string, codeChallenge: string, method: string) { + if (method !== "S256") return false; + const computed = createHash("sha256").update(codeVerifier).digest("base64url"); + if (computed.length !== codeChallenge.length) return false; + return timingSafeEqual(Buffer.from(computed), Buffer.from(codeChallenge)); +} + +export function storePendingAuth(params: Omit) { + if (pendingAuths.size >= MAX_PENDING_AUTHS) { + return null; + } + + const id = randomBytes(16).toString("hex"); + pendingAuths.set(id, { + ...params, + expiresAt: Date.now() + PENDING_AUTH_TTL_MS, + }); + return id; +} + +export function consumePendingAuth(id: string) { + const pending = pendingAuths.get(id); + if (!pending) return null; + pendingAuths.delete(id); + if (pending.expiresAt < Date.now()) return null; + return pending; +} diff --git a/apps/nextjs/src/app/api/mcp/oauth/authorize/route.ts b/apps/nextjs/src/app/api/mcp/oauth/authorize/route.ts new file mode 100644 index 000000000..927cdf60f --- /dev/null +++ b/apps/nextjs/src/app/api/mcp/oauth/authorize/route.ts @@ -0,0 +1,143 @@ +import type { NextRequest } from "next/server"; + +import { auth } from "@homarr/auth/next"; + +import { consumePendingAuth, createAuthCode, getClient, storePendingAuth } from "../_store"; + +export async function GET(req: NextRequest) { + const url = new URL(req.url); + const session = await auth(); + + const pendingId = url.searchParams.get("pending"); + if (pendingId) { + if (!session?.user) { + return Response.json( + { + error: "access_denied", + error_description: "Login was not completed", + }, + { status: 403 }, + ); + } + + const pending = consumePendingAuth(pendingId); + if (!pending) { + return Response.json( + { + error: "invalid_request", + error_description: "Authorization request expired, please try again", + }, + { status: 400 }, + ); + } + + const code = createAuthCode( + pending.clientId, + session.user.id, + pending.codeChallenge, + pending.codeChallengeMethod, + pending.redirectUri, + ); + if (!code) { + return Response.json( + { + error: "server_error", + error_description: "Server is busy, please try again later", + }, + { status: 503 }, + ); + } + + const redirect = new URL(pending.redirectUri); + redirect.searchParams.set("code", code); + if (pending.state) redirect.searchParams.set("state", pending.state); + return Response.redirect(redirect.toString()); + } + + const clientId = url.searchParams.get("client_id"); + const redirectUri = url.searchParams.get("redirect_uri"); + const codeChallenge = url.searchParams.get("code_challenge"); + const codeChallengeMethod = url.searchParams.get("code_challenge_method") ?? "S256"; + const state = url.searchParams.get("state"); + + if (!clientId || !redirectUri || !codeChallenge) { + return Response.json( + { + error: "invalid_request", + error_description: "Missing required parameters", + }, + { status: 400 }, + ); + } + + if (codeChallengeMethod !== "S256") { + return Response.json( + { + error: "invalid_request", + error_description: "Only S256 code_challenge_method is supported", + }, + { status: 400 }, + ); + } + + const client = getClient(clientId); + if (!client) { + return Response.json( + { + error: "invalid_client", + error_description: + "Unknown client_id — the server was restarted and lost the registration. Please re-run the auth command to re-register.", + }, + { status: 400 }, + ); + } + + if (!client.redirectUris.includes(redirectUri)) { + return Response.json( + { + error: "invalid_request", + error_description: "redirect_uri not registered", + }, + { status: 400 }, + ); + } + + if (session?.user) { + const code = createAuthCode(clientId, session.user.id, codeChallenge, codeChallengeMethod, redirectUri); + if (!code) { + return Response.json( + { + error: "server_error", + error_description: "Server is busy, please try again later", + }, + { status: 503 }, + ); + } + + const redirect = new URL(redirectUri); + redirect.searchParams.set("code", code); + if (state) redirect.searchParams.set("state", state); + return Response.redirect(redirect.toString()); + } + + const id = storePendingAuth({ + clientId, + redirectUri, + codeChallenge, + codeChallengeMethod, + state, + }); + if (!id) { + return Response.json( + { + error: "server_error", + error_description: "Server is busy, please try again later", + }, + { status: 503 }, + ); + } + + const loginUrl = new URL("/auth/login", url.origin); + loginUrl.searchParams.set("callbackUrl", `/api/mcp/oauth/authorize?pending=${id}`); + return Response.redirect(loginUrl.toString()); +} diff --git a/apps/nextjs/src/app/api/mcp/oauth/register/route.ts b/apps/nextjs/src/app/api/mcp/oauth/register/route.ts new file mode 100644 index 000000000..af20cca49 --- /dev/null +++ b/apps/nextjs/src/app/api/mcp/oauth/register/route.ts @@ -0,0 +1,107 @@ +import { registerClient } from "../_store"; + +interface RateLimitStore { + attempts: Map; + timer: ReturnType | null; +} + +const REGISTER_RATE_WINDOW_MS = 60_000; +const REGISTER_MAX_ATTEMPTS = 5; + +declare global { + var mcpRegisterRateLimit: RateLimitStore | undefined; +} + +const store = + globalThis.mcpRegisterRateLimit ?? + (globalThis.mcpRegisterRateLimit = { + attempts: new Map(), + timer: null, + }); +const registerAttempts = store.attempts; + +if (!store.timer) { + store.timer = setInterval(() => { + const now = Date.now(); + for (const [key, entry] of registerAttempts) { + if (entry.resetAt < now) registerAttempts.delete(key); + } + }, REGISTER_RATE_WINDOW_MS); + store.timer.unref(); +} + +function getClientIp(req: Request): string { + const forwarded = req.headers.get("x-forwarded-for"); + return forwarded?.split(",")[0]?.trim() ?? "unknown"; +} + +function isValidRedirectUri(uri: string): boolean { + try { + const parsed = new URL(uri); + return parsed.protocol === "http:" || parsed.protocol === "https:"; + } catch { + return false; + } +} + +export async function POST(req: Request) { + const ip = getClientIp(req); + const now = Date.now(); + const entry = registerAttempts.get(ip); + + if (entry && entry.resetAt >= now && entry.count >= REGISTER_MAX_ATTEMPTS) { + return Response.json( + { error: "rate_limited", error_description: "Too many registration attempts, try again later" }, + { status: 429, headers: { "Retry-After": "60" } }, + ); + } + + const existing = registerAttempts.get(ip); + if (!existing || existing.resetAt < now) { + registerAttempts.set(ip, { count: 1, resetAt: now + REGISTER_RATE_WINDOW_MS }); + } else { + existing.count++; + } + + const body = (await req.json().catch(() => null)) as Record | null; + if (!body) { + return Response.json({ error: "invalid_request", error_description: "Invalid JSON body" }, { status: 400 }); + } + + const redirectUris = body.redirect_uris; + const clientName = typeof body.client_name === "string" ? body.client_name.slice(0, 256) : "MCP Client"; + + if (!Array.isArray(redirectUris) || redirectUris.length === 0 || redirectUris.length > 10) { + return Response.json( + { error: "invalid_client_metadata", error_description: "redirect_uris must be an array of 1-10 URIs" }, + { status: 400 }, + ); + } + + const validUris = redirectUris.filter((uri): uri is string => typeof uri === "string" && isValidRedirectUri(uri)); + if (validUris.length !== redirectUris.length) { + return Response.json( + { error: "invalid_client_metadata", error_description: "All redirect_uris must be valid http or https URLs" }, + { status: 400 }, + ); + } + + const result = registerClient(validUris, clientName); + if (!result) { + return Response.json( + { error: "server_error", error_description: "Too many registered clients, please try again later" }, + { status: 503 }, + ); + } + + return Response.json( + { + client_id: result.clientId, + client_secret: result.clientSecret, + redirect_uris: validUris, + client_name: clientName, + token_endpoint_auth_method: "none", + }, + { status: 201 }, + ); +} diff --git a/apps/nextjs/src/app/api/mcp/oauth/token/route.ts b/apps/nextjs/src/app/api/mcp/oauth/token/route.ts new file mode 100644 index 000000000..1122e1950 --- /dev/null +++ b/apps/nextjs/src/app/api/mcp/oauth/token/route.ts @@ -0,0 +1,143 @@ +import { randomBytes } from "crypto"; + +import { hashPasswordAsync } from "@homarr/auth"; +import { generateSecureRandomToken } from "@homarr/common/server"; +import { createLogger } from "@homarr/core/infrastructure/logs"; +import { db } from "@homarr/db"; +import { apiKeys } from "@homarr/db/schema"; + +import { consumeAuthCode, verifyPkce } from "../_store"; + +const logger = createLogger({ module: "mcpOAuthToken" }); + +interface RateLimitStore { + failures: Map; + timer: ReturnType | null; +} + +const TOKEN_RATE_WINDOW_MS = 60_000; +const TOKEN_MAX_FAILURES = 10; + +declare global { + var mcpTokenRateLimit: RateLimitStore | undefined; +} + +const store = + globalThis.mcpTokenRateLimit ?? + (globalThis.mcpTokenRateLimit = { + failures: new Map(), + timer: null, + }); +const tokenFailures = store.failures; + +if (!store.timer) { + store.timer = setInterval(() => { + const now = Date.now(); + for (const [key, entry] of tokenFailures) { + if (entry.resetAt < now) tokenFailures.delete(key); + } + }, TOKEN_RATE_WINDOW_MS); + store.timer.unref(); +} + +function getClientIp(req: Request): string { + const forwarded = req.headers.get("x-forwarded-for"); + return forwarded?.split(",")[0]?.trim() ?? "unknown"; +} + +function recordTokenFailure(ip: string) { + const now = Date.now(); + const existing = tokenFailures.get(ip); + if (!existing || existing.resetAt < now) { + tokenFailures.set(ip, { count: 1, resetAt: now + TOKEN_RATE_WINDOW_MS }); + return; + } + existing.count++; +} + +export async function POST(req: Request) { + const ip = getClientIp(req); + const now = Date.now(); + const entry = tokenFailures.get(ip); + + if (entry && entry.resetAt >= now && entry.count >= TOKEN_MAX_FAILURES) { + return Response.json( + { error: "rate_limited", error_description: "Too many requests, try again later" }, + { status: 429, headers: { "Retry-After": "60" } }, + ); + } + + let params: Record; + try { + const body = await req.formData().catch(() => null); + params = body + ? (Object.fromEntries(body.entries()) as Record) + : ((await req.json()) as Record); + } catch { + return Response.json( + { error: "invalid_request", error_description: "Could not parse request body" }, + { status: 400 }, + ); + } + + const { grant_type, code, code_verifier, redirect_uri } = params; + + if (grant_type !== "authorization_code") { + return Response.json({ error: "unsupported_grant_type" }, { status: 400 }); + } + + if (!code || !code_verifier) { + return Response.json( + { error: "invalid_request", error_description: "Missing code or code_verifier" }, + { status: 400 }, + ); + } + + if (code.length > 256 || code_verifier.length > 256) { + return Response.json({ error: "invalid_request", error_description: "Parameter too long" }, { status: 400 }); + } + + const authCode = consumeAuthCode(code); + if (!authCode) { + recordTokenFailure(ip); + return Response.json( + { error: "invalid_grant", error_description: "Invalid or expired authorization code" }, + { status: 400 }, + ); + } + + if (redirect_uri && redirect_uri !== authCode.redirectUri) { + recordTokenFailure(ip); + return Response.json({ error: "invalid_grant", error_description: "redirect_uri mismatch" }, { status: 400 }); + } + + if (!verifyPkce(code_verifier, authCode.codeChallenge, authCode.codeChallengeMethod)) { + recordTokenFailure(ip); + return Response.json({ error: "invalid_grant", error_description: "PKCE verification failed" }, { status: 400 }); + } + + try { + const id = randomBytes(4).toString("hex"); + const randomToken = generateSecureRandomToken(24); + const hashedToken = await hashPasswordAsync(randomToken); + + await db.insert(apiKeys).values({ + id, + apiKey: hashedToken, + userId: authCode.userId, + }); + + const accessToken = `${id}.${randomToken}`; + + return Response.json({ + access_token: accessToken, + token_type: "Bearer", + scope: "mcp:tools", + }); + } catch (error) { + logger.error("Failed to create API key during OAuth token exchange", { + error: error instanceof Error ? error.message : String(error), + }); + return Response.json({ error: "server_error", error_description: "Failed to issue access token" }, { status: 500 }); + } +} diff --git a/apps/nextjs/src/app/api/trpc/[trpc]/route.ts b/apps/nextjs/src/app/api/trpc/[trpc]/route.ts index 8ac6c166d..735d83e7d 100644 --- a/apps/nextjs/src/app/api/trpc/[trpc]/route.ts +++ b/apps/nextjs/src/app/api/trpc/[trpc]/route.ts @@ -44,7 +44,8 @@ const handler = auth(async (req) => { const response = await fetchRequestHandler({ endpoint: trpcPath, router: appRouter, - req, + // mcp-handler globally augments Request with `auth?: AuthInfo`, conflicting with NextAuth's `auth: Session | null` + req: req as unknown as Request, createContext: () => createTRPCContext({ session, headers: req.headers }), onError({ error, path, type }) { logger.error(new ErrorWithMetadata("tRPC Error occured", { path, type }, { cause: error })); diff --git a/packages/api/package.json b/packages/api/package.json index 17d5ae476..482913f96 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -12,7 +12,8 @@ "./server": "./src/server.ts", "./websocket": "./src/websocket.ts", "./shared": "./src/shared.ts", - "./open-api": "./src/open-api.ts" + "./open-api": "./src/open-api.ts", + "./mcp": "./src/mcp.ts" }, "scripts": { "clean": "rm -rf .turbo node_modules", @@ -50,6 +51,7 @@ "react": "catalog:", "react-dom": "catalog:", "superjson": "catalog:", + "trpc-to-mcp": "catalog:", "trpc-to-openapi": "catalog:", "zod": "catalog:" }, diff --git a/packages/api/src/mcp.ts b/packages/api/src/mcp.ts new file mode 100644 index 000000000..299a88e0b --- /dev/null +++ b/packages/api/src/mcp.ts @@ -0,0 +1,36 @@ +export { createTRPCContext } from "./trpc"; + +import { createTRPCRouter } from "./trpc"; +import { appRouter as appRouterForApps } from "./router/app"; +import { apiKeysRouter } from "./router/apiKeys"; +import { boardRouter } from "./router/board"; +import { dockerRouter } from "./router/docker/docker-router"; +import { iconsRouter } from "./router/icons"; +import { infoRouter } from "./router/info"; +import { integrationRouter } from "./router/integration/integration-router"; +import { inviteRouter } from "./router/invite"; +import { calendarRouter } from "./router/widgets/calendar"; +import { dnsHoleRouter } from "./router/widgets/dns-hole"; +import { downloadsRouter } from "./router/widgets/downloads"; +import { healthMonitoringRouter } from "./router/widgets/health-monitoring"; +import { mediaRequestsRouter } from "./router/widgets/media-requests"; +import { mediaServerRouter } from "./router/widgets/media-server"; +import { smartHomeRouter } from "./router/widgets/smart-home"; + +export const mcpRouter = createTRPCRouter({ + app: appRouterForApps, + apiKeys: apiKeysRouter, + board: boardRouter, + docker: dockerRouter, + icon: iconsRouter, + info: infoRouter, + integration: integrationRouter, + invite: inviteRouter, + calendar: calendarRouter, + dnsHole: dnsHoleRouter, + downloads: downloadsRouter, + healthMonitoring: healthMonitoringRouter, + mediaRequests: mediaRequestsRouter, + mediaServer: mediaServerRouter, + smartHome: smartHomeRouter, +}); diff --git a/packages/api/src/open-api.ts b/packages/api/src/open-api.ts index d789582df..5c75cfbc2 100644 --- a/packages/api/src/open-api.ts +++ b/packages/api/src/open-api.ts @@ -3,6 +3,7 @@ import { generateOpenApiDocument } from "trpc-to-openapi"; import { API_KEY_HEADER_NAME } from "@homarr/auth/api-key"; import { appRouter } from "./router/app"; +import { boardRouter } from "./router/board"; import { infoRouter } from "./router/info"; import { inviteRouter } from "./router/invite"; import { userRouter } from "./router/user"; @@ -10,6 +11,7 @@ import { createTRPCRouter } from "./trpc"; export const openApiRouter = createTRPCRouter({ appRouter, + boardRouter, infoRouter, inviteRouter, userRouter, diff --git a/packages/api/src/router/apiKeys.ts b/packages/api/src/router/apiKeys.ts index 71efd98ca..26bbb4552 100644 --- a/packages/api/src/router/apiKeys.ts +++ b/packages/api/src/router/apiKeys.ts @@ -1,7 +1,8 @@ import { z } from "zod/v4"; +import { randomBytes } from "crypto"; + import { hashPasswordAsync } from "@homarr/auth"; -import { createId } from "@homarr/common"; import { generateSecureRandomToken } from "@homarr/common/server"; import { db, eq } from "@homarr/db"; import { apiKeys } from "@homarr/db/schema"; @@ -9,39 +10,58 @@ import { apiKeys } from "@homarr/db/schema"; import { createTRPCRouter, permissionRequiredProcedure } from "../trpc"; export const apiKeysRouter = createTRPCRouter({ - getAll: permissionRequiredProcedure.requiresPermission("admin").query(() => { - return db.query.apiKeys.findMany({ - columns: { - id: true, - apiKey: false, - }, - with: { - user: { - columns: { - id: true, - name: true, - image: true, - email: true, + getAll: permissionRequiredProcedure + .requiresPermission("admin") + .meta({ + mcp: { enabled: true, description: "List all API keys (admin only)" }, + }) + .query(() => { + return db.query.apiKeys.findMany({ + columns: { + id: true, + apiKey: false, + }, + with: { + user: { + columns: { + id: true, + name: true, + image: true, + email: true, + }, }, }, + }); + }), + create: permissionRequiredProcedure + .requiresPermission("admin") + .meta({ + mcp: { + enabled: true, + description: "Create a new API key for the current user (admin only)", }, - }); - }), - create: permissionRequiredProcedure.requiresPermission("admin").mutation(async ({ ctx }) => { - const randomToken = generateSecureRandomToken(64); - const hashedRandomToken = await hashPasswordAsync(randomToken); - const id = createId(); - await db.insert(apiKeys).values({ - id, - apiKey: hashedRandomToken, - userId: ctx.session.user.id, - }); - return { - apiKey: `${id}.${randomToken}`, - }; - }), + }) + .mutation(async ({ ctx }) => { + const id = randomBytes(4).toString("hex"); + const token = generateSecureRandomToken(24); + const hashedToken = await hashPasswordAsync(token); + await db.insert(apiKeys).values({ + id, + apiKey: hashedToken, + userId: ctx.session.user.id, + }); + return { + apiKey: `${id}.${token}`, + }; + }), delete: permissionRequiredProcedure .requiresPermission("admin") + .meta({ + mcp: { + enabled: true, + description: "Delete an API key by ID (admin only). REQUIRED: apiKeyId (string)", + }, + }) .input(z.object({ apiKeyId: z.string() })) .mutation(async ({ ctx, input }) => { await ctx.db.delete(apiKeys).where(eq(apiKeys.id, input.apiKeyId)).limit(1); diff --git a/packages/api/src/router/app.ts b/packages/api/src/router/app.ts index 2f2445330..1b55d0260 100644 --- a/packages/api/src/router/app.ts +++ b/packages/api/src/router/app.ts @@ -21,7 +21,19 @@ export const appRouter = createTRPCRouter({ getPaginated: protectedProcedure .input(paginatedSchema) .output(z.object({ items: z.array(selectAppSchema), totalCount: z.number() })) - .meta({ openapi: { method: "GET", path: "/api/apps/paginated", tags: ["apps"], protect: true } }) + .meta({ + openapi: { + method: "GET", + path: "/api/apps/paginated", + tags: ["apps"], + protect: true, + }, + mcp: { + enabled: true, + description: + "List apps with pagination. OPTIONAL: search (string to filter by name), pageSize (number, default 10), page (number, default 1). All fields are optional — call with no arguments to get the first page", + }, + }) .query(async ({ input, ctx }) => { const whereQuery = input.search ? like(apps.name, `%${input.search.trim()}%`) : undefined; const totalCount = await ctx.db.$count(apps, whereQuery); @@ -41,16 +53,40 @@ export const appRouter = createTRPCRouter({ all: protectedProcedure .input(z.void()) .output(z.array(selectAppSchema)) - .meta({ openapi: { method: "GET", path: "/api/apps", tags: ["apps"], protect: true } }) + .meta({ + openapi: { + method: "GET", + path: "/api/apps", + tags: ["apps"], + protect: true, + }, + mcp: { enabled: true, description: "List all apps" }, + }) .query(({ ctx }) => { return ctx.db.query.apps.findMany({ orderBy: asc(apps.name), }); }), search: protectedProcedure - .input(z.object({ query: z.string(), limit: z.number().min(1).max(100).default(10) })) + .input( + z.object({ + query: z.string(), + limit: z.number().min(1).max(100).default(10), + }), + ) .output(z.array(selectAppSchema)) - .meta({ openapi: { method: "GET", path: "/api/apps/search", tags: ["apps"], protect: true } }) + .meta({ + openapi: { + method: "GET", + path: "/api/apps/search", + tags: ["apps"], + protect: true, + }, + mcp: { + enabled: true, + description: "Search apps by name. REQUIRED: query (search string). OPTIONAL: limit (number, default 10)", + }, + }) .query(({ ctx, input }) => { return ctx.db.query.apps.findMany({ where: like(apps.name, `%${input.query}%`), @@ -62,7 +98,14 @@ export const appRouter = createTRPCRouter({ .input(z.void()) .output( z.array( - selectAppSchema.pick({ id: true, name: true, iconUrl: true, href: true, pingUrl: true, description: true }), + selectAppSchema.pick({ + id: true, + name: true, + iconUrl: true, + href: true, + pingUrl: true, + description: true, + }), ), ) .meta({ @@ -89,7 +132,15 @@ export const appRouter = createTRPCRouter({ byId: publicProcedure .input(byIdSchema) .output(selectAppSchema) - .meta({ openapi: { method: "GET", path: "/api/apps/{id}", tags: ["apps"], protect: true } }) + .meta({ + openapi: { + method: "GET", + path: "/api/apps/{id}", + tags: ["apps"], + protect: true, + }, + mcp: { enabled: true, description: "Get a single app by its ID. REQUIRED: id (app ID string)" }, + }) .query(async ({ ctx, input }) => { const repository = new AppRepository(ctx.db, ctx.session?.user ?? null); const app = await repository.getByIdAsync(input.id); @@ -111,7 +162,19 @@ export const appRouter = createTRPCRouter({ .requiresPermission("app-create") .input(appManageSchema) .output(z.object({ appId: z.string() }).and(selectAppSchema)) - .meta({ openapi: { method: "POST", path: "/api/apps", tags: ["apps"], protect: true } }) + .meta({ + openapi: { + method: "POST", + path: "/api/apps", + tags: ["apps"], + protect: true, + }, + mcp: { + enabled: true, + description: + "Create a new app (bookmark/shortcut to a service). REQUIRED: name (string), iconUrl (icon URL string), href (app URL, http/https or blank). OPTIONAL: description (string or null), pingUrl (URL to check reachability, or empty string)", + }, + }) .mutation(async ({ ctx, input }) => { const id = createId(); const insertValues = { @@ -146,7 +209,19 @@ export const appRouter = createTRPCRouter({ .requiresPermission("app-modify-all") .input(convertIntersectionToZodObject(appEditSchema)) .output(z.void()) - .meta({ openapi: { method: "PATCH", path: "/api/apps/{id}", tags: ["apps"], protect: true } }) + .meta({ + openapi: { + method: "PATCH", + path: "/api/apps/{id}", + tags: ["apps"], + protect: true, + }, + mcp: { + enabled: true, + description: + "Update an existing app. REQUIRED: id (app ID), name, iconUrl, href. OPTIONAL: description (string or null), pingUrl (URL or empty string)", + }, + }) .mutation(async ({ ctx, input }) => { const app = await ctx.db.query.apps.findFirst({ where: eq(apps.id, input.id), @@ -173,7 +248,15 @@ export const appRouter = createTRPCRouter({ delete: permissionRequiredProcedure .requiresPermission("app-full-all") .output(z.void()) - .meta({ openapi: { method: "DELETE", path: "/api/apps/{id}", tags: ["apps"], protect: true } }) + .meta({ + openapi: { + method: "DELETE", + path: "/api/apps/{id}", + tags: ["apps"], + protect: true, + }, + mcp: { enabled: true, description: "Delete an app by ID. REQUIRED: id (app ID string)" }, + }) .input(byIdSchema) .mutation(async ({ ctx, input }) => { await ctx.db.delete(apps).where(eq(apps.id, input.id)); diff --git a/packages/api/src/router/board.ts b/packages/api/src/router/board.ts index acd2367c9..07ec44d07 100644 --- a/packages/api/src/router/board.ts +++ b/packages/api/src/router/board.ts @@ -19,6 +19,7 @@ import { integrationGroupPermissions, integrationItems, integrationUserPermissions, + integrations, itemLayouts, items, layouts, @@ -39,6 +40,7 @@ import { importOldmarrAsync } from "@homarr/old-import"; import { importJsonFileSchema } from "@homarr/old-import/shared"; import { oldmarrConfigSchema } from "@homarr/old-schema"; import { + addItemToBoardSchema, boardByNameSchema, boardChangeVisibilitySchema, boardCreateSchema, @@ -48,6 +50,7 @@ import { boardSavePartialSettingsSchema, boardSavePermissionsSchema, boardSaveSchema, + boardSummarySchema, } from "@homarr/validation/board"; import { byIdSchema } from "@homarr/validation/common"; import { zodUnionFromArray } from "@homarr/validation/enums"; @@ -114,78 +117,89 @@ export const boardRouter = createTRPCRouter({ where: boardWhere, }); }), - getAllBoards: publicProcedure.query(async ({ ctx }) => { - const userId = ctx.session?.user.id; - const permissionsOfCurrentUserWhenPresent = await ctx.db.query.boardUserPermissions.findMany({ - where: eq(boardUserPermissions.userId, userId ?? ""), - }); + getAllBoards: publicProcedure + .input(z.void()) + .output(z.array(boardSummarySchema)) + .meta({ + openapi: { method: "GET", path: "/api/boards", tags: ["boards"], protect: true }, + mcp: { + enabled: true, + description: + "List all boards the current user can access. Returns id, name, logoImageUrl, isPublic, creator, isHome and isMobileHome flags", + }, + }) + .query(async ({ ctx }) => { + const userId = ctx.session?.user.id; + const permissionsOfCurrentUserWhenPresent = await ctx.db.query.boardUserPermissions.findMany({ + where: eq(boardUserPermissions.userId, userId ?? ""), + }); - const permissionsOfCurrentUserGroupsWhenPresent = await ctx.db.query.groupMembers.findMany({ - where: eq(groupMembers.userId, userId ?? ""), - with: { - group: { - with: { - boardPermissions: {}, + const permissionsOfCurrentUserGroupsWhenPresent = await ctx.db.query.groupMembers.findMany({ + where: eq(groupMembers.userId, userId ?? ""), + with: { + group: { + with: { + boardPermissions: {}, + }, }, }, - }, - }); - const boardIds = permissionsOfCurrentUserWhenPresent - .map((permission) => permission.boardId) - .concat( - permissionsOfCurrentUserGroupsWhenPresent - .map((groupMember) => groupMember.group.boardPermissions.map((permission) => permission.boardId)) - .flat(), - ); + }); + const boardIds = permissionsOfCurrentUserWhenPresent + .map((permission) => permission.boardId) + .concat( + permissionsOfCurrentUserGroupsWhenPresent + .map((groupMember) => groupMember.group.boardPermissions.map((permission) => permission.boardId)) + .flat(), + ); - const currentUserWhenPresent = await ctx.db.query.users.findFirst({ - where: eq(users.id, userId ?? ""), - }); + const currentUserWhenPresent = await ctx.db.query.users.findFirst({ + where: eq(users.id, userId ?? ""), + }); - const dbBoards = await ctx.db.query.boards.findMany({ - columns: { - id: true, - name: true, - logoImageUrl: true, - isPublic: true, - }, - with: { - creator: { - columns: { - id: true, - name: true, - image: true, - email: true, + const dbBoards = await ctx.db.query.boards.findMany({ + columns: { + id: true, + name: true, + logoImageUrl: true, + isPublic: true, + }, + with: { + creator: { + columns: { + id: true, + name: true, + image: true, + email: true, + }, + }, + userPermissions: { + where: eq(boardUserPermissions.userId, ctx.session?.user.id ?? ""), + }, + groupPermissions: { + where: + permissionsOfCurrentUserGroupsWhenPresent.length >= 1 + ? inArray( + boardGroupPermissions.groupId, + permissionsOfCurrentUserGroupsWhenPresent.map((groupMember) => groupMember.groupId), + ) + : undefined, }, }, - userPermissions: { - where: eq(boardUserPermissions.userId, ctx.session?.user.id ?? ""), - }, - groupPermissions: { - where: - permissionsOfCurrentUserGroupsWhenPresent.length >= 1 - ? inArray( - boardGroupPermissions.groupId, - permissionsOfCurrentUserGroupsWhenPresent.map((groupMember) => groupMember.groupId), - ) - : undefined, - }, - }, - // Allow viewing all boards if the user has the permission - where: ctx.session?.user.permissions.includes("board-view-all") - ? undefined - : or( - eq(boards.isPublic, true), - eq(boards.creatorId, ctx.session?.user.id ?? ""), - boardIds.length > 0 ? inArray(boards.id, boardIds) : undefined, - ), - }); - return dbBoards.map((board) => ({ - ...board, - isHome: currentUserWhenPresent?.homeBoardId === board.id, - isMobileHome: currentUserWhenPresent?.mobileHomeBoardId === board.id, - })); - }), + // Allow viewing all boards if the user has the permission + where: ctx.session?.user.permissions.includes("board-view-all") + ? undefined + : or( + eq(boards.isPublic, true), + eq(boards.creatorId, ctx.session?.user.id ?? ""), + boardIds.length > 0 ? inArray(boards.id, boardIds) : undefined, + ), + }); + return dbBoards.map((board) => ({ + ...board, + isHome: currentUserWhenPresent?.homeBoardId === board.id, + isMobileHome: currentUserWhenPresent?.mobileHomeBoardId === board.id, + })); + }), search: publicProcedure .input(z.object({ query: z.string(), limit: z.number().min(1).max(100).default(10) })) .query(async ({ ctx, input }) => { @@ -262,7 +276,16 @@ export const boardRouter = createTRPCRouter({ }), createBoard: permissionRequiredProcedure .requiresPermission("board-create") + .meta({ + openapi: { method: "POST", path: "/api/boards", tags: ["boards"], protect: true }, + mcp: { + enabled: true, + description: + "Create a new board with a name, column count (1-24), and isPublic flag. Returns { boardId }. Requires board-create permission", + }, + }) .input(boardCreateSchema) + .output(z.object({ boardId: z.string() })) .mutation(async ({ ctx, input }) => { const boardId = createId(); @@ -547,11 +570,22 @@ export const boardRouter = createTRPCRouter({ .set({ isPublic: input.visibility === "public" }) .where(eq(boards.id, input.id)); }), - deleteBoard: protectedProcedure.input(z.object({ id: z.string() })).mutation(async ({ ctx, input }) => { - await throwIfActionForbiddenAsync(ctx, eq(boards.id, input.id), "full"); + deleteBoard: protectedProcedure + .meta({ + openapi: { method: "DELETE", path: "/api/boards/{id}", tags: ["boards"], protect: true }, + mcp: { + enabled: true, + description: + "Delete a board by its ID. Requires full permission on the board. Use board_getAllBoards to find the board ID", + }, + }) + .input(z.object({ id: z.string() })) + .output(z.void()) + .mutation(async ({ ctx, input }) => { + await throwIfActionForbiddenAsync(ctx, eq(boards.id, input.id), "full"); - await ctx.db.delete(boards).where(eq(boards.id, input.id)); - }), + await ctx.db.delete(boards).where(eq(boards.id, input.id)); + }), setHomeBoard: protectedProcedure.input(z.object({ id: z.string() })).mutation(async ({ ctx, input }) => { await throwIfActionForbiddenAsync(ctx, eq(boards.id, input.id), "view"); @@ -1327,6 +1361,119 @@ export const boardRouter = createTRPCRouter({ const oldmarr = oldmarrConfigSchema.parse(JSON.parse(content)); await importOldmarrAsync(ctx.db, oldmarr, input.configuration); }), + addItem: protectedProcedure + .meta({ + openapi: { method: "POST", path: "/api/boards/items", tags: ["boards"], protect: true }, + mcp: { + enabled: true, + description: + "Add a widget/app item to a board. Automatically places it in the first empty section at the next free grid position. Provide boardId (from board_getAllBoards), kind (widget type like 'app', 'weather', etc.), optional options map, and optional integrationIds array. Returns { itemId }", + }, + }) + .input(addItemToBoardSchema) + .output(z.object({ itemId: z.string() })) + .mutation(async ({ ctx, input }) => { + await throwIfActionForbiddenAsync(ctx, eq(boards.id, input.boardId), "modify"); + + if (input.integrationIds.length > 0) { + const existing = await ctx.db.query.integrations.findMany({ + columns: { id: true }, + where: inArray(integrations.id, input.integrationIds), + }); + const validIds = new Set(existing.map((row) => row.id)); + const invalid = input.integrationIds.filter((id) => !validIds.has(id)); + if (invalid.length > 0) { + throw new TRPCError({ code: "BAD_REQUEST", message: `Invalid integration IDs: ${invalid.join(", ")}` }); + } + } + + const board = await ctx.db.query.boards.findFirst({ + where: eq(boards.id, input.boardId), + with: { + sections: true, + layouts: true, + items: { with: { layouts: true } }, + }, + }); + + if (!board) { + throw new TRPCError({ code: "NOT_FOUND", message: "Board not found" }); + } + + const emptySection = board.sections + .filter((s) => s.kind === "empty") + .toSorted((a, b) => (a.yOffset ?? 0) - (b.yOffset ?? 0))[0]; + + if (!emptySection) { + throw new TRPCError({ code: "BAD_REQUEST", message: "Board has no empty section to place items in" }); + } + + const itemId = createId(); + + await ctx.db.insert(items).values({ + id: itemId, + boardId: input.boardId, + kind: input.kind, + options: superjson.stringify(input.options), + advancedOptions: emptySuperJSON, + }); + + const layoutRows: (typeof itemLayouts.$inferInsert)[] = []; + + for (const layout of board.layouts) { + const existingInSection = board.items + .flatMap((item) => item.layouts) + .filter((il) => il.sectionId === emptySection.id && il.layoutId === layout.id); + + const occupied: boolean[][] = []; + for (const il of existingInSection) { + for (let y = il.yOffset; y < il.yOffset + il.height; y++) { + while (occupied.length <= y) occupied.push(Array.from({ length: layout.columnCount }).fill(false)); + for (let x = il.xOffset; x < il.xOffset + il.width; x++) { + occupied[y]![x] = true; + } + } + } + + let placed = false; + for (let y = 0; y < 9999 && !placed; y++) { + if (!occupied[y]) occupied.push(Array.from({ length: layout.columnCount }).fill(false)); + for (let x = 0; x < layout.columnCount && !placed; x++) { + if (!occupied[y]![x]) { + layoutRows.push({ + itemId, + sectionId: emptySection.id, + layoutId: layout.id, + xOffset: x, + yOffset: y, + width: 1, + height: 1, + }); + placed = true; + } + } + } + + if (!placed) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Board section is full, no free grid position available", + }); + } + } + + if (layoutRows.length > 0) { + await ctx.db.insert(itemLayouts).values(layoutRows); + } + + if (input.integrationIds.length > 0) { + await ctx.db + .insert(integrationItems) + .values(input.integrationIds.map((integrationId) => ({ itemId, integrationId }))); + } + + return { itemId }; + }), }); /** diff --git a/packages/api/src/router/docker/docker-router.ts b/packages/api/src/router/docker/docker-router.ts index 884998749..0011545d0 100644 --- a/packages/api/src/router/docker/docker-router.ts +++ b/packages/api/src/router/docker/docker-router.ts @@ -16,10 +16,18 @@ import { createTRPCRouter, permissionRequiredProcedure } from "../../trpc"; export const dockerRouter = createTRPCRouter({ getContainers: permissionRequiredProcedure .requiresPermission("admin") + .meta({ + mcp: { + enabled: true, + description: "List all Docker containers with their state, image, CPU/memory usage, and ports", + }, + }) .concat(dockerMiddleware()) .query(async () => { const innerHandler = dockerContainersRequestHandler.handler({}); - const result = await innerHandler.getCachedOrUpdatedDataAsync({ forceUpdate: false }); + const result = await innerHandler.getCachedOrUpdatedDataAsync({ + forceUpdate: false, + }); const { data, timestamp } = result; @@ -50,6 +58,12 @@ export const dockerRouter = createTRPCRouter({ }), startAll: permissionRequiredProcedure .requiresPermission("admin") + .meta({ + mcp: { + enabled: true, + description: "Start Docker containers. REQUIRED: ids (array of container ID strings from docker_getContainers)", + }, + }) .concat(dockerMiddleware()) .input(z.object({ ids: z.array(z.string()) })) .mutation(async ({ input }) => { @@ -65,6 +79,12 @@ export const dockerRouter = createTRPCRouter({ }), stopAll: permissionRequiredProcedure .requiresPermission("admin") + .meta({ + mcp: { + enabled: true, + description: "Stop Docker containers. REQUIRED: ids (array of container ID strings from docker_getContainers)", + }, + }) .concat(dockerMiddleware()) .input(z.object({ ids: z.array(z.string()) })) .mutation(async ({ input }) => { @@ -80,6 +100,13 @@ export const dockerRouter = createTRPCRouter({ }), restartAll: permissionRequiredProcedure .requiresPermission("admin") + .meta({ + mcp: { + enabled: true, + description: + "Restart Docker containers. REQUIRED: ids (array of container ID strings from docker_getContainers)", + }, + }) .concat(dockerMiddleware()) .input(z.object({ ids: z.array(z.string()) })) .mutation(async ({ input }) => { @@ -95,6 +122,13 @@ export const dockerRouter = createTRPCRouter({ }), removeAll: permissionRequiredProcedure .requiresPermission("admin") + .meta({ + mcp: { + enabled: true, + description: + "Remove/delete Docker containers. REQUIRED: ids (array of container ID strings from docker_getContainers)", + }, + }) .concat(dockerMiddleware()) .input(z.object({ ids: z.array(z.string()) })) .mutation(async ({ input }) => { @@ -110,6 +144,13 @@ export const dockerRouter = createTRPCRouter({ }), logs: permissionRequiredProcedure .requiresPermission("admin") + .meta({ + mcp: { + enabled: true, + description: + "Fetch logs from a Docker container. REQUIRED: id (container ID from docker_getContainers). OPTIONAL: tail (number 1-1000, default 200)", + }, + }) .concat(dockerMiddleware()) .input( z.object({ diff --git a/packages/api/src/router/icons.ts b/packages/api/src/router/icons.ts index 04f15fc2d..e75eda8ab 100644 --- a/packages/api/src/router/icons.ts +++ b/packages/api/src/router/icons.ts @@ -5,26 +5,35 @@ import { iconsFindSchema } from "@homarr/validation/icons"; import { createTRPCRouter, publicProcedure } from "../trpc"; export const iconsRouter = createTRPCRouter({ - findIcons: publicProcedure.input(iconsFindSchema).query(async ({ ctx, input }) => { - return { - icons: await ctx.db.query.iconRepositories.findMany({ - with: { - icons: { - columns: { - id: true, - name: true, - url: true, + findIcons: publicProcedure + .meta({ + mcp: { + enabled: true, + description: + "Search for icons by name across all icon repositories. OPTIONAL: searchText (string to filter), limitPerGroup (number 1-500, default 12). Call with no arguments to browse all icons", + }, + }) + .input(iconsFindSchema) + .query(async ({ ctx, input }) => { + return { + icons: await ctx.db.query.iconRepositories.findMany({ + with: { + icons: { + columns: { + id: true, + name: true, + url: true, + }, + where: + (input.searchText?.length ?? 0) > 0 + ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + and(...input.searchText!.split(" ").map((keyword) => like(icons.name, `%${keyword}%`))) + : undefined, + limit: input.limitPerGroup, }, - where: - (input.searchText?.length ?? 0) > 0 - ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - and(...input.searchText!.split(" ").map((keyword) => like(icons.name, `%${keyword}%`))) - : undefined, - limit: input.limitPerGroup, }, - }, - }), - countIcons: await ctx.db.$count(icons), - }; - }), + }), + countIcons: await ctx.db.$count(icons), + }; + }), }); diff --git a/packages/api/src/router/info.ts b/packages/api/src/router/info.ts index 8befca412..a0436ede3 100644 --- a/packages/api/src/router/info.ts +++ b/packages/api/src/router/info.ts @@ -7,7 +7,13 @@ export const infoRouter = createTRPCRouter({ getInfo: protectedProcedure .input(z.void()) .output(z.object({ version: z.string() })) - .meta({ openapi: { method: "GET", path: "/api/info", tags: ["info"] } }) + .meta({ + openapi: { method: "GET", path: "/api/info", tags: ["info"] }, + mcp: { + enabled: true, + description: "Get Homarr server version information", + }, + }) .query(() => { return { version: packageJson.version, diff --git a/packages/api/src/router/integration/integration-router.ts b/packages/api/src/router/integration/integration-router.ts index 4375644cc..c5dd9a9b6 100644 --- a/packages/api/src/router/integration/integration-router.ts +++ b/packages/api/src/router/integration/integration-router.ts @@ -45,48 +45,72 @@ const logger = createLogger({ module: "integrationRouter" }); const mediaRequestSearchKinds = getIntegrationKindsByCategory("mediaSearch"); export const integrationRouter = createTRPCRouter({ - all: protectedProcedure.query(async ({ ctx }) => { - const groupsOfCurrentUser = await ctx.db.query.groupMembers.findMany({ - where: eq(groupMembers.userId, ctx.session.user.id), - }); - - const integrations = await ctx.db.query.integrations.findMany({ - with: { - userPermissions: { - where: eq(integrationUserPermissions.userId, ctx.session.user.id), - }, - groupPermissions: { - where: inArray( - integrationGroupPermissions.groupId, - groupsOfCurrentUser.map((group) => group.groupId), - ), - }, + getKinds: publicProcedure + .meta({ + mcp: { + enabled: true, + description: + "List all supported integration kinds (e.g. sonarr, radarr, overseerr, pihole, homeAssistant) with the secret fields each kind requires. Use this before creating an integration to know which 'kind' values are valid and what secrets to provide.", }, - }); - return integrations - .map((integration) => { - const permissions = integration.userPermissions - .map(({ permission }) => permission) - .concat(integration.groupPermissions.map(({ permission }) => permission)); + }) + .query(() => { + return objectEntries(integrationDefs).map(([kind, def]) => ({ + kind, + name: def.name, + category: def.category, + requiredSecrets: def.secretKinds, + })); + }), + all: protectedProcedure + .meta({ + mcp: { + enabled: true, + description: + "List all configured integrations (connections to services like Sonarr, Radarr, Plex, etc.). Returns each integration's id, name, kind, url, and permissions. Use the 'id' field as 'integrationId' in other tools. Check permissions.hasUseAccess before reading data and permissions.hasInteractAccess before performing actions — false means the API key owner lacks that permission level for this integration, not an error", + }, + }) + .query(async ({ ctx }) => { + const groupsOfCurrentUser = await ctx.db.query.groupMembers.findMany({ + where: eq(groupMembers.userId, ctx.session.user.id), + }); - return { - id: integration.id, - name: integration.name, - kind: integration.kind, - url: integration.url, - permissions: { - hasUseAccess: - permissions.includes("use") || permissions.includes("interact") || permissions.includes("full"), - hasInteractAccess: permissions.includes("interact") || permissions.includes("full"), - hasFullAccess: permissions.includes("full"), + const integrations = await ctx.db.query.integrations.findMany({ + with: { + userPermissions: { + where: eq(integrationUserPermissions.userId, ctx.session.user.id), }, - }; - }) - .toSorted( - (integrationA, integrationB) => - integrationKinds.indexOf(integrationA.kind) - integrationKinds.indexOf(integrationB.kind), - ); - }), + groupPermissions: { + where: inArray( + integrationGroupPermissions.groupId, + groupsOfCurrentUser.map((group) => group.groupId), + ), + }, + }, + }); + return integrations + .map((integration) => { + const permissions = integration.userPermissions + .map(({ permission }) => permission) + .concat(integration.groupPermissions.map(({ permission }) => permission)); + + return { + id: integration.id, + name: integration.name, + kind: integration.kind, + url: integration.url, + permissions: { + hasUseAccess: + permissions.includes("use") || permissions.includes("interact") || permissions.includes("full"), + hasInteractAccess: permissions.includes("interact") || permissions.includes("full"), + hasFullAccess: permissions.includes("full"), + }, + }; + }) + .toSorted( + (integrationA, integrationB) => + integrationKinds.indexOf(integrationA.kind) - integrationKinds.indexOf(integrationB.kind), + ); + }), allThatSupportSearch: protectedProcedure.query(async ({ ctx }) => { const groupsOfCurrentUser = await ctx.db.query.groupMembers.findMany({ where: eq(groupMembers.userId, ctx.session.user.id), @@ -187,7 +211,19 @@ export const integrationRouter = createTRPCRouter({ ); }), search: protectedProcedure - .input(z.object({ query: z.string(), limit: z.number().min(1).max(100).default(10) })) + .meta({ + mcp: { + enabled: true, + description: + "Search integrations by name. REQUIRED: query (search string). OPTIONAL: limit (number, default 10). Returns matching integrations with id (use as integrationId), name, kind, url, and permissions", + }, + }) + .input( + z.object({ + query: z.string(), + limit: z.number().min(1).max(100).default(10), + }), + ) .query(async ({ ctx, input }) => { return await ctx.db.query.integrations.findMany({ where: like(integrations.name, `%${input.query}%`), @@ -205,52 +241,68 @@ export const integrationRouter = createTRPCRouter({ }, }); }), - byId: protectedProcedure.input(byIdSchema).query(async ({ ctx, input }) => { - await throwIfActionForbiddenAsync(ctx, eq(integrations.id, input.id), "full"); - const integration = await ctx.db.query.integrations.findFirst({ - where: eq(integrations.id, input.id), - with: { - secrets: { - columns: { - kind: true, - value: true, - updatedAt: true, - }, - }, - app: { - columns: { - id: true, - name: true, - iconUrl: true, - href: true, - }, - }, + byId: protectedProcedure + .meta({ + mcp: { + enabled: true, + description: + "Get integration details by ID, including secrets metadata and linked app. REQUIRED: id (integration ID string)", }, - }); - - if (!integration) { - throw new TRPCError({ - code: "NOT_FOUND", - message: "Integration not found", + }) + .input(byIdSchema) + .query(async ({ ctx, input }) => { + await throwIfActionForbiddenAsync(ctx, eq(integrations.id, input.id), "full"); + const integration = await ctx.db.query.integrations.findFirst({ + where: eq(integrations.id, input.id), + with: { + secrets: { + columns: { + kind: true, + value: true, + updatedAt: true, + }, + }, + app: { + columns: { + id: true, + name: true, + iconUrl: true, + href: true, + }, + }, + }, }); - } - return { - id: integration.id, - name: integration.name, - kind: integration.kind, - url: integration.url, - secrets: integration.secrets.map((secret) => ({ - kind: secret.kind, - // Only return the value if the secret is public, so for example the username - value: integrationSecretKindObject[secret.kind].isPublic ? decryptSecret(secret.value) : null, - updatedAt: secret.updatedAt, - })), - app: integration.app, - }; - }), + if (!integration) { + throw new TRPCError({ + code: "NOT_FOUND", + message: "Integration not found", + }); + } + + return { + id: integration.id, + name: integration.name, + kind: integration.kind, + url: integration.url, + secrets: integration.secrets.map((secret) => ({ + kind: secret.kind, + // Only return the value if the secret is public, so for example the username + value: integrationSecretKindObject[secret.kind].isPublic ? decryptSecret(secret.value) : null, + updatedAt: secret.updatedAt, + })), + app: integration.app, + }; + }), create: permissionRequiredProcedure .requiresPermission("integration-create") + .meta({ + mcp: { + enabled: true, + description: + "Create a new integration (connection to an external service). REQUIRED fields: name, url (http/https), kind, secrets, attemptSearchEngineCreation. The 'secrets' field is REQUIRED and must be a non-empty array — call integration_getKinds first to see which secret kinds each integration type needs. Example for Radarr: secrets=[{kind:'apiKey', value:'your-radarr-api-key'}]. Example for Proxmox: secrets=[{kind:'tokenId', value:'...'}, {kind:'personalAccessToken', value:'...'}, {kind:'realm', value:'pam'}]. The connection is tested before saving — if secrets are wrong, an error is returned. Set attemptSearchEngineCreation to false unless explicitly requested. The 'app' field is optional — pass {id:'...'} to link to an existing app, or omit it.", + }, + }) .input(integrationCreateSchema) .mutation(async ({ ctx, input }) => { logger.info("Creating integration", { @@ -315,8 +367,6 @@ export const integrationRouter = createTRPCRouter({ kind: input.kind, url: input.url, }); - - // Media request search is a first-class Spotlight action. Do not create a search engine for it. }), update: protectedProcedure.input(integrationUpdateSchema).mutation(async ({ ctx, input }) => { await throwIfActionForbiddenAsync(ctx, eq(integrations.id, input.id), "full"); @@ -420,22 +470,27 @@ export const integrationRouter = createTRPCRouter({ url: input.url, }); }), - delete: protectedProcedure.input(byIdSchema).mutation(async ({ ctx, input }) => { - await throwIfActionForbiddenAsync(ctx, eq(integrations.id, input.id), "full"); + delete: protectedProcedure + .meta({ + mcp: { enabled: true, description: "Delete an integration by ID. REQUIRED: id (integration ID string)" }, + }) + .input(byIdSchema) + .mutation(async ({ ctx, input }) => { + await throwIfActionForbiddenAsync(ctx, eq(integrations.id, input.id), "full"); - const integration = await ctx.db.query.integrations.findFirst({ - where: eq(integrations.id, input.id), - }); - - if (!integration) { - throw new TRPCError({ - code: "NOT_FOUND", - message: "Integration not found", + const integration = await ctx.db.query.integrations.findFirst({ + where: eq(integrations.id, input.id), }); - } - await ctx.db.delete(integrations).where(eq(integrations.id, input.id)); - }), + if (!integration) { + throw new TRPCError({ + code: "NOT_FOUND", + message: "Integration not found", + }); + } + + await ctx.db.delete(integrations).where(eq(integrations.id, input.id)); + }), getIntegrationPermissions: protectedProcedure.input(byIdSchema).query(async ({ input, ctx }) => { await throwIfActionForbiddenAsync(ctx, eq(integrations.id, input.id), "full"); @@ -601,30 +656,51 @@ export const integrationRouter = createTRPCRouter({ }); }), searchInIntegration: protectedProcedure + .meta({ + mcp: { + enabled: true, + description: + "Search within a specific integration (e.g. Overseerr, Jellyseerr). REQUIRED: integrationId (from integration_all), query (search string)", + }, + }) .concat(createOneIntegrationMiddleware("query", ...getIntegrationKindsByCategory("search"))) .input(z.object({ integrationId: z.string(), query: z.string() })) .query(async ({ ctx, input }) => { const integrationInstance = await createIntegrationAsync(ctx.integration); return await integrationInstance.searchAsync(encodeURI(input.query)); }), - mediaRequestSearchTargets: protectedProcedure.query(async ({ ctx }) => { - const integrationsWithAccess = await getAccessibleMediaRequestSearchIntegrationsAsync(ctx); + mediaRequestSearchTargets: protectedProcedure + .meta({ + mcp: { + enabled: true, + description: "List integrations that support media request search (Overseerr, Jellyseerr, Seerr)", + }, + }) + .query(async ({ ctx }) => { + const integrationsWithAccess = await getAccessibleMediaRequestSearchIntegrationsAsync(ctx); - return integrationsWithAccess.map((integration) => { - const permissions = constructIntegrationPermissions(integration, ctx.session); + return integrationsWithAccess.map((integration) => { + const permissions = constructIntegrationPermissions(integration, ctx.session); - return { - id: integration.id, - name: integration.name, - kind: integration.kind, - url: integration.url, - permissions: { - hasInteractAccess: permissions.hasInteractAccess, - }, - }; - }); - }), + return { + id: integration.id, + name: integration.name, + kind: integration.kind, + url: integration.url, + permissions: { + hasInteractAccess: permissions.hasInteractAccess, + }, + }; + }); + }), searchMediaRequests: protectedProcedure + .meta({ + mcp: { + enabled: true, + description: + "Search for movies and TV shows across Overseerr/Jellyseerr/Seerr. REQUIRED: query (search string). OPTIONAL: integrationIds (array of integration IDs — omit to search all accessible Overseerr/Jellyseerr/Seerr integrations). Returns results with integrationId, mediaId, and mediaType for use with getMediaRequestOptions and requestMedia", + }, + }) .input( z.object({ query: z.string(), @@ -672,6 +748,13 @@ export const integrationRouter = createTRPCRouter({ return results.flat(); }), getMediaRequestOptions: protectedProcedure + .meta({ + mcp: { + enabled: true, + description: + "Get available options (seasons/episodes for TV) before requesting media. REQUIRED: integrationId (Overseerr/Jellyseerr ID), mediaId (number from searchMediaRequests), mediaType ('tv' or 'movie'). Required step for TV shows — for movies you can skip this and go straight to requestMedia", + }, + }) .concat(createOneIntegrationMiddleware("query", "jellyseerr", "overseerr", "seerr")) .input(mediaRequestOptionsSchema) .query(async ({ ctx, input }) => { @@ -679,6 +762,13 @@ export const integrationRouter = createTRPCRouter({ return await integration.getSeriesInformationAsync(input.mediaType, input.mediaId); }), requestMedia: protectedProcedure + .meta({ + mcp: { + enabled: true, + description: + "Submit a media request to Overseerr/Jellyseerr/Seerr. REQUIRED: integrationId (Overseerr/Jellyseerr ID), mediaId (number), mediaType ('tv' or 'movie'). OPTIONAL: seasons (array of season numbers — for TV only, omit to request all). Workflow: searchMediaRequests → (getMediaRequestOptions for TV) → requestMedia", + }, + }) .concat(createOneIntegrationMiddleware("interact", "jellyseerr", "overseerr", "seerr")) .input(mediaRequestRequestSchema) .mutation(async ({ ctx, input }) => { diff --git a/packages/api/src/router/invite.ts b/packages/api/src/router/invite.ts index 1b767748d..bc31c0bdf 100644 --- a/packages/api/src/router/invite.ts +++ b/packages/api/src/router/invite.ts @@ -20,11 +20,21 @@ export const inviteRouter = createTRPCRouter({ id: true, expirationDate: true, }) - .extend({ creator: z.object({ name: z.string().nullable(), id: z.string() }) }), + .extend({ + creator: z.object({ name: z.string().nullable(), id: z.string() }), + }), ), ) .input(z.undefined()) - .meta({ openapi: { method: "GET", path: "/api/invites", tags: ["invites"], protect: true } }) + .meta({ + openapi: { + method: "GET", + path: "/api/invites", + tags: ["invites"], + protect: true, + }, + mcp: { enabled: true, description: "List all user invites" }, + }) .query(async ({ ctx }) => { throwIfCredentialsDisabled(); return await ctx.db.query.invites.findMany({ @@ -50,7 +60,19 @@ export const inviteRouter = createTRPCRouter({ }), ) .output(z.object({ id: z.string(), token: z.string() })) - .meta({ openapi: { method: "POST", path: "/api/invites", tags: ["invites"], protect: true } }) + .meta({ + openapi: { + method: "POST", + path: "/api/invites", + tags: ["invites"], + protect: true, + }, + mcp: { + enabled: true, + description: + "Create a new user invite link. REQUIRED: expirationDate (ISO date string for when the invite expires). Returns the invite ID and token", + }, + }) .mutation(async ({ ctx, input }) => { throwIfCredentialsDisabled(); const id = createId(); @@ -76,7 +98,15 @@ export const inviteRouter = createTRPCRouter({ }), ) .output(z.undefined()) - .meta({ openapi: { method: "DELETE", path: "/api/invites/{id}", tags: ["invites"], protect: true } }) + .meta({ + openapi: { + method: "DELETE", + path: "/api/invites/{id}", + tags: ["invites"], + protect: true, + }, + mcp: { enabled: true, description: "Delete an invite by ID. REQUIRED: id (invite ID string)" }, + }) .mutation(async ({ ctx, input }) => { throwIfCredentialsDisabled(); const dbInvite = await ctx.db.query.invites.findFirst({ diff --git a/packages/api/src/router/user.ts b/packages/api/src/router/user.ts index 466b095fd..eee626026 100644 --- a/packages/api/src/router/user.ts +++ b/packages/api/src/router/user.ts @@ -144,7 +144,19 @@ export const userRouter = createTRPCRouter({ }), create: permissionRequiredProcedure .requiresPermission("admin") - .meta({ openapi: { method: "POST", path: "/api/users", tags: ["users"], protect: true } }) + .meta({ + openapi: { + method: "POST", + path: "/api/users", + tags: ["users"], + protect: true, + }, + mcp: { + enabled: true, + description: + "Create a new user account (admin only). REQUIRED: username (string), password (string), confirmPassword (must match password). OPTIONAL: email (string or null)", + }, + }) .input(convertIntersectionToZodObject(userCreateSchema)) .output(z.void()) .mutation(async ({ ctx, input }) => { @@ -159,7 +171,14 @@ export const userRouter = createTRPCRouter({ }), setProfileImage: protectedProcedure .output(z.void()) - .meta({ openapi: { method: "PUT", path: "/api/users/profileImage", tags: ["users"], protect: true } }) + .meta({ + openapi: { + method: "PUT", + path: "/api/users/profileImage", + tags: ["users"], + protect: true, + }, + }) .input( z.object({ userId: z.string(), @@ -205,8 +224,26 @@ export const userRouter = createTRPCRouter({ getAll: permissionRequiredProcedure .requiresPermission("admin") .input(z.void()) - .output(z.array(selectUserSchema.pick({ id: true, name: true, email: true, emailVerified: true, image: true }))) - .meta({ openapi: { method: "GET", path: "/api/users", tags: ["users"], protect: true } }) + .output( + z.array( + selectUserSchema.pick({ + id: true, + name: true, + email: true, + emailVerified: true, + image: true, + }), + ), + ) + .meta({ + openapi: { + method: "GET", + path: "/api/users", + tags: ["users"], + protect: true, + }, + mcp: { enabled: true, description: "List all users (admin only)" }, + }) .query(({ ctx }) => { return ctx.db.query.users.findMany({ columns: { @@ -221,8 +258,24 @@ export const userRouter = createTRPCRouter({ // Is protected because also used in board access / integration access forms selectable: protectedProcedure .input(z.object({ excludeExternalProviders: z.boolean().default(false) }).optional()) - .output(z.array(selectUserSchema.pick({ id: true, name: true, image: true, email: true }))) - .meta({ openapi: { method: "GET", path: "/api/users/selectable", tags: ["users"], protect: true } }) + .output( + z.array( + selectUserSchema.pick({ + id: true, + name: true, + image: true, + email: true, + }), + ), + ) + .meta({ + openapi: { + method: "GET", + path: "/api/users/selectable", + tags: ["users"], + protect: true, + }, + }) .query(({ ctx, input }) => { return ctx.db.query.users.findMany({ columns: { @@ -242,8 +295,24 @@ export const userRouter = createTRPCRouter({ limit: z.number().min(1).max(100).default(10), }), ) - .output(z.array(selectUserSchema.pick({ id: true, name: true, image: true, email: true }))) - .meta({ openapi: { method: "POST", path: "/api/users/search", tags: ["users"], protect: true } }) + .output( + z.array( + selectUserSchema.pick({ + id: true, + name: true, + image: true, + email: true, + }), + ), + ) + .meta({ + openapi: { + method: "POST", + path: "/api/users/search", + tags: ["users"], + protect: true, + }, + }) .query(async ({ input, ctx }) => { const dbUsers = await ctx.db.query.users.findMany({ columns: { @@ -283,7 +352,15 @@ export const userRouter = createTRPCRouter({ completedBoardTour: true, }), ) - .meta({ openapi: { method: "GET", path: "/api/users/{userId}", tags: ["users"], protect: true } }) + .meta({ + openapi: { + method: "GET", + path: "/api/users/{userId}", + tags: ["users"], + protect: true, + }, + mcp: { enabled: true, description: "Get user details by user ID. REQUIRED: userId (string)" }, + }) .query(async ({ input, ctx }) => { // Only admins can view other users details if (ctx.session.user.id !== input.userId && !ctx.session.user.permissions.includes("admin")) { @@ -325,7 +402,14 @@ export const userRouter = createTRPCRouter({ editProfile: protectedProcedure .input(userEditProfileSchema) .output(z.void()) - .meta({ openapi: { method: "PUT", path: "/api/users/profile", tags: ["users"], protect: true } }) + .meta({ + openapi: { + method: "PUT", + path: "/api/users/profile", + tags: ["users"], + protect: true, + }, + }) .mutation(async ({ input, ctx }) => { // Only admins can view other users details if (ctx.session.user.id !== input.id && !ctx.session.user.permissions.includes("admin")) { @@ -369,7 +453,15 @@ export const userRouter = createTRPCRouter({ delete: protectedProcedure .input(z.object({ userId: z.string() })) .output(z.void()) - .meta({ openapi: { method: "DELETE", path: "/api/users/{userId}", tags: ["users"], protect: true } }) + .meta({ + openapi: { + method: "DELETE", + path: "/api/users/{userId}", + tags: ["users"], + protect: true, + }, + mcp: { enabled: true, description: "Delete a user by ID. REQUIRED: userId (string)" }, + }) .mutation(async ({ input, ctx }) => { // Only admins and user itself can delete a user if (ctx.session.user.id !== input.userId && !ctx.session.user.permissions.includes("admin")) { @@ -384,7 +476,14 @@ export const userRouter = createTRPCRouter({ changePassword: protectedProcedure .input(convertIntersectionToZodObject(userChangePasswordApiSchema)) .output(z.void()) - .meta({ openapi: { method: "PATCH", path: "/api/users/{userId}/changePassword", tags: ["users"], protect: true } }) + .meta({ + openapi: { + method: "PATCH", + path: "/api/users/{userId}/changePassword", + tags: ["users"], + protect: true, + }, + }) .mutation(async ({ ctx, input }) => { const user = ctx.session.user; // Only admins can change other users' passwords @@ -449,7 +548,14 @@ export const userRouter = createTRPCRouter({ changeHomeBoards: protectedProcedure .input(convertIntersectionToZodObject(userChangeHomeBoardsSchema.and(z.object({ userId: z.string() })))) .output(z.void()) - .meta({ openapi: { method: "PATCH", path: "/api/users/changeHome", tags: ["users"], protect: true } }) + .meta({ + openapi: { + method: "PATCH", + path: "/api/users/changeHome", + tags: ["users"], + protect: true, + }, + }) .mutation(async ({ input, ctx }) => { const user = ctx.session.user; // Only admins can change other users passwords @@ -515,14 +621,28 @@ export const userRouter = createTRPCRouter({ changeSearchPreferences: protectedProcedure .input(convertIntersectionToZodObject(changeSearchPreferencesInputSchema)) .output(z.void()) - .meta({ openapi: { method: "PATCH", path: "/api/users/search-preferences", tags: ["users"], protect: true } }) + .meta({ + openapi: { + method: "PATCH", + path: "/api/users/search-preferences", + tags: ["users"], + protect: true, + }, + }) .mutation(async ({ input, ctx }) => { await changeSearchPreferencesAsync(ctx.db, ctx.session, input); }), changeColorScheme: protectedProcedure .input(userChangeColorSchemeSchema) .output(z.void()) - .meta({ openapi: { method: "PATCH", path: "/api/users/changeScheme", tags: ["users"], protect: true } }) + .meta({ + openapi: { + method: "PATCH", + path: "/api/users/changeScheme", + tags: ["users"], + protect: true, + }, + }) .mutation(async ({ input, ctx }) => { await ctx.db .update(users) @@ -579,7 +699,14 @@ export const userRouter = createTRPCRouter({ changeFirstDayOfWeek: protectedProcedure .input(convertIntersectionToZodObject(userFirstDayOfWeekSchema.and(byIdSchema))) .output(z.void()) - .meta({ openapi: { method: "PATCH", path: "/api/users/firstDayOfWeek", tags: ["users"], protect: true } }) + .meta({ + openapi: { + method: "PATCH", + path: "/api/users/firstDayOfWeek", + tags: ["users"], + protect: true, + }, + }) .mutation(async ({ input, ctx }) => { // Only admins can change other users first day of week if (!ctx.session.user.permissions.includes("admin") && ctx.session.user.id !== input.id) { diff --git a/packages/api/src/router/widgets/calendar.ts b/packages/api/src/router/widgets/calendar.ts index 5119cfc36..50ba71b3e 100644 --- a/packages/api/src/router/widgets/calendar.ts +++ b/packages/api/src/router/widgets/calendar.ts @@ -18,6 +18,13 @@ const logger = createLogger({ module: "calendarRouter" }); export const calendarRouter = createTRPCRouter({ findAllEvents: publicProcedure + .meta({ + mcp: { + enabled: true, + description: + "Get calendar events for upcoming and recent media releases. REQUIRED: integrationIds (array of integration IDs from integration_all, filter by kind sonarr/radarr/lidarr/readarr), year (number), month (number), releaseType (array of 'inCinemas'|'digitalRelease'|'physicalRelease'), showUnmonitored (boolean). Great for 'what's coming out this week/month?'", + }, + }) .input( z.object({ year: z.number(), @@ -32,7 +39,9 @@ export const calendarRouter = createTRPCRouter({ ctx.integrations.map(async (integration) => { const { integrationIds: _integrationIds, ...handlerInput } = input; const innerHandler = calendarMonthRequestHandler.handler(integration, handlerInput); - const { data } = await innerHandler.getCachedOrUpdatedDataAsync({ forceUpdate: false }); + const { data } = await innerHandler.getCachedOrUpdatedDataAsync({ + forceUpdate: false, + }); return { events: data, diff --git a/packages/api/src/router/widgets/dns-hole.ts b/packages/api/src/router/widgets/dns-hole.ts index 46b868435..93162a1e3 100644 --- a/packages/api/src/router/widgets/dns-hole.ts +++ b/packages/api/src/router/widgets/dns-hole.ts @@ -14,12 +14,21 @@ import { createTRPCRouter, protectedProcedure, publicProcedure } from "../../trp export const dnsHoleRouter = createTRPCRouter({ summary: publicProcedure + .meta({ + mcp: { + enabled: true, + description: + "Get DNS blocking statistics from Pi-hole/AdGuard (queries, blocked, percentage). REQUIRED: integrationIds (array of Pi-hole/AdGuard integration IDs from integration_all)", + }, + }) .concat(createManyIntegrationMiddleware("query", ...getIntegrationKindsByCategory("dnsHole"))) .query(async ({ ctx }) => { const results = await Promise.all( ctx.integrations.map(async (integration) => { const innerHandler = dnsHoleRequestHandler.handler(integration, {}); - const { data, timestamp } = await innerHandler.getCachedOrUpdatedDataAsync({ forceUpdate: false }); + const { data, timestamp } = await innerHandler.getCachedOrUpdatedDataAsync({ + forceUpdate: false, + }); return { integration: { @@ -63,6 +72,13 @@ export const dnsHoleRouter = createTRPCRouter({ }), enable: protectedProcedure + .meta({ + mcp: { + enabled: true, + description: + "Enable DNS blocking on Pi-hole/AdGuard. REQUIRED: integrationId (single Pi-hole/AdGuard integration ID from integration_all)", + }, + }) .concat(createOneIntegrationMiddleware("interact", ...getIntegrationKindsByCategory("dnsHole"))) .mutation(async ({ ctx: { integration } }) => { const client = await createIntegrationAsync(integration); @@ -76,6 +92,13 @@ export const dnsHoleRouter = createTRPCRouter({ }), disable: protectedProcedure + .meta({ + mcp: { + enabled: true, + description: + "Disable DNS blocking on Pi-hole/AdGuard. REQUIRED: integrationId (single integration ID). OPTIONAL: duration (number of seconds for temporary disable — omit for permanent disable)", + }, + }) .input( z.object({ duration: z.number().optional(), diff --git a/packages/api/src/router/widgets/downloads.ts b/packages/api/src/router/widgets/downloads.ts index f5ed6fdb9..682decdc4 100644 --- a/packages/api/src/router/widgets/downloads.ts +++ b/packages/api/src/router/widgets/downloads.ts @@ -18,6 +18,13 @@ const createDownloadClientIntegrationMiddleware = (action: IntegrationAction) => export const downloadsRouter = createTRPCRouter({ getJobsAndStatuses: publicProcedure + .meta({ + mcp: { + enabled: true, + description: + "Get active download jobs and queue status from connected download clients (qBittorrent, SABnzbd, Transmission, Deluge, NZBGet). REQUIRED: integrationIds (array of download client integration IDs from integration_all). OPTIONAL: limitPerIntegration (number, default 50)", + }, + }) .concat(createDownloadClientIntegrationMiddleware("query")) .input(z.object({ limitPerIntegration: z.number().default(50) })) .query(async ({ ctx, input }) => { @@ -25,7 +32,9 @@ export const downloadsRouter = createTRPCRouter({ ctx.integrations.map(async (integration) => { const innerHandler = downloadClientRequestHandler.handler(integration, { limit: input.limitPerIntegration }); - const { data, timestamp } = await innerHandler.getCachedOrUpdatedDataAsync({ forceUpdate: false }); + const { data, timestamp } = await innerHandler.getCachedOrUpdatedDataAsync({ + forceUpdate: false, + }); return { integration: { @@ -68,14 +77,23 @@ export const downloadsRouter = createTRPCRouter({ }; }); }), - pause: protectedProcedure.concat(createDownloadClientIntegrationMiddleware("interact")).mutation(async ({ ctx }) => { - await Promise.all( - ctx.integrations.map(async (integration) => { - const integrationInstance = await createIntegrationAsync(integration); - await integrationInstance.pauseQueueAsync(); - }), - ); - }), + pause: protectedProcedure + .meta({ + mcp: { + enabled: true, + description: + "Pause all download queues across connected download clients. REQUIRED: integrationIds (array of download client integration IDs from integration_all)", + }, + }) + .concat(createDownloadClientIntegrationMiddleware("interact")) + .mutation(async ({ ctx }) => { + await Promise.all( + ctx.integrations.map(async (integration) => { + const integrationInstance = await createIntegrationAsync(integration); + await integrationInstance.pauseQueueAsync(); + }), + ); + }), pauseItem: protectedProcedure .concat(createDownloadClientIntegrationMiddleware("interact")) .input(z.object({ item: downloadClientItemSchema })) @@ -87,14 +105,23 @@ export const downloadsRouter = createTRPCRouter({ }), ); }), - resume: protectedProcedure.concat(createDownloadClientIntegrationMiddleware("interact")).mutation(async ({ ctx }) => { - await Promise.all( - ctx.integrations.map(async (integration) => { - const integrationInstance = await createIntegrationAsync(integration); - await integrationInstance.resumeQueueAsync(); - }), - ); - }), + resume: protectedProcedure + .meta({ + mcp: { + enabled: true, + description: + "Resume all download queues across connected download clients. REQUIRED: integrationIds (array of download client integration IDs from integration_all)", + }, + }) + .concat(createDownloadClientIntegrationMiddleware("interact")) + .mutation(async ({ ctx }) => { + await Promise.all( + ctx.integrations.map(async (integration) => { + const integrationInstance = await createIntegrationAsync(integration); + await integrationInstance.resumeQueueAsync(); + }), + ); + }), resumeItem: protectedProcedure .concat(createDownloadClientIntegrationMiddleware("interact")) .input(z.object({ item: downloadClientItemSchema })) diff --git a/packages/api/src/router/widgets/health-monitoring.ts b/packages/api/src/router/widgets/health-monitoring.ts index 46741ae1c..03856f5a0 100644 --- a/packages/api/src/router/widgets/health-monitoring.ts +++ b/packages/api/src/router/widgets/health-monitoring.ts @@ -9,6 +9,13 @@ import { createTRPCRouter, publicProcedure } from "../../trpc"; export const healthMonitoringRouter = createTRPCRouter({ getSystemHealthStatus: publicProcedure + .meta({ + mcp: { + enabled: true, + description: + "Get system health status (CPU, memory, disk, network) from NAS/server monitoring integrations. REQUIRED: integrationIds (array of TrueNAS/Unraid/Glances/OpenMediaVault/DashDot integration IDs from integration_all)", + }, + }) .concat( createManyIntegrationMiddleware("query", "openmediavault", "dashDot", "truenas", "unraid", "glances", "mock"), ) @@ -16,7 +23,9 @@ export const healthMonitoringRouter = createTRPCRouter({ return await Promise.all( ctx.integrations.map(async (integration) => { const innerHandler = systemInfoRequestHandler.handler(integration, {}); - const { data, timestamp } = await innerHandler.getCachedOrUpdatedDataAsync({ forceUpdate: false }); + const { data, timestamp } = await innerHandler.getCachedOrUpdatedDataAsync({ + forceUpdate: false, + }); return { integrationId: integration.id, @@ -32,7 +41,11 @@ export const healthMonitoringRouter = createTRPCRouter({ createManyIntegrationMiddleware("query", "openmediavault", "dashDot", "truenas", "unraid", "glances", "mock"), ) .subscription(({ ctx }) => { - return observable<{ integrationId: string; healthInfo: SystemHealthMonitoring; timestamp: Date }>((emit) => { + return observable<{ + integrationId: string; + healthInfo: SystemHealthMonitoring; + timestamp: Date; + }>((emit) => { const unsubscribes: (() => void)[] = []; for (const integration of ctx.integrations) { const innerHandler = systemInfoRequestHandler.handler(integration, {}); @@ -53,10 +66,19 @@ export const healthMonitoringRouter = createTRPCRouter({ }); }), getClusterHealthStatus: publicProcedure + .meta({ + mcp: { + enabled: true, + description: + "Get Proxmox cluster health status including nodes, VMs, and resource usage. REQUIRED: integrationId (single Proxmox integration ID from integration_all)", + }, + }) .concat(createOneIntegrationMiddleware("query", "proxmox", "mock")) .query(async ({ ctx }) => { const innerHandler = clusterInfoRequestHandler.handler(ctx.integration, {}); - const { data } = await innerHandler.getCachedOrUpdatedDataAsync({ forceUpdate: false }); + const { data } = await innerHandler.getCachedOrUpdatedDataAsync({ + forceUpdate: false, + }); return data; }), subscribeClusterHealthStatus: publicProcedure diff --git a/packages/api/src/router/widgets/media-requests.ts b/packages/api/src/router/widgets/media-requests.ts index a77c89b10..715ae1327 100644 --- a/packages/api/src/router/widgets/media-requests.ts +++ b/packages/api/src/router/widgets/media-requests.ts @@ -13,12 +13,21 @@ import { createTRPCRouter, protectedProcedure, publicProcedure } from "../../trp export const mediaRequestsRouter = createTRPCRouter({ getLatestRequests: publicProcedure + .meta({ + mcp: { + enabled: true, + description: + "Get latest media requests from Overseerr/Jellyseerr with their status (pending, approved, declined, available). REQUIRED: integrationIds (array of Overseerr/Jellyseerr integration IDs from integration_all)", + }, + }) .concat(createManyIntegrationMiddleware("query", ...getIntegrationKindsByCategory("mediaRequest"))) .query(async ({ ctx }) => { const results = await Promise.all( ctx.integrations.map(async (integration) => { const innerHandler = mediaRequestListRequestHandler.handler(integration, {}); - const { data } = await innerHandler.getCachedOrUpdatedDataAsync({ forceUpdate: false }); + const { data } = await innerHandler.getCachedOrUpdatedDataAsync({ + forceUpdate: false, + }); return { integration: { id: integration.id, @@ -30,8 +39,13 @@ export const mediaRequestsRouter = createTRPCRouter({ }), ); return results - .flatMap(({ data, integration }) => data.map((request) => ({ ...request, integrationId: integration.id }))) - .sort((dataA, dataB) => { + .flatMap(({ data, integration }) => + data.map((request) => ({ + ...request, + integrationId: integration.id, + })), + ) + .toSorted((dataA, dataB) => { if (dataA.status === dataB.status) { return dataB.createdAt.getTime() - dataA.createdAt.getTime(); } @@ -69,12 +83,21 @@ export const mediaRequestsRouter = createTRPCRouter({ }); }), getStats: publicProcedure + .meta({ + mcp: { + enabled: true, + description: + "Get media request statistics including total counts and top requesters. REQUIRED: integrationIds (array of Overseerr/Jellyseerr integration IDs from integration_all)", + }, + }) .concat(createManyIntegrationMiddleware("query", ...getIntegrationKindsByCategory("mediaRequest"))) .query(async ({ ctx }) => { const results = await Promise.all( ctx.integrations.map(async (integration) => { const innerHandler = mediaRequestStatsRequestHandler.handler(integration, {}); - const { data } = await innerHandler.getCachedOrUpdatedDataAsync({ forceUpdate: false }); + const { data } = await innerHandler.getCachedOrUpdatedDataAsync({ + forceUpdate: false, + }); return { integration: { id: integration.id, @@ -88,25 +111,42 @@ export const mediaRequestsRouter = createTRPCRouter({ return { stats: results.flatMap((result) => result.data.stats), users: results - .map((result) => result.data.users.map((user) => ({ ...user, integration: result.integration }))) + .map((result) => + result.data.users.map((user) => ({ + ...user, + integration: result.integration, + })), + ) .flat() - .sort(({ requestCount: countA }, { requestCount: countB }) => countB - countA), + .toSorted(({ requestCount: countA }, { requestCount: countB }) => countB - countA), integrations: results.map((result) => result.integration), }; }), answerRequest: protectedProcedure + .meta({ + mcp: { + enabled: true, + description: + "Approve or decline a pending media request. REQUIRED: integrationId (single Overseerr/Jellyseerr integration ID), requestId (number from getLatestRequests), answer ('approve' or 'decline')", + }, + }) .concat(createOneIntegrationMiddleware("interact", ...getIntegrationKindsByCategory("mediaRequest"))) - .input(z.object({ requestId: z.number(), answer: z.enum(["approve", "decline"]) })) + .input( + z.object({ + requestId: z.number(), + answer: z.enum(["approve", "decline"]), + }), + ) .mutation(async ({ ctx: { integration }, input }) => { const integrationInstance = await createIntegrationAsync(integration); const innerHandler = mediaRequestListRequestHandler.handler(integration, {}); - if (input.answer === "approve") { - await integrationInstance.approveRequestAsync(input.requestId); - await innerHandler.invalidateAsync(); - return; - } - await integrationInstance.declineRequestAsync(input.requestId); + const answerActions = { + approve: (id: number) => integrationInstance.approveRequestAsync(id), + decline: (id: number) => integrationInstance.declineRequestAsync(id), + } as const; + + await answerActions[input.answer](input.requestId); await innerHandler.invalidateAsync(); }), }); diff --git a/packages/api/src/router/widgets/media-server.ts b/packages/api/src/router/widgets/media-server.ts index 0e497c8ff..de61fef75 100644 --- a/packages/api/src/router/widgets/media-server.ts +++ b/packages/api/src/router/widgets/media-server.ts @@ -14,6 +14,13 @@ const createMediaServerIntegrationMiddleware = (action: IntegrationAction) => export const mediaServerRouter = createTRPCRouter({ getCurrentStreams: publicProcedure + .meta({ + mcp: { + enabled: true, + description: + "Get currently active streams from Plex/Jellyfin/Emby media servers. REQUIRED: integrationIds (array of media server integration IDs from integration_all), showOnlyPlaying (boolean — true to filter to actively playing streams only)", + }, + }) .concat(createMediaServerIntegrationMiddleware("query")) .input(z.object({ showOnlyPlaying: z.boolean() })) .query(async ({ ctx, input }) => { @@ -22,7 +29,9 @@ export const mediaServerRouter = createTRPCRouter({ const innerHandler = mediaServerRequestHandler.handler(integration, { showOnlyPlaying: input.showOnlyPlaying, }); - const { data } = await innerHandler.getCachedOrUpdatedDataAsync({ forceUpdate: false }); + const { data } = await innerHandler.getCachedOrUpdatedDataAsync({ + forceUpdate: false, + }); return { integrationId: integration.id, integrationKind: integration.kind, diff --git a/packages/api/src/router/widgets/smart-home.ts b/packages/api/src/router/widgets/smart-home.ts index 2dc9add89..dec3770a7 100644 --- a/packages/api/src/router/widgets/smart-home.ts +++ b/packages/api/src/router/widgets/smart-home.ts @@ -14,11 +14,20 @@ const createSmartHomeIntegrationMiddleware = (action: IntegrationAction) => export const smartHomeRouter = createTRPCRouter({ entityState: publicProcedure + .meta({ + mcp: { + enabled: true, + description: + "Get the current state of a Home Assistant entity (light, switch, sensor, etc.). REQUIRED: integrationId (Home Assistant integration ID from integration_all), entityId (e.g. 'light.living_room', 'switch.fan')", + }, + }) .input(z.object({ entityId: z.string() })) .concat(createSmartHomeIntegrationMiddleware("query")) .query(async ({ ctx: { integration }, input }) => { const innerHandler = smartHomeEntityStateRequestHandler.handler(integration, { entityId: input.entityId }); - const { data } = await innerHandler.getCachedOrUpdatedDataAsync({ forceUpdate: false }); + const { data } = await innerHandler.getCachedOrUpdatedDataAsync({ + forceUpdate: false, + }); return data; }), subscribeEntityState: publicProcedure @@ -42,6 +51,13 @@ export const smartHomeRouter = createTRPCRouter({ }); }), switchEntity: protectedProcedure + .meta({ + mcp: { + enabled: true, + description: + "Toggle a Home Assistant entity (turn on/off a light, switch, etc.). REQUIRED: integrationId (Home Assistant integration ID from integration_all), entityId (e.g. 'light.living_room')", + }, + }) .concat(createSmartHomeIntegrationMiddleware("interact")) .input(z.object({ entityId: z.string() })) .mutation(async ({ ctx: { integration }, input }) => { @@ -54,6 +70,13 @@ export const smartHomeRouter = createTRPCRouter({ return success; }), executeAutomation: protectedProcedure + .meta({ + mcp: { + enabled: true, + description: + "Trigger a Home Assistant automation by its ID. REQUIRED: integrationId (Home Assistant integration ID from integration_all), automationId (the automation entity ID)", + }, + }) .concat(createSmartHomeIntegrationMiddleware("interact")) .input(z.object({ automationId: z.string() })) .mutation(async ({ ctx: { integration }, input }) => { diff --git a/packages/api/src/test/mcp.spec.ts b/packages/api/src/test/mcp.spec.ts new file mode 100644 index 000000000..4fc696aa7 --- /dev/null +++ b/packages/api/src/test/mcp.spec.ts @@ -0,0 +1,41 @@ +import { expect, test, vi } from "vitest"; +import { extractToolsFromProcedures } from "trpc-to-mcp"; + +import { appRouter } from "../router/app"; +import { infoRouter } from "../router/info"; +import { inviteRouter } from "../router/invite"; +import { createTRPCRouter } from "../trpc"; + +vi.mock("@homarr/auth", () => ({})); + +const mcpTestRouter = createTRPCRouter({ + app: appRouter, + info: infoRouter, + invite: inviteRouter, +}); + +test("MCP tools should be extractable from the router", () => { + const act = () => extractToolsFromProcedures(mcpTestRouter); + + expect(act).not.toThrow(); +}); + +test("MCP tools should contain expected procedures", () => { + const tools = extractToolsFromProcedures(mcpTestRouter); + const toolNames = tools.map((tool) => tool.name); + + expect(tools.length).toBeGreaterThan(0); + expect(toolNames).toContain("app_all"); + expect(toolNames).toContain("app_byId"); + expect(toolNames).toContain("app_create"); + expect(toolNames).toContain("info_getInfo"); + expect(toolNames).toContain("invite_getAll"); +}); + +test("MCP tools should have descriptions", () => { + const tools = extractToolsFromProcedures(mcpTestRouter); + + for (const tool of tools) { + expect(tool.description, `Tool ${tool.name} should have a description`).toBeTruthy(); + } +}); diff --git a/packages/api/src/trpc.ts b/packages/api/src/trpc.ts index eb4da06c2..0ef944669 100644 --- a/packages/api/src/trpc.ts +++ b/packages/api/src/trpc.ts @@ -8,6 +8,7 @@ */ import { initTRPC, TRPCError } from "@trpc/server"; import superjson from "superjson"; +import type { McpMeta } from "trpc-to-mcp"; import type { OpenApiMeta } from "trpc-to-openapi"; import { ZodError } from "zod/v4"; @@ -39,7 +40,11 @@ export const createTRPCContext = (opts: { headers: Headers; session: Session | n const session = opts.session; const source = opts.headers.get("x-trpc-source") ?? "unknown"; - logger.info("Received tRPC request", { source, userId: session?.user.id, userName: session?.user.name }); + logger.info("Received tRPC request", { + source, + userId: session?.user.id, + userName: session?.user.name, + }); return { session, @@ -56,7 +61,7 @@ export const createTRPCContext = (opts: { headers: Headers; session: Session | n */ const t = initTRPC .context() - .meta() + .meta() .create({ transformer: superjson, errorFormatter: ({ shape, error }) => ({ diff --git a/packages/translation/src/lang/en.json b/packages/translation/src/lang/en.json index 8df39d7f9..2d2f2f9f5 100644 --- a/packages/translation/src/lang/en.json +++ b/packages/translation/src/lang/en.json @@ -3895,7 +3895,7 @@ "docker": "Docker", "kubernetes": "Kubernetes", "logs": "Logs", - "api": "API", + "api": "API & MCP", "certificates": "Certificates", "tasks": "Tasks", "backup": "Backup" @@ -4436,6 +4436,95 @@ "actions": "Actions" } } + }, + "mcp": { + "label": "AI / MCP", + "title": "AI Integration", + "subtitle": "Model Context Protocol (MCP) Server", + "description": "Connect AI assistants to your Homarr instance and control your entire homelab through natural language. Search and request media on Overseerr, manage Docker containers, toggle Pi-hole, check server health, control Home Assistant devices, and more — all from your AI assistant.", + "noApiKey": "You need an API key to authenticate with the MCP server.", + "createApiKeyButton": "Create API Key", + "endpoint": { + "title": "MCP Endpoint" + }, + "authentication": { + "title": "Authentication", + "intro": "You can authenticate with your MCP server using either an API key or OAuth. Both methods grant the same level of access.", + "apiKey": { + "title": "API Key (manual)", + "description": "Pass the ApiKey header with your full API key in the MCP client configuration." + }, + "oauth": { + "title": "OAuth (browser login)", + "description": "Clients that support OAuth (such as Claude Code, opencode, or Cursor) can authenticate by opening a browser window. Run the auth command in your client, log in to Homarr in the browser, and you're connected — an API key is created automatically.", + "hint": "OAuth tokens appear as regular API keys in the Authentication tab. You can revoke them at any time." + }, + "permissions": "The API key determines the permissions available to the AI — it operates with the same access level as the key owner." + }, + "clientConfig": { + "title": "Client Configuration", + "streamableHttp": { + "recommended": "Recommended", + "title": "Streamable HTTP", + "worksWith": "Works with: Cursor, Claude Desktop, VS Code Copilot, Windsurf, Claude Code", + "addToConfig": "Add to your MCP client configuration file:", + "cursor": "{name}: {file} in your project or global settings", + "claudeDesktop": "{name}: {file}", + "claudeCode": "{name}: {file} or use {command}", + "vsCodeCopilot": "{name}: {file} in workspace settings", + "replaceHint": "Replace the placeholder with the API key you received when creating it." + }, + "stdio": { + "title": "stdio (legacy clients via mcp-remote bridge)", + "description": "For clients that only support stdio transport. Requires {dependency} (Node.js) installed locally:" + } + }, + "testConnection": { + "title": "Test Your Connection", + "description": "Run this in your terminal to verify the endpoint is reachable and your API key works:", + "hint": "A successful response returns the MCP server capabilities. If you see an error, check the JSON response for hints." + }, + "availableTools": { + "title": "Available Tools", + "description": "{count} tools available. Expand a category to see individual tools and their descriptions.", + "columnType": "Type", + "columnName": "Tool", + "columnDescription": "Description" + }, + "troubleshooting": { + "title": "Troubleshooting", + "missingHeader": { + "title": "\"Missing ApiKey header\"", + "description": "Your client is not sending the {header} header. Verify the {section} section in your MCP config is correct. Some clients require restarting after config changes." + }, + "invalidFormat": { + "title": "\"Invalid ApiKey format\"", + "description": "Make sure you copied the full API key, not just part of it." + }, + "invalidKey": { + "title": "\"Invalid API key\"", + "description": "The key ID was not found or the token is wrong. API keys can only be viewed once when created. If you lost it, delete the old key and create a new one." + }, + "connectionRefused": { + "title": "Connection refused / timeout", + "description": "Make sure the URL is reachable from your AI client. If Homarr runs behind a reverse proxy or in Docker, use the external URL (not {localhost}). Verify the port is correct (default: 7575 for Docker)." + }, + "toolsNotAppearing": { + "title": "Tools not appearing", + "description": "Some tools require specific integrations to be configured (e.g. Docker, Overseerr). The tool list depends on what's available in your Homarr instance." + } + }, + "copy": "Copy", + "oneClick": { + "title": "Install in One Click", + "subtitle": "Uses OAuth — authenticate in your browser on first use", + "vsCode": "Install in VS Code", + "cursor": "Install in Cursor", + "copyUrl": "Copy MCP URL", + "copied": "Copied!", + "copyHint": "For ChatGPT, Claude Code, or any MCP client", + "manualConfig": "Manual Configuration" + } } } }, diff --git a/packages/validation/src/board.ts b/packages/validation/src/board.ts index 2ce53a1eb..24a0f3608 100644 --- a/packages/validation/src/board.ts +++ b/packages/validation/src/board.ts @@ -5,6 +5,7 @@ import { backgroundImageRepeats, backgroundImageSizes, boardPermissions, + widgetKinds, } from "@homarr/definitions"; import { zodEnumFromArray } from "./enums"; @@ -94,3 +95,27 @@ export const boardCreateSchema = z.object({ }); export const boardSavePermissionsSchema = createSavePermissionsSchema(zodEnumFromArray(boardPermissions)); + +export const boardSummarySchema = z.object({ + id: z.string(), + name: z.string(), + logoImageUrl: z.string().nullable(), + isPublic: z.boolean(), + creator: z + .object({ + id: z.string(), + name: z.string().nullable(), + image: z.string().nullable(), + email: z.string().nullable(), + }) + .nullable(), + isHome: z.boolean(), + isMobileHome: z.boolean(), +}); + +export const addItemToBoardSchema = z.object({ + boardId: z.string(), + kind: zodEnumFromArray(widgetKinds), + options: z.record(z.string(), z.unknown()).default({}), + integrationIds: z.array(z.string()).default([]), +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cc40a2757..e19be9f68 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -93,6 +93,9 @@ catalogs: '@mantine/tiptap': specifier: ^9.3.0 version: 9.3.0 + '@modelcontextprotocol/sdk': + specifier: 1.26.0 + version: 1.26.0 '@octokit/auth-app': specifier: ^8.2.0 version: 8.2.0 @@ -102,6 +105,9 @@ catalogs: '@playwright/test': specifier: ^1.60.0 version: 1.60.0 + '@scalar/api-reference-react': + specifier: ^0.9.34 + version: 0.9.42 '@semantic-release/changelog': specifier: ^6.0.3 version: 6.0.3 @@ -252,9 +258,6 @@ catalogs: '@types/react-dom': specifier: 19.2.3 version: 19.2.3 - '@types/swagger-ui-react': - specifier: ^5.18.0 - version: 5.18.0 '@types/video.js': specifier: ^7.3.58 version: 7.3.58 @@ -405,6 +408,9 @@ catalogs: maria2: specifier: ^0.4.1 version: 0.4.1 + mcp-handler: + specifier: ^1.1.0 + version: 1.1.0 mysql2: specifier: 3.22.4 version: 3.22.4 @@ -477,15 +483,15 @@ catalogs: svgson: specifier: ^5.3.1 version: 5.3.1 - swagger-ui-react: - specifier: ^5.32.6 - version: 5.32.6 testcontainers: specifier: ^12.0.1 version: 12.0.1 timezones-ical-library: specifier: ^2.2.0 version: 2.2.0 + trpc-to-mcp: + specifier: ^1.3.2 + version: 1.3.2 trpc-to-openapi: specifier: ^3.3.0 version: 3.3.0 @@ -600,7 +606,7 @@ importers: version: 2.9.16(@types/node@24.12.4) '@vitejs/plugin-react': specifier: 'catalog:' - version: 5.2.0(vite@7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + version: 5.2.0(vite@7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/coverage-v8': specifier: 'catalog:' version: 4.1.8(vitest@4.1.8) @@ -639,10 +645,10 @@ importers: version: 5.9.3 vite-tsconfig-paths: specifier: 'catalog:' - version: 6.1.1(typescript@5.9.3)(vite@7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + version: 6.1.1(typescript@5.9.3)(vite@7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) vitest: specifier: 'catalog:' - version: 4.1.8(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1(@noble/hashes@2.0.1))(msw@2.14.6(@types/node@24.12.4)(typescript@5.9.3))(vite@7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + version: 4.1.8(@opentelemetry/api@1.9.0)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1(@noble/hashes@2.0.1))(msw@2.14.6(@types/node@24.12.4)(typescript@5.9.3))(vite@7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) apps/nextjs: dependencies: @@ -772,6 +778,12 @@ importers: '@mantine/tiptap': specifier: 'catalog:' version: 9.3.0(@mantine/core@9.3.0(@mantine/hooks@9.3.0(react@19.2.7))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.3.0(react@19.2.7))(@tiptap/extension-link@3.26.0(@tiptap/core@3.26.0(@tiptap/pm@3.26.0))(@tiptap/pm@3.26.0))(@tiptap/react@3.26.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.26.0(@tiptap/pm@3.26.0))(@tiptap/pm@3.26.0)(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@modelcontextprotocol/sdk': + specifier: 'catalog:' + version: 1.26.0(zod@4.4.3) + '@scalar/api-reference-react': + specifier: 'catalog:' + version: 0.9.42(react@19.2.7)(tailwindcss@4.3.0)(typescript@5.9.3)(zod@4.4.3) '@tabler/icons-react': specifier: 'catalog:' version: 3.44.0(react@19.2.7) @@ -783,13 +795,13 @@ importers: version: 5.101.0(@tanstack/react-query@5.101.0(react@19.2.7))(react@19.2.7) '@tanstack/react-query-next-experimental': specifier: 'catalog:' - version: 5.101.0(@tanstack/react-query@5.101.0(react@19.2.7))(next@16.2.7(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(react@19.2.7) + version: 5.101.0(@tanstack/react-query@5.101.0(react@19.2.7))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(react@19.2.7) '@trpc/client': specifier: 'catalog:' version: 11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3) '@trpc/next': specifier: 'catalog:' - version: 11.17.0(@tanstack/react-query@5.101.0(react@19.2.7))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/react-query@11.17.0(@tanstack/react-query@5.101.0(react@19.2.7))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.7)(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(next@16.2.7(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + version: 11.17.0(@tanstack/react-query@5.101.0(react@19.2.7))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/react-query@11.17.0(@tanstack/react-query@5.101.0(react@19.2.7))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.7)(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) '@trpc/react-query': specifier: 'catalog:' version: 11.17.0(@tanstack/react-query@5.101.0(react@19.2.7))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.7)(typescript@5.9.3) @@ -850,12 +862,15 @@ importers: mantine-react-table: specifier: 'catalog:' version: mantine-react-table-open@9.0.3(@mantine/core@9.3.0(@mantine/hooks@9.3.0(react@19.2.7))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/dates@9.3.0(@mantine/core@9.3.0(@mantine/hooks@9.3.0(react@19.2.7))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.3.0(react@19.2.7))(dayjs@1.11.21)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.3.0(react@19.2.7))(@tabler/icons-react@3.44.0(react@19.2.7))(clsx@2.1.1)(dayjs@1.11.21)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + mcp-handler: + specifier: 'catalog:' + version: 1.1.0(@modelcontextprotocol/sdk@1.26.0(zod@4.4.3))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0)) next: specifier: 'catalog:' - version: 16.2.7(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) + version: 16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) postcss-preset-mantine: specifier: 'catalog:' - version: 1.18.0(postcss@8.5.8) + version: 1.18.0(postcss@8.5.15) prismjs: specifier: 'catalog:' version: 1.30.0 @@ -880,9 +895,9 @@ importers: superjson: specifier: 'catalog:' version: 2.2.6 - swagger-ui-react: + trpc-to-mcp: specifier: 'catalog:' - version: 5.32.6(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + version: 1.3.2(@trpc/server@11.17.0(typescript@5.9.3))(better-auth@1.6.14(@opentelemetry/api@1.9.0)(better-sqlite3@12.10.0)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0))(mysql2@3.22.4(@types/node@24.12.4))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8)(vue@3.5.35(typescript@5.9.3)))(mcp-handler@1.1.0(@modelcontextprotocol/sdk@1.26.0(zod@4.4.3))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0)))(zod@4.4.3) use-deep-compare-effect: specifier: 'catalog:' version: 1.8.1(react@19.2.7) @@ -917,15 +932,12 @@ importers: '@types/react-dom': specifier: 'catalog:' version: 19.2.3(@types/react@19.2.16) - '@types/swagger-ui-react': - specifier: 'catalog:' - version: 5.18.0 concurrently: specifier: 'catalog:' version: 9.2.1 node-loader: specifier: 'catalog:' - version: 2.1.0(webpack@5.107.1(postcss@8.5.8)) + version: 2.1.0(webpack@5.107.1(postcss@8.5.15)) typescript: specifier: 'catalog:' version: 5.9.3 @@ -1180,7 +1192,7 @@ importers: version: 4.5.0 next: specifier: 'catalog:' - version: 16.2.7(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) + version: 16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) react: specifier: 'catalog:' version: 19.2.7 @@ -1190,6 +1202,9 @@ importers: superjson: specifier: 'catalog:' version: 2.2.6 + trpc-to-mcp: + specifier: 'catalog:' + version: 1.3.2(@trpc/server@11.17.0(typescript@5.9.3))(better-auth@1.6.14(@opentelemetry/api@1.9.0)(better-sqlite3@12.10.0)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0))(mysql2@3.22.4(@types/node@24.12.4))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8)(vue@3.5.35(typescript@5.9.3)))(mcp-handler@1.1.0(@modelcontextprotocol/sdk@1.26.0(zod@4.4.3))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0)))(zod@4.4.3) trpc-to-openapi: specifier: 'catalog:' version: 3.3.0(patch_hash=2ca3c16af0fcca0c736697ad4fe553a14f794524fa9ce0d5c3e8ee4aea76090c)(@trpc/server@11.17.0(typescript@5.9.3))(zod-openapi@5.3.0(zod@4.4.3))(zod@4.4.3) @@ -1238,10 +1253,10 @@ importers: version: 8.1.8 next: specifier: 'catalog:' - version: 16.2.7(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) + version: 16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) next-auth: specifier: 'catalog:' - version: 5.0.0-beta.31(next@16.2.7(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(react@19.2.7) + version: 5.0.0-beta.31(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(react@19.2.7) react: specifier: 'catalog:' version: 19.2.7 @@ -1331,7 +1346,7 @@ importers: version: 1.11.21 next: specifier: 'catalog:' - version: 16.2.7(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) + version: 16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) octokit: specifier: 'catalog:' version: 5.0.5 @@ -1371,7 +1386,7 @@ importers: version: 0.2.9 drizzle-orm: specifier: 'catalog:' - version: 0.45.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(sql.js@1.14.1) + version: 0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0) ioredis: specifier: 'catalog:' version: 5.11.0 @@ -1543,10 +1558,10 @@ importers: version: 0.31.10 drizzle-orm: specifier: 'catalog:' - version: 0.45.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(sql.js@1.14.1) + version: 0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0) drizzle-zod: specifier: 'catalog:' - version: 0.8.3(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(sql.js@1.14.1))(zod@4.4.3) + version: 0.8.3(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0))(zod@4.4.3) mysql2: specifier: 'catalog:' version: 3.22.4(@types/node@24.12.4) @@ -1903,7 +1918,7 @@ importers: version: 1.11.21 next: specifier: 'catalog:' - version: 16.2.7(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) + version: 16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) react: specifier: 'catalog:' version: 19.2.7 @@ -1986,7 +2001,7 @@ importers: version: 0.5.17 next: specifier: 'catalog:' - version: 16.2.7(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) + version: 16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) react: specifier: 'catalog:' version: 19.2.7 @@ -2151,7 +2166,7 @@ importers: version: 9.3.0(@mantine/core@9.3.0(@mantine/hooks@9.3.0(react@19.2.7))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.3.0(react@19.2.7))(dayjs@1.11.21)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) next: specifier: 'catalog:' - version: 16.2.7(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) + version: 16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) react: specifier: 'catalog:' version: 19.2.7 @@ -2218,7 +2233,7 @@ importers: version: 2.20.0(@babel/core@7.29.0)(@babel/template@7.28.6)(@types/react@19.2.16)(react@19.2.7) next: specifier: 'catalog:' - version: 16.2.7(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) + version: 16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) react: specifier: 'catalog:' version: 19.2.7 @@ -2255,10 +2270,10 @@ importers: version: mantine-react-table-open@9.0.3(@mantine/core@9.3.0(@mantine/hooks@9.3.0(react@19.2.7))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/dates@9.3.0(@mantine/core@9.3.0(@mantine/hooks@9.3.0(react@19.2.7))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.3.0(react@19.2.7))(dayjs@1.11.21)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.3.0(react@19.2.7))(@tabler/icons-react@3.44.0(react@19.2.7))(clsx@2.1.1)(dayjs@1.11.21)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) next: specifier: 'catalog:' - version: 16.2.7(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) + version: 16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) next-intl: specifier: 'catalog:' - version: 4.13.0(next@16.2.7(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(react@19.2.7)(typescript@5.9.3) + version: 4.13.0(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(react@19.2.7)(typescript@5.9.3) react: specifier: 'catalog:' version: 19.2.7 @@ -2310,7 +2325,7 @@ importers: version: mantine-react-table-open@9.0.3(@mantine/core@9.3.0(@mantine/hooks@9.3.0(react@19.2.7))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/dates@9.3.0(@mantine/core@9.3.0(@mantine/hooks@9.3.0(react@19.2.7))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.3.0(react@19.2.7))(dayjs@1.11.21)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.3.0(react@19.2.7))(@tabler/icons-react@3.44.0(react@19.2.7))(clsx@2.1.1)(dayjs@1.11.21)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) next: specifier: 'catalog:' - version: 16.2.7(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) + version: 16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) react: specifier: 'catalog:' version: 19.2.7 @@ -2507,7 +2522,7 @@ importers: version: mantine-react-table-open@9.0.3(@mantine/core@9.3.0(@mantine/hooks@9.3.0(react@19.2.7))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/dates@9.3.0(@mantine/core@9.3.0(@mantine/hooks@9.3.0(react@19.2.7))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.3.0(react@19.2.7))(dayjs@1.11.21)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@mantine/hooks@9.3.0(react@19.2.7))(@tabler/icons-react@3.44.0(react@19.2.7))(clsx@2.1.1)(dayjs@1.11.21)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) next: specifier: 'catalog:' - version: 16.2.7(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) + version: 16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) react: specifier: 'catalog:' version: 19.2.7 @@ -2558,6 +2573,28 @@ packages: '@actions/io@3.0.2': resolution: {integrity: sha512-nRBchcMM+QK1pdjO7/idu86rbJI5YHUKCvKs0KxnSYbVe3F51UfGxuZX4Qy/fWlp6l7gWFwIkrOzN+oUK03kfw==} + '@ai-sdk/gateway@3.0.13': + resolution: {integrity: sha512-g7nE4PFtngOZNZSy1lOPpkC+FAiHxqBJXqyRMEG7NUrEVZlz5goBdtHg1YgWRJIX776JTXAmbOI5JreAKVAsVA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider-utils@4.0.5': + resolution: {integrity: sha512-Ow/X/SEkeExTTc1x+nYLB9ZHK2WUId8+9TlkamAx7Tl9vxU+cKzWx2dwjgMHeCN6twrgwkLrrtqckQeO4mxgVA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider@3.0.2': + resolution: {integrity: sha512-HrEmNt/BH/hkQ7zpi2o6N3k1ZR1QTb7z85WYhYygiTxOQuaml4CMtHCWRbric5WPU+RNsYI7r1EpyVQMKO1pYw==} + engines: {node: '>=18'} + + '@ai-sdk/vue@3.0.33': + resolution: {integrity: sha512-czM9Js3a7f+Eo35gjEYEeJYUoPvMg5Dfi4bOLyDBghLqn0gaVg8yTmTaSuHCg+3K/+1xPjyXd4+2XcQIohWWiQ==} + engines: {node: '>=18'} + peerDependencies: + vue: ^3.3.4 + '@ark/schema@0.46.0': resolution: {integrity: sha512-c2UQdKgP2eqqDArfBqQIJppxJHvNNXuQPeuSPlDML4rjw+f1cu0qAlzOG4b8ujgm9ctIDWwhpyw6gjG5ledIVQ==} @@ -2638,10 +2675,18 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.27.1': resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} @@ -2655,6 +2700,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-transform-react-jsx-self@7.27.1': resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} engines: {node: '>=6.9.0'} @@ -2667,10 +2717,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime-corejs3@7.27.1': - resolution: {integrity: sha512-909rVuj3phpjW6y0MCXAZ5iNeORePa6ldJvp2baWGcTjwqbBDDz6xoS5JHJ7lS88NlwLYj07ImL/8IUMtDZzTA==} - engines: {node: '>=6.9.0'} - '@babel/runtime@7.29.2': resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} engines: {node: '>=6.9.0'} @@ -2691,6 +2737,10 @@ packages: resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + '@balena/dockerignore@1.0.2': resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} @@ -2698,10 +2748,125 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} + '@better-auth/core@1.6.14': + resolution: {integrity: sha512-12cA7tnR4Wyb3nLpPmeq/Id7QNB+4OhjbzuX7sIhqglgXGjyT5iiNpe2lx/8FF532sHC450Yx1850salCYbkzw==} + peerDependencies: + '@better-auth/utils': 0.4.1 + '@better-fetch/fetch': 1.1.21 + '@cloudflare/workers-types': '>=4' + '@opentelemetry/api': ^1.9.0 + better-call: 1.3.5 + jose: ^6.1.0 + kysely: ^0.28.5 || ^0.29.0 + nanostores: ^1.0.1 + peerDependenciesMeta: + '@cloudflare/workers-types': + optional: true + '@opentelemetry/api': + optional: true + + '@better-auth/drizzle-adapter@1.6.14': + resolution: {integrity: sha512-lYs1jDudriKYMXNcLFLAvEvOEKbeKBFdDciG4H8qZhV+3+yghGC3f/H5qtgTDc8mGBPV+2tEvVgYqReurOSmNw==} + peerDependencies: + '@better-auth/core': ^1.6.14 + '@better-auth/utils': 0.4.1 + drizzle-orm: ^0.45.2 + peerDependenciesMeta: + drizzle-orm: + optional: true + + '@better-auth/kysely-adapter@1.6.14': + resolution: {integrity: sha512-A2+381gYADuZpgd98XQ39bnxLzbT03wnnDmSQIXp7XcE3hF093mGMk6rxlAhENVHH7JL2B0Tv2la2o6n+6ppyQ==} + peerDependencies: + '@better-auth/core': ^1.6.14 + '@better-auth/utils': 0.4.1 + kysely: ^0.28.17 || ^0.29.0 + peerDependenciesMeta: + kysely: + optional: true + + '@better-auth/memory-adapter@1.6.14': + resolution: {integrity: sha512-frtBTozi8qsBlypxp33dkiIZT2IOMvix3oh2qTTcBkK11ISsRSTUUadl7DbwXri2AEoooShsH6PSAput920J3Q==} + peerDependencies: + '@better-auth/core': ^1.6.14 + '@better-auth/utils': 0.4.1 + + '@better-auth/mongo-adapter@1.6.14': + resolution: {integrity: sha512-meaZx712k9c0Cl6urwYZRNa3mAy3/leaYiSNt+hVaCOEPlgTDxzmYMNACvTTYXgh4eCpDVf5G7ZMEYBtejKQdw==} + peerDependencies: + '@better-auth/core': ^1.6.14 + '@better-auth/utils': 0.4.1 + mongodb: ^6.0.0 || ^7.0.0 + peerDependenciesMeta: + mongodb: + optional: true + + '@better-auth/prisma-adapter@1.6.14': + resolution: {integrity: sha512-9b9wSqhCthMmOYo0QdX+N/cOv+fNck/JE5CZQuuWwEJl5QeoYhCZesXjts5VfLAPMIf6vKw3QNBrn0SVMXXi2Q==} + peerDependencies: + '@better-auth/core': ^1.6.14 + '@better-auth/utils': 0.4.1 + '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 + prisma: ^5.0.0 || ^6.0.0 || ^7.0.0 + peerDependenciesMeta: + '@prisma/client': + optional: true + prisma: + optional: true + + '@better-auth/telemetry@1.6.14': + resolution: {integrity: sha512-ALi3cEx5eyrFY+TeAdhc1uq8FqJyGvzgvIo7GQZOqGqLZxHY9nte44WN++jBFGJJbsW3e4cgLj8dQK291s6wWQ==} + peerDependencies: + '@better-auth/core': ^1.6.14 + '@better-auth/utils': 0.4.1 + '@better-fetch/fetch': 1.1.21 + + '@better-auth/utils@0.4.1': + resolution: {integrity: sha512-SZBPRPF3z0nBvE5ygOkxae35wnnXPRShmqFo78S+qslLeFoPu/pMgnXAuNKFMMybac3tiLaVg1e3MQW5MC+1iA==} + + '@better-fetch/fetch@1.1.21': + resolution: {integrity: sha512-/ImESw0sskqlVR94jB+5+Pxjf+xBwDZF/N5+y2/q4EqD7IARUTSpPfIo8uf39SYpCxyOCtbyYpUrZ3F/k0zT4A==} + '@bramus/specificity@2.4.2': resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} hasBin: true + '@codemirror/autocomplete@6.20.3': + resolution: {integrity: sha512-tlosUqb+3BbxCxZdu4tKeRghPFC+QM7q4X5YhKV2eCmPG+1r2F3f4AaSz5sCrFqUtX4Jh20VFTKecl16MgiV9g==} + + '@codemirror/commands@6.10.3': + resolution: {integrity: sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==} + + '@codemirror/lang-css@6.3.1': + resolution: {integrity: sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==} + + '@codemirror/lang-html@6.4.11': + resolution: {integrity: sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw==} + + '@codemirror/lang-javascript@6.2.5': + resolution: {integrity: sha512-zD4e5mS+50htS7F+TYjBPsiIFGanfVqg4HyUz6WNFikgOPf2BgKlx+TQedI1w6n/IqRBVBbBWmGFdLB/7uxO4A==} + + '@codemirror/lang-json@6.0.2': + resolution: {integrity: sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ==} + + '@codemirror/lang-xml@6.1.0': + resolution: {integrity: sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==} + + '@codemirror/lang-yaml@6.1.3': + resolution: {integrity: sha512-AZ8DJBuXGVHybpBQhmZtgew5//4hv3tdkXnr3vDmOUMJRuB6vn/uuwtmTOTlqEaQFg3hQSVeA90NmvIQyUV6FQ==} + + '@codemirror/language@6.12.3': + resolution: {integrity: sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA==} + + '@codemirror/lint@6.9.6': + resolution: {integrity: sha512-6Kp7r6XfCi/D/5sdXieMfg9pJU1bUEx96WITuLU6ESaKizCz0QHFMjY/TaFSbigDdEAIgi93itLBIUETP4oK+A==} + + '@codemirror/state@6.6.0': + resolution: {integrity: sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==} + + '@codemirror/view@6.43.0': + resolution: {integrity: sha512-V7ZCLQO3Jus9hzh2jVCCPW3mO4IBMr43O37PqSUYautJSnnJF41YlgLw21x0fLJTYvJ+Vkm6Gp+qKGH9pltgXA==} + '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} @@ -3340,9 +3505,18 @@ packages: react: '>=17.0.0' react-dom: '>=17.0.0' + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + '@floating-ui/utils@0.2.11': resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + '@floating-ui/vue@1.1.11': + resolution: {integrity: sha512-HzHKCNVxnGS35r9fCHBc3+uCnjw9IWIlCPL683cGgM9Kgj2BiAl8x1mS7vtvP6F9S/e/q4O6MApwSHj8hNLGfw==} + + '@floating-ui/vue@1.1.9': + resolution: {integrity: sha512-BfNqNW6KA83Nexspgb9DZuz578R7HT8MZw1CfK9I6Ah4QReNWEJsXWHN+SdmOVLNGmTPDi+fDT535Df5PzMLbQ==} + '@formatjs/ecma402-abstract@3.1.0': resolution: {integrity: sha512-CjP1sUzM7XiQW6YluDreN+dMvcKZysO/J4ikvuDjDyd6nSOoSqAK9gvD1s75ZFaJVXtYOsz+y3CUXPZ1sKxcxw==} @@ -3394,6 +3568,18 @@ packages: '@hapi/bourne@3.0.0': resolution: {integrity: sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==} + '@headlessui/tailwindcss@0.2.2': + resolution: {integrity: sha512-xNe42KjdyA4kfUKLLPGzME9zkH7Q3rOZ5huFihWNWOQFxnItxPB3/67yBI8/qBfY8nwBRx5GHn4VprsoluVMGw==} + engines: {node: '>=10'} + peerDependencies: + tailwindcss: ^3.0 || ^4.0 + + '@headlessui/vue@1.7.23': + resolution: {integrity: sha512-JzdCNqurrtuu0YW6QaDtR2PIYCKPUWq28csDyMvN4zmGccmE7lz40Is6hc3LA4HFeCI7sekZ/PQMTNmn9I/4Wg==} + engines: {node: '>=10'} + peerDependencies: + vue: ^3.2.0 + '@homarr/gridstack@1.12.0': resolution: {integrity: sha512-5gg9HaSPETgDMmpcPWYKEiaQsDEkMPu3xgHKvpmTo9JKUSE8Q06fdrf+N2WN3A2wGhZz2+/jPoIEXAuoYfvn0w==} @@ -3401,6 +3587,12 @@ packages: resolution: {integrity: sha512-Nsh23+aIMzWhHelM7XDGz5B+5ADprOWuPVUyCpEStOgnHQfdC1Wa6z66VkROBeV2ep4a7YgvQV166/OCzP1sgw==} engines: {node: '>=22.0.0'} + '@hono/node-server@1.19.14': + resolution: {integrity: sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==} + engines: {node: '>=18.14.1'} + peerDependencies: + hono: '>=4.12.23' + '@img/colour@1.0.0': resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} engines: {node: '>=18'} @@ -3726,6 +3918,12 @@ packages: '@types/node': optional: true + '@internationalized/date@3.12.2': + resolution: {integrity: sha512-FY1Y+H64NDs+HAF6omlnWxm3mEpfgaCSWtL5l551ZZfImA+kGjPFgrnJrGjH6lfmLL0g8Z/mBu1R3kufeCp6Jw==} + + '@internationalized/number@3.6.7': + resolution: {integrity: sha512-3ji1fcrT+FPAK86UqEhB/psHixYo6niWPJtt7+qRaYFynt/BaJG8GhAPimtWUpEiVSTq8ZM8L5psMxGquiB/Vg==} + '@ioredis/commands@1.10.0': resolution: {integrity: sha512-UmeW7z4LfctwoQ5wkhVzgq8tXkreED2xZGpX+Bg+zA+WJFZCT6c062AfCK/Dfk81xZnnwdhJCUMkitihRaoC2Q==} @@ -3782,6 +3980,33 @@ packages: '@kwsites/file-exists@1.1.1': resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} + '@lezer/common@1.5.2': + resolution: {integrity: sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==} + + '@lezer/css@1.3.3': + resolution: {integrity: sha512-RzBo8r+/6QJeow7aPHIpGVIH59xTcJXp399820gZoMo9noQDRVpJLheIBUicYwKcsbOYoBRoLZlf2720dG/4Tg==} + + '@lezer/highlight@1.2.3': + resolution: {integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==} + + '@lezer/html@1.3.13': + resolution: {integrity: sha512-oI7n6NJml729m7pjm9lvLvmXbdoMoi2f+1pwSDJkl9d68zGr7a9Btz8NdHTGQZtW2DA25ybeuv/SyDb9D5tseg==} + + '@lezer/javascript@1.5.4': + resolution: {integrity: sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==} + + '@lezer/json@1.0.3': + resolution: {integrity: sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==} + + '@lezer/lr@1.4.10': + resolution: {integrity: sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==} + + '@lezer/xml@1.0.6': + resolution: {integrity: sha512-CdDwirL0OEaStFue/66ZmFSeppuL6Dwjlk8qk153mSQwiSH/Dlri4GNymrNWnUmPl2Um7QfV1FO9KFUyX3Twww==} + + '@lezer/yaml@1.0.4': + resolution: {integrity: sha512-2lrrHqxalACEbxIbsjhqGpSW8kWpUKuY6RHgnSAFZa6qK62wvnPxA8hGOwOoDbwHcOFs5M4o27mjGu+P7TvBmw==} + '@libsql/client-wasm@0.14.0': resolution: {integrity: sha512-gB/jtz0xuwrqAHApBv9e9JSew2030Fhj2edyZ83InZ4yPj/Q2LTUlEhaspEYT0T0xsAGqPy38uGrmq/OGS+DdQ==} bundledDependencies: @@ -3877,6 +4102,19 @@ packages: react: ^19.2.0 react-dom: ^19.2.0 + '@marijn/find-cluster-break@1.0.2': + resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} + + '@modelcontextprotocol/sdk@1.26.0': + resolution: {integrity: sha512-Y5RmPncpiDtTXDbLKswIJzTqu2hyBKxTNsgKqKclDbhIgg1wgtf1fRuvxgTnRfcnxtvvgbIEcqUOzZrJ6iSReg==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + '@mswjs/interceptors@0.41.9': resolution: {integrity: sha512-VVPPgHyQ6ShqnrmDWuxjmUIsO9gWyOZFmuOfLd9LfBGQJwZfy0gvv9pbHSJuoFNIYC7ZDX9aoFwowjcdSC4E8w==} engines: {node: '>=18'} @@ -3936,6 +4174,10 @@ packages: cpu: [x64] os: [win32] + '@noble/ciphers@2.2.0': + resolution: {integrity: sha512-Z6pjIZ/8IJcCGzb2S/0Px5J81yij85xASuk1teLNeg75bfT07MV3a/O2Mtn1I2se43k3lkVEcFaR10N4cgQcZA==} + engines: {node: '>= 20.19.0'} + '@noble/hashes@2.0.1': resolution: {integrity: sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==} engines: {node: '>= 20.19.0'} @@ -4065,6 +4307,14 @@ packages: '@open-draft/until@2.1.0': resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/semantic-conventions@1.41.1': + resolution: {integrity: sha512-/UhIkaZgPutTFmQ7RnIJGgDXZmtEJ7Dvi86xNTFWcnRxVRNk/aotsqDJYeEvDP+FSMB2SdW+pQzNMcWP0rwuNA==} + engines: {node: '>=14'} + '@oxfmt/binding-android-arm-eabi@0.53.0': resolution: {integrity: sha512-XfVM8AmIovBTKXCt14Op5wbfcoM8418nttd+nhMgM3RAVaJg1MtJc73FyWfUt0oxLyBGVwfniNVUsbV/b3VmPg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4400,6 +4650,9 @@ packages: '@petamoriken/float16@3.9.3': resolution: {integrity: sha512-8awtpHXCx/bNpFt4mt2xdkgtgVvKqty8VbjHI/WWWQuEw+KLzFot3f4+LkQY9YmOtq7A5GdOnqoIC8Pdygjk2g==} + '@phosphor-icons/core@2.1.1': + resolution: {integrity: sha512-v4ARvrip4qBCImOE5rmPUylOEK4iiED9ZyKjcvzuezqMaiRASCHKcRIuvvxL/twvLpkfnEODCOJp5dM4eZilxQ==} + '@pinojs/redact@0.4.0': resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} @@ -4461,6 +4714,35 @@ packages: resolution: {integrity: sha512-OWOaE7Ieufo7VMv957iahOzv/w5oXyyXO28Jh2x6rLU96ZLqC508kAKTgdMJRXgVjda2s+/0C6Kno+k16OmJsQ==} engines: {bun: '>=1.0.0', node: '>=20.0.0'} + '@redis/bloom@1.2.0': + resolution: {integrity: sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==} + peerDependencies: + '@redis/client': ^1.0.0 + + '@redis/client@1.6.1': + resolution: {integrity: sha512-/KCsg3xSlR+nCK8/8ZYSknYxvXHwubJrU82F3Lm1Fp6789VQ0/3RJKfsmRXjqfaTA++23CvC3hqmqe/2GEt6Kw==} + engines: {node: '>=14'} + + '@redis/graph@1.1.1': + resolution: {integrity: sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==} + peerDependencies: + '@redis/client': ^1.0.0 + + '@redis/json@1.0.7': + resolution: {integrity: sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==} + peerDependencies: + '@redis/client': ^1.0.0 + + '@redis/search@1.2.0': + resolution: {integrity: sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==} + peerDependencies: + '@redis/client': ^1.0.0 + + '@redis/time-series@1.1.0': + resolution: {integrity: sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==} + peerDependencies: + '@redis/client': ^1.0.0 + '@reduxjs/toolkit@2.11.2': resolution: {integrity: sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==} peerDependencies: @@ -4472,6 +4754,13 @@ packages: react-redux: optional: true + '@replit/codemirror-css-color-picker@6.3.0': + resolution: {integrity: sha512-19biDANghUm7Fz7L1SNMIhK48tagaWuCOHj4oPPxc7hxPGkTVY2lU/jVZ8tsbTKQPVG7BO2CBDzs7CBwb20t4A==} + peerDependencies: + '@codemirror/language': ^6.0.0 + '@codemirror/state': ^6.0.0 + '@codemirror/view': ^6.0.0 + '@rolldown/pluginutils@1.0.0-rc.3': resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} @@ -4622,8 +4911,98 @@ packages: '@rvf/set-get@7.0.1': resolution: {integrity: sha512-GkTSn9K1GrTYoTUqlUs36k6nJnzjQaFBTTEIqUYmzBcsGsoJM8xG7EAx2WLHWAA4QzFjcwWUSHQ3vM3Fbw50Tg==} - '@scarf/scarf@1.4.0': - resolution: {integrity: sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==} + '@scalar/agent-chat@0.12.6': + resolution: {integrity: sha512-4JvCq8sFJNigpuc8gayIAV+5hwX1RG/klZ3KagPxn/uJmLfMCSeQyHPqVRutl9uommZOdm3ByVqH7bkQrId/Jg==} + engines: {node: '>=22'} + + '@scalar/api-client@3.9.0': + resolution: {integrity: sha512-vwMKEsVsygz0tQg0cylzXs5XzkLWm2xAUpJSd2Jim1YEjc1a9GdnIduVE6QLh9iQnDrwilPcVRXYXZpkzFZNxg==} + engines: {node: '>=22'} + + '@scalar/api-reference-react@0.9.42': + resolution: {integrity: sha512-8QttZlGYkq09N0/2M1IELlPG8JHCtIiIc4TCGWf+wVZWU/Y1Jx85mtnup1VC3UqoUsXQFeOg9/PE4URuuRmEAQ==} + engines: {node: '>=22'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + + '@scalar/api-reference@1.58.0': + resolution: {integrity: sha512-XWaKsnIRMjXp0h99LLZA7NIPePqIJPLkFJXkH1mg52jBIVZ05Ma5PbLBo+ZyQFPYsELdLxoFsgD5KfJ8HNtk9Q==} + engines: {node: '>=22'} + + '@scalar/code-highlight@0.3.4': + resolution: {integrity: sha512-gGr3D8bfInwZDHsxamYIaG72Wr+kRNX8d4zcOflAfQJ0ZfvqoVbYhhkiSd6K+DLySItK9lWl/cgjJdtKWlT2ig==} + engines: {node: '>=22'} + + '@scalar/components@0.26.1': + resolution: {integrity: sha512-O9Oc+N3JCF1DIYFdV5QD19alBoIsUCofX4P1oKwT5FgOOIVslhldpxP9EJUVf1YnB0foijhn8Yf2pDsgJwAM5g==} + engines: {node: '>=22'} + + '@scalar/helpers@0.8.1': + resolution: {integrity: sha512-yuiuBCadP5bjAnIv23QvifVN/NaMi9xBF6b8Wdk4QOzwzLPJmp699MAdf33J0A5i2qKcvnu32iz/VkEJmQRe5g==} + engines: {node: '>=22'} + + '@scalar/icons@0.7.3': + resolution: {integrity: sha512-5uSUvumj6yJEAZT7/MKpgrkNl76waDXUpu0kUBBFJ83GhZirBIK+Z9SktShEvJT0+rk/j9Zaer3BHoEhYwAEBQ==} + engines: {node: '>=22'} + + '@scalar/json-magic@0.12.15': + resolution: {integrity: sha512-ZYgdYZ0jSZXQeyhG2lJ20FjzvKsaDRXk4bPguF/Ytl2nGBh9a6RIIr9NvVy4zAD67a/ahm+xipXlfoR1KtB5fg==} + engines: {node: '>=22'} + + '@scalar/oas-utils@0.18.0': + resolution: {integrity: sha512-UhfB2FbXYSsJ3hylDbfvB75jcGMq8MmRPblhxbnw59RC3c5JyyXL5uAl/ZF4yKO55hXTXPTj/zmf0yNi3T06rw==} + engines: {node: '>=22'} + + '@scalar/openapi-types@0.9.1': + resolution: {integrity: sha512-gkGhSkxSzADaBiNg+ZAbJuwj+ZUmzP2Pg9CWZ7ZP+0fck2WjPeDDM7aAbouAm0aQQMF9xBjSPXSA9a/qTHYaTw==} + engines: {node: '>=22'} + + '@scalar/openapi-upgrader@0.2.9': + resolution: {integrity: sha512-D5b0rGLLZgmkO9mdW2j/ND1KBlH1u3RCpr87HPxv9P9ZSr6PtM5iLqFOJq0ACiaHjY2mikCrxgDmnUEhTzRpHQ==} + engines: {node: '>=22'} + + '@scalar/schemas@0.3.3': + resolution: {integrity: sha512-qDcgFu6ta5Z90L9D2P6DFKzYesU+FW5+m55SGmdI4iRMRCwj5umHpec2Y2W/SJcCF6bbUZawMxuOH2Ja6rUNpQ==} + engines: {node: '>=22'} + + '@scalar/sidebar@0.9.18': + resolution: {integrity: sha512-ltLPDvBjkVrakrnJ9uQGYv3yVhB0azEh6MBSR5MtndVHUt4PuvN7wR5xVIbkb9CrPJhFlKUb05ykv2nltMDciw==} + engines: {node: '>=22'} + + '@scalar/snippetz@0.9.12': + resolution: {integrity: sha512-Awbl/1uwucA8kUpePI3x4rPRY1TZ4Wg54pIA75uirFd678caCnPP4GNF7+WB1wonHTTWgvtDVnX7zKJnYGti0g==} + engines: {node: '>=22'} + + '@scalar/themes@0.15.6': + resolution: {integrity: sha512-s55reSoqbkct1opGATiW3upXGeehiMLBhW5Rv8ATZgtAxUJBlIRdmObUtz8mC3WZMzq3FkSxALJKRLSCjWTdVw==} + engines: {node: '>=22'} + + '@scalar/typebox@0.1.3': + resolution: {integrity: sha512-lU055AUccECZMIfGA0z/C1StYmboAYIPJLDFBzOO81yXBi35Pxdq+I4fWX6iUZ8qcoHneiLGk9jAUM1rA93iEg==} + + '@scalar/types@0.12.3': + resolution: {integrity: sha512-7zaXafbgTFmsJ/9AwYeExUWzXoZNyKOL0SEVAUWRaOndcjxpFCtwzuPrc1elMEWdHopWbY1Qe5pWKbE2aqG2HA==} + engines: {node: '>=22'} + + '@scalar/use-codemirror@0.14.11': + resolution: {integrity: sha512-5wtC4pUjzhy72j3aAueJg+fh9KflevJvXMn0YscsxiDTvqwIzeZcHe1N9VNtvzDXgLblEeBT6D0+Vs+boyExxg==} + engines: {node: '>=22'} + + '@scalar/use-hooks@0.4.6': + resolution: {integrity: sha512-WhsTBk3e7R31yHWQWrrr/RVPGpqwY22RPHN3i4zdEv6llxrloDbkHTpwXCDHTnX92v2A7hKESR6JrGsXcKqrQw==} + engines: {node: '>=22'} + + '@scalar/use-toasts@0.10.2': + resolution: {integrity: sha512-1iHQFbDXv0YQRp13aa63S5EcTJ5K8T0ocnLxk+nziloPrLjKt6jdRt6vOHsLSv5sm9kFKcVKNQTQgialmKCOGA==} + engines: {node: '>=22'} + + '@scalar/validation@0.6.0': + resolution: {integrity: sha512-tpmmG+/xRE2Kn9RpflU3AIyZv08v10+E1ZrJCx7z6+/91zHVxy0M73kC1LT4/8PbYNt85ywyC8+n+D99JdMcGA==} + engines: {node: '>=20'} + + '@scalar/workspace-store@0.53.0': + resolution: {integrity: sha512-rbSuzAXKTXhjwdFERI4AYKj+dQVQW5jAPNH1GEUz0NgFcn9r5DgXraFv4z9EtmkpKHejj2ORSLgWfb5sUVCOWw==} + engines: {node: '>=22'} '@schummar/icu-type-parser@1.21.5': resolution: {integrity: sha512-bXHSaW5jRTmke9Vd0h5P7BtWZG9Znqb8gSDxZnxaGSJnGwPLDPfS+3g0BKzeWqzgZPsIVZkM7m2tbo18cm5HBw==} @@ -4692,122 +5071,6 @@ packages: '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} - '@swagger-api/apidom-ast@1.11.0': - resolution: {integrity: sha512-poLd6eNipLCFCrxjZD+E9E0Z85CLfFzueNiVcYj86rwMp2OszYsTzZS2jz82yR/usNCjXCpkQ2xEXWSmDhefPg==} - - '@swagger-api/apidom-core@1.11.0': - resolution: {integrity: sha512-7TvbbC3dG3yM8cjqyrFXoTOpwgOC68+Z17Ro36drJwZ0k/c7QQc0dI/KvTSPHn9UfimEMdZ0q+yIIzqrAiEmww==} - - '@swagger-api/apidom-error@1.11.0': - resolution: {integrity: sha512-JPt37oOrf73CAZNQBPffnLzU5iEUs8cT9pFmc9vy2gHQp+vjSKxeJ9F6zagTp8VnLPUq0gVjIvCQvcX8NPW2jA==} - - '@swagger-api/apidom-json-pointer@1.11.0': - resolution: {integrity: sha512-11JWHr55FciYGTbcicNZrBsFEwNuLLZybi00YHJ3OBcuXcFJPKmKluLnVL7GhZYEqvLYOcVsCfInYW5MXoj00w==} - - '@swagger-api/apidom-ns-api-design-systems@1.11.0': - resolution: {integrity: sha512-IskDsUkUtNas4guoChRKKkw0wOst64nRA24WuIjLf8ztfBdcl/oqx/cgy8pwWCUqNYvL9L3+sD5HeuokqMrySw==} - - '@swagger-api/apidom-ns-arazzo-1@1.11.0': - resolution: {integrity: sha512-n+aGSlLHyrpmCaBa9DBZkIqnNVzYAYSa010MvAwhlwtW3EbFYNwYWinbTwLqCd3leN6XWTvQYCvk0/k7/9Cq4A==} - - '@swagger-api/apidom-ns-asyncapi-2@1.11.0': - resolution: {integrity: sha512-SHh3naFZlXFI0gG36tNYvJ/VO8aZsjnXIQAqJHfOE6rrpl5msJrdDatmNczh+57WPZxEZA+KTXWCqNKdeu3G3Q==} - - '@swagger-api/apidom-ns-asyncapi-3@1.11.0': - resolution: {integrity: sha512-4vrgNYDj68hgmgZj1eGBaBr5xqIETWn4jAioiRHek4jV1FLvmxCs3nC2nYs8CzQqqJ1bqirdiirrUpqhaQvTEA==} - - '@swagger-api/apidom-ns-json-schema-2019-09@1.11.0': - resolution: {integrity: sha512-5avPMY1YbQmJIqXlu7rm3yftf4xhT2REBxpEgw8Nc7Zlbn4Z5iGXBsHr60982MwqeE6W8wA+HHQMKHM5siuhdQ==} - - '@swagger-api/apidom-ns-json-schema-2020-12@1.11.0': - resolution: {integrity: sha512-zddyOxWKlQ9WPaZR0e8ykmy8AbGnDvqCqqy6BdYqKZ9Ts8ZK1XwOB2j9ruccZpoiy/rp2tow+CUf3XE5rricmQ==} - - '@swagger-api/apidom-ns-json-schema-draft-4@1.11.0': - resolution: {integrity: sha512-upc0xKb3nxsYPECRDf5UygnZHTSj78xHj5+SBIHNDXoaGDhvMCtWoDVGAKFtZ+jZlIkyJt7cGAeOX0w9IV3XkA==} - - '@swagger-api/apidom-ns-json-schema-draft-6@1.11.0': - resolution: {integrity: sha512-sd/U6Y34uRqdgd3Phz1oEhO7UBCn60+OfIasFFpHZcKe7O0jTmayiaJqbpwirhwt7Fv5Ev5m58+y1nVomLnhQw==} - - '@swagger-api/apidom-ns-json-schema-draft-7@1.11.0': - resolution: {integrity: sha512-7ptuxmuh2vN1hDr3cLkYm2rl+ak2J1byoGxswucKfSb+7IaFoA36/t7kcOsE/hIO4yI7T3ZPOuNSpeg1NBVjEw==} - - '@swagger-api/apidom-ns-openapi-2@1.11.0': - resolution: {integrity: sha512-cAIPJhLxm/nj1kzneNySeaTahY+hH5gkGNsgbmifGnLPsC5YOOfEVMKLj18IREdXqdnxJgRbsI9Azl4g09TPkg==} - - '@swagger-api/apidom-ns-openapi-3-0@1.11.0': - resolution: {integrity: sha512-IUEWVSuETE5DdgTJhIt6oZyRTYUV892/I9UdyTResR0Bypc7gy3YXwlzMlUZx73S2klaiFo1dL4iu/fqzA2fEg==} - - '@swagger-api/apidom-ns-openapi-3-1@1.11.0': - resolution: {integrity: sha512-WpUvFgOs4YMUmyeJRQEADps+U5o71YTtzKMPNr1cF1ZHKKkcRMUJL9QlJ4Y9cxAdjo6oXzXZa5922XOpwMYhxA==} - - '@swagger-api/apidom-ns-openapi-3-2@1.11.0': - resolution: {integrity: sha512-mUErHIq8rHVoOrkHnRj3mhoNYVIl8th474/m0+E8OB2wBAe0KgiczaJX9KkBQoAo5XIxoRfmI5T3bp+fRabwCA==} - - '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.11.0': - resolution: {integrity: sha512-0OdwcnV/QF+Vs3Vj0dTmlRHEp9WQg9aBvWWl8Fq25OviyDhGGRpqgkEAOjtVYCH3XyZ1Xz+jhIDOdd5pxBajsA==} - - '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.11.0': - resolution: {integrity: sha512-K714DT6nFW+ZM9LTo+c120zkUjsEcIFO2DU+0cnzReRyenb1x6RZe+uOqTt7iWohnnWp2FV/j0exd/mCsxW65Q==} - - '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.11.0': - resolution: {integrity: sha512-z9K6XEr3AafV2EA+1pfW+8VoMCCSSpm2IU7oUTjSnhxRb5t/DZR4Qg8FEK8tRKdS2BO2kFFLb2xikrY3Qx8B+g==} - - '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.11.0': - resolution: {integrity: sha512-HPb7Wzr+cj0IJkRRlqsK1tNCQXivuGRP4iB2yek16sQZXo2eqSUZ3j3Lz/WwWgnN/FWGAODm4bj9+EhGQ11TnA==} - - '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.11.0': - resolution: {integrity: sha512-sQenLXZRmTDQehe3JCSQpz6jpE3DhMQ0aoe2gpNqo23Gt/4oeW6nAP2h49q9Ne+CHPp0ApFUUyIXF7UTmbUWqA==} - - '@swagger-api/apidom-parser-adapter-asyncapi-json-3@1.11.0': - resolution: {integrity: sha512-aGnG3AYp4Qsimn1FOP0B9leYCJAQVockzHqyJj30xiNAXquBMXr6lq3L2/AEsmpDGv/x/++YJ4p2ggSxy12QNw==} - - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.11.0': - resolution: {integrity: sha512-iIRlB8B46UPiu0EkKhq1TvwloBgObASJ5ROx8rhT5+Pj+BBegE+KIY02EUKwcz5FgXJrH3XcltLiI7ZA68347Q==} - - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3@1.11.0': - resolution: {integrity: sha512-BF2ZyQYMUNrjP1nMneX6ZD2IWBLycWpxg3yllXDCJtfdQT/IMzldIPKCNI9qoBE57lM6j2hpy+Jd86QJk20t2w==} - - '@swagger-api/apidom-parser-adapter-json@1.11.0': - resolution: {integrity: sha512-DObW0LxYwif0erzGoXiEAZ6ecc/18LIEKxjEAc5Bw2M5I0C/iGW4y/UxAywihGvhMEo1gOvdO6w9Jh6UnuPVmA==} - - '@swagger-api/apidom-parser-adapter-openapi-json-2@1.11.0': - resolution: {integrity: sha512-dREUHAEHVry9aSGjqDpYF9Wzm1lgUkV6EgoYDflyQ9HxgCwhucDPFmUgI7UaR0G6bplnJumMcZXh1I1TGn1v7Q==} - - '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.11.0': - resolution: {integrity: sha512-U/NZpvuj9IpUS48zF2tYbgW2AtTw6Yi6kXNiHUtgUEomxYdb6XQeKLDGvgeWjgAgfUROohakcH+wx713VCGxfQ==} - - '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.11.0': - resolution: {integrity: sha512-fYarNeaz39oKZ6VwqwON+IeJszidZGPvUYDfggLaar81NGimrz07y1U+DhAf96IX3qgUa2J6Fu3Bv1r57hs6Ng==} - - '@swagger-api/apidom-parser-adapter-openapi-json-3-2@1.11.0': - resolution: {integrity: sha512-jtMoAH3R73bQUc4D2cJTUUvO4iJz9CV1W4+zoU/gT2l6h8Ji5EhZH0/VyynUk4J6mW/GdwxUN/q5z2P/DtSmfA==} - - '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.11.0': - resolution: {integrity: sha512-e8L4kHahgkOIzCCSGs5jTahXLInERNr37teSLS4SuqYgSVWr9AVXuNvpHNYGeMECD8briGIGfAAtnZChCGYrEA==} - - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.11.0': - resolution: {integrity: sha512-s+AXnNzLeAk28jUAeXwTSR1AlX+TXIAt2GfFgWUAV+SFw2OhRpoKYLzItN3n2UsHselqHvfyUL9xNCJBZleQtQ==} - - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.11.0': - resolution: {integrity: sha512-xyUyehHhB+BSOAT7mYGqmcEozuLKxmx1Hug97O9SVgNU8QTClc95+VWrAHhJbn8juPR6y2vSwm/wrQDwb4yq7w==} - - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-2@1.11.0': - resolution: {integrity: sha512-u7Y98zdjEs+0Upa8TdxOsb7z8hYJmLz9lVleRiB7rqysVga6oSDI5NAFdLVqMB6uAUuFi/tyiuiFT4Qosfd6Vw==} - - '@swagger-api/apidom-parser-adapter-yaml-1-2@1.11.0': - resolution: {integrity: sha512-FZK9KfwiTnNc+imxg7Wu2ktKhXCYPeFQZ1uZJzJL/hk1n+zyPfRY/4Aue4HzDcG8+wbItd3dRjKClFanVZAXoA==} - - '@swagger-api/apidom-reference@1.11.0': - resolution: {integrity: sha512-ftqegYrxxl9UwQFbdVOtXIqNolVd25M5u53X8fP96Wx6lEVr5Ed7B6+dzch8ttCUmKeoLIeagvt76b6BoYtnLw==} - - '@swaggerexpert/cookie@2.0.2': - resolution: {integrity: sha512-DPI8YJ0Vznk4CT+ekn3rcFNq1uQwvUHZhH6WvTSPD0YKBIlMS9ur2RYKghXuxxOiqOam/i4lHJH4xTIiTgs3Mg==} - engines: {node: '>=12.20.0'} - - '@swaggerexpert/json-pointer@2.10.2': - resolution: {integrity: sha512-qMx1nOrzoB+PF+pzb26Q4Tc2sOlrx9Ba2UBNX9hB31Omrq+QoZ2Gly0KLrQWw4Of1AQ4J9lnD+XOdwOdcdXqqw==} - engines: {node: '>=12.20.0'} - '@swc/core-darwin-arm64@1.15.3': resolution: {integrity: sha512-AXfeQn0CvcQ4cndlIshETx6jrAM45oeUrK8YeEY6oUZU/qzz0Id0CyvlEywxkWVC81Ajpd8TQQ1fW5yx6zQWkQ==} engines: {node: '>=10'} @@ -4980,6 +5243,14 @@ packages: '@tanstack/virtual-core@3.11.2': resolution: {integrity: sha512-vTtpNt7mKCiZ1pwU9hfKPhpdVO2sVzFQsxoVBGtOSHxlrRRzYr8iQ2TlwbAcRYCcEiZ9ECAM8kBzH0v2+VzfKw==} + '@tanstack/virtual-core@3.17.0': + resolution: {integrity: sha512-gOxY/hFkPh/XQYhnThBHzkbkX3Ed+z/iushyz+R+JAr213aXxUDgQoTgTdrDpBSRsjFM73P/KfUyWmaF9WHMkQ==} + + '@tanstack/vue-virtual@3.13.28': + resolution: {integrity: sha512-A+jWpXtMpWXKhGLKQrXeC9mk1VgYeMWSJ+o0CTCEi+HLYMSQFdVmPG9lJz7d4XJyIkc5xVwZU9QY67QpScqnxA==} + peerDependencies: + vue: ^2.7.0 || ^3.0.0 + '@testcontainers/mysql@12.0.1': resolution: {integrity: sha512-/vC3XP+TbCC/Vvn7lATNolIFA+AcWArBIfEV/zRPGts+ntGh7t1jCMEyMF9kfOTKrQwCc0a+w2IwfAYY7b2jTQ==} @@ -5210,14 +5481,6 @@ packages: '@tiptap/starter-kit@3.26.0': resolution: {integrity: sha512-o34EtMfqtBaljdmeElZsRG/067oGx9Zcq+j2GWo71KlZe22ga/ALexeTf1c+ETsjCxSTKR6eyQ4RZvz/2JpYfg==} - '@tree-sitter-grammars/tree-sitter-yaml@0.7.1': - resolution: {integrity: sha512-AynBwkIoQCTgjDR33bDUp9Mqq+YTco0is3n5hRApMqG9of/6A4eQsfC1/uSEeHSUyMQSYawcAWamsexnVpIP4Q==} - peerDependencies: - tree-sitter: ^0.22.4 - peerDependenciesMeta: - tree-sitter: - optional: true - '@trpc/client@11.17.0': resolution: {integrity: sha512-KpJBFrbKTDeVCFv/3ckL1XBBH5Yssn8hethI/rUy7GIpTj+VzjtPjykDqJpzobuVOz+d26cXCSu1t4I6MYI5Zg==} hasBin: true @@ -5398,6 +5661,9 @@ packages: '@types/express@4.17.21': resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + '@types/har-format@1.2.16': + resolution: {integrity: sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==} + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -5446,9 +5712,6 @@ packages: '@types/qs@6.9.16': resolution: {integrity: sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==} - '@types/ramda@0.30.2': - resolution: {integrity: sha512-PyzHvjCalm2BRYjAU6nIB3TprYwMNOUY/7P/N8bSzp9W/yM2YrtGtAnnVtaCNSeOZ8DzKyFDvaqQs7LnWwwmBA==} - '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} @@ -5487,9 +5750,6 @@ packages: '@types/stream-buffers@3.0.7': resolution: {integrity: sha512-azOCy05sXVXrO+qklf0c/B07H/oHaIuDDAiHPVwlk3A9Ek+ksHyTeMajLZl3r76FxpPpxem//4Te61G1iW3Giw==} - '@types/swagger-ui-react@5.18.0': - resolution: {integrity: sha512-c2M9adVG7t28t1pq19K9Jt20VLQf0P/fwJwnfcmsVVsdkwCWhRmbKDu+tIs0/NGwJ/7GY8lBx+iKZxuDI5gDbw==} - '@types/triple-beam@1.3.5': resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} @@ -5508,6 +5768,12 @@ packages: '@types/video.js@7.3.58': resolution: {integrity: sha512-1CQjuSrgbv1/dhmcfQ83eVyYbvGyqhTvb2Opxr0QCV+iJ4J6/J+XWQ3Om59WiwCd1MN3rDUHasx5XRrpUtewYQ==} + '@types/web-bluetooth@0.0.20': + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} @@ -5521,6 +5787,15 @@ packages: resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} deprecated: Potential CWE-502 - Update to 1.3.1 or higher + '@unhead/vue@2.1.15': + resolution: {integrity: sha512-SSByXfEjhzPn8gXdEdgpYqpLMPSkLUH2HVE0GxZfOtNsJ0GgOHQs0g9T67ZZ1z0kTELLKdtOtYrzrbv9+ffF7g==} + peerDependencies: + vue: '>=3.5.18' + + '@vercel/oidc@3.1.0': + resolution: {integrity: sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==} + engines: {node: '>= 20'} + '@videojs/http-streaming@3.17.4': resolution: {integrity: sha512-XAvdG2dolBuV2Fx8bu1kjmQ2D4TonGzZH68Pgv/O9xMSFWdZtITSMFismeQLEAtMmGwze8qNJp3RgV+jStrJqg==} engines: {node: '>=8', npm: '>=5'} @@ -5587,6 +5862,99 @@ packages: '@vitest/utils@4.1.8': resolution: {integrity: sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==} + '@vue/compiler-core@3.5.35': + resolution: {integrity: sha512-BUmHaR1J+O+CKZ9uJucdVTEr1LHsdyvv7vG3eNRhK3CczEHeMd/LtsHAuD7PbrxvI2envCY2v7HI1vC1aBRzKw==} + + '@vue/compiler-dom@3.5.35': + resolution: {integrity: sha512-k+bprkXxuqhVajgTx5mUHuir7TwQzUKOWR40ng1ncAqQRPnrLngGGgqVEEhOnTMlc8btHYVKmrP8s5Qyg0hvYA==} + + '@vue/compiler-sfc@3.5.35': + resolution: {integrity: sha512-G5VPMcXTSywXBgtFOZOnHKBxKSrwXUcvY1iaF5/hRcy7t0J6CH/d8ha9F4nzi00Fax1eLV0QHM7v4mQu68jydw==} + + '@vue/compiler-ssr@3.5.35': + resolution: {integrity: sha512-rGhAeXgdM7/ffTJGXT69rCCdTmjDewnFuUZfBQQHTdcEBeWdT5HCGY60y2ytLJr9/Dsu7IntUi5z/w0h6Rjnzw==} + + '@vue/reactivity@3.5.35': + resolution: {integrity: sha512-tVc+SsHConvh/Lz64qq1pP3rYArBmK42xonovEcxY74SQtvctZodG/zhq54P5dr38cVuw25d27cPNRdlMidpGQ==} + + '@vue/runtime-core@3.5.35': + resolution: {integrity: sha512-A/xFNX9loIcWDygeQuNCfKuh0CoYBzxhqEMNah5TSFg9Z53DrFYEN2qi5CU9necjM1OWYegYREUTHmXTmhfXtg==} + + '@vue/runtime-dom@3.5.35': + resolution: {integrity: sha512-odrJ1C391dbGnyDRh8U+rnP7J2amIEzfmRk5vXy7xi3aZhEXofTvpi0T4HJb6jlNqQZTNPR5MPHSB3RHNkIORA==} + + '@vue/server-renderer@3.5.35': + resolution: {integrity: sha512-NkebSOYdB97wi8OQcO3HqzZSlymJi/aWsN/7h74OSVhRTm6qGs3Jp3e0rCXynmWwSlKeRrnlIug+ilYoHBmQDA==} + peerDependencies: + vue: 3.5.35 + + '@vue/shared@3.5.35': + resolution: {integrity: sha512-zSbjL7gRXwks2ZQLRGCajBtBXEOXW9Ddhn/HvSdrGkE2dqGnumzW8XtusRrxrE9LvqtiqDXQ+A60Hp6mvdYxfA==} + + '@vueuse/core@10.11.1': + resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} + + '@vueuse/core@13.9.0': + resolution: {integrity: sha512-ts3regBQyURfCE2BcytLqzm8+MmLlo5Ln/KLoxDVcsZ2gzIwVNnQpQOL/UKV8alUqjSZOlpFZcRNsLRqj+OzyA==} + peerDependencies: + vue: ^3.5.0 + + '@vueuse/integrations@13.9.0': + resolution: {integrity: sha512-SDobKBbPIOe0cVL7QxMzGkuUGHvWTdihi9zOrrWaWUgFKe15cwEcwfWmgrcNzjT6kHnNmWuTajPHoIzUjYNYYQ==} + peerDependencies: + async-validator: ^4 + axios: '>=1.17.0' + change-case: ^5 + drauu: ^0.4 + focus-trap: ^7 + fuse.js: ^7 + idb-keyval: ^6 + jwt-decode: ^4 + nprogress: ^0.2 + qrcode: ^1.5 + sortablejs: ^1 + universal-cookie: ^7 || ^8 + vue: ^3.5.0 + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + + '@vueuse/metadata@10.11.1': + resolution: {integrity: sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==} + + '@vueuse/metadata@13.9.0': + resolution: {integrity: sha512-1AFRvuiGphfF7yWixZa0KwjYH8ulyjDCC0aFgrGRz8+P4kvDFSdXLVfTk5xAN9wEuD1J6z4/myMoYbnHoX07zg==} + + '@vueuse/shared@10.11.1': + resolution: {integrity: sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==} + + '@vueuse/shared@13.9.0': + resolution: {integrity: sha512-e89uuTLMh0U5cZ9iDpEI2senqPGfbPRTHM/0AaQkcxnpqjkZqDYP8rpfm7edOz8s+pOCOROEy1PIveSW8+fL5g==} + peerDependencies: + vue: ^3.5.0 + '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -5661,6 +6029,10 @@ packages: abstract-logging@2.0.1: resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + acorn-import-phases@1.0.4: resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} engines: {node: '>=10.13.0'} @@ -5695,6 +6067,12 @@ packages: resolution: {integrity: sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==} engines: {node: '>=18'} + ai@6.0.33: + resolution: {integrity: sha512-bVokbmy2E2QF6Efl+5hOJx5MRWoacZ/CZY/y1E+VcewknvGlgaiCzMu8Xgddz6ArFJjiMFNUPHKxAhIePE4rmg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -5746,9 +6124,6 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - apg-lite@1.0.4: - resolution: {integrity: sha512-B32zCN3IdHIc99Vy7V9BaYTUzLeRA8YXYY1aQD1/5I2aqIrO0coi4t6hJPqMisidlBxhyME8UexkHt31SlR6Og==} - archiver-utils@5.0.2: resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} engines: {node: '>= 14'} @@ -5757,15 +6132,16 @@ packages: resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} engines: {node: '>= 14'} - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} argv-formatter@1.0.0: resolution: {integrity: sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==} + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + arktype@2.1.20: resolution: {integrity: sha512-IZCEEXaJ8g+Ijd59WtSYwtjnqXiwM8sWQ5EjGamcto7+HVN9eK0C4p0zDlCuAwWhpqr6fIBkxPuYDl4/Mcj/+Q==} @@ -5795,13 +6171,6 @@ packages: resolution: {integrity: sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==} engines: {node: '>=4'} - autolinker@3.16.2: - resolution: {integrity: sha512-JiYl7j2Z19F9NdTmirENSUUIIL/9MytEWtmzhfmsKPCp9E+G35Y0UNCMoM9tFigxT59qSc8Ml2dlZXOCVTYwuA==} - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - avvio@9.2.0: resolution: {integrity: sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ==} @@ -5879,6 +6248,76 @@ packages: before-after-hook@4.0.0: resolution: {integrity: sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==} + better-auth@1.6.14: + resolution: {integrity: sha512-c0/DvTQGDpgfj1knekCpQrg6PSWGDtfAtP7Ou6FkAhoE3RNnnIxLB5qKj6tRg53a1xsq93G6T68cNxrUZ7ZVmw==} + peerDependencies: + '@lynx-js/react': '*' + '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 + '@sveltejs/kit': ^2.0.0 + '@tanstack/react-start': ^1.0.0 + '@tanstack/solid-start': ^1.0.0 + better-sqlite3: ^12.0.0 + drizzle-kit: '>=0.31.4' + drizzle-orm: ^0.45.2 + mongodb: ^6.0.0 || ^7.0.0 + mysql2: ^3.0.0 + next: ^14.0.0 || ^15.0.0 || ^16.0.0 + pg: ^8.0.0 + prisma: ^5.0.0 || ^6.0.0 || ^7.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + solid-js: ^1.0.0 + svelte: ^4.0.0 || ^5.0.0 + vitest: ^2.0.0 || ^3.0.0 || ^4.0.0 + vue: ^3.0.0 + peerDependenciesMeta: + '@lynx-js/react': + optional: true + '@prisma/client': + optional: true + '@sveltejs/kit': + optional: true + '@tanstack/react-start': + optional: true + '@tanstack/solid-start': + optional: true + better-sqlite3: + optional: true + drizzle-kit: + optional: true + drizzle-orm: + optional: true + mongodb: + optional: true + mysql2: + optional: true + next: + optional: true + pg: + optional: true + prisma: + optional: true + react: + optional: true + react-dom: + optional: true + solid-js: + optional: true + svelte: + optional: true + vitest: + optional: true + vue: + optional: true + + better-call@1.3.5: + resolution: {integrity: sha512-kOFJkBP7utAQLEYrobZm3vkTH8mXq5GNgvjc5/XEST1ilVHaxXUXfeDeFlqoETMtyqS4+3/h4ONX2i++ebZrvA==} + peerDependencies: + zod: ^4.0.0 + peerDependenciesMeta: + zod: + optional: true + better-sqlite3@12.10.0: resolution: {integrity: sha512-CyzaZRQKyHkB2ZInfTTl2nvT33EbDpjkLEbE8/Zck3Ll6O0qqvuGdrJ45HgtH+HykRg88ITY3AdreBGN70aBSQ==} engines: {node: 20.x || 22.x || 23.x || 24.x || 25.x || 26.x} @@ -5898,6 +6337,10 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + body-parser@2.2.2: + resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} + engines: {node: '>=18'} + bottleneck@2.19.5: resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} @@ -5943,10 +6386,6 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - call-bound@1.0.4: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} @@ -5981,6 +6420,10 @@ packages: resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} @@ -6014,9 +6457,6 @@ packages: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} - classnames@2.5.1: - resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} - clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -6060,6 +6500,10 @@ packages: resolution: {integrity: sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==} engines: {node: '>=0.10.0'} + cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + co-body@6.2.0: resolution: {integrity: sha512-Kbpv2Yd1NdL1V/V4cwLVxraHDV6K8ayohr2rmH0J87Er8+zJjcTa6dAn9QMPC9CRgU8+aNajKbSf1TzDB1yKPA==} engines: {node: '>=8.0.0'} @@ -6100,6 +6544,10 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -6118,6 +6566,18 @@ packages: config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + content-disposition@1.1.0: + resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} + engines: {node: '>=18'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + content-type@2.0.0: + resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==} + engines: {node: '>=18'} + conventional-changelog-angular@8.0.0: resolution: {integrity: sha512-CLf+zr6St0wIxos4bmaKHRXWAcsCXrJU6F4VdNDrGRK3B8LDLKoX3zuMV5GhtbGkVR/LohZ6MT6im43vZLSjmA==} engines: {node: '>=18'} @@ -6153,6 +6613,14 @@ packages: cookie-es@3.0.1: resolution: {integrity: sha512-1HqK6V6Prrm7cHzmjtCzfa370ljqPQoNeWIh5NXYqWwUI2l3DZlzjHHh25ZvJIPfwkiYnCvHykE2MIJkEVD1Rg==} + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + cookie@1.1.1: resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} engines: {node: '>=18'} @@ -6165,15 +6633,13 @@ packages: resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} engines: {node: '>=18'} - copy-to-clipboard@3.3.3: - resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} - - core-js-pure@3.38.1: - resolution: {integrity: sha512-BY8Etc1FZqdw1glX0XNOq2FDwfrg/VGqoZOZCdaL+UmdaqDwQwYXkMJT4t6In+zfEfOJDcM9T0KdbBeJg8KKCQ==} - core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + engines: {node: '>= 0.10'} + cosmiconfig@9.0.0: resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} engines: {node: '>=14'} @@ -6196,6 +6662,9 @@ packages: resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} engines: {node: '>= 14'} + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + croner@10.0.1: resolution: {integrity: sha512-ixNtAJndqh173VQ4KodSdJEI6nuioBWI0V1ITNKhZZsO0pEMoDxz539T4FTTbSZ/xIOSuDnzxLVRqBVSvPNE2g==} engines: {node: '>=18.0'} @@ -6223,9 +6692,6 @@ packages: resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - css.escape@1.5.1: - resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -6234,6 +6700,14 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + cva@1.0.0-beta.4: + resolution: {integrity: sha512-F/JS9hScapq4DBVQXcK85l9U91M6ePeXoBMSp7vypzShoefUBxjQTo3g3935PUHgQd+IW77DjbPRIxugy4/GCQ==} + peerDependencies: + typescript: '>= 4.5.5' + peerDependenciesMeta: + typescript: + optional: true + d3-array@3.2.4: resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} engines: {node: '>=12'} @@ -6319,10 +6793,6 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - defu@6.1.7: resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} @@ -6385,9 +6855,6 @@ packages: dom-walk@0.1.2: resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} - dompurify@3.4.5: - resolution: {integrity: sha512-OrwIBKsdNSVEeubdJ1HBv/wNENRM9ytAVCv7YXt//A3vPdVMNuACRqK9mXCGCBW2ln7BT/A4X0jXHo2Gu89miA==} - dompurify@3.4.8: resolution: {integrity: sha512-yb1cEmaOum7wFvOCSQxyfgVlv5D47Rc30iZWoMpbDIWTnJ6grDDQyu2KFJzB2k7u0pMuJcQ1zphH//fFnw2tjQ==} @@ -6411,10 +6878,6 @@ packages: resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} engines: {node: '>=12'} - drange@1.1.1: - resolution: {integrity: sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==} - engines: {node: '>=4'} - drizzle-kit@0.31.10: resolution: {integrity: sha512-7OZcmQUrdGI+DUNNsKBn1aW8qSoKuTH7d0mYgSP8bAzdFzKoovxEFnoGQp2dVs82EOJeYycqRtciopszwUf8bw==} hasBin: true @@ -6527,6 +6990,9 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + electron-to-chromium@1.5.361: resolution: {integrity: sha512-Q6Hts7N9FnJc5LeGRINFvLhCI9xZmNtTDe5ZbcVezQz7cU4a8Aua3GH1b8J2XY8Al9PF+OCwYqhgsOOheMdvkA==} @@ -6549,6 +7015,10 @@ packages: enabled@2.0.0: resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -6556,6 +7026,14 @@ packages: resolution: {integrity: sha512-xYcDWrpELkFzz9SpZ3PlI6Eu6eD93Yf0WLDRxikGhWJ3MAir2SNZTIVCVZqZ/NUyx8AdMc2gT9C0gPiw18kG+A==} engines: {node: '>=10.13.0'} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + entities@8.0.0: resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} engines: {node: '>=20.19.0'} @@ -6623,6 +7101,9 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -6650,9 +7131,16 @@ packages: estree-util-is-identifier-name@3.0.0: resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} @@ -6670,6 +7158,14 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} + eventsource-parser@3.1.0: + resolution: {integrity: sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -6690,6 +7186,16 @@ packages: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} + express-rate-limit@8.5.2: + resolution: {integrity: sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + + express@5.2.1: + resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} + engines: {node: '>= 18'} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -6712,9 +7218,6 @@ packages: fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - fast-json-patch@3.1.1: - resolution: {integrity: sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==} - fast-json-stringify@6.3.0: resolution: {integrity: sha512-oRCntNDY/329HJPlmdNLIdogNtt6Vyjb1WuT01Soss3slIdyUp8kAcDU3saQTOquEK8KFVfwIIF7FebxUAu+yA==} @@ -6746,9 +7249,6 @@ packages: fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} - fault@1.0.4: - resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} - fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -6783,6 +7283,10 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} + find-my-way@9.5.0: resolution: {integrity: sha512-VW2RfnmscZO5KgBY5XVyKREMW5nMZcxDy+buTOsL+zIPnBlbKm+00sgzoQzq1EVh4aALZLfKdwv6atBGcjvjrQ==} engines: {node: '>=20'} @@ -6808,6 +7312,9 @@ packages: fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + focus-trap@7.8.0: + resolution: {integrity: sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==} + follow-redirects@1.16.0: resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} engines: {node: '>=4.0'} @@ -6817,10 +7324,6 @@ packages: debug: optional: true - for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} - foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} @@ -6829,9 +7332,13 @@ packages: resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} - format@0.2.2: - resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} - engines: {node: '>=0.4.x'} + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} @@ -6857,6 +7364,10 @@ packages: resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==} engines: {node: '>=18'} + fuse.js@7.4.2: + resolution: {integrity: sha512-LVbzjD4WA6UP5B1UnP8wuaXJiLnqMdM/E4fiJXTJ5haJ5b/MBNsK29h2fm6swEoQaVQjvYFWKLE2RanyZIoRVQ==} + engines: {node: '>=10'} + gel@2.0.0: resolution: {integrity: sha512-Oq3Fjay71s00xzDc0BF/mpcLmnA+uRqMEJK8p5K4PaZjUEsxaeo+kR9OHBVAf289/qPd+0OcLOLUN0UhqiUCog==} engines: {node: '>= 18.0.0'} @@ -6865,6 +7376,10 @@ packages: generate-function@2.3.1: resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + generic-pool@3.9.0: + resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==} + engines: {node: '>= 4'} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -6885,6 +7400,10 @@ packages: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} + get-own-enumerable-keys@1.0.0: + resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} + engines: {node: '>=14.16'} + get-port@7.2.0: resolution: {integrity: sha512-afP4W205ONCuMoPBqcR6PSXnzX35KTcJygfJfcp+QY+uwm3p20p1YczWXhlICIzGMCxYBQcySEcOgsJcrkyobg==} engines: {node: '>=16'} @@ -6946,6 +7465,10 @@ packages: resolution: {integrity: sha512-BBvQ/406p+4CZbTpCbVPSxfzrZrbnuWSP1ELYgyS6B+hNeKzgrdB4JczCa5VZUBQrDa9hUngm0KnexY6pJRN5Q==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + guess-json-indent@3.0.1: + resolution: {integrity: sha512-LWZ3Vr8BG7DHE3TzPYFqkhjNRw4vYgFSsv2nfMuHklAlOfiy54/EwiDQuQfFVLxENCVv20wpbjfTayooQHrEhQ==} + engines: {node: '>=18.18.0'} + h3@1.15.11: resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} @@ -6962,9 +7485,6 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -6977,12 +7497,54 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hast-util-embedded@3.0.0: + resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} + + hast-util-format@1.1.0: + resolution: {integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==} + + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + + hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + + hast-util-is-body-ok-link@3.0.1: + resolution: {integrity: sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-minify-whitespace@1.0.1: + resolution: {integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==} + hast-util-parse-selector@4.0.0: resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + hast-util-phrasing@3.0.1: + resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-sanitize@5.0.2: + resolution: {integrity: sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + hast-util-to-jsx-runtime@2.3.6: resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + hast-util-to-parse5@8.0.1: + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} + + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} @@ -6995,13 +7557,21 @@ packages: highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} - highlightjs-vue@1.0.0: - resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + + hono@4.12.23: + resolution: {integrity: sha512-eIaZ9qDgu7XV0pxOCrg7/WhnQ6Ivm22UcxhXx/A3dcbqbbYgBEkc6e/J/s7j2tS96zoB0S9VBdLwQNCWwUo4LA==} + engines: {node: '>=16.9.0'} hook-std@4.0.0: resolution: {integrity: sha512-IHI4bEVOt3vRUDJ+bFA9VUJlo7SzvFARPNLw75pqSmAOP2HmTWfFJtPvLBrDrlgjEYXY9zs7SFdHPQaJShkSCQ==} engines: {node: '>=20'} + hookable@6.1.1: + resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==} + hosted-git-info@7.0.2: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} @@ -7027,6 +7597,12 @@ packages: html-url-attributes@3.0.1: resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + html-whitespace-sensitive-tag-names@3.0.1: + resolution: {integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==} + http-cookie-agent@6.0.8: resolution: {integrity: sha512-qnYh3yLSr2jBsTYkw11elq+T361uKAJaZ2dR4cfYZChw1dt9uL5t3zSUwehoqqVb4oldk1BpkXKm2oat8zV+oA==} engines: {node: '>=18.0.0'} @@ -7041,6 +7617,10 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + http-proxy-agent@9.0.0: resolution: {integrity: sha512-FcF8VhXYLQcxWCnt/cCpT2apKsRDUGeVEeMqGu4HSTu29U8Yw0TLOjdYIlDsYk3IkUh+taX4IDWpPcCqKDhCjA==} engines: {node: '>= 20'} @@ -7075,6 +7655,10 @@ packages: icu-minify@4.13.0: resolution: {integrity: sha512-SIFMeUHZJjzS5RvIGvybKvWoHjDm9cGVEs2EpJ8PmywOdJLWyblPm7TdPLLoUtkJtwQD7iGhl2WMptZ+N0on+w==} + identifier-regex@1.0.1: + resolution: {integrity: sha512-ZrYyM0sozNPZlvBvE7Oq9Bn44n0qKGrYu5sQ0JzMUnjIhpgWYE2JB6aBoFwEYdPjqj7jPyxXTMJiHDOxDfd8yw==} + engines: {node: '>=18'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -7087,10 +7671,6 @@ packages: immer@11.1.4: resolution: {integrity: sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw==} - immutable@3.8.2: - resolution: {integrity: sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==} - engines: {node: '>=0.10.0'} - immutable@5.1.5: resolution: {integrity: sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==} @@ -7137,17 +7717,22 @@ packages: intl-messageformat@11.1.1: resolution: {integrity: sha512-vnrF2f4vfsdaFY6tuLZfzGcx1GZFMFAq6c7QdK3HSXNcGXEIQncNgbeAcnpjAOszQzq3Jbol2SwgshIGY08WyA==} - invariant@2.2.4: - resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - ioredis@5.11.0: resolution: {integrity: sha512-EZBErytyVovD8f6pDfG3Kb37N6Y3lmDA9NNj+4+IP13CzzHGeX+OyeRM2Um13khRzoBSzzL+5lVnCX8V2RLeMg==} engines: {node: '>=12.22.0'} + ip-address@10.2.0: + resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==} + engines: {node: '>= 12'} + ip-address@9.0.5: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} engines: {node: '>= 12'} + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + ipaddr.js@2.3.0: resolution: {integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==} engines: {node: '>= 10'} @@ -7155,6 +7740,10 @@ packages: iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + is-absolute-url@4.0.1: + resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} @@ -7167,10 +7756,6 @@ packages: is-buffer@1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} @@ -7192,6 +7777,10 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-identifier@1.0.1: + resolution: {integrity: sha512-HQ5v4rEJ7REUV54bCd2l5FaD299SGDEn2UPoVXaTHAyGviLq2menVUD2udi3trQ32uvB6LdAh/0ck2EuizrtpA==} + engines: {node: '>=18'} + is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} @@ -7203,6 +7792,10 @@ packages: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} + is-obj@3.0.0: + resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} + engines: {node: '>=12'} + is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -7210,9 +7803,16 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + is-property@1.0.2: resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + is-regexp@3.1.0: + resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} + engines: {node: '>=12'} + is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -7225,10 +7825,6 @@ packages: resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} engines: {node: '>=18'} - is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - is-unicode-supported@2.1.0: resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} @@ -7240,9 +7836,6 @@ packages: isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -7297,6 +7890,9 @@ packages: jose@6.0.8: resolution: {integrity: sha512-EyUPtOKyTYq+iMOszO42eobQllaIjJnwkZ2U93aJzNyPibCy7CEvT9UQnaCVB51IAd49gbNdCew1c0LcLTCB2g==} + jose@6.2.3: + resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} + jotai@2.20.0: resolution: {integrity: sha512-b5GAqgmXmXzB4WPaTH26ppk9Sl7AA9WSQX7yfdM+gJ1rFROiWcVbi97gFuN/yVCojOcbcvop2sfLL+fjxW0JVg==} engines: {node: '>=12.20.0'} @@ -7318,9 +7914,6 @@ packages: js-base64@3.7.8: resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} - js-file-download@0.4.12: - resolution: {integrity: sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg==} - js-tokens@10.0.0: resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} @@ -7364,11 +7957,20 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} @@ -7395,6 +7997,10 @@ packages: kuler@2.0.0: resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + kysely@0.29.2: + resolution: {integrity: sha512-s6WVJyEZrbm6jhBpiKHsGHyePMrVQKJ85wZCFCr9W4QHv6WTjWIrdvTmO9hDEA3bNK0xkrE2DqrHsXMLWuZpQg==} + engines: {node: '>=22.0.0'} + lazystream@1.0.1: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} engines: {node: '>= 0.6.3'} @@ -7443,9 +8049,6 @@ packages: lodash.clonedeep@4.5.0: resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - lodash.escaperegexp@4.1.2: resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} @@ -7479,8 +8082,8 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - lowlight@1.20.0: - resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==} + lowlight@3.3.0: + resolution: {integrity: sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==} lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -7540,6 +8143,9 @@ packages: resolution: {integrity: sha512-3lr8UeB+R+BN9c7eOBkeH1GlHf7+0Kzt0pcEgsT9xoXIA5gfXAzjd1niYiYDsvb62v5rLPqCqDiyYxtmmhGJ3g==} engines: {node: '>= 22.5.0'} + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + marked-terminal@7.3.0: resolution: {integrity: sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==} engines: {node: '>=16.0.0'} @@ -7555,9 +8161,40 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mcp-handler@1.1.0: + resolution: {integrity: sha512-MVCES7g18gcoZy+R/3v5nadkUMzMAWdos8jRl6DyljOKvd2/ZKDmwlCjL6zp4vo+7FeCXOYL1uWinHWlkKAAUg==} + hasBin: true + peerDependencies: + '@modelcontextprotocol/sdk': 1.26.0 + next: '>=13.0.0' + peerDependenciesMeta: + next: + optional: true + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + mdast-util-from-markdown@2.0.2: resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + mdast-util-mdx-expression@2.0.1: resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} @@ -7586,16 +8223,48 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + meow@13.2.0: resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} engines: {node: '>=18'} + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + microdiff@1.5.0: + resolution: {integrity: sha512-Drq+/THMvDdzRYrK0oxJmOKiC24ayUV8ahrt8l3oRK51PWt6gdtrIGrlIH3pT/lFh1z93FbAcidtsHcWbnRz8Q==} + micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + micromark-factory-destination@2.0.1: resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} @@ -7672,6 +8341,10 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + mime@4.0.4: resolution: {integrity: sha512-v8yqInVjhXyqP6+Kw4fV3ZzeMRqEW6FotRsKXjRS5VMTNIuXsdRoAvklpoRgSqXm6o9VNH4/C0mgedko9DdLsQ==} engines: {node: '>=16'} @@ -7692,10 +8365,6 @@ packages: min-document@2.19.0: resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} - minim@0.23.8: - resolution: {integrity: sha512-bjdr2xW1dBCMsMGGsUeqM4eFI60m94+szhxWys+B1ztIt6gWSfeGBdSVCIawezeHYLYn0j6zrsXdQS/JllBzww==} - engines: {node: '>=6'} - minimatch@10.2.5: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} @@ -7778,6 +8447,20 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@5.1.11: + resolution: {integrity: sha512-v+KEsUv2ps74PaSKv0gHTxTCgMXOIfBEbaqa6w6ISIGC7ZsvHN4N9oJ8d4cmf0n5oTzQz2SLmThbQWhjd/8eKg==} + engines: {node: ^18 || >=20} + hasBin: true + + nanostores@1.3.0: + resolution: {integrity: sha512-XPUa/jz+P1oJvN9VBxw4L9MtdFfaH3DAryqPssqhb2kXjmb9npz0dly6rCsgFWOPr4Yg9mTfM3MDZgZZ+7A3lA==} + engines: {node: ^20.0.0 || >=22.0.0} + napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} @@ -7788,13 +8471,14 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - neotraverse@0.6.18: - resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} - engines: {node: '>= 10'} - nerf-dart@1.0.0: resolution: {integrity: sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==} + neverpanic@0.0.7: + resolution: {integrity: sha512-GFRTSX2JAEATOCQYlyFkR+9FJPl0pD24toE1foqYAsL6aPLlRKn6L0UFOtJhZCxEbDv+SUsiW4AcPs9cIFwkFw==} + peerDependencies: + typescript: '5' + next-auth@5.0.0-beta.31: resolution: {integrity: sha512-1OBgCKPzo+S7UWWMp3xgvGvIJ0OpV7B3vR4ZDRqD9a4Ch+OT6dakLXG9ivhtmIWVa71nTSXattOHyCg8sNi8/Q==} peerDependencies: @@ -7849,9 +8533,6 @@ packages: resolution: {integrity: sha512-bLn/fU/ALVBE9wj+p4Y21ZJWYFjUXLXPi/IewyLZkx3ApxKDNBWCKdReeKOtD8dWpOdDCeMyLh6ZewzcLsG2Nw==} engines: {node: '>=10'} - node-abort-controller@3.1.1: - resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} - node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} @@ -8016,6 +8697,10 @@ packages: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -8030,14 +8715,6 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} - openapi-path-templating@2.2.1: - resolution: {integrity: sha512-eN14VrDvl/YyGxxrkGOHkVkWEoPyhyeydOUrbvjoz8K5eIGgELASwN1eqFOJ2CTQMGCy2EntOK1KdtJ8ZMekcg==} - engines: {node: '>=12.20.0'} - - openapi-server-url-templating@1.3.0: - resolution: {integrity: sha512-DPlCms3KKEbjVQb0spV6Awfn6UWNheuG/+folQPzh/wUaKwuqvj8zt5gagD7qoyxtE03cIiKPgLFS3Q8Bz00uQ==} - engines: {node: '>=12.20.0'} - openapi3-ts@4.4.0: resolution: {integrity: sha512-9asTNB9IkKEzWMcHmVZE7Ts3kC9G7AFHfs8i7caD8HbI76gEjdkId4z/AkP83xdZsH7PLAnnbl47qZkXuxpArw==} @@ -8149,9 +8826,16 @@ packages: parse5@6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + parse5@8.0.1: resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} @@ -8179,6 +8863,9 @@ packages: path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -8252,6 +8939,10 @@ packages: resolution: {integrity: sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==} hasBin: true + pkce-challenge@5.0.1: + resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} + engines: {node: '>=16.20.0'} + pkcs7@1.0.4: resolution: {integrity: sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==} hasBin: true @@ -8273,10 +8964,6 @@ packages: po-parser@2.1.1: resolution: {integrity: sha512-ECF4zHLbUItpUgE3OTtLKlPjeBN+fKEczj2zYjDfCGOzicNs0GK3Vg2IoAYwx7LH/XYw43fZQP6xnZ4TkNxSLQ==} - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - postcss-js@4.0.1: resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} @@ -8314,6 +9001,10 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} + engines: {node: ^10 || ^12 || >=14} + postcss@8.5.8: resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} engines: {node: ^10 || ^12 || >=14} @@ -8352,6 +9043,10 @@ packages: resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} engines: {node: '>=18'} + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + prismjs@1.30.0: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} @@ -8431,6 +9126,10 @@ packages: proxmox-api@1.1.1: resolution: {integrity: sha512-2qH7pxKBBHa7WtEBmxPaBY2FZEH2R04hqr9zD9PmErLzJ7RGGcfNcXoS/v5G4vBM2Igmnx0EAYBstPwwfDwHnA==} + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -8449,8 +9148,9 @@ packages: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + qs@6.15.2: + resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==} + engines: {node: '>=0.6'} quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} @@ -8463,24 +9163,17 @@ packages: resolution: {integrity: sha512-xEYQBqfYx/sfb33VJiKnSJp8ehloavImQ2A6564GAbqG55PGw1dAWUn1MUbQB62t0azawUS2CZZhWCjO8gRvTw==} engines: {npm: '>=8.2.3'} + radix-vue@1.9.17: + resolution: {integrity: sha512-mVCu7I2vXt1L2IUYHTt0sZMz7s1K2ZtqKeTIxG3yC5mMFfLBG4FtE1FDeRMpDd+Hhg/ybi9+iXmAP1ISREndoQ==} + peerDependencies: + vue: '>= 3.2.0' + radix3@1.1.2: resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} - ramda-adjunct@5.1.0: - resolution: {integrity: sha512-8qCpl2vZBXEJyNbi4zqcgdfHtcdsWjOGbiNSEnEBrM6Y0OKOT8UxJbIVGm1TIcjaSu2MxaWcgtsNlKlCk7o7qg==} - engines: {node: '>=0.10.3'} - peerDependencies: - ramda: '>= 0.30.0' - - ramda@0.30.1: - resolution: {integrity: sha512-tEF5I22zJnuclswcZMc8bDIrwRHRzf+NqVEmqg50ShAZMP7MWeR/RGDthfM/p+BlqvF2fXAzpn8i+SJcYD3alw==} - - randexp@0.5.3: - resolution: {integrity: sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==} - engines: {node: '>=4'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} rate-limiter-flexible@8.1.0: resolution: {integrity: sha512-J+4xBdVboibP1h0Imn4nFoCLT+UM9Os9vJaWaRWkLsQxS7jrhLJeLlmzP5hyCEsLwtgFIIY5KcWiJGyyVTMaKg==} @@ -8489,20 +9182,14 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-copy-to-clipboard@5.1.0: - resolution: {integrity: sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==} - peerDependencies: - react: ^15.3.0 || 16 || 17 || 18 - - react-debounce-input@3.3.0: - resolution: {integrity: sha512-VEqkvs8JvY/IIZvh71Z0TC+mdbxERvYF33RcebnodlsUZ8RSgyKe2VWaHXv4+/8aoOgXLxWrdsYs2hDhcwbUgA==} - peerDependencies: - react: ^15.3.0 || 16 || 17 || 18 - react-dom@19.2.7: resolution: {integrity: sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==} peerDependencies: @@ -8519,23 +9206,6 @@ packages: peerDependencies: react: ^18.0.0 || ^19.0.0 - react-immutable-proptypes@2.2.0: - resolution: {integrity: sha512-Vf4gBsePlwdGvSZoLSBfd4HAP93HDauMY4fDjXhreg/vg6F3Fj/MXDNyTbltPC/xZKmZc+cjLu3598DdYK6sgQ==} - peerDependencies: - immutable: '>=3.6.2' - - react-immutable-pure-component@2.2.2: - resolution: {integrity: sha512-vkgoMJUDqHZfXXnjVlG3keCxSO/U6WeDQ5/Sl0GK2cH8TOxEzQ5jXqDXHEL/jqk6fsNxV05oH5kD7VNMUE2k+A==} - peerDependencies: - immutable: '>= 2 || >= 4.0.0-rc' - react: '>= 16.6' - react-dom: '>= 16.6' - - react-inspector@6.0.2: - resolution: {integrity: sha512-x+b7LxhmHXjHoU/VrFAzw5iutsILRoYyDq97EDYdFpPLcvqtEzk4ZSZSQjnFPbr5T57tLXnHcqFYoN1pI6u8uQ==} - peerDependencies: - react: ^16.8.4 || ^17.0.0 || ^18.0.0 - react-is@19.2.7: resolution: {integrity: sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==} @@ -8610,12 +9280,6 @@ packages: '@types/react': optional: true - react-syntax-highlighter@16.1.0: - resolution: {integrity: sha512-E40/hBiP5rCNwkeBN1vRP+xow1X0pndinO+z3h7HLsHyjztbyjfzNWNKuAsJj+7DLam9iT4AaaOZnueCU+Nplg==} - engines: {node: '>= 16.20.2'} - peerDependencies: - react: '>= 0.14.0' - react-transition-group@4.4.5: resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} peerDependencies: @@ -8680,10 +9344,8 @@ packages: resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} engines: {node: '>=4'} - redux-immutable@4.0.0: - resolution: {integrity: sha512-SchSn/DWfGb3oAejd+1hhHx01xUoxY+V7TeK0BKqpkLKiQPVFf7DYzEaKmrEVxsWxielKfSK9/Xq66YyxgR1cg==} - peerDependencies: - immutable: ^3.8.1 || ^4.0.0-rc.1 + redis@4.7.1: + resolution: {integrity: sha512-S1bJDnqLftzHXHP8JsT5II/CtHWQrASX5K96REjWjlmWKrviSOLWmM7QnRLstAWsu1VBBV1ffV6DzCvxNP0UJQ==} redux-thunk@3.1.0: resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==} @@ -8693,23 +9355,42 @@ packages: redux@5.0.1: resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} - refractor@5.0.0: - resolution: {integrity: sha512-QXOrHQF5jOpjjLfiNk5GFnWhRXvxjUVnlFxkeDmewR5sXkr3iM46Zo+CnRR8B+MDVqkULW4EcLVcRBNOPXHosw==} - registry-auth-token@5.0.2: resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} engines: {node: '>=14'} + rehype-external-links@3.0.0: + resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==} + + rehype-format@5.0.1: + resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==} + + rehype-parse@9.0.1: + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-sanitize@6.0.0: + resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} + + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + remark-parse@11.0.0: resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} remark-rehype@11.1.1: resolution: {integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==} - remarkable@2.0.1: - resolution: {integrity: sha512-YJyMcOH5lrR+kZdmB0aJJ4+93bEojRZ1HGDn9Eagu6ibg7aVZhc3OWbbShRid+Q5eAfsEqWxpe+g5W5nYNfNiA==} - engines: {node: '>= 6.0.0'} - hasBin: true + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} remove-accents@0.5.0: resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} @@ -8718,10 +9399,6 @@ packages: resolution: {integrity: sha512-U7XpAktpbSgHTRSNRrjKSrjYkZKuhUukfoBlXWXUExCAqhzh1TU3BDRAfJmarcl5voKS+pbKU9MvyLWKZ4UEEg==} engines: {node: '>= 0.8.0'} - repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -8730,12 +9407,13 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - reselect@5.1.1: resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} + reserved-identifiers@1.2.0: + resolution: {integrity: sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==} + engines: {node: '>=18'} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -8747,10 +9425,6 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - ret@0.2.2: - resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==} - engines: {node: '>=4'} - ret@0.5.0: resolution: {integrity: sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==} engines: {node: '>=10'} @@ -8780,6 +9454,13 @@ packages: rope-sequence@1.3.4: resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} + rou3@0.7.12: + resolution: {integrity: sha512-iFE4hLDuloSWcD7mjdCDhx2bKcIsYbtOTpfH5MHHLSKMOUyjqQXTeZVa289uuwEGEKFoE/BAPbhaU4B774nceg==} + + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} @@ -8842,9 +9523,13 @@ packages: engines: {node: '>=10'} hasBin: true - serialize-error@8.1.0: - resolution: {integrity: sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==} - engines: {node: '>=10'} + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} + + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} set-cookie-parser@2.7.2: resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} @@ -8852,21 +9537,9 @@ packages: set-cookie-parser@3.1.0: resolution: {integrity: sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw==} - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - sha.js@2.4.12: - resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} - engines: {node: '>= 0.10'} - hasBin: true - sharp@0.34.5: resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -8883,10 +9556,6 @@ packages: resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} engines: {node: '>= 0.4'} - short-unique-id@5.3.2: - resolution: {integrity: sha512-KRT/hufMSxXKEDSQujfVE0Faa/kZ51ihUcZQAcmP04t00DvPj7Ox5anHke1sJYUtzSuiT/Y5uyzg/W7bBEGhCg==} - hasBin: true - side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} @@ -8985,9 +9654,6 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} @@ -9041,6 +9707,14 @@ packages: strict-event-emitter@0.5.1: resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} + string-byte-length@3.0.1: + resolution: {integrity: sha512-yJ8vP0HMwZ54CcA8S8mKoXbkezpZHANFtmafFo8lGxZThCQcAwRHjdFabuSLgOzxj9OFJcmssmiAvmcOK4O2Hw==} + engines: {node: '>=18.18.0'} + + string-byte-slice@3.0.1: + resolution: {integrity: sha512-GWv2K4lYyd2+AhmKH3BV+OVx62xDX+99rSLfKpaqFiQU7uOMaUY1tDjdrRD4gsrCr9lTyjMgjna7tZcCOw+Smg==} + engines: {node: '>=18.18.0'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -9062,6 +9736,10 @@ packages: stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + stringify-object@6.0.0: + resolution: {integrity: sha512-6f94vIED6vmJJfh3lyVsVWxCYSfI5uM+16ntED/Ql37XIyV6kj0mRAAiTeMMc/QLYIaizC3bUprQ8pQnDDrKfA==} + engines: {node: '>=20'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -9093,6 +9771,9 @@ packages: strnum@2.3.0: resolution: {integrity: sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q==} + style-mod@4.1.3: + resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==} + style-to-js@1.1.16: resolution: {integrity: sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==} @@ -9145,15 +9826,10 @@ packages: svgson@5.3.1: resolution: {integrity: sha512-qdPgvUNWb40gWktBJnbJRelWcPzkLed/ShhnRsjbayXz8OtdPOzbil9jtiZdrYvSDumAz/VNQr6JaNfPx/gvPA==} - swagger-client@3.37.4: - resolution: {integrity: sha512-3xxqc9s99Vsf47ket2j7D4Tw6b6T7ObNvTqSP009yBeoAo0fy0yprqOVxFISTrvRxN7jgfrEi8GXMhsjzb1M0g==} - engines: {node: '>=22'} - - swagger-ui-react@5.32.6: - resolution: {integrity: sha512-2q2kXd6eDR+syyWV5HE2CkWANyr2MHPkNezG4M7fC0FPlBUZEsNgyA/2dcb9dIwgE5xd995dO42h89fNMF5/ng==} + swrv@1.2.0: + resolution: {integrity: sha512-lH/g4UcNyj+7lzK4eRGT4C68Q4EhQ6JtM9otPRIASfhhzfLWtbZPHcMuhuba7S9YVYuxkMUGImwMyGpfbkH07A==} peerDependencies: - react: '>=16.8.0 <20' - react-dom: '>=16.8.0 <20' + vue: '>=3.2.26 < 4' symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -9161,10 +9837,19 @@ packages: tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + tabbable@6.4.0: + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} + tagged-tag@1.0.0: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} + tailwind-merge@3.5.0: + resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} + + tailwindcss@4.3.0: + resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} + tapable@2.3.3: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} @@ -9309,10 +9994,6 @@ packages: resolution: {integrity: sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==} engines: {node: '>=14.14'} - to-buffer@1.2.1: - resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==} - engines: {node: '>= 0.4'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -9321,9 +10002,6 @@ packages: resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} engines: {node: '>=12'} - toggle-selection@1.0.6: - resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} - toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} @@ -9355,20 +10033,6 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true - tree-sitter-json@0.24.8: - resolution: {integrity: sha512-Tc9ZZYwHyWZ3Tt1VEw7Pa2scu1YO7/d2BCBbKTx5hXwig3UfdQjsOPkPyLpDJOn/m1UBEWYAtSdGAwCSyagBqQ==} - peerDependencies: - tree-sitter: ^0.21.1 - peerDependenciesMeta: - tree-sitter: - optional: true - - tree-sitter@0.21.1: - resolution: {integrity: sha512-7dxoA6kYvtgWw80265MyqJlkRl4yawIjO7S5MigytjELkX43fV2WsAXzsNfO7sBpPPCF5Gp0+XzHk0DwLCq3xQ==} - - tree-sitter@0.22.4: - resolution: {integrity: sha512-usbHZP9/oxNsUY65MQUsduGRqDHQOou1cagUSwjhoSYAmSahjQDAVsh9s+SlZkn8X8+O1FULRGwHu7AFP3kjzg==} - trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -9379,6 +10043,14 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + trpc-to-mcp@1.3.2: + resolution: {integrity: sha512-e2pF9ABqIWnJXa8lNlJeC8anfzubH5WbQ1gVcUgjBrEDjeKH2FNo7xhqil0j4GZp+zB2S1VBQgsowGlp4E3qfw==} + peerDependencies: + '@trpc/server': ^11.4.4 + better-auth: ^1.3.4 + mcp-handler: ^1.0.1 + zod: ^4.0.15 + trpc-to-openapi@3.3.0: resolution: {integrity: sha512-PNMXq0K37Ott5ysNACYN1XLaM5xZGNJrx1QiQVTlk4hmgJomoyiAKhVrpwrK02JW3joSQmHYBOZ7pK6Hdioekw==} peerDependencies: @@ -9386,11 +10058,9 @@ packages: zod: ^3.25.0 || ^4.0.0 zod-openapi: ^5.4.4 - ts-mixer@6.0.4: - resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==} - - ts-toolbelt@9.6.0: - resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} + truncate-json@3.0.1: + resolution: {integrity: sha512-QVsbr1WhGLq2F0oDyYbqtOXcf3gcnL8C9H5EX8bBwAr8ZWvWGJzukpPrDrWgJMrNtgDbo74BIjI4kJu3q2xQWw==} + engines: {node: '>=18.18.0'} tsconfck@3.1.3: resolution: {integrity: sha512-ulNZP1SVpRDesxeMLON/LtWM8HIgAJEIVpVVhBM6gsmvQ8+Rh+ZG7FWGvHh7Ah3pRABwVJWklWCr/BTZSv0xnQ==} @@ -9437,10 +10107,6 @@ packages: tweetnacl@0.14.5: resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - type-fest@1.4.0: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} @@ -9461,12 +10127,9 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} - - types-ramda@0.30.1: - resolution: {integrity: sha512-1HTsf5/QVRmLzcGfldPFvkVsAdi1db1BBKzi7iW3KBUlOICg/nKnFS+jGqDJS3YD8VsWbAh7JiHeBvbsw8RPxA==} + type-is@2.1.0: + resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} + engines: {node: '>= 18'} typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} @@ -9506,6 +10169,9 @@ packages: resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} engines: {node: '>=20.18.1'} + unhead@2.1.15: + resolution: {integrity: sha512-MCt5T90mCWyr3Z6pUCdM9lVRXoMoVBlL7z7U4CYVIiaDiuzad/UCfLuMqz5MeNmpZUgoBCQnrucJimU7EZR+XA==} + unicode-emoji-modifier-base@1.0.0: resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} engines: {node: '>=4'} @@ -9525,6 +10191,9 @@ packages: resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} engines: {node: '>=12'} + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} @@ -9540,6 +10209,9 @@ packages: unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + universal-github-app-jwt@2.2.0: resolution: {integrity: sha512-G5o6f95b5BggDGuUfKDApKaCgNYy2x7OdHY0zSMF081O0EJobw+1130VONhrA7ezGSV2FNOGyM+KQpQZAr9bIQ==} @@ -9554,9 +10226,6 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - unraw@3.0.0: - resolution: {integrity: sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg==} - until-async@3.0.2: resolution: {integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==} @@ -9570,9 +10239,6 @@ packages: resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - url-toolkit@2.2.5: resolution: {integrity: sha512-mtN6xk+Nac+oyJ/PrI7tzfmomRVNFIWKUbG8jdYFt52hxbiReFAXIjYskvu64/dvuW71IcB7lV8l0HvZMac6Jg==} @@ -9623,6 +10289,13 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} @@ -9733,6 +10406,31 @@ packages: jsdom: optional: true + vue-component-type-helpers@3.3.3: + resolution: {integrity: sha512-x4nsFpy5Pe8fqPzp/5vkTPeTTDBpAx4WVtV47Ejt0+2FQrq4pRRsJs7JmYRqMFzTu/LW+pCWEjQ3YVCkPV7f9g==} + + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-sonner@1.3.2: + resolution: {integrity: sha512-UbZ48E9VIya3ToiRHAZUbodKute/z/M1iT8/3fU8zEbwBRE11AKuHikssv18LMk2gTTr6eMQT4qf6JoLHWuj/A==} + + vue@3.5.35: + resolution: {integrity: sha512-cx89fnr+0kVGHiNFG6y6s0bdjypJRFNZn6x3WPstNdQR1bi1mbB7h4v5IBGTsPJU3nK1+0Iqj3Zf+hZWMieR4Q==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + w3c-keyname@2.2.8: resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} @@ -9744,8 +10442,8 @@ packages: resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} engines: {node: '>=10.13.0'} - web-tree-sitter@0.24.5: - resolution: {integrity: sha512-+J/2VSHN8J47gQUAvF8KDadrfz6uFYVjxoxbKWDoXVsH2u7yLdarCnIURnrMA6uSRkgX3SdmqM5BOoQjPdSh5w==} + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -9779,10 +10477,6 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} - engines: {node: '>= 0.4'} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -9855,9 +10549,6 @@ packages: xcase@2.0.1: resolution: {integrity: sha512-UmFXIPU+9Eg3E9m/728Bii0lAIuoc+6nbrNUKaRPJOFp91ih44qqGlWtxMB6kXFrRD6po+86ksHM5XHCfk6iPw==} - xml-but-prettier@1.0.1: - resolution: {integrity: sha512-C2CJaadHrZTqESlH03WOyw0oZTtoy2uEg6dSDF6YRg+9GnYNub53RRemLpnvtbHDFelxMx4LajiFsYeR6XJHgQ==} - xml-js@1.6.11: resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} hasBin: true @@ -9880,9 +10571,6 @@ packages: resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} engines: {node: '>=4.0.0'} - xml@1.0.1: - resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} - xmlbuilder@11.0.1: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} @@ -9901,6 +10589,9 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yaml@2.9.0: resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} engines: {node: '>= 14.6'} @@ -9938,9 +10629,6 @@ packages: resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} engines: {node: '>=18'} - zenscroll@4.0.2: - resolution: {integrity: sha512-jEA1znR7b4C/NnaycInCU6h/d15ZzCd1jmsruqOKnZP6WXQSMH3W2GL+OXbkruslU4h+Tzuos0HdswzRUk/Vgg==} - zip-stream@6.0.1: resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} engines: {node: '>= 14'} @@ -9956,6 +10644,11 @@ packages: peerDependencies: zod: ^3.25.74 || ^4.0.0 + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} + peerDependencies: + zod: ^3.25.28 || ^4 + zod-validation-error@5.0.0: resolution: {integrity: sha512-hmk+pkyKq7Q71PiWVSDUc3VfpzpvcRHZ3QPw9yEMVvmtCekaMeOHnbr3WbxfrgEnQTv6haGP4cmv0Ojmihzsxw==} engines: {node: '>=18.0.0'} @@ -9986,6 +10679,33 @@ snapshots: '@actions/io@3.0.2': {} + '@ai-sdk/gateway@3.0.13(zod@4.4.3)': + dependencies: + '@ai-sdk/provider': 3.0.2 + '@ai-sdk/provider-utils': 4.0.5(zod@4.4.3) + '@vercel/oidc': 3.1.0 + zod: 4.4.3 + + '@ai-sdk/provider-utils@4.0.5(zod@4.4.3)': + dependencies: + '@ai-sdk/provider': 3.0.2 + '@standard-schema/spec': 1.1.0 + eventsource-parser: 3.1.0 + zod: 4.4.3 + + '@ai-sdk/provider@3.0.2': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/vue@3.0.33(vue@3.5.35(typescript@5.9.3))(zod@4.4.3)': + dependencies: + '@ai-sdk/provider-utils': 4.0.5(zod@4.4.3) + ai: 6.0.33(zod@4.4.3) + swrv: 1.2.0(vue@3.5.35(typescript@5.9.3)) + vue: 3.5.35(typescript@5.9.3) + transitivePeerDependencies: + - zod + '@ark/schema@0.46.0': dependencies: '@ark/util': 0.46.0 @@ -10096,8 +10816,12 @@ snapshots: '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.7': {} + '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@7.29.7': {} + '@babel/helper-validator-option@7.27.1': {} '@babel/helpers@7.29.2': @@ -10109,6 +10833,10 @@ snapshots: dependencies: '@babel/types': 7.29.0 + '@babel/parser@7.29.7': + dependencies: + '@babel/types': 7.29.7 + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -10119,10 +10847,6 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/runtime-corejs3@7.27.1': - dependencies: - core-js-pure: 3.38.1 - '@babel/runtime@7.29.2': {} '@babel/runtime@7.29.7': {} @@ -10150,14 +10874,168 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@balena/dockerignore@1.0.2': {} '@bcoe/v8-coverage@1.0.2': {} + '@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0)': + dependencies: + '@better-auth/utils': 0.4.1 + '@better-fetch/fetch': 1.1.21 + '@opentelemetry/semantic-conventions': 1.41.1 + '@standard-schema/spec': 1.1.0 + better-call: 1.3.5(zod@4.4.3) + jose: 6.2.3 + kysely: 0.29.2 + nanostores: 1.3.0 + zod: 4.4.3 + optionalDependencies: + '@opentelemetry/api': 1.9.0 + + '@better-auth/drizzle-adapter@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0))': + dependencies: + '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0) + '@better-auth/utils': 0.4.1 + optionalDependencies: + drizzle-orm: 0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0) + + '@better-auth/kysely-adapter@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(kysely@0.29.2)': + dependencies: + '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0) + '@better-auth/utils': 0.4.1 + optionalDependencies: + kysely: 0.29.2 + + '@better-auth/memory-adapter@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)': + dependencies: + '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0) + '@better-auth/utils': 0.4.1 + + '@better-auth/mongo-adapter@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)': + dependencies: + '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0) + '@better-auth/utils': 0.4.1 + + '@better-auth/prisma-adapter@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)': + dependencies: + '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0) + '@better-auth/utils': 0.4.1 + + '@better-auth/telemetry@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)': + dependencies: + '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0) + '@better-auth/utils': 0.4.1 + '@better-fetch/fetch': 1.1.21 + + '@better-auth/utils@0.4.1': + dependencies: + '@noble/hashes': 2.0.1 + + '@better-fetch/fetch@1.1.21': {} + '@bramus/specificity@2.4.2': dependencies: css-tree: 3.2.1 + '@codemirror/autocomplete@6.20.3': + dependencies: + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.43.0 + '@lezer/common': 1.5.2 + + '@codemirror/commands@6.10.3': + dependencies: + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.43.0 + '@lezer/common': 1.5.2 + + '@codemirror/lang-css@6.3.1': + dependencies: + '@codemirror/autocomplete': 6.20.3 + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@lezer/common': 1.5.2 + '@lezer/css': 1.3.3 + + '@codemirror/lang-html@6.4.11': + dependencies: + '@codemirror/autocomplete': 6.20.3 + '@codemirror/lang-css': 6.3.1 + '@codemirror/lang-javascript': 6.2.5 + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.43.0 + '@lezer/common': 1.5.2 + '@lezer/css': 1.3.3 + '@lezer/html': 1.3.13 + + '@codemirror/lang-javascript@6.2.5': + dependencies: + '@codemirror/autocomplete': 6.20.3 + '@codemirror/language': 6.12.3 + '@codemirror/lint': 6.9.6 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.43.0 + '@lezer/common': 1.5.2 + '@lezer/javascript': 1.5.4 + + '@codemirror/lang-json@6.0.2': + dependencies: + '@codemirror/language': 6.12.3 + '@lezer/json': 1.0.3 + + '@codemirror/lang-xml@6.1.0': + dependencies: + '@codemirror/autocomplete': 6.20.3 + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.43.0 + '@lezer/common': 1.5.2 + '@lezer/xml': 1.0.6 + + '@codemirror/lang-yaml@6.1.3': + dependencies: + '@codemirror/autocomplete': 6.20.3 + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + '@lezer/yaml': 1.0.4 + + '@codemirror/language@6.12.3': + dependencies: + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.43.0 + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + style-mod: 4.1.3 + + '@codemirror/lint@6.9.6': + dependencies: + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.43.0 + crelt: 1.0.6 + + '@codemirror/state@6.6.0': + dependencies: + '@marijn/find-cluster-break': 1.0.2 + + '@codemirror/view@6.43.0': + dependencies: + '@codemirror/state': 6.6.0 + crelt: 1.0.6 + style-mod: 4.1.3 + w3c-keyname: 2.2.8 + '@colors/colors@1.5.0': optional: true @@ -10579,8 +11457,28 @@ snapshots: react-dom: 19.2.7(react@19.2.7) tabbable: 6.2.0 + '@floating-ui/utils@0.2.10': {} + '@floating-ui/utils@0.2.11': {} + '@floating-ui/vue@1.1.11(vue@3.5.35(typescript@5.9.3))': + dependencies: + '@floating-ui/dom': 1.7.6 + '@floating-ui/utils': 0.2.11 + vue-demi: 0.14.10(vue@3.5.35(typescript@5.9.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@floating-ui/vue@1.1.9(vue@3.5.35(typescript@5.9.3))': + dependencies: + '@floating-ui/dom': 1.7.6 + '@floating-ui/utils': 0.2.11 + vue-demi: 0.14.10(vue@3.5.35(typescript@5.9.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + '@formatjs/ecma402-abstract@3.1.0': dependencies: '@formatjs/fast-memoize': 3.1.0 @@ -10653,6 +11551,15 @@ snapshots: '@hapi/bourne@3.0.0': {} + '@headlessui/tailwindcss@0.2.2(tailwindcss@4.3.0)': + dependencies: + tailwindcss: 4.3.0 + + '@headlessui/vue@1.7.23(vue@3.5.35(typescript@5.9.3))': + dependencies: + '@tanstack/vue-virtual': 3.13.28(vue@3.5.35(typescript@5.9.3)) + vue: 3.5.35(typescript@5.9.3) + '@homarr/gridstack@1.12.0': {} '@homarr/node-unifi@2.6.0(undici@7.24.6)': @@ -10668,6 +11575,10 @@ snapshots: - undici - utf-8-validate + '@hono/node-server@1.19.14(hono@4.12.23)': + dependencies: + hono: 4.12.23 + '@img/colour@1.0.0': optional: true @@ -10926,6 +11837,14 @@ snapshots: '@types/node': 24.12.4 optional: true + '@internationalized/date@3.12.2': + dependencies: + '@swc/helpers': 0.5.15 + + '@internationalized/number@3.6.7': + dependencies: + '@swc/helpers': 0.5.15 + '@ioredis/commands@1.10.0': {} '@isaacs/cliui@8.0.2': @@ -11008,6 +11927,52 @@ snapshots: transitivePeerDependencies: - supports-color + '@lezer/common@1.5.2': {} + + '@lezer/css@1.3.3': + dependencies: + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + + '@lezer/highlight@1.2.3': + dependencies: + '@lezer/common': 1.5.2 + + '@lezer/html@1.3.13': + dependencies: + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + + '@lezer/javascript@1.5.4': + dependencies: + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + + '@lezer/json@1.0.3': + dependencies: + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + + '@lezer/lr@1.4.10': + dependencies: + '@lezer/common': 1.5.2 + + '@lezer/xml@1.0.6': + dependencies: + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + + '@lezer/yaml@1.0.4': + dependencies: + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.10 + '@libsql/client-wasm@0.14.0': dependencies: '@libsql/core': 0.14.0 @@ -11109,6 +12074,30 @@ snapshots: react: 19.2.7 react-dom: 19.2.7(react@19.2.7) + '@marijn/find-cluster-break@1.0.2': {} + + '@modelcontextprotocol/sdk@1.26.0(zod@4.4.3)': + dependencies: + '@hono/node-server': 1.19.14(hono@4.12.23) + ajv: 8.18.0 + ajv-formats: 3.0.1(ajv@8.18.0) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.1.0 + express: 5.2.1 + express-rate-limit: 8.5.2(express@5.2.1) + hono: 4.12.23 + jose: 6.2.3 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 4.4.3 + zod-to-json-schema: 3.25.2(zod@4.4.3) + transitivePeerDependencies: + - supports-color + '@mswjs/interceptors@0.41.9': dependencies: '@open-draft/deferred-promise': 2.2.0 @@ -11145,6 +12134,8 @@ snapshots: '@next/swc-win32-x64-msvc@16.2.7': optional: true + '@noble/ciphers@2.2.0': {} + '@noble/hashes@2.0.1': {} '@nodable/entities@2.1.0': {} @@ -11313,6 +12304,10 @@ snapshots: '@open-draft/until@2.1.0': optional: true + '@opentelemetry/api@1.9.0': {} + + '@opentelemetry/semantic-conventions@1.41.1': {} + '@oxfmt/binding-android-arm-eabi@0.53.0': optional: true @@ -11494,6 +12489,8 @@ snapshots: '@petamoriken/float16@3.9.3': optional: true + '@phosphor-icons/core@2.1.1': {} + '@pinojs/redact@0.4.0': {} '@pkgjs/parseargs@0.11.0': @@ -11542,6 +12539,32 @@ snapshots: '@pwshub/bellajs@13.0.2': {} + '@redis/bloom@1.2.0(@redis/client@1.6.1)': + dependencies: + '@redis/client': 1.6.1 + + '@redis/client@1.6.1': + dependencies: + cluster-key-slot: 1.1.2 + generic-pool: 3.9.0 + yallist: 4.0.0 + + '@redis/graph@1.1.1(@redis/client@1.6.1)': + dependencies: + '@redis/client': 1.6.1 + + '@redis/json@1.0.7(@redis/client@1.6.1)': + dependencies: + '@redis/client': 1.6.1 + + '@redis/search@1.2.0(@redis/client@1.6.1)': + dependencies: + '@redis/client': 1.6.1 + + '@redis/time-series@1.1.0(@redis/client@1.6.1)': + dependencies: + '@redis/client': 1.6.1 + '@reduxjs/toolkit@2.11.2(react-redux@9.2.0(@types/react@19.2.16)(react@19.2.7)(redux@5.0.1))(react@19.2.7)': dependencies: '@standard-schema/spec': 1.1.0 @@ -11554,6 +12577,12 @@ snapshots: react: 19.2.7 react-redux: 9.2.0(@types/react@19.2.16)(react@19.2.7)(redux@5.0.1) + '@replit/codemirror-css-color-picker@6.3.0(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.43.0)': + dependencies: + '@codemirror/language': 6.12.3 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.43.0 + '@rolldown/pluginutils@1.0.0-rc.3': {} '@rollup/rollup-android-arm-eabi@4.60.0': @@ -11636,7 +12665,333 @@ snapshots: '@rvf/set-get@7.0.1': {} - '@scarf/scarf@1.4.0': {} + '@scalar/agent-chat@0.12.6(tailwindcss@4.3.0)(typescript@5.9.3)(zod@4.4.3)': + dependencies: + '@ai-sdk/vue': 3.0.33(vue@3.5.35(typescript@5.9.3))(zod@4.4.3) + '@scalar/api-client': 3.9.0(tailwindcss@4.3.0)(typescript@5.9.3) + '@scalar/components': 0.26.1(tailwindcss@4.3.0)(typescript@5.9.3) + '@scalar/helpers': 0.8.1 + '@scalar/icons': 0.7.3(typescript@5.9.3) + '@scalar/json-magic': 0.12.15 + '@scalar/openapi-types': 0.9.1 + '@scalar/schemas': 0.3.3 + '@scalar/themes': 0.15.6 + '@scalar/types': 0.12.3 + '@scalar/use-toasts': 0.10.2(typescript@5.9.3) + '@scalar/validation': 0.6.0 + '@scalar/workspace-store': 0.53.0(typescript@5.9.3) + '@vueuse/core': 13.9.0(vue@3.5.35(typescript@5.9.3)) + ai: 6.0.33(zod@4.4.3) + js-base64: 3.7.8 + neverpanic: 0.0.7(typescript@5.9.3) + truncate-json: 3.0.1 + vue: 3.5.35(typescript@5.9.3) + transitivePeerDependencies: + - '@vue/composition-api' + - async-validator + - axios + - change-case + - drauu + - idb-keyval + - jwt-decode + - nprogress + - qrcode + - sortablejs + - supports-color + - tailwindcss + - typescript + - universal-cookie + - zod + + '@scalar/api-client@3.9.0(tailwindcss@4.3.0)(typescript@5.9.3)': + dependencies: + '@headlessui/tailwindcss': 0.2.2(tailwindcss@4.3.0) + '@headlessui/vue': 1.7.23(vue@3.5.35(typescript@5.9.3)) + '@scalar/components': 0.26.1(tailwindcss@4.3.0)(typescript@5.9.3) + '@scalar/helpers': 0.8.1 + '@scalar/icons': 0.7.3(typescript@5.9.3) + '@scalar/json-magic': 0.12.15 + '@scalar/oas-utils': 0.18.0(typescript@5.9.3) + '@scalar/openapi-types': 0.9.1 + '@scalar/sidebar': 0.9.18(tailwindcss@4.3.0)(typescript@5.9.3) + '@scalar/snippetz': 0.9.12 + '@scalar/themes': 0.15.6 + '@scalar/typebox': 0.1.3 + '@scalar/types': 0.12.3 + '@scalar/use-codemirror': 0.14.11(typescript@5.9.3) + '@scalar/use-hooks': 0.4.6(typescript@5.9.3) + '@scalar/use-toasts': 0.10.2(typescript@5.9.3) + '@scalar/workspace-store': 0.53.0(typescript@5.9.3) + '@types/har-format': 1.2.16 + '@vueuse/core': 13.9.0(vue@3.5.35(typescript@5.9.3)) + '@vueuse/integrations': 13.9.0(focus-trap@7.8.0)(fuse.js@7.4.2)(vue@3.5.35(typescript@5.9.3)) + cookie: 1.1.1 + focus-trap: 7.8.0 + fuse.js: 7.4.2 + js-base64: 3.7.8 + jsonc-parser: 3.3.1 + nanoid: 5.1.11 + pretty-ms: 9.3.0 + radix-vue: 1.9.17(vue@3.5.35(typescript@5.9.3)) + set-cookie-parser: 3.1.0 + vue: 3.5.35(typescript@5.9.3) + yaml: 2.9.0 + zod: 4.4.3 + transitivePeerDependencies: + - '@vue/composition-api' + - async-validator + - axios + - change-case + - drauu + - idb-keyval + - jwt-decode + - nprogress + - qrcode + - sortablejs + - supports-color + - tailwindcss + - typescript + - universal-cookie + + '@scalar/api-reference-react@0.9.42(react@19.2.7)(tailwindcss@4.3.0)(typescript@5.9.3)(zod@4.4.3)': + dependencies: + '@scalar/api-reference': 1.58.0(tailwindcss@4.3.0)(typescript@5.9.3)(zod@4.4.3) + '@scalar/types': 0.12.3 + react: 19.2.7 + transitivePeerDependencies: + - '@vue/composition-api' + - async-validator + - axios + - change-case + - drauu + - idb-keyval + - jwt-decode + - nprogress + - qrcode + - sortablejs + - supports-color + - tailwindcss + - typescript + - universal-cookie + - zod + + '@scalar/api-reference@1.58.0(tailwindcss@4.3.0)(typescript@5.9.3)(zod@4.4.3)': + dependencies: + '@headlessui/vue': 1.7.23(vue@3.5.35(typescript@5.9.3)) + '@scalar/agent-chat': 0.12.6(tailwindcss@4.3.0)(typescript@5.9.3)(zod@4.4.3) + '@scalar/api-client': 3.9.0(tailwindcss@4.3.0)(typescript@5.9.3) + '@scalar/code-highlight': 0.3.4 + '@scalar/components': 0.26.1(tailwindcss@4.3.0)(typescript@5.9.3) + '@scalar/helpers': 0.8.1 + '@scalar/icons': 0.7.3(typescript@5.9.3) + '@scalar/oas-utils': 0.18.0(typescript@5.9.3) + '@scalar/schemas': 0.3.3 + '@scalar/sidebar': 0.9.18(tailwindcss@4.3.0)(typescript@5.9.3) + '@scalar/snippetz': 0.9.12 + '@scalar/themes': 0.15.6 + '@scalar/types': 0.12.3 + '@scalar/use-hooks': 0.4.6(typescript@5.9.3) + '@scalar/use-toasts': 0.10.2(typescript@5.9.3) + '@scalar/validation': 0.6.0 + '@scalar/workspace-store': 0.53.0(typescript@5.9.3) + '@unhead/vue': 2.1.15(vue@3.5.35(typescript@5.9.3)) + '@vueuse/core': 13.9.0(vue@3.5.35(typescript@5.9.3)) + fuse.js: 7.4.2 + microdiff: 1.5.0 + nanoid: 5.1.11 + vue: 3.5.35(typescript@5.9.3) + yaml: 2.9.0 + transitivePeerDependencies: + - '@vue/composition-api' + - async-validator + - axios + - change-case + - drauu + - idb-keyval + - jwt-decode + - nprogress + - qrcode + - sortablejs + - supports-color + - tailwindcss + - typescript + - universal-cookie + - zod + + '@scalar/code-highlight@0.3.4': + dependencies: + hast-util-to-text: 4.0.2 + highlight.js: 11.11.1 + lowlight: 3.3.0 + rehype-external-links: 3.0.0 + rehype-format: 5.0.1 + rehype-parse: 9.0.1 + rehype-raw: 7.0.0 + rehype-sanitize: 6.0.0 + rehype-stringify: 10.0.1 + remark-gfm: 4.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + remark-stringify: 11.0.0 + unified: 11.0.5 + unist-util-visit: 5.1.0 + transitivePeerDependencies: + - supports-color + + '@scalar/components@0.26.1(tailwindcss@4.3.0)(typescript@5.9.3)': + dependencies: + '@floating-ui/utils': 0.2.10 + '@floating-ui/vue': 1.1.9(vue@3.5.35(typescript@5.9.3)) + '@headlessui/tailwindcss': 0.2.2(tailwindcss@4.3.0) + '@headlessui/vue': 1.7.23(vue@3.5.35(typescript@5.9.3)) + '@scalar/code-highlight': 0.3.4 + '@scalar/helpers': 0.8.1 + '@scalar/icons': 0.7.3(typescript@5.9.3) + '@scalar/themes': 0.15.6 + '@scalar/use-hooks': 0.4.6(typescript@5.9.3) + '@vueuse/core': 13.9.0(vue@3.5.35(typescript@5.9.3)) + cva: 1.0.0-beta.4(typescript@5.9.3) + nanoid: 5.1.11 + radix-vue: 1.9.17(vue@3.5.35(typescript@5.9.3)) + vue: 3.5.35(typescript@5.9.3) + vue-component-type-helpers: 3.3.3 + transitivePeerDependencies: + - '@vue/composition-api' + - supports-color + - tailwindcss + - typescript + + '@scalar/helpers@0.8.1': {} + + '@scalar/icons@0.7.3(typescript@5.9.3)': + dependencies: + '@phosphor-icons/core': 2.1.1 + '@types/node': 24.12.4 + chalk: 5.6.2 + vue: 3.5.35(typescript@5.9.3) + transitivePeerDependencies: + - typescript + + '@scalar/json-magic@0.12.15': + dependencies: + '@scalar/helpers': 0.8.1 + pathe: 2.0.3 + yaml: 2.9.0 + + '@scalar/oas-utils@0.18.0(typescript@5.9.3)': + dependencies: + '@scalar/helpers': 0.8.1 + '@scalar/themes': 0.15.6 + '@scalar/types': 0.12.3 + '@scalar/workspace-store': 0.53.0(typescript@5.9.3) + flatted: 3.4.2 + vue: 3.5.35(typescript@5.9.3) + yaml: 2.9.0 + transitivePeerDependencies: + - typescript + + '@scalar/openapi-types@0.9.1': {} + + '@scalar/openapi-upgrader@0.2.9': + dependencies: + '@scalar/openapi-types': 0.9.1 + + '@scalar/schemas@0.3.3': + dependencies: + '@scalar/helpers': 0.8.1 + '@scalar/validation': 0.6.0 + + '@scalar/sidebar@0.9.18(tailwindcss@4.3.0)(typescript@5.9.3)': + dependencies: + '@scalar/components': 0.26.1(tailwindcss@4.3.0)(typescript@5.9.3) + '@scalar/helpers': 0.8.1 + '@scalar/icons': 0.7.3(typescript@5.9.3) + '@scalar/themes': 0.15.6 + '@scalar/use-hooks': 0.4.6(typescript@5.9.3) + '@scalar/workspace-store': 0.53.0(typescript@5.9.3) + vue: 3.5.35(typescript@5.9.3) + transitivePeerDependencies: + - '@vue/composition-api' + - supports-color + - tailwindcss + - typescript + + '@scalar/snippetz@0.9.12': + dependencies: + '@scalar/helpers': 0.8.1 + '@scalar/types': 0.12.3 + js-base64: 3.7.8 + stringify-object: 6.0.0 + + '@scalar/themes@0.15.6': + dependencies: + nanoid: 5.1.11 + + '@scalar/typebox@0.1.3': {} + + '@scalar/types@0.12.3': + dependencies: + '@scalar/helpers': 0.8.1 + nanoid: 5.1.11 + type-fest: 5.6.0 + zod: 4.4.3 + + '@scalar/use-codemirror@0.14.11(typescript@5.9.3)': + dependencies: + '@codemirror/autocomplete': 6.20.3 + '@codemirror/commands': 6.10.3 + '@codemirror/lang-css': 6.3.1 + '@codemirror/lang-html': 6.4.11 + '@codemirror/lang-json': 6.0.2 + '@codemirror/lang-xml': 6.1.0 + '@codemirror/lang-yaml': 6.1.3 + '@codemirror/language': 6.12.3 + '@codemirror/lint': 6.9.6 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.43.0 + '@lezer/common': 1.5.2 + '@lezer/highlight': 1.2.3 + '@replit/codemirror-css-color-picker': 6.3.0(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.43.0) + vue: 3.5.35(typescript@5.9.3) + transitivePeerDependencies: + - typescript + + '@scalar/use-hooks@0.4.6(typescript@5.9.3)': + dependencies: + '@scalar/use-toasts': 0.10.2(typescript@5.9.3) + '@scalar/validation': 0.6.0 + '@vueuse/core': 13.9.0(vue@3.5.35(typescript@5.9.3)) + cva: 1.0.0-beta.4(typescript@5.9.3) + tailwind-merge: 3.5.0 + vue: 3.5.35(typescript@5.9.3) + transitivePeerDependencies: + - typescript + + '@scalar/use-toasts@0.10.2(typescript@5.9.3)': + dependencies: + vue: 3.5.35(typescript@5.9.3) + vue-sonner: 1.3.2 + transitivePeerDependencies: + - typescript + + '@scalar/validation@0.6.0': {} + + '@scalar/workspace-store@0.53.0(typescript@5.9.3)': + dependencies: + '@scalar/helpers': 0.8.1 + '@scalar/json-magic': 0.12.15 + '@scalar/openapi-upgrader': 0.2.9 + '@scalar/schemas': 0.3.3 + '@scalar/snippetz': 0.9.12 + '@scalar/typebox': 0.1.3 + '@scalar/types': 0.12.3 + '@scalar/validation': 0.6.0 + js-base64: 3.7.8 + type-fest: 5.6.0 + vue: 3.5.35(typescript@5.9.3) + yaml: 2.9.0 + transitivePeerDependencies: + - typescript '@schummar/icu-type-parser@1.21.5': {} @@ -11751,438 +13106,6 @@ snapshots: '@standard-schema/utils@0.3.0': {} - '@swagger-api/apidom-ast@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-error': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - unraw: 3.0.0 - - '@swagger-api/apidom-core@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-ast': 1.11.0 - '@swagger-api/apidom-error': 1.11.0 - '@types/ramda': 0.30.2 - minim: 0.23.8 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - short-unique-id: 5.3.2 - ts-mixer: 6.0.4 - - '@swagger-api/apidom-error@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - - '@swagger-api/apidom-json-pointer@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-error': 1.11.0 - '@swaggerexpert/json-pointer': 2.10.2 - - '@swagger-api/apidom-ns-api-design-systems@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-error': 1.11.0 - '@swagger-api/apidom-ns-openapi-3-1': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - ts-mixer: 6.0.4 - optional: true - - '@swagger-api/apidom-ns-arazzo-1@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-ns-json-schema-2020-12': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - ts-mixer: 6.0.4 - optional: true - - '@swagger-api/apidom-ns-asyncapi-2@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-ns-json-schema-draft-7': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - ts-mixer: 6.0.4 - optional: true - - '@swagger-api/apidom-ns-asyncapi-3@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-ns-asyncapi-2': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - ts-mixer: 6.0.4 - optional: true - - '@swagger-api/apidom-ns-json-schema-2019-09@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-error': 1.11.0 - '@swagger-api/apidom-ns-json-schema-draft-7': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - ts-mixer: 6.0.4 - - '@swagger-api/apidom-ns-json-schema-2020-12@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-error': 1.11.0 - '@swagger-api/apidom-ns-json-schema-2019-09': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - ts-mixer: 6.0.4 - - '@swagger-api/apidom-ns-json-schema-draft-4@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-ast': 1.11.0 - '@swagger-api/apidom-core': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - ts-mixer: 6.0.4 - - '@swagger-api/apidom-ns-json-schema-draft-6@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-error': 1.11.0 - '@swagger-api/apidom-ns-json-schema-draft-4': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - ts-mixer: 6.0.4 - - '@swagger-api/apidom-ns-json-schema-draft-7@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-error': 1.11.0 - '@swagger-api/apidom-ns-json-schema-draft-6': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - ts-mixer: 6.0.4 - - '@swagger-api/apidom-ns-openapi-2@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-error': 1.11.0 - '@swagger-api/apidom-ns-json-schema-draft-4': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - ts-mixer: 6.0.4 - optional: true - - '@swagger-api/apidom-ns-openapi-3-0@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-error': 1.11.0 - '@swagger-api/apidom-ns-json-schema-draft-4': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - ts-mixer: 6.0.4 - - '@swagger-api/apidom-ns-openapi-3-1@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-ast': 1.11.0 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-json-pointer': 1.11.0 - '@swagger-api/apidom-ns-json-schema-2020-12': 1.11.0 - '@swagger-api/apidom-ns-openapi-3-0': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - ts-mixer: 6.0.4 - - '@swagger-api/apidom-ns-openapi-3-2@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-ast': 1.11.0 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-json-pointer': 1.11.0 - '@swagger-api/apidom-ns-json-schema-2020-12': 1.11.0 - '@swagger-api/apidom-ns-openapi-3-0': 1.11.0 - '@swagger-api/apidom-ns-openapi-3-1': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - ts-mixer: 6.0.4 - - '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-ns-api-design-systems': 1.11.0 - '@swagger-api/apidom-parser-adapter-json': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - optional: true - - '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-ns-api-design-systems': 1.11.0 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - optional: true - - '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-ns-arazzo-1': 1.11.0 - '@swagger-api/apidom-parser-adapter-json': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - optional: true - - '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-ns-arazzo-1': 1.11.0 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - optional: true - - '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-ns-asyncapi-2': 1.11.0 - '@swagger-api/apidom-parser-adapter-json': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - optional: true - - '@swagger-api/apidom-parser-adapter-asyncapi-json-3@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-ns-asyncapi-3': 1.11.0 - '@swagger-api/apidom-parser-adapter-json': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - optional: true - - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-ns-asyncapi-2': 1.11.0 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - optional: true - - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-ns-asyncapi-3': 1.11.0 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - optional: true - - '@swagger-api/apidom-parser-adapter-json@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-ast': 1.11.0 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-error': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - tree-sitter: 0.21.1 - tree-sitter-json: 0.24.8(tree-sitter@0.21.1) - web-tree-sitter: 0.24.5 - optional: true - - '@swagger-api/apidom-parser-adapter-openapi-json-2@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-ns-openapi-2': 1.11.0 - '@swagger-api/apidom-parser-adapter-json': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - optional: true - - '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-ns-openapi-3-0': 1.11.0 - '@swagger-api/apidom-parser-adapter-json': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - optional: true - - '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-ns-openapi-3-1': 1.11.0 - '@swagger-api/apidom-parser-adapter-json': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - optional: true - - '@swagger-api/apidom-parser-adapter-openapi-json-3-2@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-ns-openapi-3-2': 1.11.0 - '@swagger-api/apidom-parser-adapter-json': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - optional: true - - '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-ns-openapi-2': 1.11.0 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - optional: true - - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-ns-openapi-3-0': 1.11.0 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - optional: true - - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-ns-openapi-3-1': 1.11.0 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - optional: true - - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-2@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-ns-openapi-3-2': 1.11.0 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.11.0 - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - optional: true - - '@swagger-api/apidom-parser-adapter-yaml-1-2@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-ast': 1.11.0 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-error': 1.11.0 - '@tree-sitter-grammars/tree-sitter-yaml': 0.7.1(tree-sitter@0.22.4) - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - tree-sitter: 0.22.4 - web-tree-sitter: 0.24.5 - optional: true - - '@swagger-api/apidom-reference@1.11.0': - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-error': 1.11.0 - '@types/ramda': 0.30.2 - axios: 1.15.0 - minimatch: 10.2.5 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - optionalDependencies: - '@swagger-api/apidom-json-pointer': 1.11.0 - '@swagger-api/apidom-ns-arazzo-1': 1.11.0 - '@swagger-api/apidom-ns-asyncapi-2': 1.11.0 - '@swagger-api/apidom-ns-openapi-2': 1.11.0 - '@swagger-api/apidom-ns-openapi-3-0': 1.11.0 - '@swagger-api/apidom-ns-openapi-3-1': 1.11.0 - '@swagger-api/apidom-ns-openapi-3-2': 1.11.0 - '@swagger-api/apidom-parser-adapter-api-design-systems-json': 1.11.0 - '@swagger-api/apidom-parser-adapter-api-design-systems-yaml': 1.11.0 - '@swagger-api/apidom-parser-adapter-arazzo-json-1': 1.11.0 - '@swagger-api/apidom-parser-adapter-arazzo-yaml-1': 1.11.0 - '@swagger-api/apidom-parser-adapter-asyncapi-json-2': 1.11.0 - '@swagger-api/apidom-parser-adapter-asyncapi-json-3': 1.11.0 - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2': 1.11.0 - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3': 1.11.0 - '@swagger-api/apidom-parser-adapter-json': 1.11.0 - '@swagger-api/apidom-parser-adapter-openapi-json-2': 1.11.0 - '@swagger-api/apidom-parser-adapter-openapi-json-3-0': 1.11.0 - '@swagger-api/apidom-parser-adapter-openapi-json-3-1': 1.11.0 - '@swagger-api/apidom-parser-adapter-openapi-json-3-2': 1.11.0 - '@swagger-api/apidom-parser-adapter-openapi-yaml-2': 1.11.0 - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0': 1.11.0 - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1': 1.11.0 - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-2': 1.11.0 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.11.0 - transitivePeerDependencies: - - debug - - '@swaggerexpert/cookie@2.0.2': - dependencies: - apg-lite: 1.0.4 - - '@swaggerexpert/json-pointer@2.10.2': - dependencies: - apg-lite: 1.0.4 - '@swc/core-darwin-arm64@1.15.3': optional: true @@ -12274,10 +13197,10 @@ snapshots: '@tanstack/react-query': 5.101.0(react@19.2.7) react: 19.2.7 - '@tanstack/react-query-next-experimental@5.101.0(@tanstack/react-query@5.101.0(react@19.2.7))(next@16.2.7(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(react@19.2.7)': + '@tanstack/react-query-next-experimental@5.101.0(@tanstack/react-query@5.101.0(react@19.2.7))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(react@19.2.7)': dependencies: '@tanstack/react-query': 5.101.0(react@19.2.7) - next: 16.2.7(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) + next: 16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) react: 19.2.7 '@tanstack/react-query@5.101.0(react@19.2.7)': @@ -12301,6 +13224,13 @@ snapshots: '@tanstack/virtual-core@3.11.2': {} + '@tanstack/virtual-core@3.17.0': {} + + '@tanstack/vue-virtual@3.13.28(vue@3.5.35(typescript@5.9.3))': + dependencies: + '@tanstack/virtual-core': 3.17.0 + vue: 3.5.35(typescript@5.9.3) + '@testcontainers/mysql@12.0.1': dependencies: testcontainers: 12.0.1 @@ -12552,24 +13482,16 @@ snapshots: '@tiptap/extensions': 3.26.0(@tiptap/core@3.26.0(@tiptap/pm@3.26.0))(@tiptap/pm@3.26.0) '@tiptap/pm': 3.26.0 - '@tree-sitter-grammars/tree-sitter-yaml@0.7.1(tree-sitter@0.22.4)': - dependencies: - node-addon-api: 8.3.1 - node-gyp-build: 4.8.4 - optionalDependencies: - tree-sitter: 0.22.4 - optional: true - '@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3)': dependencies: '@trpc/server': 11.17.0(typescript@5.9.3) typescript: 5.9.3 - '@trpc/next@11.17.0(@tanstack/react-query@5.101.0(react@19.2.7))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/react-query@11.17.0(@tanstack/react-query@5.101.0(react@19.2.7))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.7)(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(next@16.2.7(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)': + '@trpc/next@11.17.0(@tanstack/react-query@5.101.0(react@19.2.7))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/react-query@11.17.0(@tanstack/react-query@5.101.0(react@19.2.7))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.7)(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)': dependencies: '@trpc/client': 11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3) '@trpc/server': 11.17.0(typescript@5.9.3) - next: 16.2.7(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) + next: 16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) react: 19.2.7 react-dom: 19.2.7(react@19.2.7) typescript: 5.9.3 @@ -12744,6 +13666,8 @@ snapshots: '@types/qs': 6.9.16 '@types/serve-static': 1.15.7 + '@types/har-format@1.2.16': {} + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 @@ -12793,10 +13717,6 @@ snapshots: '@types/qs@6.9.16': {} - '@types/ramda@0.30.2': - dependencies: - types-ramda: 0.30.1 - '@types/range-parser@1.2.7': {} '@types/react-dom@19.2.3(@types/react@19.2.16)': @@ -12845,10 +13765,6 @@ snapshots: dependencies: '@types/node': 24.12.4 - '@types/swagger-ui-react@5.18.0': - dependencies: - '@types/react': 19.2.16 - '@types/triple-beam@1.3.5': {} '@types/trusted-types@2.0.7': @@ -12862,6 +13778,10 @@ snapshots: '@types/video.js@7.3.58': {} + '@types/web-bluetooth@0.0.20': {} + + '@types/web-bluetooth@0.0.21': {} + '@types/ws@8.18.1': dependencies: '@types/node': 24.12.4 @@ -12874,6 +13794,14 @@ snapshots: '@ungap/structured-clone@1.3.0': {} + '@unhead/vue@2.1.15(vue@3.5.35(typescript@5.9.3))': + dependencies: + hookable: 6.1.1 + unhead: 2.1.15 + vue: 3.5.35(typescript@5.9.3) + + '@vercel/oidc@3.1.0': {} + '@videojs/http-streaming@3.17.4(video.js@8.23.7)': dependencies: '@babel/runtime': 7.29.7 @@ -12902,7 +13830,7 @@ snapshots: global: 4.4.0 is-function: 1.0.2 - '@vitejs/plugin-react@5.2.0(vite@7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))': + '@vitejs/plugin-react@5.2.0(vite@7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -12910,7 +13838,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) + vite: 7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color @@ -12926,7 +13854,7 @@ snapshots: obug: 2.1.1 std-env: 4.0.0 tinyrainbow: 3.1.0 - vitest: 4.1.8(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1(@noble/hashes@2.0.1))(msw@2.14.6(@types/node@24.12.4)(typescript@5.9.3))(vite@7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + vitest: 4.1.8(@opentelemetry/api@1.9.0)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1(@noble/hashes@2.0.1))(msw@2.14.6(@types/node@24.12.4)(typescript@5.9.3))(vite@7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/expect@4.1.8': dependencies: @@ -12937,14 +13865,14 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.8(msw@2.14.6(@types/node@24.12.4)(typescript@5.9.3))(vite@7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))': + '@vitest/mocker@4.1.8(msw@2.14.6(@types/node@24.12.4)(typescript@5.9.3))(vite@7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.8 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.14.6(@types/node@24.12.4)(typescript@5.9.3) - vite: 7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) + vite: 7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) '@vitest/pretty-format@4.1.8': dependencies: @@ -12973,7 +13901,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vitest: 4.1.8(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1(@noble/hashes@2.0.1))(msw@2.14.6(@types/node@24.12.4)(typescript@5.9.3))(vite@7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + vitest: 4.1.8(@opentelemetry/api@1.9.0)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1(@noble/hashes@2.0.1))(msw@2.14.6(@types/node@24.12.4)(typescript@5.9.3))(vite@7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/utils@4.1.8': dependencies: @@ -12981,6 +13909,101 @@ snapshots: convert-source-map: 2.0.0 tinyrainbow: 3.1.0 + '@vue/compiler-core@3.5.35': + dependencies: + '@babel/parser': 7.29.7 + '@vue/shared': 3.5.35 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.35': + dependencies: + '@vue/compiler-core': 3.5.35 + '@vue/shared': 3.5.35 + + '@vue/compiler-sfc@3.5.35': + dependencies: + '@babel/parser': 7.29.7 + '@vue/compiler-core': 3.5.35 + '@vue/compiler-dom': 3.5.35 + '@vue/compiler-ssr': 3.5.35 + '@vue/shared': 3.5.35 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.15 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.35': + dependencies: + '@vue/compiler-dom': 3.5.35 + '@vue/shared': 3.5.35 + + '@vue/reactivity@3.5.35': + dependencies: + '@vue/shared': 3.5.35 + + '@vue/runtime-core@3.5.35': + dependencies: + '@vue/reactivity': 3.5.35 + '@vue/shared': 3.5.35 + + '@vue/runtime-dom@3.5.35': + dependencies: + '@vue/reactivity': 3.5.35 + '@vue/runtime-core': 3.5.35 + '@vue/shared': 3.5.35 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.35(vue@3.5.35(typescript@5.9.3))': + dependencies: + '@vue/compiler-ssr': 3.5.35 + '@vue/shared': 3.5.35 + vue: 3.5.35(typescript@5.9.3) + + '@vue/shared@3.5.35': {} + + '@vueuse/core@10.11.1(vue@3.5.35(typescript@5.9.3))': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 10.11.1 + '@vueuse/shared': 10.11.1(vue@3.5.35(typescript@5.9.3)) + vue-demi: 0.14.10(vue@3.5.35(typescript@5.9.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/core@13.9.0(vue@3.5.35(typescript@5.9.3))': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 13.9.0 + '@vueuse/shared': 13.9.0(vue@3.5.35(typescript@5.9.3)) + vue: 3.5.35(typescript@5.9.3) + + '@vueuse/integrations@13.9.0(focus-trap@7.8.0)(fuse.js@7.4.2)(vue@3.5.35(typescript@5.9.3))': + dependencies: + '@vueuse/core': 13.9.0(vue@3.5.35(typescript@5.9.3)) + '@vueuse/shared': 13.9.0(vue@3.5.35(typescript@5.9.3)) + vue: 3.5.35(typescript@5.9.3) + optionalDependencies: + focus-trap: 7.8.0 + fuse.js: 7.4.2 + + '@vueuse/metadata@10.11.1': {} + + '@vueuse/metadata@13.9.0': {} + + '@vueuse/shared@10.11.1(vue@3.5.35(typescript@5.9.3))': + dependencies: + vue-demi: 0.14.10(vue@3.5.35(typescript@5.9.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/shared@13.9.0(vue@3.5.35(typescript@5.9.3))': + dependencies: + vue: 3.5.35(typescript@5.9.3) + '@webassemblyjs/ast@1.14.1': dependencies: '@webassemblyjs/helper-numbers': 1.13.2 @@ -13077,6 +14100,11 @@ snapshots: abstract-logging@2.0.1: {} + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.0.0 + acorn-import-phases@1.0.4(acorn@8.16.0): dependencies: acorn: 8.16.0 @@ -13106,6 +14134,14 @@ snapshots: clean-stack: 5.2.0 indent-string: 5.0.0 + ai@6.0.33(zod@4.4.3): + dependencies: + '@ai-sdk/gateway': 3.0.13(zod@4.4.3) + '@ai-sdk/provider': 3.0.2 + '@ai-sdk/provider-utils': 4.0.5(zod@4.4.3) + '@opentelemetry/api': 1.9.0 + zod: 4.4.3 + ajv-formats@2.1.1(ajv@8.18.0): optionalDependencies: ajv: 8.18.0 @@ -13146,8 +14182,6 @@ snapshots: any-promise@1.3.0: {} - apg-lite@1.0.4: {} - archiver-utils@5.0.2: dependencies: glob: 10.5.0 @@ -13168,14 +14202,14 @@ snapshots: tar-stream: 3.1.7 zip-stream: 6.0.1 - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - argparse@2.0.1: {} argv-formatter@1.0.0: {} + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + arktype@2.1.20: dependencies: '@ark/schema': 0.46.0 @@ -13204,14 +14238,6 @@ snapshots: attr-accept@2.2.5: {} - autolinker@3.16.2: - dependencies: - tslib: 2.8.1 - - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.0.0 - avvio@9.2.0: dependencies: '@fastify/error': 4.2.0 @@ -13289,6 +14315,49 @@ snapshots: before-after-hook@4.0.0: {} + better-auth@1.6.14(@opentelemetry/api@1.9.0)(better-sqlite3@12.10.0)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0))(mysql2@3.22.4(@types/node@24.12.4))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8)(vue@3.5.35(typescript@5.9.3)): + dependencies: + '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0) + '@better-auth/drizzle-adapter': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)) + '@better-auth/kysely-adapter': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(kysely@0.29.2) + '@better-auth/memory-adapter': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1) + '@better-auth/mongo-adapter': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1) + '@better-auth/prisma-adapter': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1) + '@better-auth/telemetry': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21) + '@better-auth/utils': 0.4.1 + '@better-fetch/fetch': 1.1.21 + '@noble/ciphers': 2.2.0 + '@noble/hashes': 2.0.1 + better-call: 1.3.5(zod@4.4.3) + defu: 6.1.7 + jose: 6.2.3 + kysely: 0.29.2 + nanostores: 1.3.0 + zod: 4.4.3 + optionalDependencies: + better-sqlite3: 12.10.0 + drizzle-kit: 0.31.10 + drizzle-orm: 0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0) + mysql2: 3.22.4(@types/node@24.12.4) + next: 16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) + pg: 8.21.0 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + vitest: 4.1.8(@opentelemetry/api@1.9.0)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1(@noble/hashes@2.0.1))(msw@2.14.6(@types/node@24.12.4)(typescript@5.9.3))(vite@7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + vue: 3.5.35(typescript@5.9.3) + transitivePeerDependencies: + - '@cloudflare/workers-types' + - '@opentelemetry/api' + + better-call@1.3.5(zod@4.4.3): + dependencies: + '@better-auth/utils': 0.4.1 + '@better-fetch/fetch': 1.1.21 + rou3: 0.7.12 + set-cookie-parser: 3.1.0 + optionalDependencies: + zod: 4.4.3 + better-sqlite3@12.10.0: dependencies: bindings: 1.5.0 @@ -13314,6 +14383,20 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + body-parser@2.2.2: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.3 + http-errors: 2.0.0 + iconv-lite: 0.7.2 + on-finished: 2.4.1 + qs: 6.15.2 + raw-body: 3.0.2 + type-is: 2.1.0 + transitivePeerDependencies: + - supports-color + bottleneck@2.19.5: {} brace-expansion@5.0.6: @@ -13358,13 +14441,6 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.8: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 - call-bound@1.0.4: dependencies: call-bind-apply-helpers: 1.0.2 @@ -13393,6 +14469,8 @@ snapshots: chalk@5.4.1: {} + chalk@5.6.2: {} + char-regex@1.0.2: {} character-entities-html4@2.1.0: {} @@ -13415,8 +14493,6 @@ snapshots: chrome-trace-event@1.0.4: {} - classnames@2.5.1: {} - clean-stack@2.2.0: {} clean-stack@5.2.0: @@ -13464,6 +14540,8 @@ snapshots: cluster-key-slot@1.1.1: {} + cluster-key-slot@1.1.2: {} + co-body@6.2.0: dependencies: '@hapi/bourne': 3.0.0 @@ -13505,6 +14583,8 @@ snapshots: comma-separated-tokens@2.0.3: {} + commander@11.1.0: {} + commander@2.20.3: {} compare-func@2.0.0: @@ -13534,6 +14614,12 @@ snapshots: ini: 1.3.8 proto-list: 1.2.4 + content-disposition@1.1.0: {} + + content-type@1.0.5: {} + + content-type@2.0.0: {} + conventional-changelog-angular@8.0.0: dependencies: compare-func: 2.0.0 @@ -13564,6 +14650,10 @@ snapshots: cookie-es@3.0.1: {} + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + cookie@1.1.1: {} cookies@0.9.1: @@ -13575,14 +14665,13 @@ snapshots: dependencies: is-what: 5.5.0 - copy-to-clipboard@3.3.3: - dependencies: - toggle-selection: 1.0.6 - - core-js-pure@3.38.1: {} - core-util-is@1.0.3: {} + cors@2.8.6: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + cosmiconfig@9.0.0(typescript@5.9.3): dependencies: env-paths: 2.2.1 @@ -13605,6 +14694,8 @@ snapshots: crc-32: 1.2.2 readable-stream: 4.5.2 + crelt@1.0.6: {} + croner@10.0.1: {} cross-env@10.1.0: @@ -13633,12 +14724,16 @@ snapshots: mdn-data: 2.27.1 source-map-js: 1.2.1 - css.escape@1.5.1: {} - cssesc@3.0.0: {} csstype@3.2.3: {} + cva@1.0.0-beta.4(typescript@5.9.3): + dependencies: + clsx: 2.1.1 + optionalDependencies: + typescript: 5.9.3 + d3-array@3.2.4: dependencies: internmap: 2.0.3 @@ -13711,12 +14806,6 @@ snapshots: deepmerge@4.3.1: {} - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 - defu@6.1.7: {} delayed-stream@1.0.0: {} @@ -13778,10 +14867,6 @@ snapshots: dom-walk@0.1.2: {} - dompurify@3.4.5: - optionalDependencies: - '@types/trusted-types': 2.0.7 - dompurify@3.4.8: optionalDependencies: '@types/trusted-types': 2.0.7 @@ -13805,8 +14890,6 @@ snapshots: dotenv@17.4.2: {} - drange@1.1.1: {} - drizzle-kit@0.31.10: dependencies: '@drizzle-team/brocli': 0.10.2 @@ -13814,20 +14897,22 @@ snapshots: esbuild: 0.25.12 tsx: 4.21.0 - drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(sql.js@1.14.1): + drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0): optionalDependencies: '@libsql/client-wasm': 0.14.0 + '@opentelemetry/api': 1.9.0 '@types/better-sqlite3': 7.6.13 '@types/pg': 8.20.0 better-sqlite3: 12.10.0 gel: 2.0.0 + kysely: 0.29.2 mysql2: 3.22.4(@types/node@24.12.4) pg: 8.21.0 sql.js: 1.14.1 - drizzle-zod@0.8.3(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(sql.js@1.14.1))(zod@4.4.3): + drizzle-zod@0.8.3(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0))(zod@4.4.3): dependencies: - drizzle-orm: 0.45.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(sql.js@1.14.1) + drizzle-orm: 0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0) zod: 4.4.3 dunder-proto@1.0.1: @@ -13842,6 +14927,8 @@ snapshots: eastasianwidth@0.2.0: {} + ee-first@1.1.1: {} + electron-to-chromium@1.5.361: {} emoji-regex@10.6.0: {} @@ -13856,6 +14943,8 @@ snapshots: enabled@2.0.0: {} + encodeurl@2.0.0: {} + end-of-stream@1.4.4: dependencies: once: 1.4.0 @@ -13865,6 +14954,10 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.3.3 + entities@6.0.1: {} + + entities@7.0.1: {} + entities@8.0.0: {} env-ci@11.2.0: @@ -13993,6 +15086,8 @@ snapshots: escalade@3.2.0: {} + escape-html@1.0.3: {} + escape-string-regexp@1.0.5: {} escape-string-regexp@5.0.0: {} @@ -14012,10 +15107,14 @@ snapshots: estree-util-is-identifier-name@3.0.0: {} + estree-walker@2.0.2: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.8 + etag@1.8.1: {} + event-target-shim@5.0.1: {} eventemitter2@6.4.9: {} @@ -14026,6 +15125,12 @@ snapshots: events@3.3.0: {} + eventsource-parser@3.1.0: {} + + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.1.0 + execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -14069,6 +15174,44 @@ snapshots: expect-type@1.3.0: {} + express-rate-limit@8.5.2(express@5.2.1): + dependencies: + express: 5.2.1 + ip-address: 10.2.0 + + express@5.2.1: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.2 + content-disposition: 1.1.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.1 + fresh: 2.0.0 + http-errors: 2.0.0 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 + statuses: 2.0.2 + type-is: 2.1.0 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + extend@3.0.2: {} fast-content-type-parse@3.0.0: {} @@ -14083,8 +15226,6 @@ snapshots: fast-fifo@1.3.2: {} - fast-json-patch@3.1.1: {} - fast-json-stringify@6.3.0: dependencies: '@fastify/merge-json-schemas': 0.2.1 @@ -14148,10 +15289,6 @@ snapshots: dependencies: reusify: 1.1.0 - fault@1.0.4: - dependencies: - format: 0.2.2 - fdir@6.5.0(picomatch@4.0.4): optionalDependencies: picomatch: 4.0.4 @@ -14178,6 +15315,17 @@ snapshots: dependencies: to-regex-range: 5.0.1 + finalhandler@2.1.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + find-my-way@9.5.0: dependencies: fast-deep-equal: 3.1.3 @@ -14201,11 +15349,11 @@ snapshots: fn.name@1.1.0: {} - follow-redirects@1.16.0: {} - - for-each@0.3.5: + focus-trap@7.8.0: dependencies: - is-callable: 1.2.7 + tabbable: 6.4.0 + + follow-redirects@1.16.0: {} foreground-child@3.3.1: dependencies: @@ -14220,7 +15368,9 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 - format@0.2.2: {} + forwarded@0.2.0: {} + + fresh@2.0.0: {} fs-constants@1.0.0: {} @@ -14240,6 +15390,8 @@ snapshots: function-timeout@1.0.2: {} + fuse.js@7.4.2: {} + gel@2.0.0: dependencies: '@petamoriken/float16': 3.9.3 @@ -14256,6 +15408,8 @@ snapshots: dependencies: is-property: 1.0.2 + generic-pool@3.9.0: {} + gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} @@ -14277,6 +15431,8 @@ snapshots: get-nonce@1.0.1: {} + get-own-enumerable-keys@1.0.0: {} + get-port@7.2.0: {} get-proto@1.0.1: @@ -14341,6 +15497,8 @@ snapshots: graphql@16.14.0: optional: true + guess-json-indent@3.0.1: {} + h3@1.15.11: dependencies: cookie-es: 1.2.3 @@ -14366,10 +15524,6 @@ snapshots: has-flag@4.0.0: {} - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.1 - has-symbols@1.1.0: {} has-tostringtag@1.0.2: @@ -14380,10 +15534,109 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-embedded@3.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-is-element: 3.0.0 + + hast-util-format@1.1.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-minify-whitespace: 1.0.1 + hast-util-phrasing: 3.0.1 + hast-util-whitespace: 3.0.0 + html-whitespace-sensitive-tag-names: 3.0.1 + unist-util-visit-parents: 6.0.1 + + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.3 + parse5: 7.3.0 + vfile: 6.0.3 + vfile-message: 4.0.2 + + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.0.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-has-property@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-body-ok-link@3.0.1: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-minify-whitespace@1.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-whitespace: 3.0.0 + unist-util-is: 6.0.0 + hast-util-parse-selector@4.0.0: dependencies: '@types/hast': 3.0.4 + hast-util-phrasing@3.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-has-property: 3.0.0 + hast-util-is-body-ok-link: 3.0.1 + hast-util-is-element: 3.0.0 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.1 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-sanitize@5.0.2: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.3.0 + unist-util-position: 5.0.0 + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + hast-util-to-jsx-runtime@2.3.6: dependencies: '@types/estree': 1.0.8 @@ -14404,6 +15657,23 @@ snapshots: transitivePeerDependencies: - supports-color + hast-util-to-parse5@8.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + hast-util-whitespace@3.0.0: dependencies: '@types/hast': 3.0.4 @@ -14424,10 +15694,14 @@ snapshots: highlight.js@10.7.3: {} - highlightjs-vue@1.0.0: {} + highlight.js@11.11.1: {} + + hono@4.12.23: {} hook-std@4.0.0: {} + hookable@6.1.1: {} + hosted-git-info@7.0.2: dependencies: lru-cache: 10.4.3 @@ -14450,6 +15724,10 @@ snapshots: html-url-attributes@3.0.1: {} + html-void-elements@3.0.0: {} + + html-whitespace-sensitive-tag-names@3.0.1: {} + http-cookie-agent@6.0.8(tough-cookie@5.1.2)(undici@7.24.6): dependencies: agent-base: 7.1.3 @@ -14465,6 +15743,14 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + http-proxy-agent@9.0.0: dependencies: agent-base: 9.0.0 @@ -14499,6 +15785,10 @@ snapshots: dependencies: '@formatjs/icu-messageformat-parser': 3.5.0 + identifier-regex@1.0.1: + dependencies: + reserved-identifiers: 1.2.0 + ieee754@1.2.1: {} immediate@3.0.6: {} @@ -14507,8 +15797,6 @@ snapshots: immer@11.1.4: {} - immutable@3.8.2: {} - immutable@5.1.5: {} import-fresh@3.3.0: @@ -14548,10 +15836,6 @@ snapshots: '@formatjs/icu-messageformat-parser': 3.5.0 tslib: 2.8.1 - invariant@2.2.4: - dependencies: - loose-envify: 1.4.0 - ioredis@5.11.0: dependencies: '@ioredis/commands': 1.10.0 @@ -14564,15 +15848,21 @@ snapshots: transitivePeerDependencies: - supports-color + ip-address@10.2.0: {} + ip-address@9.0.5: dependencies: jsbn: 1.1.0 sprintf-js: 1.1.3 + ipaddr.js@1.9.1: {} + ipaddr.js@2.3.0: {} iron-webcrypto@1.2.1: {} + is-absolute-url@4.0.1: {} + is-alphabetical@2.0.1: {} is-alphanumerical@2.0.1: @@ -14584,8 +15874,6 @@ snapshots: is-buffer@1.1.6: {} - is-callable@1.2.7: {} - is-decimal@2.0.1: {} is-extglob@2.1.1: {} @@ -14600,6 +15888,11 @@ snapshots: is-hexadecimal@2.0.1: {} + is-identifier@1.0.1: + dependencies: + identifier-regex: 1.0.1 + super-regex: 1.0.0 + is-node-process@1.2.0: optional: true @@ -14607,30 +15900,30 @@ snapshots: is-obj@2.0.0: {} + is-obj@3.0.0: {} + is-plain-obj@4.1.0: {} is-potential-custom-element-name@1.0.1: {} + is-promise@4.0.0: {} + is-property@1.0.2: {} + is-regexp@3.1.0: {} + is-stream@2.0.1: {} is-stream@3.0.0: {} is-stream@4.0.1: {} - is-typed-array@1.1.15: - dependencies: - which-typed-array: 1.1.19 - is-unicode-supported@2.1.0: {} is-what@5.5.0: {} isarray@1.0.0: {} - isarray@2.0.5: {} - isexe@2.0.0: {} isexe@3.1.5: @@ -14692,6 +15985,8 @@ snapshots: jose@6.0.8: {} + jose@6.2.3: {} + jotai@2.20.0(@babel/core@7.29.0)(@babel/template@7.28.6)(@types/react@19.2.16)(react@19.2.7): optionalDependencies: '@babel/core': 7.29.0 @@ -14699,10 +15994,7 @@ snapshots: '@types/react': 19.2.16 react: 19.2.7 - js-base64@3.7.8: - optional: true - - js-file-download@0.4.12: {} + js-base64@3.7.8: {} js-tokens@10.0.0: {} @@ -14754,8 +16046,14 @@ snapshots: json-schema-traverse@1.0.0: {} + json-schema-typed@8.0.2: {} + + json-schema@0.4.0: {} + json5@2.2.3: {} + jsonc-parser@3.3.1: {} + jsonfile@6.1.0: dependencies: universalify: 2.0.1 @@ -14787,6 +16085,8 @@ snapshots: kuler@2.0.0: {} + kysely@0.29.2: {} + lazystream@1.0.1: dependencies: readable-stream: 2.3.8 @@ -14837,8 +16137,6 @@ snapshots: lodash.clonedeep@4.5.0: {} - lodash.debounce@4.0.8: {} - lodash.escaperegexp@4.1.2: {} lodash.isequal@4.5.0: {} @@ -14868,10 +16166,11 @@ snapshots: dependencies: js-tokens: 4.0.0 - lowlight@1.20.0: + lowlight@3.3.0: dependencies: - fault: 1.0.4 - highlight.js: 10.7.3 + '@types/hast': 3.0.4 + devlop: 1.1.0 + highlight.js: 11.11.1 lru-cache@10.4.3: {} @@ -14923,6 +16222,8 @@ snapshots: maria2@0.4.1: {} + markdown-table@3.0.4: {} + marked-terminal@7.3.0(marked@15.0.11): dependencies: ansi-escapes: 7.0.0 @@ -14938,6 +16239,22 @@ snapshots: math-intrinsics@1.1.0: {} + mcp-handler@1.1.0(@modelcontextprotocol/sdk@1.26.0(zod@4.4.3))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0)): + dependencies: + '@modelcontextprotocol/sdk': 1.26.0(zod@4.4.3) + chalk: 5.4.1 + commander: 11.1.0 + redis: 4.7.1 + optionalDependencies: + next: 16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + mdast-util-from-markdown@2.0.2: dependencies: '@types/mdast': 4.0.4 @@ -14955,6 +16272,63 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + mdast-util-mdx-expression@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 @@ -15031,10 +16405,16 @@ snapshots: media-typer@0.3.0: {} + media-typer@1.1.0: {} + meow@13.2.0: {} + merge-descriptors@2.0.0: {} + merge-stream@2.0.0: {} + microdiff@1.5.0: {} + micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.1.0 @@ -15054,6 +16434,64 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + micromark-factory-destination@2.0.1: dependencies: micromark-util-character: 2.1.1 @@ -15181,6 +16619,10 @@ snapshots: dependencies: mime-db: 1.52.0 + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + mime@4.0.4: {} mimic-fn@2.1.0: {} @@ -15193,10 +16635,6 @@ snapshots: dependencies: dom-walk: 0.1.2 - minim@0.23.8: - dependencies: - lodash: 4.18.1 - minimatch@10.2.5: dependencies: brace-expansion: 5.0.6 @@ -15291,32 +16729,40 @@ snapshots: nanoid@3.3.11: {} + nanoid@3.3.12: {} + + nanoid@5.1.11: {} + + nanostores@1.3.0: {} + napi-build-utils@1.0.2: {} negotiator@1.0.0: {} neo-async@2.6.2: {} - neotraverse@0.6.18: {} - nerf-dart@1.0.0: {} - next-auth@5.0.0-beta.31(next@16.2.7(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(react@19.2.7): + neverpanic@0.0.7(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + next-auth@5.0.0-beta.31(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(react@19.2.7): dependencies: '@auth/core': 0.41.2 - next: 16.2.7(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) + next: 16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) react: 19.2.7 next-intl-swc-plugin-extractor@4.13.0: {} - next-intl@4.13.0(next@16.2.7(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(react@19.2.7)(typescript@5.9.3): + next-intl@4.13.0(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(react@19.2.7)(typescript@5.9.3): dependencies: '@formatjs/intl-localematcher': 0.8.1 '@parcel/watcher': 2.4.1 '@swc/core': 1.15.3 icu-minify: 4.13.0 negotiator: 1.0.0 - next: 16.2.7(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) + next: 16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) next-intl-swc-plugin-extractor: 4.13.0 po-parser: 2.1.1 react: 19.2.7 @@ -15326,7 +16772,7 @@ snapshots: transitivePeerDependencies: - '@swc/helpers' - next@16.2.7(@babel/core@7.29.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0): + next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0): dependencies: '@next/env': 16.2.7 '@swc/helpers': 0.5.15 @@ -15345,6 +16791,7 @@ snapshots: '@next/swc-linux-x64-musl': 16.2.7 '@next/swc-win32-arm64-msvc': 16.2.7 '@next/swc-win32-x64-msvc': 16.2.7 + '@opentelemetry/api': 1.9.0 '@playwright/test': 1.60.0 babel-plugin-react-compiler: 1.0.0 sass: 1.100.0 @@ -15357,8 +16804,6 @@ snapshots: dependencies: semver: 7.7.4 - node-abort-controller@3.1.1: {} - node-addon-api@7.1.1: {} node-addon-api@8.3.1: {} @@ -15378,10 +16823,10 @@ snapshots: node-gyp-build@4.8.4: {} - node-loader@2.1.0(webpack@5.107.1(postcss@8.5.8)): + node-loader@2.1.0(webpack@5.107.1(postcss@8.5.15)): dependencies: loader-utils: 2.0.4 - webpack: 5.107.1(postcss@8.5.8) + webpack: 5.107.1(postcss@8.5.15) node-mock-http@1.0.4: {} @@ -15448,6 +16893,10 @@ snapshots: on-exit-leak-free@2.1.2: {} + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -15464,14 +16913,6 @@ snapshots: dependencies: mimic-fn: 4.0.0 - openapi-path-templating@2.2.1: - dependencies: - apg-lite: 1.0.4 - - openapi-server-url-templating@1.3.0: - dependencies: - apg-lite: 1.0.4 - openapi3-ts@4.4.0: dependencies: yaml: 2.9.0 @@ -15602,10 +17043,16 @@ snapshots: parse5@6.0.1: {} + parse5@7.3.0: + dependencies: + entities: 6.0.1 + parse5@8.0.1: dependencies: entities: 8.0.0 + parseurl@1.3.3: {} + path-exists@3.0.0: {} path-expression-matcher@1.5.0: {} @@ -15627,6 +17074,8 @@ snapshots: path-to-regexp@6.3.0: optional: true + path-to-regexp@8.4.2: {} + path-type@4.0.0: {} pathe@2.0.3: {} @@ -15698,6 +17147,8 @@ snapshots: sonic-boom: 4.2.1 thread-stream: 4.0.0 + pkce-challenge@5.0.1: {} + pkcs7@1.0.4: dependencies: '@babel/runtime': 7.29.7 @@ -15717,40 +17168,38 @@ snapshots: po-parser@2.1.1: {} - possible-typed-array-names@1.0.0: {} - - postcss-js@4.0.1(postcss@8.5.8): + postcss-js@4.0.1(postcss@8.5.15): dependencies: camelcase-css: 2.0.1 - postcss: 8.5.8 + postcss: 8.5.15 - postcss-mixins@12.0.0(postcss@8.5.8): + postcss-mixins@12.0.0(postcss@8.5.15): dependencies: - postcss: 8.5.8 - postcss-js: 4.0.1(postcss@8.5.8) - postcss-simple-vars: 7.0.1(postcss@8.5.8) - sugarss: 5.0.0(postcss@8.5.8) + postcss: 8.5.15 + postcss-js: 4.0.1(postcss@8.5.15) + postcss-simple-vars: 7.0.1(postcss@8.5.15) + sugarss: 5.0.0(postcss@8.5.15) tinyglobby: 0.2.15 - postcss-nested@7.0.2(postcss@8.5.8): + postcss-nested@7.0.2(postcss@8.5.15): dependencies: - postcss: 8.5.8 + postcss: 8.5.15 postcss-selector-parser: 7.1.0 - postcss-preset-mantine@1.18.0(postcss@8.5.8): + postcss-preset-mantine@1.18.0(postcss@8.5.15): dependencies: - postcss: 8.5.8 - postcss-mixins: 12.0.0(postcss@8.5.8) - postcss-nested: 7.0.2(postcss@8.5.8) + postcss: 8.5.15 + postcss-mixins: 12.0.0(postcss@8.5.15) + postcss-nested: 7.0.2(postcss@8.5.15) postcss-selector-parser@7.1.0: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-simple-vars@7.0.1(postcss@8.5.8): + postcss-simple-vars@7.0.1(postcss@8.5.15): dependencies: - postcss: 8.5.8 + postcss: 8.5.15 postcss@8.4.31: dependencies: @@ -15758,6 +17207,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.15: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postcss@8.5.8: dependencies: nanoid: 3.3.11 @@ -15801,6 +17256,10 @@ snapshots: dependencies: parse-ms: 4.0.0 + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 + prismjs@1.30.0: {} process-nextick-args@2.0.1: {} @@ -15927,6 +17386,11 @@ snapshots: dependencies: undici: 7.24.6 + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + proxy-from-env@1.1.0: {} proxy-from-env@2.1.0: {} @@ -15942,7 +17406,9 @@ snapshots: dependencies: side-channel: 1.1.0 - querystringify@2.2.0: {} + qs@6.15.2: + dependencies: + side-channel: 1.1.0 quick-format-unescaped@4.0.4: {} @@ -15959,22 +17425,26 @@ snapshots: parchment: 3.0.0 quill-delta: 5.1.0 + radix-vue@1.9.17(vue@3.5.35(typescript@5.9.3)): + dependencies: + '@floating-ui/dom': 1.7.6 + '@floating-ui/vue': 1.1.11(vue@3.5.35(typescript@5.9.3)) + '@internationalized/date': 3.12.2 + '@internationalized/number': 3.6.7 + '@tanstack/vue-virtual': 3.13.28(vue@3.5.35(typescript@5.9.3)) + '@vueuse/core': 10.11.1(vue@3.5.35(typescript@5.9.3)) + '@vueuse/shared': 10.11.1(vue@3.5.35(typescript@5.9.3)) + aria-hidden: 1.2.6 + defu: 6.1.7 + fast-deep-equal: 3.1.3 + nanoid: 5.1.11 + vue: 3.5.35(typescript@5.9.3) + transitivePeerDependencies: + - '@vue/composition-api' + radix3@1.1.2: {} - ramda-adjunct@5.1.0(ramda@0.30.1): - dependencies: - ramda: 0.30.1 - - ramda@0.30.1: {} - - randexp@0.5.3: - dependencies: - drange: 1.1.1 - ret: 0.2.2 - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 + range-parser@1.2.1: {} rate-limiter-flexible@8.1.0: {} @@ -15985,6 +17455,13 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.2 + unpipe: 1.0.0 + rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -15992,18 +17469,6 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-copy-to-clipboard@5.1.0(react@19.2.7): - dependencies: - copy-to-clipboard: 3.3.3 - prop-types: 15.8.1 - react: 19.2.7 - - react-debounce-input@3.3.0(react@19.2.7): - dependencies: - lodash.debounce: 4.0.8 - prop-types: 15.8.1 - react: 19.2.7 - react-dom@19.2.7(react@19.2.7): dependencies: react: 19.2.7 @@ -16020,21 +17485,6 @@ snapshots: dependencies: react: 19.2.7 - react-immutable-proptypes@2.2.0(immutable@3.8.2): - dependencies: - immutable: 3.8.2 - invariant: 2.2.4 - - react-immutable-pure-component@2.2.2(immutable@3.8.2)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): - dependencies: - immutable: 3.8.2 - react: 19.2.7 - react-dom: 19.2.7(react@19.2.7) - - react-inspector@6.0.2(react@19.2.7): - dependencies: - react: 19.2.7 - react-is@19.2.7: {} react-markdown@10.1.0(@types/react@19.2.16)(react@19.2.7): @@ -16111,16 +17561,6 @@ snapshots: optionalDependencies: '@types/react': 19.2.16 - react-syntax-highlighter@16.1.0(react@19.2.7): - dependencies: - '@babel/runtime': 7.29.2 - highlight.js: 10.7.3 - highlightjs-vue: 1.0.0 - lowlight: 1.20.0 - prismjs: 1.30.0 - react: 19.2.7 - refractor: 5.0.0 - react-transition-group@4.4.5(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: '@babel/runtime': 7.29.7 @@ -16218,9 +17658,14 @@ snapshots: dependencies: redis-errors: 1.2.0 - redux-immutable@4.0.0(immutable@3.8.2): + redis@4.7.1: dependencies: - immutable: 3.8.2 + '@redis/bloom': 1.2.0(@redis/client@1.6.1) + '@redis/client': 1.6.1 + '@redis/graph': 1.1.1(@redis/client@1.6.1) + '@redis/json': 1.0.7(@redis/client@1.6.1) + '@redis/search': 1.2.0(@redis/client@1.6.1) + '@redis/time-series': 1.1.0(@redis/client@1.6.1) redux-thunk@3.1.0(redux@5.0.1): dependencies: @@ -16228,17 +17673,58 @@ snapshots: redux@5.0.1: {} - refractor@5.0.0: - dependencies: - '@types/hast': 3.0.4 - '@types/prismjs': 1.26.6 - hastscript: 9.0.1 - parse-entities: 4.0.2 - registry-auth-token@5.0.2: dependencies: '@pnpm/npm-conf': 2.3.1 + rehype-external-links@3.0.0: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.3.0 + hast-util-is-element: 3.0.0 + is-absolute-url: 4.0.1 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.1.0 + + rehype-format@5.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-format: 1.1.0 + + rehype-parse@9.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.3 + unified: 11.0.5 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-sanitize@6.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-sanitize: 5.0.2 + + rehype-stringify@10.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + unified: 11.0.5 + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + remark-parse@11.0.0: dependencies: '@types/mdast': 4.0.4 @@ -16256,33 +17742,38 @@ snapshots: unified: 11.0.5 vfile: 6.0.3 - remarkable@2.0.1: + remark-rehype@11.1.2: dependencies: - argparse: 1.0.10 - autolinker: 3.16.2 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 remove-accents@0.5.0: {} rename-keys@1.2.0: {} - repeat-string@1.6.1: {} - require-directory@2.1.1: {} require-from-string@2.0.2: {} - requires-port@1.0.0: {} - reselect@5.1.1: {} + reserved-identifiers@1.2.0: {} + resolve-from@4.0.0: {} resolve-from@5.0.0: {} resolve-pkg-maps@1.0.0: {} - ret@0.2.2: {} - ret@0.5.0: {} retry@0.12.0: {} @@ -16329,6 +17820,18 @@ snapshots: rope-sequence@1.3.4: {} + rou3@0.7.12: {} + + router@2.2.0: + dependencies: + debug: 4.4.3 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.4.2 + transitivePeerDependencies: + - supports-color + rxjs@7.8.2: dependencies: tslib: 2.8.1 @@ -16412,34 +17915,39 @@ snapshots: semver@7.7.4: {} - serialize-error@8.1.0: + send@1.2.1: dependencies: - type-fest: 0.20.2 + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.1: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.1 + transitivePeerDependencies: + - supports-color set-cookie-parser@2.7.2: {} - set-cookie-parser@3.1.0: - optional: true - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 + set-cookie-parser@3.1.0: {} setimmediate@1.0.5: {} setprototypeof@1.2.0: {} - sha.js@2.4.12: - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - to-buffer: 1.2.1 - sharp@0.34.5: dependencies: '@img/colour': 1.0.0 @@ -16480,8 +17988,6 @@ snapshots: shell-quote@1.8.3: {} - short-unique-id@5.3.2: {} - side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 @@ -16594,8 +18100,6 @@ snapshots: split2@4.2.0: {} - sprintf-js@1.0.3: {} - sprintf-js@1.1.3: {} sql-escaper@1.3.3: {} @@ -16623,8 +18127,7 @@ snapshots: statuses@2.0.1: {} - statuses@2.0.2: - optional: true + statuses@2.0.2: {} std-env@4.0.0: {} @@ -16647,6 +18150,10 @@ snapshots: strict-event-emitter@0.5.1: optional: true + string-byte-length@3.0.1: {} + + string-byte-slice@3.0.1: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -16678,6 +18185,13 @@ snapshots: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 + stringify-object@6.0.0: + dependencies: + get-own-enumerable-keys: 1.0.0 + is-identifier: 1.0.1 + is-obj: 3.0.0 + is-regexp: 3.1.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -16698,6 +18212,8 @@ snapshots: strnum@2.3.0: {} + style-mod@4.1.3: {} + style-to-js@1.1.16: dependencies: style-to-object: 1.0.8 @@ -16713,9 +18229,9 @@ snapshots: optionalDependencies: '@babel/core': 7.29.0 - sugarss@5.0.0(postcss@8.5.8): + sugarss@5.0.0(postcss@8.5.15): dependencies: - postcss: 8.5.8 + postcss: 8.5.15 super-regex@1.0.0: dependencies: @@ -16748,77 +18264,22 @@ snapshots: deep-rename-keys: 0.2.1 xml-reader: 2.4.3 - swagger-client@3.37.4: + swrv@1.2.0(vue@3.5.35(typescript@5.9.3)): dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@scarf/scarf': 1.4.0 - '@swagger-api/apidom-core': 1.11.0 - '@swagger-api/apidom-error': 1.11.0 - '@swagger-api/apidom-json-pointer': 1.11.0 - '@swagger-api/apidom-ns-openapi-3-1': 1.11.0 - '@swagger-api/apidom-ns-openapi-3-2': 1.11.0 - '@swagger-api/apidom-reference': 1.11.0 - '@swaggerexpert/cookie': 2.0.2 - deepmerge: 4.3.1 - fast-json-patch: 3.1.1 - js-yaml: 4.1.1 - neotraverse: 0.6.18 - node-abort-controller: 3.1.1 - openapi-path-templating: 2.2.1 - openapi-server-url-templating: 1.3.0 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - transitivePeerDependencies: - - debug - - swagger-ui-react@5.32.6(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): - dependencies: - '@babel/runtime-corejs3': 7.27.1 - '@scarf/scarf': 1.4.0 - base64-js: 1.5.1 - buffer: 6.0.3 - classnames: 2.5.1 - css.escape: 1.5.1 - deep-extend: 0.6.0 - dompurify: 3.4.5 - ieee754: 1.2.1 - immutable: 3.8.2 - js-file-download: 0.4.12 - js-yaml: 4.1.1 - lodash: 4.18.1 - prop-types: 15.8.1 - randexp: 0.5.3 - randombytes: 2.1.0 - react: 19.2.7 - react-copy-to-clipboard: 5.1.0(react@19.2.7) - react-debounce-input: 3.3.0(react@19.2.7) - react-dom: 19.2.7(react@19.2.7) - react-immutable-proptypes: 2.2.0(immutable@3.8.2) - react-immutable-pure-component: 2.2.2(immutable@3.8.2)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - react-inspector: 6.0.2(react@19.2.7) - react-redux: 9.2.0(@types/react@19.2.16)(react@19.2.7)(redux@5.0.1) - react-syntax-highlighter: 16.1.0(react@19.2.7) - redux: 5.0.1 - redux-immutable: 4.0.0(immutable@3.8.2) - remarkable: 2.0.1 - reselect: 5.1.1 - serialize-error: 8.1.0 - sha.js: 2.4.12 - swagger-client: 3.37.4 - url-parse: 1.5.10 - xml: 1.0.1 - xml-but-prettier: 1.0.1 - zenscroll: 4.0.2 - transitivePeerDependencies: - - '@types/react' - - debug + vue: 3.5.35(typescript@5.9.3) symbol-tree@3.2.4: {} tabbable@6.2.0: {} + tabbable@6.4.0: {} + tagged-tag@1.0.0: {} + tailwind-merge@3.5.0: {} + + tailwindcss@4.3.0: {} + tapable@2.3.3: {} tar-fs@2.1.4: @@ -16861,15 +18322,15 @@ snapshots: type-fest: 2.19.0 unique-string: 3.0.0 - terser-webpack-plugin@5.6.0(postcss@8.5.8)(webpack@5.107.1(postcss@8.5.8)): + terser-webpack-plugin@5.6.0(postcss@8.5.15)(webpack@5.107.1(postcss@8.5.15)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 terser: 5.46.1 - webpack: 5.107.1(postcss@8.5.8) + webpack: 5.107.1(postcss@8.5.15) optionalDependencies: - postcss: 8.5.8 + postcss: 8.5.15 terser@5.46.1: dependencies: @@ -16957,20 +18418,12 @@ snapshots: tmp@0.2.7: {} - to-buffer@1.2.1: - dependencies: - isarray: 2.0.5 - safe-buffer: 5.2.1 - typed-array-buffer: 1.0.3 - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 toad-cache@3.7.0: {} - toggle-selection@1.0.6: {} - toidentifier@1.0.1: {} totalist@3.0.1: {} @@ -16993,32 +18446,23 @@ snapshots: tree-kill@1.2.2: {} - tree-sitter-json@0.24.8(tree-sitter@0.21.1): - dependencies: - node-addon-api: 8.3.1 - node-gyp-build: 4.8.4 - optionalDependencies: - tree-sitter: 0.21.1 - optional: true - - tree-sitter@0.21.1: - dependencies: - node-addon-api: 8.3.1 - node-gyp-build: 4.8.4 - optional: true - - tree-sitter@0.22.4: - dependencies: - node-addon-api: 8.3.1 - node-gyp-build: 4.8.4 - optional: true - trim-lines@3.0.1: {} triple-beam@1.4.1: {} trough@2.2.0: {} + trpc-to-mcp@1.3.2(@trpc/server@11.17.0(typescript@5.9.3))(better-auth@1.6.14(@opentelemetry/api@1.9.0)(better-sqlite3@12.10.0)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0))(mysql2@3.22.4(@types/node@24.12.4))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8)(vue@3.5.35(typescript@5.9.3)))(mcp-handler@1.1.0(@modelcontextprotocol/sdk@1.26.0(zod@4.4.3))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0)))(zod@4.4.3): + dependencies: + '@modelcontextprotocol/sdk': 1.26.0(zod@4.4.3) + '@trpc/server': 11.17.0(typescript@5.9.3) + better-auth: 1.6.14(@opentelemetry/api@1.9.0)(better-sqlite3@12.10.0)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0))(mysql2@3.22.4(@types/node@24.12.4))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8)(vue@3.5.35(typescript@5.9.3)) + mcp-handler: 1.1.0(@modelcontextprotocol/sdk@1.26.0(zod@4.4.3))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0)) + zod: 4.4.3 + transitivePeerDependencies: + - '@cfworker/json-schema' + - supports-color + trpc-to-openapi@3.3.0(patch_hash=2ca3c16af0fcca0c736697ad4fe553a14f794524fa9ce0d5c3e8ee4aea76090c)(@trpc/server@11.17.0(typescript@5.9.3))(zod-openapi@5.3.0(zod@4.4.3))(zod@4.4.3): dependencies: '@trpc/server': 11.17.0(typescript@5.9.3) @@ -17030,9 +18474,11 @@ snapshots: optionalDependencies: '@rollup/rollup-linux-x64-gnu': 4.6.1 - ts-mixer@6.0.4: {} - - ts-toolbelt@9.6.0: {} + truncate-json@3.0.1: + dependencies: + guess-json-indent: 3.0.1 + string-byte-length: 3.0.1 + string-byte-slice: 3.0.1 tsconfck@3.1.3(typescript@5.9.3): optionalDependencies: @@ -17081,8 +18527,6 @@ snapshots: tweetnacl@0.14.5: {} - type-fest@0.20.2: {} - type-fest@1.4.0: {} type-fest@2.19.0: {} @@ -17098,15 +18542,11 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - typed-array-buffer@1.0.3: + type-is@2.1.0: dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-typed-array: 1.1.15 - - types-ramda@0.30.1: - dependencies: - ts-toolbelt: 9.6.0 + content-type: 2.0.0 + media-typer: 1.1.0 + mime-types: 3.0.2 typescript@5.9.3: {} @@ -17129,6 +18569,10 @@ snapshots: undici@7.25.0: {} + unhead@2.1.15: + dependencies: + hookable: 6.1.1 + unicode-emoji-modifier-base@1.0.0: {} unicorn-magic@0.1.0: {} @@ -17149,6 +18593,11 @@ snapshots: dependencies: crypto-random-string: 4.0.0 + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.3 @@ -17172,6 +18621,12 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + universal-github-app-jwt@2.2.0: {} universal-user-agent@7.0.2: {} @@ -17180,8 +18635,6 @@ snapshots: unpipe@1.0.0: {} - unraw@3.0.0: {} - until-async@3.0.2: optional: true @@ -17193,11 +18646,6 @@ snapshots: url-join@5.0.0: {} - url-parse@1.5.10: - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - url-toolkit@2.2.5: {} use-callback-ref@1.3.3(@types/react@19.2.16)(react@19.2.7): @@ -17244,6 +18692,13 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 + vary@1.1.2: {} + + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + vfile-message@4.0.2: dependencies: '@types/unist': 3.0.3 @@ -17297,17 +18752,17 @@ snapshots: dependencies: global: 4.4.0 - vite-tsconfig-paths@6.1.1(typescript@5.9.3)(vite@7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)): + vite-tsconfig-paths@6.1.1(typescript@5.9.3)(vite@7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.3(typescript@5.9.3) - vite: 7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) + vite: 7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color - typescript - vite@7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0): + vite@7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.4) @@ -17320,15 +18775,15 @@ snapshots: fsevents: 2.3.3 jiti: 1.21.7 sass: 1.100.0 - sugarss: 5.0.0(postcss@8.5.8) + sugarss: 5.0.0(postcss@8.5.15) terser: 5.46.1 tsx: 4.21.0 yaml: 2.9.0 - vitest@4.1.8(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1(@noble/hashes@2.0.1))(msw@2.14.6(@types/node@24.12.4)(typescript@5.9.3))(vite@7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)): + vitest@4.1.8(@opentelemetry/api@1.9.0)(@types/node@24.12.4)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1(@noble/hashes@2.0.1))(msw@2.14.6(@types/node@24.12.4)(typescript@5.9.3))(vite@7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.8 - '@vitest/mocker': 4.1.8(msw@2.14.6(@types/node@24.12.4)(typescript@5.9.3))(vite@7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + '@vitest/mocker': 4.1.8(msw@2.14.6(@types/node@24.12.4)(typescript@5.9.3))(vite@7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.8 '@vitest/runner': 4.1.8 '@vitest/snapshot': 4.1.8 @@ -17345,9 +18800,10 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vite: 7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) + vite: 7.1.12(@types/node@24.12.4)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: + '@opentelemetry/api': 1.9.0 '@types/node': 24.12.4 '@vitest/coverage-v8': 4.1.8(vitest@4.1.8) '@vitest/ui': 4.1.8(vitest@4.1.8) @@ -17355,6 +18811,24 @@ snapshots: transitivePeerDependencies: - msw + vue-component-type-helpers@3.3.3: {} + + vue-demi@0.14.10(vue@3.5.35(typescript@5.9.3)): + dependencies: + vue: 3.5.35(typescript@5.9.3) + + vue-sonner@1.3.2: {} + + vue@3.5.35(typescript@5.9.3): + dependencies: + '@vue/compiler-dom': 3.5.35 + '@vue/compiler-sfc': 3.5.35 + '@vue/runtime-dom': 3.5.35 + '@vue/server-renderer': 3.5.35(vue@3.5.35(typescript@5.9.3)) + '@vue/shared': 3.5.35 + optionalDependencies: + typescript: 5.9.3 + w3c-keyname@2.2.8: {} w3c-xmlserializer@5.0.0: @@ -17366,8 +18840,7 @@ snapshots: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - web-tree-sitter@0.24.5: - optional: true + web-namespaces@2.0.1: {} webidl-conversions@3.0.1: {} @@ -17375,7 +18848,7 @@ snapshots: webpack-sources@3.5.0: {} - webpack@5.107.1(postcss@8.5.8): + webpack@5.107.1(postcss@8.5.15): dependencies: '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 @@ -17397,7 +18870,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.3 - terser-webpack-plugin: 5.6.0(postcss@8.5.8)(webpack@5.107.1(postcss@8.5.8)) + terser-webpack-plugin: 5.6.0(postcss@8.5.15)(webpack@5.107.1(postcss@8.5.15)) watchpack: 2.5.1 webpack-sources: 3.5.0 transitivePeerDependencies: @@ -17429,16 +18902,6 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - which-typed-array@1.1.19: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - for-each: 0.3.5 - get-proto: 1.0.1 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - which@2.0.2: dependencies: isexe: 2.0.0 @@ -17507,10 +18970,6 @@ snapshots: xcase@2.0.1: {} - xml-but-prettier@1.0.1: - dependencies: - repeat-string: 1.6.1 - xml-js@1.6.11: dependencies: sax: 1.4.1 @@ -17533,8 +18992,6 @@ snapshots: sax: 1.4.1 xmlbuilder: 11.0.1 - xml@1.0.1: {} - xmlbuilder@11.0.1: {} xmlchars@2.2.0: {} @@ -17545,6 +19002,8 @@ snapshots: yallist@3.1.1: {} + yallist@4.0.0: {} + yaml@2.9.0: {} yargs-parser@20.2.9: {} @@ -17586,8 +19045,6 @@ snapshots: yoctocolors@2.1.1: {} - zenscroll@4.0.2: {} - zip-stream@6.0.1: dependencies: archiver-utils: 5.0.2 @@ -17603,6 +19060,10 @@ snapshots: dependencies: zod: 4.4.3 + zod-to-json-schema@3.25.2(zod@4.4.3): + dependencies: + zod: 4.4.3 + zod-validation-error@5.0.0(zod@4.4.3): dependencies: zod: 4.4.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 94f6fadd8..da1c3f94e 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -21,6 +21,7 @@ catalog: "@immich/sdk": ^2.7.5 "@jellyfin/sdk": ^0.13.0 "@kubernetes/client-node": ^1.4.0 + "@modelcontextprotocol/sdk": 1.26.0 "@mantine/charts": ^9.3.0 "@mantine/colors-generator": ^9.3.0 "@mantine/core": ^9.3.0 @@ -86,7 +87,7 @@ catalog: "@types/prismjs": ^1.26.6 "@types/react": 19.2.16 "@types/react-dom": 19.2.3 - "@types/swagger-ui-react": ^5.18.0 + "@scalar/api-reference-react": ^0.9.34 "@types/video.js": ^7.3.58 "@types/ws": ^8.18.1 "@types/xml2js": ^0.4.14 @@ -137,6 +138,7 @@ catalog: lucide-react: ^1.17.0 mantine-datatable: ^9.2.2 mantine-react-table: npm:mantine-react-table-open@9.0.3 + mcp-handler: ^1.1.0 maria2: ^0.4.1 mysql2: 3.22.4 next: 16.2.7 @@ -162,9 +164,9 @@ catalog: semver-parser: ^4.2.1 superjson: 2.2.6 svgson: ^5.3.1 - swagger-ui-react: ^5.32.6 testcontainers: ^12.0.1 timezones-ical-library: ^2.2.0 + trpc-to-mcp: ^1.3.2 trpc-to-openapi: ^3.3.0 tsdav: ^2.2.2 tsx: 4.20.4