From 9813622998a17835c022b4ee4c57be6e8864604e Mon Sep 17 00:00:00 2001 From: chronark Date: Fri, 4 Oct 2024 12:51:42 +0200 Subject: [PATCH 1/3] feat: move eng docs to fuma --- apps/engineering/.gitignore | 28 + apps/engineering/README.md | 27 +- apps/engineering/app/(home)/layout.tsx | 11 + apps/engineering/app/(home)/page.tsx | 16 + apps/engineering/app/api/search/route.ts | 12 + .../engineering/app/docs/[[...slug]]/page.tsx | 44 + apps/engineering/app/docs/layout.tsx | 49 + apps/engineering/app/global.css | 3 + apps/engineering/app/layout.config.tsx | 26 + apps/engineering/app/layout.tsx | 22 + apps/engineering/app/source.ts | 8 + .../content/docs/api-design/errors.mdx | 31 + .../content/docs/api-design/index.mdx | 17 + .../content/docs/api-design/meta.json | 3 + .../content/docs/api-design/rpc.mdx | 36 + .../content/docs/architecture/index.mdx | 6 + .../content/docs/architecture/meta.json | 3 + apps/engineering/content/docs/index.mdx | 13 + apps/engineering/content/docs/meta.json | 3 + .../content/docs/services/meta.json | 7 + .../{ => content/docs}/services/vault.mdx | 5 +- apps/engineering/content/docs/test.mdx | 17 + apps/engineering/errors.mdx | 124 -- apps/engineering/introduction.mdx | 8 - apps/engineering/mint.json | 68 - apps/engineering/next.config.mjs | 10 + apps/engineering/package.json | 29 +- apps/engineering/postcss.config.js | 6 + .../engineering/rfcs/0001-retrieving-keys.mdx | 97 -- apps/engineering/source.config.ts | 5 + apps/engineering/tailwind.config.js | 13 + apps/engineering/tsconfig.json | 29 + apps/engineering/unkey.png | Bin 26196 -> 0 bytes biome.json | 6 +- packages/api/package.json | 11 +- packages/api/src/openapi.d.ts | 11 +- pnpm-lock.yaml | 1485 +++++++++++++++-- tools/migrate/auditlog-import.ts | 4 - tools/migrate/main.ts | 2 - tools/migrate/tinybird-export.ts | 2 - 40 files changed, 1862 insertions(+), 435 deletions(-) create mode 100644 apps/engineering/.gitignore create mode 100644 apps/engineering/app/(home)/layout.tsx create mode 100644 apps/engineering/app/(home)/page.tsx create mode 100644 apps/engineering/app/api/search/route.ts create mode 100644 apps/engineering/app/docs/[[...slug]]/page.tsx create mode 100644 apps/engineering/app/docs/layout.tsx create mode 100644 apps/engineering/app/global.css create mode 100644 apps/engineering/app/layout.config.tsx create mode 100644 apps/engineering/app/layout.tsx create mode 100644 apps/engineering/app/source.ts create mode 100644 apps/engineering/content/docs/api-design/errors.mdx create mode 100644 apps/engineering/content/docs/api-design/index.mdx create mode 100644 apps/engineering/content/docs/api-design/meta.json create mode 100644 apps/engineering/content/docs/api-design/rpc.mdx create mode 100644 apps/engineering/content/docs/architecture/index.mdx create mode 100644 apps/engineering/content/docs/architecture/meta.json create mode 100644 apps/engineering/content/docs/index.mdx create mode 100644 apps/engineering/content/docs/meta.json create mode 100644 apps/engineering/content/docs/services/meta.json rename apps/engineering/{ => content/docs}/services/vault.mdx (95%) create mode 100644 apps/engineering/content/docs/test.mdx delete mode 100644 apps/engineering/errors.mdx delete mode 100644 apps/engineering/introduction.mdx delete mode 100644 apps/engineering/mint.json create mode 100644 apps/engineering/next.config.mjs create mode 100644 apps/engineering/postcss.config.js delete mode 100644 apps/engineering/rfcs/0001-retrieving-keys.mdx create mode 100644 apps/engineering/source.config.ts create mode 100644 apps/engineering/tailwind.config.js create mode 100644 apps/engineering/tsconfig.json delete mode 100644 apps/engineering/unkey.png diff --git a/apps/engineering/.gitignore b/apps/engineering/.gitignore new file mode 100644 index 0000000000..55a12ae71d --- /dev/null +++ b/apps/engineering/.gitignore @@ -0,0 +1,28 @@ +# deps +/node_modules + +# generated content +.contentlayer +.content-collections +.source + +# test & build +/coverage +/.next/ +/out/ +/build +*.tsbuildinfo + +# misc +.DS_Store +*.pem +/.pnp +.pnp.js +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# others +.env*.local +.vercel +next-env.d.ts \ No newline at end of file diff --git a/apps/engineering/README.md b/apps/engineering/README.md index 5462196c9f..ec5b1f09ce 100644 --- a/apps/engineering/README.md +++ b/apps/engineering/README.md @@ -1 +1,26 @@ -# Unkey Docs +# engineering + +This is a Next.js application generated with +[Create Fumadocs](https://github.com/fuma-nama/fumadocs). + +Run development server: + +```bash +npm run dev +# or +pnpm dev +# or +yarn dev +``` + +Open http://localhost:3000 with your browser to see the result. + +## Learn More + +To learn more about Next.js and Fumadocs, take a look at the following +resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js + features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. +- [Fumadocs](https://fumadocs.vercel.app) - learn about Fumadocs diff --git a/apps/engineering/app/(home)/layout.tsx b/apps/engineering/app/(home)/layout.tsx new file mode 100644 index 0000000000..8eeffdac2d --- /dev/null +++ b/apps/engineering/app/(home)/layout.tsx @@ -0,0 +1,11 @@ +import { HomeLayout } from "fumadocs-ui/home-layout"; +import type { ReactNode } from "react"; +import { baseOptions } from "../layout.config"; + +export default function Layout({ + children, +}: { + children: ReactNode; +}): React.ReactElement { + return {children}; +} diff --git a/apps/engineering/app/(home)/page.tsx b/apps/engineering/app/(home)/page.tsx new file mode 100644 index 0000000000..ca00343b39 --- /dev/null +++ b/apps/engineering/app/(home)/page.tsx @@ -0,0 +1,16 @@ +import Link from "next/link"; + +export default function HomePage() { + return ( +
+

Unkey Engineering

+

+ You can open{" "} + + /docs + {" "} + and see the documentation.{" "} +

+
+ ); +} diff --git a/apps/engineering/app/api/search/route.ts b/apps/engineering/app/api/search/route.ts new file mode 100644 index 0000000000..594d312d0e --- /dev/null +++ b/apps/engineering/app/api/search/route.ts @@ -0,0 +1,12 @@ +import { source } from "@/app/source"; +import { createSearchAPI } from "fumadocs-core/search/server"; + +export const { GET } = createSearchAPI("advanced", { + indexes: source.getPages().map((page) => ({ + title: page.data.title, + description: page.data.description, + structuredData: page.data.structuredData, + id: page.url, + url: page.url, + })), +}); diff --git a/apps/engineering/app/docs/[[...slug]]/page.tsx b/apps/engineering/app/docs/[[...slug]]/page.tsx new file mode 100644 index 0000000000..8bf221d24c --- /dev/null +++ b/apps/engineering/app/docs/[[...slug]]/page.tsx @@ -0,0 +1,44 @@ +import { source } from "@/app/source"; +import defaultMdxComponents from "fumadocs-ui/mdx"; +import { DocsBody, DocsDescription, DocsPage, DocsTitle } from "fumadocs-ui/page"; +import type { Metadata } from "next"; +import { notFound } from "next/navigation"; + +export default async function Page({ + params, +}: { + params: { slug?: string[] }; +}) { + const page = source.getPage(params.slug); + if (!page) { + notFound(); + } + + const MDX = page.data.body; + + return ( + + {page.data.title} + {page.data.description} + + + + + ); +} + +export async function generateStaticParams() { + return source.generateParams(); +} + +export function generateMetadata({ params }: { params: { slug?: string[] } }) { + const page = source.getPage(params.slug); + if (!page) { + notFound(); + } + + return { + title: page.data.title, + description: page.data.description, + } satisfies Metadata; +} diff --git a/apps/engineering/app/docs/layout.tsx b/apps/engineering/app/docs/layout.tsx new file mode 100644 index 0000000000..3c39eab355 --- /dev/null +++ b/apps/engineering/app/docs/layout.tsx @@ -0,0 +1,49 @@ +import { source } from "@/app/source"; +import { RootToggle } from "fumadocs-ui/components/layout/root-toggle"; +import { DocsLayout } from "fumadocs-ui/layout"; +import { Code, Component, Handshake, Terminal } from "lucide-react"; +import type { ReactNode } from "react"; +import { baseOptions } from "../layout.config"; + +export default function Layout({ children }: { children: ReactNode }) { + return ( + , + }, + { + title: "Company", + description: "How we work", + url: "/docs/company", + icon: , + }, + { + title: "API Design", + description: "Look and feel", + url: "/docs/api-design", + icon: , + }, + { + title: "Architecture", + description: "How does Unkey work", + url: "/docs/architecture", + icon: , + }, + ]} + /> + ), + }} + > + {children} + + ); +} diff --git a/apps/engineering/app/global.css b/apps/engineering/app/global.css new file mode 100644 index 0000000000..b5c61c9567 --- /dev/null +++ b/apps/engineering/app/global.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/apps/engineering/app/layout.config.tsx b/apps/engineering/app/layout.config.tsx new file mode 100644 index 0000000000..3e092e7b5f --- /dev/null +++ b/apps/engineering/app/layout.config.tsx @@ -0,0 +1,26 @@ +import type { HomeLayoutProps } from "fumadocs-ui/home-layout"; + +/** + * Shared layout configurations + * + * you can configure layouts individually from: + * Home Layout: app/(home)/layout.tsx + * Docs Layout: app/docs/layout.tsx + */ +export const baseOptions: HomeLayoutProps = { + nav: { + title: "Unkey Engineering", + }, + githubUrl: "https://github.com/unkeyed/unkey", + links: [ + { + text: "Documentation", + url: "/docs", + active: "nested-url", + }, + { + text: "GitHub", + url: "https://github.com/unkeyed/unkey", + }, + ], +}; diff --git a/apps/engineering/app/layout.tsx b/apps/engineering/app/layout.tsx new file mode 100644 index 0000000000..182e4dae01 --- /dev/null +++ b/apps/engineering/app/layout.tsx @@ -0,0 +1,22 @@ +import { Banner } from "fumadocs-ui/components/banner"; +import { RootProvider } from "fumadocs-ui/provider"; +import { Inter } from "next/font/google"; +import type { ReactNode } from "react"; +import "./global.css"; + +const inter = Inter({ + subsets: ["latin"], +}); + +export default function Layout({ children }: { children: ReactNode }) { + return ( + + + + The new place for our engineering docs + {children} + + + + ); +} diff --git a/apps/engineering/app/source.ts b/apps/engineering/app/source.ts new file mode 100644 index 0000000000..b433cd524b --- /dev/null +++ b/apps/engineering/app/source.ts @@ -0,0 +1,8 @@ +import { docs, meta } from "@/.source"; +import { loader } from "fumadocs-core/source"; +import { createMDXSource } from "fumadocs-mdx"; + +export const source = loader({ + baseUrl: "/docs", + source: createMDXSource(docs, meta), +}); diff --git a/apps/engineering/content/docs/api-design/errors.mdx b/apps/engineering/content/docs/api-design/errors.mdx new file mode 100644 index 0000000000..4abaa1c367 --- /dev/null +++ b/apps/engineering/content/docs/api-design/errors.mdx @@ -0,0 +1,31 @@ +--- +title: Errors +description: 'Error handling for Unkey APIs' +--- + + +Machine and human readable error codes + +The Unkey API returns machine readable error codes to quickly identify the type of error as well as link to the docs and a requestId. Please always include the requestId in your error report. + +```json +{ + error: { + code: "UNAUTHORIZED", + message: "We were unable to authorize your request. Either your key was missing, malformed or does not have the required permissions.", + docs: "https://unkey.api/docs/api-reference/errors/code/UNAUTHORIZEDT", + requestId: "req_1234567890" + } +} +``` + +If you can’t debug something on your own or think there is a bug, please get in touch with us on Discord or Email and provide the full error response. + + +## In the future + +When we move the API from cloudflare to stateful servers, we will expand upon this +to offer more error details to the user in a well defined format. + + +[RFC9457](https://www.rfc-editor.org/rfc/rfc9457.html) looks interesting. diff --git a/apps/engineering/content/docs/api-design/index.mdx b/apps/engineering/content/docs/api-design/index.mdx new file mode 100644 index 0000000000..c4be434855 --- /dev/null +++ b/apps/engineering/content/docs/api-design/index.mdx @@ -0,0 +1,17 @@ +--- +title: Introduction +description: How should our API look and feel. +--- + +Most of our users interact more with our API than with our dashboard. Therefore we need to carefully design the experience they will have. + + + + +## Goals for a great developer experience + +- must be intuitive and predictable across programming languages. +- must be helpful when things go wrong +- never leave the user alone without a clear action to resolve their issue +- must have excellent documentation. +- must be fast. diff --git a/apps/engineering/content/docs/api-design/meta.json b/apps/engineering/content/docs/api-design/meta.json new file mode 100644 index 0000000000..9d8e702976 --- /dev/null +++ b/apps/engineering/content/docs/api-design/meta.json @@ -0,0 +1,3 @@ +{ + "pages": ["rpc", "errors"] +} diff --git a/apps/engineering/content/docs/api-design/rpc.mdx b/apps/engineering/content/docs/api-design/rpc.mdx new file mode 100644 index 0000000000..21277c63ea --- /dev/null +++ b/apps/engineering/content/docs/api-design/rpc.mdx @@ -0,0 +1,36 @@ +--- +title: RPC style +description: Naming and method conventions +--- + +The Unkey API uses HTTP RPC-style methods and generally follow the schema: + +```bash +https://api.unkey.dev/{version}/{service}.{procedure} +``` +For example `GET https://api.unkey.dev/v1/apis.listKeys` to list all keys for an API. + +## HTTP Methods +We strictly use only `GET` and `POST` methods. `PUT` and `DELETE` are not used. + + +### GET +The `GET` methods is used for reading data. Filtering, sorting, or pagination is done via query parameters. + +``` +curl "https://api.unkey.dev/v1/keys.getKey?keyId=key_123" \ + -H "Authorization: Bearer " +``` + + +### POST +The `POST` method is used for creating, updating, and deleting data. Data is passed as `application/json` in the request body. + + +``` +curl -XPOST "https://api.unkey.dev/v1/keys.createKey" \ + -H "Authorization: Bearer " \ + -H "Content-Type: application/json" \ + -d '{ "apiId": "api_123", "name": "My Key" }' +``` + diff --git a/apps/engineering/content/docs/architecture/index.mdx b/apps/engineering/content/docs/architecture/index.mdx new file mode 100644 index 0000000000..1be26e70a3 --- /dev/null +++ b/apps/engineering/content/docs/architecture/index.mdx @@ -0,0 +1,6 @@ +--- +title: Overview +--- + + +Hello diff --git a/apps/engineering/content/docs/architecture/meta.json b/apps/engineering/content/docs/architecture/meta.json new file mode 100644 index 0000000000..d20d1407c8 --- /dev/null +++ b/apps/engineering/content/docs/architecture/meta.json @@ -0,0 +1,3 @@ +{ + "pages": ["index"] +} diff --git a/apps/engineering/content/docs/index.mdx b/apps/engineering/content/docs/index.mdx new file mode 100644 index 0000000000..986a7fa48d --- /dev/null +++ b/apps/engineering/content/docs/index.mdx @@ -0,0 +1,13 @@ +--- +title: Hello World +description: Your first document +--- + +Welcome to the docs! You can start writing documents in `/content/docs`. + +## What is Next? + + + + + diff --git a/apps/engineering/content/docs/meta.json b/apps/engineering/content/docs/meta.json new file mode 100644 index 0000000000..3c76f431a0 --- /dev/null +++ b/apps/engineering/content/docs/meta.json @@ -0,0 +1,3 @@ +{ + "pages": ["contributing", "api-design", "mdx", "cli"] +} diff --git a/apps/engineering/content/docs/services/meta.json b/apps/engineering/content/docs/services/meta.json new file mode 100644 index 0000000000..345c30afeb --- /dev/null +++ b/apps/engineering/content/docs/services/meta.json @@ -0,0 +1,7 @@ +{ + "title": "Fumadocs Core", + "description": "The headless library", + "icon": "Library", + "root": true, + "pages": [] +} diff --git a/apps/engineering/services/vault.mdx b/apps/engineering/content/docs/services/vault.mdx similarity index 95% rename from apps/engineering/services/vault.mdx rename to apps/engineering/content/docs/services/vault.mdx index 5985c6e8d6..258350b26d 100644 --- a/apps/engineering/services/vault.mdx +++ b/apps/engineering/content/docs/services/vault.mdx @@ -3,6 +3,7 @@ title: Vault description: Secure encryption of secrets without --- +import { Accordion, Accordions } from "fumadocs-ui/components/accordion" Vault is our encryption management service. It handles the full lifecycle of encrytion keys and allows you to encrypt and decrypt secrets. It does not store the secrets themselves. @@ -36,7 +37,7 @@ Putting all of your secrets alongside with the encryption keys opens up a securi - Only vault can decrypt the encryption keys and never hands out encryption keys to the outside world. - + An attacker can see the encrypted secrets, but they can't decrypt them. @@ -48,7 +49,7 @@ Putting all of your secrets alongside with the encryption keys opens up a securi If vault's database is compromised, it's not unlikely they also have access to the master key, used to decrypt the encryption-keys. In this case, the attacker may decrypt the encryption-keys, but still does not have access to the ciphertexts, as they are stored in the main database. - + ### Why a container and not cloudflare workers? diff --git a/apps/engineering/content/docs/test.mdx b/apps/engineering/content/docs/test.mdx new file mode 100644 index 0000000000..d1ee3a8670 --- /dev/null +++ b/apps/engineering/content/docs/test.mdx @@ -0,0 +1,17 @@ +--- +title: Components +description: Components +--- + +## Code Block + +```js +console.log('Hello World'); +``` + +## Cards + + + + + diff --git a/apps/engineering/errors.mdx b/apps/engineering/errors.mdx deleted file mode 100644 index 5687c4f495..0000000000 --- a/apps/engineering/errors.mdx +++ /dev/null @@ -1,124 +0,0 @@ ---- -title: Errors -description: 'Error handling for Unkey APIs' ---- - -Javascript's error handling is pretty horrible. Errors are thrown everywhere and rarely caught at the correct place. - -At Unkey we're counteracting this issue by explicitely returning errors where they may happen. - -Instead of guessing whether a function may throw an error, it's clerly typed and you can not forget to handle the error. -Not all errors can be handled immediately and you can of course choose to escalate it further, but at least they won't be forgotten. - - -## `@unkey/error` - -The `@unkey/error` package in `/internal/error` provides primitives for returning and handling errors as well as a few common error classes. - -Below will be a short introduction to each of the primitives - -### `Result` - -Functions should return a `Result` where the happy path response as well as all possible errors are strongly typed. - -```ts Example -import {type Result, Ok, Err, BaseError } from "@unkey/error" - -class DivisionByZeroError extends BaseError { - public type = "DivisionByZeroError" - public retry = false -} - -function divide(a: number, b: number): Result{ - if (b === 0){ - return Err(new DivisionByZeroError()) - } - return Ok(a / b) -} - - - -const { val: division, err } = divide(1, 0) -if (err) { - // handle error -} -// use division result -``` - - -### `Ok(v: V)` - -A helper to return a valid result. -`Ok()` can be used for void returns. - -### `Err(e: E)` - -A helper to return an error result. - -### `BaseError` - -The base error that all errors should extend from. - -Errors may specify: -- any number of key-value context that will be useful to debug later -- whether the error is retryable -- a cause, which is the error that cause this error if you want to wrap it. - -```ts BaseError -export abstract class BaseError extends Error { - public abstract readonly type: ErrorType; - public abstract readonly retry: boolean; - public readonly cause: BaseError | undefined; - public readonly context: TContext | undefined; -``` - - -## Creating a new Error - -Here's an example of a `SchemaError` that might happen when `zod` invalidates a schema. - -The static `fromZod` constructor is a nice utility added specifically for this error. - - -```ts schema-error.ts - -import type { ZodError } from "zod"; -import { generateErrorMessage } from "zod-error"; -import { BaseError } from "./base"; - -/** - * Parsing a permission query failed - */ -export class SchemaError extends BaseError<{ raw: unknown }> { - public readonly retry = false; - - static fromZod(e: ZodError, raw: unknown): SchemaError { - const message = generateErrorMessage(e.issues, { - maxErrors: 1, - delimiter: { - component: ": ", - }, - path: { - enabled: true, - type: "objectNotation", - label: "", - }, - code: { - enabled: true, - label: "", - }, - message: { - enabled: true, - label: "", - }, - }); - return new SchemaError(message, { - id: SchemaError.name, - context: { - raw: JSON.stringify(raw), - }, - }); - } -} - -``` \ No newline at end of file diff --git a/apps/engineering/introduction.mdx b/apps/engineering/introduction.mdx deleted file mode 100644 index 5fb2e5bbb9..0000000000 --- a/apps/engineering/introduction.mdx +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Overview -description: 'Welcome to the Unkey engineering docs!' ---- - -## What are engienering docs? - -This is the place we collect decisions, guides and thoughts about building Unkey. diff --git a/apps/engineering/mint.json b/apps/engineering/mint.json deleted file mode 100644 index 77f3b0ce76..0000000000 --- a/apps/engineering/mint.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "$schema": "https://mintlify.com/schema.json", - "name": "Unkey Engineering", - "colors": { - "primary": "#09090b", - "light": "#EAE6E0", - "dark": "#18181b", - "background": { - "light": "#fafaf9", - "dark": "#0c0a09" - } - }, - "feedback": { - "raiseIssue": true, - "suggestEdit": true, - "thumbsRating": true - }, - "favicon": "/unkey.png", - "topbarLinks": [ - { - "name": "Discord", - "url": "https://unkey.com/discord" - }, - { - "name": "Dashboard", - "url": "https://app.unkey.com" - } - ], - "topbarCtaButton": { - "type": "github", - "url": "https://github.com/unkeyed/unkey" - }, - "tabs": [ - { - "name": "RFCs", - "url": "rfcs" - } - ], - "navigation": [ - { - "group": "Get Started", - "pages": ["introduction"] - }, - { - "group": "Errors", - "icon": "triangle-exclamation", - "pages": ["errors"] - }, - { - "group": "Services", - "icon": "vault", - "pages": ["services/vault"] - }, - { - "group": "RFCs", - "pages": ["rfcs/0001-retrieving-keys"] - } - ], - "footerSocials": { - "twitter": "https://twitter.com/unkeydev", - "github": "https://github.com/unkeyed/unkey" - }, - "analytics": { - "posthog": { - "apiKey": "phc_kCLW6KdzuihzMqTuJ6PNC4sHP7ipArtEAF8uUH2V5Yt" - } - } -} diff --git a/apps/engineering/next.config.mjs b/apps/engineering/next.config.mjs new file mode 100644 index 0000000000..50894e976d --- /dev/null +++ b/apps/engineering/next.config.mjs @@ -0,0 +1,10 @@ +import { createMDX } from "fumadocs-mdx/next"; + +const withMDX = createMDX(); + +/** @type {import('next').NextConfig} */ +const config = { + reactStrictMode: true, +}; + +export default withMDX(config); diff --git a/apps/engineering/package.json b/apps/engineering/package.json index b98ceff026..ae0cd28cdb 100644 --- a/apps/engineering/package.json +++ b/apps/engineering/package.json @@ -1,13 +1,30 @@ { - "name": "@unkey/engineering", - "version": "1.0.0", + "name": "engineering", + "version": "0.0.0", "private": true, "scripts": { - "dev": "mintlify dev" + "build": "next build", + "dev": "next dev", + "start": "next start", + "postinstall": "fumadocs-mdx" + }, + "dependencies": { + "fumadocs-core": "13.4.10", + "fumadocs-mdx": "10.0.2", + "fumadocs-ui": "13.4.10", + "lucide-react": "^0.378.0", + "next": "^14.2.8", + "react": "^18.3.1", + "react-dom": "^18.3.1" }, - "keywords": [], - "author": "Andreas Thomas & James Perkins", "devDependencies": { - "mintlify": "^4.0.160" + "@types/mdx": "^2.0.13", + "@types/node": "22.5.4", + "@types/react": "^18.3.5", + "@types/react-dom": "^18.3.0", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.45", + "tailwindcss": "^3.4.10", + "typescript": "^5.5.4" } } diff --git a/apps/engineering/postcss.config.js b/apps/engineering/postcss.config.js new file mode 100644 index 0000000000..12a703d900 --- /dev/null +++ b/apps/engineering/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/apps/engineering/rfcs/0001-retrieving-keys.mdx b/apps/engineering/rfcs/0001-retrieving-keys.mdx deleted file mode 100644 index 806cb7da33..0000000000 --- a/apps/engineering/rfcs/0001-retrieving-keys.mdx +++ /dev/null @@ -1,97 +0,0 @@ ---- -title: 0001-retrieving-keys -description: Retrieving keys ---- - -``` -created: 2024-05-15 -author: Andreas Thomas -``` - -Retrieving keys is useful for playgrounds or showing them to the user in your UI. - -## Changelog - -- If a keyspace has encryption enabled, newly added keys will be stored as hash and encrypted -- Unkey rotates the encryption keys at least once every 30 days -- The /v1/keys.getKey and /v1/apis/listKeys endpoints can return plaintext keys if requested - -## Out of scope - -Retrieving and showing plaintext keys in our dashboard - -## Implementation - -Each tenant will have one or multiple data encryption keys (DEK), the DEK is used to encrypt data for that tenant, this could be keys or other secrets like headers in our gateway. We use a DEK per tenant because it makes it much easier to roll them, since we have to re-encrypt much less data at once. - -DEKs have a version and we always use the latest version for encryption. For Decrypting, we store a version field alongside the ciphertext and can use that to figure out which key to use for decryption. - -Periodically we will generate a new DEK and re-encrypt everything with the new DEK. After everything is re-encrypted, we can remove the old DEK. - -DEKs are secrets themselves, so we need to protect them. We will store them in a separate database and encrypt them using a master key. By storing them in a separate database, an attacker could gain access to our primary database and the master key, but still not be able to decrypt anything. It's a pain to do, but: - -> "We take security seriously and don't compromise in favour of velocity or user experience." - -## Considerations - -I think it would be a good idea to minimize the exposure of the master key, that means we will use it in as few services as possible. Instead of the dashboard, the API and other services doing the decryption themselves, we could offload this to a dedicated vault service and call that over https. - -An application would send the encrypted data to the vault service, where it would get decrypted and the decrypted data is sent back. Same thing for encrypting. - -A drawback of this separate service would be latency, not a huge problem when creating or reading keys, but not ideal for loading secrets in our gateway, for example when injecting headers before forwarding to the origin. We can cache the response from vault, but need to be careful where that data ends up at. Possibly we need to add a local encryption to our cache, which should be fine. - -## Flows - -### Encrypting - -1. A user creates a new key via the API -2. The API generates a plaintext key -3. The API sends the plaintext key to Vault -4. Vault reads the latest DEK from its own database and decrypts it using the master key -5. Vault encrypts and sends the iv and ciphertext back -6. The API stores the hash, iv and ciphertext in the db - -### Decrypting - -1. A user requests a key via /v1/keys.getKey?decrypt=true or similar -2. The API loads the key from the database, including the ciphertext, version and iv -3. The API makes a request to vault asking to decrypt it -4. Vault loads the correct DEK from its database and decrypts it -5. Vault uses the DEK to decrypt the user's key and sends it back to the API -6. The API returns a response to the user, including the plain text key - -### Key Rotation - -A big reason why we even use DEKs is that we can migrate smaller pieces of data. If we wouldn't use DEKs, we'd have to re-encrypt all of the data at once. Having a DEK per tenant, makes that much more manageable, although can still end up being a lot of data for larger tenants. - -DEK rotation -To rotate a DEK, we first create a new DEK, we then load all of the data that is encrypted with the current DEK, decrypt it and re-encrypt it with the new DEK. After all of the data has been reencrypted, we can delete the current DEK and the new DEK becomes the current DEK. - -Master key rotation -Similar to DEK rotation, we create a new Master key, and then reencrypt all of the DEKs. - - - -## Service type - -There are pros and cons for how we write and deploy this extra service. - - -Cloudflare worker -``` -+ decent latency from other workers -+ we can use drizzle too -- harder to cache, which has a latency impact -- caching in anything but memory, requires a local encryption as there is no guarantee of where that data ends up at -- needs a separate service to handle migrations, trigger or perhaps cf queues -- crypto api is shit -``` - -Golang service on koyeb -``` -+ nicer primitives for encryption -+ caching -+ self contained deployable -- different language, not everyone knows -- can't reuse some stuff like our tinybird zod schemas for audit logs -``` diff --git a/apps/engineering/source.config.ts b/apps/engineering/source.config.ts new file mode 100644 index 0000000000..44e043ba59 --- /dev/null +++ b/apps/engineering/source.config.ts @@ -0,0 +1,5 @@ +import { defineConfig, defineDocs } from "fumadocs-mdx/config"; + +export const { docs, meta } = defineDocs(); + +export default defineConfig(); diff --git a/apps/engineering/tailwind.config.js b/apps/engineering/tailwind.config.js new file mode 100644 index 0000000000..5b40413461 --- /dev/null +++ b/apps/engineering/tailwind.config.js @@ -0,0 +1,13 @@ +import { createPreset } from "fumadocs-ui/tailwind-plugin"; + +/** @type {import('tailwindcss').Config} */ +export default { + content: [ + "./components/**/*.{ts,tsx}", + "./app/**/*.{ts,tsx}", + "./content/**/*.{md,mdx}", + "./mdx-components.{ts,tsx}", + "./node_modules/fumadocs-ui/dist/**/*.js", + ], + presets: [createPreset()], +}; diff --git a/apps/engineering/tsconfig.json b/apps/engineering/tsconfig.json new file mode 100644 index 0000000000..47d1cd9d32 --- /dev/null +++ b/apps/engineering/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "target": "ESNext", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "paths": { + "@/*": ["./*"] + }, + "plugins": [ + { + "name": "next" + } + ] + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/apps/engineering/unkey.png b/apps/engineering/unkey.png deleted file mode 100644 index 405d65d4a0e508c9c8fe5c505e9c6bf9d47f3abe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26196 zcmeFZ`#;nF|39u$(!rSuqo{~bDTmD=IjoeiY>pv0) zymMRcJ_pA^*}d1%BkXr{Px6JcFWgUVTl#Wvh+Nov9k_G<{6F@a2Yl~?Z*dgR#HZQ+ zaJuLi>2Poq#U9_XKg_}5)Otrx2NrOEg|j4k-i5EGBh{8#Mt)2DJsSPIT~zOE&%^UN z_<6z8N|j4#0lPz@hn2x@ZEX*$rO5^d$ViII;E&#JvJ+? z)Q$CZb$$CCR^8`g@fzRvxDqQ#Q$CXZwvk} z3jTkT2xIet-wyrR*w|QV@d{mBit!2=8|s?dZQb2!MUOy%UJcpH_V6M4bzD$>4{lPc zfS==AiLimmAIO*Ta^P+YdM*ULHIUwLXuJ?1A*Rw!Te94VOv%DcK4fOL_qjhidw^q2 zgs}R_{AK<<84uj@>2s&0kHl)O)QI*1UE~!#QjeL=$JI$XnK}85nzg5TX6)3gr_=;) ztf%j;3l3;WZcl-YC3pTsv~Dh@ZJ-3hd-DxdW2=tZAl&2ILi5*X49ognU|`GT~LNxb^9ENfuyv;KuQ z$~spT9TC#GVcGf4$Yz>ROz6RxgU=3H&qI)qU`L*i(ibu9u|Ce=xv_FUSy1%y`n3wV zn3K8G#lV@*{Fp~EnA@1t5b#UXm{bbf`Ze{RJsh+;Dw`VyQ~74|^yahtW}Y^JIE(a@ zXkdD=gs^H%RzWxXBGLxCuaf-B^72B&$OV`3#==KWlvt-%i~0YmTAr2z$wFAxE zNgSSnoX0%sjvt_Zb>h(!;Pf3n#+z>5yMSc)wL_ChJAmvsEdThT3sZ#l5+up^!u;&S0?$bSoTDJ%n^U?bG|L%e!~H0 z*AXANtEUDdzOo83?l%mDb}723WBJlLl1R-M4hH4x)BvB%lT&9+9*U71RxwgR3vYnK zfgw@viK!-LtJvb76dwuHFh~q8G4STLqhFsM#ko#0SM`xxLs-;PngK89mUMAHciH@# z(eDsG*}{`^f3{Wc;|p5~6;>u<<)XJ%2s~0A#8Gkc<2RAcgO=m>lw~q%%cbgP z{k8PQe~Bkq$q;A_KXYX0cUx7(PCnf%>ZZOZEjf((IV}-CN9$5|KWmK zG@zTsNQ?)^z>%XuJ-52%AyO{Tsv{nYc^`C?h*EZJyJ+U3XBXf0ndq zuI}&Dl*NoZW*2);Tn}|E1DeU|Y#IgQIZ)5o_jOL-GD-Ih(A}x-mHD_o;I^YuF!pnC ze7F-5(=~sSw{+;2;2>C%-0p~w63Z{5klLys!Hlk7Nx00{3ppyi>yn%nhuH!A@Ay&l zz$d0q@iuX+1sIAQ1|>27Ms;LESKv5UpqA0!E6IJ94R%UMFJ+xn^<`=X7^7L-UpiK| zwQdI66|`KZoNSk{S7qN;^jxJ!L>E6FbTSn=B)H5dKp&EpQ@dMn;Ms z>4bHw3Y4yd1|D!<%%Nn6d?fi<1|(9X6N|shXuv+)p`>yBQDKK6PJsK6F+C0p(Plp0 zMwPyiwUIG0+sO<5{I=_r^lim4Qb3DZc{e{!zjdcNAHp9brUk*C$&8`hiMlFzDvBIv z%l<-#4<4rQs~Ml&oIoikc&4rb z@yWq-y!D5HvrGNN1?`|SycRGB3`4J<;EVzaePIm#bE>yb1r{meQNsuJ8VSM%@Xy zG%fc`9B^ph;$G<8&|rZmMBf+#3z(IpSrpC#nlEQp6$itXZV;Ze1=9T9q~?ue*Ug|) zyRB>%>2}8`D<0}`94tzk=Q^OsG(102;b{fOvxEJS;uS&LKBJ(zDQ<<}*N*yh|Zhl@tc{jp!5+>qtru*I&*C)GD%ilw2V+K@QMPxaAOz!SK!hj4@U(#ZBVyt zp0C0I&*PlO1};&QUmGY-%x}^EoC!t3!_sW)a~B92@+!qae&X+_s*PR6dd#4k9bX~I zADb~HenW|XGf>wF%~Fa~Tn6JI!rykVm6jvm8oI>!@YG(4v1D`09$o`WXx?xJ%q%0f zt))pCaD#+w#z4suwk|UDoRrhaxqrDgWP8yq292;GBCEf0C+uT~0o+nK4@5%Q9Gz}H zBJIBq(#NY!F|SC74PwcgA&Mn(t=eOkqQCUgIw~bkQ4W3aquHV^1Qml2tr^CVn4eNM zb7&csT3J2mm^QC*?4~(x9+<8CeZ7gpHse1Y>g z9u41Pp-ez4V~Gco5h2hFn8fvpHM=&FVo;nnI}PNEprzYXGc(F?ja;=0=aZDZwaomQ z#~#1mQ~{1-s+!kZL+A-6okiB0&@-e0Dg0M5LJCVzGVB*NXl=3GxvJ*aLXU98c&a#j&z4NmVZ8>M+IU{D1NhE zbO|iZv%(AyD_z8V%pW!DaCUd)@D$strT$rNYCZnH2W86dayB9tUiSBr7MY!wRiDJXCB!}yS>1%y8{YA7QIsQXOR~#d9oQpxRgoTH8x9ZePQtmw|6(mSBh{cr)22N zIC-hF3=4B{gU@fv#{S~3LpS7x^LV}H^Gww{r?ecIXcEPQ<^SUrB@!s8-kao6fq-o9 zt`!rmbCexm1KC4d4zH=JOmFNFgTSq#Q#Y~kQSnrQ`w}smd=)8eJLYYXsf)x*EjgzlVt*(-!C*kH;e?L(fZ@;a>4JF&=i< zG8_}mE;KL(@EX1TPJfd14ysp}_iFxA!BbRB2&ab%fCYW`KC>==SPmrl#{3a>_;Q?` zEHP6#$e&ICzcSO66?1(<`iS{+`}!O|#@q1{h)#W-GW6hYpwDjUqjd8@-V2YVHy6Jw zGW+H7I#8^ydPtK=`nuMeUCBrZjmNJG53x7h0p(~3ehku?Bf`J5n1}1rhIoDLq(TyO zqiJ5Hn7EP>Z#pu3)A9_W{7&#`$BsBGU(u>R{4FsR91lr(*PyylG6RBk!>^;Wo}Em-aIE1D+_dh|~j5@P!10X@EwX z<9f#K{c!Z%Zc{hsQ8W~cIdT(I6E;}im;7-yGBWQZX-P#xP%Sy%V|Y|Q?81kct4!lR z1?*y?f)K;tnlWF722XxWAJ3lK@dhJT9>$FQu|3D!mXx!bqM9ie8IZ$+?%`&i|8L9N-P5w@KFE+TfBd$gN7)HUa+b4{^`aM*`Ntab zQ^D#9bL$$(w(TfR&_X-E-k_SKXA|?Yx7S^SCVQEa>}CFd#-9l*kQ`WV90U53Pz#pm zl7Ef8dVz%c_bUNTUvT=-Op6h<*xcaBMT6Q*fkZ}{{8ew)GgusHXV3?hc7VnA-v*B$ znWwjEdm-6rRp0TPQ0FoM5kR&{zI7w@*GuCB1Dm?WqS`VO(>L&7(|)d-2Hw7OgtljmvBo>*_uUjf3 z=~*`TMQ14|1Rm;W-5bqFDbTR04W@X>l*Z1^Njm#Z>x%mgE$3 zYw}+dC-u%&UOT=@=u0&$>BA&cUG{uil}wR(Dz(Wz(sIZ42mhI*&qdh6z=8Fel99`u zuLjSu$>2PXikKAzmp*qCggMLfgNurt%2zd6t}G|n*}(IFs$mL{7N4}10DEz6;fk2r zBZIErg!=*ZCfmF)$J+D#23J~+`tPA3zvgs5Prfwg#111jj-+hXaaTpLI38KsYpz#P zX!urd8T@H!9?=rv4_Fy!#h?SgUknhJ1&LbQ)LmW2T#_y)f_E?Y6f9gA+6ltkZ;6Yv z(S&crS`yl;Os@ZxxqY1O>lxCLMri?mOs!FIFrp6oEsB%UGTHBN-HkYPERMv|TaF2h zl`9t+N-X7m($9__vFaCjFAZHls}+xKp;e`PHhLop6MBBlAj4ynau*Z4#w=so2|U&$%SD{tmY2q#tvAO5cdh91BT%E@R%70-0 zNB@q@poUrhS34ww8d_EdcS3fxtraqVn!3YI!TrT(9ZcX(wVrgKe1~?j^4u$Zq>U>W zl|rwn_~MV;;C?8>2CwHnpW5)WJkynVExSY+p9w8Ru~C}HHv>rRtPA8~33mM14Y_BP z#p&a$0T8`Qsg%HQ=pQsxhuWsMzOEoD{#U@RfGTLW%I`%!==;_0XRGFj%DqN{^d_E( z!Vs%TJ1-u)J+ieE|IreeicGlZ<_>*dEIHUQqgFiL!2`vWUK&PieTB0UFG>8@>(P!z z&xvc&c@G9%bAclJ`aIoIsLZ>Y!pPf5X?!`gJ>Z@Vi*Z z8M97XncBNi50`f%Z$IPO1H&=!*)1Y9P_Bk(@tSI=?*Lt1zcKHBEtl(N2L%uc3t9|& z9*Ab`oT48(g5cYut}I8X3(Oycws4|Di}>yF$8r&Z$RF7E3np9M8Fv`ubGes1 zq*5@cRIFdZtp1lq_uZQE2brq`lSsjRsDB8$I-HU7nQCc{%VNDn4^63+OxD3P2_e`b0+|QCDDcVt zyJ>REVHA8w81HWXN39_gd0B3)%0ApNHLNMRE#@ zsIPc7h^cQjU(H!4zHuP#3e-Cq;|seI)LsX&6;oLyJi-3_c`3V~-BIeid%WR*9;t12imI0uHUz#=5a7e}BwGbe>2 z=S?+)0sMSXqi3?Zz7l=#6tclp&psL+2u7M*@!|5{3o8eZF36vyoo2>;)T?8bEbiju zlwM_y3j%-XDU%~Dux>KxfLcn;(3P0?=ZOSq1oO1!A}K__yZ{&ag?F^%ukHP|_C>$aeWuXNin%g=9;z9hY%z_eriq zM2YX~cK`Omn=97}a36_X=X>*q%~6v(q{Y|;uq$l6``P2-O)Z-n+d}ku33+eMJ;?h5 z`RBE8FNBLxx9z=>r8jY2kzau{0GZ5ZoC-&J=+pGa4;WpXomsZ|8kW0y!>tt;O!Vk6 z@2x=Qi2Oj&^o_dPdG;gX`CQ{f7w9O+>78cp#*&uehW+=zyqS%y7jD&B0)}zFO(1uW z6LeAG*s3(Oh}7F}Xb#BjYfxyW=}O7;J*SH3biaNhXEtgxQ{In0tKi&Yr)kCbOVOT_ z`Rxyidw$RLYfwsN`|eXfJRV)z8}w0bQ;npNdhheMJ(+1>*WwU1n@5A5lLT%a+WhvG zZfTTsU_gZ(ski>>p(7GmE`UWti;MS)Au2(F1XDA(r_daWRL=9{1bXXew7@yW4(+pB z!Y%F>wCfKq7;dS&UR;hfa4p^5O;U@Xsmq?$&q-c2sv3OMVX-wQ8yK8) ztc`K%D;6g={D!#|(Q=;8_4-MqSPZ5JL*sifp>MCr>Gl@TnkHRX+yfW(N`(K6Z`e>4R#~qG7FcF$=@XuvL=$mCAp%!n|#v7a^o_qF?r( zt>WwdYfkwTvP^kuy$G11u`48qw$+jaq6AW5Iy@T)L**hho@kp1ITB=gOKG!#{=xIrepuSN=z+Il-QN&k81T+RYDs5-?Ul z-}sS^6@KP0#jm;SKO2_NHS5C6DyP66WapdNyX6~}ny4MCIDhh6=6)-%SPYS3{Fdf7 z&75~t*1@Mnm$9;+d!&-$fx|=^G>v*S=UPBe3$*r!9eFArM>0Zkf+uawP$jC-okd<_ zq`aBe&6a0Gx^%vK?$NBr_V`T3C(tbda|sRDS~VsuC|&A~S0@lFxlMu0p5PSqPMYSj zt3uqz7OKe#aJ?AlG@2`*h1;+?5Uci#-FZC}qbR57>CT{Pe72JONbsQ#!s z2ByUK(X&w?AkKyC+G$HtvrD83_ReFf1vCbCvEK_Fz_5_sYE35$ zS~0ITlrf%oJHsm!q{wfH^DUlNixO=|0DfcPxKKu{tQnYcHW}FJrsICy==zvhm<8+NL85>ZBNZJw&T-mm4jQFS zKav~V!w*QVx+`*bbNlg+tAZl%l)Rm}8LbYD|8{7n1<;>k;C{O@;7d7U*BLWd=A}UV zA{*v614y+hd8_`?vx+P3>4Gck_OTy+1;&269uICjZ`&@2EMs-FI+SYt@Wc)ZpJUZY zwP9^)?wvTWuRT9!{n_eB>?^Z&C-_Wh&6LmUi6V*g_e8^u$|#b1k^#Pn#>P3qO=#qa7%IU+(Xk1~SEAeMBKdFczxH>$@vFJ*m~dpHeG zW?EHz*4-zSh3($!kTn7DLl&_+$=t&Q@Rj6$;pw%JBB|%jmhq2m4u>2sJ#xWnptmXv zYL%{4?gd~sZI}3mb6%IJMj0F@?1~+hI*fX;rvXi;2F|R)T`Z7)4dsa8w)>9!>+2ePvzcY<0CC<2(81i0~KTcMLns6V%Qlzip zRaiNFMi-^Z56YIfhx4%MF1rjU=(!tf*x0`fXKU)n1^MR}7)1GqMC3mx&^k=mWwH2n zk#QLSVm3Q&_`sYa?{E4h?h6rv4VVu!C(C>@Vt1Fgk#t5#YF}A{O@?<)OJhN7><_&% z9?M?3dY@X_LwCHp1KE1g{dS^ zpYW(x54K#v(vAz#hww~5X$cYF9GGBp;e(Vl{0!aN1;y0IdinmZ2)xsr20te-I!hqt zne+C5?4tXU!bzH64FDnIoZIUG6?_EF#S^RD*W6;YVq#ZSK!h8lHEat2c+2KJVCag z%clYg9EwJ&jSL8npeas?etv#puu4TgQIw3Wj<y8CTZvW^U0Xiawi{hM$F#*t>TJH)QyS&Fa(K+T9_iIc;@iQvA_0Ck?Pw;D z*lfGJVt|4S1HnhiX-5x`@e5o zsgOjc*U z0GC=l1UmTsuJ2C1Y~R`a>8J^y_lMHE(m)cgUduMAWZC$+ym8`CvW;E0*Hc-U4t^y$ z#quMeL0oQ?W2K1J>?jP{qRa@{Pd-+{qD{6g1dvpE)yXqK>^^^=h6ed8OCL(4bvV$U zIjcy27hrAbzgqdS=$Om+NM&{oryp8^z6L7C;VGm+RG)hT3OhW!3&B;`!r$tfREZVU^812q8A-&o#}zTyO#&MMHma| zT*qwFfGP5;nnL1w7|8=sUAj4i_bxk*nEu{S4JKWKrFzN3Q<^=%fm>oXDIQ9l@^PH| za=Lt19AtuTb4sX6mz-MOXJ8NSYj(aN5YPQS?*T}lWaA9FBKC!aw16MrT)S|pRt#{q z$8_`tC_8V+?4GO+o?5^e`Jwvo9(9;aATF}}c0y|m!=eg{mYZIEVM}DVYSI`(os{k4 zb)2iM0kY^QRAmXhT1P@8fb-?=AN-N%Rn}q9<#`#md&w@A zrtT7$?EKP(9b?DaI%a|SE)(QF}O==Z;?G*G>ixPqG?7C#V?a2sBZIm zqa`&kug?bT7a*phSg{Kao~8^pqb7U$Z@%A8@58$ZjJg?7q1~5ii!cD=o03Ni(9bSu zrpz!TV1ffyeOLU>#BbO(zbx9Le+r^xfP(ekKYmZTVsLYazl0PDwJ6PJsLV^tuu*J} zv5khm@Xw>mQcp1bhT7s?KYyfqmDqjAr;^1@%68<8&Kq_vzucVn(&$B)-`glGcuQ=5 z(037r#;eSB$N_i5L@xZ@pEu{PLF1o=ZKM(*=IU{I9Tdk}!iIe*y)fnITRGY*`M85u z+e+UURN+L#mJ>Fg8rj>g}2W8 z@*P?}6Bsry{jsD_wo)`R$^(qaBiWS=b=Sws*E-@JyVYW{dY4Ts`~R)h^cQq?^}*Tw z>O&^U!)%;XOxUW{Ix4(hnC(Gs!#Qw#J@7epAt7dFd4k4F8N_G`USaqLB_QVB!p=k{ zXfg7y-q6hGv!bhPZLf?6Y^oq81`s{)f6+xsP2J}}+UdrFVO(*6WnfmkX-o!_9{ zN2bOzN4Yx_y91Azp(>8M!K?BRb_G`NbHr19)Dqp|t`5Z36yTsrN{>jCKP-bs=iFXc zR&{>WbJDAA=qDBE2qpG%?DOP5p!G8<|Hv{y*|TAFdcBQ$VDkrh0H2A+a$?x{Xj;qh z_~!3xA$)?|bKF^rn?% z9z)&T9-h4Mh|Ztv#vCIQHdddUi=HKFV0VN%F96GKpVw!rDC|+-7r{=TP^qGWguEPh z7Bp9I1!_MC?BN+aCRh4Or+4%ZVU@=w7GmtB+9+Z|5W zhI>Egt@@;uJZ0h?r;tw5et0G5;GSzl1iyT7XYE~fHCCpBBwdgu3$OfOwLk$)X4H0i z3FJ6bWN~rvJIuui$d3i(9xeiKNo;@os9;|2!a5gizN-tch6ahv_Itx5U!Riuth0ZZ z4xmEX@1?UFLRChB>R4eNhcX)(r(X+BsA6Etwyd@;!`)(XNcg0R-Rh8Sy9(S!{wlOL zr!UygcI8WPi9Nzf1cxwwa0abs_Qcha+%*F#dXrSBKh z)JP6Oc5Lxd5vqyTPz%42_kxyX*cobm+tEF~v$`g%ZD}a_W6>tV=nEE=#UN(6xkl`j zpaE_-TA#lssbr}E`_#nvRdSul$f4b_aFzTGkE)U5I5YHG+|F2nV;w9SjysCYu2$T-HJ-l!cLh;M8jBi))aCJmXu1D=hWHFqztt8X>2=X`tWmOaBo#d{Ly{$*<2)q>G;)*Zs`A zsmUYvvzFFzGUEd`zFFd%5qkv`(Ab(CKzc7*vnjYQc`r(l^CQp=VhB9VUt>XD1V)TzY7jKo*)CE-G5d|V= zN!O%xpizVZ-C|UUhTto@l8jg&b=G>xChczFrUewo z-U#1=AblSQ=>^U)gdHn}(TDJ39(kJ9T*K?+PO>#GGr&V#`NU))jdUe)Hh1F~!l_2N zR2`8E^shIBcU@@E!mM!ZrH5HLz;XN={lgo%-3#PsQXxinAyAsM0iLw4+Y*%^7In8o zY;Mn_!Pd>P?D1bnd4~UBD;@zWZoV=~-}bCfhled)+&PL}6B{%7x8Voc?~JAEp@*=* zf&?srt4-?8Zx}P3w3(3_<`-s`wT(x)HvRK%i=;CAjOZ7Y4}=PbNO0`)wOiK@XVh*B zW}Z@29`Ho0kvOJ4wY0Zxdt}%<^=HqMZNZqh^<5;MUsep|x@pCK7QSi93jLEU2d{#i z0ep`eFGCg+cU{@d-JY0Oh$C2m;*ft|Ou6T~4M*s!pdXBDz(j9s#B(QmqKoaWVphCQ zXwIM+YC&ODKmjhB zN%8LA;;Rps_jne}tj{|8q}e(;WxA3dR%%_*x+FDlcn@OpIOdH#;-{jX@Kwbrufiv-GMAZJ9-`Q; zBz`oGLUNaB{^@jF;gN{YUF)9DojWHGeg3vtMe>>!spAE@{Cam z|C#i%JL2HRFXj6$Uk-i*TX(K1;TLeKAT=1K#_ow^5fX!O*?0S3LS^r?gGyBek1Nkm z7^bBo+$^5|$s7S;;>gg7A9uPeU5sO(lLcvKLCZM|5ruM?p4Xl4%E{eb5$k9qix5tP z4pGw#;}sspR6n#XRdq6l(zU5~D_-muBNO8ds%7&(PZ>M)KuHnqm|57p^D0N&TAmwO zS84Ls_g<&k_bL2^b>AC|xLrvKNd{oM%D&1f8rosAJvMz8C=>IHzIUF$r+4@0WTgYn zULKc6HSL80g3Kn|LQr`O{*#0L;_ta43JsQz82`;HnNFOkzNF*Uv^3h2m9wLYXAcHs z4b$tLCL3js&Fm>Jky;q6<~+Ct=a2(*tid^%dp%}nz16sdRJN)589UF57+|-+&Z%(| zm*B<%yNVJa~^7I0vcWg&Nf>*^49>y^@&QTT%ddGsh7N#eQga})=SCU&#}ec-5xNZ250 zySYHAKe3)~Q?#uy{uH;3{X_6Ak}3j!O@S1HTqH*)QL{)XG6HrSWqZBqL)_|s0pQ`v zui4836U!r(E}F6CARqcUu;iEG>D46MB~tpW10pF5BGh0!gBD*+}aSX_ehG{MnkuLzS#89Na_JUh9vhps%y}bqv*~c z-hLi*@UPVB(o?16JVYx(#m!>d%dsOJUSYZnUoT!jr(`PB?m<<|V~fF7YZsbrxD(_P z<6%kbbpKi-YW!m-#mYFoYCSH4Q*yw#YgUNvXG5=s^_C3!HT`qaXDPbN%hzW2S#1S! z%dkK@ zv|E7W29i$oMlpyh2#f2PAGTxl^_)&Tjwsx7#)8%1+U58(6@rW!{TBo;`ESt`5pd)1 z81A+++pr<60w^N1kDc!NR~yhi*xKiK-mtjzPSWK*%BoiIg)beR1fbKdwut=G_Y=?d zDNJ=dt9mr2wm91uD`O}Ka9NkL7s!N90%B%h;~T)WHrc5ToJdnD+9eq9rd&4T)61w+ zGXNbt<9G5qSOa{MEFykrUyQ?q;Xmj36>Hg!liLF;N*2wTP9#VlC{8X+1@Q-wvq&qD zd@PmWG0zh+F5whdTnxh7&u&7$V9QaqV|LtgpYQBLr@tXRBL@RY39}QHm&+6F!vLR% zQ5MQeqRmxY`fgV?myex&v{m}S8mUb}`LYajLqv^NF4)^Ocm%tOidDO@ClSjk|Is`m zj~8FQ_Iw~)lCh+ECj9Jwv(Pi<)b}VKOr1 zVepFCPrv%iE?RAQpMN}26y}sdIlAYXHS4@mrkQ5X9#;dukq();f-t`#^qu_ce_b}E z%YZPcC#7ZF*HEW2e~HgGliT%Q+iZ9J%#GcIuM^6h5ejZDmgQKL%s!QUM;GY(vG~WF z`rJ_kd?xntt|ePL++T`2)MM}5fb&ItvLwq&YQ!5}c19Rg#gs~&l?sM_&AkOI8Sii$ z2Osy52`#@z7v8sGs&r08NgjwyTbMANK;*HeemF4&JU-+}$UUg~I>vHRf!ppn@~T(2 z=&$yfs&C#qtH<`4m^u%V%21y7%N_$s(v-@ReG>lx7VwI2f%wW<-`SNO&k}TO>G1lO zlpyI_^k1*Q%WuTPH%8RO=F%T#7$LIT%=M0AkrX9{XHRQB z!|jve1ju>F5!Lm!Z?ZUl*)~&qM*`z72-A=_cnMs!o$;?*l&$4DMMF3$zQDEU`0|>BAtUJ_CDEDY-uEf>+rrIv(Dd9`En2fwd`6Xa8=I6 z30#j9wOlP#_SjIQ?O^OiMGY^;J;B%D_t(2;#DoKe{onA{C* znCpRkgAb7gZ)x)f=ydV(iW%~)6_+5-_o8kXnN14!KT+Ny>LyOKOP>79B6S$x`C}TZ zjmDUOdj0O3*ldhKn~=hPYOaDs1mDTyVBeK4b>bIShu`aHF-gjT^V>dD9or~HOY<5Z z@TivW`uGWEDqz?t=YsxK#iE?DtJXA|z9t5>Y!k{EHg^iBoYMXDO>qyT8lRaNV{D0z zuJCF(FPIq&9IQClItxY}>Fq$lm5$Rgz!yg4Tm}&SI25rq@5xH-r{cjF(+*X7q;Y5U zWB(`S>_Zd7sRrU{eX}m38S)U=;MRwyZtr*A*(EIZuOHF7=qy!4Fi3kMqP`Op7{RJD zKkR*-F}_MKk{f$B-5`fJuTngmet(xs1@Qm5F^7`-Anm~E#;+(ngNA3sN;j*J4TH*`x2N>mS70$?F9gVkM`XcxeKmG*x=_n?G7fmlNO@ygg-U8J;; z5>J+E@C13u=o{yEtu)!L6bHL*H44!(e%dKD`KE6^nEuOl9SjA?;7TJNYs(Ec`1fU< z;!{Cfh?IhkMv0Ui+8?yOV*QY@oJ>?lU}b`-uhV9VA$IIEvJB4kI*4TEd$eAX@G=Il z?Sz=XYd_N2GPULdn+TW@7kj6cwMTRM%>8qz_MM#jkt=Pj)W*_4r^y;EIaZAF6<@;# zZN5#J1@kY?-qWLPYJYD|Qx3U*0ip{f$NSi;ph9ltJV{md1y^5(?m;d{PI8u9N2{N9i+>nZ9!LfFw0HkUW_wb#pM>yfFXC2r*mk!vu-2`nB4!l7 za1H!6liAr8`^K+HvfsRBgTA^_azpqdl;C6f@r2@6vX;>Wsm?}=vO#liXpl98^42^v zJ!COuIOJ#G8u}^V%5!$hZ*0Dk6Ly7@`tYdG@Kxtqk6vvC(C0}!s)jBdYfGVjFXr08 zvR!3>Tw$R*bJN-BiO8Qif7cH8tytA8Wh!ZURUEAILVtMNXH*q5;M%Pc)~NzQ3`gW% zgKeDgJbcXb^^+v_r?6|k6|^ChA8q`}Ay@QyEL(vy%YL!y9jYzYpuNuH0u*V&v|XH1 zCJztLwog_63vWHGlkAEg&WEmsjE21|E-$0lT7no9e#x?hK3_i%=Fxv=A95b1yhXa1 z<*miO)epm>vDMO|u*uYz_b0ZLWbEwh$`}Mj{z8CrpjS{w%4~R!{!hL!a<{zg{IS5; znG|_T>-!_nV5q&^(6OY;)usk8|B4tbow;OHy7ME+=;~cp?xX$Ivh9Q?ZRk$RkgEB)(*5F_S6j%x~o@8^MhySQcgDY`LCwY zR{qu$36?6rZRxY{jmtI^Git-3nU|L&dZN)%pD}&~I#FE*{8H;b=L6eh(Xa;LBA;Jn zmta-&gQI!24xCPq#pWkJ?(l};(n1z~Et;t_@6g#+*7nkP?q`sG(x|)`J)!Gcflkpn zTMgegIg>#}4R$*VNpr7D*ak6muXM=x*E`t~*i+&8so<3q1ufQqB*AD5Ic6NT(J^@? zE6}a8FZ-&%jj;2DzJp#RHh$GL9j;(GJ9rrpU?6=l?&gRt;)yx?(JJdG;H-MRvVn<4e z1*My3MrGN{jU<@^unv_G%ywnhUt zpP#DyQ`wTLpS_4_mz}&?R~68>V8GMRN5$m&zNXdj*6>bJ`!(DxT!2GE$;TbJ1~>Tz zjnlO@x_%7=RnVux6|y@d;9A2t%2nzh$8YF?}| zS?3S;WY?~bpK`T#Mv6x-Eq$=F{esjk5@Yx~Ow6Z_CTsVY zAtx-sw%Y}mGMBPMYOmvT2@u7cXqA?8xtv%^kX;e2W0T9tlU@P3%+R%fe%eeI+u%i9 z$!X`UyxGz>bMI6YcjC5oPPsw1Ie%+j_3Ic`v)y^?H5Q z!(8xjY*Q)8#d%c!g4itKOiK)3jEKVsUA#o|R?R@D3|GJ1vM5 zf(Xb2$cnA(T=IU@;XFJwJ>Y)f7+$5It3(fJYA?MTQs2{8I?n;J=R7=nV)w{5K3Rv1 znfIebUJHI&ZccT1tQl8d0kr9@UULV151=aa9byAx`~e$}3Hp{o_GcDI+iH+p|o zN{r>>t_Hmu9K&{pqrYgTITFrLPB@W$=Rk;x;$-xZ;fR=J8PkvVysw#b82lHIo$-lt z_ZpZ#UlhG95;&m}Ru(_!w?nmb!UZ6!Z9sAm?vxpjs4pmVYgSisv`pKY^QYW zs|hOaRO71w>6Ezmf36-4IQ3UktdC!7$~oFWC%jaBc&bA~jD{Wg2J%2kPF7c?_1=!uUU6CvVLwKC1cZ<)0pOBkHflahUa5K39{78Ipff8p z{A_1vZhPqKq12kV(GJ^F#v!51dOdoEf0L-*@Es`RTu@y@_g#99PtcCF_)r{=_reHo z*jn7FOFQP#5o+@_7#sE3uQ5Ly{9;L$5@sZFgV?V7J{@P}68HK7VA)q~wn#~RD73$g ztTl}96;N5&Ms^rbDFJ|~-zhF?2}a|N^V=Del4rmacy@uf1$=nwgC3y9-!M5Ij$!tm zy+46G&2q-15`#^nP6p@0Q{BW!iqMd*w2JW@=vm=m*H%lLiTU?KP{KXigtPY_%CxSB zh3!sq7IJTv6L3Sx4KL=;<k>mIl+(W^`J>*qP1aPndH{p-+AV;tFdNcVTvgr< zwC}QK$S04GQFLX@e7I7`$dc@}YQD{tvYPEPlDVc3dRhFLEQ;j=x*`enan`16OLmU2 zdWYn@9=p31>vC^?ZSFLZdf*E;yJVtZTyC+Gt0q5zLMhJoPbPuw7cJCJNJ{KIDH*=$ z0|yWwRo0%^u6{8or^}+~*5D!Ep)lC#$%P5kn)Riwvg+lf)JY8)zfp&pjlkzKwmBia z_(@Mt6Jw%j(Yt!UQgYe;`_~qO2pEpV)mMP)dEIyA8$!8~Gyf!IB%RV}+9PPJ;k~hx zt&QGT4clGqP}*)+8cYhEbpiN|pT%FVu3K>j;g@n%uDOhbTVxMF(6FAG?fx3v&Kmn( zmU>%5SC+0U{*5d+O1Q~X~Vi_m?l5Xod`70F;iU{z~v89HJ1M5Ygrt3xNLrO%4V-j z4?(l8w(~I%* z?7!(lNn!eV&8$q<5+4w*l1iRg$J7WI$tgCO*PqPRt{wutr1ogzO_FQ>0_Fl5)|Gcc zIX##A)}CN53S3#yGIxbbXuAd6(JWpmd#B`1CU`m&1$7#%n}`iu$kTbof_2C!d)!-m zlM^w#7Bj52y{Nsrh;~hghqC9;SK_Mff>ucyNb&98f85r~rUx!M{B^5b+5XBdT1#io zxZisfAnG;MbGYyYLwxcECKcr5cmx(+e z=8uw6#W*xP43616G z9IyLKVBv_eakf$3%gsUvPLZE&=QHa7BQ)J|9Wu((hvs*)-=uxB`F@l=;_H1fKd?I@ zxiiw?wcX`~!;LEKE+}OK3d7{`wXS-Wb=fZKS@)VPGZVwayj2yHfRe$q^xdt=R=l@I z12fxU_u?CJH3s@_{#oh#xvxb4ZPeqYnAF7qJAMJJO0iQcbJn@sT;3W-J^kJS#%PlX zD@Z)HO<9a~n_J^HpX?JE7+IdSroCCB4I;lj-Jvl?A0w8OHB`r&Pb+hI#1b+B+{dz> zpG_H>KQ3FcNLg`yuW5#4*z(%Bc)3J2e)Sv|8(#YvI6Tyl99oS~*88<)NAP?KmWWsl^+S+C7#fO2**~(aKx2r5GoyRI5OE8gv9L!wjrV?$p_Tm3fN286 z`6eiqIMm^X+mroCCR1r0bAdW3kqLft3*xToJzJJ2^*LNO|JnlU5!=3xS?$>x; z&+BlZ_-*0#{S zUG=KvsO$7}a)s_3fl$`Dkg*Xs3BJg8P=5J-!YaqL%IW3i!MfEo{?m3Lbg*^@iI{E7 zth(YQf!w3VZkX6YJ~IwKum=I<3@T42*YuCB=gyQNLcp3ulFXQEBfOPe!kkOuBKvj2UK?)&xp zFE5(ef+$zqWsBohi9>CA%g(YUNL%tUzR=$pRt>h=%Efo%%4EIdg9xQtgzh)InPzot z`M~q4ps_+=H6cBUhydZ!ECJNKH@1_)3;yC1eyVYbkXFhj^q8Bd&$N=m6C+aPBoh{K z`Lp_*VF-9tETP(bFn7kNYzEp|rzdPHPn4s?7{mhQvlauh`#EN&E4X=2jnc_xgvES3 z8t7syde;fd4pe)RXV(j4)EfdPze{vW9fF7NBrH4(A3Flpj{0ZrOvXkN!~{ZWZQIaJ z&0fYH&#-7lV=$HEC1_>DmUqZVb!gwJ&1XSWZE1DkK-Ec`OUmt>A_V8$oMvd5F_CTi zH>h8Wy1#Kr1(m)JMv;~OA1)MOwQcfeR4#A#+wb=Kw?N>-R}GO#jf?M%>|_cl4!)>VJFEyvXE-ntKxQ>?w&;820|&I$JAleA$Im zVmi}yE@mJ8>JEFv5MyWCuebO%VQnLa%jm_T>_o&!&;FFeZe@(CFVO>uqdCj$l4N%a z!*=t}C=jvumtEK0rGlReNqPv=a2B#i;>h=_zzTWftAGSc{vPYX-f+?Ga4j;4H_S5< z+cmCnoBr8eiQM{S34x*XXt_w@0$Ydo2sz4qP^RUP={bfCvmtqQcaj+p>r)Oz6ZBLl z91cT^W*dfxBqro`sMvF?6=6#I!N=c|1|1lQ7{sh)cFd8!Hq77)j$Y^P) zA6>6oC)urJijm-(ZKjtY$@2j>MBZhg-9;$gaMQ|rC?@REz}1sBw`V{Yjjgh>aC?G+ zu`A85vOl7ImbJ#2>(J1$t?F@)LDd1$Qfk-f3*C{pTE4*gocSM56916uGQrifEyHNb zFxMwbEC4X%bODIU{n$L#*@RJKW!1)Jj$X{4_*6FNQZ}J*Ij*W#&T8bcZiZ+oGXxO` z^{F?H)%*5@G$9b{F0O8k-<1D$x>+{39`6rm>`wXOL@j?F^2iSQIJy)YZ+3h6btfr+PqPC)c+a}$g_eWHDl zle6SHcl8UxN>W*x;$Qs1_~5`2DR@N9oz;0LECv!;7L zP1Dmuxp~XwU9NiDO#hU8GsZc)ByVZuL;a$#Hy#ddQ(oaULC*&gm3XI_(|y+=BX_wh zMe3F=c{ZF}irRCNip`&`qweOa*z7A9S01+^p0Sm}$d+m~wQW3Uxm|wk?AUccFn#Q4 z3TMqU%O9rSW~s9MQ841y3I$!uUEvX;c6LODaF>(K)>xYcXy>Xr$st!cIR#js>OS~z-*aRtQysP$Qk3p(DQ?%;H!OL z<97y=*78MM-;vWM@CP8O=kTVe8;a&#Tk1KOw~#-H08>lQ2JK8yf zXII~!v)8?N-el~0qvto@kvZ^Th79q(j+Xv-Bk2M|XzWgeehx z!cY-p+OKp3*2{~wR#DXE)1*KNJL)S25SoI&um1F@g3q6_-)Ml$0+f5#benvJj_UhP z=+D@=WkzSt>NYnxtL8Jx(?-ViUTuVM|JArx4PLd-L9^%}!wi$02e~*vk%!rg2-PFz zF4_8FRcpcAa~3S3K}G773iYUxp`zXUgHO88XdecG`ytmIM09~BUAO~ZN+hJ&0f;wU zI%DK#F6K|6 z$&Yf(RL=GVIGFGEhlw&{XAK^$y()?H?0S|5(iT4Wr3cAcE}4v;z}$(7i3|55xjB*C zl{j?G_>OJTCf&KuN?HCML~XKMNnV&pWLiAh)AoCh+@d@%)xu7;_D5dyt#+`|g)t!1 zD6P3XB-`zR_uCfxmi!%)k<6uUVoo%GD$OA59=6=3O)VeRaRac8csOTz-4y`^P|0H! zYjmx$*VAq}rI)=s!X8<-_L2WnG(3`5M9`o*m zr2SjHs@4H+2xYfln+24dh+OHQ`I{J4Ov3&vNQL^$G=Hr1U+oGf&mB5?^4#J6+dzAz zIO~Ac)rnYq2G&u13j+H|`K)#T00R|pt^_l=4f1Dan6`Wjnh3X5NufsYDKx1V+56}=4d(7_~ z&^ac0yfb=_LRYEw5qlQ&2l}4a0xxVGJujgBo;y`hDhyN@z4$AsA3`8{PR@K7_ac26 zG@6Xxgsmpm>Uy}A(zDfVypOXYrW|v@Tom#_jN*Ysh$9;LUsZHM@S$5f7HYSh$GLmE&J)-ZN>!+SL*0@8Z z*vd;0Y4->5yIw2CLZoGEdFt#iCCr|fm92`ZE17qGxfU|7nXqeL%5fhIKlEP|j+?C|ALdHjb<1*i?rJ|Fsxc#+S%F~>{n)_Z+$9*#mO?Ix3<$W&# zgG6Dr_j~<3!ZavqNj}O?+CbtkCjQgTE_=T=z>RnW&G?p+cQ&07I$X?10*JJFt2%|t zeo4q(Gznv2I5i8agqi5woxl!&Dqcj=0S(6qNW8VE@0gX+VEO2>ZH^Pq>}VhxYzpI^ z&`Y`TOS|^YE$7t&Mo@nuRj9;!&y6MvC3`x~bQjP{wSFD%=~#Pc6t>0x?Idp0XraCv zsHXq;r@9CHrj++aLN8qs$R_rec3ir|Z%dF?4yuA-?o*n6To2DVPhzr zFYWQ8_~VE91!BN|#-?l5zT5#8p?1B>W&dk%cqymXpjQ=X zDPK@D!8I$RO${)(S7YlGQv2!QTPxtN zw-tpX|ILR0tTba^TG~d41hdS4AR9X&*lv|%K zZs5Z9B7g%XICJ8+L%4Z43~=!hEmG%~_7`IJ)51A=q74N~sb)HPhH2lQ$+c)^e7D$C zMx-SO>j!2QQ@+nzFsC2PguvJAwsepoRyc>nE5j3}_uN>0{$rOm~Y z`5yxaU!Jk;6Vh(OVBePTfyIN7srn{vFKm^>s~;gPCuh~K14WgQz~`}X3);;5aQk(S zYFA*j7461ZLkJ$&_BcMS3ESX@McNR~8mNBk>2)}L;n#)&`<22=sFPGtPnSTLN*aiD z;eLAXcx>5(l+U`pX`3?M?I9>n_)MTZDC`Ml8oHN{PyQo=76!`Pvbz3nEnbO0VKvz= zP_*;L{I+4M@wom{?iAfWry+!=(`_ynJrxtonHbR9Q9t|q{ZMs9uq4TijY6H;4-)Vw;GOceADFg%q#*>E%3@0N!fE2u|v4=C-z zcW1lyW~VW#Va$*pvj7**PUo!Eo^DIaverY!zV5h?w<{WERcBOh9zr~Cb?Ii-mz8ky zY9npuNqrhfgeb&Jt%Obn4L9fZzGq1ELhl?^ft7)%?-L1n?2D zcM0&mosJSpD9TyDrhoIb zHtk=O@t2KK^(#H1$2?MF-~X~JI!<8dN_VWvd0fe-bx}yvYRcN7#lHY?PE3lMQVZPH z?u)!J%Rw;auR18KVRYl0R=VBdQ?WGuc5#Pf+V3_HW12mds*zZRPkUJD(^!2Y7iKL2 zAShm@QryDJ1Pa_1RyT^=x;yVGk~5A7lgeZkYL(cq804##00%`r>Ip>9Kv%*7R36%p zw)st?t81sDD-Ch~+v)9t9HQ)AYjQi5JNb65kxi894mqT~T|>UHB&WkHGX#mxyIu`X()h0_m;v`FI_sng!y7 zTH?=MiW)gwTGeDH7b#a`{uxkOb3{&DR8^Q-m=68|ct&`dWQOw*4g+=&vQMnfi(ksD za2S1o$u|hu-)2Yc6|;gHK(Aa|Vn$|@u1)=om0Vq6gRbYMxhEA#oh8y7i~K>E#rR@t zAsABP-N1g&j3n{LV2Wj?L8B(41wAJ@<^Xsu5=1Dy0H4r&D%IUp4NllkU$5clq^KDp zU)+=Mu?|Q}5th-6SQDvJQZP?Zm=%s8VbM9B6t!dBDTzkc6jG@-7GHacWtFwud>=3L zhWo0xPS-G##W@t*2aIFcX4Fz#7JJ=U;Gs%d#5y2Z2LuhH0Y25Pk&!z7--$!_re$IP z*OCe9RH_zWI}%P^tDcTvqCkC)KRUc~;wc@e06vyoa8q5r`S=JOH8J7ho##Li-6q2v{;p0|vuVx96kwY%I=m ze(grC-VV?3DO5-LaDum$vAqD)r30$lL^*4l(j^T^NGu1w{yAr1Z+-zD(GnEi0`b-+ zGkgYy3Qp4W|IYtb(07w*E^~oiWj$z8oeLkC(aO!nhFc}-hJjw(1IfyHkYYQ*u?|-; zZ%$wzBP4)}R=zi5n$(!vK(v%#-<9y$(pl{@TQ|J_+k}+TM3J8_sQVs-g_i|y5ME=R zev+(cT{1ZJ3?1FX4Watu3o}NF7|K-E>OS}i^3+4Jrus6*6B!Qcz#oz}05XEsGo65? zoC#dYx@y~EB_5~f#B~k-*?E%4(cwUH4uo4+gbv|LgJIU^COeTqMXkG1u|)69PNm>^^{dhK<5M9T{Kr#RxOZ-5Xu?oeC9mrXQ%-Jx4D(PWS4c{OJ#`!C+0X{-Zl z)I78w516EgjUkT#Cs!(sj zru@KtNNj7{kT#K_)(EJ~-uDN~Rz9cye$Smad550kOlk_BqY;A;@RQk&5 zY}}{Z(NQL1P`}yc2YGgA@#|^go|N1huZSLOxrF`+9TqUG%ig-_#wMgX3%EA(;FQV&je00O9aQ`_VVLD6E`^z1*tH=K=DI2?$^LYy%>oi)lb zAJtz!L|p6(G1r9NxW@d|cU7s3k}(X36%*C@+tOZ?Irm;x#u~<^+kt?RF8}BAu2TMrCB=go!3IiLVCSJMSq*Tu#}Kh zxmg@PcUpy>*foLwI}ZTEa+1l@Z-t@@;)+xN@fEufX{MFVFgFpg2Y_QIUwzfJ4}8Zh zUaXcmY(8zoI<4>HXbClKui^z1&=bUEm7ESjcJ;E;p+c~G?DNNx zhhm%b5xD`;x8AnAo$QK;eB%@&$8#ZG zh9lC9a#Rq$Ml6#$j5$f%{Nrtjo}ukG8C(0D&qex;`j<*OpT|^919n7a;T;tavzPHp zWqB!I=^D0LyZxv=Lq<7y_-N+Q4}ypJKeVAHI@2W1PPXggW&DEC&8+hjX^9D~XWw4F z8o|>P?WO`>m{z|EjQQt%i-l!J(JX#L0*?Q3xJfwS0Ta5pLR>7{lsROb(6OH+`debJ6S5Z+sroutV2g z{W_r|S$mJ6aYiHYNFko6UO^VCGr~zPn=;qUc_TWcbQOP=Xr8uxnuao0eM=`61H z=N4bRIzVZT-6%})yxw;_?oY|xTtjC{jk2r~GM%_YSxzW4LuJb-sltllO!ho9?j#KJ z)nfo2%lCpu(nbI0{cevzyMPVA)f>H}&|+B?c!6F9{>>_93ZW{)SwIkENYn+N&UR zKRV?4RP!B8Y-W?WhF@aB`H+&clgkZ%eVOO;g#o&<;#jXZ13(%kT=U^&nxiI(JZ??` zL@CdzLi!;nOrAe=90e*3#f%r+0rzLYN{{lr0|Z?4a%zaP#zD>|{dlPPq)Us^cl_Fh z8r6>yPC{nphG&?PY%Z#(rPAvvkSAoCPSi)9R^XH3F{~g%Zb!eyF!TPt6A*kX6*5@( zxbzWaG;;VGi`&P_u9A^0MH+wX{7ZD92p0fO0`Uz2wqAUKFWtBoQibVWd5SORSMYwV zR+c$wUe5t}&>EIxuG{}8a3m9%XcECU_LaABf=^nzJ4t^ksh?L*NC`-byy!?t6d`^~ zzpLTccS-inJ7XyWGBWY}iu<84aUgusr{5V>IFm1<(X|E@9x1Xm`$GK=nCEiJ_Do9C zbFe5cpgFPX555+Fn(%$7cFb$NU>P-YmEtar@_TK4}mTGT-dbn{w74QWHYWdo{bw1saa<9ek_o+zaF5qXJjY z$2aC%eCsT56gYMm_$!M49sU=B|BZtGuZhsI&u>Kj%;@0j`g9OUjOA??V`Dxg;PY|d VeemirdvkEOZD68bc;n&I{{y*Y_ksWb diff --git a/biome.json b/biome.json index ee2c359c63..07a3aee16e 100644 --- a/biome.json +++ b/biome.json @@ -41,7 +41,8 @@ "./packages/api/src/openapi.d.ts", ".wrangler", ".react-email", - ".content-collections" + ".content-collections", + ".source" ] }, "formatter": { @@ -56,7 +57,8 @@ ".nuxt", ".wrangler", ".react-email", - ".content-collections" + ".content-collections", + ".source" ] }, "organizeImports": { diff --git a/packages/api/package.json b/packages/api/package.json index 784ed4432e..eec613c2f1 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -9,19 +9,12 @@ "publishConfig": { "access": "public" }, - "keywords": [ - "unkey", - "client", - "api" - ], + "keywords": ["unkey", "client", "api"], "bugs": { "url": "https://github.com/unkeyed/unkey/issues" }, "homepage": "https://github.com/unkeyed/unkey#readme", - "files": [ - "./dist/**", - "README.md" - ], + "files": ["./dist/**", "README.md"], "author": "Andreas Thomas ", "scripts": { "generate": "openapi-typescript https://api.unkey.dev/openapi.json -o ./src/openapi.d.ts", diff --git a/packages/api/src/openapi.d.ts b/packages/api/src/openapi.d.ts index fce1bc5bb0..8d534161f5 100644 --- a/packages/api/src/openapi.d.ts +++ b/packages/api/src/openapi.d.ts @@ -1150,10 +1150,19 @@ export interface operations { */ name?: string | null; /** - * @description The id of the tenant associated with this key. Use whatever reference you have in your system to identify the tenant. When verifying the key, we will send this field back to you, so you know who is accessing your API. + * @deprecated + * @description Deprecated, use `externalId` + * The id of the tenant associated with this key. Use whatever reference you have in your system to identify the tenant. When verifying the key, we will send this field back to you, so you know who is accessing your API. * @example user_123 */ ownerId?: string | null; + /** + * @description The id of the tenant associated with this key. Use whatever reference you have in your system to identify the tenant. When verifying the key, we will send this back to you, so you know who is accessing your API. + * Under the hood this upserts and connects an `ìdentity` for you. + * To disconnect the key from an identity, set `externalId: null`. + * @example user_123 + */ + externalId?: string | null; /** * @description Any additional metadata you want to store with the key * @example { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9f80188944..2a836af944 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -568,10 +568,53 @@ importers: version: 4.0.182(openapi-types@12.1.3)(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.3) apps/engineering: + dependencies: + fumadocs-core: + specifier: 13.4.10 + version: 13.4.10(@types/react@18.3.8)(next@14.2.10)(react-dom@18.3.1)(react@18.3.1) + fumadocs-mdx: + specifier: 10.0.2 + version: 10.0.2(fumadocs-core@13.4.10)(next@14.2.10) + fumadocs-ui: + specifier: 13.4.10 + version: 13.4.10(@types/react-dom@18.3.0)(@types/react@18.3.8)(next@14.2.10)(react-dom@18.3.1)(react@18.3.1)(tailwindcss@3.4.10) + lucide-react: + specifier: ^0.378.0 + version: 0.378.0(react@18.3.1) + next: + specifier: ^14.2.8 + version: 14.2.10(@babel/core@7.25.2)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) devDependencies: - mintlify: - specifier: ^4.0.160 - version: 4.0.182(openapi-types@12.1.3)(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.3) + '@types/mdx': + specifier: ^2.0.13 + version: 2.0.13 + '@types/node': + specifier: 22.5.4 + version: 22.5.4 + '@types/react': + specifier: ^18.3.5 + version: 18.3.8 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.0 + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.47) + postcss: + specifier: ^8.4.45 + version: 8.4.47 + tailwindcss: + specifier: ^3.4.10 + version: 3.4.10(ts-node@10.9.2) + typescript: + specifier: ^5.5.4 + version: 5.5.4 apps/logdrain: dependencies: @@ -1118,7 +1161,7 @@ importers: devDependencies: checkly: specifier: latest - version: 4.7.0(@types/node@20.14.9)(typescript@5.5.3) + version: 4.8.1(@types/node@20.14.9)(typescript@5.5.3) ts-node: specifier: 10.9.1 version: 10.9.1(@types/node@20.14.9)(typescript@5.5.3) @@ -3211,6 +3254,15 @@ packages: dev: true optional: true + /@esbuild/aix-ppc64@0.23.1: + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: false + optional: true + /@esbuild/android-arm64@0.17.19: resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} @@ -3264,6 +3316,15 @@ packages: dev: true optional: true + /@esbuild/android-arm64@0.23.1: + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + /@esbuild/android-arm@0.17.19: resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} engines: {node: '>=12'} @@ -3317,6 +3378,15 @@ packages: dev: true optional: true + /@esbuild/android-arm@0.23.1: + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + /@esbuild/android-x64@0.17.19: resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} @@ -3370,6 +3440,15 @@ packages: dev: true optional: true + /@esbuild/android-x64@0.23.1: + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + /@esbuild/darwin-arm64@0.17.19: resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} engines: {node: '>=12'} @@ -3423,6 +3502,15 @@ packages: dev: true optional: true + /@esbuild/darwin-arm64@0.23.1: + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@esbuild/darwin-x64@0.17.19: resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} @@ -3476,6 +3564,15 @@ packages: dev: true optional: true + /@esbuild/darwin-x64@0.23.1: + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@esbuild/freebsd-arm64@0.17.19: resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} engines: {node: '>=12'} @@ -3529,6 +3626,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-arm64@0.23.1: + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + /@esbuild/freebsd-x64@0.17.19: resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} engines: {node: '>=12'} @@ -3582,6 +3688,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-x64@0.23.1: + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-arm64@0.17.19: resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} @@ -3635,6 +3750,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm64@0.23.1: + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-arm@0.17.19: resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} @@ -3688,6 +3812,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm@0.23.1: + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-ia32@0.17.19: resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} @@ -3741,6 +3874,15 @@ packages: dev: true optional: true + /@esbuild/linux-ia32@0.23.1: + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-loong64@0.17.19: resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} engines: {node: '>=12'} @@ -3794,6 +3936,15 @@ packages: dev: true optional: true + /@esbuild/linux-loong64@0.23.1: + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-mips64el@0.17.19: resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} engines: {node: '>=12'} @@ -3847,6 +3998,15 @@ packages: dev: true optional: true + /@esbuild/linux-mips64el@0.23.1: + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-ppc64@0.17.19: resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} engines: {node: '>=12'} @@ -3900,6 +4060,15 @@ packages: dev: true optional: true + /@esbuild/linux-ppc64@0.23.1: + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-riscv64@0.17.19: resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} engines: {node: '>=12'} @@ -3953,6 +4122,15 @@ packages: dev: true optional: true + /@esbuild/linux-riscv64@0.23.1: + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-s390x@0.17.19: resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} engines: {node: '>=12'} @@ -4006,6 +4184,15 @@ packages: dev: true optional: true + /@esbuild/linux-s390x@0.23.1: + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-x64@0.17.19: resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} @@ -4059,6 +4246,15 @@ packages: dev: true optional: true + /@esbuild/linux-x64@0.23.1: + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/netbsd-x64@0.17.19: resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} @@ -4112,6 +4308,24 @@ packages: dev: true optional: true + /@esbuild/netbsd-x64@0.23.1: + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/openbsd-arm64@0.23.1: + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + /@esbuild/openbsd-x64@0.17.19: resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} @@ -4165,6 +4379,15 @@ packages: dev: true optional: true + /@esbuild/openbsd-x64@0.23.1: + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + /@esbuild/sunos-x64@0.17.19: resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} @@ -4218,6 +4441,15 @@ packages: dev: true optional: true + /@esbuild/sunos-x64@0.23.1: + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + /@esbuild/win32-arm64@0.17.19: resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} engines: {node: '>=12'} @@ -4271,6 +4503,15 @@ packages: dev: true optional: true + /@esbuild/win32-arm64@0.23.1: + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@esbuild/win32-ia32@0.17.19: resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} @@ -4324,6 +4565,15 @@ packages: dev: true optional: true + /@esbuild/win32-ia32@0.23.1: + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@esbuild/win32-x64@0.17.19: resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} engines: {node: '>=12'} @@ -4377,6 +4627,15 @@ packages: dev: true optional: true + /@esbuild/win32-x64@0.23.1: + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@eslint-community/eslint-utils@4.4.0(eslint@9.11.1): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5235,7 +5494,6 @@ packages: vfile: 6.0.3 transitivePeerDependencies: - supports-color - dev: true /@mdx-js/react@2.3.0(react@18.3.1): resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} @@ -5834,35 +6092,25 @@ packages: - typescript dev: true - /@oclif/core@3.27.0: - resolution: {integrity: sha512-Fg93aNFvXzBq5L7ztVHFP2nYwWU1oTCq48G0TjF/qC1UN36KWa2H5Hsm72kERd5x/sjy2M2Tn4kDEorUlpXOlw==} + /@oclif/core@4.0.26: + resolution: {integrity: sha512-Gtgj7l+XYYk4wqJ7fTd+fsuKusuQESrSbeue+pC1UGJWt9tyrn3TNZu/lGJSSvEQVcxZY+y09hTET+1e1bmULA==} engines: {node: '>=18.0.0'} dependencies: - '@types/cli-progress': 3.11.6 ansi-escapes: 4.3.2 - ansi-styles: 4.3.0 - cardinal: 2.1.1 - chalk: 4.1.2 + ansis: 3.3.2 clean-stack: 3.0.1 - cli-progress: 3.12.0 - color: 4.2.3 + cli-spinners: 2.9.2 debug: 4.3.7(supports-color@8.1.1) ejs: 3.1.10 get-package-type: 0.1.0 globby: 11.1.0 - hyperlinker: 1.0.0 indent-string: 4.0.0 - is-wsl: 2.2.0 - js-yaml: 3.14.1 + is-wsl: 3.1.0 + lilconfig: 3.1.2 minimatch: 9.0.5 - natural-orderby: 2.0.3 - object-treeify: 1.1.33 - password-prompt: 1.1.3 - slice-ansi: 4.0.0 + semver: 7.6.3 string-width: 4.2.3 - strip-ansi: 6.0.1 supports-color: 8.1.1 - supports-hyperlinks: 2.3.0 widest-line: 3.1.0 wordwrap: 1.0.0 wrap-ansi: 7.0.0 @@ -5894,18 +6142,20 @@ packages: - typescript dev: true - /@oclif/plugin-plugins@4.1.12: - resolution: {integrity: sha512-lYNoqoQJz+p4AOMZ9N5k7OkLk/HZJSdaybJ4rWfDZ76pQ7AcrLEPtREi2wLfcwcrzKoBMsrwBoMTf3PnmpW7ZQ==} + /@oclif/plugin-plugins@5.4.4: + resolution: {integrity: sha512-p30fo3JPtbOqTJOX9A/8qKV/14XWt8xFgG/goVfIkuKBAO+cdY78ag8pYatlpzsYzJhO27X1MFn0WkkPWo36Ww==} engines: {node: '>=18.0.0'} dependencies: - '@oclif/core': 3.27.0 - chalk: 5.3.0 + '@oclif/core': 4.0.26 + ansis: 3.3.2 debug: 4.3.7(supports-color@8.1.1) - npm: 10.2.3 - npm-run-path: 4.0.1 + npm: 10.8.3 + npm-package-arg: 11.0.3 + npm-run-path: 5.3.0 + object-treeify: 4.0.1 semver: 7.6.3 - shelljs: 0.8.5 validate-npm-package-name: 5.0.1 + which: 4.0.0 yarn: 1.22.22 transitivePeerDependencies: - supports-color @@ -6877,6 +7127,10 @@ packages: '@babel/runtime': 7.25.6 dev: false + /@radix-ui/number@1.1.0: + resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} + dev: false + /@radix-ui/primitive@1.0.0: resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==} dependencies: @@ -6947,6 +7201,34 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /@radix-ui/react-accordion@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-HJOzSX8dQqtsp/3jVxCU3CXEONF7/2jlGAB28oX8TTw1Dz8JYbEI1UcL8355PuLBE41/IRRMvCw7VkiK/jcUOQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collapsible': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@types/react': 18.3.8 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /@radix-ui/react-alert-dialog@1.0.5(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-OrVIOcZL0tl6xibeuGt5/+UxoT2N27KCFOPjFyfXMnchxSHZ/OW7cCX2nGlIYJrbHK/fczPcFzAwvNBB6XBNMA==} peerDependencies: @@ -7035,6 +7317,26 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.8 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /@radix-ui/react-arrow@1.1.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==} peerDependencies: @@ -7215,8 +7517,35 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} + /@radix-ui/react-collapsible@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-zQY7Epa8sTL0mq4ajSJpjgn2YmCgyrG7RsQgLp3C0LQVkG7+Tf6Pv1CeNWZLyqMjhdPkBa5Lx7wYBeSu7uCSTA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@types/react': 18.3.8 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -7309,6 +7638,29 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@types/react': 18.3.8 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /@radix-ui/react-compose-refs@1.0.0(react@18.3.1): resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==} peerDependencies: @@ -7384,6 +7736,19 @@ packages: '@types/react': 18.3.2 react: 18.3.1 + /@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.8)(react@18.3.1): + resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.8 + react: 18.3.1 + dev: false + /@radix-ui/react-context@1.0.0(react@18.3.1): resolution: {integrity: sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==} peerDependencies: @@ -7445,6 +7810,32 @@ packages: '@types/react': 18.3.2 react: 18.3.1 + /@radix-ui/react-context@1.1.0(@types/react@18.3.8)(react@18.3.1): + resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.8 + react: 18.3.1 + dev: false + + /@radix-ui/react-context@1.1.1(@types/react@18.3.8)(react@18.3.1): + resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.8 + react: 18.3.1 + dev: false + /@radix-ui/react-dialog@1.0.0(@types/react@18.2.79)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==} peerDependencies: @@ -7533,6 +7924,73 @@ packages: react-remove-scroll: 2.5.5(@types/react@18.2.79)(react@18.3.1) dev: false + /@radix-ui/react-dialog@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.25.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.8)(react@18.3.1) + '@types/react': 18.3.8 + '@types/react-dom': 18.3.0 + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.5(@types/react@18.3.8)(react@18.3.1) + dev: false + + /@radix-ui/react-dialog@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@types/react': 18.3.8 + '@types/react-dom': 18.3.0 + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.8)(react@18.3.1) + dev: false + /@radix-ui/react-dialog@1.1.1(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==} peerDependencies: @@ -7618,6 +8076,19 @@ packages: react: 18.3.1 dev: false + /@radix-ui/react-direction@1.1.0(@types/react@18.3.8)(react@18.3.1): + resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.8 + react: 18.3.1 + dev: false + /@radix-ui/react-dismissable-layer@1.0.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==} peerDependencies: @@ -7756,6 +8227,30 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@types/react': 18.3.8 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /@radix-ui/react-dismissable-layer@1.1.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==} peerDependencies: @@ -7778,6 +8273,30 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: true + /@radix-ui/react-dismissable-layer@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@types/react': 18.3.8 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /@radix-ui/react-dropdown-menu@2.1.1(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==} peerDependencies: @@ -7852,6 +8371,32 @@ packages: '@types/react': 18.2.79 react: 18.3.1 + /@radix-ui/react-focus-guards@1.1.0(@types/react@18.3.8)(react@18.3.1): + resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.8 + react: 18.3.1 + dev: false + + /@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.8)(react@18.3.1): + resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.8 + react: 18.3.1 + dev: false + /@radix-ui/react-focus-scope@1.0.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==} peerDependencies: @@ -7933,6 +8478,28 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@types/react': 18.3.8 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /@radix-ui/react-focus-scope@1.1.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==} peerDependencies: @@ -8028,6 +8595,20 @@ packages: react: 18.3.1 dev: false + /@radix-ui/react-id@1.1.0(@types/react@18.3.8)(react@18.3.1): + resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@types/react': 18.3.8 + react: 18.3.1 + dev: false + /@radix-ui/react-id@1.1.0(react@18.3.1): resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} peerDependencies: @@ -8190,6 +8771,40 @@ packages: react-remove-scroll: 2.5.5(@types/react@18.3.8)(react@18.3.1) dev: false + /@radix-ui/react-popover@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-u2HRUyWW+lOiA2g0Le0tMmT55FGOEWHwPFt1EPfbLly7uXQExFo5duNKqG2DzmFXIdqOeNd+TpE8baHWJCyP9w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@types/react': 18.3.8 + '@types/react-dom': 18.3.0 + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.0(@types/react@18.3.8)(react@18.3.1) + dev: false + /@radix-ui/react-popper@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==} peerDependencies: @@ -8309,6 +8924,35 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/rect': 1.1.0 + '@types/react': 18.3.8 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /@radix-ui/react-popper@1.2.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==} peerDependencies: @@ -8452,6 +9096,27 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@types/react': 18.3.8 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /@radix-ui/react-portal@1.1.1(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==} peerDependencies: @@ -8471,6 +9136,27 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: true + /@radix-ui/react-portal@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@types/react': 18.3.8 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /@radix-ui/react-presence@1.0.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==} peerDependencies: @@ -8527,7 +9213,49 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-presence@1.1.0(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.3.1)(react@18.3.1): + /@radix-ui/react-presence@1.1.0(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.79)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.79)(react@18.3.1) + '@types/react': 18.2.79 + '@types/react-dom': 18.2.25 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.2)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.2)(react@18.3.1) + '@types/react': 18.3.2 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==} peerDependencies: '@types/react': '*' @@ -8540,15 +9268,15 @@ packages: '@types/react-dom': optional: true dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.79)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.79)(react@18.3.1) - '@types/react': 18.2.79 - '@types/react-dom': 18.2.25 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@types/react': 18.3.8 + '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): + /@radix-ui/react-presence@1.1.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==} peerDependencies: '@types/react': '*' @@ -8563,14 +9291,12 @@ packages: dependencies: '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.2)(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.2)(react@18.3.1) - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false + dev: true - /@radix-ui/react-presence@1.1.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==} + /@radix-ui/react-presence@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -8582,11 +9308,13 @@ packages: '@types/react-dom': optional: true dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.2)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.2)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@types/react': 18.3.8 + '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: true + dev: false /@radix-ui/react-primitive@1.0.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==} @@ -8702,6 +9430,26 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@types/react': 18.3.8 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /@radix-ui/react-primitive@2.0.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==} peerDependencies: @@ -8827,6 +9575,34 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@types/react': 18.3.8 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /@radix-ui/react-scroll-area@1.0.5(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-b6PAgH4GQf9QEn8zbT2XUHpW5z8BzqEc7Kl11TwDrvuTrxlkcjTD5qa/bxgKr+nmuXKu4L/W5UZ4mlP/VG/5Gw==} peerDependencies: @@ -8856,6 +9632,34 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /@radix-ui/react-scroll-area@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-q2jMBdsJ9zB7QG6ngQNzNwlvxLQqONyL58QbEGwuyRZZb/ARQwk3uQVbCF7GvQVOtV6EU/pDxAw3zRzJZI3rpQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@types/react': 18.3.8 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /@radix-ui/react-select@2.0.0(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==} peerDependencies: @@ -9031,6 +9835,20 @@ packages: react: 18.3.1 dev: false + /@radix-ui/react-slot@1.1.0(@types/react@18.3.8)(react@18.3.1): + resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@types/react': 18.3.8 + react: 18.3.1 + dev: false + /@radix-ui/react-slot@1.1.0(react@18.3.1): resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==} peerDependencies: @@ -9125,6 +9943,33 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /@radix-ui/react-tabs@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-bZgOKB/LtZIij75FSuPzyEti/XBhJH52ExgtdVqjCIh+Nx/FW+LhnbXtbCzIi34ccyMsyOja8T0thCzoHFXNKA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@types/react': 18.3.8 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /@radix-ui/react-toast@1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-5trl7piMXcZiCq7MW6r8YYmu0bK5qDpTWz+FdEPdKyft2UixkspheYbjbrLXVN5NGKHFbOP7lm8eD0biiSqZqg==} peerDependencies: @@ -9360,6 +10205,19 @@ packages: '@types/react': 18.3.2 react: 18.3.1 + /@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.8)(react@18.3.1): + resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.8 + react: 18.3.1 + dev: false + /@radix-ui/react-use-controllable-state@1.0.0(react@18.3.1): resolution: {integrity: sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==} peerDependencies: @@ -9427,6 +10285,20 @@ packages: react: 18.3.1 dev: false + /@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.8)(react@18.3.1): + resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@types/react': 18.3.8 + react: 18.3.1 + dev: false + /@radix-ui/react-use-controllable-state@1.1.0(react@18.3.1): resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} peerDependencies: @@ -9507,6 +10379,20 @@ packages: react: 18.3.1 dev: false + /@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.8)(react@18.3.1): + resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@types/react': 18.3.8 + react: 18.3.1 + dev: false + /@radix-ui/react-use-escape-keydown@1.1.0(react@18.3.1): resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} peerDependencies: @@ -9581,6 +10467,19 @@ packages: '@types/react': 18.3.2 react: 18.3.1 + /@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.8)(react@18.3.1): + resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.8 + react: 18.3.1 + dev: false + /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.79)(react@18.3.1): resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} peerDependencies: @@ -9638,6 +10537,20 @@ packages: '@types/react': 18.2.79 react: 18.3.1 + /@radix-ui/react-use-rect@1.1.0(@types/react@18.3.8)(react@18.3.1): + resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/rect': 1.1.0 + '@types/react': 18.3.8 + react: 18.3.1 + dev: false + /@radix-ui/react-use-size@1.0.1(@types/react@18.2.79)(react@18.3.1): resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} peerDependencies: @@ -9682,6 +10595,20 @@ packages: react: 18.3.1 dev: false + /@radix-ui/react-use-size@1.1.0(@types/react@18.3.8)(react@18.3.1): + resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@types/react': 18.3.8 + react: 18.3.1 + dev: false + /@radix-ui/react-use-size@1.1.0(react@18.3.1): resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} peerDependencies: @@ -10776,6 +11703,18 @@ packages: postcss-selector-parser: 6.0.10 tailwindcss: 3.4.3(ts-node@10.9.2) + /@tailwindcss/typography@0.5.15(tailwindcss@3.4.10): + resolution: {integrity: sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20' + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.10(ts-node@10.9.2) + dev: false + /@tanstack/query-core@4.36.1: resolution: {integrity: sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==} dev: false @@ -11478,6 +12417,12 @@ packages: dependencies: undici-types: 5.26.5 + /@types/node@22.5.4: + resolution: {integrity: sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==} + dependencies: + undici-types: 6.19.8 + dev: true + /@types/node@22.5.5: resolution: {integrity: sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==} dependencies: @@ -11513,7 +12458,7 @@ packages: /@types/react-dom@18.3.0: resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} dependencies: - '@types/react': 18.3.2 + '@types/react': 18.3.8 /@types/react-syntax-highlighter@15.5.13: resolution: {integrity: sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==} @@ -12430,6 +13375,11 @@ packages: resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} dev: true + /ansis@3.3.2: + resolution: {integrity: sha512-cFthbBlt+Oi0i9Pv/j6YdVWJh54CtjGACaMPCIrEV4Ha7HWsIjXDwseYV79TIL0B4+KfSwD5S70PeQDkPUd1rA==} + engines: {node: '>=15'} + dev: true + /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -12450,7 +13400,6 @@ packages: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 - dev: true /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -12561,11 +13510,6 @@ packages: tslib: 2.7.0 dev: true - /astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - dev: true - /astring@1.9.0: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true @@ -12628,6 +13572,22 @@ packages: postcss: 8.4.38 postcss-value-parser: 4.2.0 + /autoprefixer@10.4.20(postcss@8.4.47): + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.23.3 + caniuse-lite: 1.0.30001662 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.0 + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + dev: true + /available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -12638,8 +13598,8 @@ packages: resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==} engines: {node: '>= 6.0.0'} - /axios@1.6.2: - resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==} + /axios@1.7.4: + resolution: {integrity: sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==} dependencies: follow-redirects: 1.15.9 form-data: 4.0.0 @@ -13029,21 +13989,21 @@ packages: get-func-name: 2.0.2 dev: true - /checkly@4.7.0(@types/node@20.14.9)(typescript@5.5.3): - resolution: {integrity: sha512-OVEn7iUrtTs/YrxmNcWo7jQkH+e5LS0/KhF+MmIi8DbrCc8sCBppO1JyEnjoKcslCkV/Rilad66LShI6V/cqvQ==} + /checkly@4.8.1(@types/node@20.14.9)(typescript@5.5.3): + resolution: {integrity: sha512-LyVxHVOqjZ6k/QXGZQhZgnG7stL5mYfzu+Vl5hkdh2ZKDm/MLk4Q+gRKAyMLOjMN66jrJN1ZM1K3zlLt2/EJcg==} engines: {node: '>=16.0.0'} hasBin: true dependencies: '@oclif/core': 2.8.11(@types/node@20.14.9)(typescript@5.5.3) '@oclif/plugin-help': 5.1.20 '@oclif/plugin-not-found': 2.3.23(@types/node@20.14.9)(typescript@5.5.3) - '@oclif/plugin-plugins': 4.1.12 + '@oclif/plugin-plugins': 5.4.4 '@oclif/plugin-warn-if-update-available': 2.0.24(@types/node@20.14.9)(typescript@5.5.3) '@typescript-eslint/typescript-estree': 6.19.0(typescript@5.5.3) acorn: 8.8.1 acorn-walk: 8.2.0 async-mqtt: 2.6.3 - axios: 1.6.2 + axios: 1.7.4 chalk: 4.1.2 ci-info: 3.8.0 conf: 10.2.0 @@ -13348,6 +14308,21 @@ packages: - '@types/react-dom' dev: false + /cmdk@1.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-gDzVf0a09TvoJ5jnuPvygTB77+XdOSwEmJ88L6XPFPlv7T3RxbP9jgenfylrAMD0+Le1aO0nVjQUzl2g+vjz5Q==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + dev: false + /code-red@1.0.4: resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} dependencies: @@ -13360,7 +14335,6 @@ packages: /collapse-white-space@2.1.0: resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} - dev: true /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -15125,6 +16099,38 @@ packages: '@esbuild/win32-x64': 0.21.5 dev: true + /esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + dev: false + /escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -15260,7 +16266,6 @@ packages: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - dev: true /esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} @@ -15295,7 +16300,6 @@ packages: resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} dependencies: '@types/estree': 1.0.6 - dev: true /estree-util-build-jsx@2.2.2: resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} @@ -15311,7 +16315,6 @@ packages: devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 estree-walker: 3.0.3 - dev: true /estree-util-is-identifier-name@2.1.0: resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} @@ -15332,13 +16335,11 @@ packages: '@types/estree-jsx': 1.0.5 astring: 1.9.0 source-map: 0.7.4 - dev: true /estree-util-value-to-estree@3.1.2: resolution: {integrity: sha512-S0gW2+XZkmsx00tU2uJ4L9hUT7IFabbml9pHh2WQqFmAbxit++YGZne0sKJbNwkj9Wvg9E4uqWl4nCIFQMmfag==} dependencies: '@types/estree': 1.0.6 - dev: true /estree-util-visit@1.2.1: resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} @@ -15517,7 +16518,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: is-extendable: 0.1.1 - dev: true /extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -15985,7 +16985,38 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /fumadocs-core@13.4.10(@types/react@18.2.79)(next@14.2.10)(react-dom@18.3.1)(react@18.3.1): + /fumadocs-core@13.4.10(@types/react@18.2.79)(next@14.2.10)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-ygLVuWyeD2xTm//wPy5mAEDq+eiLc2mCyOSY7kwRYh2+ZfLruI8Sb7Hy7HfdYuzSaVYpAZ0mD+NGQSBunUiS7Q==} + peerDependencies: + next: '>= 14.1.0' + react: '>= 18' + react-dom: '>= 18' + dependencies: + '@formatjs/intl-localematcher': 0.5.4 + '@shikijs/rehype': 1.18.0 + '@shikijs/transformers': 1.18.0 + flexsearch: 0.7.21 + github-slugger: 2.0.0 + image-size: 1.1.1 + negotiator: 0.6.3 + next: 14.2.10(@babel/core@7.25.2)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) + npm-to-yarn: 3.0.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.0(@types/react@18.2.79)(react@18.3.1) + remark: 15.0.1 + remark-gfm: 4.0.0 + remark-mdx: 3.0.1 + scroll-into-view-if-needed: 3.1.0 + shiki: 1.18.0 + swr: 2.2.5(react@18.3.1) + unist-util-visit: 5.0.0 + transitivePeerDependencies: + - '@types/react' + - supports-color + dev: false + + /fumadocs-core@13.4.10(@types/react@18.3.8)(next@14.2.10)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-ygLVuWyeD2xTm//wPy5mAEDq+eiLc2mCyOSY7kwRYh2+ZfLruI8Sb7Hy7HfdYuzSaVYpAZ0mD+NGQSBunUiS7Q==} peerDependencies: next: '>= 14.1.0' @@ -16003,7 +17034,7 @@ packages: npm-to-yarn: 3.0.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.6.0(@types/react@18.2.79)(react@18.3.1) + react-remove-scroll: 2.6.0(@types/react@18.3.8)(react@18.3.1) remark: 15.0.1 remark-gfm: 4.0.0 remark-mdx: 3.0.1 @@ -16016,6 +17047,61 @@ packages: - supports-color dev: false + /fumadocs-mdx@10.0.2(fumadocs-core@13.4.10)(next@14.2.10): + resolution: {integrity: sha512-kpM4QfLXF3CjqBCLsYySZNvXvKpDrqDCK7wobhoAbTTmzql2cGXBk+bkAogwjgW3sidGw9d/HIGOcB61R07QLA==} + hasBin: true + peerDependencies: + fumadocs-core: ^13.2.1 + next: '>= 14.1.0' + dependencies: + '@mdx-js/mdx': 3.0.1 + chokidar: 3.6.0 + cross-spawn: 7.0.3 + esbuild: 0.23.1 + estree-util-value-to-estree: 3.1.2 + fast-glob: 3.3.2 + fumadocs-core: 13.4.10(@types/react@18.3.8)(next@14.2.10)(react-dom@18.3.1)(react@18.3.1) + gray-matter: 4.0.3 + micromatch: 4.0.8 + next: 14.2.10(@babel/core@7.25.2)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) + zod: 3.23.8 + transitivePeerDependencies: + - supports-color + dev: false + + /fumadocs-ui@13.4.10(@types/react-dom@18.3.0)(@types/react@18.3.8)(next@14.2.10)(react-dom@18.3.1)(react@18.3.1)(tailwindcss@3.4.10): + resolution: {integrity: sha512-aHN9sUHwKTSu+37bxx8KDbMNGolG5iNsKdvK40VKiTbNz5p495uzui8aLPGKTV96TS53oPQzPdk6YoCqWZTE+A==} + peerDependencies: + next: '>= 14.1.0' + react: '>= 18' + react-dom: '>= 18' + dependencies: + '@radix-ui/react-accordion': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-collapsible': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-dialog': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-popover': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-scroll-area': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-tabs': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + '@tailwindcss/typography': 0.5.15(tailwindcss@3.4.10) + class-variance-authority: 0.7.0 + cmdk: 1.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1)(react@18.3.1) + fumadocs-core: 13.4.10(@types/react@18.3.8)(next@14.2.10)(react-dom@18.3.1)(react@18.3.1) + lucide-react: 0.438.0(react@18.3.1) + next: 14.2.10(@babel/core@7.25.2)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) + next-themes: 0.3.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-medium-image-zoom: 5.2.10(react-dom@18.3.1)(react@18.3.1) + swr: 2.2.5(react@18.3.1) + tailwind-merge: 2.5.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - supports-color + - tailwindcss + dev: false + /function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} @@ -16340,7 +17426,6 @@ packages: kind-of: 6.0.3 section-matter: 1.0.0 strip-bom-string: 1.0.0 - dev: true /gzip-size@6.0.0: resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} @@ -16597,7 +17682,6 @@ packages: zwitch: 2.0.4 transitivePeerDependencies: - supports-color - dev: true /hast-util-to-html@8.0.4: resolution: {integrity: sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==} @@ -16651,7 +17735,6 @@ packages: vfile-message: 4.0.2 transitivePeerDependencies: - supports-color - dev: true /hast-util-to-parse5@7.1.0: resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==} @@ -16787,6 +17870,13 @@ packages: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true + /hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + lru-cache: 10.4.3 + dev: true + /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: false @@ -17003,7 +18093,6 @@ packages: /inline-style-parser@0.2.4: resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} - dev: true /input-otp@1.2.4(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-md6rhmD+zmMnUh5crQNSQxq3keBRYvE3odbr4Qb9g2NWzQv9azi+t1a3X4TBTbh98fsGHgEEJlzbe1q860uGCA==} @@ -17056,6 +18145,7 @@ packages: /interpret@1.4.0: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} engines: {node: '>= 0.10'} + dev: false /invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} @@ -17198,6 +18288,12 @@ packages: hasBin: true dev: true + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: true + /is-electron@2.2.2: resolution: {integrity: sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==} dev: false @@ -17205,7 +18301,6 @@ packages: /is-extendable@0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} - dev: true /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} @@ -17246,6 +18341,14 @@ packages: /is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: true + /is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} @@ -17441,12 +18544,24 @@ packages: is-docker: 2.2.1 dev: true + /is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + dependencies: + is-inside-container: 1.0.0 + dev: true + /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + /isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + dev: true + /isomorphic-fetch@3.0.0: resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} dependencies: @@ -17553,7 +18668,6 @@ packages: dependencies: argparse: 1.0.10 esprima: 4.0.1 - dev: true /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} @@ -17666,7 +18780,6 @@ packages: /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - dev: true /kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} @@ -18062,6 +19175,14 @@ packages: react: 18.3.1 dev: false + /lucide-react@0.438.0(react@18.3.1): + resolution: {integrity: sha512-uq6yCB+IzVfgIPMK8ibkecXSWTTSOMs9UjUgZigfrDCVqgdwkpIgYg1fSYnf0XXF2AoSyCJZhoZXQwzoai7VGw==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc + dependencies: + react: 18.3.1 + dev: false + /luxon@3.3.0: resolution: {integrity: sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==} engines: {node: '>=12'} @@ -18108,7 +19229,6 @@ packages: /markdown-extensions@2.0.0: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} engines: {node: '>=16'} - dev: true /markdown-table@3.0.3: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} @@ -19931,6 +21051,16 @@ packages: engines: {node: '>=14.16'} dev: true + /npm-package-arg@11.0.3: + resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + hosted-git-info: 7.0.2 + proc-log: 4.2.0 + semver: 7.6.3 + validate-npm-package-name: 5.0.1 + dev: true + /npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -19949,8 +21079,8 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: false - /npm@10.2.3: - resolution: {integrity: sha512-GbUui/rHTl0mW8HhJSn4A0Xg89yCR3I9otgJT1i0z1QBPOVlgbh6rlcUTpHT8Gut9O1SJjWRUU0nEcAymhG2tQ==} + /npm@10.8.3: + resolution: {integrity: sha512-0IQlyAYvVtQ7uOhDFYZCGK8kkut2nh8cpAdA9E6FvRSJaTgtZRZgNjlC5ZCct//L73ygrpY93CxXpRJDtNqPVg==} engines: {node: ^18.17.0 || >=20.5.0} hasBin: true dev: true @@ -19962,6 +21092,7 @@ packages: - '@npmcli/map-workspaces' - '@npmcli/package-json' - '@npmcli/promise-spawn' + - '@npmcli/redact' - '@npmcli/run-script' - '@sigstore/tuf' - abbrev @@ -19970,8 +21101,6 @@ packages: - chalk - ci-info - cli-columns - - cli-table3 - - columnify - fastest-levenshtein - fs-minipass - glob @@ -20007,7 +21136,6 @@ packages: - npm-profile - npm-registry-fetch - npm-user-validate - - npmlog - p-map - pacote - parse-conflict-json @@ -20017,7 +21145,6 @@ packages: - semver - spdx-expression-parse - ssri - - strip-ansi - supports-color - tar - text-table @@ -20093,6 +21220,11 @@ packages: engines: {node: '>= 10'} dev: true + /object-treeify@4.0.1: + resolution: {integrity: sha512-Y6tg5rHfsefSkfKujv2SwHulInROy/rCL5F4w0QOWxut8AnxYxf0YmNhTh95Zfyxpsudo66uqkux0ACFnyMSgQ==} + engines: {node: '>= 16'} + dev: true + /object-values@1.0.0: resolution: {integrity: sha512-+8hwcz/JnQ9EpLIXzN0Rs7DLsBpJNT/xYehtB/jU93tHYr5BFEO8E+JGQNOSqE7opVzz5cGksKFHt7uUJVLSjQ==} engines: {node: '>=0.10.0'} @@ -20657,6 +21789,17 @@ packages: read-cache: 1.0.0 resolve: 1.22.8 + /postcss-import@15.1.0(postcss@8.4.47): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + /postcss-js@4.0.1(postcss@8.4.38): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} @@ -20666,6 +21809,15 @@ packages: camelcase-css: 2.0.1 postcss: 8.4.38 + /postcss-js@4.0.1(postcss@8.4.47): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.47 + /postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2): resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} engines: {node: '>= 14'} @@ -20683,6 +21835,23 @@ packages: ts-node: 10.9.2(@types/node@20.14.9)(typescript@5.5.3) yaml: 2.5.1 + /postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.1.2 + postcss: 8.4.47 + ts-node: 10.9.2(@types/node@20.14.9)(typescript@5.5.3) + yaml: 2.5.1 + /postcss-nested@6.2.0(postcss@8.4.38): resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} engines: {node: '>=12.0'} @@ -20692,6 +21861,15 @@ packages: postcss: 8.4.38 postcss-selector-parser: 6.1.2 + /postcss-nested@6.2.0(postcss@8.4.47): + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 + /postcss-selector-parser@6.0.10: resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} engines: {node: '>=4'} @@ -20860,6 +22038,11 @@ packages: '@probe.gl/stats': 3.6.0 dev: false + /proc-log@4.2.0: + resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: true @@ -21236,6 +22419,16 @@ packages: - supports-color dev: false + /react-medium-image-zoom@5.2.10(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-JBYf4u0zsocezIDtrjwStD+8sX+c8XuLsdz+HxPbojRj0sCicua0XOQKysuPetoFyX+YgStfj+vEtZ+699O/pg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /react-promise-suspense@0.3.4: resolution: {integrity: sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ==} dependencies: @@ -21296,7 +22489,7 @@ packages: optional: true dependencies: react: 18.3.1 - react-style-singleton: 2.2.1(@types/react@18.3.8)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.2.79)(react@18.3.1) tslib: 2.7.0 dev: true @@ -21331,10 +22524,10 @@ packages: dependencies: react: 18.3.1 react-remove-scroll-bar: 2.3.6(react@18.3.1) - react-style-singleton: 2.2.1(@types/react@18.3.8)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.2.79)(react@18.3.1) tslib: 2.7.0 - use-callback-ref: 1.3.2(@types/react@18.3.8)(react@18.3.1) - use-sidecar: 1.1.2(@types/react@18.3.8)(react@18.3.1) + use-callback-ref: 1.3.2(@types/react@18.2.79)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.2.79)(react@18.3.1) dev: true /react-remove-scroll@2.5.5(@types/react@18.2.79)(react@18.3.1): @@ -21394,7 +22587,7 @@ packages: use-sidecar: 1.1.2(@types/react@18.2.79)(react@18.3.1) dev: false - /react-remove-scroll@2.5.7(react@18.3.1): + /react-remove-scroll@2.5.7(@types/react@18.3.8)(react@18.3.1): resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==} engines: {node: '>=10'} peerDependencies: @@ -21404,12 +22597,31 @@ packages: '@types/react': optional: true dependencies: + '@types/react': 18.3.8 react: 18.3.1 - react-remove-scroll-bar: 2.3.6(react@18.3.1) + react-remove-scroll-bar: 2.3.6(@types/react@18.3.8)(react@18.3.1) react-style-singleton: 2.2.1(@types/react@18.3.8)(react@18.3.1) tslib: 2.7.0 use-callback-ref: 1.3.2(@types/react@18.3.8)(react@18.3.1) use-sidecar: 1.1.2(@types/react@18.3.8)(react@18.3.1) + dev: false + + /react-remove-scroll@2.5.7(react@18.3.1): + resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.2.79)(react@18.3.1) + tslib: 2.7.0 + use-callback-ref: 1.3.2(@types/react@18.2.79)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.2.79)(react@18.3.1) dev: true /react-remove-scroll@2.6.0(@types/react@18.2.79)(react@18.3.1): @@ -21431,6 +22643,25 @@ packages: use-sidecar: 1.1.2(@types/react@18.2.79)(react@18.3.1) dev: false + /react-remove-scroll@2.6.0(@types/react@18.3.8)(react@18.3.1): + resolution: {integrity: sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.8 + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(@types/react@18.3.8)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.8)(react@18.3.1) + tslib: 2.7.0 + use-callback-ref: 1.3.2(@types/react@18.3.8)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.8)(react@18.3.1) + dev: false + /react-style-singleton@2.2.1(@types/react@18.2.79)(react@18.3.1): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} @@ -21446,7 +22677,6 @@ packages: invariant: 2.2.4 react: 18.3.1 tslib: 2.7.0 - dev: false /react-style-singleton@2.2.1(@types/react@18.3.8)(react@18.3.1): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} @@ -21463,6 +22693,7 @@ packages: invariant: 2.2.4 react: 18.3.1 tslib: 2.7.0 + dev: false /react-syntax-highlighter@15.5.0(react@18.3.1): resolution: {integrity: sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==} @@ -21609,6 +22840,7 @@ packages: engines: {node: '>= 0.10'} dependencies: resolve: 1.22.8 + dev: false /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} @@ -21869,7 +23101,6 @@ packages: mdast-util-to-hast: 13.2.0 unified: 11.0.5 vfile: 6.0.3 - dev: true /remark-smartypants@2.1.0: resolution: {integrity: sha512-qoF6Vz3BjU2tP6OfZqHOvCU0ACmu/6jhGaINSQRI9mM7wCxNQTKB3JUAN4SVoN2ybElEDTxBIABRep7e569iJw==} @@ -22285,7 +23516,6 @@ packages: dependencies: extend-shallow: 2.0.1 kind-of: 6.0.3 - dev: true /secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} @@ -22500,6 +23730,7 @@ packages: glob: 7.2.3 interpret: 1.4.0 rechoir: 0.6.2 + dev: false /shiki@0.14.7: resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==} @@ -22590,15 +23821,6 @@ packages: engines: {node: '>=8'} dev: true - /slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - dev: true - /slice-ansi@5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} @@ -22877,7 +24099,6 @@ packages: /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true /sqlstring@2.3.3: resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} @@ -23042,7 +24263,6 @@ packages: /strip-bom-string@1.0.0: resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} engines: {node: '>=0.10.0'} - dev: true /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} @@ -23108,7 +24328,6 @@ packages: resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} dependencies: inline-style-parser: 0.2.4 - dev: true /styled-components@6.1.13(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-M0+N2xSnAtwcVAQeFEsGWFFxXDftHUD7XrKla06QbpUMmbmtFBMMTcKWvFXtWxuD5qQkB8iU5gk6QASlx2ZRMw==} @@ -23305,6 +24524,10 @@ packages: '@babel/runtime': 7.25.6 dev: false + /tailwind-merge@2.5.2: + resolution: {integrity: sha512-kjEBm+pvD+6eAwzJL2Bi+02/9LFLal1Gs61+QB7HvTfQQ0aXwC5LGT8PEt1gS0CWKktKe6ysPTAy3cBC5MeiIg==} + dev: false + /tailwind-scrollbar@3.1.0(tailwindcss@3.4.3): resolution: {integrity: sha512-pmrtDIZeHyu2idTejfV59SbaJyvp1VRjYxAjZBH0jnyrPRo6HL1kD5Glz8VPagasqr6oAx6M05+Tuw429Z8jxg==} engines: {node: '>=12.13.0'} @@ -23341,11 +24564,11 @@ packages: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.0 - postcss: 8.4.38 - postcss-import: 15.1.0(postcss@8.4.38) - postcss-js: 4.0.1(postcss@8.4.38) - postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2) - postcss-nested: 6.2.0(postcss@8.4.38) + postcss: 8.4.47 + postcss-import: 15.1.0(postcss@8.4.47) + postcss-js: 4.0.1(postcss@8.4.47) + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2) + postcss-nested: 6.2.0(postcss@8.4.47) postcss-selector-parser: 6.1.2 resolve: 1.22.8 sucrase: 3.35.0 @@ -23353,6 +24576,36 @@ packages: - ts-node dev: false + /tailwindcss@3.4.10(ts-node@10.9.2): + resolution: {integrity: sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.6 + lilconfig: 2.1.0 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.0 + postcss: 8.4.47 + postcss-import: 15.1.0(postcss@8.4.47) + postcss-js: 4.0.1(postcss@8.4.47) + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2) + postcss-nested: 6.2.0(postcss@8.4.47) + postcss-selector-parser: 6.1.2 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + /tailwindcss@3.4.3(ts-node@10.9.2): resolution: {integrity: sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==} engines: {node: '>=14.0.0'} @@ -23998,6 +25251,12 @@ packages: engines: {node: '>=14.17'} hasBin: true + /typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + /ua-parser-js@0.7.39: resolution: {integrity: sha512-IZ6acm6RhQHNibSt7+c09hhvsKy9WUr4DVbeq9U8o71qxyYtJpQeDxQnMrVqnIFMLcQjHO0I9wgfO2vIahht4w==} hasBin: true @@ -24314,7 +25573,6 @@ packages: '@types/react': 18.2.79 react: 18.3.1 tslib: 2.7.0 - dev: false /use-callback-ref@1.3.2(@types/react@18.3.8)(react@18.3.1): resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} @@ -24329,6 +25587,7 @@ packages: '@types/react': 18.3.8 react: 18.3.1 tslib: 2.7.0 + dev: false /use-sidecar@1.1.2(@types/react@18.2.79)(react@18.3.1): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} @@ -24344,7 +25603,6 @@ packages: detect-node-es: 1.1.0 react: 18.3.1 tslib: 2.7.0 - dev: false /use-sidecar@1.1.2(@types/react@18.3.8)(react@18.3.1): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} @@ -24360,6 +25618,7 @@ packages: detect-node-es: 1.1.0 react: 18.3.1 tslib: 2.7.0 + dev: false /use-sync-external-store@1.2.2(react@18.3.1): resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} @@ -24940,6 +26199,14 @@ packages: dependencies: isexe: 2.0.0 + /which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + isexe: 3.1.1 + dev: true + /why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} diff --git a/tools/migrate/auditlog-import.ts b/tools/migrate/auditlog-import.ts index c37e187410..2ec30ca9a6 100644 --- a/tools/migrate/auditlog-import.ts +++ b/tools/migrate/auditlog-import.ts @@ -38,8 +38,6 @@ async function main() { location: string; meta: string | null; }; - - console.log(log); let bucketId = ""; const bucket = await db.query.auditLogBucket.findFirst({ where: (table, { eq, and }) => @@ -98,8 +96,6 @@ async function main() { } buffer = lines[0]; } - - console.log("END"); } main(); diff --git a/tools/migrate/main.ts b/tools/migrate/main.ts index e56c35d71b..e0fa3ddec4 100644 --- a/tools/migrate/main.ts +++ b/tools/migrate/main.ts @@ -28,7 +28,6 @@ async function main() { }); if (!identity) { const id = newId("identity"); - console.log("Creating new identity", id, key.ownerId); await db.insert(schema.identities).values({ id, workspaceId: key.workspaceId, @@ -38,7 +37,6 @@ async function main() { id, }; } - console.log("connecting", identity.id, key.id); await db .update(schema.keys) .set({ identityId: identity.id }) diff --git a/tools/migrate/tinybird-export.ts b/tools/migrate/tinybird-export.ts index 248cf2e276..82f25a6fa7 100644 --- a/tools/migrate/tinybird-export.ts +++ b/tools/migrate/tinybird-export.ts @@ -3,7 +3,6 @@ async function main() { const writer = exportFile.writer(); let cursor = ""; do { - console.log({ cursor }); const res = await fetch( `https://api.tinybird.co/v0/pipes/export_audit_log.json?cursor=${cursor}`, { @@ -13,7 +12,6 @@ async function main() { }, ); const body = (await res.json()) as { data: { auditLogId: string }[] }; - console.log("found", body.data.length); for (const row of body.data) { writer.write(JSON.stringify(row)); writer.write("\n"); From ed00c4c9d5dd02c5e2fc96ff6901cde5be6af542 Mon Sep 17 00:00:00 2001 From: chronark Date: Fri, 4 Oct 2024 13:01:31 +0200 Subject: [PATCH 2/3] fix: merge conflicts --- biome.json | 5 +- packages/api/src/openapi.d.ts | 1133 +++++++++++++++++---------------- pnpm-lock.yaml | 882 +++++++++++++++++-------- 3 files changed, 1200 insertions(+), 820 deletions(-) diff --git a/biome.json b/biome.json index 313e0769a9..b25b0b65a0 100644 --- a/biome.json +++ b/biome.json @@ -42,7 +42,7 @@ ".wrangler", ".react-email", ".content-collections", - ".source" + ".source", ".trigger" ] }, @@ -59,7 +59,8 @@ ".wrangler", ".react-email", ".content-collections", - ".source" + ".source", + ".trigger" ] }, "organizeImports": { diff --git a/packages/api/src/openapi.d.ts b/packages/api/src/openapi.d.ts index 8968c7629c..8d534161f5 100644 --- a/packages/api/src/openapi.d.ts +++ b/packages/api/src/openapi.d.ts @@ -3,11 +3,14 @@ * Do not make direct changes to the file. */ - /** OneOf type helpers */ type Without = { [P in Exclude]?: never }; -type XOR = (T | U) extends object ? (Without & U) | (Without & T) : T | U; -type OneOf = T extends [infer Only] ? Only : T extends [infer A, infer B, ...infer Rest] ? OneOf<[XOR, ...Rest]> : never; +type XOR = T | U extends object ? (Without & U) | (Without & T) : T | U; +type OneOf = T extends [infer Only] + ? Only + : T extends [infer A, infer B, ...infer Rest] + ? OneOf<[XOR, ...Rest]> + : never; export interface paths { "/v1/liveness": { @@ -518,7 +521,16 @@ export interface components { * * @enum {string} */ - code: "VALID" | "NOT_FOUND" | "FORBIDDEN" | "USAGE_EXCEEDED" | "RATE_LIMITED" | "UNAUTHORIZED" | "DISABLED" | "INSUFFICIENT_PERMISSIONS" | "EXPIRED"; + code: + | "VALID" + | "NOT_FOUND" + | "FORBIDDEN" + | "USAGE_EXCEEDED" + | "RATE_LIMITED" + | "UNAUTHORIZED" + | "DISABLED" + | "INSUFFICIENT_PERMISSIONS" + | "EXPIRED"; /** @description Sets the key to be enabled or disabled. Disabled keys will not verify. */ enabled?: boolean; /** @@ -544,11 +556,18 @@ export interface components { }; }; /** @description A query for which permissions you require */ - PermissionQuery: OneOf<[string, { - and: components["schemas"]["PermissionQuery"][]; - }, { - or: components["schemas"]["PermissionQuery"][]; - }, null]>; + PermissionQuery: OneOf< + [ + string, + { + and: components["schemas"]["PermissionQuery"][]; + }, + { + or: components["schemas"]["PermissionQuery"][]; + }, + null, + ] + >; V1KeysVerifyKeyRequest: { /** * @description The id of the api where the key belongs to. This is optional for now but will be required soon. @@ -593,21 +612,21 @@ export interface components { * ] */ ratelimits?: { - /** - * @description The name of the ratelimit. - * @example tokens - */ - name: string; - /** - * @description Optionally override how expensive this operation is and how many tokens are deducted from the current limit. - * @default 1 - */ - cost?: number; - /** @description Optionally override the limit. */ - limit?: number; - /** @description Optionally override the ratelimit window duration. */ - duration?: number; - }[]; + /** + * @description The name of the ratelimit. + * @example tokens + */ + name: string; + /** + * @description Optionally override how expensive this operation is and how many tokens are deducted from the current limit. + * @default 1 + */ + cost?: number; + /** @description Optionally override the limit. */ + limit?: number; + /** @description Optionally override the ratelimit window duration. */ + duration?: number; + }[]; }; ErrDeleteProtected: { error: { @@ -633,8 +652,7 @@ export interface components { }; }; responses: never; - parameters: { - }; + parameters: {}; requestBodies: never; headers: never; pathItems: never; @@ -645,7 +663,6 @@ export type $defs = Record; export type external = Record; export interface operations { - "v1.liveness": { responses: { /** @description The configured services and their status */ @@ -1173,7 +1190,7 @@ export interface operations { * "refillInterval": 60 * } */ - ratelimit?: ({ + ratelimit?: { /** * @deprecated * @description Fast ratelimiting doesn't add latency, while consistent ratelimiting is more accurate. @@ -1205,7 +1222,7 @@ export interface operations { * This field will become required in a future version. */ duration?: number; - }) | null; + } | null; /** * @description The number of requests that can be made with this key before it becomes invalid. Set `null` to disable. * @example 1000 @@ -1218,7 +1235,7 @@ export interface operations { * "amount": 100 * } */ - refill?: ({ + refill?: { /** * @description Unkey will automatically refill verifications at the set interval. If null is used the refill functionality will be removed from the key. * @enum {string} @@ -1226,7 +1243,7 @@ export interface operations { interval: "daily" | "monthly"; /** @description The amount of verifications to refill for each occurrence is determined individually for each key. */ amount: number; - }) | null; + } | null; /** * @description Set if key is enabled or disabled. If disabled, the key cannot be used to verify. * @example true @@ -1249,16 +1266,16 @@ export interface operations { * ] */ roles?: { - /** @description The id of the role. Provide either `id` or `name`. If both are provided `id` is used. */ - id?: string; - /** @description Identify the role via its name. Provide either `id` or `name`. If both are provided `id` is used. */ - name?: string; - /** - * @description Set to true to automatically create the permissions they do not exist yet. Only works when specifying `name`. - * Autocreating roles requires your root key to have the `rbac.*.create_role` permission, otherwise the request will get rejected - */ - create?: boolean; - }[]; + /** @description The id of the role. Provide either `id` or `name`. If both are provided `id` is used. */ + id?: string; + /** @description Identify the role via its name. Provide either `id` or `name`. If both are provided `id` is used. */ + name?: string; + /** + * @description Set to true to automatically create the permissions they do not exist yet. Only works when specifying `name`. + * Autocreating roles requires your root key to have the `rbac.*.create_role` permission, otherwise the request will get rejected + */ + create?: boolean; + }[]; /** * @description The permissions you want to set for this key. This overwrites all existing permissions. * Setting permissions requires the `rbac.*.add_permission_to_key` permission. @@ -1276,16 +1293,16 @@ export interface operations { * ] */ permissions?: { - /** @description The id of the permission. Provide either `id` or `name`. If both are provided `id` is used. */ - id?: string; - /** @description Identify the permission via its name. Provide either `id` or `name`. If both are provided `id` is used. */ - name?: string; - /** - * @description Set to true to automatically create the permissions they do not exist yet. Only works when specifying `name`. - * Autocreating permissions requires your root key to have the `rbac.*.create_permission` permission, otherwise the request will get rejected - */ - create?: boolean; - }[]; + /** @description The id of the permission. Provide either `id` or `name`. If both are provided `id` is used. */ + id?: string; + /** @description Identify the permission via its name. Provide either `id` or `name`. If both are provided `id` is used. */ + name?: string; + /** + * @description Set to true to automatically create the permissions they do not exist yet. Only works when specifying `name`. + * Autocreating permissions requires your root key to have the `rbac.*.create_permission` permission, otherwise the request will get rejected + */ + create?: boolean; + }[]; }; }; }; @@ -1435,27 +1452,27 @@ export interface operations { content: { "application/json": { verifications: { - /** - * @description The timestamp of the usage data - * @example 1620000000000 - */ - time: number; - /** - * @description The number of successful requests - * @example 100 - */ - success: number; - /** - * @description The number of requests that were rate limited - * @example 10 - */ - rateLimited: number; - /** - * @description The number of requests that exceeded the usage limit - * @example 0 - */ - usageExceeded: number; - }[]; + /** + * @description The timestamp of the usage data + * @example 1620000000000 + */ + time: number; + /** + * @description The number of successful requests + * @example 100 + */ + success: number; + /** + * @description The number of requests that were rate limited + * @example 10 + */ + rateLimited: number; + /** + * @description The number of requests that exceeded the usage limit + * @example 0 + */ + usageExceeded: number; + }[]; }; }; }; @@ -1511,16 +1528,16 @@ export interface operations { keyId: string; /** @description The permissions you want to add to this key */ permissions: { - /** @description The id of the permission. Provide either `id` or `name`. If both are provided `id` is used. */ - id?: string; - /** @description Identify the permission via its name. Provide either `id` or `name`. If both are provided `id` is used. */ - name?: string; - /** - * @description Set to true to automatically create the permissions they do not exist yet. Only works when specifying `name`. - * Autocreating permissions requires your root key to have the `rbac.*.create_permission` permission, otherwise the request will get rejected - */ - create?: boolean; - }[]; + /** @description The id of the permission. Provide either `id` or `name`. If both are provided `id` is used. */ + id?: string; + /** @description Identify the permission via its name. Provide either `id` or `name`. If both are provided `id` is used. */ + name?: string; + /** + * @description Set to true to automatically create the permissions they do not exist yet. Only works when specifying `name`. + * Autocreating permissions requires your root key to have the `rbac.*.create_permission` permission, otherwise the request will get rejected + */ + create?: boolean; + }[]; }; }; }; @@ -1529,17 +1546,17 @@ export interface operations { 200: { content: { "application/json": { - /** - * @description The id of the permission. This is used internally - * @example perm_123 - */ - id: string; - /** - * @description The name of the permission - * @example dns.record.create - */ - name: string; - }[]; + /** + * @description The id of the permission. This is used internally + * @example perm_123 + */ + id: string; + /** + * @description The name of the permission + * @example dns.record.create + */ + name: string; + }[]; }; }; /** @description The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). */ @@ -1604,11 +1621,11 @@ export interface operations { * ] */ permissions: { - /** @description The id of the permission. Provide either `id` or `name`. If both are provided `id` is used. */ - id?: string; - /** @description Identify the permission via its name. Provide either `id` or `name`. If both are provided `id` is used. */ - name?: string; - }[]; + /** @description The id of the permission. Provide either `id` or `name`. If both are provided `id` is used. */ + id?: string; + /** @description Identify the permission via its name. Provide either `id` or `name`. If both are provided `id` is used. */ + name?: string; + }[]; }; }; }; @@ -1686,16 +1703,16 @@ export interface operations { * ] */ permissions: { - /** @description The id of the permission. Provide either `id` or `name`. If both are provided `id` is used. */ - id?: string; - /** @description Identify the permission via its name. Provide either `id` or `name`. If both are provided `id` is used. */ - name?: string; - /** - * @description Set to true to automatically create the permissions they do not exist yet. Only works when specifying `name`. - * Autocreating permissions requires your root key to have the `rbac.*.create_permission` permission, otherwise the request will get rejected - */ - create?: boolean; - }[]; + /** @description The id of the permission. Provide either `id` or `name`. If both are provided `id` is used. */ + id?: string; + /** @description Identify the permission via its name. Provide either `id` or `name`. If both are provided `id` is used. */ + name?: string; + /** + * @description Set to true to automatically create the permissions they do not exist yet. Only works when specifying `name`. + * Autocreating permissions requires your root key to have the `rbac.*.create_permission` permission, otherwise the request will get rejected + */ + create?: boolean; + }[]; }; }; }; @@ -1704,17 +1721,17 @@ export interface operations { 200: { content: { "application/json": { - /** - * @description The id of the permission. This is used internally - * @example perm_123 - */ - id: string; - /** - * @description The name of the permission - * @example dns.record.create - */ - name: string; - }[]; + /** + * @description The id of the permission. This is used internally + * @example perm_123 + */ + id: string; + /** + * @description The name of the permission + * @example dns.record.create + */ + name: string; + }[]; }; }; /** @description The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). */ @@ -1784,16 +1801,16 @@ export interface operations { * ] */ roles: { - /** @description The id of the role. Provide either `id` or `name`. If both are provided `id` is used. */ - id?: string; - /** @description Identify the role via its name. Provide either `id` or `name`. If both are provided `id` is used. */ - name?: string; - /** - * @description Set to true to automatically create the permissions they do not exist yet. Only works when specifying `name`. - * Autocreating roles requires your root key to have the `rbac.*.create_role` permission, otherwise the request will get rejected - */ - create?: boolean; - }[]; + /** @description The id of the role. Provide either `id` or `name`. If both are provided `id` is used. */ + id?: string; + /** @description Identify the role via its name. Provide either `id` or `name`. If both are provided `id` is used. */ + name?: string; + /** + * @description Set to true to automatically create the permissions they do not exist yet. Only works when specifying `name`. + * Autocreating roles requires your root key to have the `rbac.*.create_role` permission, otherwise the request will get rejected + */ + create?: boolean; + }[]; }; }; }; @@ -1802,17 +1819,17 @@ export interface operations { 200: { content: { "application/json": { - /** - * @description The id of the role. This is used internally - * @example role_123 - */ - id: string; - /** - * @description The name of the role - * @example dns.record.create - */ - name: string; - }[]; + /** + * @description The id of the role. This is used internally + * @example role_123 + */ + id: string; + /** + * @description The name of the role + * @example dns.record.create + */ + name: string; + }[]; }; }; /** @description The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). */ @@ -1877,11 +1894,11 @@ export interface operations { * ] */ roles: { - /** @description The id of the role. Provide either `id` or `name`. If both are provided `id` is used. */ - id?: string; - /** @description Identify the role via its name. Provide either `id` or `name`. If both are provided `id` is used. */ - name?: string; - }[]; + /** @description The id of the role. Provide either `id` or `name`. If both are provided `id` is used. */ + id?: string; + /** @description Identify the role via its name. Provide either `id` or `name`. If both are provided `id` is used. */ + name?: string; + }[]; }; }; }; @@ -1959,16 +1976,16 @@ export interface operations { * ] */ roles: { - /** @description The id of the role. Provide either `id` or `name`. If both are provided `id` is used. */ - id?: string; - /** @description Identify the role via its name. Provide either `id` or `name`. If both are provided `id` is used. */ - name?: string; - /** - * @description Set to true to automatically create the permissions they do not exist yet. Only works when specifying `name`. - * Autocreating roles requires your root key to have the `rbac.*.create_role` permission, otherwise the request will get rejected - */ - create?: boolean; - }[]; + /** @description The id of the role. Provide either `id` or `name`. If both are provided `id` is used. */ + id?: string; + /** @description Identify the role via its name. Provide either `id` or `name`. If both are provided `id` is used. */ + name?: string; + /** + * @description Set to true to automatically create the permissions they do not exist yet. Only works when specifying `name`. + * Autocreating roles requires your root key to have the `rbac.*.create_role` permission, otherwise the request will get rejected + */ + create?: boolean; + }[]; }; }; }; @@ -1977,17 +1994,17 @@ export interface operations { 200: { content: { "application/json": { - /** - * @description The id of the role. This is used internally - * @example role_123 - */ - id: string; - /** - * @description The name of the role - * @example dns.record.create - */ - name: string; - }[]; + /** + * @description The id of the role. This is used internally + * @example role_123 + */ + id: string; + /** + * @description The name of the role + * @example dns.record.create + */ + name: string; + }[]; }; }; /** @description The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). */ @@ -2436,26 +2453,26 @@ export interface operations { * ] */ resources?: { - /** - * @description The type of resource - * @example organization - */ - type: string; - /** - * @description The unique identifier for the resource - * @example org_123 - */ - id: string; - /** - * @description A human readable name for this resource - * @example unkey - */ - name?: string; - /** @description Attach any metadata to this resources */ - meta?: { - [key: string]: unknown; - }; - }[]; + /** + * @description The type of resource + * @example organization + */ + type: string; + /** + * @description The unique identifier for the resource + * @example org_123 + */ + id: string; + /** + * @description A human readable name for this resource + * @example unkey + */ + name?: string; + /** @description Attach any metadata to this resources */ + meta?: { + [key: string]: unknown; + }; + }[]; }; }; }; @@ -2533,33 +2550,245 @@ export interface operations { "v1.migrations.createKeys": { requestBody: { content: { - "application/json": ({ - /** - * @description Choose an `API` where this key should be created. - * @example api_123 - */ - apiId: string; + "application/json": { + /** + * @description Choose an `API` where this key should be created. + * @example api_123 + */ + apiId: string; + /** + * @description To make it easier for your users to understand which product an api key belongs to, you can add prefix them. + * + * For example Stripe famously prefixes their customer ids with cus_ or their api keys with sk_live_. + * + * The underscore is automatically added if you are defining a prefix, for example: "prefix": "abc" will result in a key like abc_xxxxxxxxx + */ + prefix?: string; + /** + * @description The name for your Key. This is not customer facing. + * @example my key + */ + name?: string; + /** @description The raw key in plaintext. If provided, unkey encrypts this value and stores it securely. Provide either `hash` or `plaintext` */ + plaintext?: string; + /** @description Provide either `hash` or `plaintext` */ + hash?: { + /** @description The hashed and encoded key */ + value: string; /** - * @description To make it easier for your users to understand which product an api key belongs to, you can add prefix them. - * - * For example Stripe famously prefixes their customer ids with cus_ or their api keys with sk_live_. - * - * The underscore is automatically added if you are defining a prefix, for example: "prefix": "abc" will result in a key like abc_xxxxxxxxx + * @description The algorithm for hashing and encoding, currently only sha256 and base64 are supported + * @enum {string} */ - prefix?: string; + variant: "sha256_base64"; + }; + /** + * @description The first 4 characters of the key. If a prefix is used, it should be the prefix plus 4 characters. + * @example unkey_32kq + */ + start?: string; + /** + * @description Your user’s Id. This will provide a link between Unkey and your customer record. + * When validating a key, we will return this back to you, so you can clearly identify your user from their api key. + * @example team_123 + */ + ownerId?: string; + /** + * @description This is a place for dynamic meta data, anything that feels useful for you should go here + * @example { + * "billingTier": "PRO", + * "trialEnds": "2023-06-16T17:16:37.161Z" + * } + */ + meta?: { + [key: string]: unknown; + }; + /** + * @description A list of roles that this key should have. If the role does not exist, an error is thrown + * @example [ + * "admin", + * "finance" + * ] + */ + roles?: string[]; + /** + * @description A list of permissions that this key should have. If the permission does not exist, an error is thrown + * @example [ + * "domains.create_record", + * "say_hello" + * ] + */ + permissions?: string[]; + /** + * @description You can auto expire keys by providing a unix timestamp in milliseconds. Once Keys expire they will automatically be disabled and are no longer valid unless you enable them again. + * @example 1623869797161 + */ + expires?: number; + /** + * @description You can limit the number of requests a key can make. Once a key reaches 0 remaining requests, it will automatically be disabled and is no longer valid unless you update it. + * @example 1000 + */ + remaining?: number; + /** + * @description Unkey enables you to refill verifications for each key at regular intervals. + * @example { + * "interval": "daily", + * "amount": 100 + * } + */ + refill?: { /** - * @description The name for your Key. This is not customer facing. - * @example my key + * @description Unkey will automatically refill verifications at the set interval. + * @enum {string} */ - name?: string; - /** @description The raw key in plaintext. If provided, unkey encrypts this value and stores it securely. Provide either `hash` or `plaintext` */ - plaintext?: string; - /** @description Provide either `hash` or `plaintext` */ - hash?: { - /** @description The hashed and encoded key */ - value: string; - /** - * @description The algorithm for hashing and encoding, currently only sha256 and base64 are supported + interval: "daily" | "monthly"; + /** @description The number of verifications to refill for each occurrence is determined individually for each key. */ + amount: number; + }; + /** + * @description Unkey comes with per-key ratelimiting out of the box. + * @example { + * "type": "fast", + * "limit": 10, + * "refillRate": 1, + * "refillInterval": 60 + * } + */ + ratelimit?: { + /** + * @description Async will return a response immediately, lowering latency at the cost of accuracy. + * @default false + */ + async?: boolean; + /** + * @deprecated + * @description Fast ratelimiting doesn't add latency, while consistent ratelimiting is more accurate. + * @default fast + * @enum {string} + */ + type?: "fast" | "consistent"; + /** @description The total amount of burstable requests. */ + limit: number; + /** + * @deprecated + * @description How many tokens to refill during each refillInterval. + */ + refillRate: number; + /** + * @deprecated + * @description Determines the speed at which tokens are refilled, in milliseconds. + */ + refillInterval: number; + }; + /** + * @description Sets if key is enabled or disabled. Disabled keys are not valid. + * @default true + * @example false + */ + enabled?: boolean; + /** + * @description Environments allow you to divide your keyspace. + * + * Some applications like Stripe, Clerk, WorkOS and others have a concept of "live" and "test" keys to + * give the developer a way to develop their own application without the risk of modifying real world + * resources. + * + * When you set an environment, we will return it back to you when validating the key, so you can + * handle it correctly. + */ + environment?: string; + }[]; + }; + }; + responses: { + /** @description The key ids of all created keys */ + 200: { + content: { + "application/json": { + /** + * @description The ids of the keys. This is not a secret and can be stored as a reference if you wish. You need the keyId to update or delete a key later. + * @example [ + * "key_123", + * "key_456" + * ] + */ + keyIds: string[]; + }; + }; + }; + /** @description The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). */ + 400: { + content: { + "application/json": components["schemas"]["ErrBadRequest"]; + }; + }; + /** @description Although the HTTP standard specifies "unauthorized", semantically this response means "unauthenticated". That is, the client must authenticate itself to get the requested response. */ + 401: { + content: { + "application/json": components["schemas"]["ErrUnauthorized"]; + }; + }; + /** @description The client does not have access rights to the content; that is, it is unauthorized, so the server is refusing to give the requested resource. Unlike 401 Unauthorized, the client's identity is known to the server. */ + 403: { + content: { + "application/json": components["schemas"]["ErrForbidden"]; + }; + }; + /** @description The server cannot find the requested resource. In the browser, this means the URL is not recognized. In an API, this can also mean that the endpoint is valid but the resource itself does not exist. Servers may also send this response instead of 403 Forbidden to hide the existence of a resource from an unauthorized client. This response code is probably the most well known due to its frequent occurrence on the web. */ + 404: { + content: { + "application/json": components["schemas"]["ErrNotFound"]; + }; + }; + /** @description This response is sent when a request conflicts with the current state of the server. */ + 409: { + content: { + "application/json": components["schemas"]["ErrConflict"]; + }; + }; + /** @description The user has sent too many requests in a given amount of time ("rate limiting") */ + 429: { + content: { + "application/json": components["schemas"]["ErrTooManyRequests"]; + }; + }; + /** @description The server has encountered a situation it does not know how to handle. */ + 500: { + content: { + "application/json": components["schemas"]["ErrInternalServerError"]; + }; + }; + }; + }; + "v1.migrations.enqueueKeys": { + requestBody: { + content: { + "application/json": { + /** @description Contact support@unkey.dev to receive your migration id. */ + migrationId: string; + /** @description The id of the api, you want to migrate keys to */ + apiId: string; + keys: { + /** + * @description To make it easier for your users to understand which product an api key belongs to, you can add prefix them. + * + * For example Stripe famously prefixes their customer ids with cus_ or their api keys with sk_live_. + * + * The underscore is automatically added if you are defining a prefix, for example: "prefix": "abc" will result in a key like abc_xxxxxxxxx + */ + prefix?: string; + /** + * @description The name for your Key. This is not customer facing. + * @example my key + */ + name?: string; + /** @description The raw key in plaintext. If provided, unkey encrypts this value and stores it securely. Provide either `hash` or `plaintext` */ + plaintext?: string; + /** @description Provide either `hash` or `plaintext` */ + hash?: { + /** @description The hashed and encoded key */ + value: string; + /** + * @description The algorithm for hashing and encoding, currently only sha256 and base64 are supported * @enum {string} */ variant: "sha256_base64"; @@ -2628,39 +2857,43 @@ export interface operations { amount: number; }; /** - * @description Unkey comes with per-key ratelimiting out of the box. + * @description Unkey comes with per-key fixed-window ratelimiting out of the box. * @example { * "type": "fast", * "limit": 10, - * "refillRate": 1, - * "refillInterval": 60 + * "duration": 60000 * } */ ratelimit?: { /** * @description Async will return a response immediately, lowering latency at the cost of accuracy. - * @default false + * @default true */ async?: boolean; /** * @deprecated - * @description Fast ratelimiting doesn't add latency, while consistent ratelimiting is more accurate. + * @description Deprecated, use `async`. Fast ratelimiting doesn't add latency, while consistent ratelimiting is more accurate. * @default fast * @enum {string} */ type?: "fast" | "consistent"; - /** @description The total amount of burstable requests. */ + /** @description The total amount of requests in a given interval. */ limit: number; + /** + * @description The window duration in milliseconds + * @example 60000 + */ + duration: number; /** * @deprecated * @description How many tokens to refill during each refillInterval. */ - refillRate: number; + refillRate?: number; /** * @deprecated - * @description Determines the speed at which tokens are refilled, in milliseconds. + * @description The refill timeframe, in milliseconds. */ - refillInterval: number; + refillInterval?: number; }; /** * @description Sets if key is enabled or disabled. Disabled keys are not valid. @@ -2679,223 +2912,7 @@ export interface operations { * handle it correctly. */ environment?: string; - })[]; - }; - }; - responses: { - /** @description The key ids of all created keys */ - 200: { - content: { - "application/json": { - /** - * @description The ids of the keys. This is not a secret and can be stored as a reference if you wish. You need the keyId to update or delete a key later. - * @example [ - * "key_123", - * "key_456" - * ] - */ - keyIds: string[]; - }; - }; - }; - /** @description The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). */ - 400: { - content: { - "application/json": components["schemas"]["ErrBadRequest"]; - }; - }; - /** @description Although the HTTP standard specifies "unauthorized", semantically this response means "unauthenticated". That is, the client must authenticate itself to get the requested response. */ - 401: { - content: { - "application/json": components["schemas"]["ErrUnauthorized"]; - }; - }; - /** @description The client does not have access rights to the content; that is, it is unauthorized, so the server is refusing to give the requested resource. Unlike 401 Unauthorized, the client's identity is known to the server. */ - 403: { - content: { - "application/json": components["schemas"]["ErrForbidden"]; - }; - }; - /** @description The server cannot find the requested resource. In the browser, this means the URL is not recognized. In an API, this can also mean that the endpoint is valid but the resource itself does not exist. Servers may also send this response instead of 403 Forbidden to hide the existence of a resource from an unauthorized client. This response code is probably the most well known due to its frequent occurrence on the web. */ - 404: { - content: { - "application/json": components["schemas"]["ErrNotFound"]; - }; - }; - /** @description This response is sent when a request conflicts with the current state of the server. */ - 409: { - content: { - "application/json": components["schemas"]["ErrConflict"]; - }; - }; - /** @description The user has sent too many requests in a given amount of time ("rate limiting") */ - 429: { - content: { - "application/json": components["schemas"]["ErrTooManyRequests"]; - }; - }; - /** @description The server has encountered a situation it does not know how to handle. */ - 500: { - content: { - "application/json": components["schemas"]["ErrInternalServerError"]; - }; - }; - }; - }; - "v1.migrations.enqueueKeys": { - requestBody: { - content: { - "application/json": { - /** @description Contact support@unkey.dev to receive your migration id. */ - migrationId: string; - /** @description The id of the api, you want to migrate keys to */ - apiId: string; - keys: ({ - /** - * @description To make it easier for your users to understand which product an api key belongs to, you can add prefix them. - * - * For example Stripe famously prefixes their customer ids with cus_ or their api keys with sk_live_. - * - * The underscore is automatically added if you are defining a prefix, for example: "prefix": "abc" will result in a key like abc_xxxxxxxxx - */ - prefix?: string; - /** - * @description The name for your Key. This is not customer facing. - * @example my key - */ - name?: string; - /** @description The raw key in plaintext. If provided, unkey encrypts this value and stores it securely. Provide either `hash` or `plaintext` */ - plaintext?: string; - /** @description Provide either `hash` or `plaintext` */ - hash?: { - /** @description The hashed and encoded key */ - value: string; - /** - * @description The algorithm for hashing and encoding, currently only sha256 and base64 are supported - * @enum {string} - */ - variant: "sha256_base64"; - }; - /** - * @description The first 4 characters of the key. If a prefix is used, it should be the prefix plus 4 characters. - * @example unkey_32kq - */ - start?: string; - /** - * @description Your user’s Id. This will provide a link between Unkey and your customer record. - * When validating a key, we will return this back to you, so you can clearly identify your user from their api key. - * @example team_123 - */ - ownerId?: string; - /** - * @description This is a place for dynamic meta data, anything that feels useful for you should go here - * @example { - * "billingTier": "PRO", - * "trialEnds": "2023-06-16T17:16:37.161Z" - * } - */ - meta?: { - [key: string]: unknown; - }; - /** - * @description A list of roles that this key should have. If the role does not exist, an error is thrown - * @example [ - * "admin", - * "finance" - * ] - */ - roles?: string[]; - /** - * @description A list of permissions that this key should have. If the permission does not exist, an error is thrown - * @example [ - * "domains.create_record", - * "say_hello" - * ] - */ - permissions?: string[]; - /** - * @description You can auto expire keys by providing a unix timestamp in milliseconds. Once Keys expire they will automatically be disabled and are no longer valid unless you enable them again. - * @example 1623869797161 - */ - expires?: number; - /** - * @description You can limit the number of requests a key can make. Once a key reaches 0 remaining requests, it will automatically be disabled and is no longer valid unless you update it. - * @example 1000 - */ - remaining?: number; - /** - * @description Unkey enables you to refill verifications for each key at regular intervals. - * @example { - * "interval": "daily", - * "amount": 100 - * } - */ - refill?: { - /** - * @description Unkey will automatically refill verifications at the set interval. - * @enum {string} - */ - interval: "daily" | "monthly"; - /** @description The number of verifications to refill for each occurrence is determined individually for each key. */ - amount: number; - }; - /** - * @description Unkey comes with per-key fixed-window ratelimiting out of the box. - * @example { - * "type": "fast", - * "limit": 10, - * "duration": 60000 - * } - */ - ratelimit?: { - /** - * @description Async will return a response immediately, lowering latency at the cost of accuracy. - * @default true - */ - async?: boolean; - /** - * @deprecated - * @description Deprecated, use `async`. Fast ratelimiting doesn't add latency, while consistent ratelimiting is more accurate. - * @default fast - * @enum {string} - */ - type?: "fast" | "consistent"; - /** @description The total amount of requests in a given interval. */ - limit: number; - /** - * @description The window duration in milliseconds - * @example 60000 - */ - duration: number; - /** - * @deprecated - * @description How many tokens to refill during each refillInterval. - */ - refillRate?: number; - /** - * @deprecated - * @description The refill timeframe, in milliseconds. - */ - refillInterval?: number; - }; - /** - * @description Sets if key is enabled or disabled. Disabled keys are not valid. - * @default true - * @example false - */ - enabled?: boolean; - /** - * @description Environments allow you to divide your keyspace. - * - * Some applications like Stripe, Clerk, WorkOS and others have a concept of "live" and "test" keys to - * give the developer a way to develop their own application without the risk of modifying real world - * resources. - * - * When you set an environment, we will return it back to you when validating the key, so you can - * handle it correctly. - */ - environment?: string; - })[]; + }[]; }; }; }; @@ -3166,22 +3183,22 @@ export interface operations { 200: { content: { "application/json": { - /** - * @description The id of the permission - * @example perm_123 - */ - id: string; - /** - * @description The name of the permission. - * @example domain.record.manager - */ - name: string; - /** - * @description The description of what this permission does. This is just for your team, your users will not see this. - * @example Can manage dns records - */ - description?: string; - }[]; + /** + * @description The id of the permission + * @example perm_123 + */ + id: string; + /** + * @description The name of the permission. + * @example domain.record.manager + */ + name: string; + /** + * @description The description of what this permission does. This is just for your team, your users will not see this. + * @example Can manage dns records + */ + description?: string; + }[]; }; }; /** @description The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). */ @@ -3444,22 +3461,22 @@ export interface operations { 200: { content: { "application/json": { - /** - * @description The id of the role - * @example role_1234 - */ - id: string; - /** - * @description The name of the role. - * @example domain.record.manager - */ - name: string; - /** - * @description The description of what this role does. This is just for your team, your users will not see this. - * @example Can manage dns records - */ - description?: string; - }[]; + /** + * @description The id of the role + * @example role_1234 + */ + id: string; + /** + * @description The name of the role. + * @example domain.record.manager + */ + name: string; + /** + * @description The description of what this role does. This is just for your team, your users will not see this. + * @example Can manage dns records + */ + description?: string; + }[]; }; }; /** @description The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). */ @@ -3533,22 +3550,22 @@ export interface operations { * When verifying keys, you can specify which limits you want to use and all keys attached to this identity, will share the limits. */ ratelimits?: { - /** - * @description The name of this limit. You will need to use this again when verifying a key. - * @example tokens - */ - name: string; - /** - * @description How many requests may pass within a given window before requests are rejected. - * @example 10 - */ - limit: number; - /** - * @description The duration for each ratelimit window in milliseconds. - * @example 1000 - */ - duration: number; - }[]; + /** + * @description The name of this limit. You will need to use this again when verifying a key. + * @example tokens + */ + name: string; + /** + * @description How many requests may pass within a given window before requests are rejected. + * @example 10 + */ + limit: number; + /** + * @description The duration for each ratelimit window in milliseconds. + * @example 1000 + */ + duration: number; + }[]; }; }; }; @@ -3631,22 +3648,22 @@ export interface operations { }; /** @description When verifying keys, you can specify which limits you want to use and all keys attached to this identity, will share the limits. */ ratelimits: { - /** - * @description The name of this limit. You will need to use this again when verifying a key. - * @example tokens - */ - name: string; - /** - * @description How many requests may pass within a given window before requests are rejected. - * @example 10 - */ - limit: number; - /** - * @description The duration for each ratelimit window in milliseconds. - * @example 1000 - */ - duration: number; - }[]; + /** + * @description The name of this limit. You will need to use this again when verifying a key. + * @example tokens + */ + name: string; + /** + * @description How many requests may pass within a given window before requests are rejected. + * @example 10 + */ + limit: number; + /** + * @description The duration for each ratelimit window in milliseconds. + * @example 1000 + */ + duration: number; + }[]; }; }; }; @@ -3709,29 +3726,29 @@ export interface operations { "application/json": { /** @description A list of identities. */ identities: { - /** @description The id of this identity. Used to interact with unkey's API */ - id: string; - /** @description The id in your system */ - externalId: string; - /** @description When verifying keys, you can specify which limits you want to use and all keys attached to this identity, will share the limits. */ - ratelimits: { - /** - * @description The name of this limit. You will need to use this again when verifying a key. - * @example tokens - */ - name: string; - /** - * @description How many requests may pass within a given window before requests are rejected. - * @example 10 - */ - limit: number; - /** - * @description The duration for each ratelimit window in milliseconds. - * @example 1000 - */ - duration: number; - }[]; + /** @description The id of this identity. Used to interact with unkey's API */ + id: string; + /** @description The id in your system */ + externalId: string; + /** @description When verifying keys, you can specify which limits you want to use and all keys attached to this identity, will share the limits. */ + ratelimits: { + /** + * @description The name of this limit. You will need to use this again when verifying a key. + * @example tokens + */ + name: string; + /** + * @description How many requests may pass within a given window before requests are rejected. + * @example 10 + */ + limit: number; + /** + * @description The duration for each ratelimit window in milliseconds. + * @example 1000 + */ + duration: number; }[]; + }[]; /** * @description The cursor to use for the next page of results, if no cursor is returned, there are no more results * @example eyJrZXkiOiJrZXlfMTIzNCJ9 @@ -3824,22 +3841,22 @@ export interface operations { * When verifying keys, you can specify which limits you want to use and all keys attached to this identity, will share the limits. */ ratelimits?: { - /** - * @description The name of this limit. You will need to use this again when verifying a key. - * @example tokens - */ - name: string; - /** - * @description How many requests may pass within a given window before requests are rejected. - * @example 10 - */ - limit: number; - /** - * @description The duration for each ratelimit window in milliseconds. - * @example 1000 - */ - duration: number; - }[]; + /** + * @description The name of this limit. You will need to use this again when verifying a key. + * @example tokens + */ + name: string; + /** + * @description How many requests may pass within a given window before requests are rejected. + * @example 10 + */ + limit: number; + /** + * @description The duration for each ratelimit window in milliseconds. + * @example 1000 + */ + duration: number; + }[]; }; }; }; @@ -3868,22 +3885,22 @@ export interface operations { [key: string]: unknown; }; ratelimits: { - /** - * @description The name of this limit. - * @example tokens - */ - name: string; - /** - * @description How many requests may pass within a given window before requests are rejected. - * @example 10 - */ - limit: number; - /** - * @description The duration for each ratelimit window in milliseconds. - * @example 1000 - */ - duration: number; - }[]; + /** + * @description The name of this limit. + * @example tokens + */ + name: string; + /** + * @description How many requests may pass within a given window before requests are rejected. + * @example 10 + */ + limit: number; + /** + * @description The duration for each ratelimit window in milliseconds. + * @example 1000 + */ + duration: number; + }[]; }; }; }; @@ -4245,7 +4262,15 @@ export interface operations { * @example NOT_FOUND * @enum {string} */ - code?: "NOT_FOUND" | "FORBIDDEN" | "USAGE_EXCEEDED" | "RATE_LIMITED" | "UNAUTHORIZED" | "DISABLED" | "INSUFFICIENT_PERMISSIONS" | "EXPIRED"; + code?: + | "NOT_FOUND" + | "FORBIDDEN" + | "USAGE_EXCEEDED" + | "RATE_LIMITED" + | "UNAUTHORIZED" + | "DISABLED" + | "INSUFFICIENT_PERMISSIONS" + | "EXPIRED"; }; }; }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2a836af944..a9bf9a2b25 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -69,10 +69,10 @@ importers: version: 0.3.9 '@hono/zod-openapi': specifier: ^0.11.0 - version: 0.11.0(hono@4.5.8)(zod@3.23.8) + version: 0.11.0(hono@4.6.3)(zod@3.23.8) '@hono/zod-validator': specifier: ^0.2.1 - version: 0.2.1(hono@4.5.8)(zod@3.23.8) + version: 0.2.1(hono@4.6.3)(zod@3.23.8) '@planetscale/database': specifier: ^1.16.0 version: 1.18.0 @@ -116,8 +116,8 @@ importers: specifier: workspace:^ version: link:../../internal/worker-logging hono: - specifier: ^4.5.8 - version: 4.5.8 + specifier: ^4.6.3 + version: 4.6.3 superjson: specifier: ^2.2.1 version: 2.2.1 @@ -152,30 +152,42 @@ importers: apps/billing: dependencies: + '@agentic/serper': + specifier: ^7.0.0 + version: 7.0.0(@agentic/core@7.0.0)(zod@3.23.8) + '@ai-sdk/openai': + specifier: ^0.0.63 + version: 0.0.63(zod@3.23.8) '@chronark/zod-bird': specifier: 0.3.9 version: 0.3.9 '@clerk/nextjs': specifier: ^4.29.10 version: 4.29.10(next@14.2.10)(react-dom@18.3.1)(react@18.3.1) + '@mendable/firecrawl-js': + specifier: ^1.5.2 + version: 1.5.2(ws@8.18.0) '@planetscale/database': specifier: ^1.16.0 version: 1.18.0 '@trigger.dev/nextjs': - specifier: 3.0.0-beta.23 - version: 3.0.0-beta.23(@trigger.dev/sdk@3.0.0-beta.23)(next@14.2.10) + specifier: 3.0.9 + version: 3.0.9(@trigger.dev/sdk@3.0.9)(next@14.2.10) '@trigger.dev/sdk': - specifier: 3.0.0-beta.23 - version: 3.0.0-beta.23(typescript@5.5.3) + specifier: 3.0.9 + version: 3.0.9 '@trigger.dev/slack': - specifier: 3.0.0-beta.23 - version: 3.0.0-beta.23(typescript@5.5.3) + specifier: 3.0.9 + version: 3.0.9 '@unkey/billing': specifier: workspace:^ version: link:../../internal/billing '@unkey/db': specifier: workspace:^ version: link:../../internal/db + '@unkey/error': + specifier: workspace:^ + version: link:../../packages/error '@unkey/id': specifier: workspace:^ version: link:../../internal/id @@ -185,9 +197,15 @@ importers: '@unkey/schema': specifier: workspace:^ version: link:../../internal/schema + ai: + specifier: ^3.4.7 + version: 3.4.7(react@18.3.1)(svelte@4.2.19)(vue@3.5.10)(zod@3.23.8) drizzle-orm: - specifier: generated - version: 0.32.0-aaf764c(@opentelemetry/api@1.4.1)(@planetscale/database@1.18.0)(@types/react@18.2.79)(react@18.3.1) + specifier: ^0.33.0 + version: 0.33.0(@opentelemetry/api@1.4.1)(@planetscale/database@1.18.0)(@types/react@18.2.79)(react@18.3.1) + drizzle-zod: + specifier: ^0.5.1 + version: 0.5.1(drizzle-orm@0.33.0)(zod@3.23.8) react-dom: specifier: ^18 version: 18.3.1(react@18.3.1) @@ -207,6 +225,9 @@ importers: '@types/react-dom': specifier: ^18.2.25 version: 18.2.25 + drizzle-kit: + specifier: ^0.24.2 + version: 0.24.2 typescript: specifier: ^5.5.3 version: 5.5.3 @@ -413,10 +434,10 @@ importers: version: 3.6.0 drizzle-orm: specifier: generated - version: 0.32.0-aaf764c(@opentelemetry/api@1.4.1)(@planetscale/database@1.18.0)(@types/react@18.2.79)(react@18.3.1) + version: 0.32.0-aaf764c(@planetscale/database@1.18.0)(@types/react@18.2.79)(react@18.3.1) export-to-csv: - specifier: ^1.3.0 - version: 1.3.0 + specifier: ^1.4.0 + version: 1.4.0 framer-motion: specifier: 11.0.23 version: 11.0.23(react-dom@18.3.1)(react@18.3.1) @@ -631,8 +652,8 @@ importers: specifier: ^0.8.2 version: 0.8.2 hono: - specifier: ^4.5.8 - version: 4.5.8 + specifier: ^4.6.3 + version: 4.6.3 zod: specifier: ^3.23.5 version: 3.23.8 @@ -844,8 +865,8 @@ importers: specifier: generated version: 0.32.0-aaf764c(@cloudflare/workers-types@4.20240603.0)(@planetscale/database@1.18.0)(react@18.3.1) hono: - specifier: ^4.5.8 - version: 4.5.8 + specifier: ^4.6.3 + version: 4.6.3 openai: specifier: ^4.52.1 version: 4.52.1 @@ -915,7 +936,7 @@ importers: version: link:../../internal/schema drizzle-orm: specifier: generated - version: 0.32.0-aaf764c(@opentelemetry/api@1.4.1)(@planetscale/database@1.18.0)(@types/react@18.2.79)(react@18.3.1) + version: 0.32.0-aaf764c(@planetscale/database@1.18.0)(@types/react@18.2.79)(react@18.3.1) next: specifier: 14.2.10 version: 14.2.10(@babel/core@7.25.2)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) @@ -1018,7 +1039,7 @@ importers: version: 3.6.0 drizzle-orm: specifier: generated - version: 0.32.0-aaf764c(@opentelemetry/api@1.4.1)(@planetscale/database@1.18.0)(@types/react@18.2.79)(react@18.3.1) + version: 0.32.0-aaf764c(@planetscale/database@1.18.0)(@types/react@18.2.79)(react@18.3.1) framer-motion: specifier: 11.0.23 version: 11.0.23(react-dom@18.3.1)(react@18.3.1) @@ -1137,9 +1158,15 @@ importers: internal/billing: dependencies: + '@mendable/firecrawl-js': + specifier: ^1.5.2 + version: 1.5.2(ws@8.18.0) '@unkey/error': specifier: workspace:^ version: link:../../packages/error + ai: + specifier: ^3.0.23 + version: 3.4.7(react@18.3.1)(svelte@4.2.19)(vue@3.5.10)(zod@3.23.8) zod: specifier: ^3.23.5 version: 3.23.8 @@ -1532,8 +1559,8 @@ importers: specifier: ^20.14.9 version: 20.14.9 hono: - specifier: ^4.5.8 - version: 4.5.8 + specifier: ^4.6.3 + version: 4.6.3 msw: specifier: ^2.2.13 version: 2.2.13(typescript@5.5.3) @@ -1714,6 +1741,52 @@ packages: undici: 5.28.4 dev: false + /@agentic/core@7.0.0(zod@3.23.8): + resolution: {integrity: sha512-XkrjMf8kFxzbOqoaDIZwg8JCU+FLhn2JOQBtfqFmkVz2qtmKKgGLPwQXTmspnkjThIGYPMaWn6HRpkH8Y7w5rg==} + peerDependencies: + zod: ^3.23.8 + dependencies: + '@sindresorhus/is': 7.0.1 + dedent: 1.5.3 + delay: 6.0.0 + hash-object: 5.0.1 + is-relative-url: 4.0.0 + jsonrepair: 3.8.1 + ky: 1.7.2 + normalize-url: 8.0.1 + p-map: 7.0.2 + p-throttle: 6.2.0 + quick-lru: 7.0.0 + type-fest: 4.26.1 + zod: 3.23.8 + zod-to-json-schema: 3.23.3(zod@3.23.8) + zod-validation-error: 3.4.0(zod@3.23.8) + transitivePeerDependencies: + - babel-plugin-macros + dev: false + + /@agentic/serper@7.0.0(@agentic/core@7.0.0)(zod@3.23.8): + resolution: {integrity: sha512-BFFeHdYkxjAuOEv9EdRWBMCuqWi0WOa+oCANT5SFlc1N9DhXecY2i4ZXi/9uoAnuNTGpw/I6zSs/uysXnsRl6Q==} + peerDependencies: + '@agentic/core': 7.0.0 + zod: ^3.23.8 + dependencies: + '@agentic/core': 7.0.0(zod@3.23.8) + ky: 1.7.2 + zod: 3.23.8 + dev: false + + /@ai-sdk/openai@0.0.63(zod@3.23.8): + resolution: {integrity: sha512-VX4yDfP1zoKIoKqkFuBJGPjQ7aYFxE2GgPW8hMAolCBolQyx3+0+mgID+JmU5Jaq3PAPWtxWuuiwasPqh+e8zQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + dependencies: + '@ai-sdk/provider': 0.0.24 + '@ai-sdk/provider-utils': 1.0.20(zod@3.23.8) + zod: 3.23.8 + dev: false + /@ai-sdk/provider-utils@0.0.1(zod@3.23.8): resolution: {integrity: sha512-DpD58qFYHoPffBcODPL5od/zAsFSLymwEdtP/QqNX8qE3oQcRG9GYHbj1fZTH5b9i7COwlnJ4wYzYSkXVyd3bA==} engines: {node: '>=18'} @@ -1730,6 +1803,22 @@ packages: zod: 3.23.8 dev: false + /@ai-sdk/provider-utils@1.0.20(zod@3.23.8): + resolution: {integrity: sha512-ngg/RGpnA00eNOWEtXHenpX1MsM2QshQh4QJFjUfwcqHpM5kTfG7je7Rc3HcEDP+OkRVv2GF+X4fC1Vfcnl8Ow==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + dependencies: + '@ai-sdk/provider': 0.0.24 + eventsource-parser: 1.1.2 + nanoid: 3.3.6 + secure-json-parse: 2.7.0 + zod: 3.23.8 + dev: false + /@ai-sdk/provider@0.0.0: resolution: {integrity: sha512-Gbl9Ei8NPtM85gB/o8cY7s7CLGxK/U6QVheVaI3viFn7o6IpTfy1Ja389e2FXVMNJ4WHK2qYWSp5fAFDuKulTA==} engines: {node: '>=18'} @@ -1737,6 +1826,98 @@ packages: json-schema: 0.4.0 dev: false + /@ai-sdk/provider@0.0.24: + resolution: {integrity: sha512-XMsNGJdGO+L0cxhhegtqZ8+T6nn4EoShS819OvCgI2kLbYTIvk0GWFGD0AXJmxkxs3DrpsJxKAFukFR7bvTkgQ==} + engines: {node: '>=18'} + dependencies: + json-schema: 0.4.0 + dev: false + + /@ai-sdk/react@0.0.62(react@18.3.1)(zod@3.23.8): + resolution: {integrity: sha512-1asDpxgmeHWL0/EZPCLENxfOHT+0jce0z/zasRhascodm2S6f6/KZn5doLG9jdmarcb+GjMjFmmwyOVXz3W1xg==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ^19 + zod: ^3.0.0 + peerDependenciesMeta: + react: + optional: true + zod: + optional: true + dependencies: + '@ai-sdk/provider-utils': 1.0.20(zod@3.23.8) + '@ai-sdk/ui-utils': 0.0.46(zod@3.23.8) + react: 18.3.1 + swr: 2.2.5(react@18.3.1) + zod: 3.23.8 + dev: false + + /@ai-sdk/solid@0.0.49(zod@3.23.8): + resolution: {integrity: sha512-KnfWTt640cS1hM2fFIba8KHSPLpOIWXtEm28pNCHTvqasVKlh2y/zMQANTwE18pF2nuXL9P9F5/dKWaPsaEzQw==} + engines: {node: '>=18'} + peerDependencies: + solid-js: ^1.7.7 + peerDependenciesMeta: + solid-js: + optional: true + dependencies: + '@ai-sdk/provider-utils': 1.0.20(zod@3.23.8) + '@ai-sdk/ui-utils': 0.0.46(zod@3.23.8) + transitivePeerDependencies: + - zod + dev: false + + /@ai-sdk/svelte@0.0.51(svelte@4.2.19)(zod@3.23.8): + resolution: {integrity: sha512-aIZJaIds+KpCt19yUDCRDWebzF/17GCY7gN9KkcA2QM6IKRO5UmMcqEYja0ZmwFQPm1kBZkF2njhr8VXis2mAw==} + engines: {node: '>=18'} + peerDependencies: + svelte: ^3.0.0 || ^4.0.0 + peerDependenciesMeta: + svelte: + optional: true + dependencies: + '@ai-sdk/provider-utils': 1.0.20(zod@3.23.8) + '@ai-sdk/ui-utils': 0.0.46(zod@3.23.8) + sswr: 2.1.0(svelte@4.2.19) + svelte: 4.2.19 + transitivePeerDependencies: + - zod + dev: false + + /@ai-sdk/ui-utils@0.0.46(zod@3.23.8): + resolution: {integrity: sha512-ZG/wneyJG+6w5Nm/hy1AKMuRgjPQToAxBsTk61c9sVPUTaxo+NNjM2MhXQMtmsja2N5evs8NmHie+ExEgpL3cA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + dependencies: + '@ai-sdk/provider': 0.0.24 + '@ai-sdk/provider-utils': 1.0.20(zod@3.23.8) + json-schema: 0.4.0 + secure-json-parse: 2.7.0 + zod: 3.23.8 + zod-to-json-schema: 3.23.2(zod@3.23.8) + dev: false + + /@ai-sdk/vue@0.0.53(vue@3.5.10)(zod@3.23.8): + resolution: {integrity: sha512-FNScuIvM8N4Pj4Xto11blgI97c5cjjTelyk0M0MkyU+sLSbpQNDE78CRq5cW1oeVkJzzdv63+xh8jaFNe+2vnQ==} + engines: {node: '>=18'} + peerDependencies: + vue: ^3.3.4 + peerDependenciesMeta: + vue: + optional: true + dependencies: + '@ai-sdk/provider-utils': 1.0.20(zod@3.23.8) + '@ai-sdk/ui-utils': 0.0.46(zod@3.23.8) + swrv: 1.0.4(vue@3.5.10) + vue: 3.5.10(typescript@5.5.3) + transitivePeerDependencies: + - zod + dev: false + /@alloc/quick-lru@5.2.0: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -2504,18 +2685,13 @@ packages: resolution: {integrity: sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==} dependencies: cookie: 0.5.0 + dev: true /@bundled-es-modules/statuses@1.0.1: resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} dependencies: statuses: 2.0.1 - - /@bundled-es-modules/tough-cookie@0.1.6: - resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==} - dependencies: - '@types/tough-cookie': 4.0.5 - tough-cookie: 4.1.4 - dev: false + dev: true /@changesets/apply-release-plan@7.0.5: resolution: {integrity: sha512-1cWCk+ZshEkSVEZrm2fSj1Gz8sYvxgUL4Q78+1ZZqeqfuevPTPk033/yUZ3df8BKMohkqqHfzj0HOOrG0KtXTw==} @@ -3113,6 +3289,10 @@ packages: engines: {node: '>=10.0.0'} dev: false + /@drizzle-team/brocli@0.10.1: + resolution: {integrity: sha512-AHy0vjc+n/4w/8Mif+w86qpppHuF3AyXbcWW+R/W7GNA3F5/p2nuhlkCJaTXSLZheB4l1rtHzOfr9A7NwoR/Zg==} + dev: true + /@emnapi/runtime@1.2.0: resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} requiresBuild: true @@ -4776,7 +4956,7 @@ packages: yargs: 17.7.2 dev: false - /@hono/zod-openapi@0.11.0(hono@4.5.8)(zod@3.23.8): + /@hono/zod-openapi@0.11.0(hono@4.6.3)(zod@3.23.8): resolution: {integrity: sha512-thbxV4lWJoDo1NjF8ZGnd0muD3UHUpRqpKvS3RI+kWCXU05nyuViymUbPvVpp+O6i5SjovITTF91NRMTraZm3Q==} engines: {node: '>=16.0.0'} peerDependencies: @@ -4784,18 +4964,18 @@ packages: zod: 3.* dependencies: '@asteasolutions/zod-to-openapi': 7.1.1(zod@3.23.8) - '@hono/zod-validator': 0.2.1(hono@4.5.8)(zod@3.23.8) - hono: 4.5.8 + '@hono/zod-validator': 0.2.1(hono@4.6.3)(zod@3.23.8) + hono: 4.6.3 zod: 3.23.8 dev: false - /@hono/zod-validator@0.2.1(hono@4.5.8)(zod@3.23.8): + /@hono/zod-validator@0.2.1(hono@4.6.3)(zod@3.23.8): resolution: {integrity: sha512-HFoxln7Q6JsE64qz2WBS28SD33UB2alp3aRKmcWnNLDzEL1BLsWfbdX6e1HIiUprHYTIXf5y7ax8eYidKUwyaA==} peerDependencies: hono: '>=3.9.0' zod: ^3.19.1 dependencies: - hono: 4.5.8 + hono: 4.6.3 zod: 3.23.8 dev: false @@ -5191,6 +5371,7 @@ packages: dependencies: '@inquirer/core': 9.2.1 '@inquirer/type': 1.5.5 + dev: true /@inquirer/core@9.2.1: resolution: {integrity: sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==} @@ -5208,22 +5389,26 @@ packages: strip-ansi: 6.0.1 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.2 + dev: true /@inquirer/figures@1.0.6: resolution: {integrity: sha512-yfZzps3Cso2UbM7WlxKwZQh2Hs6plrbjs1QnzQDZhK2DgyCo6D8AaHps9olkNcUFlcYERMqU3uJSp1gmy3s/qQ==} engines: {node: '>=18'} + dev: true /@inquirer/type@1.5.5: resolution: {integrity: sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==} engines: {node: '>=18'} dependencies: mute-stream: 1.0.0 + dev: true /@inquirer/type@2.0.0: resolution: {integrity: sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==} engines: {node: '>=18'} dependencies: mute-stream: 1.0.0 + dev: true /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -5504,6 +5689,19 @@ packages: '@types/react': 18.3.8 react: 18.3.1 + /@mendable/firecrawl-js@1.5.2(ws@8.18.0): + resolution: {integrity: sha512-NksUAw2wtFO4ppUbhLiCnKrOsrxpocuwSZmonZaOhuL8ajwsu3uEBTJGuDuA1mp3De0we3BMs9+UoMs+Z5MBog==} + dependencies: + axios: 1.7.7 + isows: 1.0.6(ws@8.18.0) + typescript-event-target: 1.1.1 + zod: 3.23.8 + zod-to-json-schema: 3.23.3(zod@3.23.8) + transitivePeerDependencies: + - debug + - ws + dev: false + /@million/lint@0.0.73: resolution: {integrity: sha512-UR1VR/GorYt5bRKBtNeS2ZWj6PZk8RVpwV7WDjWmdbLqLAYv4JlRnkPAImZbJR5R50jsHpopmcqqm4mcbyZwiw==} hasBin: true @@ -5783,18 +5981,6 @@ packages: strict-event-emitter: 0.5.1 dev: true - /@mswjs/interceptors@0.35.8: - resolution: {integrity: sha512-PFfqpHplKa7KMdoQdj5td03uG05VK2Ng1dG0sP4pT9h0dGSX2v9txYt/AnrzPb/vAmfyBBC0NQV7VaBEX+efgQ==} - engines: {node: '>=18'} - dependencies: - '@open-draft/deferred-promise': 2.2.0 - '@open-draft/logger': 0.3.0 - '@open-draft/until': 2.1.0 - is-node-process: 1.2.0 - outvariant: 1.4.3 - strict-event-emitter: 0.5.1 - dev: false - /@neon-rs/load@0.0.4: resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} dev: true @@ -6495,15 +6681,18 @@ packages: /@open-draft/deferred-promise@2.2.0: resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + dev: true /@open-draft/logger@0.3.0: resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} dependencies: is-node-process: 1.2.0 outvariant: 1.4.3 + dev: true /@open-draft/until@2.1.0: resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + dev: true /@opentelemetry/api-logs@0.39.1: resolution: {integrity: sha512-9BJ8lMcOzEN0lu+Qji801y707oFO4xT3db6cosPvl+k7ItUHKN5ofWqtSbM9gbt1H4JJ/4/2TVrqI9Rq7hNv6Q==} @@ -6512,15 +6701,8 @@ packages: '@opentelemetry/api': 1.4.1 dev: false - /@opentelemetry/api-logs@0.48.0: - resolution: {integrity: sha512-1/aMiU4Eqo3Zzpfwu51uXssp5pzvHFObk8S9pKAiXb1ne8pvg1qxBQitYL1XUiAMEXFzgjaidYG2V6624DRhhw==} - engines: {node: '>=14'} - dependencies: - '@opentelemetry/api': 1.4.1 - dev: false - - /@opentelemetry/api-logs@0.49.1: - resolution: {integrity: sha512-kaNl/T7WzyMUQHQlVq7q0oV4Kev6+0xFwqzofryC66jgGMacd0QH5TwfpbUwSTby+SdAdprAe5UKMvBw4tKS5Q==} + /@opentelemetry/api-logs@0.52.1: + resolution: {integrity: sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==} engines: {node: '>=14'} dependencies: '@opentelemetry/api': 1.4.1 @@ -6549,18 +6731,18 @@ packages: '@opentelemetry/semantic-conventions': 1.13.0 dev: false - /@opentelemetry/exporter-logs-otlp-http@0.49.1(@opentelemetry/api@1.4.1): - resolution: {integrity: sha512-3QoBnIGCmEkujynUP0mK155QtOM0MSf9FNrEw7u9ieCFsoMiyatg2hPp+alEDONJ8N8wGEK+wP2q3icgXBiggw==} + /@opentelemetry/exporter-logs-otlp-http@0.52.1(@opentelemetry/api@1.4.1): + resolution: {integrity: sha512-qKgywId2DbdowPZpOBXQKp0B8DfhfIArmSic15z13Nk/JAOccBUQdPwDjDnjsM5f0ckZFMVR2t/tijTUAqDZoA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.0.0 dependencies: '@opentelemetry/api': 1.4.1 - '@opentelemetry/api-logs': 0.49.1 + '@opentelemetry/api-logs': 0.52.1 '@opentelemetry/core': 1.13.0(@opentelemetry/api@1.4.1) - '@opentelemetry/otlp-exporter-base': 0.49.1(@opentelemetry/api@1.4.1) - '@opentelemetry/otlp-transformer': 0.49.1(@opentelemetry/api@1.4.1) - '@opentelemetry/sdk-logs': 0.49.1(@opentelemetry/api-logs@0.49.1)(@opentelemetry/api@1.4.1) + '@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.4.1) + '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.4.1) + '@opentelemetry/sdk-logs': 0.52.1(@opentelemetry/api@1.4.1) dev: false /@opentelemetry/exporter-trace-otlp-grpc@0.39.1(@opentelemetry/api@1.4.1): @@ -6578,37 +6760,36 @@ packages: '@opentelemetry/sdk-trace-base': 1.13.0(@opentelemetry/api@1.4.1) dev: false - /@opentelemetry/exporter-trace-otlp-http@0.49.1(@opentelemetry/api@1.4.1): - resolution: {integrity: sha512-KOLtZfZvIrpGZLVvblKsiVQT7gQUZNKcUUH24Zz6Xbi7LJb9Vt6xtUZFYdR5IIjvt47PIqBKDWUQlU0o1wAsRw==} + /@opentelemetry/exporter-trace-otlp-http@0.52.1(@opentelemetry/api@1.4.1): + resolution: {integrity: sha512-05HcNizx0BxcFKKnS5rwOV+2GevLTVIRA0tRgWYyw4yCgR53Ic/xk83toYKts7kbzcI+dswInUg/4s8oyA+tqg==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.0.0 dependencies: '@opentelemetry/api': 1.4.1 '@opentelemetry/core': 1.13.0(@opentelemetry/api@1.4.1) - '@opentelemetry/otlp-exporter-base': 0.49.1(@opentelemetry/api@1.4.1) - '@opentelemetry/otlp-transformer': 0.49.1(@opentelemetry/api@1.4.1) + '@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.4.1) + '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.4.1) '@opentelemetry/resources': 1.13.0(@opentelemetry/api@1.4.1) '@opentelemetry/sdk-trace-base': 1.13.0(@opentelemetry/api@1.4.1) dev: false - /@opentelemetry/exporter-trace-otlp-proto@0.49.1(@opentelemetry/api@1.4.1): - resolution: {integrity: sha512-n8ON/c9pdMyYAfSFWKkgsPwjYoxnki+6Olzo+klKfW7KqLWoyEkryNkbcMIYnGGNXwdkMIrjoaP0VxXB26Oxcg==} + /@opentelemetry/exporter-trace-otlp-proto@0.52.1(@opentelemetry/api@1.4.1): + resolution: {integrity: sha512-pt6uX0noTQReHXNeEslQv7x311/F1gJzMnp1HD2qgypLRPbXDeMzzeTngRTUaUbP6hqWNtPxuLr4DEoZG+TcEQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.0.0 dependencies: '@opentelemetry/api': 1.4.1 '@opentelemetry/core': 1.13.0(@opentelemetry/api@1.4.1) - '@opentelemetry/otlp-exporter-base': 0.49.1(@opentelemetry/api@1.4.1) - '@opentelemetry/otlp-proto-exporter-base': 0.49.1(@opentelemetry/api@1.4.1) - '@opentelemetry/otlp-transformer': 0.49.1(@opentelemetry/api@1.4.1) + '@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.4.1) + '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.4.1) '@opentelemetry/resources': 1.13.0(@opentelemetry/api@1.4.1) '@opentelemetry/sdk-trace-base': 1.13.0(@opentelemetry/api@1.4.1) dev: false - /@opentelemetry/exporter-zipkin@1.22.0(@opentelemetry/api@1.4.1): - resolution: {integrity: sha512-XcFs6rGvcTz0qW5uY7JZDYD0yNEXdekXAb6sFtnZgY/cHY6BQ09HMzOjv9SX+iaXplRDcHr1Gta7VQKM1XXM6g==} + /@opentelemetry/exporter-zipkin@1.25.1(@opentelemetry/api@1.4.1): + resolution: {integrity: sha512-RmOwSvkimg7ETwJbUOPTMhJm9A9bG1U8s7Zo3ajDh4zM7eYcycQ0dM7FbLD6NXWbI2yj7UY4q8BKinKYBQksyw==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.0.0 @@ -6620,16 +6801,16 @@ packages: '@opentelemetry/semantic-conventions': 1.13.0 dev: false - /@opentelemetry/instrumentation@0.49.1(@opentelemetry/api@1.4.1): - resolution: {integrity: sha512-0DLtWtaIppuNNRRllSD4bjU8ZIiLp1cDXvJEbp752/Zf+y3gaLNaoGRGIlX4UHhcsrmtL+P2qxi3Hodi8VuKiQ==} + /@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.4.1): + resolution: {integrity: sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 dependencies: '@opentelemetry/api': 1.4.1 - '@opentelemetry/api-logs': 0.49.1 + '@opentelemetry/api-logs': 0.52.1 '@types/shimmer': 1.2.0 - import-in-the-middle: 1.7.1 + import-in-the-middle: 1.11.2 require-in-the-middle: 7.4.0 semver: 7.6.3 shimmer: 1.2.1 @@ -6647,14 +6828,15 @@ packages: '@opentelemetry/core': 1.13.0(@opentelemetry/api@1.4.1) dev: false - /@opentelemetry/otlp-exporter-base@0.49.1(@opentelemetry/api@1.4.1): - resolution: {integrity: sha512-z6sHliPqDgJU45kQatAettY9/eVF58qVPaTuejw9YWfSRqid9pXPYeegDCSdyS47KAUgAtm+nC28K3pfF27HWg==} + /@opentelemetry/otlp-exporter-base@0.52.1(@opentelemetry/api@1.4.1): + resolution: {integrity: sha512-z175NXOtX5ihdlshtYBe5RpGeBoTXVCKPPLiQlD6FHvpM4Ch+p2B0yWKYSrBfLH24H9zjJiBdTrtD+hLlfnXEQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.0.0 dependencies: '@opentelemetry/api': 1.4.1 '@opentelemetry/core': 1.13.0(@opentelemetry/api@1.4.1) + '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.4.1) dev: false /@opentelemetry/otlp-grpc-exporter-base@0.39.1(@opentelemetry/api@1.4.1): @@ -6670,18 +6852,6 @@ packages: protobufjs: 7.4.0 dev: false - /@opentelemetry/otlp-proto-exporter-base@0.49.1(@opentelemetry/api@1.4.1): - resolution: {integrity: sha512-x1qB4EUC7KikUl2iNuxCkV8yRzrSXSyj4itfpIO674H7dhI7Zv37SFaOJTDN+8Z/F50gF2ISFH9CWQ4KCtGm2A==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - dependencies: - '@opentelemetry/api': 1.4.1 - '@opentelemetry/core': 1.13.0(@opentelemetry/api@1.4.1) - '@opentelemetry/otlp-exporter-base': 0.49.1(@opentelemetry/api@1.4.1) - protobufjs: 7.4.0 - dev: false - /@opentelemetry/otlp-transformer@0.39.1(@opentelemetry/api@1.4.1): resolution: {integrity: sha512-0hgVnXXz5efI382B/24NxD4b6Zxlh7nxCdJkxkdmQMbn0yRiwoq/ZT+QG8eUL6JNzsBAV1WJlF5aJNsL8skHvw==} engines: {node: '>=14'} @@ -6697,19 +6867,20 @@ packages: '@opentelemetry/sdk-trace-base': 1.13.0(@opentelemetry/api@1.4.1) dev: false - /@opentelemetry/otlp-transformer@0.49.1(@opentelemetry/api@1.4.1): - resolution: {integrity: sha512-Z+koA4wp9L9e3jkFacyXTGphSWTbOKjwwXMpb0CxNb0kjTHGUxhYRN8GnkLFsFo5NbZPjP07hwAqeEG/uCratQ==} + /@opentelemetry/otlp-transformer@0.52.1(@opentelemetry/api@1.4.1): + resolution: {integrity: sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.9.0' + '@opentelemetry/api': '>=1.3.0 <1.10.0' dependencies: '@opentelemetry/api': 1.4.1 - '@opentelemetry/api-logs': 0.49.1 + '@opentelemetry/api-logs': 0.52.1 '@opentelemetry/core': 1.13.0(@opentelemetry/api@1.4.1) '@opentelemetry/resources': 1.13.0(@opentelemetry/api@1.4.1) - '@opentelemetry/sdk-logs': 0.49.1(@opentelemetry/api-logs@0.49.1)(@opentelemetry/api@1.4.1) - '@opentelemetry/sdk-metrics': 1.22.0(@opentelemetry/api@1.4.1) + '@opentelemetry/sdk-logs': 0.52.1(@opentelemetry/api@1.4.1) + '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.4.1) '@opentelemetry/sdk-trace-base': 1.13.0(@opentelemetry/api@1.4.1) + protobufjs: 7.4.0 dev: false /@opentelemetry/propagator-b3@1.13.0(@opentelemetry/api@1.4.1): @@ -6756,28 +6927,14 @@ packages: '@opentelemetry/resources': 1.13.0(@opentelemetry/api@1.4.1) dev: false - /@opentelemetry/sdk-logs@0.49.1(@opentelemetry/api-logs@0.48.0)(@opentelemetry/api@1.4.1): - resolution: {integrity: sha512-gCzYWsJE0h+3cuh3/cK+9UwlVFyHvj3PReIOCDOmdeXOp90ZjKRoDOJBc3mvk1LL6wyl1RWIivR8Rg9OToyesw==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.4.0 <1.9.0' - '@opentelemetry/api-logs': '>=0.39.1' - dependencies: - '@opentelemetry/api': 1.4.1 - '@opentelemetry/api-logs': 0.48.0 - '@opentelemetry/core': 1.13.0(@opentelemetry/api@1.4.1) - '@opentelemetry/resources': 1.13.0(@opentelemetry/api@1.4.1) - dev: false - - /@opentelemetry/sdk-logs@0.49.1(@opentelemetry/api-logs@0.49.1)(@opentelemetry/api@1.4.1): - resolution: {integrity: sha512-gCzYWsJE0h+3cuh3/cK+9UwlVFyHvj3PReIOCDOmdeXOp90ZjKRoDOJBc3mvk1LL6wyl1RWIivR8Rg9OToyesw==} + /@opentelemetry/sdk-logs@0.52.1(@opentelemetry/api@1.4.1): + resolution: {integrity: sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.4.0 <1.9.0' - '@opentelemetry/api-logs': '>=0.39.1' + '@opentelemetry/api': '>=1.4.0 <1.10.0' dependencies: '@opentelemetry/api': 1.4.1 - '@opentelemetry/api-logs': 0.49.1 + '@opentelemetry/api-logs': 0.52.1 '@opentelemetry/core': 1.13.0(@opentelemetry/api@1.4.1) '@opentelemetry/resources': 1.13.0(@opentelemetry/api@1.4.1) dev: false @@ -6794,11 +6951,11 @@ packages: lodash.merge: 4.6.2 dev: false - /@opentelemetry/sdk-metrics@1.22.0(@opentelemetry/api@1.4.1): - resolution: {integrity: sha512-k6iIx6H3TZ+BVMr2z8M16ri2OxWaljg5h8ihGJxi/KQWcjign6FEaEzuigXt5bK9wVEhqAcWLCfarSftaNWkkg==} + /@opentelemetry/sdk-metrics@1.25.1(@opentelemetry/api@1.4.1): + resolution: {integrity: sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.9.0' + '@opentelemetry/api': '>=1.3.0 <1.10.0' dependencies: '@opentelemetry/api': 1.4.1 '@opentelemetry/core': 1.13.0(@opentelemetry/api@1.4.1) @@ -6806,23 +6963,23 @@ packages: lodash.merge: 4.6.2 dev: false - /@opentelemetry/sdk-node@0.49.1(@opentelemetry/api@1.4.1): - resolution: {integrity: sha512-feBIT85ndiSHXsQ2gfGpXC/sNeX4GCHLksC4A9s/bfpUbbgbCSl0RvzZlmEpCHarNrkZMwFRi4H0xFfgvJEjrg==} + /@opentelemetry/sdk-node@0.52.1(@opentelemetry/api@1.4.1): + resolution: {integrity: sha512-uEG+gtEr6eKd8CVWeKMhH2olcCHM9dEK68pe0qE0be32BcCRsvYURhHaD1Srngh1SQcnQzZ4TP324euxqtBOJA==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.9.0' + '@opentelemetry/api': '>=1.3.0 <1.10.0' dependencies: '@opentelemetry/api': 1.4.1 - '@opentelemetry/api-logs': 0.49.1 + '@opentelemetry/api-logs': 0.52.1 '@opentelemetry/core': 1.13.0(@opentelemetry/api@1.4.1) '@opentelemetry/exporter-trace-otlp-grpc': 0.39.1(@opentelemetry/api@1.4.1) - '@opentelemetry/exporter-trace-otlp-http': 0.49.1(@opentelemetry/api@1.4.1) - '@opentelemetry/exporter-trace-otlp-proto': 0.49.1(@opentelemetry/api@1.4.1) - '@opentelemetry/exporter-zipkin': 1.22.0(@opentelemetry/api@1.4.1) - '@opentelemetry/instrumentation': 0.49.1(@opentelemetry/api@1.4.1) + '@opentelemetry/exporter-trace-otlp-http': 0.52.1(@opentelemetry/api@1.4.1) + '@opentelemetry/exporter-trace-otlp-proto': 0.52.1(@opentelemetry/api@1.4.1) + '@opentelemetry/exporter-zipkin': 1.25.1(@opentelemetry/api@1.4.1) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.4.1) '@opentelemetry/resources': 1.13.0(@opentelemetry/api@1.4.1) - '@opentelemetry/sdk-logs': 0.49.1(@opentelemetry/api-logs@0.49.1)(@opentelemetry/api@1.4.1) - '@opentelemetry/sdk-metrics': 1.22.0(@opentelemetry/api@1.4.1) + '@opentelemetry/sdk-logs': 0.52.1(@opentelemetry/api@1.4.1) + '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.4.1) '@opentelemetry/sdk-trace-base': 1.13.0(@opentelemetry/api@1.4.1) '@opentelemetry/sdk-trace-node': 1.13.0(@opentelemetry/api@1.4.1) '@opentelemetry/semantic-conventions': 1.13.0 @@ -8008,7 +8165,7 @@ packages: '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.2)(react@18.3.1) '@radix-ui/react-context': 1.1.0(@types/react@18.3.2)(react@18.3.1) '@radix-ui/react-dismissable-layer': 1.1.0(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.2.79)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.8)(react@18.3.1) '@radix-ui/react-focus-scope': 1.1.0(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-id': 1.1.0(react@18.3.1) '@radix-ui/react-portal': 1.1.1(react-dom@18.3.1)(react@18.3.1) @@ -8370,6 +8527,7 @@ packages: dependencies: '@types/react': 18.2.79 react: 18.3.1 + dev: false /@radix-ui/react-focus-guards@1.1.0(@types/react@18.3.8)(react@18.3.1): resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==} @@ -8382,7 +8540,6 @@ packages: dependencies: '@types/react': 18.3.8 react: 18.3.1 - dev: false /@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.8)(react@18.3.1): resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} @@ -8973,7 +9130,7 @@ packages: '@radix-ui/react-primitive': 2.0.0(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.2)(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.2)(react@18.3.1) - '@radix-ui/react-use-rect': 1.1.0(@types/react@18.2.79)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.8)(react@18.3.1) '@radix-ui/react-use-size': 1.1.0(react@18.3.1) '@radix-ui/rect': 1.1.0 react: 18.3.1 @@ -10536,6 +10693,7 @@ packages: '@radix-ui/rect': 1.1.0 '@types/react': 18.2.79 react: 18.3.1 + dev: false /@radix-ui/react-use-rect@1.1.0(@types/react@18.3.8)(react@18.3.1): resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} @@ -10549,7 +10707,6 @@ packages: '@radix-ui/rect': 1.1.0 '@types/react': 18.3.8 react: 18.3.1 - dev: false /@radix-ui/react-use-size@1.0.1(@types/react@18.2.79)(react@18.3.1): resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} @@ -11465,6 +11622,11 @@ packages: engines: {node: '>=14.16'} dev: true + /@sindresorhus/is@7.0.1: + resolution: {integrity: sha512-QWLl2P+rsCJeofkDNIT3WFmb6NrRud1SUYW8dIhXK/46XFV8Q/g7Bsvib0Askb0reRLe+WYPeeE+l5cH7SlkuQ==} + engines: {node: '>=18'} + dev: false + /@sindresorhus/merge-streams@4.0.0: resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} @@ -11767,13 +11929,6 @@ packages: engines: {node: '>=18.0.0'} dev: false - /@trigger.dev/core-backend@3.0.0-beta.23: - resolution: {integrity: sha512-MyKj2gjyiFTaQmPbS5pSj3igEyOaz15C4BFWLkPWq0TdyJHekPbf4Il9W43Z0vvhn6vrVMCeZrlg5oSVYugueA==} - engines: {node: '>=18.0.0'} - dependencies: - '@opentelemetry/api': 1.4.1 - dev: false - /@trigger.dev/core@2.3.19: resolution: {integrity: sha512-ZL5G8pBFOamgmHzg4hgjt+5jYBJlkvizTOYPAjhNlqhzq+wr1Czsp7I5JeynHSo55bc/TMen75uGh7blwBCaNw==} engines: {node: '>=18.0.0'} @@ -11783,26 +11938,26 @@ packages: zod-error: 1.5.0 dev: false - /@trigger.dev/core@3.0.0-beta.23: - resolution: {integrity: sha512-QARQNOFJtAMRXhI2W/du4D9BJ9d05XOmpeUQ7Eh+EOTkNTsN9Tc7YyFPbGXoA4fjw2q1J0qpzkH7ytEp1wDhbQ==} - engines: {node: '>=18.0.0'} + /@trigger.dev/core@3.0.9: + resolution: {integrity: sha512-J8JtlL8ibqCajgkWZyZMz9CO+KVuZka/VxActzn4f8YmujDfOcZuNkRhT0tNsYVm+XApP2FqVspN/Akmdo6eIw==} + engines: {node: '>=18.20.0'} dependencies: '@google-cloud/precise-date': 4.0.0 '@opentelemetry/api': 1.4.1 - '@opentelemetry/api-logs': 0.48.0 - '@opentelemetry/exporter-logs-otlp-http': 0.49.1(@opentelemetry/api@1.4.1) - '@opentelemetry/exporter-trace-otlp-http': 0.49.1(@opentelemetry/api@1.4.1) - '@opentelemetry/instrumentation': 0.49.1(@opentelemetry/api@1.4.1) + '@opentelemetry/api-logs': 0.52.1 + '@opentelemetry/exporter-logs-otlp-http': 0.52.1(@opentelemetry/api@1.4.1) + '@opentelemetry/exporter-trace-otlp-http': 0.52.1(@opentelemetry/api@1.4.1) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.4.1) '@opentelemetry/resources': 1.13.0(@opentelemetry/api@1.4.1) - '@opentelemetry/sdk-logs': 0.49.1(@opentelemetry/api-logs@0.48.0)(@opentelemetry/api@1.4.1) - '@opentelemetry/sdk-node': 0.49.1(@opentelemetry/api@1.4.1) + '@opentelemetry/sdk-logs': 0.52.1(@opentelemetry/api@1.4.1) + '@opentelemetry/sdk-node': 0.52.1(@opentelemetry/api@1.4.1) '@opentelemetry/sdk-trace-base': 1.13.0(@opentelemetry/api@1.4.1) '@opentelemetry/sdk-trace-node': 1.13.0(@opentelemetry/api@1.4.1) '@opentelemetry/semantic-conventions': 1.13.0 + execa: 8.0.1 humanize-duration: 3.32.1 - socket.io-client: 4.7.4 + socket.io-client: 4.7.5 superjson: 2.2.1 - ulidx: 2.4.1 zod: 3.22.3 zod-error: 1.5.0 zod-validation-error: 1.5.0(zod@3.22.3) @@ -11826,14 +11981,14 @@ packages: - supports-color dev: false - /@trigger.dev/nextjs@3.0.0-beta.23(@trigger.dev/sdk@3.0.0-beta.23)(next@14.2.10): - resolution: {integrity: sha512-uJc0qFPqllkIcXZtrePgT5TiDjD+irPM4uIBvkDmn8Durny5UvHClzOKrrW46BdqyJ0VCH5LrtbOowUcNwfe/w==} + /@trigger.dev/nextjs@3.0.9(@trigger.dev/sdk@3.0.9)(next@14.2.10): + resolution: {integrity: sha512-X+A1WCSIQl0IgPsDrQSIBlbHbUDULvDiel4B7kQzFuB0Guxvkg9kLUQjc6DIfaylyy6U8gJd/S/Atc2CoyjC8Q==} engines: {node: '>=18.0.0'} peerDependencies: - '@trigger.dev/sdk': ^3.0.0-beta.23 + '@trigger.dev/sdk': ~2.3.0 || ^3.0.0 next: '>=12.0.0' dependencies: - '@trigger.dev/sdk': 3.0.0-beta.23(typescript@5.5.3) + '@trigger.dev/sdk': 3.0.9 debug: 4.3.7(supports-color@8.1.1) next: 14.2.10(@babel/core@7.25.2)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) transitivePeerDependencies: @@ -11865,23 +12020,18 @@ packages: - utf-8-validate dev: false - /@trigger.dev/sdk@3.0.0-beta.23(typescript@5.5.3): - resolution: {integrity: sha512-L3jjLGWaIgBGYsXt/4h6Dm1ejlKaJxzjyM+7oIYA9FnoMqN8TyATnYPF/QxAT4uFu3H3aDH07yyCHHtjFo4ctA==} - engines: {node: '>=18.0.0'} + /@trigger.dev/sdk@3.0.9: + resolution: {integrity: sha512-QaUgXkFFEYjZDl9nBx9j90ALjgXqIN1JvoCLSQmzpCOyU7zj6syq6NDTeu5omy8OeaolnSBIwSj0qxw5gwAyaw==} + engines: {node: '>=18.20.0'} dependencies: '@opentelemetry/api': 1.4.1 - '@opentelemetry/api-logs': 0.48.0 + '@opentelemetry/api-logs': 0.52.1 '@opentelemetry/semantic-conventions': 1.13.0 - '@trigger.dev/core': 3.0.0-beta.23 - '@trigger.dev/core-backend': 3.0.0-beta.23 + '@trigger.dev/core': 3.0.9 chalk: 5.3.0 cronstrue: 2.50.0 debug: 4.3.7(supports-color@8.1.1) evt: 2.5.7 - get-caller-file: 2.0.5 - git-remote-origin-url: 4.0.0 - git-repo-info: 2.1.1 - msw: 2.4.9(typescript@5.5.3) slug: 6.1.0 terminal-link: 3.0.0 ulid: 2.3.0 @@ -11891,7 +12041,6 @@ packages: transitivePeerDependencies: - bufferutil - supports-color - - typescript - utf-8-validate dev: false @@ -11909,18 +12058,17 @@ packages: - utf-8-validate dev: false - /@trigger.dev/slack@3.0.0-beta.23(typescript@5.5.3): - resolution: {integrity: sha512-LZZ/2jmDaCTW7vvS605D8ICWXzrfG/YdZl9nWN0MAcTYcgyPGI/k05rYioX5qJz7beZUJN9th0fbImQHuIS9zw==} + /@trigger.dev/slack@3.0.9: + resolution: {integrity: sha512-2YYgB434xPrhM2vpf286O2yF7zVqGcAzLQIdIcUlL0XnarX2tfm/X3nmZ+arTHeMS/0iU0PS/mIFPzQ+oXLUXQ==} engines: {node: '>=16.8.0'} dependencies: '@slack/web-api': 6.12.1 - '@trigger.dev/sdk': 3.0.0-beta.23(typescript@5.5.3) + '@trigger.dev/sdk': 2.3.18 zod: 3.22.3 transitivePeerDependencies: - bufferutil - debug - supports-color - - typescript - utf-8-validate dev: false @@ -12000,6 +12148,7 @@ packages: /@types/cookie@0.6.0: resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + dev: true /@types/cookies@0.7.7: resolution: {integrity: sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==} @@ -12371,6 +12520,7 @@ packages: resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} dependencies: '@types/node': 20.14.9 + dev: true /@types/nlcst@1.0.4: resolution: {integrity: sha512-ABoYdNQ/kBSsLvZAekMhIPMQ3YUZvavStpKYs7BjLLuKVmIMA0LUgZ7b54zzuWJRbHF80v1cNf4r90Vd6eMQDg==} @@ -12427,6 +12577,7 @@ packages: resolution: {integrity: sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==} dependencies: undici-types: 6.19.8 + dev: true /@types/normalize-package-data@2.4.4: resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -12517,15 +12668,12 @@ packages: /@types/statuses@2.0.5: resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} + dev: true /@types/stylis@4.2.5: resolution: {integrity: sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==} dev: false - /@types/tough-cookie@4.0.5: - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - dev: false - /@types/unist@2.0.11: resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} @@ -12547,6 +12695,7 @@ packages: /@types/wrap-ansi@3.0.0: resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} + dev: true /@types/ws@8.5.12: resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} @@ -13118,14 +13267,6 @@ packages: mime-types: 2.1.35 negotiator: 0.6.3 - /acorn-import-assertions@1.9.0(acorn@8.12.1): - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - peerDependencies: - acorn: ^8 - dependencies: - acorn: 8.12.1 - dev: false - /acorn-import-attributes@1.9.5(acorn@8.12.1): resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} peerDependencies: @@ -13241,6 +13382,49 @@ packages: zod-to-json-schema: 3.22.5(zod@3.23.8) dev: false + /ai@3.4.7(react@18.3.1)(svelte@4.2.19)(vue@3.5.10)(zod@3.23.8): + resolution: {integrity: sha512-SutkVjFE86+xNql7fJERJkSEwpILEuiQvCoogJef6ZX/PGHvu3yepwHwVwedgABXe9SudOIKN48EQESrXX/xCw==} + engines: {node: '>=18'} + peerDependencies: + openai: ^4.42.0 + react: ^18 || ^19 + sswr: ^2.1.0 + svelte: ^3.0.0 || ^4.0.0 + zod: ^3.0.0 + peerDependenciesMeta: + openai: + optional: true + react: + optional: true + sswr: + optional: true + svelte: + optional: true + zod: + optional: true + dependencies: + '@ai-sdk/provider': 0.0.24 + '@ai-sdk/provider-utils': 1.0.20(zod@3.23.8) + '@ai-sdk/react': 0.0.62(react@18.3.1)(zod@3.23.8) + '@ai-sdk/solid': 0.0.49(zod@3.23.8) + '@ai-sdk/svelte': 0.0.51(svelte@4.2.19)(zod@3.23.8) + '@ai-sdk/ui-utils': 0.0.46(zod@3.23.8) + '@ai-sdk/vue': 0.0.53(vue@3.5.10)(zod@3.23.8) + '@opentelemetry/api': 1.4.1 + eventsource-parser: 1.1.2 + json-schema: 0.4.0 + jsondiffpatch: 0.6.0 + nanoid: 3.3.6 + react: 18.3.1 + secure-json-parse: 2.7.0 + svelte: 4.2.19 + zod: 3.23.8 + zod-to-json-schema: 3.23.2(zod@3.23.8) + transitivePeerDependencies: + - solid-js + - vue + dev: false + /ajv-draft-04@1.0.0(ajv@8.17.1): resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} peerDependencies: @@ -13313,6 +13497,7 @@ packages: engines: {node: '>=8'} dependencies: type-fest: 0.21.3 + dev: true /ansi-escapes@5.0.0: resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} @@ -14208,6 +14393,7 @@ packages: /cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} + dev: true /client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} @@ -15024,6 +15210,11 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} + /decircular@0.1.1: + resolution: {integrity: sha512-V2Vy+QYSXdgxRPmOZKQWCDf1KQNTUP/Eqswv/3W20gz7+6GB1HTosNrWqK3PqstVpFw/Dd/cGTmXSTKPeOiGVg==} + engines: {node: '>=18'} + dev: false + /decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} dependencies: @@ -15039,6 +15230,15 @@ packages: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} dev: true + /dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + dev: false + /deep-eql@4.1.4: resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} @@ -15120,6 +15320,11 @@ packages: robust-predicates: 3.0.2 dev: false + /delay@6.0.0: + resolution: {integrity: sha512-2NJozoOHQ4NuZuVIr5CWd0iiLVIRSDepakaovIN+9eIDHEhdCAEvSy2cuf1DCrPPQLvHmbqTHODlhHg8UCy4zw==} + engines: {node: '>=16'} + dev: false + /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -15361,6 +15566,18 @@ packages: - supports-color dev: true + /drizzle-kit@0.24.2: + resolution: {integrity: sha512-nXOaTSFiuIaTMhS8WJC2d4EBeIcN9OSt2A2cyFbQYBAZbi7lRsVGJNqDpEwPqYfJz38yxbY/UtbvBBahBfnExQ==} + hasBin: true + dependencies: + '@drizzle-team/brocli': 0.10.1 + '@esbuild-kit/esm-loader': 2.6.5 + esbuild: 0.19.12 + esbuild-register: 3.6.0(esbuild@0.19.12) + transitivePeerDependencies: + - supports-color + dev: true + /drizzle-orm@0.31.2(@planetscale/database@1.18.0)(mysql2@3.10.3)(react@18.3.1): resolution: {integrity: sha512-QnenevbnnAzmbNzQwbhklvIYrDE8YER8K7kSrAWQSV1YvFCdSQPzj+jzqRdTSsV2cDqSpQ0NXGyL1G9I43LDLg==} peerDependencies: @@ -15543,8 +15760,102 @@ packages: react: 18.3.1 dev: false - /drizzle-orm@0.32.0-aaf764c(@opentelemetry/api@1.4.1)(@planetscale/database@1.18.0)(@types/react@18.2.79)(react@18.3.1): + /drizzle-orm@0.32.0-aaf764c(@planetscale/database@1.18.0)(@types/react@18.2.79)(react@18.3.1): resolution: {integrity: sha512-TpG2xZhiGUyxWMJTXpVwuuFsh0VrNxPzYOZfsDaFbZS0lBbAN1xC2TBUK4pv1DMGxygq+clvqNMd908RznJZRA==} + peerDependencies: + '@aws-sdk/client-rds-data': '>=3' + '@cloudflare/workers-types': '>=3' + '@electric-sql/pglite': '>=0.1.1' + '@libsql/client': '*' + '@neondatabase/serverless': '>=0.1' + '@op-engineering/op-sqlite': '>=2' + '@opentelemetry/api': ^1.4.1 + '@planetscale/database': '>=1' + '@prisma/client': '*' + '@tidbcloud/serverless': '*' + '@types/better-sqlite3': '*' + '@types/pg': '*' + '@types/react': '>=18' + '@types/sql.js': '*' + '@vercel/postgres': '>=0.8.0' + '@xata.io/client': '*' + better-sqlite3: '>=7' + bun-types: '*' + expo-sqlite: '>=13.2.0' + knex: '*' + kysely: '*' + mysql2: '>=2' + pg: '>=8' + postgres: '>=3' + prisma: '*' + react: '>=18' + sql.js: '>=1' + sqlite3: '>=5' + peerDependenciesMeta: + '@aws-sdk/client-rds-data': + optional: true + '@cloudflare/workers-types': + optional: true + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + '@neondatabase/serverless': + optional: true + '@op-engineering/op-sqlite': + optional: true + '@opentelemetry/api': + optional: true + '@planetscale/database': + optional: true + '@prisma/client': + optional: true + '@tidbcloud/serverless': + optional: true + '@types/better-sqlite3': + optional: true + '@types/pg': + optional: true + '@types/react': + optional: true + '@types/sql.js': + optional: true + '@vercel/postgres': + optional: true + '@xata.io/client': + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + expo-sqlite: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + prisma: + optional: true + react: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + dependencies: + '@planetscale/database': 1.18.0 + '@types/react': 18.2.79 + react: 18.3.1 + dev: false + + /drizzle-orm@0.33.0(@opentelemetry/api@1.4.1)(@planetscale/database@1.18.0)(@types/react@18.2.79)(react@18.3.1): + resolution: {integrity: sha512-SHy72R2Rdkz0LEq0PSG/IdvnT3nGiWuRk+2tXZQ90GVq/XQhpCzu/EFT3V2rox+w8MlkBQxifF8pCStNYnERfA==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' '@cloudflare/workers-types': '>=3' @@ -15638,6 +15949,16 @@ packages: react: 18.3.1 dev: false + /drizzle-zod@0.5.1(drizzle-orm@0.33.0)(zod@3.23.8): + resolution: {integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==} + peerDependencies: + drizzle-orm: '>=0.23.13' + zod: '*' + dependencies: + drizzle-orm: 0.33.0(@opentelemetry/api@1.4.1)(@planetscale/database@1.18.0)(@types/react@18.2.79)(react@18.3.1) + zod: 3.23.8 + dev: false + /duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} dev: false @@ -16437,7 +16758,6 @@ packages: onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 - dev: true /execa@9.3.0: resolution: {integrity: sha512-l6JFbqnHEadBoVAVpN5dl2yCyfX28WoBAGaoQcNmLLSedOxTxcn2Qa83s8I/PA5i56vWru2OHOtrwF7Om2vqlg==} @@ -16469,8 +16789,8 @@ packages: homedir-polyfill: 1.0.3 dev: true - /export-to-csv@1.3.0: - resolution: {integrity: sha512-msPjbfozZdYzDghAEKmCVH5veMeKHNacplE6noXvGiA8AeV1qa/SOxp6JXDjF9R8Kf6v3ypI6jskiY19dkhZeA==} + /export-to-csv@1.4.0: + resolution: {integrity: sha512-6CX17Cu+rC2Fi2CyZ4CkgVG3hLl6BFsdAxfXiZkmDFIDY4mRx2y2spdeH6dqPHI9rP+AsHEfGeKz84Uuw7+Pmg==} engines: {node: ^v12.20.0 || >=v14.13.0} dev: false @@ -17192,7 +17512,6 @@ packages: /get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - dev: true /get-stream@9.0.1: resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} @@ -17490,6 +17809,16 @@ packages: engines: {node: '>= 0.4.0'} dev: false + /hash-object@5.0.1: + resolution: {integrity: sha512-iaRY4jYOow1caHkXW7wotYRjZDQk2nq4U7904anGJj8l4x1SLId+vuR8RpGoywZz9puD769hNFVFLFH9t+baJw==} + engines: {node: '>=18'} + dependencies: + decircular: 0.1.1 + is-obj: 3.0.0 + sort-keys: 5.1.0 + type-fest: 4.26.1 + dev: false + /hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -17838,6 +18167,7 @@ packages: /headers-polyfill@4.0.3: resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + dev: true /help-me@3.0.0: resolution: {integrity: sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ==} @@ -17862,9 +18192,9 @@ packages: parse-passwd: 1.0.0 dev: true - /hono@4.5.8: - resolution: {integrity: sha512-pqpSlcdqGkpTTRpLYU1PnCz52gVr0zVR9H5GzMyJWuKQLLEBQxh96q45QizJ2PPX8NATtz2mu31/PKW/Jt+90Q==} - engines: {node: '>=16.0.0'} + /hono@4.6.3: + resolution: {integrity: sha512-0LeEuBNFeSHGqZ9sNVVgZjB1V5fmhkBSB0hZrpqStSMLOWgfLy0dHOvrjbJh0H2khsjet6rbHfWTHY0kpYThKQ==} + engines: {node: '>=16.9.0'} /hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -17979,7 +18309,6 @@ packages: /human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - dev: true /human-signals@7.0.0: resolution: {integrity: sha512-74kytxOUSvNbjrT9KisAbaTZ/eJwD/LrbM/kh5j0IhPuJzwuA19dWvniFGwBzN9rVjg+O/e+F310PjObDXS+9Q==} @@ -18040,11 +18369,11 @@ packages: parent-module: 1.0.1 resolve-from: 4.0.0 - /import-in-the-middle@1.7.1: - resolution: {integrity: sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==} + /import-in-the-middle@1.11.2: + resolution: {integrity: sha512-gK6Rr6EykBcc6cVWRSBR5TWf8nn6hZMYSRYqCcHa0l0d1fPK7JSYo6+Mlmck76jIX9aL/IZ71c06U2VpFwl1zA==} dependencies: acorn: 8.12.1 - acorn-import-assertions: 1.9.0(acorn@8.12.1) + acorn-import-attributes: 1.9.5(acorn@8.12.1) cjs-module-lexer: 1.4.1 module-details-from-path: 1.0.3 dev: false @@ -18173,7 +18502,6 @@ packages: /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} - dev: true /is-alphabetical@1.0.4: resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} @@ -18384,6 +18712,7 @@ packages: /is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + dev: true /is-number-object@1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} @@ -18405,6 +18734,11 @@ packages: engines: {node: '>=8'} dev: true + /is-obj@3.0.0: + resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} + engines: {node: '>=12'} + dev: false + /is-online@10.0.0: resolution: {integrity: sha512-WCPdKwNDjXJJmUubf2VHLMDBkUZEtuOvpXUfUnUFbEnM6In9ByiScL4f4jKACz/fsb2qDkesFerW3snf/AYz3A==} engines: {node: '>=14.16'} @@ -18448,6 +18782,13 @@ packages: call-bind: 1.0.7 has-tostringtag: 1.0.2 + /is-relative-url@4.0.0: + resolution: {integrity: sha512-PkzoL1qKAYXNFct5IKdKRH/iBQou/oCC85QhXj6WKtUQBliZ4Yfd3Zk27RHu9KQG8r6zgvAA2AQKC9p+rqTszg==} + engines: {node: '>=14.16'} + dependencies: + is-absolute-url: 4.0.1 + dev: false + /is-retry-allowed@1.2.0: resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} engines: {node: '>=0.10.0'} @@ -18472,7 +18813,6 @@ packages: /is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true /is-stream@4.0.1: resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} @@ -18571,6 +18911,14 @@ packages: - encoding dev: true + /isows@1.0.6(ws@8.18.0): + resolution: {integrity: sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==} + peerDependencies: + ws: '*' + dependencies: + ws: 8.18.0 + dev: false + /iterable-lookahead@1.0.0: resolution: {integrity: sha512-hJnEP2Xk4+44DDwJqUQGdXal5VbyeWLaPyDl2AQc242Zr7iqz4DgpQOrEzglWVMGHMDCkguLHEKxd1+rOsmgSQ==} engines: {node: '>=4'} @@ -18750,6 +19098,11 @@ packages: graceful-fs: 4.2.11 dev: true + /jsonrepair@3.8.1: + resolution: {integrity: sha512-5wnjaO53EJOhfLFY92nvBz2B9gqF9ql/D4HKUb1WOSBaqtVcAifFfmurblnhCJn/ySqKFA8U3n7nhGMAu/hEjQ==} + hasBin: true + dev: false + /jwt-decode@3.1.2: resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==} dev: true @@ -18820,6 +19173,11 @@ packages: zod-validation-error: 3.4.0(zod@3.23.8) dev: true + /ky@1.7.2: + resolution: {integrity: sha512-OzIvbHKKDpi60TnF9t7UUVAF1B4mcqc02z5PIvrm08Wyb+yOcz63GRvEuVxNT18a9E1SrNouhB4W2NNLeD7Ykg==} + engines: {node: '>=18'} + dev: false + /layerr@3.0.0: resolution: {integrity: sha512-tv754Ki2dXpPVApOrjTyRo4/QegVb9eVFq4mjqp4+NM5NaX7syQvN5BBNfV/ZpAHCEHV24XdUVrBAoka4jt3pA==} dev: false @@ -20392,7 +20750,6 @@ packages: /mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} - dev: true /mimic-function@5.0.1: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} @@ -20727,37 +21084,6 @@ packages: yargs: 17.7.2 dev: true - /msw@2.4.9(typescript@5.5.3): - resolution: {integrity: sha512-1m8xccT6ipN4PTqLinPwmzhxQREuxaEJYdx4nIbggxP8aM7r1e71vE7RtOUSQoAm1LydjGfZKy7370XD/tsuYg==} - engines: {node: '>=18'} - hasBin: true - requiresBuild: true - peerDependencies: - typescript: '>= 4.8.x' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@bundled-es-modules/cookie': 2.0.0 - '@bundled-es-modules/statuses': 1.0.1 - '@bundled-es-modules/tough-cookie': 0.1.6 - '@inquirer/confirm': 3.2.0 - '@mswjs/interceptors': 0.35.8 - '@open-draft/until': 2.1.0 - '@types/cookie': 0.6.0 - '@types/statuses': 2.0.5 - chalk: 4.1.2 - graphql: 16.9.0 - headers-polyfill: 4.0.3 - is-node-process: 1.2.0 - outvariant: 1.4.3 - path-to-regexp: 6.3.0 - strict-event-emitter: 0.5.1 - type-fest: 4.26.1 - typescript: 5.5.3 - yargs: 17.7.2 - dev: false - /mustache@4.2.0: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true @@ -20770,6 +21096,7 @@ packages: /mute-stream@1.0.0: resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true /mysql2@3.10.3: resolution: {integrity: sha512-k43gmH9i79rZD4hGPdj7pDuT0UBiFjs4UzXEy1cJrV0QqcSABomoLwvejqdbcXN+Vd7gi999CVM6o9vCPKq29g==} @@ -21049,7 +21376,6 @@ packages: /normalize-url@8.0.1: resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} engines: {node: '>=14.16'} - dev: true /npm-package-arg@11.0.3: resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} @@ -21262,7 +21588,6 @@ packages: engines: {node: '>=12'} dependencies: mimic-fn: 4.0.0 - dev: true /onetime@7.0.0: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} @@ -21390,6 +21715,7 @@ packages: /outvariant@1.4.3: resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} + dev: true /p-any@4.0.0: resolution: {integrity: sha512-S/B50s+pAVe0wmEZHmBs/9yJXeZ5KhHzOsgKzt0hRdgkoR3DxW9ts46fcsWi/r3VnzsnkKS7q4uimze+zjdryw==} @@ -21467,6 +21793,11 @@ packages: aggregate-error: 3.1.0 dev: true + /p-map@7.0.2: + resolution: {integrity: sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q==} + engines: {node: '>=18'} + dev: false + /p-queue@6.6.2: resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} engines: {node: '>=8'} @@ -21490,6 +21821,11 @@ packages: p-cancelable: 3.0.0 dev: true + /p-throttle@6.2.0: + resolution: {integrity: sha512-NCKkOVj6PZa6NiTmfvGilDdf6vO1rFCD3KDnkHko8dTOtkpk4cSR/VTAhhLMG9aiQ7/A9HYgEDNmxzf6hxzR3g==} + engines: {node: '>=18'} + dev: false + /p-timeout@3.2.0: resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} engines: {node: '>=8'} @@ -21657,6 +21993,7 @@ packages: /path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + dev: true /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -22118,10 +22455,6 @@ packages: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} dev: true - /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: false - /public-ip@5.0.0: resolution: {integrity: sha512-xaH3pZMni/R2BG7ZXXaWS9Wc9wFlhyDVJF47IJ+3ali0TGv+2PsckKxbmo+rnx3ZxiV2wblVhtdS3bohAP6GGw==} engines: {node: ^14.13.1 || >=16.0.0} @@ -22228,6 +22561,11 @@ packages: engines: {node: '>=10'} dev: true + /quick-lru@7.0.0: + resolution: {integrity: sha512-MX8gB7cVYTrYcFfAnfLlhRd0+Toyl8yX8uBx1MrX7K0jegiz9TumwOK27ldXrgDlHRdVi+MqU9Ssw6dr4BNreg==} + engines: {node: '>=18'} + dev: false + /randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: @@ -22489,7 +22827,7 @@ packages: optional: true dependencies: react: 18.3.1 - react-style-singleton: 2.2.1(@types/react@18.2.79)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.8)(react@18.3.1) tslib: 2.7.0 dev: true @@ -22524,10 +22862,10 @@ packages: dependencies: react: 18.3.1 react-remove-scroll-bar: 2.3.6(react@18.3.1) - react-style-singleton: 2.2.1(@types/react@18.2.79)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.8)(react@18.3.1) tslib: 2.7.0 - use-callback-ref: 1.3.2(@types/react@18.2.79)(react@18.3.1) - use-sidecar: 1.1.2(@types/react@18.2.79)(react@18.3.1) + use-callback-ref: 1.3.2(@types/react@18.3.8)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.8)(react@18.3.1) dev: true /react-remove-scroll@2.5.5(@types/react@18.2.79)(react@18.3.1): @@ -22618,10 +22956,10 @@ packages: dependencies: react: 18.3.1 react-remove-scroll-bar: 2.3.6(react@18.3.1) - react-style-singleton: 2.2.1(@types/react@18.2.79)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.8)(react@18.3.1) tslib: 2.7.0 - use-callback-ref: 1.3.2(@types/react@18.2.79)(react@18.3.1) - use-sidecar: 1.1.2(@types/react@18.2.79)(react@18.3.1) + use-callback-ref: 1.3.2(@types/react@18.3.8)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.8)(react@18.3.1) dev: true /react-remove-scroll@2.6.0(@types/react@18.2.79)(react@18.3.1): @@ -22677,6 +23015,7 @@ packages: invariant: 2.2.4 react: 18.3.1 tslib: 2.7.0 + dev: false /react-style-singleton@2.2.1(@types/react@18.3.8)(react@18.3.1): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} @@ -22693,7 +23032,6 @@ packages: invariant: 2.2.4 react: 18.3.1 tslib: 2.7.0 - dev: false /react-syntax-highlighter@15.5.0(react@18.3.1): resolution: {integrity: sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==} @@ -23906,8 +24244,8 @@ packages: - utf-8-validate dev: false - /socket.io-client@4.7.4: - resolution: {integrity: sha512-wh+OkeF0rAVCrABWQBaEjLfb7DVPotMbu0cgWgyR0v6eA4EoVnAwcIeIbcdTE3GT/H3kbdLl7OoH2+asoDRIIg==} + /socket.io-client@4.7.5: + resolution: {integrity: sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==} engines: {node: '>=10.0.0'} dependencies: '@socket.io/component-emitter': 3.1.2 @@ -24002,6 +24340,13 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /sort-keys@5.1.0: + resolution: {integrity: sha512-aSbHV0DaBcr7u0PVHXzM6NbZNAtrr9sF6+Qfs9UUVG7Ll3jQ6hHi8F/xqIIcn2rvIVbr0v/2zyjSdwSV47AgLQ==} + engines: {node: '>=12'} + dependencies: + is-plain-obj: 4.1.0 + dev: false + /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} @@ -24113,6 +24458,15 @@ packages: swrev: 4.0.0 dev: false + /sswr@2.1.0(svelte@4.2.19): + resolution: {integrity: sha512-Cqc355SYlTAaUt8iDPaC/4DPPXK925PePLMxyBKuWd5kKc5mwsG3nT9+Mq2tyguL5s7b4Jg+IRMpTRsNTAfpSQ==} + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + dependencies: + svelte: 4.2.19 + swrev: 4.0.0 + dev: false + /stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} dev: true @@ -24134,6 +24488,7 @@ packages: /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + dev: true /std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} @@ -24167,6 +24522,7 @@ packages: /strict-event-emitter@0.5.1: resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} + dev: true /string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} @@ -24282,7 +24638,6 @@ packages: /strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} - dev: true /strip-final-newline@4.0.0: resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} @@ -24836,16 +25191,6 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} - /tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} - dependencies: - psl: 1.9.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 - dev: false - /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -25027,7 +25372,7 @@ packages: execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2) + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2) resolve-from: 5.0.0 rollup: 4.22.2 source-map: 0.8.0-beta.0 @@ -25158,6 +25503,7 @@ packages: /type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} + dev: true /type-fest@0.6.0: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} @@ -25240,6 +25586,10 @@ packages: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} dev: true + /typescript-event-target@1.1.1: + resolution: {integrity: sha512-dFSOFBKV6uwaloBCCUhxlD3Pr/P1a/tJdcmPrTXCHlEFD3faj0mztjcGn6VBAhQ0/Bdy8K3VWrrqwbt/ffsYsg==} + dev: false + /typescript@5.1.6: resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} engines: {node: '>=14.17'} @@ -25315,6 +25665,7 @@ packages: /undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + dev: true /undici@5.28.4: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} @@ -25509,11 +25860,6 @@ packages: engines: {node: '>= 4.0.0'} dev: true - /universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - dev: false - /universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -25573,6 +25919,7 @@ packages: '@types/react': 18.2.79 react: 18.3.1 tslib: 2.7.0 + dev: false /use-callback-ref@1.3.2(@types/react@18.3.8)(react@18.3.1): resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} @@ -25587,7 +25934,6 @@ packages: '@types/react': 18.3.8 react: 18.3.1 tslib: 2.7.0 - dev: false /use-sidecar@1.1.2(@types/react@18.2.79)(react@18.3.1): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} @@ -25603,6 +25949,7 @@ packages: detect-node-es: 1.1.0 react: 18.3.1 tslib: 2.7.0 + dev: false /use-sidecar@1.1.2(@types/react@18.3.8)(react@18.3.1): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} @@ -25618,7 +25965,6 @@ packages: detect-node-es: 1.1.0 react: 18.3.1 tslib: 2.7.0 - dev: false /use-sync-external-store@1.2.2(react@18.3.1): resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} @@ -26343,6 +26689,7 @@ packages: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 + dev: true /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} @@ -26586,6 +26933,7 @@ packages: /yoctocolors-cjs@2.1.2: resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} engines: {node: '>=18'} + dev: true /yoctocolors@2.1.1: resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} @@ -26618,13 +26966,20 @@ packages: zod: 3.23.8 dev: false + /zod-to-json-schema@3.23.2(zod@3.23.8): + resolution: {integrity: sha512-uSt90Gzc/tUfyNqxnjlfBs8W6WSGpNBv0rVsNxP/BVSMHMKGdthPYff4xtCHYloJGM0CFxFsb3NbC0eqPhfImw==} + peerDependencies: + zod: ^3.23.3 + dependencies: + zod: 3.23.8 + dev: false + /zod-to-json-schema@3.23.3(zod@3.23.8): resolution: {integrity: sha512-TYWChTxKQbRJp5ST22o/Irt9KC5nj7CdBKYB/AosCRdj/wxEMvv4NNaj9XVUHDOIp53ZxArGhnw5HMZziPFjog==} peerDependencies: zod: ^3.23.3 dependencies: zod: 3.23.8 - dev: true /zod-validation-error@1.5.0(zod@3.22.3): resolution: {integrity: sha512-/7eFkAI4qV0tcxMBB/3+d2c1P6jzzZYdYSlBuAklzMuCrJu5bzJfHS0yVAS87dRHVlhftd6RFJDIvv03JgkSbw==} @@ -26642,7 +26997,6 @@ packages: zod: ^3.18.0 dependencies: zod: 3.23.8 - dev: true /zod@3.22.3: resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} From e77891a806193342d133ea201fda056295b3e6fb Mon Sep 17 00:00:00 2001 From: chronark Date: Fri, 4 Oct 2024 13:17:04 +0200 Subject: [PATCH 3/3] fix: json format --- apps/engineering/content/docs/api-design/errors.mdx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/engineering/content/docs/api-design/errors.mdx b/apps/engineering/content/docs/api-design/errors.mdx index 4abaa1c367..090ffcab2b 100644 --- a/apps/engineering/content/docs/api-design/errors.mdx +++ b/apps/engineering/content/docs/api-design/errors.mdx @@ -10,11 +10,11 @@ The Unkey API returns machine readable error codes to quickly identify the type ```json { - error: { - code: "UNAUTHORIZED", - message: "We were unable to authorize your request. Either your key was missing, malformed or does not have the required permissions.", - docs: "https://unkey.api/docs/api-reference/errors/code/UNAUTHORIZEDT", - requestId: "req_1234567890" + "error": { + "code": "UNAUTHORIZED", + "message": "We were unable to authorize your request. Either your key was missing, malformed or does not have the required permissions.", + "docs": "https://unkey.api/docs/api-reference/errors/code/UNAUTHORIZED", + "requestId": "req_1234567890" } } ```