From 6045b9f2a0e7901f421d1b4107e2aeae1b35e64e Mon Sep 17 00:00:00 2001 From: Dimitri Kennedy Date: Sat, 11 Jul 2026 20:59:53 -0400 Subject: [PATCH 1/5] Add schema.stream documentation site --- .changeset/documentation-site.md | 6 + .devcontainer/Dockerfile | 18 + .devcontainer/README.md | 41 + .devcontainer/devcontainer.json | 41 + .github/workflows/ci.yml | 7 +- .gitignore | 6 + AGENTS.md | 4 + CONTRIBUTING.md | 24 + README.md | 32 +- bun.lock | 556 +++++- docs/benchmarks/2026-07-11-apple-m5-max.json | 4 +- docs/benchmarks/latest.md | 46 + docs/integrations/README.md | 29 + docs/integrations/bun-websocket.md | 76 + docs/integrations/mastra.md | 98 + docs/integrations/openai-agents.md | 82 + docs/integrations/provider-portability.md | 74 + docs/integrations/vercel-ai-sdk.md | 86 + docs/reference/api.md | 360 ++++ docs/snapshot-policies.md | 8 +- examples/websocket-ui/server.ts | 73 +- package.json | 13 +- scripts/docs/benchmark.ts | 248 +++ scripts/docs/config.ts | 19 + scripts/docs/generate.ts | 67 + scripts/docs/markdown.ts | 235 +++ scripts/docs/prepare.ts | 388 ++++ scripts/docs/public-api.ts | 426 ++++ scripts/docs/tsconfig.json | 8 + site/app/(home)/page.tsx | 190 ++ site/app/api/search/route.ts | 4 + site/app/benchmarks/page.tsx | 179 ++ site/app/docs/[[...slug]]/page.tsx | 54 + site/app/docs/layout.tsx | 12 + site/app/examples/page.tsx | 79 + site/app/global.css | 1822 ++++++++++++++++++ site/app/icon.tsx | 25 + site/app/layout.tsx | 69 + site/app/llms-full.txt/route.ts | 15 + site/app/llms.mdx/docs/[[...slug]]/route.ts | 38 + site/app/llms.txt/route.ts | 15 + site/app/manifest.ts | 20 + site/app/not-found.tsx | 17 + site/app/opengraph-image.tsx | 62 + site/app/playground/page.tsx | 19 + site/app/robots.ts | 15 + site/app/sitemap.ts | 21 + site/app/twitter-image.tsx | 62 + site/components/copy-command.tsx | 34 + site/components/mdx.tsx | 15 + site/components/playground-client.tsx | 386 ++++ site/components/progressive-example.tsx | 120 ++ site/components/site-header.tsx | 59 + site/lib/benchmark-data.ts | 57 + site/lib/examples.ts | 48 + site/lib/get-llm-text.ts | 94 + site/lib/layout.shared.tsx | 35 + site/lib/repository.ts | 4 + site/lib/site.ts | 12 + site/lib/source.ts | 7 + site/next-env.d.ts | 6 + site/next.config.mjs | 26 + site/package.json | 36 + site/postcss.config.mjs | 5 + site/proxy.ts | 49 + site/source.config.ts | 21 + site/tsconfig.json | 21 + tests/snapshot-policy.benchmark.mts | 126 +- tests/websocket-example.test.ts | 63 +- vercel.json | 7 + 70 files changed, 6932 insertions(+), 92 deletions(-) create mode 100644 .changeset/documentation-site.md create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/README.md create mode 100644 .devcontainer/devcontainer.json create mode 100644 docs/benchmarks/latest.md create mode 100644 docs/integrations/README.md create mode 100644 docs/integrations/bun-websocket.md create mode 100644 docs/integrations/mastra.md create mode 100644 docs/integrations/openai-agents.md create mode 100644 docs/integrations/provider-portability.md create mode 100644 docs/integrations/vercel-ai-sdk.md create mode 100644 docs/reference/api.md create mode 100644 scripts/docs/benchmark.ts create mode 100644 scripts/docs/config.ts create mode 100644 scripts/docs/generate.ts create mode 100644 scripts/docs/markdown.ts create mode 100644 scripts/docs/prepare.ts create mode 100644 scripts/docs/public-api.ts create mode 100644 scripts/docs/tsconfig.json create mode 100644 site/app/(home)/page.tsx create mode 100644 site/app/api/search/route.ts create mode 100644 site/app/benchmarks/page.tsx create mode 100644 site/app/docs/[[...slug]]/page.tsx create mode 100644 site/app/docs/layout.tsx create mode 100644 site/app/examples/page.tsx create mode 100644 site/app/global.css create mode 100644 site/app/icon.tsx create mode 100644 site/app/layout.tsx create mode 100644 site/app/llms-full.txt/route.ts create mode 100644 site/app/llms.mdx/docs/[[...slug]]/route.ts create mode 100644 site/app/llms.txt/route.ts create mode 100644 site/app/manifest.ts create mode 100644 site/app/not-found.tsx create mode 100644 site/app/opengraph-image.tsx create mode 100644 site/app/playground/page.tsx create mode 100644 site/app/robots.ts create mode 100644 site/app/sitemap.ts create mode 100644 site/app/twitter-image.tsx create mode 100644 site/components/copy-command.tsx create mode 100644 site/components/mdx.tsx create mode 100644 site/components/playground-client.tsx create mode 100644 site/components/progressive-example.tsx create mode 100644 site/components/site-header.tsx create mode 100644 site/lib/benchmark-data.ts create mode 100644 site/lib/examples.ts create mode 100644 site/lib/get-llm-text.ts create mode 100644 site/lib/layout.shared.tsx create mode 100644 site/lib/repository.ts create mode 100644 site/lib/site.ts create mode 100644 site/lib/source.ts create mode 100644 site/next-env.d.ts create mode 100644 site/next.config.mjs create mode 100644 site/package.json create mode 100644 site/postcss.config.mjs create mode 100644 site/proxy.ts create mode 100644 site/source.config.ts create mode 100644 site/tsconfig.json create mode 100644 vercel.json diff --git a/.changeset/documentation-site.md b/.changeset/documentation-site.md new file mode 100644 index 0000000..3e6cea4 --- /dev/null +++ b/.changeset/documentation-site.md @@ -0,0 +1,6 @@ +--- +"schema-stream": patch +--- + +Link the package to schema.stream and add the generated documentation site, executable integration +guides, reproducible benchmark evidence, and browser playground. diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..456f287 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,18 @@ +FROM oven/bun:1.3.14 AS bun-runtime + +FROM node:24.18.0-bookworm-slim + +ARG BUN_VERSION=1.3.14 + +SHELL ["/bin/bash", "-o", "pipefail", "-c"] + +COPY --from=bun-runtime /usr/local/bin/bun /usr/local/bin/bun + +RUN apt-get update \ + && apt-get install --yes --no-install-recommends ca-certificates git \ + && rm -rf /var/lib/apt/lists/* \ + && ln --symbolic /usr/local/bin/bun /usr/local/bin/bunx \ + && test "$(bun --version)" = "${BUN_VERSION}" \ + && test "$(node --version)" = "v24.18.0" + +USER node diff --git a/.devcontainer/README.md b/.devcontainer/README.md new file mode 100644 index 0000000..f3d80d2 --- /dev/null +++ b/.devcontainer/README.md @@ -0,0 +1,41 @@ +# Schema Stream development container + +This container pins Node.js 24.18.0 and Bun 1.3.14, installs the lockfile with +`bun install --frozen-lockfile`, and forwards the WebSocket example on port 3400. It works with +GitHub Codespaces or a local editor that supports the Development Container specification. + +Create an editor and terminal workspace at +[codespaces.new/hack-dance/schema-stream](https://codespaces.new/hack-dance/schema-stream), or open +the repository locally with your editor's **Reopen in Container** command. Codespaces availability +and included usage depend on the developer's GitHub plan; the local container path has no hosted +workspace charge. + +The safe default is credential-free: live E2E is disabled and the WebSocket UI opens in Fixture +mode. Run the deterministic checks from the repository root: + +```sh +bun run examples +bun test tests/sdk-runtime.test.ts +``` + +Run the browser example locally: + +```sh +bun run example:websocket +``` + +Then open . In Codespaces, start it with the exact private forwarded origin: + +```sh +SCHEMA_STREAM_EXAMPLE_ORIGIN="https://${CODESPACE_NAME}-3400.${GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN}" \ +bun run example:websocket +``` + +Open the forwarded port from the **Ports** panel. Keep it private. The example validates this exact +origin rather than accepting arbitrary proxy hosts. + +`OPENAI_API_KEY` is an optional [recommended Codespaces +secret](https://docs.github.com/en/codespaces/setting-up-your-project-for-codespaces/configuring-dev-containers/specifying-recommended-secrets-for-a-repository). +Associate a personal secret with the repository before creating the codespace to enable the +explicit OpenAI mode. Never paste a key into the documentation website, browser UI, source files, +or terminal history. diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..3ff8a0d --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,41 @@ +{ + "name": "Schema Stream", + "build": { + "context": "..", + "dockerfile": "Dockerfile", + "args": { + "BUN_VERSION": "1.3.14" + } + }, + "containerEnv": { + "SCHEMA_STREAM_EXAMPLE_PORT": "3400", + "SCHEMA_STREAM_LIVE_E2E": "0" + }, + "forwardPorts": [3400], + "hostRequirements": { + "cpus": 2, + "memory": "4gb", + "storage": "16gb" + }, + "otherPortsAttributes": { + "onAutoForward": "silent" + }, + "portsAttributes": { + "3400": { + "label": "Schema Stream WebSocket example", + "onAutoForward": "notify", + "protocol": "http" + } + }, + "postCreateCommand": "bun install --frozen-lockfile", + "remoteUser": "node", + "runArgs": ["--init"], + "secrets": { + "OPENAI_API_KEY": { + "description": "Optional personal OpenAI API key for explicitly selected live examples. Fixture examples and the default test suite do not need it.", + "documentationUrl": "https://platform.openai.com/api-keys" + } + }, + "updateRemoteUserUID": true, + "waitFor": "postCreateCommand" +} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6030234..4bf2d0c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -42,8 +42,11 @@ jobs: - name: Test with coverage run: bun run test:coverage - - name: Build - run: bun run build + - name: Verify documentation sources + run: bun run docs:check + + - name: Build package and documentation site + run: bun run docs:build - name: Verify packed consumers run: bun run test:packed diff --git a/.gitignore b/.gitignore index 829e19e..a8dc9d2 100644 --- a/.gitignore +++ b/.gitignore @@ -4,12 +4,18 @@ node_modules # Build and test output coverage dist +.source +site/.next +site/.source +site/content/docs +site/public/generated # Local configuration .env .env.* !.env.example .mise.local.toml +.vercel # Local credentials and signing material *.key diff --git a/AGENTS.md b/AGENTS.md index 79c0786..9d69a43 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -56,6 +56,10 @@ bun run check - Avoid narration-style inline comments. Use an inline comment only for a subtle invariant, protocol detail, compatibility workaround, or actionable TODO with context. - Update README or focused files under `docs/` when public behavior, configuration, performance tradeoffs, or compatibility changes. - Keep examples executable, type-correct, and representative of the published API. +- Treat `README.md`, `docs/**/*.md`, `CHANGELOG.md`, and `CONTRIBUTING.md` as the canonical sources for both GitHub and schema.stream. Never edit ignored `site/content/docs/`; `bun run docs:prepare` rebuilds it. +- Run `bun run docs:generate` after changing public exports, exported TSDoc, or checked-in benchmark evidence. Commit the generated `docs/reference/api.md` and `docs/benchmarks/latest.md` updates. +- Run `bun run docs:check` for generated drift and Markdown link coverage, and `bun run docs:build` for the complete production documentation build. +- Keep browser examples credential-free. Live-provider examples must use user-owned server or Codespaces secrets and must never ask for an API key in the deployed docs UI. ## Testing expectations diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ad80814..3799298 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -46,6 +46,30 @@ The opt-in live provider matrix fails closed when explicitly enabled without its credential variables. See [`docs/integration-testing.md`](./docs/integration-testing.md) for secure runtime injection, provider selection, and the exact verification contract. +## Documentation + +Edit `README.md`, `docs/**/*.md`, `CHANGELOG.md`, and `CONTRIBUTING.md` as the canonical sources for +both GitHub and [schema.stream](https://schema.stream/). Do not edit the ignored +`site/content/docs/` staging directory directly. + +Regenerate checked-in API and benchmark reference pages after changing exported TSDoc, public +exports, or benchmark evidence: + +```sh +bun run docs:generate +``` + +Verify generated-file drift and Markdown links, then build the package and production docs site: + +```sh +bun run docs:check +bun run docs:build +``` + +For local documentation work, `bun run docs:dev` prepares the canonical Markdown and serves the +site at `http://127.0.0.1:3401`. Browser examples must remain credential-free; live-provider +examples read user-owned secrets only from the server or Codespaces environment. + ## Benchmarking Run the Bun and Node snapshot benchmark after changes to parser hot paths, snapshot materialization, diff --git a/README.md b/README.md index 82c1dd4..95d321b 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,9 @@ [![CI](https://github.com/hack-dance/schema-stream/actions/workflows/ci.yml/badge.svg)](https://github.com/hack-dance/schema-stream/actions/workflows/ci.yml) [![Follow @dimitrikennedy](https://img.shields.io/twitter/follow/dimitrikennedy?style=social&labelColor=000000)](https://twitter.com/dimitrikennedy) +[Documentation](https://schema.stream/docs) · [Examples](https://schema.stream/examples) · +[Benchmarks](https://schema.stream/benchmarks) · [Playground](https://schema.stream/playground) + Parse JSON while it is still arriving. `schema-stream` turns a Web Stream or async iterable into typed, schema-shaped snapshots, so a UI can render partial strings, nested objects, and arrays before the response is complete. @@ -143,22 +146,25 @@ Run the repeatable Bun and Node benchmark from a repository checkout: bun run benchmark ``` -The benchmark compares three feature-aligned paths for each snapshot policy: serialized byte -snapshots from `parse()`, those same snapshots materialized through UTF-8 decoding and `JSON.parse`, -and direct object snapshots from `iterate()`. The terminal summary reports the speedup of -`iterate()` over the serialized round-trip baseline and the cumulative serialization it avoids. +The benchmark compares three feature-aligned paths for each snapshot policy. `parse()` materializes +each byte snapshot through `JSON.stringify` and UTF-8 encoding. The serialized baseline then +decodes each snapshot and applies `JSON.parse`; the direct candidate uses `iterate()` to emit the +same independent object snapshot without that round trip. The terminal summary reports the speedup +of the direct candidate over the serialized baseline and the cumulative serialization it avoids. It also reports normalized `JSON.stringify`, UTF-8 encoding, and `JSON.parse` costs as native runtime references. Those isolated operations are not presented as equivalent alternatives to -progressive schema-shaped parsing. Results are local synthetic measurements; the runtime versions, -fixture size, chunk size, warmups, and sample count printed by the command define each result. +progressive schema-shaped parsing, and the benchmark does not claim SchemaStream is faster than +standalone `JSON.parse` or `JSON.stringify`. Results are local synthetic measurements; the runtime +versions, fixture size, chunk size, warmups, and sample count printed by the command define each +result. Representative local results from an Apple M5 Max arm64 host on July 11, 2026 are shown below. These are medians from the default 2 MiB fixtures, 64 KiB chunks, one warmup, and five measured runs. The [machine-readable evidence](./docs/benchmarks/2026-07-11-apple-m5-max.json) retains the raw samples, host, baseline revision, validation method, and benchmark configuration. -| Runtime | Fixture / policy | Roundtrip | `iterate()` | Speedup | Serialization avoided | +| Runtime | Fixture / policy | Serialized round trip | Direct object | Speedup | Serialization avoided | | --- | --- | ---: | ---: | ---: | ---: | | Bun 1.3.14 | long string / chunk | 11.94 ms | 1.53 ms | 7.80x | 33.00 MiB | | Bun 1.3.14 | long string / final | 1.95 ms | 1.29 ms | 1.52x | 2.00 MiB | @@ -372,6 +378,9 @@ bun run format bun run lint bun run examples bun run benchmark +bun run docs:dev +bun run docs:check +bun run docs:build bun run check ``` @@ -381,7 +390,14 @@ declarations with TypeScript 7.0.2. TypeScript is a development-only dependency, Ultracite and Biome own formatting and linting. `bun run format` applies safe fixes, `bun run lint` checks the repository without writing, and `bun run check` includes linting before type checks, -tests, and packed-consumer verification. +tests, packed-consumer verification, generated-doc drift checks, and the production docs build. + +The checked-in Markdown in `README.md`, `docs/`, `CHANGELOG.md`, and `CONTRIBUTING.md` is the +documentation source of truth for both GitHub and [schema.stream](https://schema.stream). Public API +reference Markdown is generated from exported TSDoc, benchmark summaries are generated from the +latest checked-in JSON evidence, and `site/content/docs` is an ignored build-stage copy. Run +`bun run docs:generate` after changing exports, public TSDoc, or benchmark evidence; never edit the +staged site content directly. `test:packed` installs the generated tarball into clean consumers and verifies ESM, CommonJS, Zod 4/Mini, Zod 3, OpenAI Agents SDK, Mastra, and Vercel AI SDK compatibility with TypeScript 5.9 diff --git a/bun.lock b/bun.lock index 7047170..7d29eb2 100644 --- a/bun.lock +++ b/bun.lock @@ -22,6 +22,34 @@ "zod": "^3.25.0 || ^4.0.0", }, }, + "site": { + "name": "@schema-stream/docs", + "version": "0.0.0", + "dependencies": { + "@vercel/analytics": "2.0.1", + "@vercel/speed-insights": "2.0.0", + "fumadocs-core": "16.11.3", + "fumadocs-mdx": "15.1.0", + "fumadocs-ui": "16.11.3", + "geist": "1.7.0", + "lucide-react": "1.24.0", + "motion": "12.42.2", + "next": "16.2.10", + "react": "19.2.7", + "react-dom": "19.2.7", + "schema-stream": "file:..", + "zod": "^4.4.3", + }, + "devDependencies": { + "@tailwindcss/postcss": "4.3.2", + "@types/mdx": "2.0.14", + "@types/node": "24.13.3", + "@types/react": "19.2.17", + "@types/react-dom": "19.2.3", + "tailwindcss": "4.3.2", + "typescript": "5.9.3", + }, + }, }, "overrides": { "esbuild": "^0.28.1", @@ -49,6 +77,8 @@ "@ai-sdk/ui-utils-v5": ["@ai-sdk/ui-utils@1.2.11", "", { "dependencies": { "@ai-sdk/provider": "1.1.3", "@ai-sdk/provider-utils": "2.2.8", "zod-to-json-schema": "^3.24.1" }, "peerDependencies": { "zod": "^3.23.8" } }, "sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w=="], + "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], + "@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="], "@biomejs/biome": ["@biomejs/biome@2.5.2", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.5.2", "@biomejs/cli-darwin-x64": "2.5.2", "@biomejs/cli-linux-arm64": "2.5.2", "@biomejs/cli-linux-arm64-musl": "2.5.2", "@biomejs/cli-linux-x64": "2.5.2", "@biomejs/cli-linux-x64-musl": "2.5.2", "@biomejs/cli-win32-arm64": "2.5.2", "@biomejs/cli-win32-x64": "2.5.2" }, "bin": { "biome": "bin/biome" } }, "sha512-VQ3RCqr7JmDIX+w6stWYl+g/3bYofN3q2wDBHUKKc/c7i5QWrFKFBZYCYPWTE6agsUPMIZZe6/CMmVUfUAhkKA=="], @@ -111,6 +141,8 @@ "@clack/prompts": ["@clack/prompts@1.7.0", "", { "dependencies": { "@clack/core": "1.4.3", "fast-string-width": "^3.0.2", "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" } }, "sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A=="], + "@emnapi/runtime": ["@emnapi/runtime@1.11.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ=="], "@esbuild/android-arm": ["@esbuild/android-arm@0.28.1", "", { "os": "android", "cpu": "arm" }, "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ=="], @@ -177,6 +209,18 @@ "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], + "@floating-ui/core": ["@floating-ui/core@1.8.0", "", { "dependencies": { "@floating-ui/utils": "^0.2.12" } }, "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ=="], + + "@floating-ui/dom": ["@floating-ui/dom@1.8.0", "", { "dependencies": { "@floating-ui/core": "^1.8.0", "@floating-ui/utils": "^0.2.12" } }, "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg=="], + + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.9", "", { "dependencies": { "@floating-ui/dom": "^1.8.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg=="], + + "@floating-ui/utils": ["@floating-ui/utils@0.2.12", "", {}, "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww=="], + + "@fuma-translate/react": ["@fuma-translate/react@1.0.2", "", { "peerDependencies": { "@types/react": "*", "react": "^19.2.0", "react-dom": "^19.2.0" }, "optionalPeers": ["@types/react"] }, "sha512-uOiOtBx3nRXR8Nu1GzBf1tApgF1FErDBTHxRIAQeyQdyOoZbrNRN6H4kDCWObY4qyGeGbHydG0DHzgeUgFDMIw=="], + + "@fumadocs/tailwind": ["@fumadocs/tailwind@0.1.1", "", { "peerDependencies": { "tailwindcss": "^4.0.0" }, "optionalPeers": ["tailwindcss"] }, "sha512-BnPe52UxSaG8yKlHMKBxXw8h6GpK5qO55ci6+Qd5JnquTvIw6SpfbC1P+qAi82PuPWv1KZAWY8bxRk4+x9ctXw=="], + "@hono/node-server": ["@hono/node-server@1.19.14", "", { "peerDependencies": { "hono": "^4" } }, "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw=="], "@humanfs/core": ["@humanfs/core@0.19.2", "", { "dependencies": { "@humanfs/types": "^0.15.0" } }, "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA=="], @@ -189,12 +233,64 @@ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + "@img/colour": ["@img/colour@1.1.0", "", {}, "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="], + + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="], + + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="], + + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="], + + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="], + + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="], + + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="], + + "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="], + + "@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="], + + "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="], + + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="], + + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="], + + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="], + + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="], + + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="], + + "@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA=="], + + "@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.2.4" }, "os": "linux", "cpu": "none" }, "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw=="], + + "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="], + + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="], + + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="], + + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="], + + "@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="], + + "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="], + + "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="], + + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], + "@inquirer/external-editor": ["@inquirer/external-editor@1.0.3", "", { "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA=="], "@isaacs/ttlcache": ["@isaacs/ttlcache@2.1.5", "", {}, "sha512-VwGZqqjAWPICTmxUZnbpEfO60LhPWzquik+bmyXGY7pYRn6diEvCI5i6Ca+J6o2y4vS73HrpuMTo2dOvUevH8w=="], "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], @@ -213,8 +309,28 @@ "@mastra/schema-compat": ["@mastra/schema-compat@1.3.3", "", { "dependencies": { "json-schema-to-zod": "^2.7.0", "zod-from-json-schema": "^0.5.2", "zod-from-json-schema-v3": "npm:zod-from-json-schema@^0.0.5", "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-NqptophFxMB8Z3vXjnLAMbj2OMbspAA6Tqf3DQkxxNmlBH9RYhA4xqwK8/fum0lrgmYzVrsSkw7SwHrgVDcg6g=="], + "@mdx-js/mdx": ["@mdx-js/mdx@3.1.1", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "acorn": "^8.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ=="], + "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.29.0", "", { "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.2.1", "express-rate-limit": "^8.2.1", "hono": "^4.11.4", "jose": "^6.1.3", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ=="], + "@next/env": ["@next/env@16.2.10", "", {}, "sha512-zLPxg9M0MEHmygpj5OuxjQ+vHMiy/K7cSp74G8ecYolmgUWw0RwN02tF56npup/+qaI8JB97hQgS/r2Hb6QwVA=="], + + "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@16.2.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-v9IdJCa0H0mbo+8z5zwUpOk1Vj7RjkcI5uNYf5Ws1y6szf/p3Mzl9hLaST8SCt6L9h8NGnruZcd2+o0NTNwDhA=="], + + "@next/swc-darwin-x64": ["@next/swc-darwin-x64@16.2.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-17IS0jJRViROGmA9uGdNR8VPJpfbnaVG7E9qhso5jDLkmyd0lSDORWxbcKINzcFqzZqGwGtMSnrFRxBpuUYjLQ=="], + + "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@16.2.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-GRQRsRtuciNJvB54AvvuQTiq0oZtFwa1owQqtZD8wwnGpM2L39MV22kpI72YSXLKIyY40LC66EiLFv4PiicXxg=="], + + "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@16.2.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-zkN9MQYS7UQBro+FnISUq1itaQjXI9xqISzuQ+2bc921NcJ1x4yPCqrn77tVN6/dOOXaaWVX3k6/bR07pPwK+A=="], + + "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@16.2.10", "", { "os": "linux", "cpu": "x64" }, "sha512-iCVJnwvrPYECvA6WM/7+oo+OiTvedIKLxtCLAZP4xZR3nXa1zmzZyLPbYCmWvpd4CvMYF1EMTafd0ii3DygLvA=="], + + "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@16.2.10", "", { "os": "linux", "cpu": "x64" }, "sha512-ov2g4H0dHY9bPoOU83m91hWT7Iq5qy13bUnyyshLU3HGR1Ownn0X9QpmDPc5iIUaahTp7f7LeGAhV4DSFtackw=="], + + "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@16.2.10", "", { "os": "win32", "cpu": "arm64" }, "sha512-DwAnhLX76HQiFFQNgWlcK+JzlnD1rZ+UK/WY0ZMI/deXpvgnesjNYrqcfo1JzBuz4Kf7o3brIBL0glI1junatA=="], + + "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@16.2.10", "", { "os": "win32", "cpu": "x64" }, "sha512-0JXq3b85Jk9Jg4ntLUbXSPvoDw3gpZou7twuKdoFG2jOw635v7+IiXfTaa0TxVMyx78pUjnrVYwLgjKfX4e6/A=="], + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], @@ -229,10 +345,80 @@ "@openai/agents-realtime": ["@openai/agents-realtime@0.13.1", "", { "dependencies": { "@openai/agents-core": "0.13.1", "@types/ws": "^8.18.1", "debug": "^4.4.0", "ws": "^8.21.0" }, "peerDependencies": { "zod": "^4.0.0" } }, "sha512-1wAOGWl5qBM1WVVpWYKFiYMs3QJdb3ynmP+xToivTml5HkWgpitqMiX2VGlyAhn4khFFCDvX/7X0pZFhLkaViA=="], + "@orama/orama": ["@orama/orama@3.1.18", "", {}, "sha512-a61ljmRVVyG5MC/698C8/FfFDw5a8LOIvyOLW5fztgUXqUpc1jOfQzOitSCbge657OgXXThmY3Tk8fpiDb4UcA=="], + "@posthog/core": ["@posthog/core@1.40.2", "", { "dependencies": { "@posthog/types": "^1.393.0" } }, "sha512-H12j7O9iHGvpK9t2ko8W4pvfbV1pBDxrsWC1LA6yp2RhzwvC4T3sWhu+AekDQJSRSrJEWlB0t/Ueq9QhPSq7FQ=="], "@posthog/types": ["@posthog/types@1.393.0", "", {}, "sha512-vzWeEJZ7ERQhFRoQYaP5jzN1JvIu46UJyHXsuv+dTGW2r3sMgREOhNxXLZjmFHwZ8/FOHQoyqqQmXTCXZSfMSg=="], + "@radix-ui/number": ["@radix-ui/number@1.1.2", "", {}, "sha512-ceTwaxc4I5IOi97DgCotl3pqiyRGvffcc0oOsE2dQYaJOFIDsDt4VWG6xEbg1QePv9QWausCEIppud/tJ1wNig=="], + + "@radix-ui/primitive": ["@radix-ui/primitive@1.1.5", "", {}, "sha512-d86WIWFYNtGA0H/d8exstrTRTp7eWJYlYJbtNofxr/3ljupZYn6EFDG/Qgu/0Kc8v7yMUxySagqJsL1+PdYjWg=="], + + "@radix-ui/react-accordion": ["@radix-ui/react-accordion@1.2.16", "", { "dependencies": { "@radix-ui/primitive": "1.1.5", "@radix-ui/react-collapsible": "1.1.16", "@radix-ui/react-collection": "1.1.12", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.2.0", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-BpZJNmetujnGgUI6OX0jEhEmlA46WPqgub8Rv09Kyquwd0cc1ndMKpiPYCjmBU6KSSRPAMtgLpEoZSG/tdNIWQ=="], + + "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.11", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.7" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Kdil9BB1rIFC/khmf4hC35bn8701AJcizTU7G7cUbEbk5XqqbjDuHW60uUfKqO5WojjZcbAW51Q7P0hRmMLw8A=="], + + "@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.16", "", { "dependencies": { "@radix-ui/primitive": "1.1.5", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.2.0", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-presence": "1.1.7", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-opfXRe6nnzyGmCDPx+l1Aqo/RbqWtQal2FnsBqF9hhePp6j0LsRoBaRxcMOlTv+uYTJVtWYZKg9t9wTe+BA/ZA=="], + + "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.12", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.2.0", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-slot": "1.3.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-nb67INpE0IahJKN7EYPp9m9YGwYeKlnzxT3MwXVkgCskaSJia97kG4T0ywpjNUSSnoJk/uvk12V8vbrEHEj+/Q=="], + + "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA=="], + + "@radix-ui/react-context": ["@radix-ui/react-context@1.2.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-fOE+JtN9rygNZkCnHRBEP0TAvLldlhyOxMsbwFvTP4nAs+nBmfnna+o/Zski2wkmY1YMrFC0aSzsHoLY47iLrg=="], + + "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.19", "", { "dependencies": { "@radix-ui/primitive": "1.1.5", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.2.0", "@radix-ui/react-dismissable-layer": "1.1.15", "@radix-ui/react-focus-guards": "1.1.4", "@radix-ui/react-focus-scope": "1.1.12", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-portal": "1.1.13", "@radix-ui/react-presence": "1.1.7", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-use-controllable-state": "1.2.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-+HhbN2+YtkRgVirjZ2afMeutQRuGOrdkWR5+EFC58SJojGmtyNQwYzgi6tHBpOxvFHefMtPeHdgtjz0BOGxFQg=="], + + "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA=="], + + "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.5", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-effect-event": "0.0.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-b0XaRlzn2QKuo10XyNgi2DAJDf5XC9d1nD3FJcuvCjbR7+4Ad28zmZsLsqx+hvDEzMnRuZaZxZm9gYObV6RmRA=="], + + "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.4", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q=="], + + "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.12", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-jjk/lqTeNL0azUx5ZYzVrl4NgaDIrdzTNE4mABV9yBFI7FQqN7pIgzV1bTleUezP2QiTGA1BFTqY8MegDgWX9A=="], + + "@radix-ui/react-id": ["@radix-ui/react-id@1.1.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA=="], + + "@radix-ui/react-navigation-menu": ["@radix-ui/react-navigation-menu@1.2.18", "", { "dependencies": { "@radix-ui/primitive": "1.1.5", "@radix-ui/react-collection": "1.1.12", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.2.0", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.15", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-presence": "1.1.7", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-use-layout-effect": "1.1.2", "@radix-ui/react-use-previous": "1.1.2", "@radix-ui/react-visually-hidden": "1.2.7" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-K9HiuxZ6xCwSaHcIuUpxyhy4w5gpwzWjh9dHTSbMN3Ix4qAyVObS9RlU3zMycb0PO3v9Tpk0BXMwWvXOUbVXew=="], + + "@radix-ui/react-popover": ["@radix-ui/react-popover@1.1.19", "", { "dependencies": { "@radix-ui/primitive": "1.1.5", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.2.0", "@radix-ui/react-dismissable-layer": "1.1.15", "@radix-ui/react-focus-guards": "1.1.4", "@radix-ui/react-focus-scope": "1.1.12", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-popper": "1.3.3", "@radix-ui/react-portal": "1.1.13", "@radix-ui/react-presence": "1.1.7", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-use-controllable-state": "1.2.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-jkrTdQVxnIB8fpn0NyyxW9CTB5aCXZZelVz5z+Xmii6g5WxMqS3fInNslZ63puP39+Puu4jYohUK31y3dT87gQ=="], + + "@radix-ui/react-popper": ["@radix-ui/react-popper@1.3.3", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.11", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.2.0", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.2", "@radix-ui/react-use-rect": "1.1.2", "@radix-ui/react-use-size": "1.1.2", "@radix-ui/rect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-mS7dGpyjv6b+gsDjLF7e0ia1W4Im1B1hSCy2yuXlHuvnZxHKagfDaobt/KAKt27EpZMit2pss8eJBVyVjEWM+g=="], + + "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.13", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-z3oXfmaHLJTF1wktbjgD6cn9jiEbq3WSondB10LIuIt2m2Ym4iJlrW04/euMwENDdWDdE7z+OuY7Qyp1YpRSwA=="], + + "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.7", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-zBZ4QM5XG3JRanDmqXYf3MD6th4AFXFmgU6KNMFzUaV6F3uw9I5/zjMUvFriSEn5ewo1nxuibvyxJdmLlDcslA=="], + + "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.7", "", { "dependencies": { "@radix-ui/react-slot": "1.3.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-bC3NiwsprbxKjuon9l7X6BUTw7FPVzEYaL92MPEY5SCd/9hUTPXVFtVwRix7778wtRsVao+zE062gL79FZleeQ=="], + + "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.5", "@radix-ui/react-collection": "1.1.12", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.2.0", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-use-is-hydrated": "0.1.1", "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-40svmmugfM3mUN7VUDGVE1tQGOhyi8enlGD0CNJEcMM36C1f71PKM21DFgNHUfem0XnA+d8H8oN3Z9ZpJjSslg=="], + + "@radix-ui/react-scroll-area": ["@radix-ui/react-scroll-area@1.2.14", "", { "dependencies": { "@radix-ui/number": "1.1.2", "@radix-ui/primitive": "1.1.5", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.2.0", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-presence": "1.1.7", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-bBODCWZK7JTbQLHs0uIP4f73wIWatakK4OS33UzkR1x897wu0PuO658a3f+6P2GEGyDzGYMuHRatMVoAk9WZTw=="], + + "@radix-ui/react-slot": ["@radix-ui/react-slot@1.3.0", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA=="], + + "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.17", "", { "dependencies": { "@radix-ui/primitive": "1.1.5", "@radix-ui/react-context": "1.2.0", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-presence": "1.1.7", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-roving-focus": "1.1.15", "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-nRyXnrAVCwjeXcHbvEbLS6ndbTeKHG1RqCP4A8Gw5L4cemDzPXdD8rAmr6wet0v57R69wGvuIIsFjHSVkZiMzQ=="], + + "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw=="], + + "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.3", "", { "dependencies": { "@radix-ui/react-use-effect-event": "0.0.3", "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA=="], + + "@radix-ui/react-use-effect-event": ["@radix-ui/react-use-effect-event@0.0.3", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA=="], + + "@radix-ui/react-use-is-hydrated": ["@radix-ui/react-use-is-hydrated@0.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-qwOiz4Tjo8CNnrOLAYUMXeZwDzXgXpvK4TKQPmWLECM9XoWvA6+0Z2/7Ag3A4ivjS4ovbLJPbskkxioFyBhr8A=="], + + "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA=="], + + "@radix-ui/react-use-previous": ["@radix-ui/react-use-previous@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-IGBQPtRFdhN6MQ8dbegVmBq1LVZluya3F1jWY+puIcQC3MHctRwTDSBWCkL/3ZcnMJLTMJ++Z+ktmvg0F89iCw=="], + + "@radix-ui/react-use-rect": ["@radix-ui/react-use-rect@1.1.2", "", { "dependencies": { "@radix-ui/rect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-d8a+bBY/FxikNPlgJJoaBHZX+zKVbWHYJGTLnLvveQgFSTntkGdEKv3JDtHrMS0DNYpllz2nRsTLGLKYttbpmw=="], + + "@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-giWQp+4mxjBPt4KZ0MmyuykFNWfbDxKt4x+fPkRYmgRFJSbCZFzUglvMb/Kjn38tm10YP4ufiQZDx3zna4LU6w=="], + + "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.2.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.7" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-1wNZBggTDK3GRuuQ6nP4k2yi7a6l7I5qbMPbZcRsrGsGVead/f/d5FhEzUvqFs0bcrDLx7n1zKQ3JvLR6whaaw=="], + + "@radix-ui/rect": ["@radix-ui/rect@1.1.2", "", {}, "sha512-xnXE7wG13PI+cxieVssYXlQJuYVRhH9NBoxt3KNwzghDIA69GMm7d4wXRouHIYjE+KvS6U/MsMO73NdS2MH9ZA=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.62.2", "", { "os": "android", "cpu": "arm" }, "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg=="], "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.62.2", "", { "os": "android", "cpu": "arm64" }, "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw=="], @@ -283,8 +469,26 @@ "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.62.2", "", { "os": "win32", "cpu": "x64" }, "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA=="], + "@schema-stream/docs": ["@schema-stream/docs@workspace:site"], + "@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="], + "@shikijs/core": ["@shikijs/core@4.3.1", "", { "dependencies": { "@shikijs/primitive": "4.3.1", "@shikijs/types": "4.3.1", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-ANMDxuaPsNMdDC1m4vfvhlDmJweMwkE5XitTwrq2rWHx5jM+dlm4MmHt2PP6t0uejfR77SuhrhJ0zEijIF/uhA=="], + + "@shikijs/engine-javascript": ["@shikijs/engine-javascript@4.3.1", "", { "dependencies": { "@shikijs/types": "4.3.1", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.6" } }, "sha512-JBItcnPuYq7jVJdZo/vMj94r+szT7XEjHFX+mvFDGSEIbVAXAGyHAHzhbWzpGOwYidCZrErJLLgn2PVeiokHnQ=="], + + "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@4.3.1", "", { "dependencies": { "@shikijs/types": "4.3.1", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-OXyNMzg0pews+msMj4cHeqT4xiYKKvbnn6VbdAXxfoFl3SSx4fJTc8FadECuc5/H9p3BzhNAoAUXKwAu9rWYhg=="], + + "@shikijs/langs": ["@shikijs/langs@4.3.1", "", { "dependencies": { "@shikijs/types": "4.3.1" } }, "sha512-m0l9nsDqgBHvbZbk7A0/kXz/impK3uB/c6rAn6Gpg/uPtdZRQ+alsN/17MU5thb68XTj/4DxkZAotrM0GGSpDQ=="], + + "@shikijs/primitive": ["@shikijs/primitive@4.3.1", "", { "dependencies": { "@shikijs/types": "4.3.1", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-CXQRQOYy1leqQ8ceTeJdmXv/bsUY++6QyLpXJ94LZAAYj5X2SKRdc5ipguv4NPyGVKItB2PPwUpRNe0Sjh5S1A=="], + + "@shikijs/themes": ["@shikijs/themes@4.3.1", "", { "dependencies": { "@shikijs/types": "4.3.1" } }, "sha512-dgpoJ4WqNi2yTmizQHBJ5zcX6j2lE6icN/0yt4l1kkf16jrY/pwPLoTb1ETsWMz0OBLf9ZNvwmxft+cH+N9qSA=="], + + "@shikijs/types": ["@shikijs/types@4.3.1", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-CHFxE0jztBIZRHH6gxXE7DXUCFXjReEGxZ/j0rfSLGKZuwp2xBYycEP14875DSa9KLL/6700oxIq6oO6ef9K2g=="], + + "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], + "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="], "@sindresorhus/slugify": ["@sindresorhus/slugify@2.2.1", "", { "dependencies": { "@sindresorhus/transliterate": "^1.0.0", "escape-string-regexp": "^5.0.0" } }, "sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw=="], @@ -293,6 +497,38 @@ "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], + "@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="], + + "@tailwindcss/node": ["@tailwindcss/node@4.3.2", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "5.21.6", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.2" } }, "sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg=="], + + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.3.2", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.2", "@tailwindcss/oxide-darwin-arm64": "4.3.2", "@tailwindcss/oxide-darwin-x64": "4.3.2", "@tailwindcss/oxide-freebsd-x64": "4.3.2", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.2", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.2", "@tailwindcss/oxide-linux-arm64-musl": "4.3.2", "@tailwindcss/oxide-linux-x64-gnu": "4.3.2", "@tailwindcss/oxide-linux-x64-musl": "4.3.2", "@tailwindcss/oxide-wasm32-wasi": "4.3.2", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.2", "@tailwindcss/oxide-win32-x64-msvc": "4.3.2" } }, "sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag=="], + + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.3.2", "", { "os": "android", "cpu": "arm64" }, "sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA=="], + + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.3.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w=="], + + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.3.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ=="], + + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.3.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA=="], + + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.3.2", "", { "os": "linux", "cpu": "arm" }, "sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w=="], + + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.3.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw=="], + + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.3.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA=="], + + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.3.2", "", { "os": "linux", "cpu": "x64" }, "sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w=="], + + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.3.2", "", { "os": "linux", "cpu": "x64" }, "sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw=="], + + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.3.2", "", { "dependencies": { "@emnapi/core": "^1.11.1", "@emnapi/runtime": "^1.11.1", "@emnapi/wasi-threads": "^1.2.2", "@napi-rs/wasm-runtime": "^1.1.4", "@tybys/wasm-util": "^0.10.2", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw=="], + + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.3.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ=="], + + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.3.2", "", { "os": "win32", "cpu": "x64" }, "sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ=="], + + "@tailwindcss/postcss": ["@tailwindcss/postcss@4.3.2", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.3.2", "@tailwindcss/oxide": "4.3.2", "postcss": "^8.5.15", "tailwindcss": "4.3.2" } }, "sha512-rjVWYCa7Ngbi5AarT6k8TkxUG3Wl1QKzHdIZVsjZSzf36Jmo2IKZt/NHRAwly8oDkbBOH0YTu+CHuf9jPxMc+g=="], + "@types/bun": ["@types/bun@1.3.14", "", { "dependencies": { "bun-types": "1.3.14" } }, "sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw=="], "@types/debug": ["@types/debug@4.1.13", "", { "dependencies": { "@types/ms": "*" } }, "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw=="], @@ -301,13 +537,23 @@ "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], + "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="], + + "@types/hast": ["@types/hast@3.0.5", "", { "dependencies": { "@types/unist": "*" } }, "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g=="], + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], + "@types/mdx": ["@types/mdx@2.0.14", "", {}, "sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg=="], + "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], - "@types/node": ["@types/node@26.1.1", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw=="], + "@types/node": ["@types/node@24.13.3", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q=="], + + "@types/react": ["@types/react@19.2.17", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw=="], + + "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], @@ -367,8 +613,14 @@ "@typescript/typescript-win32-x64": ["@typescript/typescript-win32-x64@7.0.2", "", { "os": "win32", "cpu": "x64" }, "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g=="], + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.3", "", {}, "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg=="], + + "@vercel/analytics": ["@vercel/analytics@2.0.1", "", { "peerDependencies": { "@remix-run/react": "^2", "@sveltejs/kit": "^1 || ^2", "next": ">= 13", "nuxt": ">= 3", "react": "^18 || ^19 || ^19.0.0-rc", "svelte": ">= 4", "vue": "^3", "vue-router": "^4" }, "optionalPeers": ["@remix-run/react", "@sveltejs/kit", "next", "nuxt", "react", "svelte", "vue", "vue-router"] }, "sha512-MTQG6V9qQrt1tsDeF+2Uoo5aPjqbVPys1xvnIftXSJYG2SrwXRHnqEvVoYID7BTruDz4lCd2Z7rM1BdkUehk2g=="], + "@vercel/oidc": ["@vercel/oidc@3.2.0", "", {}, "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug=="], + "@vercel/speed-insights": ["@vercel/speed-insights@2.0.0", "", { "peerDependencies": { "@sveltejs/kit": "^1 || ^2", "next": ">= 13", "nuxt": ">= 3", "react": "^18 || ^19 || ^19.0.0-rc", "svelte": ">= 4", "vue": "^3", "vue-router": "^4" }, "optionalPeers": ["@sveltejs/kit", "next", "nuxt", "react", "svelte", "vue", "vue-router"] }, "sha512-jwkNcrTeafWxjmWq4AHBaptSqZiJkYU5adLC9QBSqeim0GcqDMgN5Ievh8OG1rJ6W3A4l1oiP7qr9CWxGuzu3w=="], + "@workflow/serde": ["@workflow/serde@4.1.0", "", {}, "sha512-pav4F2BoirECWR7Nf1TKt+2eETcBj7jj4cBefQ8VXQCA6NPkaKeLfj/zMgi+3zYV5ZIBT4GuUiphsj0/b9hPQQ=="], "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], @@ -389,14 +641,20 @@ "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="], - "argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="], "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], + "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="], + "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.10.43", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-AjYpR78kDWAY3Efj+cDTFH9t9SCoL7OoTp1BOb0mQV7S+6CiLwnWM3FyxhJtdPufDFKzmCSFoUncKjWgJEZTCQ=="], + "better-path-resolve": ["better-path-resolve@1.0.0", "", { "dependencies": { "is-windows": "^1.0.0" } }, "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g=="], "body-parser": ["body-parser@2.3.0", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^2.0.0", "debug": "^4.4.3", "http-errors": "^2.0.1", "iconv-lite": "^0.7.2", "on-finished": "^2.4.1", "qs": "^6.15.2", "raw-body": "^3.0.2", "type-is": "^2.1.0" } }, "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw=="], @@ -417,10 +675,18 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + "caniuse-lite": ["caniuse-lite@1.0.30001805", "", {}, "sha512-52noaS3DubycKSXaU30TwPGIp+POyQSUVa5jBEq3vkRkY0kjyb3LQgvhU6WGyCcyXqVLWO0Cw0Q6BSdD0kUfVA=="], + "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], + "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], + + "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + + "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="], + "chardet": ["chardet@2.2.0", "", {}, "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA=="], "chat": ["chat@4.33.0", "", { "dependencies": { "@workflow/serde": "4.1.0-beta.2", "mdast-util-to-string": "^4.0.0", "remark-gfm": "^4.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "remend": "^1.2.1", "unified": "^11.0.5" }, "peerDependencies": { "ai": "^6.0.182", "zod": "^3.0.0 || ^4.0.0" }, "optionalPeers": ["ai", "zod"] }, "sha512-qaQyr6Nm7gLEPkYpfjlZzCxKKjvDyRe3GoVA5++RrzW9po5fe3ddH4l9JkGaFsTvSiRGAzuz12WJj/BB5+A6Hw=="], @@ -429,8 +695,22 @@ "citty": ["citty@0.2.2", "", {}, "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w=="], + "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], + + "client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "cnfast": ["cnfast@0.0.8", "", { "bin": { "cnfast": "bin/cli.js" } }, "sha512-EjXKMfGfdwtV4AcNSQ6AwQaVzpC1B7IxeiwA3FlhTXz+YFlMKVi4c1JX9tgD2QOlahQXjB8KUXrBaYG+3v871Q=="], + + "collapse-white-space": ["collapse-white-space@2.1.0", "", {}, "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw=="], + + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], + "commander": ["commander@15.0.0", "", {}, "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg=="], + "compute-scroll-into-view": ["compute-scroll-into-view@3.1.1", "", {}, "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw=="], + "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], @@ -449,6 +729,8 @@ "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + "dataloader": ["dataloader@1.4.0", "", {}, "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw=="], "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" }, "peerDependencies": { "supports-color": "*" }, "optionalPeers": ["supports-color"] }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], @@ -465,6 +747,10 @@ "detect-indent": ["detect-indent@6.1.0", "", {}, "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA=="], + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + + "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], + "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], @@ -477,14 +763,22 @@ "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + "enhanced-resolve": ["enhanced-resolve@5.21.6", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ=="], + "enquirer": ["enquirer@2.4.1", "", { "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" } }, "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ=="], + "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], "es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="], + "esast-util-from-estree": ["esast-util-from-estree@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "unist-util-position-from-estree": "^2.0.0" } }, "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ=="], + + "esast-util-from-js": ["esast-util-from-js@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "acorn": "^8.0.0", "esast-util-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw=="], + "esbuild": ["esbuild@0.28.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw=="], "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], @@ -507,6 +801,22 @@ "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + "estree-util-attach-comments": ["estree-util-attach-comments@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw=="], + + "estree-util-build-jsx": ["estree-util-build-jsx@3.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-walker": "^3.0.0" } }, "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ=="], + + "estree-util-is-identifier-name": ["estree-util-is-identifier-name@3.0.0", "", {}, "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg=="], + + "estree-util-scope": ["estree-util-scope@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0" } }, "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ=="], + + "estree-util-to-js": ["estree-util-to-js@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", "source-map": "^0.7.0" } }, "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg=="], + + "estree-util-value-to-estree": ["estree-util-value-to-estree@3.5.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ=="], + + "estree-util-visit": ["estree-util-visit@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" } }, "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww=="], + + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], @@ -565,20 +875,34 @@ "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], + "framer-motion": ["framer-motion@12.42.2", "", { "dependencies": { "motion-dom": "^12.42.2", "motion-utils": "^12.39.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-5XY9luDiu0oHfHBjpDthFMh0ES+122w6p/papSJBweMkO8Sn+PW2QaEgRblQBpWFnuvZS5qvarpt/hO2pjGmnw=="], + "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], "fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "fumadocs-core": ["fumadocs-core@16.11.3", "", { "dependencies": { "@orama/orama": "^3.1.18", "estree-util-value-to-estree": "^3.5.0", "github-slugger": "^2.0.0", "hast-util-to-estree": "^3.1.3", "hast-util-to-jsx-runtime": "^2.3.6", "js-yaml": "^5.2.1", "mdast-util-mdx": "^3.0.0", "mdast-util-to-markdown": "^2.1.2", "remark": "^15.0.1", "remark-gfm": "^4.0.1", "remark-rehype": "^11.1.2", "scroll-into-view-if-needed": "^3.1.0", "shiki": "^4.3.1", "tinyglobby": "^0.2.17", "unified": "^11.0.5", "unist-util-visit": "^5.1.0", "vfile": "^6.0.3" }, "peerDependencies": { "@mdx-js/mdx": "*", "@mixedbread/sdk": "0.x.x", "@orama/core": "1.x.x", "@oramacloud/client": "2.x.x", "@tanstack/react-router": "1.x.x", "@types/estree-jsx": "*", "@types/hast": "*", "@types/mdast": "*", "@types/react": "*", "algoliasearch": "5.x.x", "flexsearch": "*", "lucide-react": "*", "next": "16.x.x", "react": "^19.2.0", "react-dom": "^19.2.0", "react-router": "7.x.x || 8.x.x", "waku": "*", "zod": "4.x.x" }, "optionalPeers": ["@mdx-js/mdx", "@mixedbread/sdk", "@orama/core", "@oramacloud/client", "@tanstack/react-router", "@types/estree-jsx", "@types/hast", "@types/mdast", "@types/react", "algoliasearch", "flexsearch", "lucide-react", "next", "react", "react-dom", "react-router", "waku", "zod"] }, "sha512-AHhOYY2YA98vEbgzLBxqZ9yyfW6VmOTIIjK803xCOWUmqyiVU8ONckI6IuIEIWTwyvk4s/PAC49p01J0Cjio+w=="], + + "fumadocs-mdx": ["fumadocs-mdx@15.1.0", "", { "dependencies": { "@mdx-js/mdx": "^3.1.1", "@standard-schema/spec": "^1.1.0", "chokidar": "^5.0.0", "esbuild": "^0.28.1", "estree-util-value-to-estree": "^3.5.0", "github-slugger": "^2.0.0", "js-yaml": "^5.2.1", "mdast-util-mdx": "^3.0.0", "picocolors": "^1.1.1", "picomatch": "^4.0.5", "tinyexec": "^1.2.4", "tinyglobby": "^0.2.17", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.1.0", "vfile": "^6.0.3", "zod": "^4.4.3" }, "peerDependencies": { "@fumadocs/satteri": "0.x.x", "@types/mdast": "*", "@types/mdx": "*", "@types/react": "*", "fumadocs-core": "^16.7.0", "mdast-util-directive": "*", "next": "^15.3.0 || ^16.0.0", "react": "^19.2.0", "rolldown": "*", "satteri": "^0.9.4", "vite": "7.x.x || 8.x.x" }, "optionalPeers": ["@fumadocs/satteri", "@types/mdast", "@types/mdx", "@types/react", "mdast-util-directive", "next", "react", "rolldown", "satteri", "vite"], "bin": { "fumadocs-mdx": "./bin.js" } }, "sha512-2nDusSlYFuNVcyB51jgY3tA3r01ALTwoURrMDNoc7cbJKZ2sac/PW+CDq6SHTArkgRMmFiKYQGfspJdjgTtPTg=="], + + "fumadocs-ui": ["fumadocs-ui@16.11.3", "", { "dependencies": { "@fuma-translate/react": "^1.0.2", "@fumadocs/tailwind": "0.1.1", "@radix-ui/react-accordion": "^1.2.16", "@radix-ui/react-collapsible": "^1.1.16", "@radix-ui/react-dialog": "^1.1.19", "@radix-ui/react-direction": "^1.1.2", "@radix-ui/react-navigation-menu": "^1.2.18", "@radix-ui/react-popover": "^1.1.19", "@radix-ui/react-presence": "^1.1.7", "@radix-ui/react-scroll-area": "^1.2.14", "@radix-ui/react-slot": "^1.3.0", "@radix-ui/react-tabs": "^1.1.17", "class-variance-authority": "^0.7.1", "cnfast": "^0.0.8", "lucide-react": "^1.23.0", "motion": "^12.42.2", "next-themes": "^0.4.6", "react-remove-scroll": "^2.7.2", "rehype-raw": "^7.0.0", "scroll-into-view-if-needed": "^3.1.0", "shiki": "^4.3.1", "unist-util-visit": "^5.1.0" }, "peerDependencies": { "@types/mdx": "*", "@types/react": "*", "fumadocs-core": "16.11.3", "next": "16.x.x", "react": "^19.2.0", "react-dom": "^19.2.0", "takumi-js": "*" }, "optionalPeers": ["@types/mdx", "@types/react", "next", "takumi-js"] }, "sha512-JM7wf10FxL2N0PL9RSX2ZOtPwRzH5FCkCkAxmqBhOxeTTL8FfPhhOt/MJCXArv0QrTBUIOAnb4M7oVQJN5DTmw=="], + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + "geist": ["geist@1.7.0", "", { "peerDependencies": { "next": ">=13.2.0" } }, "sha512-ZaoiZwkSf0DwwB1ncdLKp+ggAldqxl5L1+SXaNIBGkPAqcu+xjVJLxlf3/S8vLt9UHx1xu5fz3lbzKCj5iOVdQ=="], + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="], + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], "get-stream": ["get-stream@9.0.1", "", { "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" } }, "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA=="], + "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="], + "glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], @@ -595,8 +919,28 @@ "hasown": ["hasown@2.0.4", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A=="], + "hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "hastscript": "^9.0.0", "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="], + + "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="], + + "hast-util-raw": ["hast-util-raw@9.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "@ungap/structured-clone": "^1.0.0", "hast-util-from-parse5": "^8.0.0", "hast-util-to-parse5": "^8.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "parse5": "^7.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw=="], + + "hast-util-to-estree": ["hast-util-to-estree@3.1.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-attach-comments": "^3.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w=="], + + "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="], + + "hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.6", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" } }, "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg=="], + + "hast-util-to-parse5": ["hast-util-to-parse5@8.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA=="], + + "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], + + "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="], + "hono": ["hono@4.12.28", "", {}, "sha512-YwUvVpSF7m1yOblFPrU3Hbo8XhPheBoiyfGuII6z19LnOr6JpDnyyp7LFNrfV56wS8tpvtBFGRISHN02pDdLOA=="], + "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], + "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], "human-id": ["human-id@4.2.0", "", { "bin": { "human-id": "dist/cli.js" } }, "sha512-K3GbkIWqyvvlpfhBPlbEvD97TtqBpAYA4kt+cn2lD2x2HuohzZCibcA2nOlnJT6exqvJLggoB5nv2dNf192nEA=="], @@ -611,16 +955,26 @@ "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="], + "ip-address": ["ip-address@10.2.0", "", {}, "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA=="], "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], + "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="], + + "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], + + "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], + "is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], + "is-network-error": ["is-network-error@1.3.2", "", {}, "sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA=="], "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], @@ -639,13 +993,15 @@ "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + "jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="], + "jose": ["jose@6.2.3", "", {}, "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw=="], "joycon": ["joycon@3.1.1", "", {}, "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw=="], "jpeg-js": ["jpeg-js@0.4.4", "", {}, "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg=="], - "js-yaml": ["js-yaml@3.15.0", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog=="], + "js-yaml": ["js-yaml@5.2.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.mjs" } }, "sha512-zfLtNfQqxVqq3uaTqSkh4x4hZw3KHobGUA0fJUj4wawW8bsQLTVqpHdXSIzidh7o+4lEW36tANuAGdaFx6Zgnw=="], "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], @@ -669,6 +1025,30 @@ "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + "lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="], + + "lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="], + + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="], + + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="], + + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="], + + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="], + + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="], + + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="], + + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="], + + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="], + + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="], + + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="], + "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], @@ -683,8 +1063,12 @@ "lru-cache": ["lru-cache@11.5.2", "", {}, "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g=="], + "lucide-react": ["lucide-react@1.24.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-YT6mBD8lGKkg4nM39enlm94/sfJIiW0YKUT60fBy4YK8tai31ylg1VhGNWxkpSKHo9UagfnZqwIff3HTDQwXeA=="], + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + "markdown-extensions": ["markdown-extensions@2.0.0", "", {}, "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q=="], + "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], @@ -705,8 +1089,18 @@ "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="], + "mdast-util-mdx": ["mdast-util-mdx@3.0.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w=="], + + "mdast-util-mdx-expression": ["mdast-util-mdx-expression@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ=="], + + "mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.2.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q=="], + + "mdast-util-mdxjs-esm": ["mdast-util-mdxjs-esm@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg=="], + "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="], + "mdast-util-to-hast": ["mdast-util-to-hast@13.2.1", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA=="], + "mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA=="], "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="], @@ -735,10 +1129,22 @@ "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="], + "micromark-extension-mdx-expression": ["micromark-extension-mdx-expression@3.0.1", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q=="], + + "micromark-extension-mdx-jsx": ["micromark-extension-mdx-jsx@3.0.2", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ=="], + + "micromark-extension-mdx-md": ["micromark-extension-mdx-md@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ=="], + + "micromark-extension-mdxjs": ["micromark-extension-mdxjs@3.0.0", "", { "dependencies": { "acorn": "^8.0.0", "acorn-jsx": "^5.0.0", "micromark-extension-mdx-expression": "^3.0.0", "micromark-extension-mdx-jsx": "^3.0.0", "micromark-extension-mdx-md": "^2.0.0", "micromark-extension-mdxjs-esm": "^3.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ=="], + + "micromark-extension-mdxjs-esm": ["micromark-extension-mdxjs-esm@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A=="], + "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="], "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="], + "micromark-factory-mdx-expression": ["micromark-factory-mdx-expression@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ=="], + "micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="], @@ -759,6 +1165,8 @@ "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], + "micromark-util-events-to-acorn": ["micromark-util-events-to-acorn@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg=="], + "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="], "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="], @@ -785,6 +1193,12 @@ "mlly": ["mlly@1.8.2", "", { "dependencies": { "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.3" } }, "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA=="], + "motion": ["motion@12.42.2", "", { "dependencies": { "framer-motion": "^12.42.2", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-Atvv11yUKIid41cVrRBDVX5m8tF8kNpExRSlbpt6APClhDjtwQssgFHhQzejxw7/7YYbjHSPKBVbHo05BuJT5Q=="], + + "motion-dom": ["motion-dom@12.42.2", "", { "dependencies": { "motion-utils": "^12.39.0" } }, "sha512-5gIMWLp/PycBtJRJWRgjxke5n8dlvkSn2DrYW+tr3XcqAZY1xZh6BJyooJXCM8wdfM7wfMjkBJNLge1CKPUIRA=="], + + "motion-utils": ["motion-utils@12.39.0", "", {}, "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ=="], + "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], @@ -797,6 +1211,10 @@ "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], + "next": ["next@16.2.10", "", { "dependencies": { "@next/env": "16.2.10", "@swc/helpers": "0.5.15", "baseline-browser-mapping": "^2.9.19", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.2.10", "@next/swc-darwin-x64": "16.2.10", "@next/swc-linux-arm64-gnu": "16.2.10", "@next/swc-linux-arm64-musl": "16.2.10", "@next/swc-linux-x64-gnu": "16.2.10", "@next/swc-linux-x64-musl": "16.2.10", "@next/swc-win32-arm64-msvc": "16.2.10", "@next/swc-win32-x64-msvc": "16.2.10", "sharp": "^0.34.5" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-2som5AVXb3kE6Yjine3/mNbBayYF58eguBWIVVUdr1y/L426xyVEgYxgBG+1QC34P2x5E+tcDup6XkuOAX3dCA=="], + + "next-themes": ["next-themes@0.4.6", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="], + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], "npm-run-path": ["npm-run-path@6.0.0", "", { "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" } }, "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA=="], @@ -811,6 +1229,10 @@ "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + "oniguruma-parser": ["oniguruma-parser@0.12.2", "", {}, "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw=="], + + "oniguruma-to-es": ["oniguruma-to-es@4.3.6", "", { "dependencies": { "oniguruma-parser": "^0.12.2", "regex": "^6.1.0", "regex-recursion": "^6.0.2" } }, "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA=="], + "openai": ["openai@6.46.0", "", { "peerDependencies": { "@aws-sdk/credential-provider-node": ">=3.972.0 <4", "@smithy/hash-node": ">=4.3.0 <5", "@smithy/signature-v4": ">=5.4.0 <6", "ws": "^8.18.0", "zod": "^3.25 || ^4.0" }, "optionalPeers": ["@aws-sdk/credential-provider-node", "@smithy/hash-node", "@smithy/signature-v4", "ws", "zod"] }, "sha512-DFg6jEPT2RO+oAyXtddeUJU8zkGy1OQ1AjGzNIJUMQG03TTqvCpy9tBpQ+2VVVnvrl3E56F8GEin2JYtWpITtA=="], "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], @@ -831,8 +1253,12 @@ "package-manager-detector": ["package-manager-detector@0.2.11", "", { "dependencies": { "quansync": "^0.2.7" } }, "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ=="], + "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], + "parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="], + "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], @@ -859,6 +1285,8 @@ "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + "postcss": ["postcss@8.5.17", "", { "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-J7EF+8X+CzRPaJPOv9Ck2wNWJvGnnl3PcNPAdGg6GTLjyVpyQ0yATMSXRFRV01BviT/9Gwuc3rjEyJbDJG9a4w=="], + "postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["jiti", "postcss", "tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="], "posthog-node": ["posthog-node@5.41.0", "", { "dependencies": { "@posthog/core": "^1.40.2" }, "peerDependencies": { "rxjs": "^7.0.0" }, "optionalPeers": ["rxjs"] }, "sha512-jOkX6THOr5WD+FGUEaTxekas8c7NOC3TqJ2Byfe2KMimQdL/F/osz17uSbkNzR4V9WFZoe8YaGP3Xp0EUpPKGg=="], @@ -869,6 +1297,8 @@ "pretty-ms": ["pretty-ms@9.3.0", "", { "dependencies": { "parse-ms": "^4.0.0" } }, "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ=="], + "property-information": ["property-information@7.2.0", "", {}, "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg=="], + "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], @@ -883,14 +1313,48 @@ "raw-body": ["raw-body@3.0.2", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.7.0", "unpipe": "~1.0.0" } }, "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA=="], + "react": ["react@19.2.7", "", {}, "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ=="], + + "react-dom": ["react-dom@19.2.7", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.7" } }, "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ=="], + + "react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="], + + "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], + + "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], + "read-yaml-file": ["read-yaml-file@1.1.0", "", { "dependencies": { "graceful-fs": "^4.1.5", "js-yaml": "^3.6.1", "pify": "^4.0.1", "strip-bom": "^3.0.0" } }, "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA=="], "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + "recma-build-jsx": ["recma-build-jsx@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-build-jsx": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew=="], + + "recma-jsx": ["recma-jsx@1.0.1", "", { "dependencies": { "acorn-jsx": "^5.0.0", "estree-util-to-js": "^2.0.0", "recma-parse": "^1.0.0", "recma-stringify": "^1.0.0", "unified": "^11.0.0" }, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w=="], + + "recma-parse": ["recma-parse@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "esast-util-from-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ=="], + + "recma-stringify": ["recma-stringify@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-to-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g=="], + + "regex": ["regex@6.1.0", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg=="], + + "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="], + + "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="], + + "rehype-raw": ["rehype-raw@7.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", "vfile": "^6.0.0" } }, "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww=="], + + "rehype-recma": ["rehype-recma@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "hast-util-to-estree": "^3.0.0" } }, "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw=="], + + "remark": ["remark@15.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A=="], + "remark-gfm": ["remark-gfm@4.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="], + "remark-mdx": ["remark-mdx@3.1.1", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg=="], + "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], + "remark-rehype": ["remark-rehype@11.1.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="], + "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="], "remend": ["remend@1.3.0", "", {}, "sha512-iIhggPkhW3hFImKtB10w0dz4EZbs28mV/dmbcYVonWEJ6UGHHpP+bFZnTh6GNWJONg5m+U56JrL+8IxZRdgWjw=="], @@ -909,6 +1373,12 @@ "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "schema-stream": ["schema-stream@root:", {}], + + "scroll-into-view-if-needed": ["scroll-into-view-if-needed@3.1.0", "", { "dependencies": { "compute-scroll-into-view": "^3.0.2" } }, "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ=="], + "section-matter": ["section-matter@1.0.0", "", { "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" } }, "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA=="], "secure-json-parse": ["secure-json-parse@2.7.0", "", {}, "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw=="], @@ -921,10 +1391,14 @@ "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + "sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="], + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + "shiki": ["shiki@4.3.1", "", { "dependencies": { "@shikijs/core": "4.3.1", "@shikijs/engine-javascript": "4.3.1", "@shikijs/engine-oniguruma": "4.3.1", "@shikijs/langs": "4.3.1", "@shikijs/themes": "4.3.1", "@shikijs/types": "4.3.1", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-oR+qDVi2OjX1tmDpyv+3KviX01KzO6Af+0NNnKnsp9491UEGz2YpxTuJboS/6VhYpTdqzmuJBuiTlrAWWJAssw=="], + "side-channel": ["side-channel@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4", "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ=="], "side-channel-list": ["side-channel-list@1.0.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4" } }, "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w=="], @@ -941,12 +1415,18 @@ "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], + "spawndamnit": ["spawndamnit@3.0.1", "", { "dependencies": { "cross-spawn": "^7.0.5", "signal-exit": "^4.0.1" } }, "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg=="], "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], + "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], @@ -955,8 +1435,18 @@ "strip-final-newline": ["strip-final-newline@4.0.0", "", {}, "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw=="], + "style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="], + + "style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="], + + "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], + "sucrase": ["sucrase@3.35.1", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw=="], + "tailwindcss": ["tailwindcss@4.3.2", "", {}, "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA=="], + + "tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="], + "term-size": ["term-size@2.2.1", "", {}, "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg=="], "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], @@ -977,12 +1467,16 @@ "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="], + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], + "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], "ts-api-utils": ["ts-api-utils@2.5.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA=="], "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "tsup": ["tsup@8.5.1", "", { "dependencies": { "bundle-require": "^5.1.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "consola": "^3.4.0", "debug": "^4.4.0", "esbuild": "^0.27.0", "fix-dts-default-cjs-exports": "^1.0.0", "joycon": "^3.1.1", "picocolors": "^1.1.1", "postcss-load-config": "^6.0.1", "resolve-from": "^5.0.0", "rollup": "^4.34.8", "source-map": "^0.7.6", "sucrase": "^3.35.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.11", "tree-kill": "^1.2.2" }, "peerDependencies": { "@microsoft/api-extractor": "^7.36.0", "@swc/core": "^1", "postcss": "^8.4.12", "typescript": ">=4.5.0" }, "optionalPeers": ["@microsoft/api-extractor", "@swc/core", "postcss", "typescript"], "bin": { "tsup": "dist/cli-default.js", "tsup-node": "dist/cli-node.js" } }, "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing=="], "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], @@ -995,7 +1489,7 @@ "ultracite": ["ultracite@7.9.3", "", { "dependencies": { "@clack/prompts": "^1.5.1", "@typescript-eslint/utils": "^8.62.1", "commander": "^15.0.0", "cross-spawn": "^7.0.6", "deepmerge": "^4.3.1", "glob": "^13.0.6", "jsonc-parser": "^3.3.1", "nypm": "^0.6.6", "yaml": "^2.9.0", "zod": "^4.4.3" }, "peerDependencies": { "oxfmt": ">=0.1.0", "oxlint": "^1.0.0" }, "optionalPeers": ["oxfmt", "oxlint"], "bin": { "ultracite": "dist/index.js" } }, "sha512-MqF0cn5DNHy/I61+hL4aYPRVye+rrmUqfv1dhwQ0ORfoFngk1O8tTKigF+zpsh/6qA84gkl26KkrtYzoypPiaw=="], - "undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], + "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], "unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="], @@ -1003,6 +1497,12 @@ "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], + "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], + + "unist-util-position-from-estree": ["unist-util-position-from-estree@2.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ=="], + + "unist-util-remove-position": ["unist-util-remove-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q=="], + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], "unist-util-visit": ["unist-util-visit@5.1.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg=="], @@ -1015,14 +1515,22 @@ "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], + + "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], + "uuid": ["uuid@11.1.1", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ=="], "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], + "vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="], + "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], + "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], @@ -1077,10 +1585,28 @@ "@mastra/core/dotenv": ["dotenv@17.4.2", "", {}, "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw=="], + "@schema-stream/docs/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA=="], + + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.6", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" }, "bundled": true }, "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg=="], + + "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="], + + "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@types/ws/@types/node": ["@types/node@26.1.1", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw=="], + "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "body-parser/content-type": ["content-type@2.0.0", "", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="], + "bun-types/@types/node": ["@types/node@26.1.1", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw=="], + "chat/@workflow/serde": ["@workflow/serde@4.1.0-beta.2", "", {}, "sha512-8kkeoQKLDaKXefjV5dbhBj2aErfKp1Mc4pb6tj8144cF+Em5SPbyMbyLCHp+BVrFfFVCBluCtMx+jjvaFVZGww=="], "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], @@ -1097,28 +1623,48 @@ "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + "fumadocs-mdx/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], + + "fumadocs-mdx/tinyexec": ["tinyexec@1.2.4", "", {}, "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg=="], + "globby/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "gray-matter/js-yaml": ["js-yaml@3.15.0", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog=="], + "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], + "next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], + "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], "nypm/tinyexec": ["tinyexec@1.2.4", "", {}, "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg=="], "p-filter/p-map": ["p-map@2.1.0", "", {}, "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw=="], + "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + + "read-yaml-file/js-yaml": ["js-yaml@3.15.0", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog=="], + "sucrase/commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], "type-is/content-type": ["content-type@2.0.0", "", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="], "zod-from-json-schema-v3/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "@changesets/parse/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "@types/ws/@types/node/undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], + + "bun-types/@types/node/undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "eslint/find-up/locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + "fumadocs-mdx/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], + + "gray-matter/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + + "read-yaml-file/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + "eslint/find-up/locate-path/p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], "eslint/find-up/locate-path/p-locate/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], diff --git a/docs/benchmarks/2026-07-11-apple-m5-max.json b/docs/benchmarks/2026-07-11-apple-m5-max.json index 8d3615d..cdd7c64 100644 --- a/docs/benchmarks/2026-07-11-apple-m5-max.json +++ b/docs/benchmarks/2026-07-11-apple-m5-max.json @@ -19,8 +19,8 @@ "warmups": 1 }, "method": { - "baseline": "parse plus UTF-8 decode plus JSON.parse for every emitted snapshot", - "candidate": "iterate with direct JSON-domain object snapshots", + "baseline": "parse() snapshot JSON.stringify and UTF-8 encode, followed by decode and JSON.parse for every emitted snapshot", + "candidate": "iterate() with direct independent JSON-domain object snapshots from the same parser and policy", "resultValidation": "full deep equality outside every timed window", "sampleOrdering": "roundtrip and iterate alternate order within paired samples", "speedup": "roundtrip median divided by iterate median" diff --git a/docs/benchmarks/latest.md b/docs/benchmarks/latest.md new file mode 100644 index 0000000..f5dcb64 --- /dev/null +++ b/docs/benchmarks/latest.md @@ -0,0 +1,46 @@ + + +# Latest benchmark + +This summary is generated from the newest checked-in [machine-readable benchmark evidence](./2026-07-11-apple-m5-max.json). Results are local measurements, not universal performance guarantees. + +## Environment + +| Property | Value | +| --- | --- | +| Captured | 2026-07-11 21:00:48 UTC | +| Host | Apple M5 Max (arm64) | +| Operating system | macOS 26.5.1 | +| Runtimes | Bun 1.3.14, Node v24.18.0 | +| Payload | 2 MiB | +| Input chunk | 0.06 MiB | +| Warmups / samples | 1 / 5 | +| Fixtures | long-string, object-heavy | +| Policies | `chunk`, `value`, `bytes-256kb`, `bytes-1mb`, `final` | + +## Representative results + +The baseline is parse() snapshot JSON.stringify and UTF-8 encode, followed by decode and JSON.parse for every emitted snapshot. The candidate is iterate() with direct independent JSON-domain object snapshots from the same parser and policy. Speedup is calculated as roundtrip median divided by iterate median. This is not a claim that SchemaStream is faster than standalone `JSON.parse` or `JSON.stringify`; those isolated operations do different work. + +| Runtime | Fixture | Policy | Serialized round-trip median | Direct object median | Speedup | Serialized bytes avoided | +| --- | --- | --- | ---: | ---: | ---: | ---: | +| Bun 1.3.14 | long-string | `chunk` | 11.94 ms | 1.53 ms | **7.80x** | 33.00 MiB | +| Bun 1.3.14 | long-string | `final` | 1.95 ms | 1.29 ms | **1.52x** | 2.00 MiB | +| Bun 1.3.14 | object-heavy | `chunk` | 310.36 ms | 298.24 ms | **1.04x** | 35.00 MiB | +| Bun 1.3.14 | object-heavy | `final` | 93.33 ms | 87.88 ms | **1.06x** | 2.00 MiB | +| Node v24.18.0 | long-string | `chunk` | 100.60 ms | 2.73 ms | **36.83x** | 33.00 MiB | +| Node v24.18.0 | long-string | `final` | 7.64 ms | 2.63 ms | **2.91x** | 2.00 MiB | +| Node v24.18.0 | object-heavy | `chunk` | 339.35 ms | 245.88 ms | **1.38x** | 35.00 MiB | +| Node v24.18.0 | object-heavy | `final` | 55.63 ms | 52.18 ms | **1.07x** | 2.00 MiB | + +Each result is validated with full deep equality outside every timed window. Samples use this ordering: roundtrip and iterate alternate order within paired samples. + +## Reproduce + +Run the checked-in benchmark harness from the repository root: + +```sh +bun run benchmark +``` + +See [`tests/snapshot-policy.benchmark.mts`](../../tests/snapshot-policy.benchmark.mts) for the harness and [snapshot policies](../snapshot-policies.md#benchmark) for the methodology. diff --git a/docs/integrations/README.md b/docs/integrations/README.md new file mode 100644 index 0000000..528b475 --- /dev/null +++ b/docs/integrations/README.md @@ -0,0 +1,29 @@ +# Integrations + +Schema Stream consumes an async sequence of JSON text or UTF-8 bytes. Provider SDKs remain +responsible for generation, structured-output validation, retries, cancellation, and the +authoritative final result. + +Choose the guide for the stream surface you already use: + +- [OpenAI Agents SDK](./openai-agents.md) uses `result.toTextStream()`. +- [Vercel AI SDK](./vercel-ai-sdk.md) uses `streamText().textStream` with `Output.object()`. +- [Mastra](./mastra.md) explains when to prefer `objectStream` and how the guarded compatibility + path works. +- [Bun WebSocket](./bun-websocket.md) keeps parsing and credentials on the server and sends complete + application messages to the browser. +- [Provider portability](./provider-portability.md) defines the tested boundary for OpenAI, + Anthropic, and Gemini models without claiming untested native adapters. + +The executable fixtures are the source of truth. From a repository checkout, run: + +```sh +bun run examples +bun test tests/sdk-runtime.test.ts +bun run test:packed +``` + +Those commands are credential-free. Opt-in live tests and their environment contract are described +in [Integration testing](../integration-testing.md). Schema Stream does not validate intermediate +snapshots; validate or await the producing SDK's final structured result before committing data or +triggering irreversible work. diff --git a/docs/integrations/bun-websocket.md b/docs/integrations/bun-websocket.md new file mode 100644 index 0000000..6cd9bb1 --- /dev/null +++ b/docs/integrations/bun-websocket.md @@ -0,0 +1,76 @@ +# Bun WebSocket + +For an interactive browser application, keep the provider SDK, credentials, Schema Stream, and +authoritative validation on Bun. Send one complete application-level JSON document per WebSocket +message so the browser only needs ordinary `JSON.parse`, revision checks, and rendering. + +```ts +type SnapshotMessage = { + revision: number + type: "snapshot" + value: TValue +} + +function sendSnapshot({ + revision, + socket, + value +}: { + revision: number + socket: Bun.ServerWebSocket + value: TValue +}): void { + const message: SnapshotMessage = { revision, type: "snapshot", value } + socket.send(JSON.stringify(message)) +} +``` + +A WebSocket message preserves the application message boundary even when the network transport uses +multiple frames. The browser must still parse the message, reject stale revisions, and handle +reconnects. WebSocket does not remove cancellation, backpressure, authorization, or replay work. + +## Run the executable UI + +The repository's [`examples/websocket-ui`](../../examples/websocket-ui/) is a complete Bun server and +browser client. Fixture mode is deterministic and credential-free: + +```sh +bun run example:websocket +``` + +Open . The example lets you compare `chunk`, `value`, `bytes`, and `final` +snapshot policies while watching the dashboard, completion events, and one progressively +materialized JSON object. + +In a development container or GitHub Codespace, port 3400 is forwarded. Codespaces uses a proxy +origin, so start the server with that exact private origin: + +```sh +SCHEMA_STREAM_EXAMPLE_ORIGIN="https://${CODESPACE_NAME}-3400.${GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN}" \ +bun run example:websocket +``` + +Open the port from the editor's **Ports** panel. Do not make it public. The default remains +loopback-only when `SCHEMA_STREAM_EXAMPLE_ORIGIN` is absent. + +If `OPENAI_API_KEY` is already injected into the server environment, the same page enables its +explicit OpenAI mode. The key never enters the browser or a socket message. Fixture mode remains the +right first run and is enough to inspect every transport and rendering behavior. + +## What the example proves + +- The Agents SDK stream is parsed on the server. +- Each accepted browser message is a complete, versioned JSON document. +- A nested completed boolean can select an application branch before the root document completes. +- The final progressive snapshot must equal the SDK's authoritative structured result. +- Start, cancel, policy selection, progress, and final state share one socket. + +The localhost example also validates Host and Origin, requires a session token for the upgrade, +limits prompt length and byte thresholds, disables provider tracing, and aborts generation when the +socket closes. Its output queue is deliberately simple for a single-user visualization. A +production server still needs bounded per-client queues, authorization, rate limits, reconnect +state, and a policy for coalescing superseded snapshots without dropping the final result. + +See [Transporting progressive JSON](../transports.md) for the SSE, NDJSON, Fetch stream, and +WebSocket tradeoffs. SSE also preserves event boundaries; WebSocket is attractive here because the +application needs bidirectional start, cancel, and policy controls on the same connection. diff --git a/docs/integrations/mastra.md b/docs/integrations/mastra.md new file mode 100644 index 0000000..0cf66ee --- /dev/null +++ b/docs/integrations/mastra.md @@ -0,0 +1,98 @@ +# Mastra + +Mastra's documented progressive structured-output surface is `objectStream`. Prefer it directly when +its partial-object cadence is sufficient, and use `result.object` as the validated final value. + +```ts +import { Agent } from "@mastra/core/agent" +import { z } from "zod" + +const itinerarySchema = z.object({ + title: z.string(), + stops: z.array(z.object({ name: z.string(), note: z.string().nullable() })) +}) + +const agent = new Agent({ + id: "itinerary", + name: "Itinerary", + model: "openai/gpt-5.6-luna", + instructions: "Return the requested structured itinerary." +}) +const result = await agent.stream("Plan a weekend.", { + structuredOutput: { errorStrategy: "strict", schema: itinerarySchema } +}) + +for await (const partial of result.objectStream) { + renderProgress(partial) +} + +const finalOutput = await result.object +``` + +## Guard the compatibility path + +Mastra describes `textStream` as natural-language text, not a general raw-JSON contract. A pinned +Mastra/provider combination can currently expose the structured response as JSON text. Schema Stream +can add incomplete-string updates, completion events, and snapshot policies only when that contract +is checked and allowed to fail closed. + +```ts +import { SchemaStream, type SchemaStreamSource } from "schema-stream" + +async function* requireJsonObjectText( + source: SchemaStreamSource +): AsyncIterable { + let sawJsonStart = false + + for await (const chunk of source) { + if (!sawJsonStart) { + const candidate = chunk.trimStart() + if (candidate.length > 0) { + if (!candidate.startsWith("{")) { + throw new Error("Mastra textStream did not begin with a JSON object") + } + sawJsonStart = true + } + } + yield chunk + } + + if (!sawJsonStart) { + throw new Error("Mastra textStream did not contain a JSON object") + } +} + +const parser = new SchemaStream(itinerarySchema) +for await (const snapshot of parser.iterate(requireJsonObjectText(result.textStream))) { + renderFineGrainedProgress(snapshot) +} + +const finalOutput = await result.object +``` + +This guard only checks that the stream starts like a JSON object; the parser and final Mastra result +still provide the meaningful end-to-end checks. Do not silently fall back from prose to partial JSON +parsing. + +## Verify the pinned lane + +[`examples/mastra.ts`](../../examples/mastra.ts) is the executable compatibility canary. Its +credential-free model runs through Mastra's real `Agent.stream()` orchestration, verifies a nested +completion-driven decision, and compares the final Schema Stream snapshot with `result.object`: + +```sh +bun run example:mastra +bun test tests/sdk-runtime.test.ts +``` + +The repository's weekly live lane pins the tested Mastra and OpenAI model combination: + +```sh +SCHEMA_STREAM_LIVE_E2E=1 \ +SCHEMA_STREAM_LIVE_PROVIDER=mastra \ +SCHEMA_STREAM_MASTRA_MODEL=openai/gpt-5.6-luna \ +bun run test:live +``` + +That lane requires `OPENAI_API_KEY` in the server environment. It is a canary for the pinned path, +not a promise that every Mastra provider emits JSON through `textStream`. diff --git a/docs/integrations/openai-agents.md b/docs/integrations/openai-agents.md new file mode 100644 index 0000000..6d226ef --- /dev/null +++ b/docs/integrations/openai-agents.md @@ -0,0 +1,82 @@ +# OpenAI Agents SDK + +The OpenAI Agents SDK exposes model text as an async stream through `toTextStream()`. Pass that +stream to `SchemaStream.iterate()` on the server, render the progressive snapshots, then treat the +Agents SDK result as authoritative after the run completes. + +```ts +import { Agent, run } from "@openai/agents" +import { SchemaStream } from "schema-stream" +import { z } from "zod" + +const analysisSchema = z.object({ + summary: z.string(), + triage: z.object({ + requiresApproval: z.boolean(), + rationale: z.string() + }), + tags: z.array(z.string()) +}) + +const agent = new Agent({ + name: "Analyst", + model: "gpt-5.6-luna", + instructions: "Return a structured analysis.", + outputType: analysisSchema +}) + +const result = await run(agent, "Assess the release plan.", { stream: true }) +const parser = new SchemaStream(analysisSchema, { + onValueComplete({ path, value }) { + const isApproval = + path.length === 2 && path[0] === "triage" && path[1] === "requiresApproval" + + if (isApproval && value === true) { + notifyReleaseOwner() + } + } +}) + +for await (const snapshot of parser.iterate(result.toTextStream())) { + renderProgress(snapshot) +} + +await result.completed +const finalOutput = analysisSchema.parse(result.finalOutput) +``` + +`onValueComplete` runs after the boolean is syntactically complete, so the branch does not inspect a +partial value. Keep callback work short and reversible; final model validation can still fail. See +[Completion events](../completion-events.md) for ordering and container-value semantics. + +## Server boundary + +- Keep `OPENAI_API_KEY`, the Agents SDK, and Schema Stream in a trusted server process. +- Forward complete snapshots, patches, or completion events to the browser. Do not forward the key + or make the browser understand provider event envelopes. +- Wire the request's `AbortSignal` through the Agents SDK and stop producing snapshots when no + authorized consumer remains. +- Use the SDK's `finalOutput` only after `completed` resolves, and validate it before durable writes. + +## Verify the integration + +The repository's [`examples/sdk-mocks.ts`](../../examples/sdk-mocks.ts) runs the real Agents SDK +Runner against a deterministic model implementation. It verifies progressive snapshots, a nested +completion-driven decision, and final-result equality without credentials: + +```sh +bun run example:sdk +bun test tests/sdk-runtime.test.ts +``` + +The opt-in live lane requires an already injected key and an explicit model: + +```sh +SCHEMA_STREAM_LIVE_E2E=1 \ +SCHEMA_STREAM_LIVE_PROVIDER=agents \ +SCHEMA_STREAM_AGENTS_MODEL=gpt-5.6-luna \ +bun run test:live +``` + +The live suite uses bounded output, timeouts, disabled tracing, varied nested schemas, and sanitized +failures. Never place a key in a command, source file, client bundle, or documentation form. diff --git a/docs/integrations/provider-portability.md b/docs/integrations/provider-portability.md new file mode 100644 index 0000000..f5d0377 --- /dev/null +++ b/docs/integrations/provider-portability.md @@ -0,0 +1,74 @@ +# Provider portability + +Schema Stream is provider-agnostic at its input boundary: it consumes JSON text or UTF-8 bytes. A +provider integration is portable only when the surrounding SDK reliably exposes the structured +response as raw JSON text and separately validates an authoritative final result. + +The Vercel AI SDK is the repository's portability boundary. Keep the parser function generic over +AI SDK's `LanguageModel` and configure the provider elsewhere: + +```ts +import { type LanguageModel, Output, streamText } from "ai" +import { SchemaStream } from "schema-stream" +import { z } from "zod" + +const schema = z.object({ + answer: z.string(), + confidence: z.number(), + sources: z.array(z.string()) +}) + +async function runStructuredModel({ + model, + prompt +}: { + model: LanguageModel + prompt: string +}): Promise> { + const result = streamText({ model, output: Output.object({ schema }), prompt }) + const parser = new SchemaStream(schema) + + for await (const snapshot of parser.iterate(result.textStream)) { + renderProgress(snapshot) + } + + return await result.output +} +``` + +The same function can receive an AI SDK model supplied by a gateway or a separately configured AI +SDK provider package. Credential loading, model identifiers, and provider options stay outside +Schema Stream. + +## What is tested + +| Path | Repository evidence | Support claim | +| --- | --- | --- | +| OpenAI Agents SDK | Deterministic runtime tests, packed types, and weekly live tests | Direct documented integration | +| Vercel AI SDK `LanguageModel` | Deterministic `streamText()` runtime tests and packed types | SDK-level integration | +| Vercel AI Gateway | Opt-in live test lane for an application-selected model id | Live harness available; model-specific behavior must be tested | +| Mastra with the pinned OpenAI path | Guarded deterministic example and weekly live canary | Pinned compatibility lane | +| Anthropic or Claude through the AI SDK interface | The same tested AI SDK `LanguageModel` boundary | Candidate integration; no native Anthropic adapter or live model is claimed | +| Google Gemini through the AI SDK interface | The same tested AI SDK `LanguageModel` boundary | Candidate integration; no native Gemini adapter or live model is claimed | + +The repository does not currently install, execute, or promise direct Anthropic SDK or Google +GenAI SDK stream adapters. Do not pass provider-specific SSE events to Schema Stream unless an +adapter first extracts only the structured JSON text and has its own fixture and live canary. + +## Qualify a model before shipping + +1. Run the credential-free AI SDK fixtures with the exact package versions used by the application. +2. Add a provider-shaped deterministic fixture that splits JSON across strings, escapes, UTF-8 + boundaries, nested arrays, and completion boundaries. +3. Run the opt-in live Gateway lane with the exact model id and several structurally different + schemas. +4. Assert meaningful intermediate snapshots, child-before-root completion ordering, and equality + between the final snapshot and `result.output`. +5. Bound output, retries, and timeouts; sanitize failures so prompts, responses, headers, and keys do + not enter logs. +6. Keep one scheduled canary for every provider/model combination the application depends on. + +Provider behavior and structured-output support can change independently of Schema Stream. An AI SDK +type check proves the interface compiles; it does not prove a particular model emits useful or +correct incremental JSON. See [Integration testing](../integration-testing.md) for the existing +fixtures and live-test contract. diff --git a/docs/integrations/vercel-ai-sdk.md b/docs/integrations/vercel-ai-sdk.md new file mode 100644 index 0000000..98ac0dc --- /dev/null +++ b/docs/integrations/vercel-ai-sdk.md @@ -0,0 +1,86 @@ +# Vercel AI SDK + +Use Schema Stream with the Vercel AI SDK when you need finer updates than +`partialOutputStream` provides, schema-derived placeholders before fields arrive, or completion +events for individual JSON values. Feed `streamText().textStream` to the parser and keep +`result.output` as the authoritative structured result. + +```ts +import { type LanguageModel, Output, streamText } from "ai" +import { SchemaStream } from "schema-stream" +import { z } from "zod" + +const analysisSchema = z.object({ + summary: z.string(), + details: z.object({ score: z.number() }), + tags: z.array(z.string()) +}) + +async function streamAnalysis({ + input, + model +}: { + input: string + model: LanguageModel +}): Promise> { + const result = streamText({ + model, + output: Output.object({ schema: analysisSchema }), + prompt: input + }) + const parser = new SchemaStream(analysisSchema) + + for await (const snapshot of parser.iterate(result.textStream)) { + renderProgress(snapshot) + } + + return await result.output +} +``` + +The `LanguageModel` input keeps the parsing code independent of how the application configures an AI +SDK provider or gateway. Schema Stream integrates with the normalized AI SDK text stream; it does +not configure provider credentials or replace the SDK's structured-output validation. + +## Choose the native partial stream when it is enough + +Prefer AI SDK's `partialOutputStream` when its object cadence already meets the interface's needs. +Use Schema Stream on `textStream` when one or more of these matter: + +- incomplete strings should visibly grow; +- nested placeholders should exist before the provider reaches them; +- `onValueComplete` should trigger a conditional branch as soon as one value settles; +- snapshot cadence should use Schema Stream's `chunk`, `value`, `bytes`, or `final` policy. + +Regardless of the progress path, await `result.output` before treating the generation as valid. + +## Verify the integration + +[`examples/sdk-mocks.ts`](../../examples/sdk-mocks.ts) and +[`tests/sdk-runtime.test.ts`](../../tests/sdk-runtime.test.ts) exercise `streamText()`, +`Output.object()`, and `textStream` with provider-shaped deterministic events: + +```sh +bun run example:sdk +bun test tests/sdk-runtime.test.ts +``` + +The test suite covers Unicode, escaped content, optional and nullable fields, records, and deeply +nested arrays. The packed-consumer gate also compiles the integration against the generated package: + +```sh +bun run test:packed +``` + +An opt-in Vercel AI Gateway lane exists for an application-selected `provider/model` id: + +```sh +SCHEMA_STREAM_LIVE_E2E=1 \ +SCHEMA_STREAM_LIVE_PROVIDER=gateway \ +SCHEMA_STREAM_GATEWAY_MODEL= \ +bun run test:live +``` + +It requires `AI_GATEWAY_API_KEY` through the server environment. See [Provider +portability](./provider-portability.md) before generalizing the deterministic AI SDK coverage to a +specific Anthropic or Gemini model. diff --git a/docs/reference/api.md b/docs/reference/api.md new file mode 100644 index 0000000..3c61a06 --- /dev/null +++ b/docs/reference/api.md @@ -0,0 +1,360 @@ + + +# Public API reference + +This reference is generated with the installed TypeScript compiler API from every export reachable through [`src/index.ts`](../../src/index.ts). It documents the package entry point rather than implementation-only exports. + +For complete usage, see the [progressive JSON example](../../examples/progressive-json.ts), [SDK examples](../../examples/sdk-mocks.ts), [Mastra example](../../examples/mastra.ts), and [Bun WebSocket UI](../../examples/websocket-ui/). + +## Exports + +| Name | Kind | Description | +| --- | --- | --- | +| [`SchemaStream`](#schemastream) | Class | Parses chunked JSON into schema-shaped intermediate values. SchemaStream does not validate chunks; consumers should validate the final value with their Zod schema. | +| [`OnKeyCompleteCallback`](#onkeycompletecallback) | Type | Receives independent path snapshots as streamed values progress and complete. | +| [`OnKeyCompleteCallbackParams`](#onkeycompletecallbackparams) | Type | Legacy progress state reported after a streamed value changes. | +| [`OnValueCompleteCallback`](#onvaluecompletecallback) | Type | Receives the path and value when each primitive or container finishes parsing. | +| [`OnValueCompleteCallbackParams`](#onvaluecompletecallbackparams) | Type | A single completed-value event without cumulative completion history. | +| [`SchemaInput`](#schemainput) | Type | Infers the input value represented by a supported Zod schema. | +| [`SchemaPath`](#schemapath) | Type | Object keys and array indexes locating a value in the streamed document. | +| [`SchemaStreamChunk`](#schemastreamchunk) | Type | Progressive, schema-shaped value yielded for a supported object schema. | +| [`SchemaStreamDefaultData`](#schemastreamdefaultdata) | Type | Field-level placeholder overrides accepted when creating schema-derived stubs. | +| [`SchemaStreamInputChunk`](#schemastreaminputchunk) | Type | A text or UTF-8 byte chunk accepted by `iterate()`. | +| [`SchemaStreamOptions`](#schemastreamoptions) | Type | Configures schema-derived placeholders and completion reporting. | +| [`SchemaStreamParseOptions`](#schemastreamparseoptions) | Type | Configures JSON tokenization and snapshot cadence for `parse()` and `iterate()`. | +| [`SchemaStreamSource`](#schemastreamsource) | Type | A Web Stream or async iterable that supplies JSON text or UTF-8 bytes. | +| [`SchemaStreamValue`](#schemastreamvalue) | Type | Recursively makes streamed fields optional and primitive values nullable. | +| [`SchemaStreamValuePath`](#schemastreamvaluepath) | Type | Object keys and array indexes locating a syntactically complete JSON value. | +| [`SnapshotPolicy`](#snapshotpolicy) | Type | Controls when cumulative JSON snapshots are emitted. The default is `chunk`. | +| [`TypeDefaults`](#typedefaults) | Type | Primitive placeholders used until streamed JSON supplies a value. | +| [`Zod3ObjectSchema`](#zod3objectschema) | Type | Zod 3 object schema contract required for shape inspection and type inference. | +| [`Zod3Schema`](#zod3schema) | Type | Minimal structural contract used to support a Zod 3 schema without importing its runtime. | +| [`ZodObjectSchema`](#zodobjectschema) | Type | Object schemas accepted by the public `SchemaStream` constructor. | +| [`ZodSchema`](#zodschema) | Type | Schema versions accepted by SchemaStream's compatibility layer. | + +## Classes + +### SchemaStream + +Parses chunked JSON into schema-shaped intermediate values. SchemaStream does not validate chunks; consumers should validate the final value with their Zod schema. + +**Kind:** Class | **Source:** [`src/utils/streaming-json-parser.ts`](../../src/utils/streaming-json-parser.ts) + +```ts +class SchemaStream +``` + +#### constructor + +Creates parser state and schema-derived placeholders for one streamed JSON document. + +```ts +constructor(schema: TSchema, options?: SchemaStreamOptions) +``` + +#### getSchemaStub + +Returns a new schema-derived stub using this instance's primitive defaults. + +```ts +getSchemaStub(schema: TStubSchema, defaultData?: SchemaStreamDefaultData): SchemaStreamChunk +``` + +#### parse + +Creates a transform that emits cumulative JSON snapshots at the selected cadence. Omitting `snapshotPolicy` preserves the existing one-snapshot-per-input-chunk behavior. + +```ts +parse(options?: SchemaStreamParseOptions): TransformStream +``` + +#### iterate + +Consumes streamed JSON text or bytes and yields independent schema-shaped snapshots. The completed value is still unvalidated; use the producing SDK's settled output or validate the final snapshot with the schema. + +```ts +iterate(source: SchemaStreamSource, options?: SchemaStreamParseOptions): AsyncGenerator, void, void> +``` + +## Types + +### OnKeyCompleteCallback + +Receives independent path snapshots as streamed values progress and complete. + +**Kind:** Type | **Source:** [`src/utils/streaming-json-parser.ts`](../../src/utils/streaming-json-parser.ts) + +```ts +export type OnKeyCompleteCallback = (data: OnKeyCompleteCallbackParams) => void +``` + +### OnKeyCompleteCallbackParams + +Legacy progress state reported after a streamed value changes. + +**Kind:** Type | **Source:** [`src/utils/streaming-json-parser.ts`](../../src/utils/streaming-json-parser.ts) + +```ts +export type OnKeyCompleteCallbackParams = { + /** The value currently receiving streamed content, or an empty path after parsing finishes. */ + activePath: SchemaPath + /** Unique value paths that have completed at least once, in completion order. */ + completedPaths: SchemaPath[] +} +``` + +### OnValueCompleteCallback + +Receives the path and value when each primitive or container finishes parsing. + +**Kind:** Type | **Source:** [`src/utils/streaming-json-parser.ts`](../../src/utils/streaming-json-parser.ts) + +```ts +export type OnValueCompleteCallback = (event: OnValueCompleteCallbackParams) => void +``` + +### OnValueCompleteCallbackParams + +A single completed-value event without cumulative completion history. + +**Kind:** Type | **Source:** [`src/utils/streaming-json-parser.ts`](../../src/utils/streaming-json-parser.ts) + +```ts +export type OnValueCompleteCallbackParams = { + /** + * Path of the value that just completed. Children complete before their containers, and an empty + * path identifies the completed root document. + */ + path: SchemaStreamValuePath + /** + * The syntactically complete JSON value at `path`. The parser does not clone container values for + * this callback; consumers should treat objects and arrays as read-only because mutations can be + * visible in later ancestor and root completion events. + */ + value: unknown +} +``` + +### SchemaInput + +Infers the input value represented by a supported Zod schema. + +**Kind:** Type | **Source:** [`src/utils/zod-compat.ts`](../../src/utils/zod-compat.ts) + +```ts +export type SchemaInput = TSchema extends { + _zod: z4.$ZodType["_zod"] +} + ? z4.input + : TSchema extends Zod3Schema + ? TSchema["_input"] + : never +``` + +### SchemaPath + +Object keys and array indexes locating a value in the streamed document. + +**Kind:** Type | **Source:** [`src/utils/streaming-json-parser.ts`](../../src/utils/streaming-json-parser.ts) + +```ts +export type SchemaPath = (string | number | undefined)[] +``` + +### SchemaStreamChunk + +Progressive, schema-shaped value yielded for a supported object schema. + +**Kind:** Type | **Source:** [`src/utils/zod-compat.ts`](../../src/utils/zod-compat.ts) + +```ts +export type SchemaStreamChunk = SchemaStreamValue< + SchemaInput +> +``` + +### SchemaStreamDefaultData + +Field-level placeholder overrides accepted when creating schema-derived stubs. + +**Kind:** Type | **Source:** [`src/utils/zod-compat.ts`](../../src/utils/zod-compat.ts) + +```ts +export type SchemaStreamDefaultData = Partial< + SchemaStreamChunk +> +``` + +### SchemaStreamInputChunk + +A text or UTF-8 byte chunk accepted by `iterate()`. + +**Kind:** Type | **Source:** [`src/utils/streaming-json-parser.ts`](../../src/utils/streaming-json-parser.ts) + +```ts +export type SchemaStreamInputChunk = string | Uint8Array +``` + +### SchemaStreamOptions + +Configures schema-derived placeholders and completion reporting. + +**Kind:** Type | **Source:** [`src/utils/streaming-json-parser.ts`](../../src/utils/streaming-json-parser.ts) + +```ts +export type SchemaStreamOptions = { + /** Field-level placeholders that take precedence over schema and primitive defaults. */ + defaultData?: SchemaStreamDefaultData + /** Fallback placeholders for primitive schema nodes. Defaults to `null`. */ + typeDefaults?: TypeDefaults + /** Called as values progress and once more with an empty active path after completion. */ + onKeyComplete?: OnKeyCompleteCallback + /** + * Called once for each completed JSON value, including containers and the root document. Unlike + * `onKeyComplete`, this callback emits a path delta and does not copy cumulative history. + */ + onValueComplete?: OnValueCompleteCallback +} +``` + +### SchemaStreamParseOptions + +Configures JSON tokenization and snapshot cadence for `parse()` and `iterate()`. + +**Kind:** Type | **Source:** [`src/utils/streaming-json-parser.ts`](../../src/utils/streaming-json-parser.ts) + +```ts +export type SchemaStreamParseOptions = { + /** Buffers string bytes in fixed-size blocks instead of emitting every incremental string. */ + stringBufferSize?: number + /** Converts unescaped newlines inside strings to `\n`; enabled by default. */ + handleUnescapedNewLines?: boolean + /** Selects when cumulative schema-shaped snapshots are emitted. */ + snapshotPolicy?: SnapshotPolicy +} +``` + +### SchemaStreamSource + +A Web Stream or async iterable that supplies JSON text or UTF-8 bytes. + +**Kind:** Type | **Source:** [`src/utils/streaming-json-parser.ts`](../../src/utils/streaming-json-parser.ts) + +```ts +export type SchemaStreamSource = + | ReadableStream + | AsyncIterable +``` + +### SchemaStreamValue + +Recursively makes streamed fields optional and primitive values nullable. + +**Kind:** Type | **Source:** [`src/utils/zod-compat.ts`](../../src/utils/zod-compat.ts) + +```ts +export type SchemaStreamValue = unknown extends TValue + ? unknown + : TValue extends readonly (infer TItem)[] + ? SchemaStreamValue[] + : TValue extends Record + ? { [TKey in keyof TValue]?: SchemaStreamValue } + : TValue | null +``` + +### SchemaStreamValuePath + +Object keys and array indexes locating a syntactically complete JSON value. + +**Kind:** Type | **Source:** [`src/utils/streaming-json-parser.ts`](../../src/utils/streaming-json-parser.ts) + +```ts +export type SchemaStreamValuePath = readonly (string | number)[] +``` + +### SnapshotPolicy + +Controls when cumulative JSON snapshots are emitted. The default is `chunk`. + +**Kind:** Type | **Source:** [`src/utils/streaming-json-parser.ts`](../../src/utils/streaming-json-parser.ts) + +```ts +export type SnapshotPolicy = + | { + /** Emits after every input chunk. */ + mode: "chunk" + } + | { + /** Emits when an input chunk completes one or more primitive values. */ + mode: "value" + } + | { + /** Emits after this many or more source bytes have arrived. */ + bytes: number + mode: "bytes" + } + | { + /** Emits one snapshot after the complete JSON document is parsed. */ + mode: "final" + } +``` + +### TypeDefaults + +Primitive placeholders used until streamed JSON supplies a value. + +**Kind:** Type | **Source:** [`src/utils/streaming-json-parser.ts`](../../src/utils/streaming-json-parser.ts) + +```ts +export type TypeDefaults = { + string?: string | null | undefined + number?: number | null | undefined + boolean?: boolean | null | undefined +} +``` + +### Zod3ObjectSchema + +Zod 3 object schema contract required for shape inspection and type inference. + +**Kind:** Type | **Source:** [`src/utils/zod-compat.ts`](../../src/utils/zod-compat.ts) + +```ts +export type Zod3ObjectSchema = Zod3Schema & { + readonly shape: Readonly> +} +``` + +### Zod3Schema + +Minimal structural contract used to support a Zod 3 schema without importing its runtime. + +**Kind:** Type | **Source:** [`src/utils/zod-compat.ts`](../../src/utils/zod-compat.ts) + +```ts +export type Zod3Schema = { + readonly _def: unknown + readonly _input: unknown + readonly _output: unknown +} +``` + +### ZodObjectSchema + +Object schemas accepted by the public `SchemaStream` constructor. + +**Kind:** Type | **Source:** [`src/utils/zod-compat.ts`](../../src/utils/zod-compat.ts) + +```ts +export type ZodObjectSchema = Zod3ObjectSchema | z4.$ZodObject +``` + +### ZodSchema + +Schema versions accepted by SchemaStream's compatibility layer. + +**Kind:** Type | **Source:** [`src/utils/zod-compat.ts`](../../src/utils/zod-compat.ts) + +```ts +export type ZodSchema = Zod3Schema | z4.$ZodType +``` diff --git a/docs/snapshot-policies.md b/docs/snapshot-policies.md index c9a7555..035bc62 100644 --- a/docs/snapshot-policies.md +++ b/docs/snapshot-policies.md @@ -109,9 +109,9 @@ The streaming tables exercise `chunk`, `value`, 256 KiB, 1 MiB, and `final` poli paths: - `parse` incrementally parses the source and emits serialized UTF-8 snapshots. -- `roundtrip` runs the same parser and policy, then decodes and applies `JSON.parse` to every - emitted snapshot. This is the feature-aligned baseline for the former serialized - object-materialization path. +- `roundtrip` runs the same parser and policy. `parse()` materializes each snapshot with + `JSON.stringify` and UTF-8 encoding, then the consumer decodes it and applies `JSON.parse`. This + is the feature-aligned baseline for the former serialized object-materialization path. - `iterate` incrementally parses the same source and emits independent object snapshots directly. `speedup` is the round-trip median divided by the `iterate` median. Serialized and avoided MiB are @@ -123,7 +123,7 @@ timed windows. This comparison isolates materialization strategy on the current parser. It does not claim to reproduce every implementation detail of an older release, and it does not compare SchemaStream to -`JSON.stringify` as though they performed the same work. +standalone `JSON.parse` or `JSON.stringify` as though they performed the same work. ### Options and evidence diff --git a/examples/websocket-ui/server.ts b/examples/websocket-ui/server.ts index 0c73cf7..31b62c5 100644 --- a/examples/websocket-ui/server.ts +++ b/examples/websocket-ui/server.ts @@ -27,6 +27,7 @@ const defaultModel = "gpt-5.6-luna" const maxPromptLength = 800 const decisionPath = ["triage", "requiresApproval"] as const const fixtureBrief = "Customer-facing release with three open checks and an approval gate." +const trailingSlashPattern = /\/$/ const dashboardSchema = z.object({ brief: z.string(), @@ -140,8 +141,11 @@ type AgentExecution = { const openAiModel = process.env.SCHEMA_STREAM_EXAMPLE_MODEL?.trim() || defaultModel const openAiAvailable = Boolean(process.env.OPENAI_API_KEY?.trim()) const port = readPort(process.env.SCHEMA_STREAM_EXAMPLE_PORT) -const allowedHost = `127.0.0.1:${port}` -const allowedOrigin = `http://${allowedHost}` +const browserBoundary = readBrowserBoundary({ + port, + publicOrigin: process.env.SCHEMA_STREAM_EXAMPLE_ORIGIN +}) +const { allowedHost, allowedOrigin, listenHostname, websocketOrigin } = browserBoundary const websocketToken = crypto.randomUUID() const runner = new Runner({ traceIncludeSensitiveData: false, @@ -167,6 +171,64 @@ function readPort(rawPort: string | undefined): number { return parsed } +type BrowserBoundary = { + allowedHost: string + allowedOrigin: string + listenHostname: "0.0.0.0" | "127.0.0.1" + websocketOrigin: string +} + +/** + * Resolves the browser capability boundary. External binding is allowed only with one exact HTTPS + * origin, which supports authenticated development proxies such as GitHub Codespaces without + * weakening the default loopback-only server. + */ +function readBrowserBoundary({ + port: configuredPort, + publicOrigin +}: { + port: number + publicOrigin: string | undefined +}): BrowserBoundary { + if (!publicOrigin?.trim()) { + const host = `127.0.0.1:${configuredPort}` + return { + allowedHost: host, + allowedOrigin: `http://${host}`, + listenHostname: "127.0.0.1", + websocketOrigin: `ws://${host}` + } + } + + const rawOrigin = publicOrigin.trim() + let parsed: URL + try { + parsed = new URL(rawOrigin) + } catch (error) { + throw new TypeError("SCHEMA_STREAM_EXAMPLE_ORIGIN must be an absolute HTTPS origin", { + cause: error + }) + } + + const hasOriginOnly = + parsed.protocol === "https:" && + parsed.username === "" && + parsed.password === "" && + parsed.pathname === "/" && + parsed.search === "" && + parsed.hash === "" + if (!hasOriginOnly || parsed.origin !== rawOrigin.replace(trailingSlashPattern, "")) { + throw new TypeError("SCHEMA_STREAM_EXAMPLE_ORIGIN must be an absolute HTTPS origin") + } + + return { + allowedHost: parsed.host, + allowedOrigin: parsed.origin, + listenHostname: "0.0.0.0", + websocketOrigin: `wss://${parsed.host}` + } +} + /** Narrows decoded client frames before any property is trusted. */ function isRecord(value: unknown): value is Record { return typeof value === "object" && value !== null && !Array.isArray(value) @@ -653,14 +715,14 @@ const server = Bun.serve({ return new Response(Bun.file(`${import.meta.dir}/${asset.file}`), { headers: { "Cache-Control": "no-store", - "Content-Security-Policy": `default-src 'self'; connect-src 'self' ws://${allowedHost}; img-src 'self' data:; object-src 'none'; base-uri 'none'; frame-ancestors 'none'`, + "Content-Security-Policy": `default-src 'self'; connect-src 'self' ${websocketOrigin}; img-src 'self' data:; object-src 'none'; base-uri 'none'; frame-ancestors 'none'`, "Content-Type": asset.contentType, "Referrer-Policy": "no-referrer", "X-Content-Type-Options": "nosniff" } }) }, - hostname: "127.0.0.1", + hostname: listenHostname, port, websocket: { close(socket) { @@ -681,6 +743,9 @@ const server = Bun.serve({ }) process.stdout.write(`SchemaStream WebSocket UI: ${server.url}\n`) +if (listenHostname !== "127.0.0.1") { + process.stdout.write(`Browser origin: ${allowedOrigin}\n`) +} process.stdout.write( `OpenAI mode: ${openAiAvailable ? `available (${openAiModel})` : "disabled"}\n` ) diff --git a/package.json b/package.json index 0e7abb5..69e81f4 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Progressively parse streamed JSON into typed, schema-shaped snapshots", "author": "Dimitri Kennedy (https://hack.dance)", "license": "MIT", - "homepage": "https://hack.dance", + "homepage": "https://schema.stream", "repository": { "type": "git", "url": "git+https://github.com/hack-dance/schema-stream.git" @@ -53,14 +53,23 @@ "node": ">=22" }, "packageManager": "bun@1.3.14", + "workspaces": [ + "site" + ], "scripts": { "benchmark": "bun tests/snapshot-policy.benchmark.mts", "benchmark:snapshots": "bun tests/snapshot-policy.benchmark.mts", "build": "tsup && tsc --project tsconfig.build.json", - "check": "bun run lint && bun run type-check && bun run test && bun run test:packed", + "check": "bun run lint && bun run type-check && bun run test && bun run test:packed && bun run docs:check && bun run docs:build", "changeset": "changeset", "clean": "rm -rf coverage dist node_modules", "dev": "tsup --watch", + "docs:build": "bun run docs:generate && bun run docs:prepare && bun run build && bun run --cwd site build", + "docs:check": "bun scripts/docs/generate.ts --check", + "docs:dev": "bun run docs:generate && bun run docs:prepare && bun run build && bun run --cwd site dev", + "docs:generate": "bun scripts/docs/generate.ts", + "docs:prepare": "bun scripts/docs/prepare.ts", + "docs:start": "bun run --cwd site start", "example:mastra": "bun examples/mastra.ts", "example:progressive": "bun examples/progressive-json.ts", "example:sdk": "bun examples/sdk-mocks.ts", diff --git a/scripts/docs/benchmark.ts b/scripts/docs/benchmark.ts new file mode 100644 index 0000000..a89ee27 --- /dev/null +++ b/scripts/docs/benchmark.ts @@ -0,0 +1,248 @@ +import { basename, join } from "node:path" +import { benchmarkOutputPath, type GeneratedDocument, repositoryRoot } from "./config" + +type BenchmarkRow = { + avoidedSerializedBytes: number + fixture: string + iterateMedianMs: number + policy: string + roundtripMedianMs: number + runtime: string + speedup: number +} + +type BenchmarkEvidence = { + capturedAt: string + configuration: { + chunkSizeBytes: number + fixtures: string[] + payloadSizeMiB: number + policies: string[] + repeats: number + runtimes: string[] + warmups: number + } + host: { + architecture: string + chip: string + operatingSystem: string + } + method: { + baseline: string + candidate: string + resultValidation: string + sampleOrdering: string + speedup: string + } + representativeRows: BenchmarkRow[] +} + +type EvidenceFile = { + evidence: BenchmarkEvidence + path: string +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value) +} + +function requireRecord(value: unknown, field: string): Record { + if (!isRecord(value)) { + throw new TypeError(`Benchmark evidence field "${field}" must be an object`) + } + return value +} + +function requireString(value: unknown, field: string): string { + if (typeof value !== "string" || value.length === 0) { + throw new TypeError(`Benchmark evidence field "${field}" must be a non-empty string`) + } + return value +} + +function requireNumber(value: unknown, field: string): number { + if (typeof value !== "number" || !Number.isFinite(value)) { + throw new TypeError(`Benchmark evidence field "${field}" must be a finite number`) + } + return value +} + +function requireStringArray(value: unknown, field: string): string[] { + if (!Array.isArray(value)) { + throw new TypeError(`Benchmark evidence field "${field}" must be an array`) + } + return value.map((entry, index) => requireString(entry, `${field}[${index}]`)) +} + +/** + * Narrows machine-readable benchmark evidence before any values are rendered into documentation. + * This intentionally validates the summary contract instead of accepting arbitrary JSON casts. + */ +function parseBenchmarkEvidence(value: unknown): BenchmarkEvidence { + const root = requireRecord(value, "root") + const configuration = requireRecord(root.configuration, "configuration") + const host = requireRecord(root.host, "host") + const method = requireRecord(root.method, "method") + + if (!Array.isArray(root.representativeRows) || root.representativeRows.length === 0) { + throw new TypeError('Benchmark evidence field "representativeRows" must be a non-empty array') + } + + const capturedAt = requireString(root.capturedAt, "capturedAt") + if (!Number.isFinite(Date.parse(capturedAt))) { + throw new TypeError('Benchmark evidence field "capturedAt" must be an ISO date') + } + + const representativeRows = root.representativeRows.map((valueRow, index): BenchmarkRow => { + const row = requireRecord(valueRow, `representativeRows[${index}]`) + return { + avoidedSerializedBytes: requireNumber( + row.avoidedSerializedBytes, + `representativeRows[${index}].avoidedSerializedBytes` + ), + fixture: requireString(row.fixture, `representativeRows[${index}].fixture`), + iterateMedianMs: requireNumber( + row.iterateMedianMs, + `representativeRows[${index}].iterateMedianMs` + ), + policy: requireString(row.policy, `representativeRows[${index}].policy`), + roundtripMedianMs: requireNumber( + row.roundtripMedianMs, + `representativeRows[${index}].roundtripMedianMs` + ), + runtime: requireString(row.runtime, `representativeRows[${index}].runtime`), + speedup: requireNumber(row.speedup, `representativeRows[${index}].speedup`) + } + }) + + return { + capturedAt, + configuration: { + chunkSizeBytes: requireNumber(configuration.chunkSizeBytes, "configuration.chunkSizeBytes"), + fixtures: requireStringArray(configuration.fixtures, "configuration.fixtures"), + payloadSizeMiB: requireNumber(configuration.payloadSizeMiB, "configuration.payloadSizeMiB"), + policies: requireStringArray(configuration.policies, "configuration.policies"), + repeats: requireNumber(configuration.repeats, "configuration.repeats"), + runtimes: requireStringArray(configuration.runtimes, "configuration.runtimes"), + warmups: requireNumber(configuration.warmups, "configuration.warmups") + }, + host: { + architecture: requireString(host.architecture, "host.architecture"), + chip: requireString(host.chip, "host.chip"), + operatingSystem: requireString(host.operatingSystem, "host.operatingSystem") + }, + method: { + baseline: requireString(method.baseline, "method.baseline"), + candidate: requireString(method.candidate, "method.candidate"), + resultValidation: requireString(method.resultValidation, "method.resultValidation"), + sampleOrdering: requireString(method.sampleOrdering, "method.sampleOrdering"), + speedup: requireString(method.speedup, "method.speedup") + }, + representativeRows + } +} + +async function readEvidenceFiles(): Promise { + const benchmarkDirectory = join(repositoryRoot, "docs/benchmarks") + const glob = new Bun.Glob("*.json") + const paths = [ + ...glob.scanSync({ absolute: true, cwd: benchmarkDirectory, onlyFiles: true }) + ].sort((left, right) => left.localeCompare(right)) + + if (paths.length === 0) { + throw new Error("No checked-in benchmark JSON was found in docs/benchmarks") + } + + return await Promise.all( + paths.map(async path => { + const value: unknown = await Bun.file(path).json() + return { evidence: parseBenchmarkEvidence(value), path } + }) + ) +} + +function formatMilliseconds(value: number): string { + return `${value.toFixed(2)} ms` +} + +function formatMebibytes(value: number): string { + return `${(value / 1_048_576).toFixed(2)} MiB` +} + +function renderBenchmarkSummary({ evidence, path }: EvidenceFile): string { + const sourceName = basename(path) + const capturedDate = new Date(evidence.capturedAt) + .toISOString() + .replace("T", " ") + .replace(".000Z", " UTC") + const rows = evidence.representativeRows + .map( + row => + `| ${row.runtime} | ${row.fixture} | \`${row.policy}\` | ${formatMilliseconds(row.roundtripMedianMs)} | ${formatMilliseconds(row.iterateMedianMs)} | **${row.speedup.toFixed(2)}x** | ${formatMebibytes(row.avoidedSerializedBytes)} |` + ) + .join("\n") + + return ` + +# Latest benchmark + +This summary is generated from the newest checked-in [machine-readable benchmark evidence](./${sourceName}). Results are local measurements, not universal performance guarantees. + +## Environment + +| Property | Value | +| --- | --- | +| Captured | ${capturedDate} | +| Host | ${evidence.host.chip} (${evidence.host.architecture}) | +| Operating system | ${evidence.host.operatingSystem} | +| Runtimes | ${evidence.configuration.runtimes.join(", ")} | +| Payload | ${evidence.configuration.payloadSizeMiB} MiB | +| Input chunk | ${formatMebibytes(evidence.configuration.chunkSizeBytes)} | +| Warmups / samples | ${evidence.configuration.warmups} / ${evidence.configuration.repeats} | +| Fixtures | ${evidence.configuration.fixtures.join(", ")} | +| Policies | ${evidence.configuration.policies.map(policy => `\`${policy}\``).join(", ")} | + +## Representative results + +The baseline is ${evidence.method.baseline}. The candidate is ${evidence.method.candidate}. Speedup is calculated as ${evidence.method.speedup}. This is not a claim that SchemaStream is faster than standalone \`JSON.parse\` or \`JSON.stringify\`; those isolated operations do different work. + +| Runtime | Fixture | Policy | Serialized round-trip median | Direct object median | Speedup | Serialized bytes avoided | +| --- | --- | --- | ---: | ---: | ---: | ---: | +${rows} + +Each result is validated with ${evidence.method.resultValidation}. Samples use this ordering: ${evidence.method.sampleOrdering}. + +## Reproduce + +Run the checked-in benchmark harness from the repository root: + +\`\`\`sh +bun run benchmark +\`\`\` + +See [\`tests/snapshot-policy.benchmark.mts\`](../../tests/snapshot-policy.benchmark.mts) for the harness and [snapshot policies](../snapshot-policies.md#benchmark) for the methodology. +` +} + +/** + * Generates a stable Markdown summary from the evidence with the newest capture timestamp. + * + * @returns Canonical output path and deterministic Markdown content. + */ +export async function generateBenchmarkDocument(): Promise { + const files = await readEvidenceFiles() + files.sort((left, right) => { + const timestampDifference = + Date.parse(right.evidence.capturedAt) - Date.parse(left.evidence.capturedAt) + return timestampDifference === 0 ? right.path.localeCompare(left.path) : timestampDifference + }) + const [latest] = files + if (!latest) { + throw new Error("No valid benchmark evidence was available") + } + + return { + content: renderBenchmarkSummary(latest), + path: benchmarkOutputPath + } +} diff --git a/scripts/docs/config.ts b/scripts/docs/config.ts new file mode 100644 index 0000000..3c6fb45 --- /dev/null +++ b/scripts/docs/config.ts @@ -0,0 +1,19 @@ +import { join, resolve } from "node:path" + +/** Absolute repository root derived from this script directory. */ +export const repositoryRoot = resolve(import.meta.dir, "../..") + +/** Public source entry point used to discover the package API. */ +export const publicEntryPath = join(repositoryRoot, "src/index.ts") + +/** Canonical generated public API reference. */ +export const publicApiOutputPath = join(repositoryRoot, "docs/reference/api.md") + +/** Canonical generated summary of the newest checked-in benchmark evidence. */ +export const benchmarkOutputPath = join(repositoryRoot, "docs/benchmarks/latest.md") + +/** A generated file and the deterministic content expected at its canonical path. */ +export type GeneratedDocument = { + content: string + path: string +} diff --git a/scripts/docs/generate.ts b/scripts/docs/generate.ts new file mode 100644 index 0000000..25b6f83 --- /dev/null +++ b/scripts/docs/generate.ts @@ -0,0 +1,67 @@ +import { mkdir } from "node:fs/promises" +import { dirname, relative } from "node:path" +import { generateBenchmarkDocument } from "./benchmark" +import { type GeneratedDocument, repositoryRoot } from "./config" +import { validateCanonicalMarkdown } from "./markdown" +import { generatePublicApiDocument } from "./public-api" + +function parseCheckMode(arguments_: string[]): boolean { + const unknownArguments = arguments_.filter(argument => argument !== "--check") + if (unknownArguments.length > 0) { + throw new Error(`Unknown documentation generator arguments: ${unknownArguments.join(", ")}`) + } + return arguments_.includes("--check") +} + +async function isCurrent(document: GeneratedDocument): Promise { + const file = Bun.file(document.path) + return (await file.exists()) && (await file.text()) === document.content +} + +async function writeDocument(document: GeneratedDocument): Promise { + if (await isCurrent(document)) { + return false + } + await mkdir(dirname(document.path), { recursive: true }) + await Bun.write(document.path, document.content) + return true +} + +/** + * Generates canonical documentation or verifies that checked-in generated files have no drift. + * Link validation always runs against the complete canonical Markdown set after generation checks. + */ +async function main(): Promise { + const check = parseCheckMode(Bun.argv.slice(2)) + const documents = [await generatePublicApiDocument(), await generateBenchmarkDocument()] + + if (check) { + const documentStates = await Promise.all( + documents.map(async document => ({ current: await isCurrent(document), document })) + ) + const stale = documentStates + .filter(state => !state.current) + .map(state => relative(repositoryRoot, state.document.path)) + if (stale.length > 0) { + throw new Error( + `Generated documentation is stale:\n${stale.map(path => `- ${path}`).join("\n")}\nRun bun scripts/docs/generate.ts.` + ) + } + } else { + const documentStates = await Promise.all( + documents.map(async document => ({ changed: await writeDocument(document), document })) + ) + const changed = documentStates + .filter(state => state.changed) + .map(state => relative(repositoryRoot, state.document.path)) + const status = changed.length > 0 ? `updated ${changed.join(", ")}` : "no generated changes" + console.info(`Documentation generation: ${status}`) + } + + const validation = await validateCanonicalMarkdown() + console.info( + `Documentation check: ${documents.length} generated files current; ${validation.links} links and ${validation.exampleReferences} example references valid across ${validation.files} Markdown files` + ) +} + +await main() diff --git a/scripts/docs/markdown.ts b/scripts/docs/markdown.ts new file mode 100644 index 0000000..e038f7e --- /dev/null +++ b/scripts/docs/markdown.ts @@ -0,0 +1,235 @@ +import { stat } from "node:fs/promises" +import { dirname, extname, relative, resolve } from "node:path" +import { repositoryRoot } from "./config" + +/** Result counts from validating canonical Markdown references. */ +export type MarkdownValidation = { + exampleReferences: number + files: number + links: number +} + +const inlineLinkPattern = /!?\[[^\]]*\]\(([^)\s]+)(?:\s+["'][^)]*["'])?\)/g +const referenceLinkPattern = /^\[[^\]]+\]:\s+(\S+)/gm +const exampleReferencePattern = /(?]+>/g +const headingLinkPattern = /!?\[([^\]]+)\]\([^)]+\)/g +const headingFormattingPattern = /[`*_~]/g +const headingPunctuationPattern = /[^\p{L}\p{N} _-]/gu +const whitespacePattern = /\s+/g +const angleBracketPattern = /^<|>$/g +const examplePrefixPattern = /^\.\// +const examplePunctuationPattern = /[.,;:]+$/ + +function isExternalTarget(target: string): boolean { + return externalTargetPattern.test(target) +} + +async function pathExists(path: string): Promise { + try { + await stat(path) + return true + } catch { + return false + } +} + +function getLineNumber(content: string, index: number): number { + return content.slice(0, index).split("\n").length +} + +/** + * Approximates GitHub's documented heading slugs, including duplicate suffixes, so checked anchor + * links fail when their canonical heading disappears. + */ +function getMarkdownAnchors(content: string): Set { + const anchors = new Set() + const occurrences = new Map() + let inFence = false + + for (const line of content.split("\n")) { + if (codeFencePattern.test(line)) { + inFence = !inFence + continue + } + if (inFence) { + continue + } + + const match = headingPattern.exec(line) + const heading = match?.[1] + if (!heading) { + continue + } + + const base = heading + .toLowerCase() + .replace(headingHtmlPattern, "") + .replace(headingLinkPattern, "$1") + .replace(headingFormattingPattern, "") + .replace(headingPunctuationPattern, "") + .trim() + .replace(whitespacePattern, "-") + const count = occurrences.get(base) ?? 0 + occurrences.set(base, count + 1) + anchors.add(count === 0 ? base : `${base}-${count}`) + } + + return anchors +} + +function collectCanonicalMarkdown(): string[] { + const paths = ["README.md", "CHANGELOG.md", "CONTRIBUTING.md", "MIGRATION.md"].map(path => + resolve(repositoryRoot, path) + ) + for (const pattern of ["docs/**/*.md", "examples/**/*.md"]) { + const glob = new Bun.Glob(pattern) + for (const path of glob.scanSync({ absolute: true, cwd: repositoryRoot, onlyFiles: true })) { + paths.push(path) + } + } + return [...new Set(paths)].sort((left, right) => left.localeCompare(right)) +} + +async function validateTarget({ + content, + errors, + file, + index, + rawTarget +}: { + content: string + errors: string[] + file: string + index: number + rawTarget: string +}): Promise { + const target = rawTarget.replace(angleBracketPattern, "") + if (isExternalTarget(target)) { + return + } + + const hashIndex = target.indexOf("#") + const pathPart = hashIndex === -1 ? target : target.slice(0, hashIndex) + const rawAnchor = hashIndex === -1 ? "" : target.slice(hashIndex + 1) + let anchor = "" + let decodedPath = pathPart + try { + anchor = decodeURIComponent(rawAnchor).toLowerCase() + decodedPath = decodeURIComponent(pathPart) + } catch { + errors.push( + `${relative(repositoryRoot, file)}:${getLineNumber(content, index)} invalid URL encoding in ${rawTarget}` + ) + return + } + + const resolvedPath = decodedPath ? resolve(dirname(file), decodedPath) : file + if (!(await pathExists(resolvedPath))) { + errors.push( + `${relative(repositoryRoot, file)}:${getLineNumber(content, index)} missing ${rawTarget}` + ) + return + } + + if (anchor && [".md", ".mdx"].includes(extname(resolvedPath).toLowerCase())) { + const targetContent = await Bun.file(resolvedPath).text() + if (!getMarkdownAnchors(targetContent).has(anchor)) { + errors.push( + `${relative(repositoryRoot, file)}:${getLineNumber(content, index)} missing anchor ${rawTarget}` + ) + } + } +} + +async function validateExampleReference({ + content, + errors, + file, + index, + reference +}: { + content: string + errors: string[] + file: string + index: number + reference: string +}): Promise { + if (!(await pathExists(resolve(repositoryRoot, reference)))) { + errors.push( + `${relative(repositoryRoot, file)}:${getLineNumber(content, index)} missing ${reference}` + ) + } +} + +/** + * Validates local Markdown links, linked anchors, and repository-root example path references across + * the canonical documentation set. + * + * @returns Counts suitable for a concise CI success message. + * @throws {Error} When a link, anchor, or referenced example path is missing. + */ +export async function validateCanonicalMarkdown(): Promise { + const files = collectCanonicalMarkdown() + const errors: string[] = [] + const validationTasks: Promise[] = [] + let links = 0 + let exampleReferences = 0 + const canonicalFiles = await Promise.all( + files.map(async file => ({ content: await Bun.file(file).text(), file })) + ) + + for (const { content, file } of canonicalFiles) { + for (const pattern of [inlineLinkPattern, referenceLinkPattern]) { + pattern.lastIndex = 0 + for (const match of content.matchAll(pattern)) { + const [, rawTarget] = match + if (!rawTarget) { + continue + } + links += 1 + validationTasks.push( + validateTarget({ content, errors, file, index: match.index, rawTarget }) + ) + } + } + + exampleReferencePattern.lastIndex = 0 + const checkedExamples = new Set() + for (const match of content.matchAll(exampleReferencePattern)) { + const reference = match[0] + .replace(examplePrefixPattern, "") + .replace(examplePunctuationPattern, "") + if (checkedExamples.has(reference)) { + continue + } + checkedExamples.add(reference) + exampleReferences += 1 + validationTasks.push( + validateExampleReference({ + content, + errors, + file, + index: match.index, + reference + }) + ) + } + } + + await Promise.all(validationTasks) + + if (errors.length > 0) { + throw new Error( + `Canonical Markdown validation failed:\n${errors + .sort((left, right) => left.localeCompare(right)) + .map(error => `- ${error}`) + .join("\n")}` + ) + } + + return { exampleReferences, files: files.length, links } +} diff --git a/scripts/docs/prepare.ts b/scripts/docs/prepare.ts new file mode 100644 index 0000000..23fa8b3 --- /dev/null +++ b/scripts/docs/prepare.ts @@ -0,0 +1,388 @@ +import { mkdir, rm, stat } from "node:fs/promises" +import { basename, dirname, extname, join, relative, resolve, sep } from "node:path" +import { repositoryRoot } from "./config" + +type StagedDocument = { + destination: string + destinationRelative: string + source: string +} + +const canonicalDocsRoot = join(repositoryRoot, "docs") +const stagedDocsRoot = join(repositoryRoot, "site/content/docs") +const generatedAssetsRoot = join(repositoryRoot, "site/public/generated") +const excludedCanonicalDocuments = new Set([join(canonicalDocsRoot, "island-ai-follow-up.md")]) +const githubRepositoryUrl = "https://github.com/hack-dance/schema-stream" +const headingPattern = /^#\s+(.+?)\s*#?\s*$/m +const titleFormattingPattern = /[`*_]/g +const markdownImagePattern = /!\[[^\]]*\]\([^)]+\)/g +const markdownLinkPattern = /\[([^\]]+)\]\([^)]+\)/g +const markdownFormattingPattern = /[`*_~]/g +const whitespacePattern = /\s+/g +const frontmatterPattern = /^---\r?\n[\s\S]*?\r?\n---\r?\n/ +const unixFrontmatterPattern = /^---\n[\s\S]*?\n---\n/ +const paragraphPattern = /\n\s*\n/ +const nonProsePattern = /^(?:#| + +# Public API reference + +This reference is generated with the installed TypeScript compiler API from every export reachable through [\`src/index.ts\`](../../src/index.ts). It documents the package entry point rather than implementation-only exports. + +For complete usage, see the [progressive JSON example](../../examples/progressive-json.ts), [SDK examples](../../examples/sdk-mocks.ts), [Mastra example](../../examples/mastra.ts), and [Bun WebSocket UI](../../examples/websocket-ui/). + +## Exports + +| Name | Kind | Description | +| --- | --- | --- | +${exportTable} + +${detailSections} +` +} + +/** + * Generates the public API reference from TypeScript's resolved entry-point export graph. + * + * @returns Canonical output path and deterministic Markdown content. + */ +export async function generatePublicApiDocument(): Promise { + const exports = await getApiExports() + if (exports.length === 0) { + throw new Error("src/index.ts does not expose any public symbols") + } + + return { + content: renderPublicApi(exports), + path: publicApiOutputPath + } +} diff --git a/scripts/docs/tsconfig.json b/scripts/docs/tsconfig.json new file mode 100644 index 0000000..32f73fb --- /dev/null +++ b/scripts/docs/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "noEmit": true, + "rootDir": "../.." + }, + "include": ["./**/*.ts"] +} diff --git a/site/app/(home)/page.tsx b/site/app/(home)/page.tsx new file mode 100644 index 0000000..cd6bcca --- /dev/null +++ b/site/app/(home)/page.tsx @@ -0,0 +1,190 @@ +import { ArrowRightIcon, GitForkIcon, PackageIcon, PlayIcon } from "lucide-react" +import Image from "next/image" +import Link from "next/link" +import type { CSSProperties } from "react" +import { CopyCommand } from "@/components/copy-command" +import { ProgressiveExample } from "@/components/progressive-example" +import { SiteHeader } from "@/components/site-header" +import { loadLatestBenchmark } from "@/lib/benchmark-data" +import { DESCRIPTION, GITHUB_URL, NPM_URL, SITE_URL } from "@/lib/site" + +const integrations = [ + { href: "/docs/integrations/openai-agents", label: "OpenAI Agents SDK" }, + { href: "/docs/integrations/vercel-ai-sdk", label: "Vercel AI SDK" }, + { href: "/docs/integrations/mastra", label: "Mastra" }, + { href: "/docs/integrations/bun-websocket", label: "Bun WebSocket" } +] as const + +export default async function HomePage() { + const benchmark = await loadLatestBenchmark() + const longStringChunkRows = benchmark.representativeRows.filter( + row => row.fixture === "long-string" && row.policy === "chunk" + ) + if (longStringChunkRows.length === 0) { + throw new Error("Benchmark evidence needs a long-string chunk-policy result") + } + const directProfiles = longStringChunkRows.map(row => ({ + ...row, + throughputMiBPerSecond: benchmark.configuration.payloadSizeMiB / (row.iterateMedianMs / 1000) + })) + const maximumThroughput = Math.max(...directProfiles.map(row => row.throughputMiBPerSecond)) + const softwareJsonLd = { + "@context": "https://schema.org", + "@type": "SoftwareSourceCode", + codeRepository: GITHUB_URL, + description: DESCRIPTION, + license: "https://opensource.org/license/mit", + name: "schema-stream", + programmingLanguage: "TypeScript", + runtimePlatform: ["Bun", "Node.js"], + url: SITE_URL + } + /** Prevent a future `<` in metadata from terminating the structured-data script element. */ + const softwareJsonLdText = JSON.stringify(softwareJsonLd).replaceAll("<", "\\u003c") + + return ( + <> + +
+
+
+
Streaming structured output for TypeScript
+

schema-stream

+

{DESCRIPTION}

+
+ + Read the docs
+ + +
+
+ +
+
+
+

Why it exists

+

Use the fields that are ready. Keep streaming the rest.

+
+
+
+ 01 +

Accept arbitrary text and UTF-8 chunk boundaries from provider streams.

+
+
+ 02 +

Materialize typed snapshots according to an explicit emission policy.

+
+
+ 03 +

React once when nested keys or values complete, without rescanning the tree.

+
+
+
+
+ +
+
+
+

Measured hot path

+

Parse once. Hand application code an object.

+

+ iterate() accepts streaming text or bytes and yields independent, + schema-shaped object snapshots. Application code can use each update immediately, + without decoding and parsing its own snapshot first. +

+
+ provider chunk → SchemaStream.iterate() → typed object snapshot + onValueComplete → conditional action while the root keeps streaming +
+

+ Committed Apple M5 Max evidence uses a 2 MiB long-string fixture, 64 KiB source + chunks, and five measured samples. It is a parser-path profile, not model or network + latency and not a standalone JSON operation claim. +

+ + Inspect all fixtures and methodology
+
+ {directProfiles.map(row => ( +
+ + {row.runtime} · {row.iterateMedianMs.toFixed(2)} ms median · long string / chunk + +
+ {Math.round(row.throughputMiBPerSecond).toLocaleString("en-US")} MiB/s +
+
+ ))} +
+
+
+ +
+
+
+

Integrations

+

One parser boundary. The SDK stays your choice.

+
+
+ {integrations.map(integration => ( + + {integration.label} +
+
+
+ +
+
+
+

Progressive dashboard

+

See every policy shape the same response.

+
+ +
+ SchemaStream progressively materializing a dashboard from JSON snapshots +
+
+ + + + ) +} diff --git a/site/app/api/search/route.ts b/site/app/api/search/route.ts new file mode 100644 index 0000000..e3a708d --- /dev/null +++ b/site/app/api/search/route.ts @@ -0,0 +1,4 @@ +import { createFromSource } from "fumadocs-core/search/server" +import { source } from "@/lib/source" + +export const { GET } = createFromSource(source) diff --git a/site/app/benchmarks/page.tsx b/site/app/benchmarks/page.tsx new file mode 100644 index 0000000..a5b9a91 --- /dev/null +++ b/site/app/benchmarks/page.tsx @@ -0,0 +1,179 @@ +import { ArrowUpRightIcon, TerminalIcon } from "lucide-react" +import type { Metadata } from "next" +import { SiteHeader } from "@/components/site-header" +import { loadLatestBenchmark } from "@/lib/benchmark-data" + +export const metadata: Metadata = { + description: + "Reproducible Bun and Node.js evidence comparing serialized snapshot round trips with direct object snapshots from the same SchemaStream parser.", + title: "Benchmarks" +} + +function formatMilliseconds(value: number): string { + return value < 10 ? value.toFixed(2) : value.toFixed(1) +} + +function formatMebibytes(value: number): string { + return `${(value / 1024 / 1024).toFixed(1)} MiB` +} + +export default async function BenchmarksPage() { + const benchmark = await loadLatestBenchmark() + const maximumSpeedup = Math.max(...benchmark.representativeRows.map(row => row.speedup)) + const minimumSpeedup = Math.min(...benchmark.representativeRows.map(row => row.speedup)) + + return ( + <> + +
+
+

Committed evidence

+

Benchmarks

+

+ This measures snapshot materialization inside the same SchemaStream parser workload. It + is not a claim that SchemaStream is faster than standalone JSON.parse or + JSON.stringify. +

+
+
+
+ +
+
+

What is measured

+

The same parser. One less JSON round trip.

+

+ Both paths parse the same input with the same snapshot policy. The benchmark changes + only how each emitted snapshot becomes the object consumed by application code. +

+
+
+
+ Serialized baseline + + parser snapshot → JSON.stringify → UTF-8 encode → decode → JSON.parse → object + +
+
+ Direct candidate + parser snapshot → direct object snapshot +
+

+ Why it matters: frequent snapshots of a growing value repeatedly serialize, copy, and + parse more bytes. Returning the independent object directly removes that CPU and + allocation work. Provider latency, network transport, and standalone JSON operation + speed are not measured here. +

+
+
+ +
+
+ Largest measured round-trip removal + {maximumSpeedup.toFixed(2)}x +
+
+ Fixture size + {benchmark.configuration.payloadSizeMiB} MiB +
+
+ Recorded samples + {benchmark.configuration.repeats} +
+
+ Host + {benchmark.host.chip} +
+
+ +
+ {benchmark.representativeRows.map(row => ( +
+
+ {row.runtime.replace(" v", " ")} + + {row.fixture} / {row.policy} + +
+
+ +
+ {row.speedup.toFixed(2)}x +
+ ))} +
+ +
+ + + + + + + + + + + + + + {benchmark.representativeRows.map(row => ( + + + + + + + + + + ))} + +
RuntimeFixturePolicySerialized round tripDirect object snapshotSpeedupAvoided bytes
{row.runtime}{row.fixture}{row.policy}{formatMilliseconds(row.roundtripMedianMs)} ms{formatMilliseconds(row.iterateMedianMs)} ms + {row.speedup.toFixed(2)}x + {formatMebibytes(row.avoidedSerializedBytes)}
+
+ +

+ Every representative result stays visible, including near-parity cases as low as{" "} + {minimumSpeedup.toFixed(2)}x. When parsing and schema materialization + dominate a workload, removing the serialization round trip has a smaller effect. +

+ +
+
+

Full method

+

Same inputs and policies. Only snapshot delivery changes.

+
+
+
+
Baseline
+
{benchmark.method.baseline}
+
+
+
Candidate
+
{benchmark.method.candidate}
+
+
+
Validation
+
{benchmark.method.resultValidation}
+
+
+
Ordering
+
{benchmark.method.sampleOrdering}
+
+
+
+ + + Benchmark methodology and CLI options +
+ + ) +} diff --git a/site/app/docs/[[...slug]]/page.tsx b/site/app/docs/[[...slug]]/page.tsx new file mode 100644 index 0000000..93ab840 --- /dev/null +++ b/site/app/docs/[[...slug]]/page.tsx @@ -0,0 +1,54 @@ +import { DocsBody, DocsDescription, DocsPage, DocsTitle } from "fumadocs-ui/layouts/docs/page" +import type { Metadata } from "next" +import { notFound } from "next/navigation" +import { getMDXComponents } from "@/components/mdx" +import { source } from "@/lib/source" + +interface DocsRouteProps { + params: Promise<{ slug?: string[] }> +} + +export default async function Page({ params }: DocsRouteProps) { + const { slug } = await params + const page = source.getPage(slug) + + if (!page) { + notFound() + } + + const MDX = page.data.body + + return ( + + {page.data.title} + {page.data.description ? {page.data.description} : null} + + + + + ) +} + +export async function generateMetadata({ params }: DocsRouteProps): Promise { + const { slug } = await params + const page = source.getPage(slug) + + if (!page) { + notFound() + } + + return { + alternates: { canonical: page.url }, + description: page.data.description, + openGraph: { + description: page.data.description, + title: page.data.title, + url: page.url + }, + title: page.data.title + } +} + +export function generateStaticParams(): Array<{ slug?: string[] }> { + return source.generateParams() +} diff --git a/site/app/docs/layout.tsx b/site/app/docs/layout.tsx new file mode 100644 index 0000000..de8a0b3 --- /dev/null +++ b/site/app/docs/layout.tsx @@ -0,0 +1,12 @@ +import { DocsLayout } from "fumadocs-ui/layouts/docs" +import type { ReactNode } from "react" +import { baseOptions } from "@/lib/layout.shared" +import { source } from "@/lib/source" + +export default function Layout({ children }: { children: ReactNode }) { + return ( + + {children} + + ) +} diff --git a/site/app/examples/page.tsx b/site/app/examples/page.tsx new file mode 100644 index 0000000..8f96a95 --- /dev/null +++ b/site/app/examples/page.tsx @@ -0,0 +1,79 @@ +import { readFile } from "node:fs/promises" +import { join } from "node:path" +import { ArrowRightIcon, ExternalLinkIcon, TerminalSquareIcon } from "lucide-react" +import type { Metadata } from "next" +import Link from "next/link" +import { SiteHeader } from "@/components/site-header" +import { CODESPACES_URL, examples } from "@/lib/examples" +import { REPOSITORY_ROOT } from "@/lib/repository" + +export const metadata: Metadata = { + description: "Runnable SchemaStream examples for Bun, OpenAI Agents, Vercel AI SDK, and Mastra.", + title: "Examples" +} + +function excerpt(source: string): string { + const lines = source.split("\n") + return lines.slice(0, 30).join("\n") +} + +export default async function ExamplesPage() { + const definitions = await Promise.all( + examples.map(async example => ({ + ...example, + source: excerpt(await readFile(join(REPOSITORY_ROOT, example.file), "utf8")) + })) + ) + + return ( + <> + +
+
+
+

Executable source

+

Examples

+

+ The code shown here is read from the repository at build time. Fixture runs need no + credentials; live provider runs keep keys inside your own development environment. +

+
+ + +
+ +
+ {definitions.map((example, index) => ( +
+
+ {String(index + 1).padStart(2, "0")} +

{example.title}

+

{example.description}

+
+
+
+ + Read guide
+
+
+                {example.source}
+              
+
+ ))} +
+
+ + ) +} diff --git a/site/app/global.css b/site/app/global.css new file mode 100644 index 0000000..dcaae17 --- /dev/null +++ b/site/app/global.css @@ -0,0 +1,1822 @@ +@import "tailwindcss"; +@import "fumadocs-ui/css/neutral.css"; +@import "fumadocs-ui/css/preset.css"; + +:root { + --ink: #111111; + --secondary: #3d3d3d; + --muted: #646464; + --rule: #dddddd; + --rule-soft: #ececea; + --soft: #f7f7f5; + --soft-strong: #e9e9e6; + --page: #ffffff; + --panel: #ffffff; + --canvas: #f3f3f1; + --header: rgb(255 255 255 / 94%); + --inverse-surface: #111111; + --inverse-hover: #2e2e2e; + --inverse-text: #ffffff; + --blue: #0057d9; + --green: #08783e; + --amber: #9a5b00; + --success-surface: #eef9f2; + --success-border: #b8e1c7; + --shadow: rgb(0 0 0 / 10%); + --code-surface: #101010; + --code-border: #2d2d2d; + --code-rule: #303030; + --code-text: #f4f4f4; + --code-muted: #a8a8a8; + --code-key: #9fc1ff; + --code-string: #b7e7be; + --code-json: #d9e6ff; + --selection: #d9e8ff; + --selection-text: #111111; + --status-running: #e3a008; + --status-complete: #1eae63; + --status-pending: #f5c04c; + --status-pending-border: #c98c08; + --status-idle-border: #a7a7a7; + --font-body: var(--font-geist-sans), sans-serif; + --font-code: var(--font-geist-mono), monospace; + --color-fd-background: var(--page); + --color-fd-foreground: var(--ink); + --color-fd-muted: var(--soft); + --color-fd-muted-foreground: var(--muted); + --color-fd-popover: var(--panel); + --color-fd-popover-foreground: var(--ink); + --color-fd-card: var(--panel); + --color-fd-card-foreground: var(--ink); + --color-fd-border: var(--rule); + --color-fd-primary: var(--ink); + --color-fd-primary-foreground: var(--inverse-text); + --color-fd-secondary: var(--soft); + --color-fd-secondary-foreground: var(--ink); + --color-fd-accent: var(--soft-strong); + --color-fd-accent-foreground: var(--ink); + --color-fd-ring: var(--blue); + --color-fd-overlay: var(--shadow); + color-scheme: light; +} + +.dark { + --ink: #f4f4f2; + --secondary: #c8c8c5; + --muted: #a0a09c; + --rule: #353535; + --rule-soft: #272727; + --soft: #181818; + --soft-strong: #242424; + --page: #0d0d0d; + --panel: #121212; + --canvas: #080808; + --header: rgb(13 13 13 / 94%); + --inverse-surface: #f4f4f2; + --inverse-hover: #ffffff; + --inverse-text: #111111; + --blue: #78aaff; + --green: #65d695; + --amber: #f4bd55; + --success-surface: #10291b; + --success-border: #285e3c; + --shadow: rgb(0 0 0 / 38%); + --code-surface: #080808; + --code-border: #303030; + --code-rule: #282828; + --code-text: #f4f4f4; + --code-muted: #a8a8a8; + --selection: #17365f; + --selection-text: #ffffff; + color-scheme: dark; +} + +.dark #nd-sidebar { + --color-fd-muted: var(--soft); + --color-fd-muted-foreground: var(--muted); + --color-fd-secondary: var(--soft); +} + +* { + box-sizing: border-box; + letter-spacing: 0; +} + +html { + background: var(--page); + color: var(--ink); + scroll-behavior: smooth; +} + +body { + background: var(--page); + color: var(--ink); + font-family: var(--font-body); + margin: 0; + min-height: 100vh; +} + +a { + color: inherit; + text-decoration: none; +} + +button, +input, +select, +textarea { + font: inherit; +} + +button, +summary, +a { + -webkit-tap-highlight-color: transparent; +} + +:focus-visible { + outline: 2px solid var(--blue); + outline-offset: 3px; +} + +::selection { + background: var(--selection); + color: var(--selection-text); +} + +.site-header { + background: var(--header); + border-bottom: 1px solid var(--rule); + position: sticky; + top: 0; + z-index: 40; +} + +.site-header-inner { + align-items: center; + display: grid; + grid-template-columns: minmax(180px, 1fr) auto minmax(180px, 1fr); + height: 62px; + margin: 0 auto; + max-width: 1240px; + padding: 0 24px; +} + +.site-brand, +.brand-lockup { + align-items: center; + display: inline-flex; + font-family: var(--font-code); + font-size: 14px; + font-weight: 620; + gap: 9px; + white-space: nowrap; +} + +.brand-mark { + align-items: center; + background: var(--inverse-surface); + border-radius: 4px; + color: var(--inverse-text); + display: inline-flex; + font-family: var(--font-code); + font-size: 11px; + height: 25px; + justify-content: center; + width: 25px; +} + +.desktop-nav { + align-items: center; + display: flex; + gap: 28px; +} + +.desktop-nav a { + color: var(--secondary); + font-size: 13px; + position: relative; +} + +.desktop-nav a::after { + background: var(--ink); + bottom: -8px; + content: ""; + height: 1px; + left: 0; + position: absolute; + transform: scaleX(0); + transform-origin: right; + transition: transform 160ms ease; + width: 100%; +} + +.desktop-nav a:hover::after { + transform: scaleX(1); + transform-origin: left; +} + +.site-actions { + align-items: center; + display: flex; + gap: 5px; + justify-content: flex-end; +} + +.site-actions a, +.mobile-nav summary { + align-items: center; + border-radius: 4px; + color: var(--muted); + display: inline-flex; + height: 34px; + justify-content: center; + transition: + background 140ms ease, + color 140ms ease; + width: 34px; +} + +.site-actions a:hover, +.mobile-nav summary:hover { + background: var(--soft); + color: var(--ink); +} + +.site-actions svg, +.mobile-nav svg { + height: 17px; + width: 17px; +} + +.mobile-nav { + display: none; + justify-self: end; + position: relative; +} + +.mobile-nav summary { + cursor: pointer; + list-style: none; +} + +.mobile-nav summary::-webkit-details-marker { + display: none; +} + +.mobile-nav nav { + background: var(--panel); + border: 1px solid var(--rule); + border-radius: 6px; + box-shadow: 0 12px 40px var(--shadow); + display: grid; + min-width: 210px; + padding: 8px; + position: absolute; + right: 0; + top: 42px; +} + +.mobile-nav nav a { + border-radius: 4px; + font-size: 14px; + padding: 10px 12px; +} + +.mobile-nav nav a:hover { + background: var(--soft); +} + +.home-hero { + border-bottom: 1px solid var(--rule); + min-height: min(720px, calc(100svh - 86px)); + padding: 40px 24px 18px; +} + +.home-hero-inner { + margin: 0 auto; + max-width: 1040px; +} + +.home-kicker, +.section-label { + color: var(--muted); + font-family: var(--font-code); + font-size: 11px; + font-weight: 600; + margin: 0 0 18px; + text-transform: uppercase; +} + +.home-kicker { + margin-bottom: 12px; +} + +.home-hero h1 { + font-family: var(--font-code); + font-size: 72px; + font-weight: 520; + line-height: 0.96; + margin: 0; + max-width: 100%; + overflow-wrap: anywhere; +} + +.home-hero-inner > :where(p) { + color: var(--secondary); + font-size: 20px; + line-height: 1.5; + margin: 18px 0 0; + max-width: 620px; +} + +.hero-actions { + align-items: center; + display: flex; + flex-wrap: wrap; + gap: 10px 20px; + margin-top: 20px; +} + +.primary-link { + align-items: center; + background: var(--inverse-surface); + border: 1px solid var(--inverse-surface); + border-radius: 5px; + color: var(--inverse-text); + display: inline-flex; + font-size: 13px; + font-weight: 600; + gap: 9px; + height: 40px; + padding: 0 15px; + transition: + background 140ms ease, + transform 140ms ease; +} + +.primary-link:hover { + background: var(--inverse-hover); + transform: translateY(-1px); +} + +.primary-link svg, +.text-link svg, +.inline-arrow svg, +.integration-links svg { + height: 15px; + width: 15px; +} + +.text-link { + align-items: center; + color: var(--secondary); + display: inline-flex; + font-size: 13px; + gap: 7px; +} + +.text-link:hover, +.inline-arrow:hover { + color: var(--blue); +} + +.copy-command { + align-items: center; + background: var(--soft); + border: 1px solid var(--rule); + border-radius: 5px; + display: flex; + height: 43px; + justify-content: space-between; + margin-top: 18px; + max-width: 410px; + padding: 0 6px 0 14px; +} + +.copy-command code { + color: var(--secondary); + font-family: var(--font-code); + font-size: 13px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.copy-command button { + align-items: center; + background: transparent; + border: 0; + border-radius: 4px; + color: var(--muted); + cursor: pointer; + display: inline-flex; + flex: 0 0 32px; + height: 32px; + justify-content: center; + padding: 0; + width: 32px; +} + +.copy-command button:hover { + background: var(--soft-strong); + color: var(--ink); +} + +.copy-command svg { + height: 15px; + width: 15px; +} + +.progressive-example { + background: var(--code-surface); + border: 1px solid var(--code-border); + border-radius: 6px; + color: var(--code-text); + margin-top: 24px; + height: 250px; + overflow: hidden; +} + +.progressive-example-bar { + align-items: center; + border-bottom: 1px solid var(--code-rule); + color: var(--code-muted); + display: flex; + font-family: var(--font-code); + font-size: 11px; + height: 40px; + justify-content: space-between; + padding: 0 15px; + text-transform: uppercase; +} + +.status-dot { + background: var(--status-complete); + border-radius: 50%; + display: inline-block; + height: 7px; + margin-right: 7px; + width: 7px; +} + +.progressive-example pre { + font-family: var(--font-code); + font-size: 10px; + height: 209px; + line-height: 1.45; + margin: 0; + overflow: auto; + padding: 10px 22px; +} + +.progressive-example code, +.json-line { + display: block; +} + +.json-line { + padding-left: 24px; +} + +.json-key { + color: var(--code-key); +} + +.json-value { + color: var(--code-string); +} + +.home-band, +.demo-band { + border-bottom: 1px solid var(--rule); + padding: 88px 24px; +} + +.band-grid, +.demo-heading { + display: grid; + gap: 80px; + grid-template-columns: minmax(260px, 0.85fr) minmax(360px, 1.15fr); + margin: 0 auto; + max-width: 1120px; +} + +.home-band h2, +.demo-band h2 { + font-size: 30px; + font-weight: 560; + line-height: 1.2; + margin: 0; + max-width: 560px; +} + +.body-copy { + color: var(--muted); + font-size: 15px; + line-height: 1.65; + margin: 20px 0; + max-width: 540px; +} + +.body-copy code, +.benchmark-caveat code { + font-family: var(--font-code); + font-size: 0.9em; +} + +.benchmark-paths { + border-bottom: 1px solid var(--rule); + border-top: 1px solid var(--rule); + display: grid; + margin: 24px 0 18px; +} + +.benchmark-paths code { + color: var(--secondary); + font-family: var(--font-code); + font-size: 10px; + line-height: 1.5; + overflow-wrap: anywhere; + padding: 11px 0; +} + +.benchmark-paths code + code { + border-top: 1px solid var(--rule); + color: var(--green); +} + +.benchmark-caveat { + color: var(--muted); + font-size: 12px; + line-height: 1.55; + margin: 0 0 20px; + max-width: 540px; +} + +.ruled-list { + border-top: 1px solid var(--rule); +} + +.ruled-list > div { + align-items: start; + border-bottom: 1px solid var(--rule); + display: grid; + gap: 24px; + grid-template-columns: 34px 1fr; + padding: 20px 0; +} + +.ruled-list span { + color: var(--muted); + font-family: var(--font-code); + font-size: 11px; + padding-top: 3px; +} + +.ruled-list :where(p) { + font-size: 15px; + line-height: 1.55; + margin: 0; +} + +.benchmark-teaser { + background: var(--soft); +} + +.inline-arrow { + align-items: center; + color: var(--blue); + display: inline-flex; + font-size: 13px; + font-weight: 600; + gap: 8px; +} + +.benchmark-bars { + align-self: center; + display: grid; + gap: 24px; +} + +.benchmark-bars > div { + display: grid; + gap: 8px; +} + +.benchmark-bars span { + color: var(--muted); + font-family: var(--font-code); + font-size: 11px; +} + +.benchmark-bars div div { + align-items: center; + animation: bar-enter 700ms cubic-bezier(0.2, 0.8, 0.2, 1) both; + background: var(--inverse-surface); + color: var(--inverse-text); + display: flex; + font-family: var(--font-code); + font-size: 12px; + height: 34px; + justify-content: flex-end; + min-width: 76px; + padding-right: 10px; + transform-origin: left; + width: var(--bar-size); +} + +.integration-links { + border-top: 1px solid var(--rule); +} + +.integration-links a { + align-items: center; + border-bottom: 1px solid var(--rule); + display: flex; + font-size: 15px; + justify-content: space-between; + padding: 18px 4px; + transition: + color 140ms ease, + padding 140ms ease; +} + +.integration-links a:hover { + color: var(--blue); + padding-left: 10px; +} + +.demo-heading { + align-items: end; + margin-bottom: 34px; +} + +.demo-heading .primary-link { + justify-self: end; +} + +.demo-image { + border: 1px solid var(--rule); + border-radius: 6px; + display: block; + height: auto; + margin: 0 auto; + max-width: 1240px; + object-fit: contain; + width: 100%; +} + +.site-footer { + color: var(--muted); + display: flex; + font-family: var(--font-code); + font-size: 11px; + gap: 24px; + justify-content: center; + padding: 28px 24px; +} + +.site-footer a:hover { + color: var(--blue); +} + +.not-found { + margin: 0 auto; + max-width: 760px; + min-height: calc(100vh - 62px); + padding: 120px 24px; +} + +.not-found h1 { + font-family: var(--font-code); + font-size: 42px; + font-weight: 520; + margin: 0 0 32px; +} + +.playground-page { + background: var(--canvas); + height: calc(100svh - 62px); + min-height: 680px; + overflow: hidden; + overflow-anchor: none; + padding: 14px; +} + +.playground-shell { + background: var(--panel); + border: 1px solid var(--rule); + border-radius: 6px; + display: grid; + grid-template-rows: 54px minmax(0, 1fr); + height: 100%; + margin: 0 auto; + max-width: 1540px; + overflow: hidden; + overflow-anchor: none; +} + +.playground-toolbar { + align-items: center; + border-bottom: 1px solid var(--rule); + display: flex; + gap: 16px; + justify-content: space-between; + min-width: 0; + padding: 0 10px 0 14px; +} + +.policy-control { + border: 1px solid var(--rule); + border-radius: 5px; + display: flex; + height: 34px; + min-width: 0; + overflow: hidden; +} + +.policy-control button { + background: var(--panel); + border: 0; + border-right: 1px solid var(--rule); + color: var(--muted); + cursor: pointer; + font-size: 11px; + height: 32px; + padding: 0 12px; + white-space: nowrap; +} + +.policy-control button:last-child { + border-right: 0; +} + +.policy-control button[aria-pressed="true"] { + background: var(--inverse-surface); + color: var(--inverse-text); +} + +.run-status { + align-items: center; + color: var(--muted); + display: flex; + flex: 0 0 auto; + font-family: var(--font-code); + font-size: 10px; + gap: 14px; + text-transform: uppercase; +} + +.run-status > span:first-child { + align-items: center; + display: inline-flex; + gap: 6px; +} + +.run-status > span:first-child::before { + border-radius: 50%; + content: ""; + height: 7px; + width: 7px; +} + +.run-status .is-running::before { + animation: status-pulse 900ms ease-in-out infinite alternate; + background: var(--status-running); +} + +.run-status .is-complete::before { + background: var(--status-complete); +} + +.run-status button { + align-items: center; + background: transparent; + border: 1px solid var(--rule); + border-radius: 4px; + color: var(--secondary); + cursor: pointer; + display: inline-flex; + height: 32px; + justify-content: center; + padding: 0; + width: 32px; +} + +.run-status button:hover { + background: var(--soft); +} + +.run-status svg { + height: 14px; + width: 14px; +} + +.playground-grid { + display: grid; + grid-template-columns: minmax(0, 1.7fr) minmax(340px, 0.8fr); + min-height: 0; +} + +.materialized-dashboard { + overflow: auto; + padding: 34px 36px 50px; +} + +.dashboard-heading { + align-items: start; + display: flex; + gap: 24px; + justify-content: space-between; +} + +.dashboard-heading h1 { + font-size: 28px; + font-weight: 580; + line-height: 1.2; + margin: 0; +} + +.dashboard-heading .section-label { + margin-bottom: 10px; +} + +.decision-signal { + align-items: center; + background: var(--success-surface); + border: 1px solid var(--success-border); + border-radius: 5px; + color: var(--green); + display: inline-flex; + flex: 0 0 auto; + font-size: 11px; + font-weight: 600; + gap: 7px; + min-height: 34px; + padding: 7px 10px; +} + +.decision-signal svg { + height: 15px; + width: 15px; +} + +.dashboard-summary { + color: var(--muted); + font-size: 14px; + line-height: 1.6; + margin: 14px 0 28px; + max-width: 740px; + min-height: 44px; +} + +.playground-metrics { + border-bottom: 1px solid var(--rule); + border-top: 1px solid var(--rule); + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.playground-metric { + border-right: 1px solid var(--rule); + min-height: 100px; + padding: 18px; +} + +.playground-metric:last-child { + border-right: 0; +} + +.playground-metric span { + color: var(--muted); + display: block; + font-family: var(--font-code); + font-size: 10px; + text-transform: uppercase; +} + +.playground-metric strong { + display: block; + font-family: var(--font-code); + font-size: 26px; + font-weight: 500; + margin-top: 15px; + min-height: 32px; + text-transform: capitalize; +} + +.dashboard-section { + margin-top: 32px; +} + +.dashboard-section-heading { + align-items: center; + border-bottom: 1px solid var(--rule); + display: flex; + height: 38px; + justify-content: space-between; +} + +.dashboard-section-heading h2 { + font-size: 13px; + font-weight: 650; + margin: 0; +} + +.dashboard-section-heading span { + color: var(--muted); + font-family: var(--font-code); + font-size: 9px; + text-transform: uppercase; +} + +.milestone-list { + min-height: 136px; +} + +.milestone-list > div { + align-items: center; + border-bottom: 1px solid var(--rule); + display: grid; + gap: 12px; + grid-template-columns: 10px 1fr auto; + min-height: 45px; +} + +.milestone-list > div > span:first-child { + border: 1px solid var(--status-idle-border); + border-radius: 50%; + height: 8px; + width: 8px; +} + +.milestone-list > div > span.complete { + background: var(--green); + border-color: var(--green); +} + +.milestone-list > div > span.pending { + background: var(--status-pending); + border-color: var(--status-pending-border); +} + +.milestone-list strong { + font-size: 12px; + font-weight: 600; +} + +.milestone-list > div > span:last-child { + color: var(--muted); + font-family: var(--font-code); + font-size: 10px; +} + +.owner-grid { + display: grid; + gap: 10px; + grid-template-columns: repeat(3, minmax(0, 1fr)); + min-height: 112px; + padding-top: 12px; +} + +.owner-grid > div { + background: var(--soft); + border: 1px solid var(--rule); + border-radius: 5px; + display: flex; + flex-direction: column; + min-height: 98px; + padding: 13px; +} + +.owner-grid span, +.owner-grid small { + color: var(--muted); + font-family: var(--font-code); + font-size: 9px; + text-transform: uppercase; +} + +.owner-grid strong { + font-size: 12px; + font-weight: 600; + line-height: 1.4; + margin: 9px 0 auto; +} + +.recommendation { + border-left: 3px solid var(--green); + margin-top: 28px; + padding: 12px 16px; +} + +.recommendation span { + color: var(--green); + font-family: var(--font-code); + font-size: 10px; + font-weight: 700; + text-transform: uppercase; +} + +.recommendation :where(p) { + font-size: 13px; + line-height: 1.5; + margin: 5px 0 0; +} + +.inspector-panels { + border-left: 1px solid var(--rule); + display: grid; + grid-template-rows: minmax(0, 1fr) minmax(0, 1fr); + min-height: 0; +} + +.inspector-panels.collapsed-events { + grid-template-rows: 39px minmax(0, 1fr); +} + +.inspector-panels.collapsed-json { + grid-template-rows: minmax(0, 1fr) 39px; +} + +.inspector-panel { + display: grid; + grid-template-rows: 39px minmax(0, 1fr); + min-height: 0; + overflow: hidden; +} + +.inspector-panel:first-child { + border-bottom: 1px solid var(--rule); +} + +.inspector-heading { + align-items: center; + background: var(--panel); + border: 0; + border-bottom: 1px solid var(--rule); + color: var(--secondary); + cursor: pointer; + display: flex; + font-family: var(--font-code); + font-size: 10px; + font-weight: 600; + justify-content: space-between; + padding: 0 13px; + text-align: left; + text-transform: uppercase; +} + +.inspector-heading:hover { + background: var(--soft); +} + +.inspector-heading svg { + color: var(--muted); + height: 14px; + width: 14px; +} + +.event-log, +.json-panel pre { + margin: 0; + min-height: 0; + overflow: auto; +} + +.event-log > div { + border-bottom: 1px solid var(--rule-soft); + display: grid; + gap: 4px 9px; + grid-template-columns: 24px 1fr; + padding: 9px 12px; +} + +.event-log span { + color: var(--code-muted); + font-family: var(--font-code); + font-size: 9px; + grid-row: 1 / 3; +} + +.event-log code { + color: var(--blue); + font-family: var(--font-code); + font-size: 10px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.event-log small { + color: var(--muted); + font-family: var(--font-code); + font-size: 9px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.json-panel pre { + background: var(--code-surface); + color: var(--code-json); + font-family: var(--font-code); + font-size: 10px; + line-height: 1.65; + padding: 14px; + white-space: pre-wrap; + word-break: break-word; +} + +.collapsed-events .event-panel > :last-child, +.collapsed-json .json-panel > :last-child { + display: none; +} + +@keyframes status-pulse { + from { + opacity: 0.45; + } + to { + opacity: 1; + } +} + +.content-page { + margin: 0 auto; + max-width: 1240px; + padding: 84px 24px 110px; +} + +.content-header { + border-bottom: 1px solid var(--rule); + padding-bottom: 48px; +} + +.content-header h1 { + font-family: var(--font-code); + font-size: 58px; + font-weight: 520; + line-height: 1; + margin: 0; +} + +.content-header > :where(p), +.content-header > :where(div) > :where(p) { + color: var(--muted); + font-size: 16px; + line-height: 1.65; + margin: 22px 0 0; + max-width: 700px; +} + +.benchmark-command, +.example-command { + align-items: center; + color: var(--secondary); + display: flex; + font-family: var(--font-code); + font-size: 12px; + gap: 9px; +} + +.benchmark-command { + margin-top: 26px; +} + +.benchmark-command svg, +.example-command svg { + height: 15px; + width: 15px; +} + +.benchmark-comparison { + border-bottom: 1px solid var(--rule); + display: grid; + gap: 72px; + grid-template-columns: minmax(260px, 0.8fr) minmax(440px, 1.2fr); + padding: 52px 0; +} + +.benchmark-comparison h2 { + font-size: 28px; + font-weight: 560; + line-height: 1.25; + margin: 0; +} + +.benchmark-comparison-intro > :where(p:last-child), +.benchmark-path-list > :where(p) { + color: var(--muted); + font-size: 13px; + line-height: 1.65; +} + +.benchmark-comparison-intro > :where(p:last-child) { + margin: 18px 0 0; +} + +.benchmark-path-list { + border-top: 1px solid var(--rule); +} + +.benchmark-path-list > div { + border-bottom: 1px solid var(--rule); + display: grid; + gap: 16px; + grid-template-columns: 132px minmax(0, 1fr); + padding: 16px 0; +} + +.benchmark-path-list span { + color: var(--muted); + font-family: var(--font-code); + font-size: 9px; + text-transform: uppercase; +} + +.benchmark-path-list code { + color: var(--secondary); + font-family: var(--font-code); + font-size: 11px; + line-height: 1.55; + overflow-wrap: anywhere; +} + +.benchmark-path-list > div:nth-child(2) code { + color: var(--green); +} + +.benchmark-path-list > :where(p) { + margin: 18px 0 0; +} + +.benchmark-summary { + border-bottom: 1px solid var(--rule); + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); +} + +.benchmark-summary > div { + border-right: 1px solid var(--rule); + display: flex; + flex-direction: column; + min-height: 136px; + padding: 25px 22px; +} + +.benchmark-summary > div:first-child { + padding-left: 0; +} + +.benchmark-summary > div:last-child { + border-right: 0; +} + +.benchmark-summary span { + color: var(--muted); + font-family: var(--font-code); + font-size: 10px; + line-height: 1.4; + text-transform: uppercase; +} + +.benchmark-summary strong { + font-family: var(--font-code); + font-size: 24px; + font-weight: 520; + line-height: 1.15; + margin-top: auto; +} + +.benchmark-visualization { + border-bottom: 1px solid var(--rule); + display: grid; + gap: 13px; + padding: 44px 0; +} + +.benchmark-visualization > div { + align-items: center; + display: grid; + gap: 18px; + grid-template-columns: 190px minmax(0, 1fr) 62px; +} + +.benchmark-row-label { + display: grid; + gap: 3px; +} + +.benchmark-row-label strong, +.benchmark-row-label span { + font-family: var(--font-code); + font-size: 10px; +} + +.benchmark-row-label strong { + font-weight: 650; +} + +.benchmark-row-label span { + color: var(--muted); +} + +.benchmark-track { + background: var(--rule-soft); + height: 14px; + overflow: hidden; +} + +.benchmark-track span { + animation: bar-enter 700ms cubic-bezier(0.2, 0.8, 0.2, 1) both; + background: var(--blue); + display: block; + height: 100%; + transform-origin: left; +} + +.benchmark-speedup { + font-family: var(--font-code); + font-size: 12px; + font-weight: 600; + text-align: right; +} + +.benchmark-table-wrap { + border-bottom: 1px solid var(--rule); + overflow-x: auto; + padding: 38px 0; +} + +.benchmark-table { + border-collapse: collapse; + font-size: 12px; + min-width: 880px; + width: 100%; +} + +.benchmark-table th { + color: var(--muted); + font-family: var(--font-code); + font-size: 9px; + font-weight: 600; + text-align: left; + text-transform: uppercase; +} + +.benchmark-table th, +.benchmark-table td { + border-bottom: 1px solid var(--rule-soft); + padding: 13px 12px; + white-space: nowrap; +} + +.benchmark-table th:first-child, +.benchmark-table td:first-child { + padding-left: 0; +} + +.benchmark-table td:nth-child(n + 4) { + font-family: var(--font-code); +} + +.benchmark-table td strong { + color: var(--green); +} + +.benchmark-results-note { + border-bottom: 1px solid var(--rule); + color: var(--muted); + font-size: 13px; + line-height: 1.65; + margin: 0; + padding: 22px 0; +} + +.benchmark-results-note strong { + color: var(--ink); + font-family: var(--font-code); + font-weight: 650; +} + +.method-grid { + border-bottom: 1px solid var(--rule); + display: grid; + gap: 80px; + grid-template-columns: minmax(260px, 0.8fr) minmax(380px, 1.2fr); + padding: 58px 0; +} + +.method-grid h2 { + font-size: 28px; + font-weight: 560; + line-height: 1.25; + margin: 0; +} + +.method-grid dl { + border-top: 1px solid var(--rule); + margin: 0; +} + +.method-grid dl > div { + border-bottom: 1px solid var(--rule); + display: grid; + gap: 20px; + grid-template-columns: 90px 1fr; + padding: 15px 0; +} + +.method-grid dt { + color: var(--muted); + font-family: var(--font-code); + font-size: 9px; + text-transform: uppercase; +} + +.method-grid dd { + font-size: 13px; + line-height: 1.5; + margin: 0; +} + +.evidence-link { + align-items: center; + color: var(--blue); + display: inline-flex; + font-size: 13px; + font-weight: 600; + gap: 7px; + margin-top: 28px; +} + +.evidence-link svg { + height: 15px; + width: 15px; +} + +.examples-header { + align-items: end; + display: flex; + gap: 40px; + justify-content: space-between; +} + +.examples-header .primary-link { + flex: 0 0 auto; +} + +.example-row { + border-bottom: 1px solid var(--rule); + display: grid; + gap: 50px; + grid-template-columns: minmax(260px, 0.7fr) minmax(420px, 1.3fr); + padding: 58px 0; +} + +.example-copy { + align-self: start; + position: sticky; + top: 90px; +} + +.example-index { + color: var(--muted); + font-family: var(--font-code); + font-size: 10px; +} + +.example-copy h2 { + font-size: 24px; + font-weight: 580; + margin: 14px 0 0; +} + +.example-copy > :where(p) { + color: var(--muted); + font-size: 14px; + line-height: 1.6; + margin: 14px 0 22px; +} + +.example-command { + background: var(--soft); + border: 1px solid var(--rule); + border-radius: 4px; + min-height: 38px; + overflow: hidden; + padding: 8px 10px; +} + +.example-command code { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.example-links { + display: flex; + gap: 18px; + margin-top: 19px; +} + +.example-links a { + align-items: center; + color: var(--blue); + display: inline-flex; + font-size: 12px; + font-weight: 600; + gap: 6px; +} + +.example-links svg { + height: 13px; + width: 13px; +} + +.example-row > pre { + background: var(--code-surface); + border-radius: 5px; + color: var(--code-text); + font-family: var(--font-code); + font-size: 10px; + line-height: 1.65; + margin: 0; + max-height: 470px; + min-height: 390px; + overflow: auto; + padding: 22px; +} + +@media (max-width: 820px) { + .content-page { + padding: 58px 16px 80px; + } + + .content-header h1 { + font-size: 42px; + } + + .benchmark-summary { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .benchmark-comparison { + gap: 32px; + grid-template-columns: 1fr; + } + + .benchmark-summary > div:nth-child(2) { + border-right: 0; + } + + .benchmark-summary > div:nth-child(-n + 2) { + border-bottom: 1px solid var(--rule); + } + + .benchmark-summary > div:first-child, + .benchmark-summary > div:nth-child(3) { + padding-left: 14px; + } + + .benchmark-visualization > div { + gap: 10px; + grid-template-columns: 130px minmax(0, 1fr) 52px; + } + + .method-grid, + .example-row { + gap: 36px; + grid-template-columns: minmax(0, 1fr); + } + + .examples-header { + align-items: flex-start; + flex-direction: column; + } + + .example-copy { + position: static; + } +} + +@media (max-width: 520px) { + .benchmark-path-list > div { + gap: 7px; + grid-template-columns: 1fr; + } + + .benchmark-visualization > div { + align-items: end; + grid-template-columns: 1fr 52px; + } + + .benchmark-track { + grid-column: 1 / 3; + grid-row: 2; + } + + .benchmark-speedup { + grid-column: 2; + grid-row: 1; + } + + .benchmark-summary strong { + font-size: 18px; + } + + .example-row > pre { + min-height: 320px; + } +} + +@media (max-width: 980px) { + .playground-page { + height: auto; + min-height: calc(100svh - 62px); + overflow: visible; + padding: 8px; + } + + .playground-shell { + min-height: 1100px; + } + + .playground-grid { + grid-template-columns: minmax(0, 1fr); + grid-template-rows: auto 520px; + } + + .inspector-panels { + border-left: 0; + border-top: 1px solid var(--rule); + } +} + +@media (max-width: 700px) { + .playground-shell { + grid-template-rows: auto minmax(0, 1fr); + } + + .playground-toolbar { + align-items: stretch; + flex-direction: column; + padding: 10px; + } + + .policy-control { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + height: auto; + } + + .policy-control button { + border-bottom: 1px solid var(--rule); + overflow: hidden; + text-overflow: ellipsis; + } + + .policy-control button:nth-child(2) { + border-right: 0; + } + + .policy-control button:nth-child(3), + .policy-control button:nth-child(4) { + border-bottom: 0; + } + + .run-status { + justify-content: space-between; + } + + .materialized-dashboard { + padding: 26px 18px 40px; + } + + .dashboard-heading { + align-items: flex-start; + flex-direction: column; + } + + .playground-metrics { + grid-template-columns: minmax(0, 1fr); + } + + .playground-metric { + border-bottom: 1px solid var(--rule); + border-right: 0; + min-height: 78px; + } + + .playground-metric:last-child { + border-bottom: 0; + } + + .owner-grid { + grid-template-columns: minmax(0, 1fr); + } +} + +@keyframes bar-enter { + from { + opacity: 0; + transform: scaleX(0.25); + } + to { + opacity: 1; + transform: scaleX(1); + } +} + +@media (max-width: 1000px) and (min-width: 761px) { + .home-hero h1 { + font-size: 64px; + } +} + +@media (max-width: 760px) { + .site-header-inner { + grid-template-columns: 1fr auto; + padding: 0 16px; + } + + .desktop-nav, + .site-actions { + display: none; + } + + .mobile-nav { + display: block; + } + + .home-hero { + min-height: 0; + padding: 48px 16px 24px; + } + + .home-hero h1 { + font-size: 48px; + } + + .home-hero-inner > :where(p) { + font-size: 17px; + } + + .copy-command { + max-width: none; + } + + .progressive-example { + margin-top: 34px; + height: 274px; + } + + .progressive-example pre { + font-size: 10px; + height: 233px; + padding: 14px; + } + + .home-band, + .demo-band { + padding: 62px 16px; + } + + .band-grid, + .demo-heading { + gap: 38px; + grid-template-columns: minmax(0, 1fr); + } + + .home-band h2, + .demo-band h2 { + font-size: 25px; + } + + .demo-heading .primary-link { + justify-self: start; + } + + .site-footer { + align-items: center; + flex-direction: column; + gap: 10px; + } +} + +@media (prefers-reduced-motion: reduce) { + html { + scroll-behavior: auto; + } + + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + scroll-behavior: auto !important; + transition-duration: 0.01ms !important; + } +} diff --git a/site/app/icon.tsx b/site/app/icon.tsx new file mode 100644 index 0000000..95cb1bd --- /dev/null +++ b/site/app/icon.tsx @@ -0,0 +1,25 @@ +import { ImageResponse } from "next/og" + +export const size = { height: 64, width: 64 } +export const contentType = "image/png" + +export default function Icon() { + return new ImageResponse( +
+ {"{}"} +
, + size + ) +} diff --git a/site/app/layout.tsx b/site/app/layout.tsx new file mode 100644 index 0000000..2f79dcd --- /dev/null +++ b/site/app/layout.tsx @@ -0,0 +1,69 @@ +import { Analytics } from "@vercel/analytics/next" +import { SpeedInsights } from "@vercel/speed-insights/next" +import { RootProvider } from "fumadocs-ui/provider/next" +import { GeistMono } from "geist/font/mono" +import { GeistSans } from "geist/font/sans" +import type { Metadata, Viewport } from "next" +import type { ReactNode } from "react" +import { DESCRIPTION, SITE_URL } from "@/lib/site" +import "./global.css" + +export const metadata: Metadata = { + alternates: { canonical: SITE_URL }, + applicationName: "schema-stream", + authors: [{ name: "Dimitri Kennedy", url: "https://hack.dance" }], + creator: "Dimitri Kennedy", + description: DESCRIPTION, + keywords: [ + "streaming JSON", + "structured output", + "progressive JSON parser", + "OpenAI Agents SDK", + "Vercel AI SDK", + "Mastra", + "Zod", + "Bun" + ], + metadataBase: new URL(SITE_URL), + openGraph: { + description: DESCRIPTION, + siteName: "schema-stream", + title: "schema-stream", + type: "website", + url: SITE_URL + }, + robots: { follow: true, index: true }, + title: { + default: "schema-stream - Progressive typed JSON snapshots", + template: "%s - schema-stream" + }, + twitter: { + card: "summary_large_image", + description: DESCRIPTION, + title: "schema-stream" + } +} + +export const viewport: Viewport = { + colorScheme: "light dark", + themeColor: [ + { color: "#ffffff", media: "(prefers-color-scheme: light)" }, + { color: "#0d0d0d", media: "(prefers-color-scheme: dark)" } + ] +} + +export default function RootLayout({ children }: { children: ReactNode }) { + return ( + + + {children} + + + + + ) +} diff --git a/site/app/llms-full.txt/route.ts b/site/app/llms-full.txt/route.ts new file mode 100644 index 0000000..fdb426b --- /dev/null +++ b/site/app/llms-full.txt/route.ts @@ -0,0 +1,15 @@ +import { getLLMFullText } from "../../lib/get-llm-text" + +export const revalidate = false + +/** Serves one build-derived Markdown corpus containing every published documentation page. */ +export async function GET(): Promise { + return new Response(await getLLMFullText(), { + headers: { + "Content-Type": "text/markdown; charset=utf-8", + Link: '; rel="canonical"', + "X-Content-Type-Options": "nosniff", + "X-Robots-Tag": "noindex" + } + }) +} diff --git a/site/app/llms.mdx/docs/[[...slug]]/route.ts b/site/app/llms.mdx/docs/[[...slug]]/route.ts new file mode 100644 index 0000000..69d8508 --- /dev/null +++ b/site/app/llms.mdx/docs/[[...slug]]/route.ts @@ -0,0 +1,38 @@ +import { notFound } from "next/navigation" +import { getCanonicalUrl, getLLMText } from "../../../../lib/get-llm-text" +import { source } from "../../../../lib/source" + +export const revalidate = false + +interface MarkdownRouteContext { + params: Promise<{ + slug?: string[] + }> +} + +/** + * Resolves the internal Markdown endpoint used by `.md` rewrites and Accept negotiation. + * The internal `/llms.mdx` prefix keeps machine responses separate from canonical HTML routes. + */ +export async function GET(_request: Request, { params }: MarkdownRouteContext): Promise { + const { slug } = await params + const page = source.getPage(slug) + + if (!page) { + notFound() + } + + return new Response(await getLLMText({ page }), { + headers: { + "Content-Type": "text/markdown; charset=utf-8", + Link: `<${getCanonicalUrl(page.url)}>; rel="canonical"`, + "X-Content-Type-Options": "nosniff", + "X-Robots-Tag": "noindex" + } + }) +} + +/** Pre-renders a Markdown response for every page generated from the docs source. */ +export function generateStaticParams(): ReturnType { + return source.generateParams() +} diff --git a/site/app/llms.txt/route.ts b/site/app/llms.txt/route.ts new file mode 100644 index 0000000..242aa57 --- /dev/null +++ b/site/app/llms.txt/route.ts @@ -0,0 +1,15 @@ +import { getLLMIndexText } from "../../lib/get-llm-text" + +export const revalidate = false + +/** Serves the compact, canonical discovery index for AI tools and documentation crawlers. */ +export function GET(): Response { + return new Response(getLLMIndexText(), { + headers: { + "Content-Type": "text/markdown; charset=utf-8", + Link: '; rel="canonical"', + "X-Content-Type-Options": "nosniff", + "X-Robots-Tag": "noindex" + } + }) +} diff --git a/site/app/manifest.ts b/site/app/manifest.ts new file mode 100644 index 0000000..e635d26 --- /dev/null +++ b/site/app/manifest.ts @@ -0,0 +1,20 @@ +import type { MetadataRoute } from "next" +import { DESCRIPTION } from "../lib/site" + +/** Describes Schema Stream when the documentation site is installed from a browser. */ +export default function manifest(): MetadataRoute.Manifest { + return { + background_color: "#ffffff", + categories: ["developer", "documentation", "utilities"], + description: DESCRIPTION, + display: "standalone", + id: "/", + icons: [{ sizes: "64x64", src: "/icon", type: "image/png" }], + lang: "en", + name: "Schema Stream", + scope: "/", + short_name: "Schema Stream", + start_url: "/", + theme_color: "#ffffff" + } +} diff --git a/site/app/not-found.tsx b/site/app/not-found.tsx new file mode 100644 index 0000000..9aa0b95 --- /dev/null +++ b/site/app/not-found.tsx @@ -0,0 +1,17 @@ +import Link from "next/link" +import { SiteHeader } from "@/components/site-header" + +export default function NotFound() { + return ( + <> + +
+

404

+

That snapshot is not here.

+ + Return to docs + +
+ + ) +} diff --git a/site/app/opengraph-image.tsx b/site/app/opengraph-image.tsx new file mode 100644 index 0000000..7fa2bb8 --- /dev/null +++ b/site/app/opengraph-image.tsx @@ -0,0 +1,62 @@ +import { ImageResponse } from "next/og" + +export const alt = "Schema Stream - typed JSON, while it streams" +export const size = { + height: 630, + width: 1200 +} +export const contentType = "image/png" + +/** Renders a dependency-free monochrome social card that remains reliable at build time. */ +export default function OpenGraphImage(): ImageResponse { + return new ImageResponse( +
+
+ schema.stream + TypeScript / Bun / Node.js +
+ +
+
Schema Stream
+
+ Typed JSON, while it streams. +
+
+ +
+ {'{ "status": "streaming", "valid": true }'} + github.com/hack-dance/schema-stream +
+
, + size + ) +} diff --git a/site/app/playground/page.tsx b/site/app/playground/page.tsx new file mode 100644 index 0000000..b983b54 --- /dev/null +++ b/site/app/playground/page.tsx @@ -0,0 +1,19 @@ +import type { Metadata } from "next" +import { PlaygroundClient } from "@/components/playground-client" +import { SiteHeader } from "@/components/site-header" + +export const metadata: Metadata = { + description: "Compare SchemaStream snapshot policies against the same progressive JSON response.", + title: "Playground" +} + +export default function PlaygroundPage() { + return ( + <> + +
+ +
+ + ) +} diff --git a/site/app/robots.ts b/site/app/robots.ts new file mode 100644 index 0000000..33dcf4c --- /dev/null +++ b/site/app/robots.ts @@ -0,0 +1,15 @@ +import type { MetadataRoute } from "next" +import { SITE_URL } from "../lib/site" + +/** Publishes crawler policy for the canonical site while hiding only the internal rewrite path. */ +export default function robots(): MetadataRoute.Robots { + return { + host: SITE_URL, + rules: { + allow: "/", + disallow: "/llms.mdx/", + userAgent: "*" + }, + sitemap: `${SITE_URL}/sitemap.xml` + } +} diff --git a/site/app/sitemap.ts b/site/app/sitemap.ts new file mode 100644 index 0000000..020c897 --- /dev/null +++ b/site/app/sitemap.ts @@ -0,0 +1,21 @@ +import type { MetadataRoute } from "next" +import { getCanonicalUrl } from "../lib/get-llm-text" +import { source } from "../lib/source" + +/** Builds the human-facing sitemap directly from the generated Fumadocs page collection. */ +export default function sitemap(): MetadataRoute.Sitemap { + const docs: MetadataRoute.Sitemap = source.getPages().map(page => ({ + changeFrequency: "weekly", + priority: page.url === "/docs" ? 0.9 : 0.7, + url: getCanonicalUrl(page.url) + })) + + return [ + { + changeFrequency: "weekly", + priority: 1, + url: getCanonicalUrl("/") + }, + ...docs + ] +} diff --git a/site/app/twitter-image.tsx b/site/app/twitter-image.tsx new file mode 100644 index 0000000..2a8c8ca --- /dev/null +++ b/site/app/twitter-image.tsx @@ -0,0 +1,62 @@ +import { ImageResponse } from "next/og" + +export const alt = "Schema Stream - typed JSON, while it streams" +export const size = { + height: 630, + width: 1200 +} +export const contentType = "image/png" + +/** Renders the Twitter card independently so Next can statically emit both image conventions. */ +export default function TwitterImage(): ImageResponse { + return new ImageResponse( +
+
+ schema.stream + Typed streaming JSON +
+ +
+
Schema Stream
+
+ Typed JSON, while it streams. +
+
+ +
+ {'{ "snapshot": "complete" }'} + npm i schema-stream +
+
, + size + ) +} diff --git a/site/components/copy-command.tsx b/site/components/copy-command.tsx new file mode 100644 index 0000000..09b8248 --- /dev/null +++ b/site/components/copy-command.tsx @@ -0,0 +1,34 @@ +"use client" + +import { track } from "@vercel/analytics" +import { CheckIcon, CopyIcon } from "lucide-react" +import { useCallback, useState } from "react" + +interface CopyCommandProps { + command: string +} + +export function CopyCommand({ command }: CopyCommandProps) { + const [copied, setCopied] = useState(false) + + const copy = useCallback(async (): Promise => { + await navigator.clipboard.writeText(command) + track("copy_install_command") + setCopied(true) + window.setTimeout(() => setCopied(false), 1400) + }, [command]) + + return ( +
+ {command} + +
+ ) +} diff --git a/site/components/mdx.tsx b/site/components/mdx.tsx new file mode 100644 index 0000000..c43ab61 --- /dev/null +++ b/site/components/mdx.tsx @@ -0,0 +1,15 @@ +import defaultMdxComponents from "fumadocs-ui/mdx" +import type { MDXComponents } from "mdx/types" + +export function getMDXComponents(components?: MDXComponents): MDXComponents { + return { + ...defaultMdxComponents, + ...components + } +} + +export const useMDXComponents = getMDXComponents + +declare global { + type MDXProvidedComponents = ReturnType +} diff --git a/site/components/playground-client.tsx b/site/components/playground-client.tsx new file mode 100644 index 0000000..5a31478 --- /dev/null +++ b/site/components/playground-client.tsx @@ -0,0 +1,386 @@ +"use client" + +import { track } from "@vercel/analytics" +import { + ChevronDownIcon, + ChevronRightIcon, + CircleCheckIcon, + PlayIcon, + RotateCcwIcon +} from "lucide-react" +import { AnimatePresence, motion, useReducedMotion } from "motion/react" +import { type MouseEvent, useCallback, useEffect, useRef, useState } from "react" +import { SchemaStream, type SchemaStreamChunk, type SnapshotPolicy } from "schema-stream" +import { z } from "zod" + +const dashboardSchema = z.object({ + title: z.string(), + summary: z.string(), + metrics: z.object({ + readiness: z.number(), + risk: z.enum(["low", "medium", "high"]), + coverage: z.number() + }), + milestones: z.array( + z.object({ + complete: z.boolean(), + label: z.string(), + owner: z.string() + }) + ), + owners: z.record( + z.string(), + z.object({ + focus: z.string(), + status: z.string() + }) + ), + recommendation: z.object({ + decision: z.enum(["ship", "hold"]), + reason: z.string() + }) +}) + +type Dashboard = z.infer +type DashboardSnapshot = SchemaStreamChunk + +const FIXTURE: Dashboard = { + metrics: { coverage: 94, readiness: 82, risk: "medium" }, + milestones: [ + { complete: true, label: "API contract", owner: "Platform" }, + { complete: true, label: "Rollback plan", owner: "Reliability" }, + { complete: false, label: "Support handoff", owner: "Operations" } + ], + owners: { + api: { focus: "Contract stability", status: "ready" }, + operations: { focus: "Escalation coverage", status: "review" }, + product: { focus: "Launch messaging", status: "ready" } + }, + recommendation: { + decision: "ship", + reason: "Proceed after the support handoff owner confirms coverage." + }, + summary: "The release is technically ready with one operational dependency still open.", + title: "Release readiness" +} + +const POLICIES = [ + { label: "Every character", policy: { mode: "chunk" } as const, value: "chunk" }, + { label: "Complete values", policy: { mode: "value" } as const, value: "value" }, + { label: "Every 96 bytes", policy: { bytes: 96, mode: "bytes" } as const, value: "bytes" }, + { label: "Final only", policy: { mode: "final" } as const, value: "final" } +] as const + +interface CompletionEvent { + id: number + path: string + value: string +} + +function formatEventValue(value: unknown): string { + const serialized = JSON.stringify(value) + if (serialized === undefined) { + return String(value) + } + return serialized.length > 62 ? `${serialized.slice(0, 59)}...` : serialized +} + +function createCharacterStream({ delayMs }: { delayMs: number }): ReadableStream { + const chunks = Array.from(JSON.stringify(FIXTURE)) + let index = 0 + + return new ReadableStream({ + async pull(controller) { + if (index >= chunks.length) { + controller.close() + return + } + + if (delayMs > 0) { + await new Promise(resolve => window.setTimeout(resolve, delayMs)) + } + controller.enqueue(chunks[index]) + index += 1 + } + }) +} + +function Metric({ label, value }: { label: string; value: null | number | string | undefined }) { + return ( +
+ {label} + {value ?? "-"} +
+ ) +} + +export function PlaygroundClient() { + const [activePolicy, setActivePolicy] = useState("chunk") + const [collapsedPanel, setCollapsedPanel] = useState<"events" | "json" | null>(null) + const [decision, setDecision] = useState() + const [events, setEvents] = useState([]) + const [isRunning, setIsRunning] = useState(false) + const [snapshot, setSnapshot] = useState({}) + const [snapshotCount, setSnapshotCount] = useState(0) + const runId = useRef(0) + const reduceMotion = useReducedMotion() + + const run = useCallback( + async (policy: SnapshotPolicy): Promise => { + const currentRun = runId.current + 1 + runId.current = currentRun + setDecision(undefined) + setEvents([]) + setIsRunning(true) + setSnapshot({}) + setSnapshotCount(0) + + let eventId = 0 + const parser = new SchemaStream(dashboardSchema, { + onValueComplete({ path, value }) { + if (runId.current !== currentRun) { + return + } + + eventId += 1 + const displayPath = path.length === 0 ? "$" : `$.${path.join(".")}` + setEvents(current => [ + ...current.slice(-79), + { id: eventId, path: displayPath, value: formatEventValue(value) } + ]) + + if (path.length === 2 && path[0] === "metrics" && path[1] === "risk") { + setDecision(value === "high" ? "Hold for risk review" : "Continue release checks") + } + } + }) + + const delayMs = reduceMotion ? 0 : 6 + const source = createCharacterStream({ delayMs }) + + for await (const nextSnapshot of parser.iterate(source, { + snapshotPolicy: policy, + stringBufferSize: 0 + })) { + if (runId.current !== currentRun) { + break + } + setSnapshot(nextSnapshot) + setSnapshotCount(current => current + 1) + } + + if (runId.current === currentRun) { + setIsRunning(false) + } + }, + [reduceMotion] + ) + + const startRun = useCallback( + (policy: SnapshotPolicy): void => { + run(policy).catch(() => setIsRunning(false)) + }, + [run] + ) + + const selectPolicy = useCallback((event: MouseEvent): void => { + const value = event.currentTarget.dataset.policy + const policy = POLICIES.find(item => item.value === value) + if (!policy) { + return + } + + track("snapshot_policy_changed", { policy: policy.value }) + setActivePolicy(policy.value) + }, []) + + const selected = POLICIES.find(item => item.value === activePolicy) ?? POLICIES[0] + + const replay = useCallback((): void => { + startRun(selected.policy) + }, [selected.policy, startRun]) + + const toggleEvents = useCallback((): void => { + setCollapsedPanel(value => (value === "events" ? null : "events")) + }, []) + + const toggleJson = useCallback((): void => { + setCollapsedPanel(value => (value === "json" ? null : "json")) + }, []) + + useEffect(() => { + startRun(selected.policy) + + return () => { + runId.current += 1 + } + }, [selected.policy, startRun]) + + const json = JSON.stringify(snapshot, null, 2) + const milestones = snapshot.milestones ?? [] + const owners = snapshot.owners ? Object.entries(snapshot.owners) : [] + + return ( +
+
+
+ Snapshot policy + {POLICIES.map(item => ( + + ))} +
+
+ + {isRunning ? "Streaming" : "Complete"} + + {snapshotCount} snapshots + +
+
+ +
+
+
+ +

Materialized dashboard

+

{snapshot.title ?? "Waiting for title"}

+
+ {decision ? ( + + + ) : null} +
+ +

{snapshot.summary ?? "Summary is materializing..."}

+ +
+ + + +
+ +
+
+

Milestones

+ {milestones.length} ready +
+
+ + {milestones.map(milestone => ( + + + {milestone.label} + {milestone.owner} + + ))} + +
+
+ +
+
+

Owners

+ {owners.length} materialized +
+
+ + {owners.map(([owner, detail]) => + detail ? ( + + {owner} + {detail.focus} + {detail.status} + + ) : null + )} + +
+
+ + {snapshot.recommendation?.decision ? ( + + {snapshot.recommendation.decision} +

{snapshot.recommendation.reason ?? "Reason is materializing..."}

+
+ ) : null} +
+ + +
+
+ ) +} diff --git a/site/components/progressive-example.tsx b/site/components/progressive-example.tsx new file mode 100644 index 0000000..3bbd691 --- /dev/null +++ b/site/components/progressive-example.tsx @@ -0,0 +1,120 @@ +"use client" + +import { useReducedMotion } from "motion/react" +import { useEffect, useState } from "react" +import { SchemaStream, type SchemaStreamChunk } from "schema-stream" +import { z } from "zod" + +const previewSchema = z.object({ + title: z.string(), + summary: z.string(), + metrics: z.object({ score: z.number() }), + checks: z.array(z.object({ label: z.string(), state: z.string() })) +}) + +type PreviewSnapshot = SchemaStreamChunk + +const FIXTURE: z.output = { + checks: [{ label: "Support handoff", state: "watch" }], + metrics: { score: 82 }, + summary: "One operational check remains.", + title: "Release readiness" +} + +const INITIAL_SNAPSHOT: PreviewSnapshot = { + checks: [{ label: "", state: "" }], + metrics: { score: null }, + summary: "", + title: "" +} + +function createCharacterStream({ delayMs }: { delayMs: number }): ReadableStream { + const serialized = JSON.stringify(FIXTURE) + const chunks = delayMs === 0 ? [serialized] : Array.from(serialized) + let index = 0 + + return new ReadableStream({ + async pull(controller) { + if (index >= chunks.length) { + controller.close() + return + } + + if (delayMs > 0) { + await new Promise(resolve => window.setTimeout(resolve, delayMs)) + } + controller.enqueue(chunks[index]) + index += 1 + } + }) +} + +export function ProgressiveExample() { + const [snapshot, setSnapshot] = useState(INITIAL_SNAPSHOT) + const [snapshotCount, setSnapshotCount] = useState(0) + const reduceMotion = useReducedMotion() + + useEffect(() => { + let cancelled = false + let replayTimer: number | undefined + + function stopReplay(): void { + cancelled = true + } + + function startReplay(): void { + replay().catch(stopReplay) + } + + async function replay(): Promise { + setSnapshot(INITIAL_SNAPSHOT) + setSnapshotCount(0) + + const parser = new SchemaStream(previewSchema, { + defaultData: { checks: [{ label: "", state: "" }] }, + typeDefaults: { boolean: null, number: null, string: "" } + }) + const source = createCharacterStream({ delayMs: reduceMotion ? 0 : 14 }) + + for await (const nextSnapshot of parser.iterate(source, { + snapshotPolicy: { mode: "chunk" }, + stringBufferSize: 0 + })) { + if (cancelled) { + return + } + setSnapshot(nextSnapshot) + setSnapshotCount(current => current + 1) + } + + if (!(cancelled || reduceMotion)) { + replayTimer = window.setTimeout(startReplay, 900) + } + } + + startReplay() + return () => { + cancelled = true + if (replayTimer !== undefined) { + window.clearTimeout(replayTimer) + } + } + }, [reduceMotion]) + + return ( +
+
+ + + one character per chunk +
+
+        {JSON.stringify(snapshot, null, 2)}
+      
+
+ ) +} diff --git a/site/components/site-header.tsx b/site/components/site-header.tsx new file mode 100644 index 0000000..1b6832b --- /dev/null +++ b/site/components/site-header.tsx @@ -0,0 +1,59 @@ +import { GitForkIcon, MenuIcon, PackageIcon } from "lucide-react" +import Link from "next/link" +import { GITHUB_URL, NPM_URL, primaryNavigation } from "@/lib/site" + +export function SiteHeader() { + return ( +
+
+ + + schema-stream + + + + + + +
+ + + +
+
+
+ ) +} diff --git a/site/lib/benchmark-data.ts b/site/lib/benchmark-data.ts new file mode 100644 index 0000000..fa0c72c --- /dev/null +++ b/site/lib/benchmark-data.ts @@ -0,0 +1,57 @@ +import { readdir, readFile } from "node:fs/promises" +import { join } from "node:path" +import { z } from "zod" +import { REPOSITORY_ROOT } from "@/lib/repository" + +const benchmarkRowSchema = z.object({ + avoidedSerializedBytes: z.number(), + fixture: z.string(), + iterateMedianMs: z.number(), + policy: z.string(), + roundtripMedianMs: z.number(), + runtime: z.string(), + speedup: z.number() +}) + +const benchmarkSchema = z.object({ + capturedAt: z.string(), + configuration: z.object({ + chunkSizeBytes: z.number(), + payloadSizeMiB: z.number(), + repeats: z.number(), + runtimes: z.array(z.string()), + warmups: z.number() + }), + host: z.object({ + architecture: z.string(), + chip: z.string(), + operatingSystem: z.string() + }), + method: z.object({ + baseline: z.string(), + candidate: z.string(), + resultValidation: z.string(), + sampleOrdering: z.string(), + speedup: z.string() + }), + representativeRows: z.array(benchmarkRowSchema) +}) + +export type BenchmarkData = z.infer +export type BenchmarkRow = z.infer + +/** Reads the newest committed benchmark artifact without rerunning noisy timing work at build time. */ +export async function loadLatestBenchmark(): Promise { + const directory = join(REPOSITORY_ROOT, "docs", "benchmarks") + const files = (await readdir(directory)) + .filter(file => file.endsWith(".json")) + .sort((left, right) => right.localeCompare(left)) + const [latest] = files + + if (!latest) { + throw new Error("No committed benchmark artifact was found") + } + + const contents = await readFile(join(directory, latest), "utf8") + return benchmarkSchema.parse(JSON.parse(contents)) +} diff --git a/site/lib/examples.ts b/site/lib/examples.ts new file mode 100644 index 0000000..982830a --- /dev/null +++ b/site/lib/examples.ts @@ -0,0 +1,48 @@ +export interface ExampleDefinition { + command: string + description: string + docsHref: string + file: string + liveProvider: boolean + title: string +} + +export const examples: readonly ExampleDefinition[] = [ + { + command: "bun run example:progressive", + description: + "Core progressive iteration, completion events, Unicode, and a mid-stream decision.", + docsHref: "/docs/integrations/provider-portability", + file: "examples/progressive-json.ts", + liveProvider: false, + title: "Progressive JSON" + }, + { + command: "bun run example:sdk", + description: "OpenAI Agents SDK and Vercel AI SDK streams against deterministic mock models.", + docsHref: "/docs/integrations/openai-agents", + file: "examples/sdk-mocks.ts", + liveProvider: false, + title: "SDK compatibility" + }, + { + command: "bun run example:mastra", + description: "Mastra structured output with the same SchemaStream materialization boundary.", + docsHref: "/docs/integrations/mastra", + file: "examples/mastra.ts", + liveProvider: true, + title: "Mastra" + }, + { + command: "bun run example:websocket", + description: + "Bun WebSocket transport, selectable snapshot policies, and the live dashboard UI.", + docsHref: "/docs/integrations/bun-websocket", + file: "examples/websocket-ui/server.ts", + liveProvider: true, + title: "WebSocket dashboard" + } +] as const + +export const CODESPACES_URL = + "https://codespaces.new/hack-dance/schema-stream?quickstart=1&devcontainer_path=.devcontainer%2Fdevcontainer.json" diff --git a/site/lib/get-llm-text.ts b/site/lib/get-llm-text.ts new file mode 100644 index 0000000..297795d --- /dev/null +++ b/site/lib/get-llm-text.ts @@ -0,0 +1,94 @@ +import { DESCRIPTION, SITE_URL } from "./site" +import { source } from "./source" + +type SourcePage = (typeof source)["$inferPage"] + +interface GetLLMTextOptions { + page: SourcePage +} + +/** + * Converts a generated docs page into the self-contained Markdown served to AI clients. + * + * @param options - The Fumadocs page whose processed Markdown should be exposed. + * @returns Markdown with a stable title and canonical source URL. + */ +export async function getLLMText({ page }: GetLLMTextOptions): Promise { + const processed = await page.data.getText("processed") + const title = page.data.title ?? page.slugs.at(-1) ?? "Schema Stream" + + return [`# ${title}`, "", `Canonical: ${getCanonicalUrl(page.url)}`, "", processed.trim()].join( + "\n" + ) +} + +/** + * Builds the compact discovery index from the same generated pages used by the HTML docs. + * Per-page links use the public `.md` form so clients never need to know the internal route. + * + * @returns An llms.txt-compatible Markdown index with absolute canonical links. + */ +export function getLLMIndexText(): string { + const pages = getSortedPages() + const links = pages.map(page => { + const title = escapeInlineMarkdown(page.data.title ?? page.slugs.at(-1) ?? "Documentation") + const description = page.data.description + ? `: ${normalizeInlineText(page.data.description)}` + : "" + + return `- [${title}](${getMarkdownUrl(page.url)})${description}` + }) + + return [ + "# Schema Stream", + "", + `> ${DESCRIPTION}`, + "", + "## Documentation", + "", + ...links, + "", + "## Complete corpus", + "", + `- [All documentation in one file](${SITE_URL}/llms-full.txt)` + ].join("\n") +} + +/** + * Materializes every page into one deterministic Markdown document at build time. + * + * @returns The complete processed documentation corpus. + */ +export async function getLLMFullText(): Promise { + const pages = getSortedPages() + const sections = await Promise.all(pages.map(page => getLLMText({ page }))) + + return [ + "# Schema Stream documentation", + DESCRIPTION, + `Canonical: ${SITE_URL}/docs`, + ...sections + ].join("\n\n") +} + +/** Returns a canonical public URL for an application-relative path. */ +export function getCanonicalUrl(pathname: string): string { + return new URL(pathname, SITE_URL).href +} + +function getMarkdownUrl(pathname: string): string { + const normalizedPath = pathname.endsWith("/") ? pathname.slice(0, -1) : pathname + return getCanonicalUrl(`${normalizedPath}.md`) +} + +function getSortedPages(): SourcePage[] { + return [...source.getPages()].sort((left, right) => left.url.localeCompare(right.url)) +} + +function escapeInlineMarkdown(value: string): string { + return normalizeInlineText(value).replaceAll("[", "\\[").replaceAll("]", "\\]") +} + +function normalizeInlineText(value: string): string { + return value.replaceAll(/\s+/g, " ").trim() +} diff --git a/site/lib/layout.shared.tsx b/site/lib/layout.shared.tsx new file mode 100644 index 0000000..d87592d --- /dev/null +++ b/site/lib/layout.shared.tsx @@ -0,0 +1,35 @@ +import type { BaseLayoutProps } from "fumadocs-ui/layouts/shared" +import { GitForkIcon, PackageIcon } from "lucide-react" +import { GITHUB_URL, NPM_URL } from "@/lib/site" + +/** Keeps the docs chrome aligned with the compact public-site navigation. */ +export function baseOptions(): BaseLayoutProps { + return { + githubUrl: GITHUB_URL, + links: [ + { + external: true, + icon: