diff --git a/.github/workflows/workshop.yml b/.github/workflows/workshop.yml
index cdd36a4..e91138b 100644
--- a/.github/workflows/workshop.yml
+++ b/.github/workflows/workshop.yml
@@ -160,20 +160,24 @@ jobs:
IMAGE_ALIAS: ${{ steps.target.outputs.image_alias }}
run: |
set -euo pipefail
+ # Uses the constrained SSM document demohouse-workshop-deploy rather
+ # than AWS-RunShellScript. This repository is PUBLIC, and the deploy
+ # role can reach both demo instances, so sending an arbitrary command
+ # list here meant anyone able to push to a workshop branch could run
+ # arbitrary commands as root on the live demo hosts. The document
+ # hardcodes the deploy steps and constrains every parameter with an
+ # allowedPattern that SSM enforces server-side, so no shell
+ # metacharacter can reach the host. The deploy role's IAM policy now
+ # permits ssm:SendCommand ONLY on that document.
parameters=$(jq -n \
--arg registry "${REGISTRY}" \
--arg tag "${GITHUB_SHA}" \
--arg digest "${EXPECTED_DIGEST}" \
--arg alias "${IMAGE_ALIAS}" \
- '{commands: [
- "set -euo pipefail",
- "cd /opt/demohouse",
- ("aws ecr get-login-password --region ap-southeast-1 | docker login --username AWS --password-stdin " + $registry),
- ("ECR_REGISTRY=" + $registry + " ./scripts/deploy-workshop.sh " + $tag + " " + $digest + " " + $alias)
- ]}')
+ '{Registry: [$registry], Tag: [$tag], Digest: [$digest], Alias: [$alias]}')
command_id=$(aws ssm send-command \
--instance-ids "${INSTANCE_ID}" \
- --document-name AWS-RunShellScript \
+ --document-name demohouse-workshop-deploy \
--comment "Workshop ${GITHUB_REF_NAME} ${GITHUB_SHA}" \
--parameters "${parameters}" \
--query 'Command.CommandId' \
diff --git a/workshops/build_workshop/README.md b/workshops/build_workshop/README.md
index abd02f3..fad22a5 100644
--- a/workshops/build_workshop/README.md
+++ b/workshops/build_workshop/README.md
@@ -6,11 +6,16 @@ with ClickPipes, conversational BI with ClickHouse Agents, observability with Cl
(including an AI-built SRE dashboard), a break-and-fix incident lab diagnosed by an AI
SRE, and an in-app AI chat traced to Langfuse Cloud.
-Learners clone the repository, then switch to `build-workshop-v1`. Maintainers create a
-feature branch, open a PR to protected `dev-build-workshop-v1`, verify
-[dev-workshop.demohouse.cloud](https://dev-workshop.demohouse.cloud), then promote
-`dev-build-workshop-v1` to protected `build-workshop-v1` for
-[workshop.demohouse.cloud](https://workshop.demohouse.cloud).
+Learners clone this repository, then switch to `build-workshop-v1`. That flow is unchanged:
+the code attendees run lives in `app/` here, in the public repo, and module 00 still starts
+with `git clone https://github.com/ClickHouse/ClickHouse_Demos.git`.
+
+> **The playbook web app has moved.** The Next.js site previously served at
+> workshop.demohouse.cloud and dev-workshop.demohouse.cloud now lives in the private
+> `ClickHouse/WorkshopHouse` repository (`site/`), and is being republished on a new
+> subdomain. Its build/deploy pipelines in this repository are disabled. Only the web app
+> moved -- the attendee-facing workshop code stays here so learners do not need access to
+> a private repository.
## Architecture
@@ -62,7 +67,8 @@ flowchart LR
The published diagrams (the ClickHouse Cloud platform stack, the workshop architecture, the
data flow, and the module flow) are generated as clean SVGs by `docs/diagrams/gen_diagrams.py`
— edit that script and re-run it (`python3 gen_diagrams.py all`) to regenerate them, then copy
-the SVGs into `playbook/public/`.
+the SVGs into `site/public/` in the `ClickHouse/WorkshopHouse` repository (they used to go to
+`playbook/public/` here, before the playbook web app moved out).
## Workflows
@@ -121,7 +127,7 @@ flowchart LR
| Path | What |
|---|---|
| `app/` | The foundation app participants run locally: React frontend, FastAPI backend, Postgres + data generator, ClickStack OTel overlay. Workshop entrypoint: `preflight.sh` + `docker-compose.workshop.yml` + `.env.workshop.example`. See `app/WORKSHOP_CHANGES.md`, `app/CHAT_FEATURE.md`, `app/OBSERVABILITY.md`. |
-| `playbook/` | The published follow-along playbook (Next.js + Fumadocs; dual learner/instructor tracks plus self-paced and troubleshooting pages; deploys to workshop.demohouse.cloud). Requires Node >= 22.12 to build. |
+| _(moved)_ | The published follow-along playbook has moved to the private `ClickHouse/WorkshopHouse` repository, at `site/`, with its content under `site/content/docs/build-workshop/`. Only the web app moved -- the code in `app/` that attendees run stays here, in this public repo, so `git clone` in module 00 keeps working. |
| `docs/` | `diagrams/` — the platform, architecture, data-flow, and module-flow SVGs, generated by `gen_diagrams.py`. |
| `infra/` | Instructor tooling via clickhousectl: the demo stack end-to-end run (`provision_workshop_stack.sh e2e`, which doubles as the dry run) and the shared-Postgres FALLBACK pool for participants whose orgs cannot create a managed Postgres. |
diff --git a/workshops/build_workshop/playbook/.dockerignore b/workshops/build_workshop/playbook/.dockerignore
deleted file mode 100644
index 9ce73fb..0000000
--- a/workshops/build_workshop/playbook/.dockerignore
+++ /dev/null
@@ -1,9 +0,0 @@
-node_modules
-.next
-.source
-.git
-.gitignore
-npm-debug.log
-README.md
-Dockerfile
-.dockerignore
diff --git a/workshops/build_workshop/playbook/.gitignore b/workshops/build_workshop/playbook/.gitignore
deleted file mode 100644
index 9e429e4..0000000
--- a/workshops/build_workshop/playbook/.gitignore
+++ /dev/null
@@ -1,26 +0,0 @@
-# deps
-/node_modules
-
-# generated content
-.source
-
-# test & build
-/coverage
-/.next/
-/out/
-/build
-*.tsbuildinfo
-
-# misc
-.DS_Store
-*.pem
-/.pnp
-.pnp.js
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-
-# others
-.env*.local
-.vercel
-next-env.d.ts
\ No newline at end of file
diff --git a/workshops/build_workshop/playbook/.nvmrc b/workshops/build_workshop/playbook/.nvmrc
deleted file mode 100644
index 2bd5a0a..0000000
--- a/workshops/build_workshop/playbook/.nvmrc
+++ /dev/null
@@ -1 +0,0 @@
-22
diff --git a/workshops/build_workshop/playbook/Dockerfile b/workshops/build_workshop/playbook/Dockerfile
deleted file mode 100644
index 00b3edf..0000000
--- a/workshops/build_workshop/playbook/Dockerfile
+++ /dev/null
@@ -1,53 +0,0 @@
-# =============================================================================
-# BUILD workshop playbook -- multi-stage Next.js (Fumadocs) container
-# =============================================================================
-# Serves the docs site from a dedicated hostname behind the DemoHouse nginx/ALB.
-# basePath is baked at build time via NEXT_PUBLIC_BASE_PATH
-# (see next.config.mjs), so pass it as a build-arg -- it cannot be changed at
-# runtime once the bundle is compiled.
-#
-# docker build --build-arg NEXT_PUBLIC_BASE_PATH= \
-# --build-arg NEXT_PUBLIC_SITE_URL=https://dev-workshop.demohouse.cloud \
-# -t posthouse-demo-workshop:dev .
-#
-# Node >= 22.12 is required (package.json engines); the base image is 22-slim.
-# =============================================================================
-
-FROM node:22-slim AS deps
-WORKDIR /app
-COPY package.json package-lock.json ./
-# --ignore-scripts skips the `postinstall: fumadocs-mdx` hook, which needs the
-# MDX source + source.config.ts (not present yet at this layer). The .source
-# files are regenerated in the builder stage once the full tree is copied.
-RUN npm ci --ignore-scripts
-
-FROM node:22-slim AS builder
-WORKDIR /app
-ARG NEXT_PUBLIC_BASE_PATH=
-ARG NEXT_PUBLIC_SITE_URL=https://dev-workshop.demohouse.cloud
-ENV NEXT_PUBLIC_BASE_PATH=$NEXT_PUBLIC_BASE_PATH
-ENV NEXT_PUBLIC_SITE_URL=$NEXT_PUBLIC_SITE_URL
-ENV NEXT_TELEMETRY_DISABLED=1
-COPY --from=deps /app/node_modules ./node_modules
-COPY . .
-# Regenerate the Fumadocs .source bundle (skipped in deps via --ignore-scripts)
-# now that source.config.ts and the MDX content are present.
-RUN npx fumadocs-mdx && npm run build
-
-FROM node:22-slim AS runner
-WORKDIR /app
-ENV NODE_ENV=production
-ENV NEXT_TELEMETRY_DISABLED=1
-ENV PORT=3000
-ENV HOSTNAME=0.0.0.0
-RUN groupadd --system --gid 1001 nodejs \
- && useradd --system --uid 1001 --gid nodejs nextjs
-
-# Standalone output ships its own minimal node_modules + server.js.
-COPY --from=builder /app/.next/standalone ./
-COPY --from=builder /app/.next/static ./.next/static
-COPY --from=builder /app/public ./public
-
-USER nextjs
-EXPOSE 3000
-CMD ["node", "server.js"]
diff --git a/workshops/build_workshop/playbook/README.md b/workshops/build_workshop/playbook/README.md
deleted file mode 100644
index d59aefb..0000000
--- a/workshops/build_workshop/playbook/README.md
+++ /dev/null
@@ -1,129 +0,0 @@
-# ClickHouse BUILD Workshop playbook
-
-The published playbook for the ClickHouse BUILD Workshop ("Build AI with AI"): a
-three-hour, hands-on session where participants use their own agentic coding tool to take
-an NYC-taxi ride-hailing analytics app end to end on ClickHouse Cloud.
-
-This directory is the documentation site only. The workshop app that participants clone
-and build on lives alongside it at `workshops/build_workshop/app` in this repository, on
-the `build-workshop-v1` branch. The site is built with [Next.js](https://nextjs.org)
-and [Fumadocs](https://fumadocs.dev). Production is
-[workshop.demohouse.cloud](https://workshop.demohouse.cloud); dev is
-[dev-workshop.demohouse.cloud](https://dev-workshop.demohouse.cloud).
-
-## Prerequisites
-
-- Node.js `>= 22.12.0`. Earlier 22.x releases fail the build with
- `require() of ES Module ... not supported` because Fumadocs' MDX loader is ESM and
- require-of-ESM is only enabled by default from Node 22.12. An `.nvmrc` pins Node 22;
- run `nvm use` if you use nvm.
-- npm (the lockfile is npm).
-
-## Run locally
-
-```bash
-npm install # first time only
-npm run dev
-```
-
-Open http://localhost:3000. The site serves from the domain root in development (no base
-path).
-
-## Build
-
-```bash
-npm run build # production build (Next.js, Turbopack)
-npm run start # serve the production build on http://localhost:3000
-npm run types:check # optional: regenerate types and run tsc
-```
-
-## Deployment
-
-The site is built for `/` with an empty `NEXT_PUBLIC_BASE_PATH`.
-
-```bash
-NEXT_PUBLIC_BASE_PATH= \
-NEXT_PUBLIC_SITE_URL=https://dev-workshop.demohouse.cloud \
-npm run build -- --webpack
-```
-
-Promotion is branch-based:
-
-1. Create a feature branch and PR it to protected `dev-build-workshop-v1`.
-2. Required workshop CI passes; merging deploys that SHA to the dev hostname.
-3. Test dev, then open a `dev-build-workshop-v1` to `build-workshop-v1` PR.
-4. Merging deploys the same source revision to the production hostname.
-
-The public workflow uses GitHub OIDC, ECR immutable SHA tags, SSM, container health, and
-route probes. Old `/workshop` URLs redirect to the matching dedicated hostname.
-
-Legacy module 07/08 lesson paths remain as unlisted compatibility pages for static exports;
-the recommended Node deployment redirects those paths to their new module numbers.
-
-## Content authoring
-
-All content is MDX under `content/docs/`. The site is dual-track: every module has a
-Learner page and an Instructor page.
-
-```
-content/docs/
- index.mdx # the overview (hero, tracks, scope, modules table, ...)
- meta.json # top-level ordering: index, learner, instructor
- learner/
- meta.json # root:true -> Learner track tab; orders the modules
- index.mdx # track landing
- 00-setup.mdx ... 09-wrap-up.mdx
- instructor/
- meta.json # root:true -> Instructor track tab; orders the modules
- index.mdx # run of show + shared-resource checklist
- 00-setup.mdx ... 09-wrap-up.mdx
-```
-
-- Ordering is controlled by the `pages` array in each `meta.json` (file basenames,
- without extension).
-- The `root: true` flag on `learner/` and `instructor/` turns each into a switchable
- sidebar tab.
-- The page title (rendered as the `
`) comes from the frontmatter `title`; do not
- add a top-level `#` heading in the body.
-- Available MDX components include `Cards`/`Card` and `Callout` (from Fumadocs). No
- imports are needed for these.
-- No emojis anywhere, in content or code.
-
-### The per-module learner contract
-
-Every learner module page follows this skeleton, in order:
-
-1. Frontmatter `title` (`NN Module Name`) and `description`.
-2. `## Outcome` or `## Starting point` — the result, time budget, and prerequisites.
-3. `## Why` — the motivation for the step.
-4. `## Goal` — the single concrete outcome.
-5. `## Step N — verb phrase` — one section per step. Each step names the literal file
- paths it touches as `### `path`` subheadings, with code blocks (mark unfinished
- implementation details with `TODO`).
-6. `## How to verify you are done` — a self-check.
-7. `## Wrap-up` — what just happened.
-8. `## End state` — the handoff into the next module.
-
-### The instructor page contract
-
-Every instructor module page has these four sections: `## Timing`, `## Talk track`,
-`## Common failures`, `## Reset steps`. Content is filled in from rehearsal; unknowns are
-marked `TODO`.
-
-### Learner branch convention
-
-Learners clone the repository's default branch, then Module 00 switches them to
-`build-workshop-v1`, the complete workshop reference. They stay there except while
-running a Module 07 `fault/*` scenario, then switch back to `build-workshop-v1`.
-
-## Project layout
-
-| Path | Description |
-|---|---|
-| `src/app/(home)` | Landing page. |
-| `src/app/docs` | Docs layout and the catch-all page renderer. |
-| `src/app/api/search/route.ts` | Orama search route. |
-| `src/lib/shared.ts` | App name, routes, GitHub/app-repo config. |
-| `src/lib/layout.shared.tsx` | Shared nav options (title, track links, GitHub). |
-| `source.config.ts` | Fumadocs MDX collection config (frontmatter schema). |
-| `next.config.mjs` | Next config; `basePath` wiring. |
diff --git a/workshops/build_workshop/playbook/content/docs/index.mdx b/workshops/build_workshop/playbook/content/docs/index.mdx
deleted file mode 100644
index ad8ec6d..0000000
--- a/workshops/build_workshop/playbook/content/docs/index.mdx
+++ /dev/null
@@ -1,223 +0,0 @@
----
-title: Build AI with AI
-description: A three-hour, hands-on workshop that takes an NYC-taxi analytics app end to end on ClickHouse Cloud, driven by your own AI coding agent.
----
-
-Welcome to the ClickHouse BUILD Workshop playbook. Over three hours you will take an
-NYC-taxi ride-hailing analytics app (React front end, FastAPI back end, Postgres source
-database) and stand it up end to end on ClickHouse Cloud, using your own agentic coding
-tool to do the building. By the end you will have real-time change data capture from a
-managed Postgres, conversational BI over your data, full observability, an AI-assisted
-SRE workflow, and an in-app AI chat traced end to end, and you will have practiced
-diagnosing a live incident with an AI SRE.
-
-You leave with a running prototype and this repo to show your team. Your ClickHouse Cloud
-trial keeps running for 30 days after the session, everything you built keeps running on
-it, and the repository is yours to keep. By the end you can demo five things live:
-
-- a real-time operational dashboard on ClickHouse Cloud,
-- a change-data-capture pipeline streaming from managed Postgres,
-- conversational BI over your data with ClickHouse Agents,
-- an AI-built SRE dashboard and alert over your telemetry,
-- and an in-app AI chat traced end to end in Langfuse.
-
-This playbook is dual-track. The Learner track is the lesson you follow in the room. The
-Instructor track is the facilitator's companion for the same module: timing, talk
-track, common failures, and reset steps.
-
-
-
-
-
-
-## For learners
-
-You will work module by module. Each module names a starting checkpoint, explains why
-the step matters, states a concrete goal, walks you through numbered steps, and ends
-with a verification you can check yourself. You never have to keep pace with the whole
-room: if you fall behind, each module's Starting point section states exactly what you
-need in place, so you can catch up from there at your own speed.
-
-What you need on the day:
-
-- A laptop that meets the prerequisites in [00 Setup](/docs/learner/00-setup).
-- Your own agentic coding tool (Claude Code, Cursor, Codex CLI, or Windsurf), signed in
- and on an active plan.
-- A ClickHouse Cloud account with visible trial credits (created during prework).
-- The workshop app repository cloned locally, with Docker running.
-
-**Self-paced?** You can complete the whole workshop with no instructor - the primary path
-is fully self-serve. See [Running this workshop self-paced](/docs/learner/self-paced) for
-what changes, how to use your coding agent as an instructor, and the
-[Troubleshooting](/docs/learner/troubleshooting) reference for every failure seen in
-testing.
-
-## For instructors
-
-The Instructor track mirrors the Learner track one-to-one. For every module you get a
-timing budget, a talk track, the failures that actually happen in the room and how to
-unstick them, and the exact reset steps to get an attendee (or the whole room) back to a
-known-good state. Read the [Instructor track landing page](/docs/instructor) first for
-the room-level run of show and the shared-resource checklist.
-
-## Workshop scope
-
-### The app you build on
-
-The workshop app is a self-contained "war room" analytics stack for an NYC-taxi
-ride-hailing business:
-
-- **Front end** — a React single-page app with two dashboards: an Ops dashboard
- (live operational metrics) and a Historical dashboard (large-range aggregations and
- drilldowns). It also hosts the in-app AI chat panel you wire up in module 08.
-- **Back end** — a FastAPI service exposing safe, parameterized analytics endpoints.
-- **Source database** — Postgres (with PostGIS) as the operational source of truth,
- the origin for change data capture into ClickHouse.
-- **Analytics warehouse** — ClickHouse Cloud, which you point the back end at in
- module 01 and which receives CDC, observability data, and BI queries.
-
-You do not build the app from scratch. You start from a working local stack and, module
-by module, move its data plane and its intelligence onto ClickHouse Cloud.
-
-### The platform you build on
-
-ClickHouse Cloud is a single platform that spans the whole stack — from ingesting data at
-the bottom, to storing and analyzing it in ClickHouse, to observing it and layering AI on
-top. This workshop is a guided tour through exactly these pieces: you ingest with
-ClickPipes, analyze in ClickHouse, observe with ClickStack/HyperDX, and add AI with
-Langfuse and your coding agent.
-
-
-
-### Architecture (target end state)
-
-Here is how those platform pieces come together for the workshop specifically — the app on
-your laptop, everything stateful in your own ClickHouse Cloud trial, and the third-party
-APIs the chat feature calls.
-
-
-
-### How data flows
-
-The same picture, followed as data: seeded once from object storage, streamed continuously
-via CDC, then read by the dashboards, chat, and agents, and observed through ClickStack.
-
-
-
-The diagrams above are generated from `workshops/build_workshop/docs/diagrams/gen_diagrams.py`
-(edit the script and re-run it to regenerate the SVGs) — see the module flow below.
-
-
-
-## Modules
-
-Ten modules, in order. The app is complete on `build-workshop-v1`, so every module except
-07 needs no per-module checkout — you configure and connect services rather than change
-app code. The only branch switches are the fault branches in module 07.
-
-| Step | Time | Learner lesson | Instructor notes | Branch | What you will learn |
-|---|---|---|---|---|---|
-| 00 | 25 min | [Setup](/docs/learner/00-setup) | [notes](/docs/instructor/00-setup) | `build-workshop-v1` | Accounts, tools, agent skills, and the app repo, all wired up and verified |
-| 01 | 15 min | [ClickHouse Cloud](/docs/learner/01-clickhouse-cloud) | [notes](/docs/instructor/01-clickhouse-cloud) | `build-workshop-v1` | Create the schema, seed historical data from object storage, and feel the query speed |
-| 02 | 5 min | [Base app](/docs/learner/02-base-app) | [notes](/docs/instructor/02-base-app) | `build-workshop-v1` | Tour the running app now that it has data: Ops and Historical dashboards, the chat panel, the data flow |
-| 03 | 20 min | [Real-time CDC](/docs/learner/03-realtime-cdc) | [notes](/docs/instructor/03-realtime-cdc) | `build-workshop-v1` | Stream live rows from managed Postgres into ClickHouse with a Postgres CDC ClickPipe |
-| 04 | 10 min | [ClickHouse Agents](/docs/learner/04-clickhouse-agents) | [notes](/docs/instructor/04-clickhouse-agents) | `build-workshop-v1` | Conversational BI: create an agent over your taxi data and explore it in natural language |
-| 05 | 15 min | [ClickStack](/docs/learner/05-clickstack) | [notes](/docs/instructor/05-clickstack) | `build-workshop-v1` | Enable ClickStack and send app traces and logs to HyperDX |
-| 06 | 15 min | [AI SRE](/docs/learner/06-ai-sre) | [notes](/docs/instructor/06-ai-sre) | `build-workshop-v1` | Use the ClickStack MCP connection to build an SRE dashboard and alert |
-| 07 | 20 min | [Test, fail, and fix](/docs/learner/07-break-and-fix) | [notes](/docs/instructor/07-break-and-fix) | `fault/*` | Continue from AI SRE or optional 06b, inject a fault, diagnose it, fix it, and prove recovery |
-| 08 | 15 min | [Chat and Langfuse](/docs/learner/08-chat-langfuse) | [notes](/docs/instructor/08-chat-langfuse) | `build-workshop-v1` | Use the in-app AI chat and follow its traces, generations, and costs in Langfuse |
-| 09 | 10 min | [Wrap-up](/docs/learner/09-wrap-up) | [notes](/docs/instructor/09-wrap-up) | `build-workshop-v1` | Review what you built, take it home, and extend it to your own data |
-
-The times add up to about 2 hours 30 minutes of hands-on work; the rest of the
-three-hour session is the opening, transitions, and the finale demos.
-
-## How to work through it
-
-### Branches
-
-The app is already complete on `build-workshop-v1`. This workshop is about configuring
-and connecting services — real-time CDC, observability, agents, chat — not editing
-application code, so there is nothing to build up branch by branch:
-
-- Clone the app once in module 00, switch to `build-workshop-v1`, and stay there except
- while running the fault scenarios in module 07.
-- Late joiners are never stranded: everything is service-side, so you only need your
- `.env.workshop` filled in plus the module's console steps. There is no per-module
- checkout to catch up on.
-- The only branch switches are in module 07 (Break and fix), which uses fault branches
- (`fault/01-map-not-loading`, `fault/02-zone-stats-500`, `fault/03-slow-dashboard`). You
- check one out, diagnose the failure, then preserve the fix and return to
- `build-workshop-v1` with the module 07 stash-and-switch reset.
-
-
- The three `fault/*` branches above exist in the repo; module 07 walks through checking
- one out. Their symptoms and fixes are documented in the instructor track's answer key.
-
-
-### Environment variables
-
-Workshop configuration lives in a single `.env.workshop` file at the root of the app
-repository. A safe `.env.workshop.example` is committed; copy it and fill in only the
-values that are yours:
-
-```bash
-cp .env.workshop.example .env.workshop
-```
-
-The stack reads it explicitly via `--env-file`:
-
-```bash
-docker compose --env-file .env.workshop -f docker-compose.workshop.yml up -d
-```
-
-You fill in the values during module 00 setup, except the ClickStack block, which you add
-in module 05:
-
-- `CLICKHOUSE_HOST`, `CLICKHOUSE_PASSWORD` (plus `CLICKHOUSE_PORT=8443`,
- `CLICKHOUSE_USER=default`, `CLICKHOUSE_DATABASE=nyc_tlc_data`, `CLICKHOUSE_SECURE=true`)
- — your Cloud service (module 00). `CLICKHOUSE_HOST` is the bare hostname, with no
- scheme and no port.
-- `OPENAI_API_KEY`, `LLM_MODEL=gpt-5.4-mini`, `LLM_BASE_URL` — the runtime LLM for the
- in-app chat (module 00).
-- `LANGFUSE_PUBLIC_KEY`, `LANGFUSE_SECRET_KEY`, `LANGFUSE_BASE_URL` — your Langfuse
- project (module 00). `LANGFUSE_BASE_URL` is the Langfuse v4 env name; use
- `https://us.cloud.langfuse.com` (US) or `https://cloud.langfuse.com` (EU).
-- `OTLP_AUTH_TOKEN`, `CLICKSTACK_DATABASE=otel`, `OTEL_SERVICE_NAME=nyc-taxi-backend`
- — observability, in the ClickStack section of the same `.env.workshop` (module 05).
-
-Never commit your filled-in `.env.workshop`; it is git-ignored.
-
-## Repository layout
-
-Everything lives in one repository (`ClickHouse_Demos`), under
-`workshops/build_workshop/`, on the `build-workshop-v1` branch.
-
-```text
-workshops/build_workshop/
-playbook/ # this playbook (the site you are reading)
- content/docs/
- index.mdx # this overview
- learner/ # self-paced guide, the lessons 00-setup ... 09-wrap-up,
- # and a troubleshooting reference
- instructor/ # facilitator notes: 00-setup ... 09-wrap-up
- src/ # Next.js + Fumadocs app
- README.md # run, build, deploy, and authoring guide
-
-app/ # the NYC-taxi app you build on (cloned in module 00)
- frontend/ # React SPA (Ops + Historical dashboards, chat panel)
- backend/ # FastAPI analytics API + AI chat
- db/cloud/001_cloud_schema.sql # maintainer fixture; Module 01 contains the copyable SQL
- docker-compose.workshop.yml # the workshop stack (Cloud + ClickPipes)
- docker-compose.otel.yml # the ClickStack observability overlay (module 05)
- .env.workshop.example # single env template (Cloud + chat + observability);
- # copy to .env.workshop and fill in your values
-```
-
-## Where to go next
-
-
-
-
-
-
-
diff --git a/workshops/build_workshop/playbook/content/docs/instructor/00-setup.mdx b/workshops/build_workshop/playbook/content/docs/instructor/00-setup.mdx
deleted file mode 100644
index 6f0610c..0000000
--- a/workshops/build_workshop/playbook/content/docs/instructor/00-setup.mdx
+++ /dev/null
@@ -1,42 +0,0 @@
----
-title: 00 Setup
-description: Instructor notes for module 00 — timing, talk track, common failures, and reset steps.
----
-
-Facilitator companion to the learner lesson [00 Setup](/docs/learner/00-setup).
-
-## Timing
-
-About 25 minutes. Kick off the fire-and-wait steps (create the service, `docker compose
-up`) before or during the opening talk so they run underneath it. Push attendees to do
-the three account signups (ClickHouse Cloud, Langfuse, OpenAI) before the day - each is 5
-to 10 minutes - so this module stays inside budget.
-
-## Talk track
-
-- Frame the session: they will move an existing app onto ClickHouse Cloud, and the agent
- does the building.
-- The CLI returns the default-user password once; have learners save it immediately.
- The service Connect dialog provides the hostname.
-- Module 00 now creates the Cloud service and fills every credential, so the fire-and-wait
- is front-loaded here; module 01 just builds the schema on the service that already
- exists.
-- Step 7 is the only agent-integration setup: skills, ClickHouse MCP, and ClickStack MCP.
-
-## Common failures
-
-- Work email already attached to an existing ClickHouse org, so no trial credits appear.
- Steer to a personal email (surfaced in prework).
-- Coding agent cannot add MCP servers due to corporate policy (surfaced by the prework
- smoke test).
-- `docker compose up` fails because Docker is under-allocated (needs 6 GB+).
-- The first request after a Cloud service idle-scales to zero used to 500; the back end
- now retries the idle-wake on connect, so the first dashboard load may pause a few seconds
- but succeeds. Not a failure to chase. Confirmed in the 2026-07 clean-room dry run.
-
-## Reset steps
-
-- Point a stuck attendee at the loaner Cloud service pool if their trial is unusable.
-- Re-run `cp .env.workshop.example .env.workshop` and re-fill; confirm no stray committed
- `.env.workshop`.
-- TODO: confirm reset commands.
diff --git a/workshops/build_workshop/playbook/content/docs/instructor/01-clickhouse-cloud.mdx b/workshops/build_workshop/playbook/content/docs/instructor/01-clickhouse-cloud.mdx
deleted file mode 100644
index 77d0327..0000000
--- a/workshops/build_workshop/playbook/content/docs/instructor/01-clickhouse-cloud.mdx
+++ /dev/null
@@ -1,39 +0,0 @@
----
-title: 01 ClickHouse Cloud
-description: Instructor notes for module 01 — timing, talk track, common failures, and reset steps.
----
-
-Facilitator companion to the learner lesson
-[01 ClickHouse Cloud](/docs/learner/01-clickhouse-cloud).
-
-## Timing
-
-About 15 minutes. The seed-from-object-storage step is fire-and-wait; start it and
-keep talking while it loads.
-
-## Talk track
-
-- This is the first "wow" and the first time the dashboards show data at all: the
- Historical dashboard, backed by the freshly seeded ~3M-row ClickHouse table, returns
- wide-range aggregations in well under a second.
-- Explain why ClickHouse is fast on this shape of query (columnar, `ORDER BY`-aligned
- scans) at a level matched to the room.
-- TODO: expand.
-
-## Common failures
-
-- Attendee did not copy the service password (shown once); they must reset it in the
- console.
-- Wrong `CLICKHOUSE_HOST` (they pasted a full URL with scheme/port instead of the bare
- hostname). `CLICKHOUSE_PORT=8443` and `CLICKHOUSE_SECURE=true` are separate.
-- Seed load fails on object-storage access; confirm the public TLC URL.
-- Dry-run reference: schema + one-month seed applied in ~12s and produced 265 zones /
- ~3.17M trips. Before the seed runs the app renders **empty, not errored** (the not-seeded
- state is handled), so an empty dashboard here is expected, not a failure. Confirmed in the 2026-07 clean-room dry run.
-
-## Reset steps
-
-- Re-issue the service password from the console and re-fill `.env.workshop`, then
- restart: `docker compose --env-file .env.workshop -f docker-compose.workshop.yml up -d`.
-- Re-copy the complete schema command from
- [learner Module 01, Step 2](/docs/learner/01-clickhouse-cloud); it is idempotent.
diff --git a/workshops/build_workshop/playbook/content/docs/instructor/02-base-app.mdx b/workshops/build_workshop/playbook/content/docs/instructor/02-base-app.mdx
deleted file mode 100644
index 2b0d4cd..0000000
--- a/workshops/build_workshop/playbook/content/docs/instructor/02-base-app.mdx
+++ /dev/null
@@ -1,29 +0,0 @@
----
-title: 02 Base app
-description: Instructor notes for module 02 — timing, talk track, common failures, and reset steps.
----
-
-Facilitator companion to the learner lesson [02 Base app](/docs/learner/02-base-app).
-
-## Timing
-
-About 5 minutes. Keep this short; it is orientation, not construction, and buys time
-for services and telemetry to warm up.
-
-## Talk track
-
-- Walk the two dashboards on the projector: Ops (live) versus Historical (large ranges).
-- Point out the chat panel and set the expectation that it is wired up in module 08.
-- Name the data flow so the later modules have a shared vocabulary.
-- TODO: expand.
-
-## Common failures
-
-- Front end not reachable at `http://localhost:8080/` because the stack is not healthy
- yet; have them run `docker compose ps`.
-- The 2026-07 clean-room dry run covered this module; validated failure modes, timings, and human-gated steps were confirmed in the 2026-07 clean-room dry run.
-
-## Reset steps
-
-- `docker compose down && docker compose up -d` to recover an unhealthy stack.
-- TODO: confirm reset commands.
diff --git a/workshops/build_workshop/playbook/content/docs/instructor/03-realtime-cdc.mdx b/workshops/build_workshop/playbook/content/docs/instructor/03-realtime-cdc.mdx
deleted file mode 100644
index efac05a..0000000
--- a/workshops/build_workshop/playbook/content/docs/instructor/03-realtime-cdc.mdx
+++ /dev/null
@@ -1,69 +0,0 @@
----
-title: 03 Real-time CDC
-description: Instructor notes for module 03 — timing, talk track, common failures, and reset steps.
----
-
-Facilitator companion to the learner lesson
-[03 Real-time CDC](/docs/learner/03-realtime-cdc).
-
-## Timing
-
-About 20 minutes. A managed Postgres instance accepts connections within about a minute
-of `clickhousectl cloud postgres create`, so participants can provision it and fill their
-env while you narrate CDC. The ClickPipe then takes a couple of minutes to snapshot and
-begin streaming; account for it.
-
-## Talk track
-
-- Each participant creates their OWN Postgres managed by ClickHouse in their trial org —
- there is no shared instance on the primary path. One participant needs exactly one
- replication slot, and every managed instance ships `wal_level=logical` with 10 slots by
- default, so the "raise max_replication_slots" gate simply does not apply to them.
-- Their Postgres and ClickPipe live in the same org and are both created with
- `clickhousectl`; no console-wizard fork is required.
-- Explain CDC at a high level (reads the write-ahead log) and why destination tables carry
- `_peerdb_*` bookkeeping columns; the MV filters `_peerdb_is_deleted = 0`.
-- Point out that the generator's own log is the readiness signal — the app is the probe;
- they never poll a status API (the beta `postgres get`/`list` calls can return empty or
- FORBIDDEN even on a healthy instance).
-
-## Common failures
-
-- **Lost the one-time password.** It is shown only once by `create`. Reset it:
- `clickhousectl cloud postgres reset-password `, then update `.env.workshop`
- and restart the generator.
-- **Generator logs connection errors at first.** The instance is still provisioning; the
- container exits and restarts automatically, so it self-heals within about a minute. Only
- investigate if errors persist past a couple of minutes.
-- **ClickPipe cannot connect.** Usually a wrong host or password, or `PGSSLMODE` not set to
- `require` (managed Postgres mandates TLS).
-- **Region mismatch.** Cross-region Postgres-to-ClickHouse works but adds latency; steer
- participants to create the Postgres in the same region as their ClickHouse service.
-- **Data generator not started**, so nothing appears to move — check `pg-trip-writer` is
- up and its log shows `inserted N trips`.
-- **Pipe create fails with `BAD_REQUEST: table realtime_trips exists and is not empty`.**
- Only on a **re-run/reset**, not a fresh participant: deleting a ClickPipe drops the
- source replication slot but leaves its destination table behind, and the CLI refuses to
- reuse a non-empty one. Drop the leftover first, then recreate the pipe:
- `DROP TABLE IF EXISTS default.realtime_trips;`. Confirmed in the dry run.
-- **Managed Postgres unavailable in the org** (beta availability varies) — this is the one
- case that falls back to the shared instructor pool; see below.
-
-## Fallback: shared instructor Postgres
-
-If a participant's org cannot create a managed Postgres, hand them a shared-Postgres slip.
-The shared pool (and the slot/sender caveats that come with it at 30+ scale) is
-provisioned and documented in `infra/README.md`. On the shared path the table and
-publication are pre-created, so the generator log shows `publication ... already exists`
-rather than creating one — that is expected, not an error.
-
-## Reset steps
-
-- Delete and recreate the ClickPipe with the commands in learner Module 03.
-- Restart the data generator:
- `docker compose --env-file .env.workshop -f docker-compose.workshop.yml up -d pg-trip-writer`
- (turn it off with `--scale pg-trip-writer=0`).
-- Reset a lost Postgres password with `clickhousectl cloud postgres reset-password`.
-- After the event, participants delete their ClickPipe (module 09); a participant's
- managed Postgres is theirs to delete from the console or with
- `clickhousectl cloud postgres delete `.
diff --git a/workshops/build_workshop/playbook/content/docs/instructor/04-clickhouse-agents.mdx b/workshops/build_workshop/playbook/content/docs/instructor/04-clickhouse-agents.mdx
deleted file mode 100644
index 036a26d..0000000
--- a/workshops/build_workshop/playbook/content/docs/instructor/04-clickhouse-agents.mdx
+++ /dev/null
@@ -1,30 +0,0 @@
----
-title: 04 ClickHouse Agents
-description: Instructor notes for module 04 — timing, talk track, common failures, and reset steps.
----
-
-Facilitator companion to the learner lesson
-[04 ClickHouse Agents](/docs/learner/04-clickhouse-agents).
-
-## Timing
-
-About 10 minutes. Keep it tight; this is exploration, and the payoff is immediate.
-
-## Talk track
-
-- Position conversational BI: ask in English, get grounded SQL and an answer.
-- Note that it is Claude-powered and in beta, so expect variation.
-- Have one strong example question ready for the projector.
-- TODO: expand.
-
-## Common failures
-
-- Entry point (service sidebar -> ClickHouse agents -> Launch, or ai.clickhouse.cloud):
- the beta UI may shift, so confirm the path day-of.
-- Agent cannot see the taxi tables because the service/database was not connected.
-- The 2026-07 clean-room dry run covered this module; validated failure modes, timings, and human-gated steps were confirmed in the 2026-07 clean-room dry run.
-
-## Reset steps
-
-- Recreate the agent and reconnect it to the service and tables.
-- TODO: confirm reset commands.
diff --git a/workshops/build_workshop/playbook/content/docs/instructor/05-clickstack.mdx b/workshops/build_workshop/playbook/content/docs/instructor/05-clickstack.mdx
deleted file mode 100644
index 149008b..0000000
--- a/workshops/build_workshop/playbook/content/docs/instructor/05-clickstack.mdx
+++ /dev/null
@@ -1,47 +0,0 @@
----
-title: 05 ClickStack
-description: Instructor notes for module 05 — timing, talk track, common failures, and reset steps.
----
-
-Facilitator companion to the learner lesson [05 ClickStack](/docs/learner/05-clickstack).
-
-## Timing
-
-About 15 minutes. Telemetry must accumulate before the module 07 incident lab, so start the
-collector as early as this module allows and keep it running.
-
-## Talk track
-
-- ClickStack is observability on ClickHouse; HyperDX is the UI; traces are just rows you
- can query. Traces are the live-verified signal; app logs did not deliver over OTLP in
- testing, so point people to `docker compose ... logs` for logs.
-- Show one end-to-end request trace on the projector.
-- TODO: expand.
-
-## Common failures
-
-- OTLP host ports 4317/4318 already in use: have them set `OTEL_GRPC_HOST_PORT` /
- `OTEL_HTTP_HOST_PORT` in `.env.workshop` (preflight suggests values, e.g. 24317/24318)
- and, from anywhere inside the cloned repository, run
- `cd "$(git rev-parse --show-toplevel)/workshops/build_workshop/app" && ./preflight.sh`;
- the back end reaches the collector in-network, so the remap is safe.
-- Collector overlay not started (forgot the second `-f docker-compose.otel.yml`), so
- nothing arrives in HyperDX.
-- `OTLP_AUTH_TOKEN` mismatch, or missing `CLICKHOUSE_*` in `.env.workshop` (the collector
- reuses `CLICKHOUSE_HOST`/`PORT`/`USER`/`PASSWORD` to reach the Cloud service).
-- No traffic generated yet; have them click through both dashboards.
-- On Docker Desktop, the `--profile container-logs` scraper cannot mount the host log
- path (daemon in a VM); this is expected — read logs with `docker compose ... logs`.
- OTLP log delivery is unreliable, so do not rely on logs appearing in HyperDX.
-- After the overlay recreates the backend, the app used to 502 (frontend nginx cached the
- old backend IP). The frontend now re-resolves per request, so it self-heals within ~10s
- and needs no manual restart. Confirmed fixed in the dry run.
-- Dry-run reference: telemetry pipeline verified end to end — `nyc-taxi-backend` traces
- with `clickhouse.query` child spans carrying `db.statement` / `db.elapsed_ms` /
- `db.rows_returned`. Confirmed in the 2026-07 clean-room dry run.
-
-## Reset steps
-
-- Restart with both compose files:
- `docker compose --env-file .env.workshop -f docker-compose.workshop.yml -f docker-compose.otel.yml up -d`.
-- TODO: confirm the ClickStack enablement path in the console during the dry run.
diff --git a/workshops/build_workshop/playbook/content/docs/instructor/06-ai-sre.mdx b/workshops/build_workshop/playbook/content/docs/instructor/06-ai-sre.mdx
deleted file mode 100644
index 1a1cc86..0000000
--- a/workshops/build_workshop/playbook/content/docs/instructor/06-ai-sre.mdx
+++ /dev/null
@@ -1,37 +0,0 @@
----
-title: 06a AI SRE
-description: Instructor notes for module 06 — timing, talk track, common failures, and reset steps.
----
-
-Facilitator companion to the learner lesson [06 AI SRE](/docs/learner/06-ai-sre).
-
-## Timing
-
-About 15 minutes. MCP installation and OAuth already happened in Module 00; this module
-starts with a health-check prompt and then builds SRE artifacts.
-
-## Talk track
-
-- The agent already writes SQL; give it the telemetry and the MCP tools and it does SRE
- work.
-- Name the tools it will use: `clickstack_search`, `clickstack_save_dashboard`,
- `clickstack_save_alert`.
-- If permission prompts appear, approve only the expected `clickstack_*` tools.
-
-## Common failures
-
-- The Module 00 MCP OAuth session expired; reauthorize the existing server instead of
- adding a duplicate.
-- Permission prompts interrupt the agent mid-build (allowlist not applied).
-- Agent picks an unjustified alert threshold; coach it to baseline first.
-- AI Notebooks (optional Step 4) needs a one-time admin toggle: HyperDX Team Settings,
- Security Policies, Generative AI. On a participant's own trial they ARE the admin; on
- a loaner service enable it centrally before the session. Notebooks is beta and
- Managed-ClickStack-only — if the sidebar entry is missing, skip the optional step.
-- The 2026-07 clean-room dry run covered this module; validated failure modes, timings, and human-gated steps were confirmed in the 2026-07 clean-room dry run.
-
-## Reset steps
-
-- Reauthorize the MCP server configured in Module 00.
-- Delete a bad dashboard/alert in HyperDX and re-prompt.
-- TODO: confirm reset commands and the fallback (local `mcp-clickhouse` over stdio).
diff --git a/workshops/build_workshop/playbook/content/docs/instructor/06b-ai-sre-librechat.mdx b/workshops/build_workshop/playbook/content/docs/instructor/06b-ai-sre-librechat.mdx
deleted file mode 100644
index 4581c33..0000000
--- a/workshops/build_workshop/playbook/content/docs/instructor/06b-ai-sre-librechat.mdx
+++ /dev/null
@@ -1,45 +0,0 @@
----
-title: 06b AI SRE with LibreChat
-description: Instructor notes for the optional LibreChat agentic-SRE module — setup checklist, talk track, common failures.
----
-
-Facilitator companion to [06b AI SRE with LibreChat](/docs/learner/06b-ai-sre-librechat).
-
-## Timing
-
-Optional, ~20 minutes, best immediately before module 07 or as a take-home. Skip if the
-room is tight — 06a already covers the MCP-in-editor path.
-
-## Talk track
-
-- 06a = agent in your editor; 06b = chat-native agent that reads **telemetry + source** and
- goes symptom → line of code.
-- The payoff flows directly into module 07: check out a fault, ask the agent, watch it cross the two
- planes.
-
-## Per-participant setup checklist
-
-- Docker headroom for a second small stack (LibreChat API + MongoDB).
-- The add-on reads the SAME `app/.env.workshop` (no separate env file). They add the
- "Module 06b" vars from `.env.workshop.example`; `OPENAI_API_KEY` is already present and the
- LibreChat defaults are pre-filled, so only two values are theirs to supply:
-- `CLICKSTACK_SERVICE_ID` = their ClickHouse Cloud service UUID.
-- `GITHUB_PAT` = a fine-grained, read-only PAT on `ClickHouse/ClickHouse_Demos`.
-- One-time agent import in the Agent Builder (paste prompt, attach + authorize both MCPs).
-
-## Common failures
-
-- **Agent queries the wrong data / a "playground" service** → `CLICKSTACK_SERVICE_ID` unset
- or wrong; the ClickStack MCP defaults to the first service in the account.
-- **GitHub tool errors** → PAT missing/expired or lacks read access to the repo; it must be
- a fine-grained token with Contents:read on `ClickHouse/ClickHouse_Demos`.
-- **Weak answers / no SQL** → a `-mini`/`-nano` model was picked; switch to `gpt-5.4`.
-- **Port 3090 in use** → set `LIBRECHAT_PORT` in `app/.env.workshop`.
-- **Frontend fault not in telemetry** → the app wasn't opened in a browser after the
- rebuild, so the browser SDK never recorded it; load the page first.
-
-## Reset steps
-
-- `docker compose -f docker-compose.librechat.yml down` stops the add-on (add `-v`-style
- cleanup by removing `app/librechat/data-node/` to wipe the seeded user/agent).
-- Main app reset is the module-07 shared stash-and-switch reset followed by a rebuild.
diff --git a/workshops/build_workshop/playbook/content/docs/instructor/07-break-and-fix.mdx b/workshops/build_workshop/playbook/content/docs/instructor/07-break-and-fix.mdx
deleted file mode 100644
index 8bddf83..0000000
--- a/workshops/build_workshop/playbook/content/docs/instructor/07-break-and-fix.mdx
+++ /dev/null
@@ -1,154 +0,0 @@
----
-title: 07 Test, fail, and fix
-description: Instructor notes for module 07 — timing, talk track, common failures, and reset steps.
----
-
-Facilitator companion to the learner lesson
-[07 Test, fail, and fix](/docs/learner/07-break-and-fix).
-
-## Timing
-
-About 20 minutes. This is the incident lab; protect enough runway for the diagnosis to
-land before module 08 and the wrap-up. The lab runs fault 01 (5-15 min diagnosis). Faults
-02 (5-10 min) and 03 (10-20 min, and only with the full roughly 30-million-row dataset)
-remain available as optional extra incidents for a fast room. Set a hard-stop at rehearsal
-so the wrap-up is not squeezed.
-
-## Talk track
-
-- This is the payoff: use everything built so far to run a real incident.
-- If the room completed 06b, fault 01 is already diagnosed — this module becomes
- confirm-fix-verify, so keep the momentum and move quickly to the fix.
-- Describe the symptom, not the cause, and let the agents converge from telemetry.
-- Consider showing several attendees' diagnoses side by side on the projector.
-- The lab runs fault 01. If time permits an extra round, add fault 02 (and fault 03 only
- when the full dataset was pre-seeded); use the shared stash-and-switch reset below
- between faults.
-
-## Answer key
-
-Do not share this section with learners; it lives in the playbook only and is never
-committed to the app repo. Each fault is one small change on its own branch off
-`build-workshop-v1`;
-the fix is to revert it. Run one fault at a time. The lab's incident is fault 01 (5-15 min,
-curveball — the backend is innocent). Optional extras for a fast room: fault 02 (5-10 min,
-warm-up, the trace tells all) and fault 03 only when the full dataset is available
-(10-20 min, deeper ClickHouse reasoning).
-
-Shared reset for every fault (the stash preserves participant edits and avoids a blocked
-branch switch):
-
-```bash
-git stash push --include-untracked -m "module-07-fix"
-git switch build-workshop-v1
-docker compose --env-file .env.workshop \
- -f docker-compose.workshop.yml -f docker-compose.otel.yml up -d --build
-```
-
-### Fault 02 — zone stats 500 (`fault/02-zone-stats-500`)
-
-Commit message participants see: "backend: align zone stats column names with API params"
-(touches `backend/app/query_builders.py` `zone_stats_sql` only). It groups by
-`pickup_zone_id`, a column that does not exist on `taxi_trips`, instead of
-`pickup_location_id`.
-
-- **Symptom**: the map choropleth is empty (polygons render, but every zone sits in the
- lightest bucket) and the "Query Nms" caption is missing; bursts of 500s on
- `GET /api/metrics/zone_stats` (React Query retries three times). All other cards are fine.
-- **Where the signal lives**: a ClickStack `clickhouse.query` span with `error=True`,
- `error.category="query_failed"`, and `db.statement` containing `pickup_zone_id AS zone_id`;
- the recorded exception is ClickHouse Code 47 `UNKNOWN_IDENTIFIER`. Matching ERROR log:
- "ClickHouse query failed (category=query_failed, elapsed_ms=...): ... | sql=...".
-- **Diagnosis path**: find the 500 span -> read `db.statement` -> `UNKNOWN_IDENTIFIER` on
- `pickup_zone_id` -> `DESCRIBE taxi_trips` (or compare sibling query builders) -> the real
- column is `pickup_location_id`.
-- **Fix**: change `pickup_zone_id` back to `pickup_location_id` in `zone_stats_sql` (or
- `git revert` the fault commit); rebuild the backend.
-- **Reset**: the shared reset above.
-
-### Fault 03 — slow dashboard (`fault/03-slow-dashboard`)
-
-Commit message: "backend: window the trend series by bucket in HAVING" (touches
-`timeseries_sql`). It moves the time-window predicate from `WHERE` to a `HAVING` on the
-bucket alias, so `WHERE` becomes `1`. ClickHouse can no longer prune by the
-`(car_type, pickup_datetime)` primary key and full-scans `taxi_trips` with two
-`quantileTDigest` states, blowing the 5s `max_execution_time`.
-
-- **Symptom**: only the "What's happening now?" trend card fails — it spins, then shows
- "504 Query timed out...". Every sibling card stays fast.
-- **Where the signal lives**: a `clickhouse.query` span with `error.category="timeout"`,
- `db.elapsed_ms` around 5000, and `db.statement` showing `WHERE 1 ... GROUP BY ts HAVING
- ts >= ...`; the exception is Code 159 `TIMEOUT_EXCEEDED`. The contrast with the fast 200
- spans on the other endpoints is the tell.
-- **Diagnosis path**: one slow card among fast siblings -> open the timeout span -> read the
- SQL -> the time filter is in `HAVING` and `WHERE` has no `pickup_datetime` range -> a
- primary-key-pruning / predicate-pushdown anti-pattern (siblings put the window in `WHERE`).
-- **Fix**: restore the time window to `WHERE` (revert the fault commit); rebuild the backend.
-- **Reset**: the shared reset above.
-- **Instructor caveat**: severity scales with data volume and service size. On the full
- seeded dataset (~30M rows) on a workshop-tier service (which may be waking from idle) the
- 5s timeout fires reliably; on the tiny sample seed it is merely slower, not a hard 504.
- The client `send_receive_timeout` and the server `max_execution_time` are both 5s, so a
- socket-timeout race can occasionally surface as a 500 instead of the clean 504 — a
- property of the baseline settings, not the fault.
-
-### Fault 01 — map not loading (`fault/01-map-not-loading`)
-
-Commit message: "frontend: serve map geojson from /static asset path" (touches the fetch
-path in `frontend/src/ui/ZoneMap.tsx`). It fetches `/static/taxi_zones.geojson`, which does
-not exist. Key nuance: nginx's SPA fallback (`try_files ... /index.html`) returns HTTP 200
-with the HTML document rather than a 404, so `r.ok` passes and `r.json()` throws a
-`SyntaxError` like `Unexpected token '<'`.
-
-- **Symptom**: the map card is dead — base tiles render but there are no NYC polygons or
- choropleth, and a red inline error shows. Everything else is fine.
-- **Where the signal lives**: nothing in backend ClickStack — the asset never reaches
- FastAPI. The browser console shows the JSON parse error naming `/static/taxi_zones.geojson`;
- the Network tab shows that request returning `text/html` with status 200; the nginx access
- log shows the fallback.
-- **Diagnosis path**: backend traces are clean -> pivot to the browser console / Network tab
- -> a `.geojson` request returning 200 `text/html` -> recognize the SPA-fallback gotcha ->
- the file actually lives at the web root, `/taxi_zones.geojson`.
-- **Fix**: revert the fetch path (two lines) or `git revert` the fault commit; rebuild the
- frontend.
-- **Reset**: the shared reset above.
-- **Teaching point**: not every failure surfaces in backend traces, and a 404 can masquerade
- as a 200 behind an SPA fallback — so read the actual response body and content-type, not
- just the status code.
-- **Note (browser SDK):** with the HyperDX browser SDK enabled (module 05 overlay), the
- frontend now surfaces this in ClickStack itself — the `ZoneMap` parse failure is captured
- as a `console.error` span under `ServiceName=nyc-taxi-frontend`, paired with the resource
- span for the `text/html` 200. So the agent can localize it from telemetry without leaving
- ClickStack; the browser console / Network tab is the fallback, not the only path.
-
-**Sample agent response** (fault 01, via the ClickStack MCP):
-
-
-
-*Expected diagnosis: the agent ties the failure to the geojson request returning 200 `text/html` (SPA fallback), the resulting `JSON.parse` error captured under `nyc-taxi-frontend`, and recommends shipping the asset to `/static/` or guarding the `.json()` parse.*
-
-## Common failures
-
-- Not enough telemetry baseline for the agent to localize; module 05 must have run early.
-- Attendees jump to the fix before confirming root cause from evidence.
-- Fault symptom not yet visible because the stack was just brought up — or, for fault 03,
- because too little historical data is loaded. **Measured in the dry run:** on the default
- single-month seed (~3.17M rows) the WHERE-vs-HAVING fault is not observable — the full
- scan runs in ~300-560ms, indistinguishable from the baseline. Seed several months before
- demoing fault 03, or stick with fault 01 (which reproduces instantly) and treat fault 03
- as an at-scale illustration.
-- Fault 01 produces no backend trace at all, and the bad request returns 200 `text/html`
- via the SPA fallback rather than a 404; attendees may search traces forever. Nudge them
- to the browser console / Network tab, where the JSON parse error and the `text/html`
- response show.
-- Forgetting `--build` after checking out a fault branch, so the old image keeps running.
-
-## Reset steps
-
-- The shared stash-and-switch reset restores the complete app without discarding a
- participant's attempted fix.
-- Re-inject a fault by checking out one of `fault/01-map-not-loading` /
- `fault/02-zone-stats-500` / `fault/03-slow-dashboard` and rebuilding with the workshop
- plus otel compose files.
-- Per-fault symptoms, signals, and fixes are in the Answer key section above. Keep the
- answer key in this playbook only; it is never committed to the app repo.
diff --git a/workshops/build_workshop/playbook/content/docs/instructor/07-chat-langfuse.mdx b/workshops/build_workshop/playbook/content/docs/instructor/07-chat-langfuse.mdx
deleted file mode 100644
index 888ef2e..0000000
--- a/workshops/build_workshop/playbook/content/docs/instructor/07-chat-langfuse.mdx
+++ /dev/null
@@ -1,7 +0,0 @@
----
-title: Module moved
-description: The Chat and Langfuse instructor notes are now module 08.
----
-
-The Chat and Langfuse instructor notes moved to module 08. Continue to
-[08 Chat and Langfuse](/docs/instructor/08-chat-langfuse).
diff --git a/workshops/build_workshop/playbook/content/docs/instructor/08-break-and-fix.mdx b/workshops/build_workshop/playbook/content/docs/instructor/08-break-and-fix.mdx
deleted file mode 100644
index 18d4da4..0000000
--- a/workshops/build_workshop/playbook/content/docs/instructor/08-break-and-fix.mdx
+++ /dev/null
@@ -1,7 +0,0 @@
----
-title: Module moved
-description: The Break and fix instructor notes are now module 07.
----
-
-The Break and fix instructor notes moved to module 07. Continue to
-[07 Test, fail, and fix](/docs/instructor/07-break-and-fix).
diff --git a/workshops/build_workshop/playbook/content/docs/instructor/08-chat-langfuse.mdx b/workshops/build_workshop/playbook/content/docs/instructor/08-chat-langfuse.mdx
deleted file mode 100644
index 5d79d8e..0000000
--- a/workshops/build_workshop/playbook/content/docs/instructor/08-chat-langfuse.mdx
+++ /dev/null
@@ -1,34 +0,0 @@
----
-title: 08 Chat and Langfuse
-description: Instructor notes for module 08 — timing, talk track, common failures, and reset steps.
----
-
-Facilitator companion to the learner lesson
-[08 Chat and Langfuse](/docs/learner/08-chat-langfuse).
-
-## Timing
-
-About 15 minutes. The runtime LLM key and the Langfuse keys are already in `.env.workshop`
-from module 00, so this is mostly a backend restart plus the trace tour.
-
-## Talk track
-
-- The chat panel from module 02 becomes real, and every turn is traced.
-- Show a trace on the projector: prompt, completion, tokens, cost.
-
-## Common failures
-
-- Missing `OPENAI_API_KEY`; `POST /api/chat` returns 503 with a setup hint (the rest of
- the app is unaffected). An unfunded key errors on the model call.
-- Wrong `LANGFUSE_BASE_URL` region (`https://us.cloud.langfuse.com` vs
- `https://cloud.langfuse.com`), so traces do not appear.
-- Back end not restarted after filling `.env.workshop`.
-- The 2026-07 clean-room dry run covered this module; validated failure modes, timings, and human-gated steps were confirmed in the 2026-07 clean-room dry run.
-
-## Reset steps
-
-- Hand out a capped loaner LLM key from the pool.
-- Re-fill `OPENAI_API_KEY` / `LLM_MODEL` / `LLM_BASE_URL` and the three `LANGFUSE_*`
- values in `.env.workshop`, then
- `docker compose --env-file .env.workshop -f docker-compose.workshop.yml
- -f docker-compose.otel.yml up -d --build backend` so ClickStack telemetry stays enabled.
diff --git a/workshops/build_workshop/playbook/content/docs/instructor/09-wrap-up.mdx b/workshops/build_workshop/playbook/content/docs/instructor/09-wrap-up.mdx
deleted file mode 100644
index 4613688..0000000
--- a/workshops/build_workshop/playbook/content/docs/instructor/09-wrap-up.mdx
+++ /dev/null
@@ -1,28 +0,0 @@
----
-title: 09 Wrap-up
-description: Instructor notes for module 09 — timing, talk track, common failures, and reset steps.
----
-
-Facilitator companion to the learner lesson [09 Wrap-up](/docs/learner/09-wrap-up).
-
-## Timing
-
-About 10 minutes. Reserve time for two or three volunteer demos on the projector.
-
-## Talk track
-
-- Recap the arc: from a local app to a real-time, observable, AI-assisted platform on
- ClickHouse Cloud in one session.
-- Reinforce the take-home: the trial lasts 30 days and everything keeps running; the
- shortest path to value is repointing CDC at their own database.
-- TODO: expand, and prepare the closing pointers (ClickHouse docs, Agents, ClickStack).
-
-## Common failures
-
-- Volunteers' apps not in a demo-ready state; pre-select who will present.
-- TODO: add anything seen in the dry run.
-
-## Reset steps
-
-- Reset any shared state used for demos (the shared Postgres, projector channel).
-- TODO: confirm the shared-state teardown checklist.
diff --git a/workshops/build_workshop/playbook/content/docs/instructor/index.mdx b/workshops/build_workshop/playbook/content/docs/instructor/index.mdx
deleted file mode 100644
index 4ef74a5..0000000
--- a/workshops/build_workshop/playbook/content/docs/instructor/index.mdx
+++ /dev/null
@@ -1,75 +0,0 @@
----
-title: Instructor track
-description: Room-level run of show, shared-resource checklist, and per-module facilitator notes.
----
-
-This track is the facilitator's companion to the Learner track. Every learner module has
-a matching notes page here with four sections: **Timing**, **Talk track**,
-**Common failures**, and **Reset steps**. Read this landing page first for the
-room-level picture.
-
-The learner track also carries a [Running this workshop self-paced](/docs/learner/self-paced)
-page for people doing the workshop with no instructor; it sends them to these notes as
-their answer key (and to the module 07 fault answer key only as a last resort), so keep
-this track accurate for that audience too.
-
-## Run of show
-
-The session is three hours. The table below is the starting allocation; tune it during
-the dry run and record the final numbers here.
-
-| Module | Learner lesson | Budget | Notes |
-|---|---|---|---|
-| 00 | Setup | 25 min | Fire-and-wait steps (service create, `docker compose up`) start before the talk |
-| 01 | Base app | 5 min | Nothing to build; keep it short |
-| 02 | ClickHouse Cloud | 15 min | First "wow" on query speed |
-| 03 | Real-time CDC | 20 min | Shared managed Postgres is a room-wide dependency |
-| 04 | ClickHouse Agents | 10 min | Beta tool; have a fallback question ready |
-| 05 | ClickStack | 15 min | Telemetry needs time to accumulate before module 07 |
-| 06 | AI SRE | 15 min | MCP OAuth is the fragile moment; pre-stage config |
-| 07 | Break and fix | 20 min | Direct payoff from 06/06b; hard-stop management matters |
-| 08 | Chat and Langfuse | 15 min | Keys already set in module 00; restart plus trace tour |
-| 09 | Wrap-up | 10 min | Volunteers demo; reset any shared state |
-
-These budgets total about 2 hours 30 minutes of hands-on work; the remaining time in the
-three-hour session covers the opening, transitions between modules, and the finale demos.
-
-
- The budgets above are the starting allocation. Confirm each against the timed dry run,
- and set a hard-pivot time for the incident lab (module 07) so module 08 and the wrap-up
- are never squeezed.
-
-
-## Shared-resource checklist
-
-Some resources are shared across the whole room. Confirm each is provisioned and healthy
-before doors open:
-
-- **Managed Postgres for CDC** — the shared source database every attendee's ClickPipe
- reads from (module 03). TODO: confirm host, replication user, publication/slot, and
- per-attendee isolation.
-- **Loaner ClickHouse Cloud services** — a small pool for attendees whose trial fails.
- TODO: pool size and distribution method.
-- **Runtime LLM key pool** — spend-capped fallback keys for the in-app chat (module 08).
-- **Projector and shared channel** — for the finale demos.
-- **Venue network** — enough symmetric bandwidth, no captive portal, OAuth-friendly.
-
-## Setup clinic
-
-Doors open early for a staffed setup clinic. Anyone whose prework did not fully pass
-should arrive then. TODO: confirm the clinic start time and staffing.
-
-## Per-module notes
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/workshops/build_workshop/playbook/content/docs/instructor/meta.json b/workshops/build_workshop/playbook/content/docs/instructor/meta.json
deleted file mode 100644
index f26058f..0000000
--- a/workshops/build_workshop/playbook/content/docs/instructor/meta.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "title": "Instructor track",
- "description": "Timing, talk tracks, common failures, and reset steps for facilitators.",
- "root": true,
- "icon": "Presentation",
- "pages": [
- "index",
- "00-setup",
- "01-clickhouse-cloud",
- "02-base-app",
- "03-realtime-cdc",
- "04-clickhouse-agents",
- "05-clickstack",
- "06-ai-sre",
- "06b-ai-sre-librechat",
- "07-break-and-fix",
- "08-chat-langfuse",
- "09-wrap-up"
- ]
-}
diff --git a/workshops/build_workshop/playbook/content/docs/learner/00-setup.mdx b/workshops/build_workshop/playbook/content/docs/learner/00-setup.mdx
deleted file mode 100644
index b54350e..0000000
--- a/workshops/build_workshop/playbook/content/docs/learner/00-setup.mdx
+++ /dev/null
@@ -1,294 +0,0 @@
----
-title: 00 Setup
-description: Create the workshop services, install the CLIs, connect your agent once, and start the local app.
----
-
-## Outcome
-
-In about **25 minutes** you will have:
-
-- a ClickHouse Cloud service and organization API key;
-- `clickhousectl` and the `clickhouse` database client;
-- ClickHouse skills plus ClickHouse and ClickStack MCP connections in your coding agent;
-- Langfuse and OpenAI keys; and
-- the app healthy at [localhost:8080](http://localhost:8080).
-
-Run every command in this module from the app directory unless a step says otherwise.
-
-## Step 1 — Check prerequisites
-
-You need Docker with at least 6 GB of memory, Git, Node.js 20+, Python 3, and one MCP-capable
-coding agent: Claude Code, Cursor, Codex CLI, or Windsurf.
-
-```bash
-docker version
-git --version
-node --version
-python3 --version
-```
-
-
- Corporate policy can block MCP installation or browser OAuth. Use a personal machine or
- ask your administrator if the OAuth step in Step 7 cannot open.
-
-
-## Step 2 — Clone the repo and switch to the workshop branch
-
-```bash
-git clone https://github.com/ClickHouse/ClickHouse_Demos.git
-cd ClickHouse_Demos
-git switch build-workshop-v1
-cd workshops/build_workshop/app
-cp .env.workshop.example .env.workshop
-```
-
-Keep this terminal in `ClickHouse_Demos/workshops/build_workshop/app`. The preflight script
-is `./preflight.sh` **inside this directory**. Stay on `build-workshop-v1` except during
-Module 07 fault tests. Confirm the branch now:
-
-```bash
-git branch --show-current
-```
-
-Expected: `build-workshop-v1`.
-
-## Step 3 — Create a ClickHouse Cloud account and API key
-
-1. Sign in or start a trial at [console.clickhouse.cloud](https://console.clickhouse.cloud).
-2. Open **API Keys**, create an **Admin** organization key, and save its Key ID and secret.
-
-The secret is displayed once. Store it outside the repository; do not put it in
-`.env.workshop`.
-
-## Step 4 — Install `clickhousectl` and ClickHouse client
-
-```bash
-curl https://clickhouse.com/cli | sh
-export PATH="$HOME/.local/bin:$PATH"
-clickhousectl --version
-
-# Installs the stable ClickHouse binary and creates ~/.local/bin/clickhouse.
-clickhousectl local use stable
-clickhouse client --version
-```
-
-Add `~/.local/bin` to your shell profile if a new terminal cannot find either command.
-
-## Step 5 — Authenticate `clickhousectl`
-
-Use the API key from Step 3. The interactive form keeps the secret out of shell history:
-
-```bash
-clickhousectl cloud auth login --interactive
-```
-
-Trusted automation can use the explicit form the CLI expects:
-
-```bash
-clickhousectl cloud auth login --api-key --api-secret
-```
-
-Verify both saved credentials and Cloud access:
-
-```bash
-clickhousectl cloud auth status
-clickhousectl cloud org list
-```
-
-`clickhousectl` stores project credentials under `.clickhouse/` in the current directory.
-Keep running Cloud commands from the app directory and never commit or share that folder.
-
-## Step 6 — Create the ClickHouse service
-
-Choose the region you will also use for Postgres in Module 03. Replace the example region
-if needed:
-
-```bash
-clickhousectl cloud service create \
- --name my-workshop-clickhouse \
- --provider aws \
- --region ap-southeast-1 \
- --min-replica-memory-gb 8 \
- --max-replica-memory-gb 8 \
- --num-replicas 1 \
- --idle-scaling true \
- --idle-timeout-minutes 15
-```
-
-Save the returned **service ID** and one-time **default-user password**. Check readiness:
-
-```bash
-clickhousectl cloud service list
-clickhousectl cloud service get
-```
-
-From the service **Connect** dialog, copy the hostname and verify the local client. The
-`--password` flag prompts without echoing the password:
-
-```bash
-clickhouse client \
- --host \
- --secure \
- --user default \
- --password \
- --query "SELECT version(), currentUser()"
-```
-
-Expected: one row containing the ClickHouse version and `default`.
-
-## Step 7 — Configure agent skills and both MCP servers once
-
-These integrations have distinct jobs:
-
-| Integration | Purpose | Used in |
-|---|---|---|
-| ClickHouse skills | Review schema and SQL against ClickHouse practices | Modules 01 and 03 |
-| ClickHouse MCP (`/mcp`) | Read your service with `SELECT` queries | Modules 01 and 04 |
-| ClickStack MCP (`/clickstack`) | Search telemetry and save SRE artifacts | Modules 06 and 07 |
-
-First install the skills for your agent:
-
-```bash
-clickhousectl skills --agent
-```
-
-In ClickHouse Cloud, open your service's **Connect** dialog and enable **Connect with
-MCP**. Then add **both** endpoints and complete browser OAuth:
-
-
-
-
-```bash
-claude mcp add --transport http clickhouse-cloud https://mcp.clickhouse.cloud/mcp
-claude mcp add --transport http clickstack https://mcp.clickhouse.cloud/clickstack
-claude mcp login clickhouse-cloud
-claude mcp login clickstack
-```
-
-
-
-
-```bash
-codex mcp add clickhouse-cloud --url https://mcp.clickhouse.cloud/mcp
-codex mcp add clickstack --url https://mcp.clickhouse.cloud/clickstack
-codex mcp login clickhouse-cloud
-codex mcp login clickstack
-```
-
-
-
-
-Add this once to `.cursor/mcp.json`, then authorize both servers in Cursor settings:
-
-```jsonc
-{
- "mcpServers": {
- "clickhouse-cloud": { "url": "https://mcp.clickhouse.cloud/mcp" },
- "clickstack": { "url": "https://mcp.clickhouse.cloud/clickstack" }
- }
-}
-```
-
-
-
-
-Add this once to `~/.codeium/windsurf/mcp_config.json`, then authorize both servers:
-
-```jsonc
-{
- "mcpServers": {
- "clickhouse-cloud": {
- "command": "npx",
- "args": ["-y", "mcp-remote", "https://mcp.clickhouse.cloud/mcp"]
- },
- "clickstack": {
- "command": "npx",
- "args": ["-y", "mcp-remote", "https://mcp.clickhouse.cloud/clickstack"]
- }
- }
-}
-```
-
-
-
-
-Verify the ClickHouse connection now:
-
-```text
-Use the clickhouse-cloud MCP to list my databases. Run read-only queries only.
-```
-
-An empty ClickStack result is expected until Module 05 sends telemetry. Do not repeat MCP
-setup later; Modules 06 and 07 use the `clickstack` connection configured here.
-
-## Step 8 — Create Langfuse and OpenAI keys
-
-Langfuse records the AI chat traces used in Module 08.
-
-1. Create a project at [US Langfuse Cloud](https://us.cloud.langfuse.com) or
- [EU Langfuse Cloud](https://cloud.langfuse.com).
-2. Create a project API key pair and save the public and secret keys.
-3. Create a project-scoped API key at
- [platform.openai.com/api-keys](https://platform.openai.com/api-keys) and enable billing.
-
-Use the Langfuse URL for the region where you created the project:
-
-```bash
-LANGFUSE_PUBLIC_KEY=pk-lf-...
-LANGFUSE_SECRET_KEY=sk-lf-...
-LANGFUSE_BASE_URL=https://us.cloud.langfuse.com
-
-OPENAI_API_KEY=sk-...
-```
-
-Keep the model and API-base defaults already present in `.env.workshop`.
-
-## Step 9 — Fill `.env.workshop`
-
-Copy the service values from Step 6 and the keys from Step 8 into the existing fields:
-
-```bash
-CLICKHOUSE_HOST=
-CLICKHOUSE_PORT=8443
-CLICKHOUSE_USER=default
-CLICKHOUSE_PASSWORD=
-CLICKHOUSE_DATABASE=nyc_tlc_data
-CLICKHOUSE_SECURE=true
-
-LANGFUSE_PUBLIC_KEY=pk-lf-...
-LANGFUSE_SECRET_KEY=sk-lf-...
-LANGFUSE_BASE_URL=https://us.cloud.langfuse.com
-OPENAI_API_KEY=sk-...
-```
-
-Do not export these names in the shell: exported values override the env file.
-
-## Step 10 — Run preflight and start the app
-
-The commands below enter the correct directory from anywhere inside the cloned repository:
-
-```bash
-cd "$(git rev-parse --show-toplevel)/workshops/build_workshop/app"
-./preflight.sh
-```
-
-Continue only when the last line is `Overall: READY`. Apply any printed fix and rerun the
-script. Then start the stack:
-
-```bash
-docker compose --env-file .env.workshop -f docker-compose.workshop.yml up -d
-docker compose --env-file .env.workshop -f docker-compose.workshop.yml ps
-```
-
-Within about two minutes, services should report `healthy` and the app should load at
-[localhost:8080](http://localhost:8080). Empty dashboards are correct until Module 01.
-
-## Completion check
-
-- `clickhousectl cloud service get ` reports the service is ready.
-- `clickhouse client ... --query "SELECT version()"` succeeds.
-- Your agent lists databases through the ClickHouse MCP.
-- `./preflight.sh` ends with `Overall: READY` from the app directory.
-- Docker services are healthy and the local app loads.
-
-Continue to [01 ClickHouse Cloud](/docs/learner/01-clickhouse-cloud).
diff --git a/workshops/build_workshop/playbook/content/docs/learner/01-clickhouse-cloud.mdx b/workshops/build_workshop/playbook/content/docs/learner/01-clickhouse-cloud.mdx
deleted file mode 100644
index b05c4bf..0000000
--- a/workshops/build_workshop/playbook/content/docs/learner/01-clickhouse-cloud.mdx
+++ /dev/null
@@ -1,341 +0,0 @@
----
-title: 01 ClickHouse Cloud
-description: Create the taxi schema, seed historical data, and verify it with the client, skills, and ClickHouse MCP.
----
-
-## Outcome
-
-In about **15 minutes**, you will create the taxi schema, load one month of public NYC
-taxi data, and see the Historical dashboard return real results.
-
-Prerequisite: Module 00 is complete and your terminal is in
-`ClickHouse_Demos/workshops/build_workshop/app`.
-
-## Step 1 — Verify the client connection
-
-Replace the two placeholders with the service hostname and password saved in Module 00:
-
-```bash
-clickhouse client \
- --host \
- --port 9440 \
- --secure \
- --user default \
- --password '' \
- --query "SELECT version(), currentUser()"
-```
-
-Continue only when the query returns one row.
-
-## Step 2 — Create the schema
-
-This is the complete schema command. Copy it from this page; do not open a local SQL file.
-
-```bash
-clickhouse client \
- --host \
- --port 9440 \
- --secure \
- --user default \
- --password '' \
- --multiquery <<'SQL'
-CREATE DATABASE IF NOT EXISTS nyc_tlc_data;
-
-CREATE TABLE IF NOT EXISTS nyc_tlc_data.taxi_zones
-(
- location_id UInt16,
- zone String,
- borough String,
- subregion String
-)
-ENGINE = MergeTree
-ORDER BY (location_id);
-
-CREATE TABLE IF NOT EXISTS nyc_tlc_data.fhv_trips
-(
- hvfhs_license_num String,
- company String,
- dispatching_base_num Nullable(String),
- originating_base_num Nullable(String),
- request_datetime Nullable(DateTime('UTC')),
- on_scene_datetime Nullable(DateTime('UTC')),
- pickup_datetime DateTime('UTC'),
- dropoff_datetime DateTime('UTC'),
- pickup_location_id Nullable(UInt16),
- dropoff_location_id Nullable(UInt16),
- pickup_borough Nullable(String),
- dropoff_borough Nullable(String),
- trip_miles Nullable(Float64),
- trip_time Nullable(UInt32),
- base_passenger_fare Nullable(Float64),
- tolls Nullable(Float64),
- black_car_fund Nullable(Float64),
- sales_tax Nullable(Float64),
- congestion_surcharge Nullable(Float64),
- airport_fee Nullable(Float64),
- tips Nullable(Float64),
- driver_pay Nullable(Float64),
- shared_request Nullable(Bool),
- shared_match Nullable(Bool),
- access_a_ride Nullable(Bool),
- wav_request Nullable(Bool),
- wav_match Nullable(Bool),
- legacy_shared_ride Nullable(UInt16),
- filename String
-)
-ENGINE = MergeTree
-ORDER BY (company, pickup_datetime);
-
-CREATE TABLE IF NOT EXISTS nyc_tlc_data.taxi_trips
-(
- car_type String,
- vendor_id Nullable(UInt16),
- pickup_datetime DateTime('UTC'),
- dropoff_datetime DateTime('UTC'),
- pickup_location_id Nullable(UInt16),
- dropoff_location_id Nullable(UInt16),
- pickup_borough Nullable(String),
- dropoff_borough Nullable(String),
- passenger_count Nullable(UInt16),
- trip_distance Nullable(Float64),
- rate_code_id Nullable(UInt16),
- store_and_fwd_flag Nullable(Bool),
- payment_type Nullable(UInt16),
- fare_amount Nullable(Float64),
- extra Nullable(Float64),
- mta_tax Nullable(Float64),
- tip_amount Nullable(Float64),
- tolls_amount Nullable(Float64),
- improvement_surcharge Nullable(Float64),
- total_amount Nullable(Float64),
- congestion_surcharge Nullable(Float64),
- airport_fee Nullable(Float64),
- trip_type Nullable(UInt16),
- ehail_fee Nullable(Float64),
- filename String
-)
-ENGINE = MergeTree
-ORDER BY (car_type, pickup_datetime);
-
-CREATE OR REPLACE VIEW nyc_tlc_data.fhv_trips_expanded AS
-SELECT
- *,
- trip_time / 60 AS trip_minutes,
- trip_miles / trip_time * 3600 AS mph,
- (
- trip_miles >= 0.2
- AND trip_miles < 100
- AND trip_time >= 60
- AND trip_time < 60 * 60 * 4
- AND mph >= 1
- AND mph < 100
- AND base_passenger_fare >= 2
- AND base_passenger_fare < 2000
- AND driver_pay >= 1
- AND driver_pay < 2000
- ) AS reasonable_time_distance_fare,
- (
- shared_request = false
- AND access_a_ride = false
- AND wav_request = false
- ) AS solo_non_special_request,
- coalesce(tolls, 0) +
- coalesce(black_car_fund, 0) +
- coalesce(sales_tax, 0) +
- coalesce(congestion_surcharge, 0) +
- coalesce(airport_fee, 0) AS extra_charges
-FROM nyc_tlc_data.fhv_trips;
-
-CREATE OR REPLACE VIEW nyc_tlc_data.taxi_trips_expanded AS
-SELECT
- *,
- (dropoff_datetime - pickup_datetime) / 60 AS trip_minutes,
- trip_distance / (dropoff_datetime - pickup_datetime) * 3600 AS mph,
- (
- trip_distance >= 0.2
- AND trip_distance < 100
- AND trip_minutes >= 1
- AND trip_minutes < 240
- AND mph >= 1
- AND mph < 100
- AND fare_amount >= 2
- AND fare_amount < 2000
- AND total_amount >= 2
- AND total_amount < 2000
- ) AS reasonable_time_distance_fare,
- coalesce(extra, 0) +
- coalesce(mta_tax, 0) +
- coalesce(tolls_amount, 0) +
- coalesce(improvement_surcharge, 0) +
- coalesce(congestion_surcharge, 0) +
- coalesce(airport_fee, 0) +
- coalesce(ehail_fee, 0) AS extra_charges
-FROM nyc_tlc_data.taxi_trips;
-SQL
-```
-
-Verify the objects:
-
-```bash
-clickhouse client \
- --host \
- --port 9440 \
- --secure \
- --user default \
- --password '' \
- --query "SHOW TABLES FROM nyc_tlc_data"
-```
-
-Expected: `taxi_zones`, `taxi_trips`, `fhv_trips`, and both expanded views. The CDC
-materialized view is intentionally created later, after Module 03 creates its source table.
-
-## Step 3 — Seed public historical data
-
-The command is safe to rerun: each insert has a count guard.
-
-```bash
-clickhouse client \
- --host \
- --port 9440 \
- --secure \
- --user default \
- --password '' \
- --multiquery <<'SQL'
-INSERT INTO nyc_tlc_data.taxi_zones (location_id, zone, borough, subregion)
-SELECT LocationID, Zone, Borough, service_zone
-FROM url(
- 'https://d37ci6vzurychx.cloudfront.net/misc/taxi_zone_lookup.csv',
- 'CSVWithNames',
- 'LocationID UInt16, Borough String, Zone String, service_zone String'
-)
-WHERE (SELECT count() FROM nyc_tlc_data.taxi_zones) = 0;
-
-INSERT INTO nyc_tlc_data.taxi_trips (
- car_type, vendor_id, pickup_datetime, dropoff_datetime, pickup_location_id,
- dropoff_location_id, pickup_borough, dropoff_borough, passenger_count,
- trip_distance, rate_code_id, store_and_fwd_flag, payment_type, fare_amount,
- extra, mta_tax, tip_amount, tolls_amount, improvement_surcharge,
- total_amount, congestion_surcharge, airport_fee, filename
-)
-SELECT
- 'yellow',
- VendorID,
- tpep_pickup_datetime,
- tpep_dropoff_datetime,
- PULocationID,
- DOLocationID,
- multiIf(
- PULocationID IN (SELECT location_id FROM nyc_tlc_data.taxi_zones WHERE borough = 'Bronx'), 'Bronx',
- PULocationID IN (SELECT location_id FROM nyc_tlc_data.taxi_zones WHERE borough = 'Brooklyn'), 'Brooklyn',
- PULocationID IN (SELECT location_id FROM nyc_tlc_data.taxi_zones WHERE borough = 'Manhattan'), 'Manhattan',
- PULocationID IN (SELECT location_id FROM nyc_tlc_data.taxi_zones WHERE borough = 'Queens'), 'Queens',
- PULocationID IN (SELECT location_id FROM nyc_tlc_data.taxi_zones WHERE borough = 'Staten Island'), 'Staten Island',
- PULocationID IN (SELECT location_id FROM nyc_tlc_data.taxi_zones WHERE borough = 'EWR'), 'EWR',
- null
- ),
- multiIf(
- DOLocationID IN (SELECT location_id FROM nyc_tlc_data.taxi_zones WHERE borough = 'Bronx'), 'Bronx',
- DOLocationID IN (SELECT location_id FROM nyc_tlc_data.taxi_zones WHERE borough = 'Brooklyn'), 'Brooklyn',
- DOLocationID IN (SELECT location_id FROM nyc_tlc_data.taxi_zones WHERE borough = 'Manhattan'), 'Manhattan',
- DOLocationID IN (SELECT location_id FROM nyc_tlc_data.taxi_zones WHERE borough = 'Queens'), 'Queens',
- DOLocationID IN (SELECT location_id FROM nyc_tlc_data.taxi_zones WHERE borough = 'Staten Island'), 'Staten Island',
- DOLocationID IN (SELECT location_id FROM nyc_tlc_data.taxi_zones WHERE borough = 'EWR'), 'EWR',
- null
- ),
- passenger_count,
- trip_distance,
- RatecodeID,
- multiIf(store_and_fwd_flag = 'Y', true, store_and_fwd_flag = 'N', false, null),
- payment_type,
- fare_amount,
- extra,
- mta_tax,
- tip_amount,
- tolls_amount,
- improvement_surcharge,
- total_amount,
- congestion_surcharge,
- airport_fee,
- 'yellow_tripdata_2022-07.parquet'
-FROM url(
- 'https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2022-07.parquet',
- 'Parquet'
-)
-WHERE (
- SELECT count() FROM nyc_tlc_data.taxi_trips
- WHERE filename = 'yellow_tripdata_2022-07.parquet'
-) = 0;
-SQL
-```
-
-Verify the load:
-
-```bash
-clickhouse client \
- --host \
- --port 9440 \
- --secure \
- --user default \
- --password '' \
- --query "
- SELECT 'taxi_zones' AS table, count() AS rows FROM nyc_tlc_data.taxi_zones
- UNION ALL
- SELECT 'taxi_trips', count() FROM nyc_tlc_data.taxi_trips
- "
-```
-
-Expected: **265** zones and roughly **3.2 million** trips.
-
-## Step 4 — Use the skills and ClickHouse MCP
-
-Run both prompts in the agent configured in Module 00.
-
-```text
-Use the ClickHouse best-practices skill to review the taxi_trips ORDER BY key.
-Explain which workshop filters it supports and one production tradeoff. Do not change the schema.
-```
-
-```text
-Use the clickhouse-cloud MCP, with read-only queries, to verify the taxi_trips row count
-and report the busiest pickup hour.
-```
-
-The first answer should discuss `car_type, pickup_datetime`; the second must cite a query
-result from your service. This explicitly verifies both the installed skill and MCP connection.
-
-## Step 5 — Restart and query the app
-
-```bash
-cd "$(git rev-parse --show-toplevel)/workshops/build_workshop/app"
-docker compose --env-file .env.workshop -f docker-compose.workshop.yml up -d
-docker compose --env-file .env.workshop -f docker-compose.workshop.yml ps
-```
-
-Open the Historical dashboard, then try this dimension join in the Cloud SQL console or
-your local client:
-
-```sql
-SELECT
- z.zone AS pickup_zone,
- z.borough,
- count() AS trips,
- round(avg(t.fare_amount), 2) AS avg_fare
-FROM nyc_tlc_data.taxi_trips AS t
-INNER ANY JOIN nyc_tlc_data.taxi_zones AS z
- ON t.pickup_location_id = z.location_id
-GROUP BY pickup_zone, z.borough
-ORDER BY trips DESC
-LIMIT 10;
-```
-
-`ANY JOIN` is appropriate here because `location_id` is unique and only one matching
-zone row is needed.
-
-## Completion check
-
-- The verification query reports 265 zones and about 3.2 million trips.
-- The skill review explains the ordering-key tradeoff.
-- The ClickHouse MCP returns results grounded in your service.
-- The Historical dashboard renders data.
-
-Continue to [02 Base app](/docs/learner/02-base-app).
diff --git a/workshops/build_workshop/playbook/content/docs/learner/02-base-app.mdx b/workshops/build_workshop/playbook/content/docs/learner/02-base-app.mdx
deleted file mode 100644
index 02941ec..0000000
--- a/workshops/build_workshop/playbook/content/docs/learner/02-base-app.mdx
+++ /dev/null
@@ -1,87 +0,0 @@
----
-title: 02 Base app
-description: Tour the running NYC-taxi app, now that ClickHouse is seeded, so you understand its shape before you extend it.
----
-
-## Starting point
-
-You are on `build-workshop-v1` (selected in Module 00) — no checkout needed. Budget
-about **5 minutes**.
-The workshop stack you started in module 00 should still be running.
-
-Prerequisites: modules 00 and 01 complete (the stack healthy, ClickHouse seeded), the
-front end reachable at `http://localhost:8080/`.
-
-## Why
-
-You cannot extend what you have not seen. Now that your warehouse is seeded (module 01),
-spend a few minutes understanding the app's shape: what the two dashboards are for, how the
-front end, back end, and databases fit together, and where the AI chat panel lives. This is
-the only module with nothing to build, and that is deliberate — you orient here, then
-extend the app with live data, agents, and observability in the modules that follow.
-
-## Goal
-
-Be able to describe, in one sentence each, what the Ops dashboard is for, what the
-Historical dashboard is for, and where the app's data comes from (historical data you
-seeded into ClickHouse Cloud in module 01; live data you stream in via CDC in module 03).
-
-## Step 1 — Open the Ops dashboard
-
-### `frontend/`
-
-Open `http://localhost:8080/`. This is the Ops dashboard: the cards, filters, and layout
-for live operational metrics (recent trips, active zones, near-real-time aggregates). It
-stays empty for now — the live view fills in only once you stream real-time rows via CDC
-in module 03. The historical data you seeded in module 01 shows up on the Historical
-dashboard next.
-
-## Step 2 — Open the Historical dashboard
-
-### `frontend/`
-
-Open `http://localhost:8080/historical`. This dashboard is built for large-range
-aggregations and drilldowns over historical trip data — and it now renders, because you
-seeded a month of trips into ClickHouse Cloud in module 01. Try a wide date range over
-that month and the filter controls, and watch the queries come back in well under a second.
-
-## Step 3 — Find the chat panel and trace the data flow
-
-### `backend/`
-
-Locate the AI chat panel in the UI (you wire it to a real model in module 08). Then look
-at how the front end calls the FastAPI back end, and how the back end is wired to query
-ClickHouse — the service it points at is your Cloud service, connected and seeded in
-module 01.
-
-```text
-React front end -> FastAPI back end -> ClickHouse Cloud (connected + seeded in module 01)
- -> Postgres (operational source; CDC in module 03)
-```
-
-Ask your coding agent to summarize the analytics endpoints:
-
-```text
-Read the FastAPI backend and list each analytics endpoint, what it returns, and which table it reads from.
-```
-
-## How to verify you are done
-
-- You have opened both dashboards: the Historical dashboard renders from the data you
- seeded in module 01, and the Ops (Live) dashboard is empty until CDC starts in module 03
- — that is expected.
-- You can name where the app's data comes from (historical seed in ClickHouse Cloud from
- module 01; live CDC in module 03).
-- You know where the chat panel is, even though it is not wired to a model yet.
-
-## Wrap-up
-
-You have a mental model of the app: two dashboards, a FastAPI API, a source Postgres,
-and a chat panel waiting to be connected. Every later module changes one part of this
-picture.
-
-## End state
-
-You understand the running app. Continue to
-[03 Real-time CDC](/docs/learner/03-realtime-cdc) to stream live rows into the Ops
-dashboard.
diff --git a/workshops/build_workshop/playbook/content/docs/learner/03-realtime-cdc.mdx b/workshops/build_workshop/playbook/content/docs/learner/03-realtime-cdc.mdx
deleted file mode 100644
index a22caca..0000000
--- a/workshops/build_workshop/playbook/content/docs/learner/03-realtime-cdc.mdx
+++ /dev/null
@@ -1,174 +0,0 @@
----
-title: 03 Real-time CDC
-description: Create Postgres and a ClickPipe with clickhousectl, then feed live rows into the taxi table.
----
-
-## Outcome
-
-In about **20 minutes**, live trips will flow:
-
-```text
-Postgres managed by ClickHouse → ClickPipe → default.realtime_trips
-→ materialized view → nyc_tlc_data.taxi_trips → Ops dashboard
-```
-
-Prerequisites: Modules 00–02 are complete, and your terminal is in
-`ClickHouse_Demos/workshops/build_workshop/app`.
-
-## Step 1 — Create Postgres
-
-Use the same region as your ClickHouse service:
-
-```bash
-clickhousectl cloud postgres create \
- --name my-workshop-postgres \
- --provider aws \
- --region ap-southeast-1 \
- --size c6gd.large \
- --pg-version 17 \
- --ha-type none
-```
-
-Save the returned **Postgres ID**, **hostname**, and one-time `postgres` password.
-
-```bash
-clickhousectl cloud postgres list
-clickhousectl cloud postgres get
-```
-
-If the password is lost, create a new one:
-
-```bash
-clickhousectl cloud postgres reset-password
-```
-
-## Step 2 — Start the trip writer
-
-The app starts with the valid local literal `PGHOST=postgres`. In `.env.workshop`,
-replace that value and the local credentials with the values returned by
-`clickhousectl`:
-
-```bash
-PGHOST=replace-with-hostname-from-clickhousectl
-PGPORT=5432
-PGDATABASE=postgres
-PGUSER=postgres
-PGPASSWORD=replace-with-one-time-password
-PGSSLMODE=require
-PG_PUBLICATION=pub_taxi
-```
-
-Start the writer and follow its log:
-
-```bash
-cd "$(git rev-parse --show-toplevel)/workshops/build_workshop/app"
-docker compose --env-file .env.workshop -f docker-compose.workshop.yml up -d pg-trip-writer
-docker compose --env-file .env.workshop -f docker-compose.workshop.yml logs -f pg-trip-writer
-```
-
-Provisioning can take a few minutes. Continue when the log repeats:
-
-```text
-[loadgen] ensured realtime_trips table exists
-[loadgen] created publication pub_taxi for public.realtime_trips
-[loadgen] inserted 10 trips @ ...
-```
-
-Press **Ctrl-C** to stop following the log; the container keeps running.
-
-## Step 3 — Create the ClickPipe
-
-Replace the ClickHouse service ID and Postgres values:
-
-```bash
-clickhousectl cloud clickpipe create postgres \
- --name taxi-cdc \
- --host \
- --port 5432 \
- --pg-database postgres \
- --username postgres \
- --password '' \
- --publication-name pub_taxi \
- --replication-mode cdc \
- --table-mapping "public.realtime_trips:realtime_trips"
-```
-
-A CLI-created ClickPipe places this target at `default.realtime_trips`. Check its state:
-
-```bash
-clickhousectl cloud clickpipe list
-clickhousectl cloud clickpipe get
-```
-
-Continue when the pipe is running and the initial snapshot has created the target table.
-
-## Step 4 — Create the CDC materialized view
-
-First verify the exact source table:
-
-```bash
-clickhousectl cloud service query --id --query "
- SELECT database, name, engine
- FROM system.tables
- WHERE name = 'realtime_trips'
-"
-```
-
-Expected: `default.realtime_trips`. Now create one incremental materialized view; there is
-no variant to select or file to edit:
-
-```bash
-clickhousectl cloud service query --id --query "
-CREATE MATERIALIZED VIEW IF NOT EXISTS nyc_tlc_data.realtime_trips_to_taxi_trips_mv
-TO nyc_tlc_data.taxi_trips
-AS
-SELECT
- car_type,
- CAST(vendor_id AS UInt16) AS vendor_id,
- CAST(pickup_datetime AS DateTime('UTC')) AS pickup_datetime,
- CAST(dropoff_datetime AS DateTime('UTC')) AS dropoff_datetime,
- CAST(pickup_location_id AS UInt16) AS pickup_location_id,
- CAST(dropoff_location_id AS UInt16) AS dropoff_location_id,
- CAST(passenger_count AS UInt16) AS passenger_count,
- trip_distance,
- CAST(payment_type AS UInt16) AS payment_type,
- fare_amount,
- tip_amount,
- total_amount,
- 'realtime_cdc' AS filename
-FROM default.realtime_trips
-WHERE _peerdb_is_deleted = 0
-"
-```
-
-Use the installed best-practices skill to check the design:
-
-```text
-Use the ClickHouse best-practices skill to review this incremental materialized view.
-Confirm why it processes inserted blocks and why FINAL is not part of this append-only path.
-```
-
-## Step 5 — Prove rows are moving
-
-Run this twice, about 15 seconds apart:
-
-```bash
-clickhousectl cloud service query --id --query "
- SELECT
- (SELECT count() FROM default.realtime_trips) AS clickpipe_rows,
- (SELECT count() FROM nyc_tlc_data.taxi_trips
- WHERE filename = 'realtime_cdc') AS dashboard_rows
-"
-```
-
-Both counts should increase. Then open [localhost:8080](http://localhost:8080), set the
-Ops dashboard interval to `1m` and auto-refresh to `5s`.
-
-## Completion check
-
-- The writer log shows repeated inserts.
-- `clickhousectl cloud clickpipe get ...` reports a running pipe.
-- `default.realtime_trips` and the dashboard-row count both increase.
-- The Ops dashboard updates without a manual refresh.
-
-Continue to [04 ClickHouse Agents](/docs/learner/04-clickhouse-agents).
diff --git a/workshops/build_workshop/playbook/content/docs/learner/04-clickhouse-agents.mdx b/workshops/build_workshop/playbook/content/docs/learner/04-clickhouse-agents.mdx
deleted file mode 100644
index a1fe77f..0000000
--- a/workshops/build_workshop/playbook/content/docs/learner/04-clickhouse-agents.mdx
+++ /dev/null
@@ -1,87 +0,0 @@
----
-title: 04 ClickHouse Agents
-description: Create a ClickHouse Agent over your taxi data and explore it conversationally at ai.clickhouse.cloud.
----
-
-## Starting point
-
-You are on `build-workshop-v1` — no checkout needed. Budget about **10 minutes**. This
-module is entirely in the ClickHouse Cloud console; there is nothing to run locally.
-
-Prerequisites: modules 01 and 03 complete (seeded history plus a live CDC stream in your
-Cloud service).
-
-## Why
-
-You have a rich dataset now. ClickHouse Agents let you ask questions of it in plain
-language and get grounded SQL and answers back — conversational BI without writing every
-query yourself. This is the fastest way to explore the data you just assembled.
-
-## Goal
-
-A ClickHouse Agent created over your taxi tables that answers at least one non-trivial
-analytical question, showing the SQL it generated.
-
-## Step 1 — Open ClickHouse Agents
-
-Two entry points, both using your existing ClickHouse Cloud identity:
-
-- Console - your service -> **ClickHouse agents** -> **Launch**
-- Or go directly to [ai.clickhouse.cloud](https://ai.clickhouse.cloud).
-
-
-
-*Find ClickHouse Agents in the left sidebar of the Cloud console (or go directly to ai.clickhouse.cloud).*
-
-## Step 2 — Create an agent over your taxi data
-
-Click **Create New Agent**, give it a **Name**, **Instructions** (for example: answer
-questions about the NYC taxi data in `nyc_tlc_data`), and pick a **Model**.
-
-Add a tool called **ClickHouse** and confirm it shows as **Connected** — this is what
-lets the agent introspect your schema and run SQL against your service. Without a
-connected ClickHouse tool the agent has nothing to query.
-
-Then start chatting. The agent introspects your schema so its SQL is grounded.
-
-## Step 3 — Explore conversationally
-
-Ask progressively harder questions and read the SQL it generates. For example:
-
-```text
-Which pickup zones had the highest average fare last week, and how did that change versus the prior week?
-```
-
-Then ask your own question about the ride-hailing business — this is your open step.
-
-You should see the agent return a written answer with the generated SQL shown alongside
-it, and its numbers should line up with what the Historical dashboard shows for the same
-period.
-
-## Step 4 — Cross-check through the ClickHouse MCP
-
-Use the connection from Module 00 to verify one number independently:
-
-```text
-Use the clickhouse-cloud MCP to run the generated SELECT as read-only SQL. Compare its
-result with the ClickHouse Agent answer and report any difference.
-```
-
-The values should match. If they do not, compare filters and time ranges before accepting
-the natural-language answer.
-
-## How to verify you are done
-
-- Your agent answers a question over the taxi data and shows the generated SQL.
-- The ClickHouse MCP cross-check returns the same result.
-
-## Wrap-up
-
-You have conversational access to the same data your app serves, backed by the history
-and the live stream you built. Next you turn attention from the data to the app's own
-health.
-
-## End state
-
-You can explore your data in natural language. Continue to
-[05 ClickStack](/docs/learner/05-clickstack) to start observing the app itself.
diff --git a/workshops/build_workshop/playbook/content/docs/learner/05-clickstack.mdx b/workshops/build_workshop/playbook/content/docs/learner/05-clickstack.mdx
deleted file mode 100644
index 9a7b3b9..0000000
--- a/workshops/build_workshop/playbook/content/docs/learner/05-clickstack.mdx
+++ /dev/null
@@ -1,133 +0,0 @@
----
-title: 05 ClickStack
-description: Enable ClickStack, run the local OpenTelemetry collector overlay, and see your app's traces in HyperDX.
----
-
-## Starting point
-
-You are on `build-workshop-v1` — no checkout needed. Budget about **15 minutes**. The app
-is already instrumented for OpenTelemetry; in this module you turn it on with the
-collector overlay.
-
-Prerequisites: your Cloud service running (module 01).
-
-## Why
-
-To diagnose the app later, you first need to see it. ClickStack (ClickHouse's
-observability stack, with HyperDX as the UI) stores OpenTelemetry traces and logs in
-ClickHouse. In this module you turn on the collector so every request through the app
-produces telemetry you can query.
-
-## Goal
-
-App traces and backend query logs flowing into ClickStack, with at least one end-to-end
-request trace and a visible stream of successful query records.
-
-## Step 1 — Enable Managed ClickStack on your service
-
-The workshop uses **Managed ClickStack (HyperDX)** inside your own ClickHouse Cloud
-service: the collector writes `otel_*` tables to your service and the HyperDX UI renders
-them there. Enable it in the console:
-
-Console - your service -> **ClickStack** -> **Start Ingestion** -> skip the collector
-step (the app ships its own collector in Step 2) -> **Launch ClickStack**
-
-That single-signs you on into HyperDX. (The UI is empty at this point — telemetry starts
-flowing once the collector overlay is running in Step 2.)
-
-
- - The back end uses vanilla OpenTelemetry, not the convenience
- `hyperdx-opentelemetry` package the ClickStack docs suggest. That package hard-pins
- `opentelemetry-api==1.30.0`, which conflicts with the Langfuse v4 SDK the chat
- feature uses (needs `opentelemetry-api>=1.33.1`) — the two cannot share one
- environment. The ClickStack collector ingests standard OTLP, so the vanilla distro
- behaves identically; the workshop just sets the exporter env vars itself.
- - ClickStack's telemetry lives in a separate database on your service
- (`CLICKSTACK_DATABASE=otel`), distinct from the app's data database
- (`CLICKHOUSE_DATABASE=nyc_tlc_data`).
- - Traces and backend Python logs flow over OTLP from the auto-instrumented back end.
- The optional `--profile container-logs` collector is only for non-instrumented
- services such as the trip writer; its Linux Docker log path may not be available on
- Docker Desktop.
-
-
-## Step 2 — Run the OpenTelemetry collector overlay
-
-
- The collector publishes OTLP on host ports **4317** and **4318**, which are commonly
- already in use. If `./preflight.sh` in `ClickHouse_Demos/workshops/build_workshop/app`
- WARNed on them in module 00, set
- `OTEL_GRPC_HOST_PORT` and `OTEL_HTTP_HOST_PORT` in `.env.workshop` to the values
- preflight suggests (for example `24317` / `24318`) before starting the overlay. The
- back end reaches the collector in-network, so remapping the host ports is safe. From
- anywhere inside the cloned repository, re-run
- `cd "$(git rev-parse --show-toplevel)/workshops/build_workshop/app" && ./preflight.sh`
- to confirm the ports are clear.
-
-
-### `.env.workshop` and `docker-compose.otel.yml`
-
-Append the observability variables to your single `.env.workshop`, then bring the stack
-up with the overlay. The overlay sets `OTEL_ENABLED=true` on the back end for you and
-adds the `otel-collector` service (`clickhouse/clickstack-otel-collector`):
-
-```bash
-docker compose --env-file .env.workshop \
- -f docker-compose.workshop.yml -f docker-compose.otel.yml up -d
-```
-
-These live in the ClickStack observability section of `.env.workshop.example`; fill them
-in your `.env.workshop`:
-
-```bash
-OTLP_AUTH_TOKEN=change-me-workshop-token # shared secret securing OTLP ingest
-CLICKSTACK_DATABASE=otel # ClickStack's own otel_* tables
-OTEL_SERVICE_NAME=nyc-taxi-backend # the service name shown in HyperDX
-LOG_LEVEL=DEBUG # show successful queries in Log source
-```
-
-The collector reuses `CLICKHOUSE_HOST` / `CLICKHOUSE_PORT` / `CLICKHOUSE_USER` /
-`CLICKHOUSE_PASSWORD` from `.env.workshop`; the back end exports OTLP to
-`http://otel-collector:4318` (HTTP/protobuf). To also scrape raw container stdout on a
-Linux host, add `--profile container-logs`.
-
-## Step 3 — Generate and find traffic in ClickStack
-
-Open the Ops dashboard and leave its default `1m` interval and `5s` auto-refresh running
-for about 30 seconds. Then open ClickStack:
-
-1. In **Traces**, follow one request end to end (front end -> back end -> ClickHouse).
-2. In **Logs**, select `nyc-taxi-backend` and find repeated
- `ClickHouse query ok` records. Their timestamps should advance every refresh.
-3. Keep severity meaningful: successful queries are `DEBUG`; real idle-wake retries and
- failures appear as `WARNING` or `ERROR`.
-
-You should see a service named `nyc-taxi-backend` appear in HyperDX, with `/api/...`
-requests showing as traces, each carrying a child `clickhouse.query` span.
-
-
-
-*HyperDX rendering the app's traces: the `nyc-taxi-backend` service with its `/api/...` request spans.*
-
-## How to verify you are done
-
-- A service named `nyc-taxi-backend` appears in HyperDX.
-- Requests to `/api/...` show as traces, each with a child `clickhouse.query` span
- carrying `db.statement`, `db.elapsed_ms`, and `db.rows_returned`.
-- The Log source shows fresh `DEBUG ... ClickHouse query ok` records while the Ops
- dashboard remains open.
-- You will not see query errors here yet: a healthy, seeded app does not trip the safety
- limits, and 4xx requests never reach ClickHouse. In module 07 the injected fault makes
- an errored `clickhouse.query` span (with `error.category`) observable.
-
-## Wrap-up
-
-The app is now observable: traces and backend query logs are recorded in ClickHouse and
-explorable in ClickStack. The optional container-logs profile adds stdout from the trip
-writer on compatible Linux hosts. That telemetry is the substrate for the AI SRE work
-next.
-
-## End state
-
-Telemetry is flowing into ClickStack. Continue to [06 AI SRE](/docs/learner/06-ai-sre)
-to have your agent build on top of it.
diff --git a/workshops/build_workshop/playbook/content/docs/learner/06-ai-sre.mdx b/workshops/build_workshop/playbook/content/docs/learner/06-ai-sre.mdx
deleted file mode 100644
index 3ff5017..0000000
--- a/workshops/build_workshop/playbook/content/docs/learner/06-ai-sre.mdx
+++ /dev/null
@@ -1,132 +0,0 @@
----
-title: 06a AI SRE
-description: Connect your coding agent to the ClickStack MCP and have it build an SRE dashboard and an alert over your telemetry.
----
-
-## Starting point
-
-You are on `build-workshop-v1` — no checkout needed. Budget about **15 minutes**.
-
-Prerequisites: telemetry flowing into ClickStack (module 05), your coding agent working
-with MCP support (module 00).
-
-## Why
-
-Your agent is already good at writing SQL. Give it your observability data and the right
-tools, and it can do SRE work: build a dashboard that surfaces the app's health and an
-alert that fires when something goes wrong. This module wires the agent to ClickStack
-and puts it to work.
-
-## Goal
-
-Your agent, connected to the ClickStack MCP, has saved an SRE dashboard and at least one
-alert against your telemetry.
-
-## Step 1 — Verify the ClickStack connection from Module 00
-
-Do not add another MCP server here. Use the `clickstack` connection already configured
-and authorized in Module 00. Ask for a health check that exercises its tools end to end:
-
-```text
-Using the clickstack MCP, check the health of the nyc-taxi-backend service over the last 24h — request volume, error rate, and latency — and tell me if anything looks off.
-```
-
-
-
-Expected: a grounded summary with request volume, error rate, latency, and last activity.
-If the tool asks for a service, select the ClickHouse service used by this workshop.
-
-## Step 2 — Have the agent build an SRE dashboard
-
-ClickStack can build the dashboard for you from a plain-language description. In ClickStack, open
-**Dashboards** in the left sidebar and click **Generate with AI**. Describe what you want —
-the generator inspects your telemetry first and builds tiles from what it actually finds
-(if the data lacks something you asked for, it tells you rather than inventing generic
-tiles):
-
-```text
-explore the app's traces and logs, then build and save an SRE dashboard showing request rate, error rate, and p95 latency per service
-```
-
-
-
-*Dashboards → **Generate with AI**: describe the dashboard and let HyperDX inspect the data and build it.*
-
-The AI works through your telemetry — sampling logs and traces, checking for error spans,
-then assembling and verifying each tile — and summarizes what it built, with a link to open
-the saved dashboard:
-
-
-
-*The generator grounds every tile in real data and explains what it found before saving.*
-
-Open the saved dashboard to see the result: request rate, error rate, and p95 latency per
-service, alongside total-request/error counts, overall p95, a log-warnings tile, and a
-top-endpoints table — all reading live from the `nyc-taxi-backend` service.
-
-
-
-*The finished SRE dashboard, saved under **Dashboards** and populated from live telemetry.*
-
-## Step 3 — Add an alert
-
-Ask the agent to save an alert (via `clickstack_save_alert`) on the error-rate signal,
-with a threshold it can justify from the baseline it just observed.
-
-The agent can save the alert, but it cannot create the notification channel the alert
-delivers to — there is no MCP tool for that. Pre-create a webhook in the HyperDX UI
-first, then let the agent's saved alert target it:
-
-1. Open one of your dashboard charts — the error-rate tile is a good pick — and click
- its **Alert** button (the bell icon on the tile).
-2. In the alert's notification settings, choose **Generic Webhook** as the channel.
-3. You need a URL to point it at. For a throwaway endpoint that needs zero setup, open
- [webhook.site](https://webhook.site) in another tab; it hands you a unique URL and
- shows every request it receives in real time. Copy that URL and paste it in as the
- webhook URL.
-4. Save. The channel now exists, so the agent's saved alert can target it — and when the
- alert fires you can watch the payload arrive live on your webhook.site page.
-
-
- webhook.site URLs are public and ephemeral — great for seeing an alert fire in a
- workshop, but not for anything real. In production you would wire the alert to Slack,
- PagerDuty, or your own endpoint instead.
-
-
-## Step 4 (optional) — AI Notebooks: investigate inside HyperDX
-
-The coding-agent-plus-MCP path above works from your editor. ClickStack also has an
-in-product AI investigation surface: **AI Notebooks** (beta, Managed ClickStack only).
-
-1. A team admin enables it once: HyperDX - **Team Settings** -> **Security Policies** ->
- turn on **Generative AI**. A **Notebooks** entry then appears in the left sidebar.
-2. Open a new notebook and ask in plain language, for example: "What are the slowest
- backend operations in the last 30 minutes, and did any of them error?"
-3. The agent queries your logs, traces, and metrics and emits interactive tiles — its
- reasoning, the queries it executed, charts, and summaries. You can branch an
- investigation from any intermediate tile, and mix in manual search, timeseries,
- table, or markdown tiles alongside the AI ones.
-
-Same telemetry, two AI surfaces: the MCP path builds durable artifacts (dashboards,
-alerts) from your editor; Notebooks is for interactive investigation inside the
-observability product itself. In module 07 you can diagnose the fault with either.
-
-## How to verify you are done
-
-- A saved SRE dashboard appears in HyperDX with the health signals populated.
-- A saved alert exists with a sensible threshold.
-- You can articulate what the dashboard would look like during an incident.
-- Optional: a Notebook exists with one plain-language investigation and its tiles.
-
-## Wrap-up
-
-You now have an agent that can not only query telemetry but build durable observability
-artifacts from it. That is exactly what you will lean on when something breaks.
-
-## End state
-
-An AI-built SRE dashboard and alert are in place. Continue to optional
-[06b AI SRE with LibreChat](/docs/learner/06b-ai-sre-librechat) if you want a chat-native
-agent that reads both telemetry and source, then use that agent in
-[07 Test, fail, and fix](/docs/learner/07-break-and-fix). If you are skipping 06b, go straight
-to module 07 with the editor agent you configured here.
diff --git a/workshops/build_workshop/playbook/content/docs/learner/06b-ai-sre-librechat.mdx b/workshops/build_workshop/playbook/content/docs/learner/06b-ai-sre-librechat.mdx
deleted file mode 100644
index 59459a3..0000000
--- a/workshops/build_workshop/playbook/content/docs/learner/06b-ai-sre-librechat.mdx
+++ /dev/null
@@ -1,137 +0,0 @@
----
-title: 06b AI SRE with LibreChat
-description: Optional — run a prebuilt LibreChat SRE agent that investigates telemetry (ClickStack MCP) and source code (GitHub MCP) to root-cause a fault.
----
-
-## Starting point
-
-Optional module. You are on `build-workshop-v1` — no checkout needed yet. Budget about
-**20 minutes**.
-
-Prerequisites: module 05 complete (telemetry flowing into ClickStack), the workshop repo
-cloned locally (you did this in module 00 — you check out a fault branch in Step 4), your
-OpenAI key in `.env.workshop`, and Docker with headroom for a second small stack.
-
-## Why
-
-Module 06a put the agent in your editor. Here you get a **chat-native** SRE agent in
-LibreChat that investigates across two planes at once — your **telemetry** (ClickStack MCP)
-and the **source code** (GitHub MCP) — so it can go from symptom to the exact line of code.
-
-## Step 1 — Bring up LibreChat
-
-This add-on reuses the **same `.env.workshop`** you already filled in.
-Open `app/.env.workshop` and add the values from its **"Module 06b"** section (they are in
-`.env.workshop.example` for reference). `OPENAI_API_KEY` is already there; the LibreChat
-defaults (`LIBRECHAT_PORT`, login, secrets) are pre-filled, so you only need two values:
-- `CLICKSTACK_SERVICE_ID` — your ClickStack **Service ID**. In ClickStack, open
- **Team Settings** → the **Data** tab → and under **Connections**, the **Default**
- connection shows a **Service ID** (a UUID like `b96dfec2-44a8-48f7-998f-036a0d16a871`).
- Copy that value.
-
-
-
-*Find `CLICKSTACK_SERVICE_ID` in ClickStack → **Team Settings** → **Data** → **Connections** → **Default** → **Service ID**.*
-
-- `GITHUB_PAT` — a **fine-grained, read-only** GitHub PAT scoped to
- `ClickHouse/ClickHouse_Demos` (github.com → Settings → Developer settings → Fine-grained
- tokens → read-only Contents on that repo). This is the same repo you cloned in module 00;
- the GitHub MCP reads its branches from GitHub, so the agent can see the fault-branch source.
-
-Then start it (the command works from any directory inside the clone and LibreChat reads
-`../.env.workshop`):
-
-```bash
-cd "$(git rev-parse --show-toplevel)/workshops/build_workshop/app/librechat"
-docker compose --env-file ../.env.workshop -f docker-compose.librechat.yml up -d
-```
-
-Give it a minute, then open [localhost:3090](http://localhost:3090).
-
-
- LibreChat is a second stack (its own MongoDB). It runs in its own compose project, so it
- never touches the main workshop stack. Stop it any time with
- `docker compose -f docker-compose.librechat.yml down`.
-
-
-## Step 2 — Log in as the default user
-
-There is no signup — a default user is pre-created. Log in with:
-
-- **Email:** `workshop@example.com`
-- **Password:** `clickhouse`
-
-## Step 3 — Import the SRE agent (one time)
-
-Open **Agent Builder** (the agents panel) and **Create New Agent**. Give it a name, paste the
-**Instructions** from `workshops/build_workshop/app/librechat/sre-agent-definition.md`, and
-pick a strong model on the OpenAI endpoint (e.g. `gpt-5.4` / `gpt-5.5` — avoid `-mini`/`-nano`;
-the multi-hop reasoning needs a capable model).
-
-
-
-Scroll to **MCP Servers** → **Add MCP Server Tools** and add both servers — `clickstack` and
-`github`:
-
-
-
-- **`clickstack`** — on first use, complete the browser OAuth (your ClickHouse Cloud login)
- so the agent can read your telemetry. This is the redirect that must land back on
- `localhost:3090`.
-- **`github`** — uses the read-only PAT you put in `.env.workshop`.
-
-Both should now be listed under **MCP Servers** on the agent:
-
-
-
-**Save** the agent, then open a chat with it and ask "what can you do?" to confirm it is
-wired up — it should describe investigating the NYC Taxi app across ClickStack telemetry
-(`otel.otel_traces` / `otel.otel_logs`) and the `ClickHouse/ClickHouse_Demos` source:
-
-
-
-## Step 4 — Break something, then ask the agent
-
-Inject a fault (see [07 Test, fail, and fix](/docs/learner/07-break-and-fix) for the branches),
-for example the map fault, and rebuild the app stack:
-
-```bash
-cd "$(git rev-parse --show-toplevel)/workshops/build_workshop/app"
-git checkout fault/01-map-not-loading
-docker compose --env-file .env.workshop -f docker-compose.workshop.yml -f docker-compose.otel.yml up -d --build
-```
-
-Open the app so the failure is exercised (the broken map is recorded by the browser SDK from
-module 05). Then, in LibreChat, ask your SRE agent — you don't even need to name the fault;
-let it localize from the telemetry:
-
-```text
-User reports there are some UI errors. Can you check and find the root cause? Is this a code bug?
-```
-
-The agent confirms the symptom in ClickStack (the `nyc-taxi-frontend` `console.error` and the
-failing `/static/taxi_zones.geojson` fetch that returns `text/html` instead of JSON), then
-reads the source via the GitHub MCP and pinpoints the offending code in
-`frontend/src/ui/ZoneMap.tsx` — with the fix.
-
-
-
-## How to verify you are done
-
-- LibreChat is reachable at `localhost:3090` and you logged in without signing up.
-- The SRE agent has both `clickstack` and `github` tools attached and authorized.
-- For a checked-out fault, the agent names the correct root cause **and** cites the source
- file/line on that branch as evidence.
-
-## Wrap-up
-
-You now have a chat-native SRE agent that reasons across telemetry and code — the same
-pattern teams use to shorten incident triage. Leave fault 01 checked out: module 07 picks
-up this same incident and completes the workflow — confirm it in ClickStack, apply the
-fix, and watch the app recover.
-
-## End state
-
-The LibreChat SRE agent is ready to investigate fault scenarios and verify their fixes.
-Continue directly to [07 Test, fail, and fix](/docs/learner/07-break-and-fix) to turn this
-diagnosis into the full incident workflow: confirm, fix, and verify recovery.
diff --git a/workshops/build_workshop/playbook/content/docs/learner/07-break-and-fix.mdx b/workshops/build_workshop/playbook/content/docs/learner/07-break-and-fix.mdx
deleted file mode 100644
index b562f7e..0000000
--- a/workshops/build_workshop/playbook/content/docs/learner/07-break-and-fix.mdx
+++ /dev/null
@@ -1,111 +0,0 @@
----
-title: 07 Test, fail, and fix
-description: Inject a known fault, diagnose it through ClickStack, apply a fix, and prove recovery.
----
-
-## Outcome
-
-In about **20 minutes**, you will run one incident from failure to verified recovery. This
-continues directly from Module 06a or optional 06b and uses the ClickStack MCP configured
-in Module 00.
-
-## Step 1 — Choose one fault
-
-Start with Fault 01. Fault 02 is a second short exercise; Fault 03 needs a larger dataset
-to fail reliably.
-
-| Branch | Expected failure | Rebuild |
-|---|---|---|
-| `fault/01-map-not-loading` | Map polygons disappear; other cards work | frontend |
-| `fault/02-zone-stats-500` | Zone map data fails with HTTP 500 | backend |
-| `fault/03-slow-dashboard` | Trend request times out; use only with multi-month data | backend |
-
-## Step 2 — Inject and reproduce it
-
-The following example injects Fault 01 while preserving any local work:
-
-```bash
-cd "$(git rev-parse --show-toplevel)"
-git stash push --include-untracked -m "before-module-07"
-git switch build-workshop-v1
-git switch fault/01-map-not-loading
-
-cd workshops/build_workshop/app
-docker compose --env-file .env.workshop \
- -f docker-compose.workshop.yml \
- -f docker-compose.otel.yml \
- up -d --build frontend
-```
-
-Open a fresh browser session at [localhost:8080](http://localhost:8080). **The empty map is
-expected now**; a failure elsewhere is not part of this scenario.
-
-If Module 06b already injected Fault 01, skip the branch switch and rebuild only the
-frontend.
-
-## Step 3 — Diagnose from evidence
-
-Give the agent the symptom, not the answer:
-
-```text
-Using the clickstack MCP, investigate the current workshop failure.
-Correlate frontend and backend telemetry, identify the root cause, and cite the exact
-events, request, response content type, or trace that supports the conclusion.
-Do not edit code yet.
-```
-
-For Fault 01, inspect **ClickStack → Client Sessions** as well. The useful evidence is a
-frontend error and failed resource parse; healthy backend traces are also evidence because
-they narrow the blast radius.
-
-
-
-Before fixing anything, write down:
-
-- the failing component;
-- the evidence that proves it; and
-- one recovery check that would fail before the fix and pass after it.
-
-## Step 4 — Fix and rebuild
-
-Ask the agent to make the smallest change that addresses the proven cause, then rebuild the
-affected service. For Fault 01:
-
-```bash
-docker compose --env-file .env.workshop \
- -f docker-compose.workshop.yml \
- -f docker-compose.otel.yml \
- up -d --build frontend
-```
-
-For Fault 02 or 03, replace `frontend` with `backend`.
-
-Open a new browser session. The original symptom must be gone, and ClickStack must show no
-new matching error. Old incident events remain in the selected time range; compare
-timestamps instead of expecting history to disappear.
-
-## Step 5 — Return to the clean baseline
-
-Preserve your attempted fix, restore `build-workshop-v1`, and rebuild both app services:
-
-```bash
-cd "$(git rev-parse --show-toplevel)"
-git stash push --include-untracked -m "module-07-fix"
-git switch build-workshop-v1
-
-cd workshops/build_workshop/app
-docker compose --env-file .env.workshop \
- -f docker-compose.workshop.yml \
- -f docker-compose.otel.yml \
- up -d --build frontend backend
-```
-
-## Completion check
-
-- The injected symptom appeared before the fix.
-- The agent cited telemetry that proves the root cause.
-- The same recovery check passes after the fix.
-- A fresh session creates no new matching error.
-- `git branch --show-current` returns `build-workshop-v1`.
-
-Continue to [08 Chat and Langfuse](/docs/learner/08-chat-langfuse).
diff --git a/workshops/build_workshop/playbook/content/docs/learner/07-chat-langfuse.mdx b/workshops/build_workshop/playbook/content/docs/learner/07-chat-langfuse.mdx
deleted file mode 100644
index e9192a1..0000000
--- a/workshops/build_workshop/playbook/content/docs/learner/07-chat-langfuse.mdx
+++ /dev/null
@@ -1,7 +0,0 @@
----
-title: Module moved
-description: Chat and Langfuse is now module 08.
----
-
-Chat and Langfuse moved to module 08. Continue to
-[08 Chat and Langfuse](/docs/learner/08-chat-langfuse).
diff --git a/workshops/build_workshop/playbook/content/docs/learner/08-break-and-fix.mdx b/workshops/build_workshop/playbook/content/docs/learner/08-break-and-fix.mdx
deleted file mode 100644
index 36b690f..0000000
--- a/workshops/build_workshop/playbook/content/docs/learner/08-break-and-fix.mdx
+++ /dev/null
@@ -1,7 +0,0 @@
----
-title: Module moved
-description: Break and fix is now module 07.
----
-
-Break and fix moved to module 07. Continue to
-[07 Test, fail, and fix](/docs/learner/07-break-and-fix).
diff --git a/workshops/build_workshop/playbook/content/docs/learner/08-chat-langfuse.mdx b/workshops/build_workshop/playbook/content/docs/learner/08-chat-langfuse.mdx
deleted file mode 100644
index 5e1bc59..0000000
--- a/workshops/build_workshop/playbook/content/docs/learner/08-chat-langfuse.mdx
+++ /dev/null
@@ -1,101 +0,0 @@
----
-title: 08 Chat and Langfuse
-description: Run the in-app AI chat and verify its trace, tokens, latency, and cost in Langfuse.
----
-
-## Outcome
-
-In about **15 minutes**, the app will answer a data question and Langfuse will show the
-complete model trace. Start only after Module 07 is recovered and
-`git branch --show-current` returns `build-workshop-v1`.
-
-## Step 1 — Verify the keys
-
-Confirm these fields are filled in `workshops/build_workshop/app/.env.workshop`. The
-Langfuse URL must match your project region.
-
-```bash
-OPENAI_API_KEY=sk-...
-LLM_MODEL=
-LLM_BASE_URL=https://api.openai.com/v1
-LANGFUSE_PUBLIC_KEY=pk-lf-...
-LANGFUSE_SECRET_KEY=sk-lf-...
-LANGFUSE_BASE_URL=https://us.cloud.langfuse.com
-```
-
-Restart only the instrumented backend:
-
-```bash
-cd "$(git rev-parse --show-toplevel)/workshops/build_workshop/app"
-docker compose --env-file .env.workshop \
- -f docker-compose.workshop.yml \
- -f docker-compose.otel.yml \
- up -d --build backend
-```
-
-Verify it is healthy:
-
-```bash
-docker compose --env-file .env.workshop \
- -f docker-compose.workshop.yml \
- -f docker-compose.otel.yml \
- ps backend
-```
-
-## Step 2 — Ask one testable question
-
-Open [localhost:8080](http://localhost:8080), select **Ask AI**, and enter:
-
-```text
-What are the top 10 pickup zones by trip count in July 2022?
-Show the SQL and the result.
-```
-
-Expected: an answer, result table or chart, and a **Show SQL** control. Read the generated
-SQL and confirm it queries `nyc_tlc_data` before trusting the answer.
-
-
-
-## Step 3 — Find the matching Langfuse trace
-
-Open the Langfuse project created in Module 00 and select the newest `chat` trace. Match it
-to your question by timestamp or input text.
-
-Verify these fields:
-
-- input question and generated output;
-- model and latency;
-- input/output token counts and cost; and
-- session or conversation ID.
-
-
-
-If no trace appears, check backend logs first:
-
-```bash
-docker compose --env-file .env.workshop \
- -f docker-compose.workshop.yml \
- -f docker-compose.otel.yml \
- logs --tail=100 backend
-```
-
-The common cause is a `LANGFUSE_BASE_URL` that does not match the project region.
-
-## Step 4 — Verify conversation grouping
-
-Ask one follow-up question in the same chat:
-
-```text
-For those zones, compare average fare and average tip.
-```
-
-Langfuse should show a second traced turn under the same conversation/session.
-
-## Completion check
-
-- The chat returns a grounded answer and visible SQL.
-- Both turns appear in Langfuse.
-- You can read model, latency, tokens, and cost.
-- Both turns share the same conversation/session.
-
-Continue to [09 Wrap-up](/docs/learner/09-wrap-up).
diff --git a/workshops/build_workshop/playbook/content/docs/learner/09-wrap-up.mdx b/workshops/build_workshop/playbook/content/docs/learner/09-wrap-up.mdx
deleted file mode 100644
index c684900..0000000
--- a/workshops/build_workshop/playbook/content/docs/learner/09-wrap-up.mdx
+++ /dev/null
@@ -1,104 +0,0 @@
----
-title: 09 Wrap-up
-description: Review what you built, take it home, and learn how to extend it to your own data.
----
-
-## Starting point
-
-You are on `build-workshop-v1` — the complete app you have been configuring all session.
-If you checked out a fault branch in module 07, use that module's stash-and-switch reset
-before continuing. Budget about **10 minutes**.
-
-## Why
-
-You leave with a running prototype and this repo to show your team. Three hours of
-building goes by fast, so this module makes what you did explicit: what you can demo, what
-keeps running after today, and the one change that repoints it at your own systems.
-
-## Goal
-
-Be able to name each piece you built and know the one thing you would change to point it
-at your own data.
-
-## Step 1 — Review what you built
-
-You took the NYC-taxi app and:
-
-- Moved its historical analytics onto ClickHouse Cloud, seeded from object storage
- (module 01).
-- Added real-time CDC from managed Postgres via a ClickPipe (module 03).
-- Explored the data conversationally with ClickHouse Agents (module 04).
-- Made the app observable with ClickStack and HyperDX (module 05).
-- Had your agent build an SRE dashboard and alert over that telemetry (module 06).
-- Diagnosed and fixed a live incident with the AI SRE (module 07).
-- Wired an in-app AI chat traced end to end in Langfuse (module 08).
-
-## Step 2 — Take it home
-
-Your ClickHouse Cloud trial lasts 30 days, and everything you built keeps running on it:
-the service, the CDC pipe, the dashboards, the traces. The repository is yours to keep;
-save your `.env.workshop` privately so you can come back to it. That is enough to walk
-your team through five things live:
-
-- a real-time operational dashboard on ClickHouse Cloud (modules 01-03),
-- a change-data-capture pipeline streaming from managed Postgres (module 03),
-- conversational BI over your data with ClickHouse Agents (module 04),
-- an AI-built SRE dashboard and alert over your telemetry (modules 05-06),
-- and an in-app AI chat traced end to end in Langfuse (module 08).
-
-
- Anyone you hand this repository to runs the workshop without an instructor. Point them at
- [Running this workshop self-paced](/docs/learner/self-paced) and the
- [Troubleshooting](/docs/learner/troubleshooting) reference — between them they cover
- everything the room and a facilitator would otherwise have provided.
-
-
-## Step 3 — Extend it to your own data
-
-### `db/` and `.env.workshop`
-
-The shortest path to value is to repoint the pipeline at your own systems:
-
-```text
-- Point a Postgres CDC ClickPipe at YOUR operational database instead of the shared one.
-- Adjust the schema and the back end's queries to your tables.
-- Send YOUR app's OpenTelemetry to ClickStack and rebuild the SRE dashboard on it.
-```
-
-## How to verify you are done
-
-- You can describe the end-to-end architecture without looking.
-- You know which single config change points CDC at your own database.
-
-## Wrap-up
-
-You built a real-time, observable, AI-assisted analytics application on ClickHouse Cloud
-in one sitting, with an agent doing most of the typing. That is the take-home: this is
-repeatable on your own stack.
-
-## You're done — what next
-
-Everything you built keeps running on your 30-day trial. When you are ready to take it
-further, pick any of these:
-
-- **Bring your own data.** Repoint the Postgres CDC ClickPipe at your operational database
- and adjust the schema and queries to your tables (module 03 shows the shape).
-- **Go deeper on ClickHouse Agents.** Point an agent at your own datasets at
- [ai.clickhouse.cloud](https://ai.clickhouse.cloud) and explore conversational BI beyond
- the taxi data.
-- **The repo is yours.** Keep this repository and your saved `.env.workshop`; rerun any
- module, or hand it to a teammate — it runs fully
- [self-paced](/docs/learner/self-paced).
-
-### If something is broken
-
-- Traces or data not appearing? Re-check the relevant `You should see` checkpoint in that
- module — it names the exact expected output.
-- Setup or credential issues? [Troubleshooting](/docs/learner/troubleshooting) lists every
- failure seen in testing with its fix.
-- Want a clean baseline? `git switch build-workshop-v1` returns you to the complete app.
-
-## End state
-
-You have finished the workshop. Explore the [ClickHouse docs](https://clickhouse.com/docs)
-and revisit any module to go deeper.
diff --git a/workshops/build_workshop/playbook/content/docs/learner/index.mdx b/workshops/build_workshop/playbook/content/docs/learner/index.mdx
deleted file mode 100644
index 97019ba..0000000
--- a/workshops/build_workshop/playbook/content/docs/learner/index.mdx
+++ /dev/null
@@ -1,68 +0,0 @@
----
-title: Learner track
-description: Build a real-time, observable, AI-assisted analytics app on ClickHouse Cloud - in one sitting, with your coding agent doing most of the typing.
----
-
-Over the next couple of hours you take a working NYC-taxi app and rebuild its data plane
-on ClickHouse Cloud: real historical analytics, a live change-data-capture stream,
-conversational BI, an AI-built SRE dashboard, and an in-app AI chat traced end to end.
-Work the modules in order - the numbered list below doubles as your progress tracker.
-
-## Your progress
-
-0. [Setup](/docs/learner/00-setup) - accounts, keys, tools, agent skills, and the app running locally.
-1. [ClickHouse Cloud](/docs/learner/01-clickhouse-cloud) - build the schema and seed 3.2M+ real taxi rows from object storage.
-2. [Base app](/docs/learner/02-base-app) - tour the running app, now that ClickHouse is seeded, so you know what you are extending.
-3. [Real-time CDC](/docs/learner/03-realtime-cdc) - stream your own Postgres into ClickHouse with a ClickPipe.
-4. [ClickHouse Agents](/docs/learner/04-clickhouse-agents) - ask your data questions in plain language.
-5. [ClickStack](/docs/learner/05-clickstack) - see the app's own traces and logs in HyperDX.
-6. [AI SRE](/docs/learner/06-ai-sre) - have your agent build an SRE dashboard and alert over that telemetry.
-7. [Break and fix](/docs/learner/07-break-and-fix) - continue from AI SRE or optional 06b, inject a fault, diagnose it, and fix it.
-8. [Chat and Langfuse](/docs/learner/08-chat-langfuse) - wire an in-app AI chat and trace every turn.
-9. [Wrap-up](/docs/learner/09-wrap-up) - recap, take it home, extend it to your own data.
-
-## What you'll build
-
-By the end you have, all running on your own trial service:
-
-- a **live ops dashboard** over **3.2M+ real NYC taxi rows** seeded straight from object storage,
-- a **change-data-capture pipeline** streaming your own Postgres into ClickHouse continuously,
-- **conversational BI** over that data with ClickHouse Agents,
-- an **AI-built SRE dashboard and alert** over the app's own telemetry,
-- and an **in-app AI chat** traced end to end in Langfuse.
-
-## Time
-
-About **2h30 hands-on** - and your dashboard is live on real data within the first 40 minutes.
-
-## Cost
-
-**$0** - ClickHouse Cloud trial credits cover everything. The only paid key is about **$5 of OpenAI credit** for the chat module (module 08), and even that stretches across many runs.
-
-## Everything is copy-paste
-
-Every command and query on these pages is ready to copy and run, and your coding agent does the heavy lifting - you are directing the build, not typing it out.
-
-## How each lesson is structured
-
-Every module page follows the same shape, so you always know where you are:
-
-1. **Starting point** - the checkpoint branch to check out and what you need in place.
-2. **Why** - why this step matters for the app you are building.
-3. **Goal** - the one concrete outcome for the module.
-4. **Steps** - numbered, each verb-first, with the exact files you touch and an expected-output checkpoint.
-5. **How to verify you are done** - a check you can run yourself.
-6. **Wrap-up** - what just happened.
-7. **End state** - the handoff into the next module.
-
-Do not worry about keeping pace with everyone else: every module names a checkpoint branch
-you can check out to start fresh, so you are never stranded.
-
-## Working on your own
-
-Running this without an instructor? Read [Running this workshop self-paced](/docs/learner/self-paced)
-first - it maps what an instructor would otherwise provide onto the self-serve replacements
-built into these materials. If anything breaks, [Troubleshooting](/docs/learner/troubleshooting)
-lists every setup failure seen in testing with its fix.
-
-Start with [00 Setup](/docs/learner/00-setup).
diff --git a/workshops/build_workshop/playbook/content/docs/learner/meta.json b/workshops/build_workshop/playbook/content/docs/learner/meta.json
deleted file mode 100644
index 367c48a..0000000
--- a/workshops/build_workshop/playbook/content/docs/learner/meta.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "title": "Learner track",
- "description": "The hands-on lessons you work through during the session.",
- "root": true,
- "icon": "GraduationCap",
- "pages": [
- "index",
- "self-paced",
- "00-setup",
- "01-clickhouse-cloud",
- "02-base-app",
- "03-realtime-cdc",
- "04-clickhouse-agents",
- "05-clickstack",
- "06-ai-sre",
- "06b-ai-sre-librechat",
- "07-break-and-fix",
- "08-chat-langfuse",
- "09-wrap-up",
- "troubleshooting"
- ]
-}
diff --git a/workshops/build_workshop/playbook/content/docs/learner/self-paced.mdx b/workshops/build_workshop/playbook/content/docs/learner/self-paced.mdx
deleted file mode 100644
index 2d0db7f..0000000
--- a/workshops/build_workshop/playbook/content/docs/learner/self-paced.mdx
+++ /dev/null
@@ -1,80 +0,0 @@
----
-title: Running this workshop self-paced
-description: How to complete the whole workshop on your own, with no instructor in the room - what changes, what replaces the instructor, and how to pace it.
----
-
-This workshop is designed to run in a room with an instructor, but everything you need to
-finish it alone is already in this playbook. If you are working through the repository on
-your own - or someone shared it with you after the event - this page is your map.
-
-## What changes without an instructor
-
-Short answer: nothing in modules 00 through 07. The primary path is fully self-serve. You
-create your own ClickHouse Cloud trial, your own Postgres managed by ClickHouse with
-`clickhousectl` (module 03), and your own API keys - there is no shared resource you
-depend on. Modules 04 through 09 are the same.
-
-An instructor normally provides two things, and each has a self-serve replacement built
-into these materials:
-
-- **The staffed setup clinic** (module 00) is replaced by `./preflight.sh` in
- `ClickHouse_Demos/workshops/build_workshop/app`, which checks everything the live
- bring-up trips over, and the [Troubleshooting](/docs/learner/troubleshooting)
- page, which lists every failure seen in testing with its exact fix.
-- **Live unsticking** during a module is replaced by two things: your coding agent acting
- as instructor (below), and the instructor track as your answer key (below).
-
-## The instructor track is your answer key
-
-The [Instructor track](/docs/instructor) is published in this same playbook. Each module
-has a matching instructor page with its timing, the failures that actually happen and how
-to unstick them, and the reset steps to get back to a known-good state. When a module does
-not behave as its verify step expects, open the matching instructor page - it is written
-for exactly that moment.
-
-
- The instructor page for [07 Test, fail, and fix](/docs/instructor/07-break-and-fix) contains
- the full fault answer key - the exact symptom, signal, and fix for each injected fault.
- Diagnosing the fault yourself is the entire point of module 07, so attempt it from the
- telemetry first and only open the answer key if you are genuinely stuck.
-
-
-## Your coding agent is your instructor
-
-You already loaded the ClickHouse agent skills and connected the remote ClickHouse MCP to
-your coding agent in module 00. That same agent makes a capable workshop instructor. Paste
-the block below into it, filling in the module number and what you are seeing:
-
-```text
-You are my workshop instructor. The workshop lives in this repo under workshops/build_workshop: the playbook markdown is in playbook/content/docs (learner and instructor tracks), the app is in app/, and infrastructure notes are in infra/README.md. I am on module NN and stuck: . Read the relevant module page and the troubleshooting page, inspect my local state (docker compose ps, container logs, and .env.workshop WITHOUT printing any secret values), and walk me to the module's verify step.
-```
-
-Because it has the skills and the MCP from module 00, the agent can also query your Cloud
-service directly while it helps - so it can check whether your tables, pipe, or telemetry
-actually landed, not just read the docs.
-
-If you want the instructor framing to persist across sessions instead of re-pasting it,
-drop it into your tool's project-instructions file: `CLAUDE.md` for Claude Code, `AGENTS.md`
-for Codex CLI, and `.cursor/rules/` (or `AGENTS.md`, which Cursor also reads) for Cursor.
-Each tool loads that file automatically at the repo root, so the guidance is in context
-every time you open the workshop.
-
-## Pacing advice
-
-The per-module time budgets in the [overview](/docs) assume a room where the account
-signups were done ahead of time. On your own, module 00 dominates: the three browser
-signups (ClickHouse Cloud, Langfuse, OpenAI) are 5 to 10 minutes each, mostly waiting on
-email or phone verification. The "do the account signups before the day" callout in
-[00 Setup](/docs/learner/00-setup) applies doubly when you are solo - do all three signups
-first, come back with keys in hand, and the rest of module 00 is quick. Modules 01 through
-09 then run close to their stated budgets.
-
-You are never stranded: every module's **Starting point** section states exactly what must
-be in place, so you can stop, come back later, and pick up from there.
-
-## Where to go next
-
-
-
-
-
diff --git a/workshops/build_workshop/playbook/content/docs/learner/troubleshooting.mdx b/workshops/build_workshop/playbook/content/docs/learner/troubleshooting.mdx
deleted file mode 100644
index b036bfb..0000000
--- a/workshops/build_workshop/playbook/content/docs/learner/troubleshooting.mdx
+++ /dev/null
@@ -1,206 +0,0 @@
----
-title: Troubleshooting
-description: A symptom, cause, and fix reference for every failure seen while building and testing this workshop, grouped by where it surfaces.
----
-
-Every entry below is a failure that actually happened while building and testing this
-workshop. Find your symptom, read the why, apply the fix. If nothing here matches, hand
-the problem to your coding agent - the [self-paced guide](/docs/learner/self-paced#your-coding-agent-is-your-instructor)
-has a ready-to-paste prompt that turns it into your instructor.
-
-## Docker
-
-### Containers stick in "Created" and never start
-
-- **Symptom** - `docker info` answers fine, but `docker compose ... up` leaves containers
- in `Created` and nothing ever becomes healthy.
-- **Why** - the Docker engine is wedged: the daemon responds, yet it cannot actually start
- a container. Seen with OrbStack during a live bring-up.
-- **Fix** - restart your Docker engine (Docker Desktop, OrbStack, or Colima) and wait until
- it reports Running, then bring the stack up again. From anywhere inside the cloned
- repository, run
- `cd "$(git rev-parse --show-toplevel)/workshops/build_workshop/app" && ./preflight.sh`;
- it catches this before you start the stack by running a throwaway container as a test.
-
-### "port is already allocated" on up
-
-- **Symptom** - `docker compose ... up` fails with `Bind for 0.0.0.0:8080 failed: port is
- already allocated` (or `:8000`, `:5432`).
-- **Why** - another process, or an old workshop container, already holds that host port.
-- **Fix** - from anywhere inside the cloned repository, run
- `cd "$(git rev-parse --show-toplevel)/workshops/build_workshop/app" && ./preflight.sh`.
- It names what is holding the port and prints the exact override to set, following the
- base-port + 20000 convention, for example
- `set FRONTEND_HOST_PORT=28080 in .env.workshop`. The override vars are
- `FRONTEND_HOST_PORT`, `BACKEND_HOST_PORT`, `POSTGRES_HOST_PORT`, and for the observability
- overlay `OTEL_GRPC_HOST_PORT` / `OTEL_HTTP_HOST_PORT`. Set the suggested value, re-run
- preflight, then start the stack. Only the host ports move; the in-container ports are
- unchanged, so this is safe.
-
-### "platform does not match" warning
-
-- **Symptom** - Docker prints a platform-mismatch warning (for example `linux/amd64` vs
- `linux/arm64`) on pull or up.
-- **Why** - an image was built for a different CPU architecture than your machine, common
- on Apple Silicon.
-- **Fix** - harmless. It is a warning, not a failure; the image runs under emulation. Let
- it proceed.
-
-## ClickHouse Cloud
-
-### First request after idle is slow or 500s once
-
-- **Symptom** - the first query or dashboard load after the service has been idle is slow,
- or a request 500s once and then works.
-- **Why** - a Cloud service idle-scales to zero and takes about 30 seconds to wake; the
- first request pays that wake cost. The back end already allows a longer first-connect
- timeout and retries once.
-- **Fix** - just retry, or wait about 30 seconds. This is not a fault. It also matters in
- [07 Test, fail, and fix](/docs/learner/07-break-and-fix): a waking service makes the fault 03
- timeout fire more readily.
-
-### Lost the service password
-
-- **Symptom** - you did not save the `default`-user password and cannot find it.
-- **Why** - the service password is not shown again after you leave the creation flow.
-- **Fix** - open the service, go to its **Settings** and reset the `default`-user password,
- then update `CLICKHOUSE_PASSWORD` in `.env.workshop`. The host is always available from
- the **Connect** modal.
-
-### Lost the managed-Postgres password
-
-- **Symptom** - you did not save the one-time `postgres` admin password from
- `clickhousectl cloud postgres create`.
-- **Why** - it is shown only once, and the beta `postgres get` / `list` APIs can return
- empty or FORBIDDEN even while the instance is healthy.
-- **Fix** - `clickhousectl cloud postgres reset-password `, then use the new
- password in `.env.workshop` (`PGPASSWORD`) and in the ClickPipe connection.
-
-### ClickHouse Cloud unreachable
-
-- **Symptom** - preflight FAILs the connectivity check, or the back end cannot connect;
- `curl https://:8443/ping` fails.
-- **Why** - wifi, VPN, or firewall; a wrong host (a scheme or port pasted into
- `CLICKHOUSE_HOST`); a TLS or port mismatch; or a Cloud IP-access-list blocking your IP.
-- **Fix** - confirm `CLICKHOUSE_HOST` is the bare hostname (no `https://`, no port),
- `CLICKHOUSE_PORT=8443`, and `CLICKHOUSE_SECURE=true`; check VPN and firewall; confirm the
- service's IP access list allows your address. Preflight names the specific failure - DNS,
- refused, timeout, or TLS handshake.
-
-## CDC (module 03)
-
-### ClickPipe stuck in "Provisioning"
-
-- **Symptom** - the pipe shows Provisioning for a while after you create it.
-- **Why** - normal startup. A pipe takes about 2 to 3 minutes to go Provisioning ->
- Running for a small table.
-- **Fix** - wait 2 to 3 minutes. Confirm state in the console or with
- `clickhousectl cloud clickpipe list`.
-
-### Rows are not arriving in ClickHouse
-
-- **Symptom** - the pipe is Running but the destination row count is not growing and the
- Ops dashboard does not move.
-- **Why** - the default sync interval is about 60 seconds, so expect lag; or the generator
- is not inserting; or the publication the pipe reads does not exist.
-- **Fix** - wait at least 60 seconds. Check the `pg-trip-writer` log shows `inserted N
- trips` and either `created publication pub_taxi` (your own instance) or `publication ...
- already exists` (shared fallback). Confirm the pipe state is Running. If the publication
- is missing, the pipe has nothing to read - the generator creates it on first run against
- an instance where you are admin.
-
-### Materialized view has no rows
-
-- **Symptom** - `realtime_trips` fills, but `taxi_trips` (fed by the CDC materialized view)
- stays empty.
-- **Why** - the materialized view was created before the ClickPipe target existed, or it
- does not read the CLI target at `default.realtime_trips`.
-- **Fix** - wait for the target table, then copy the complete materialized-view command
- from [Module 03, Step 4](/docs/learner/03-realtime-cdc). Verify the source first:
-
- ```bash
- clickhousectl cloud service query --id --query "
- SELECT database, name, engine
- FROM system.tables
- WHERE name = 'realtime_trips'
- "
- ```
-
- A materialized view processes rows inserted after it exists; keep the trip writer
- running after creation.
-
-### Replication slot stalls
-
-- **Symptom** - the pipe stalls and WAL grows on the source Postgres.
-- **Why** - a stalled slot retains WAL; a resync creates a new slot.
-- **Fix** - on your own managed Postgres (one slot, ample headroom) just resync the pipe
- from the console. Deleting a pipe drops its slot on the source. The shared fallback pool
- is an instructor-side concern - see `infra/README.md`.
-
-## Environment variables
-
-### A shell export overrides .env.workshop
-
-- **Symptom** - you set a value in `.env.workshop`, but the container uses a different one
- (often a stale `OPENAI_API_KEY`, a `LANGFUSE_*`, or `CLICKHOUSE_PASSWORD`).
-- **Why** - `docker compose` interpolates `${VAR}` from your shell first, and an exported
- shell variable WINS over the file.
-- **Fix** - in the shell you run compose from,
- `unset OPENAI_API_KEY LANGFUSE_PUBLIC_KEY LANGFUSE_SECRET_KEY LANGFUSE_BASE_URL CLICKHOUSE_PASSWORD`,
- then bring the stack up again. Preflight warns when it detects this.
-
-### Duplicate keys in .env.workshop
-
-- **Symptom** - a value you set in the file is ignored.
-- **Why** - the same key appears twice; the last occurrence wins, matching `docker compose`
- semantics (preflight reads it the same way).
-- **Fix** - remove the earlier duplicate so only the intended value remains.
-
-## Chat (module 08)
-
-### POST /api/chat returns 503 with a setup hint
-
-- **Symptom** - the chat panel shows a setup hint and `/api/chat` returns 503; the rest of
- the app is fine.
-- **Why** - no `OPENAI_API_KEY` is set on the back end.
-- **Fix** - add `OPENAI_API_KEY` to `.env.workshop`, then
- `docker compose --env-file .env.workshop -f docker-compose.workshop.yml
- -f docker-compose.otel.yml up -d --build backend`.
- Chat is the only feature that needs it.
-
-### Cannot create a first OpenAI key
-
-- **Symptom** - OpenAI will not issue an API key on a new account.
-- **Why** - new accounts require one-time phone verification and have no free credits.
-- **Fix** - complete phone verification, then **Settings -> Billing**: add a payment method
- and buy the **$5** minimum of prepaid credit. Turn **off auto-recharge** (it is on by
- default during setup) so you are never billed beyond the $5 you added.
-
-## MCP and OAuth (modules 00 and 06)
-
-### 401 on the MCP endpoint
-
-- **Symptom** - hitting `https://mcp.clickhouse.cloud/mcp` (or `/clickstack`) returns 401.
-- **Why** - expected before you complete the browser OAuth flow; the endpoint is
- authenticated.
-- **Fix** - add the server to your agent, then run the OAuth flow and authorize in the
- browser, using your tool's command:
- - **Claude Code** - run `/mcp`, select the server, and authorize (or `claude mcp login `).
- - **Codex CLI** - `codex mcp login `.
- - **Cursor** - open the MCP settings pane and click the server's authorize/login control.
-
- Also confirm the **Connect with MCP** toggle is on for your service.
-
-### Corporate laptop blocks MCP or OAuth
-
-- **Symptom** - your agent cannot add an MCP server, or the OAuth redirect is blocked.
-- **Why** - a managed-laptop policy blocks adding MCP servers or outbound OAuth.
-- **Fix** - a personal machine is the fastest fallback.
-
-### Windsurf cannot connect over native HTTP
-
-- **Symptom** - Windsurf fails to connect to the MCP endpoint, or its OAuth is flaky.
-- **Why** - Windsurf connects through `mcp-remote` rather than native streamable HTTP.
-- **Fix** - use the `mcp-remote` command form:
- `{ "command": "npx", "args": ["-y", "mcp-remote", "https://mcp.clickhouse.cloud/mcp"] }`
- (swap `/mcp` for `/clickstack` when wiring the ClickStack MCP in module 06).
diff --git a/workshops/build_workshop/playbook/content/docs/meta.json b/workshops/build_workshop/playbook/content/docs/meta.json
deleted file mode 100644
index 45c0626..0000000
--- a/workshops/build_workshop/playbook/content/docs/meta.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "pages": ["index", "learner", "instructor"]
-}
diff --git a/workshops/build_workshop/playbook/next.config.mjs b/workshops/build_workshop/playbook/next.config.mjs
deleted file mode 100644
index 4e3dc5e..0000000
--- a/workshops/build_workshop/playbook/next.config.mjs
+++ /dev/null
@@ -1,42 +0,0 @@
-import { createMDX } from 'fumadocs-mdx/next';
-
-const withMDX = createMDX();
-
-// Production and dev each use a dedicated hostname and serve from `/`. Keep
-// basePath configurable for local experiments, but deployments leave it empty.
-const basePath = process.env.NEXT_PUBLIC_BASE_PATH ?? '';
-
-/** @type {import('next').NextConfig} */
-const config = {
- reactStrictMode: true,
- basePath,
- async redirects() {
- return [
- {
- source: '/docs/learner/07-chat-langfuse',
- destination: '/docs/learner/08-chat-langfuse',
- permanent: true,
- },
- {
- source: '/docs/instructor/07-chat-langfuse',
- destination: '/docs/instructor/08-chat-langfuse',
- permanent: true,
- },
- {
- source: '/docs/learner/08-break-and-fix',
- destination: '/docs/learner/07-break-and-fix',
- permanent: true,
- },
- {
- source: '/docs/instructor/08-break-and-fix',
- destination: '/docs/instructor/07-break-and-fix',
- permanent: true,
- },
- ];
- },
- // Emit a self-contained server bundle (.next/standalone) so the Docker image
- // can run `node server.js` without the full node_modules tree. See Dockerfile.
- output: 'standalone',
-};
-
-export default withMDX(config);
diff --git a/workshops/build_workshop/playbook/package-lock.json b/workshops/build_workshop/playbook/package-lock.json
deleted file mode 100644
index da5fcb3..0000000
--- a/workshops/build_workshop/playbook/package-lock.json
+++ /dev/null
@@ -1,5343 +0,0 @@
-{
- "name": "build-ai-with-ai-playbook",
- "version": "0.1.0",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "build-ai-with-ai-playbook",
- "version": "0.1.0",
- "hasInstallScript": true,
- "dependencies": {
- "cnfast": "^0.0.8",
- "fumadocs-core": "16.11.4",
- "fumadocs-mdx": "15.1.1",
- "fumadocs-ui": "npm:@fumadocs/base-ui@16.11.4",
- "lucide-react": "^1.24.0",
- "next": "16.2.12",
- "react": "^19.2.7",
- "react-dom": "^19.2.7"
- },
- "devDependencies": {
- "@tailwindcss/postcss": "^4.3.2",
- "@types/mdx": "^2.0.14",
- "@types/node": "^26.1.1",
- "@types/react": "^19.2.17",
- "@types/react-dom": "^19.2.3",
- "postcss": "^8.5.17",
- "tailwindcss": "^4.3.2",
- "typescript": "^6.0.3"
- },
- "engines": {
- "node": ">=22.12.0"
- }
- },
- "node_modules/@alloc/quick-lru": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
- "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@babel/runtime": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz",
- "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@base-ui/react": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@base-ui/react/-/react-1.6.0.tgz",
- "integrity": "sha512-/jzjTWJYXhRFO45Bev9lc3cHbmjzCMpUqbMZ2AgKy/z25mY9B6shGSNcXcjQar9n5doM0KYW1W8fcFv2jZBuMw==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.29.2",
- "@base-ui/utils": "0.3.1",
- "@floating-ui/react-dom": "^2.1.8",
- "@floating-ui/utils": "^0.2.11",
- "use-sync-external-store": "^1.6.0"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- },
- "peerDependencies": {
- "@date-fns/tz": "^1.2.0",
- "@types/react": "^17 || ^18 || ^19",
- "date-fns": "^4.0.0",
- "react": "^17 || ^18 || ^19",
- "react-dom": "^17 || ^18 || ^19"
- },
- "peerDependenciesMeta": {
- "@date-fns/tz": {
- "optional": true
- },
- "@types/react": {
- "optional": true
- },
- "date-fns": {
- "optional": true
- }
- }
- },
- "node_modules/@base-ui/utils": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/@base-ui/utils/-/utils-0.3.1.tgz",
- "integrity": "sha512-gFFiltORVmW/N6IILTGxizP3PBpVpysqML1ALY5Vk0mH+7faVkCknOU31goYHN5Aoek2dkjxva1XOD2Ce9WuIg==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.29.2",
- "@floating-ui/utils": "^0.2.11",
- "reselect": "^5.2.0",
- "use-sync-external-store": "^1.6.0"
- },
- "peerDependencies": {
- "@types/react": "^17 || ^18 || ^19",
- "react": "^17 || ^18 || ^19",
- "react-dom": "^17 || ^18 || ^19"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@emnapi/runtime": {
- "version": "1.11.2",
- "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz",
- "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@esbuild/aix-ppc64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz",
- "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==",
- "cpu": [
- "ppc64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "aix"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-arm": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz",
- "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==",
- "cpu": [
- "arm"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-arm64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz",
- "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-x64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz",
- "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/darwin-arm64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz",
- "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/darwin-x64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz",
- "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/freebsd-arm64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz",
- "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/freebsd-x64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz",
- "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-arm": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz",
- "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==",
- "cpu": [
- "arm"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-arm64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz",
- "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-ia32": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz",
- "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==",
- "cpu": [
- "ia32"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-loong64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz",
- "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==",
- "cpu": [
- "loong64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-mips64el": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz",
- "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==",
- "cpu": [
- "mips64el"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-ppc64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz",
- "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==",
- "cpu": [
- "ppc64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-riscv64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz",
- "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==",
- "cpu": [
- "riscv64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-s390x": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz",
- "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==",
- "cpu": [
- "s390x"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-x64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz",
- "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/netbsd-arm64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz",
- "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/netbsd-x64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz",
- "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openbsd-arm64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz",
- "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openbsd-x64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz",
- "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openharmony-arm64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz",
- "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "openharmony"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/sunos-x64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz",
- "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "sunos"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-arm64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz",
- "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-ia32": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz",
- "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==",
- "cpu": [
- "ia32"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-x64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz",
- "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@floating-ui/core": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz",
- "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==",
- "license": "MIT",
- "dependencies": {
- "@floating-ui/utils": "^0.2.12"
- }
- },
- "node_modules/@floating-ui/dom": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz",
- "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==",
- "license": "MIT",
- "dependencies": {
- "@floating-ui/core": "^1.8.0",
- "@floating-ui/utils": "^0.2.12"
- }
- },
- "node_modules/@floating-ui/react-dom": {
- "version": "2.1.9",
- "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz",
- "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==",
- "license": "MIT",
- "dependencies": {
- "@floating-ui/dom": "^1.8.0"
- },
- "peerDependencies": {
- "react": ">=16.8.0",
- "react-dom": ">=16.8.0"
- }
- },
- "node_modules/@floating-ui/utils": {
- "version": "0.2.12",
- "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz",
- "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==",
- "license": "MIT"
- },
- "node_modules/@fuma-translate/react": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@fuma-translate/react/-/react-1.0.2.tgz",
- "integrity": "sha512-uOiOtBx3nRXR8Nu1GzBf1tApgF1FErDBTHxRIAQeyQdyOoZbrNRN6H4kDCWObY4qyGeGbHydG0DHzgeUgFDMIw==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "*",
- "react": "^19.2.0",
- "react-dom": "^19.2.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@fumadocs/tailwind": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@fumadocs/tailwind/-/tailwind-0.1.1.tgz",
- "integrity": "sha512-BnPe52UxSaG8yKlHMKBxXw8h6GpK5qO55ci6+Qd5JnquTvIw6SpfbC1P+qAi82PuPWv1KZAWY8bxRk4+x9ctXw==",
- "license": "MIT",
- "peerDependencies": {
- "tailwindcss": "^4.0.0"
- },
- "peerDependenciesMeta": {
- "tailwindcss": {
- "optional": true
- }
- }
- },
- "node_modules/@img/colour": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
- "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==",
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@img/sharp-darwin-arm64": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz",
- "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==",
- "cpu": [
- "arm64"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-darwin-arm64": "1.2.4"
- }
- },
- "node_modules/@img/sharp-darwin-x64": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz",
- "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==",
- "cpu": [
- "x64"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-darwin-x64": "1.2.4"
- }
- },
- "node_modules/@img/sharp-libvips-darwin-arm64": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz",
- "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==",
- "cpu": [
- "arm64"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "darwin"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-darwin-x64": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz",
- "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==",
- "cpu": [
- "x64"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "darwin"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-linux-arm": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz",
- "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==",
- "cpu": [
- "arm"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-linux-arm64": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz",
- "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==",
- "cpu": [
- "arm64"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-linux-ppc64": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz",
- "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==",
- "cpu": [
- "ppc64"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-linux-riscv64": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz",
- "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==",
- "cpu": [
- "riscv64"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-linux-s390x": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz",
- "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==",
- "cpu": [
- "s390x"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-linux-x64": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz",
- "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==",
- "cpu": [
- "x64"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz",
- "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==",
- "cpu": [
- "arm64"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-linuxmusl-x64": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz",
- "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==",
- "cpu": [
- "x64"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-linux-arm": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz",
- "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==",
- "cpu": [
- "arm"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linux-arm": "1.2.4"
- }
- },
- "node_modules/@img/sharp-linux-arm64": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz",
- "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==",
- "cpu": [
- "arm64"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linux-arm64": "1.2.4"
- }
- },
- "node_modules/@img/sharp-linux-ppc64": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz",
- "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==",
- "cpu": [
- "ppc64"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linux-ppc64": "1.2.4"
- }
- },
- "node_modules/@img/sharp-linux-riscv64": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz",
- "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==",
- "cpu": [
- "riscv64"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linux-riscv64": "1.2.4"
- }
- },
- "node_modules/@img/sharp-linux-s390x": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz",
- "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==",
- "cpu": [
- "s390x"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linux-s390x": "1.2.4"
- }
- },
- "node_modules/@img/sharp-linux-x64": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz",
- "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==",
- "cpu": [
- "x64"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linux-x64": "1.2.4"
- }
- },
- "node_modules/@img/sharp-linuxmusl-arm64": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz",
- "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==",
- "cpu": [
- "arm64"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linuxmusl-arm64": "1.2.4"
- }
- },
- "node_modules/@img/sharp-linuxmusl-x64": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz",
- "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==",
- "cpu": [
- "x64"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linuxmusl-x64": "1.2.4"
- }
- },
- "node_modules/@img/sharp-wasm32": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz",
- "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==",
- "cpu": [
- "wasm32"
- ],
- "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
- "optional": true,
- "dependencies": {
- "@emnapi/runtime": "^1.7.0"
- },
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-win32-arm64": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz",
- "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==",
- "cpu": [
- "arm64"
- ],
- "license": "Apache-2.0 AND LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-win32-ia32": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz",
- "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==",
- "cpu": [
- "ia32"
- ],
- "license": "Apache-2.0 AND LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-win32-x64": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz",
- "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==",
- "cpu": [
- "x64"
- ],
- "license": "Apache-2.0 AND LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.13",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
- "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.0",
- "@jridgewell/trace-mapping": "^0.3.24"
- }
- },
- "node_modules/@jridgewell/remapping": {
- "version": "2.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
- "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.24"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.5.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
- "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.31",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
- "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "node_modules/@mdx-js/mdx": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz",
- "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==",
- "license": "MIT",
- "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"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/@next/env": {
- "version": "16.2.12",
- "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.12.tgz",
- "integrity": "sha512-d0Z5Bc13Fa4nR8pFAKx2jay2yhJM16vlfHbTzYnUQAxlNb6B6lmn4hjt69lYNt4kRtyYP6gEM49lPRHNbIyneg==",
- "license": "MIT"
- },
- "node_modules/@next/swc-darwin-arm64": {
- "version": "16.2.12",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.12.tgz",
- "integrity": "sha512-0W1R0teHWJrqKX0FH20IzzIWAOuGtBxPGuObrxy1lE8hQvCFj49KE8a3WUg0D7sq6rn6zkM4c7YGUnhudBS6oA==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-darwin-x64": {
- "version": "16.2.12",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.12.tgz",
- "integrity": "sha512-Hy5Ls099+aFUmOLmIgPfLqNi6iCwhL3uQCssz5rWk+5Nkc6TUKCE83DY5BbNylfm3+mfwcSFnLRfrZDJhVxdtw==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-arm64-gnu": {
- "version": "16.2.12",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.12.tgz",
- "integrity": "sha512-+YqU2h1cQkHsGfvjAsrSmst8UIFBibBGm5x3Xgel8NLMiDQtNOM4sM2GOEMvG5YiOBNeN/Ykk8cQC2S0Xrqljg==",
- "cpu": [
- "arm64"
- ],
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-arm64-musl": {
- "version": "16.2.12",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.12.tgz",
- "integrity": "sha512-0qjhiYBaKAqF63LA1ZWAAnKTzFUguAaZiRa5etMLGGPj/B6uEVjtIZldIzFEp3wHlB0koK6aTzqPtSdplTCjoA==",
- "cpu": [
- "arm64"
- ],
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-x64-gnu": {
- "version": "16.2.12",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.12.tgz",
- "integrity": "sha512-7A3q26W+h7gnA15uqBToNuDqBEFZZcqh0mW2mn4AJh/G5pdg2RVE3n4slzLEliASZFG3NmsbEzng/x2Sh09mBg==",
- "cpu": [
- "x64"
- ],
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-x64-musl": {
- "version": "16.2.12",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.12.tgz",
- "integrity": "sha512-qSjL/uppm+cbh21s72Ss8gkiOhQ4dExWHNGOWy6eZV7STj5WsKehgxT61beSsOj+YYQuTplL376lOCdMQU5T8w==",
- "cpu": [
- "x64"
- ],
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-win32-arm64-msvc": {
- "version": "16.2.12",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.12.tgz",
- "integrity": "sha512-X6hzsOUJac/e7AWSbn9gQ9nzHld1xWP5iyjHpYWvud8pufB679O1xg4JDyKr8Xd69Jvd+kM2Der6uftiZCmjYA==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-win32-x64-msvc": {
- "version": "16.2.12",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.12.tgz",
- "integrity": "sha512-F6fakeHuFTLOPt0bslQJdf+xtT+WIP9DVn/m4y1w1mRnVPyh3D/cNvzlRkxM444xfm+IvvYNSOrKiA2CDJ0Uxw==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@orama/orama": {
- "version": "3.1.18",
- "resolved": "https://registry.npmjs.org/@orama/orama/-/orama-3.1.18.tgz",
- "integrity": "sha512-a61ljmRVVyG5MC/698C8/FfFDw5a8LOIvyOLW5fztgUXqUpc1jOfQzOitSCbge657OgXXThmY3Tk8fpiDb4UcA==",
- "license": "Apache-2.0",
- "engines": {
- "node": ">= 20.0.0"
- }
- },
- "node_modules/@shikijs/core": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.3.1.tgz",
- "integrity": "sha512-ANMDxuaPsNMdDC1m4vfvhlDmJweMwkE5XitTwrq2rWHx5jM+dlm4MmHt2PP6t0uejfR77SuhrhJ0zEijIF/uhA==",
- "license": "MIT",
- "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"
- },
- "engines": {
- "node": ">=20"
- }
- },
- "node_modules/@shikijs/engine-javascript": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.3.1.tgz",
- "integrity": "sha512-JBItcnPuYq7jVJdZo/vMj94r+szT7XEjHFX+mvFDGSEIbVAXAGyHAHzhbWzpGOwYidCZrErJLLgn2PVeiokHnQ==",
- "license": "MIT",
- "dependencies": {
- "@shikijs/types": "4.3.1",
- "@shikijs/vscode-textmate": "^10.0.2",
- "oniguruma-to-es": "^4.3.6"
- },
- "engines": {
- "node": ">=20"
- }
- },
- "node_modules/@shikijs/engine-oniguruma": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.3.1.tgz",
- "integrity": "sha512-OXyNMzg0pews+msMj4cHeqT4xiYKKvbnn6VbdAXxfoFl3SSx4fJTc8FadECuc5/H9p3BzhNAoAUXKwAu9rWYhg==",
- "license": "MIT",
- "dependencies": {
- "@shikijs/types": "4.3.1",
- "@shikijs/vscode-textmate": "^10.0.2"
- },
- "engines": {
- "node": ">=20"
- }
- },
- "node_modules/@shikijs/langs": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.3.1.tgz",
- "integrity": "sha512-m0l9nsDqgBHvbZbk7A0/kXz/impK3uB/c6rAn6Gpg/uPtdZRQ+alsN/17MU5thb68XTj/4DxkZAotrM0GGSpDQ==",
- "license": "MIT",
- "dependencies": {
- "@shikijs/types": "4.3.1"
- },
- "engines": {
- "node": ">=20"
- }
- },
- "node_modules/@shikijs/primitive": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.3.1.tgz",
- "integrity": "sha512-CXQRQOYy1leqQ8ceTeJdmXv/bsUY++6QyLpXJ94LZAAYj5X2SKRdc5ipguv4NPyGVKItB2PPwUpRNe0Sjh5S1A==",
- "license": "MIT",
- "dependencies": {
- "@shikijs/types": "4.3.1",
- "@shikijs/vscode-textmate": "^10.0.2",
- "@types/hast": "^3.0.4"
- },
- "engines": {
- "node": ">=20"
- }
- },
- "node_modules/@shikijs/themes": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.3.1.tgz",
- "integrity": "sha512-dgpoJ4WqNi2yTmizQHBJ5zcX6j2lE6icN/0yt4l1kkf16jrY/pwPLoTb1ETsWMz0OBLf9ZNvwmxft+cH+N9qSA==",
- "license": "MIT",
- "dependencies": {
- "@shikijs/types": "4.3.1"
- },
- "engines": {
- "node": ">=20"
- }
- },
- "node_modules/@shikijs/types": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.3.1.tgz",
- "integrity": "sha512-CHFxE0jztBIZRHH6gxXE7DXUCFXjReEGxZ/j0rfSLGKZuwp2xBYycEP14875DSa9KLL/6700oxIq6oO6ef9K2g==",
- "license": "MIT",
- "dependencies": {
- "@shikijs/vscode-textmate": "^10.0.2",
- "@types/hast": "^3.0.4"
- },
- "engines": {
- "node": ">=20"
- }
- },
- "node_modules/@shikijs/vscode-textmate": {
- "version": "10.0.2",
- "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz",
- "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==",
- "license": "MIT"
- },
- "node_modules/@standard-schema/spec": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
- "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
- "license": "MIT"
- },
- "node_modules/@swc/helpers": {
- "version": "0.5.15",
- "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
- "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
- "license": "Apache-2.0",
- "dependencies": {
- "tslib": "^2.8.0"
- }
- },
- "node_modules/@tailwindcss/node": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.2.tgz",
- "integrity": "sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==",
- "dev": true,
- "license": "MIT",
- "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"
- }
- },
- "node_modules/@tailwindcss/oxide": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.2.tgz",
- "integrity": "sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 20"
- },
- "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"
- }
- },
- "node_modules/@tailwindcss/oxide-android-arm64": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.2.tgz",
- "integrity": "sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-darwin-arm64": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.2.tgz",
- "integrity": "sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-darwin-x64": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.2.tgz",
- "integrity": "sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-freebsd-x64": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.2.tgz",
- "integrity": "sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.2.tgz",
- "integrity": "sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.2.tgz",
- "integrity": "sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.2.tgz",
- "integrity": "sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.2.tgz",
- "integrity": "sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-linux-x64-musl": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.2.tgz",
- "integrity": "sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.2.tgz",
- "integrity": "sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==",
- "bundleDependencies": [
- "@napi-rs/wasm-runtime",
- "@emnapi/core",
- "@emnapi/runtime",
- "@tybys/wasm-util",
- "@emnapi/wasi-threads",
- "tslib"
- ],
- "cpu": [
- "wasm32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "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"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": {
- "version": "1.11.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@emnapi/wasi-threads": "1.2.2",
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": {
- "version": "1.11.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": {
- "version": "1.2.2",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": {
- "version": "1.1.4",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@tybys/wasm-util": "^0.10.1"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Brooooooklyn"
- },
- "peerDependencies": {
- "@emnapi/core": "^1.7.1",
- "@emnapi/runtime": "^1.7.1"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": {
- "version": "0.10.2",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": {
- "version": "2.8.1",
- "dev": true,
- "inBundle": true,
- "license": "0BSD",
- "optional": true
- },
- "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.2.tgz",
- "integrity": "sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.2.tgz",
- "integrity": "sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/postcss": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.2.tgz",
- "integrity": "sha512-rjVWYCa7Ngbi5AarT6k8TkxUG3Wl1QKzHdIZVsjZSzf36Jmo2IKZt/NHRAwly8oDkbBOH0YTu+CHuf9jPxMc+g==",
- "dev": true,
- "license": "MIT",
- "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"
- }
- },
- "node_modules/@types/debug": {
- "version": "4.1.13",
- "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz",
- "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==",
- "license": "MIT",
- "dependencies": {
- "@types/ms": "*"
- }
- },
- "node_modules/@types/estree": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
- "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
- "license": "MIT"
- },
- "node_modules/@types/estree-jsx": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz",
- "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==",
- "license": "MIT",
- "dependencies": {
- "@types/estree": "*"
- }
- },
- "node_modules/@types/hast": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz",
- "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==",
- "license": "MIT",
- "dependencies": {
- "@types/unist": "*"
- }
- },
- "node_modules/@types/mdast": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
- "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
- "license": "MIT",
- "dependencies": {
- "@types/unist": "*"
- }
- },
- "node_modules/@types/mdx": {
- "version": "2.0.14",
- "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.14.tgz",
- "integrity": "sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==",
- "license": "MIT"
- },
- "node_modules/@types/ms": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
- "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
- "license": "MIT"
- },
- "node_modules/@types/node": {
- "version": "26.1.1",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.1.tgz",
- "integrity": "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "undici-types": "~8.3.0"
- }
- },
- "node_modules/@types/react": {
- "version": "19.2.17",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz",
- "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==",
- "devOptional": true,
- "license": "MIT",
- "dependencies": {
- "csstype": "^3.2.2"
- }
- },
- "node_modules/@types/react-dom": {
- "version": "19.2.3",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz",
- "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "^19.2.0"
- }
- },
- "node_modules/@types/unist": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
- "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
- "license": "MIT"
- },
- "node_modules/@ungap/structured-clone": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz",
- "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==",
- "license": "ISC"
- },
- "node_modules/acorn": {
- "version": "8.17.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz",
- "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==",
- "license": "MIT",
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-jsx": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "license": "MIT",
- "peerDependencies": {
- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/astring": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz",
- "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==",
- "license": "MIT",
- "bin": {
- "astring": "bin/astring"
- }
- },
- "node_modules/bail": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
- "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/baseline-browser-mapping": {
- "version": "2.10.43",
- "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.43.tgz",
- "integrity": "sha512-AjYpR78kDWAY3Efj+cDTFH9t9SCoL7OoTp1BOb0mQV7S+6CiLwnWM3FyxhJtdPufDFKzmCSFoUncKjWgJEZTCQ==",
- "license": "Apache-2.0",
- "bin": {
- "baseline-browser-mapping": "dist/cli.cjs"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001805",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001805.tgz",
- "integrity": "sha512-52noaS3DubycKSXaU30TwPGIp+POyQSUVa5jBEq3vkRkY0kjyb3LQgvhU6WGyCcyXqVLWO0Cw0Q6BSdD0kUfVA==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "CC-BY-4.0"
- },
- "node_modules/ccount": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
- "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/character-entities": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
- "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/character-entities-html4": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
- "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/character-entities-legacy": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
- "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/character-reference-invalid": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
- "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/chokidar": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
- "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==",
- "license": "MIT",
- "dependencies": {
- "readdirp": "^5.0.0"
- },
- "engines": {
- "node": ">= 20.19.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/class-variance-authority": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
- "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==",
- "license": "Apache-2.0",
- "dependencies": {
- "clsx": "^2.1.1"
- },
- "funding": {
- "url": "https://polar.sh/cva"
- }
- },
- "node_modules/client-only": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
- "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
- "license": "MIT"
- },
- "node_modules/clsx": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
- "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/cnfast": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/cnfast/-/cnfast-0.0.8.tgz",
- "integrity": "sha512-EjXKMfGfdwtV4AcNSQ6AwQaVzpC1B7IxeiwA3FlhTXz+YFlMKVi4c1JX9tgD2QOlahQXjB8KUXrBaYG+3v871Q==",
- "license": "MIT",
- "bin": {
- "cnfast": "bin/cli.js"
- }
- },
- "node_modules/collapse-white-space": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz",
- "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/comma-separated-tokens": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
- "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/compute-scroll-into-view": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz",
- "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==",
- "license": "MIT"
- },
- "node_modules/csstype": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
- "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
- "devOptional": true,
- "license": "MIT"
- },
- "node_modules/debug": {
- "version": "4.4.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
- "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/decode-named-character-reference": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz",
- "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==",
- "license": "MIT",
- "dependencies": {
- "character-entities": "^2.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/dequal": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
- "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/detect-libc": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
- "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
- "devOptional": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/detect-node-es": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
- "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
- "license": "MIT"
- },
- "node_modules/devlop": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
- "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
- "license": "MIT",
- "dependencies": {
- "dequal": "^2.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/enhanced-resolve": {
- "version": "5.21.6",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz",
- "integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "graceful-fs": "^4.2.4",
- "tapable": "^2.3.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/entities": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
- "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=0.12"
- },
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
- "node_modules/esast-util-from-estree": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz",
- "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==",
- "license": "MIT",
- "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"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/esast-util-from-js": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz",
- "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==",
- "license": "MIT",
- "dependencies": {
- "@types/estree-jsx": "^1.0.0",
- "acorn": "^8.0.0",
- "esast-util-from-estree": "^2.0.0",
- "vfile-message": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/esbuild": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz",
- "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==",
- "hasInstallScript": true,
- "license": "MIT",
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=18"
- },
- "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"
- }
- },
- "node_modules/escape-string-regexp": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
- "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/estree-util-attach-comments": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz",
- "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==",
- "license": "MIT",
- "dependencies": {
- "@types/estree": "^1.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/estree-util-build-jsx": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz",
- "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==",
- "license": "MIT",
- "dependencies": {
- "@types/estree-jsx": "^1.0.0",
- "devlop": "^1.0.0",
- "estree-util-is-identifier-name": "^3.0.0",
- "estree-walker": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/estree-util-is-identifier-name": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz",
- "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==",
- "license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/estree-util-scope": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz",
- "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==",
- "license": "MIT",
- "dependencies": {
- "@types/estree": "^1.0.0",
- "devlop": "^1.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/estree-util-to-js": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz",
- "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==",
- "license": "MIT",
- "dependencies": {
- "@types/estree-jsx": "^1.0.0",
- "astring": "^1.8.0",
- "source-map": "^0.7.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/estree-util-value-to-estree": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz",
- "integrity": "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==",
- "license": "MIT",
- "dependencies": {
- "@types/estree": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/remcohaszing"
- }
- },
- "node_modules/estree-util-visit": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz",
- "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==",
- "license": "MIT",
- "dependencies": {
- "@types/estree-jsx": "^1.0.0",
- "@types/unist": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/estree-walker": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
- "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
- "license": "MIT",
- "dependencies": {
- "@types/estree": "^1.0.0"
- }
- },
- "node_modules/extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
- "license": "MIT"
- },
- "node_modules/fdir": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
- "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
- "license": "MIT",
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "picomatch": "^3 || ^4"
- },
- "peerDependenciesMeta": {
- "picomatch": {
- "optional": true
- }
- }
- },
- "node_modules/framer-motion": {
- "version": "12.42.2",
- "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.42.2.tgz",
- "integrity": "sha512-5XY9luDiu0oHfHBjpDthFMh0ES+122w6p/papSJBweMkO8Sn+PW2QaEgRblQBpWFnuvZS5qvarpt/hO2pjGmnw==",
- "license": "MIT",
- "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"
- },
- "peerDependenciesMeta": {
- "@emotion/is-prop-valid": {
- "optional": true
- },
- "react": {
- "optional": true
- },
- "react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/fumadocs-core": {
- "version": "16.11.4",
- "resolved": "https://registry.npmjs.org/fumadocs-core/-/fumadocs-core-16.11.4.tgz",
- "integrity": "sha512-PckGsjeXoQ7UkOn6XuJSNMoZYgYHAtEV5izxCHbjry1A9CM1m/u2dLM6Fefi9PS3SDVGQ8BKiYxtx1i4FF7T7g==",
- "license": "MIT",
- "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",
- "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",
- "yaml": "^2.9.0"
- },
- "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"
- },
- "peerDependenciesMeta": {
- "@mdx-js/mdx": {
- "optional": true
- },
- "@mixedbread/sdk": {
- "optional": true
- },
- "@orama/core": {
- "optional": true
- },
- "@oramacloud/client": {
- "optional": true
- },
- "@tanstack/react-router": {
- "optional": true
- },
- "@types/estree-jsx": {
- "optional": true
- },
- "@types/hast": {
- "optional": true
- },
- "@types/mdast": {
- "optional": true
- },
- "@types/react": {
- "optional": true
- },
- "algoliasearch": {
- "optional": true
- },
- "flexsearch": {
- "optional": true
- },
- "lucide-react": {
- "optional": true
- },
- "next": {
- "optional": true
- },
- "react": {
- "optional": true
- },
- "react-dom": {
- "optional": true
- },
- "react-router": {
- "optional": true
- },
- "waku": {
- "optional": true
- },
- "zod": {
- "optional": true
- }
- }
- },
- "node_modules/fumadocs-mdx": {
- "version": "15.1.1",
- "resolved": "https://registry.npmjs.org/fumadocs-mdx/-/fumadocs-mdx-15.1.1.tgz",
- "integrity": "sha512-qJ5WstRONnCkidmxdKcu9WgYfmM8TbAZRsprWXWnSZk+RIa+QQCnn0FXa1c9Pm8qesYSFVm6HmgKGSI2uPpQ6w==",
- "license": "MIT",
- "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",
- "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",
- "yaml": "^2.9.0",
- "zod": "^4.4.3"
- },
- "bin": {
- "fumadocs-mdx": "bin.js"
- },
- "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"
- },
- "peerDependenciesMeta": {
- "@fumadocs/satteri": {
- "optional": true
- },
- "@types/mdast": {
- "optional": true
- },
- "@types/mdx": {
- "optional": true
- },
- "@types/react": {
- "optional": true
- },
- "mdast-util-directive": {
- "optional": true
- },
- "next": {
- "optional": true
- },
- "react": {
- "optional": true
- },
- "rolldown": {
- "optional": true
- },
- "satteri": {
- "optional": true
- },
- "vite": {
- "optional": true
- }
- }
- },
- "node_modules/fumadocs-ui": {
- "name": "@fumadocs/base-ui",
- "version": "16.11.4",
- "resolved": "https://registry.npmjs.org/@fumadocs/base-ui/-/base-ui-16.11.4.tgz",
- "integrity": "sha512-KUJ/P4niElUw761zjjKiHCowLlTF0NWaLgBFPGprtX0tc4kcrdKfHkBC/eU/gTw+WOp61mYEepxNYo9khrQIuw==",
- "license": "MIT",
- "dependencies": {
- "@base-ui/react": "^1.6.0",
- "@fuma-translate/react": "^1.0.2",
- "@fumadocs/tailwind": "0.1.1",
- "class-variance-authority": "^0.7.1",
- "cnfast": "^0.0.8",
- "lucide-react": "^1.24.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.4",
- "next": "16.x.x",
- "react": "^19.2.0",
- "react-dom": "^19.2.0",
- "takumi-js": "*"
- },
- "peerDependenciesMeta": {
- "@types/mdx": {
- "optional": true
- },
- "@types/react": {
- "optional": true
- },
- "next": {
- "optional": true
- },
- "takumi-js": {
- "optional": true
- }
- }
- },
- "node_modules/get-nonce": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
- "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/github-slugger": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz",
- "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==",
- "license": "ISC"
- },
- "node_modules/graceful-fs": {
- "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/hast-util-from-parse5": {
- "version": "8.0.3",
- "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz",
- "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==",
- "license": "MIT",
- "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"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hast-util-parse-selector": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz",
- "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==",
- "license": "MIT",
- "dependencies": {
- "@types/hast": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hast-util-raw": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz",
- "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==",
- "license": "MIT",
- "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"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hast-util-to-estree": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz",
- "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==",
- "license": "MIT",
- "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"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hast-util-to-html": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz",
- "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==",
- "license": "MIT",
- "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"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hast-util-to-jsx-runtime": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz",
- "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==",
- "license": "MIT",
- "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"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hast-util-to-parse5": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz",
- "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==",
- "license": "MIT",
- "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"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hast-util-whitespace": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
- "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
- "license": "MIT",
- "dependencies": {
- "@types/hast": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hastscript": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz",
- "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==",
- "license": "MIT",
- "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"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/html-void-elements": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz",
- "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/inline-style-parser": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz",
- "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==",
- "license": "MIT"
- },
- "node_modules/is-alphabetical": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
- "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/is-alphanumerical": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
- "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
- "license": "MIT",
- "dependencies": {
- "is-alphabetical": "^2.0.0",
- "is-decimal": "^2.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/is-decimal": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
- "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/is-hexadecimal": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
- "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/is-plain-obj": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
- "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/jiti": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz",
- "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "jiti": "lib/jiti-cli.mjs"
- }
- },
- "node_modules/lightningcss": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
- "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "detect-libc": "^2.0.3"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- },
- "optionalDependencies": {
- "lightningcss-android-arm64": "1.32.0",
- "lightningcss-darwin-arm64": "1.32.0",
- "lightningcss-darwin-x64": "1.32.0",
- "lightningcss-freebsd-x64": "1.32.0",
- "lightningcss-linux-arm-gnueabihf": "1.32.0",
- "lightningcss-linux-arm64-gnu": "1.32.0",
- "lightningcss-linux-arm64-musl": "1.32.0",
- "lightningcss-linux-x64-gnu": "1.32.0",
- "lightningcss-linux-x64-musl": "1.32.0",
- "lightningcss-win32-arm64-msvc": "1.32.0",
- "lightningcss-win32-x64-msvc": "1.32.0"
- }
- },
- "node_modules/lightningcss-android-arm64": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
- "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-darwin-arm64": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
- "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-darwin-x64": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
- "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-freebsd-x64": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
- "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-arm-gnueabihf": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
- "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-arm64-gnu": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
- "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-arm64-musl": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
- "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-x64-gnu": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz",
- "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-x64-musl": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz",
- "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-win32-arm64-msvc": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
- "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-win32-x64-msvc": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
- "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/longest-streak": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
- "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/lucide-react": {
- "version": "1.24.0",
- "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.24.0.tgz",
- "integrity": "sha512-YT6mBD8lGKkg4nM39enlm94/sfJIiW0YKUT60fBy4YK8tai31ylg1VhGNWxkpSKHo9UagfnZqwIff3HTDQwXeA==",
- "license": "ISC",
- "peerDependencies": {
- "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
- }
- },
- "node_modules/magic-string": {
- "version": "0.30.21",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
- "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.5"
- }
- },
- "node_modules/markdown-extensions": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz",
- "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==",
- "license": "MIT",
- "engines": {
- "node": ">=16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/markdown-table": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz",
- "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/mdast-util-find-and-replace": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz",
- "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==",
- "license": "MIT",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "escape-string-regexp": "^5.0.0",
- "unist-util-is": "^6.0.0",
- "unist-util-visit-parents": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-from-markdown": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz",
- "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==",
- "license": "MIT",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "@types/unist": "^3.0.0",
- "decode-named-character-reference": "^1.0.0",
- "devlop": "^1.0.0",
- "mdast-util-to-string": "^4.0.0",
- "micromark": "^4.0.0",
- "micromark-util-decode-numeric-character-reference": "^2.0.0",
- "micromark-util-decode-string": "^2.0.0",
- "micromark-util-normalize-identifier": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0",
- "unist-util-stringify-position": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz",
- "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==",
- "license": "MIT",
- "dependencies": {
- "mdast-util-from-markdown": "^2.0.0",
- "mdast-util-gfm-autolink-literal": "^2.0.0",
- "mdast-util-gfm-footnote": "^2.0.0",
- "mdast-util-gfm-strikethrough": "^2.0.0",
- "mdast-util-gfm-table": "^2.0.0",
- "mdast-util-gfm-task-list-item": "^2.0.0",
- "mdast-util-to-markdown": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm-autolink-literal": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz",
- "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==",
- "license": "MIT",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "ccount": "^2.0.0",
- "devlop": "^1.0.0",
- "mdast-util-find-and-replace": "^3.0.0",
- "micromark-util-character": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm-footnote": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz",
- "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==",
- "license": "MIT",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "devlop": "^1.1.0",
- "mdast-util-from-markdown": "^2.0.0",
- "mdast-util-to-markdown": "^2.0.0",
- "micromark-util-normalize-identifier": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm-strikethrough": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz",
- "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==",
- "license": "MIT",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "mdast-util-from-markdown": "^2.0.0",
- "mdast-util-to-markdown": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm-table": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz",
- "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==",
- "license": "MIT",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "devlop": "^1.0.0",
- "markdown-table": "^3.0.0",
- "mdast-util-from-markdown": "^2.0.0",
- "mdast-util-to-markdown": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm-task-list-item": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz",
- "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==",
- "license": "MIT",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "devlop": "^1.0.0",
- "mdast-util-from-markdown": "^2.0.0",
- "mdast-util-to-markdown": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-mdx": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz",
- "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==",
- "license": "MIT",
- "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"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-mdx-expression": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz",
- "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==",
- "license": "MIT",
- "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"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-mdx-jsx": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz",
- "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==",
- "license": "MIT",
- "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"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-mdxjs-esm": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz",
- "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==",
- "license": "MIT",
- "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"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-phrasing": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz",
- "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==",
- "license": "MIT",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "unist-util-is": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-to-hast": {
- "version": "13.2.1",
- "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz",
- "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==",
- "license": "MIT",
- "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"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-to-markdown": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz",
- "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==",
- "license": "MIT",
- "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"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-to-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
- "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
- "license": "MIT",
- "dependencies": {
- "@types/mdast": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz",
- "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "@types/debug": "^4.0.0",
- "debug": "^4.0.0",
- "decode-named-character-reference": "^1.0.0",
- "devlop": "^1.0.0",
- "micromark-core-commonmark": "^2.0.0",
- "micromark-factory-space": "^2.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-chunked": "^2.0.0",
- "micromark-util-combine-extensions": "^2.0.0",
- "micromark-util-decode-numeric-character-reference": "^2.0.0",
- "micromark-util-encode": "^2.0.0",
- "micromark-util-normalize-identifier": "^2.0.0",
- "micromark-util-resolve-all": "^2.0.0",
- "micromark-util-sanitize-uri": "^2.0.0",
- "micromark-util-subtokenize": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-core-commonmark": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz",
- "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "decode-named-character-reference": "^1.0.0",
- "devlop": "^1.0.0",
- "micromark-factory-destination": "^2.0.0",
- "micromark-factory-label": "^2.0.0",
- "micromark-factory-space": "^2.0.0",
- "micromark-factory-title": "^2.0.0",
- "micromark-factory-whitespace": "^2.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-chunked": "^2.0.0",
- "micromark-util-classify-character": "^2.0.0",
- "micromark-util-html-tag-name": "^2.0.0",
- "micromark-util-normalize-identifier": "^2.0.0",
- "micromark-util-resolve-all": "^2.0.0",
- "micromark-util-subtokenize": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-extension-gfm": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz",
- "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==",
- "license": "MIT",
- "dependencies": {
- "micromark-extension-gfm-autolink-literal": "^2.0.0",
- "micromark-extension-gfm-footnote": "^2.0.0",
- "micromark-extension-gfm-strikethrough": "^2.0.0",
- "micromark-extension-gfm-table": "^2.0.0",
- "micromark-extension-gfm-tagfilter": "^2.0.0",
- "micromark-extension-gfm-task-list-item": "^2.0.0",
- "micromark-util-combine-extensions": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-autolink-literal": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz",
- "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==",
- "license": "MIT",
- "dependencies": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-sanitize-uri": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-footnote": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz",
- "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==",
- "license": "MIT",
- "dependencies": {
- "devlop": "^1.0.0",
- "micromark-core-commonmark": "^2.0.0",
- "micromark-factory-space": "^2.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-normalize-identifier": "^2.0.0",
- "micromark-util-sanitize-uri": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-strikethrough": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz",
- "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==",
- "license": "MIT",
- "dependencies": {
- "devlop": "^1.0.0",
- "micromark-util-chunked": "^2.0.0",
- "micromark-util-classify-character": "^2.0.0",
- "micromark-util-resolve-all": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-table": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz",
- "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==",
- "license": "MIT",
- "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"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-tagfilter": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz",
- "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==",
- "license": "MIT",
- "dependencies": {
- "micromark-util-types": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-task-list-item": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz",
- "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==",
- "license": "MIT",
- "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"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-mdx-expression": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz",
- "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "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"
- }
- },
- "node_modules/micromark-extension-mdx-jsx": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz",
- "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==",
- "license": "MIT",
- "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"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-mdx-md": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz",
- "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==",
- "license": "MIT",
- "dependencies": {
- "micromark-util-types": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-mdxjs": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz",
- "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==",
- "license": "MIT",
- "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"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-mdxjs-esm": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz",
- "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==",
- "license": "MIT",
- "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"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-factory-destination": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz",
- "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-factory-label": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz",
- "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "devlop": "^1.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-factory-mdx-expression": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz",
- "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "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"
- }
- },
- "node_modules/micromark-factory-space": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
- "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-factory-title": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz",
- "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "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"
- }
- },
- "node_modules/micromark-factory-whitespace": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz",
- "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "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"
- }
- },
- "node_modules/micromark-util-character": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
- "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-util-chunked": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz",
- "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "micromark-util-symbol": "^2.0.0"
- }
- },
- "node_modules/micromark-util-classify-character": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz",
- "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-util-combine-extensions": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz",
- "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "micromark-util-chunked": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-util-decode-numeric-character-reference": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz",
- "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "micromark-util-symbol": "^2.0.0"
- }
- },
- "node_modules/micromark-util-decode-string": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz",
- "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "decode-named-character-reference": "^1.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-decode-numeric-character-reference": "^2.0.0",
- "micromark-util-symbol": "^2.0.0"
- }
- },
- "node_modules/micromark-util-encode": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
- "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT"
- },
- "node_modules/micromark-util-events-to-acorn": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz",
- "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "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"
- }
- },
- "node_modules/micromark-util-html-tag-name": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz",
- "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT"
- },
- "node_modules/micromark-util-normalize-identifier": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz",
- "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "micromark-util-symbol": "^2.0.0"
- }
- },
- "node_modules/micromark-util-resolve-all": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz",
- "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-util-sanitize-uri": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
- "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-encode": "^2.0.0",
- "micromark-util-symbol": "^2.0.0"
- }
- },
- "node_modules/micromark-util-subtokenize": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz",
- "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "devlop": "^1.0.0",
- "micromark-util-chunked": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-util-symbol": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
- "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT"
- },
- "node_modules/micromark-util-types": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz",
- "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT"
- },
- "node_modules/motion": {
- "version": "12.42.2",
- "resolved": "https://registry.npmjs.org/motion/-/motion-12.42.2.tgz",
- "integrity": "sha512-Atvv11yUKIid41cVrRBDVX5m8tF8kNpExRSlbpt6APClhDjtwQssgFHhQzejxw7/7YYbjHSPKBVbHo05BuJT5Q==",
- "license": "MIT",
- "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"
- },
- "peerDependenciesMeta": {
- "@emotion/is-prop-valid": {
- "optional": true
- },
- "react": {
- "optional": true
- },
- "react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/motion-dom": {
- "version": "12.42.2",
- "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.42.2.tgz",
- "integrity": "sha512-5gIMWLp/PycBtJRJWRgjxke5n8dlvkSn2DrYW+tr3XcqAZY1xZh6BJyooJXCM8wdfM7wfMjkBJNLge1CKPUIRA==",
- "license": "MIT",
- "dependencies": {
- "motion-utils": "^12.39.0"
- }
- },
- "node_modules/motion-utils": {
- "version": "12.39.0",
- "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.39.0.tgz",
- "integrity": "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==",
- "license": "MIT"
- },
- "node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "node_modules/nanoid": {
- "version": "3.3.16",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz",
- "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/next": {
- "version": "16.2.12",
- "resolved": "https://registry.npmjs.org/next/-/next-16.2.12.tgz",
- "integrity": "sha512-iD59eYQWmbFcEbX7v/acG5DRym9iw1DdaPoD0WTA920naWsE25wShzJW4+UvAs8MK9EC2kBfIH6vtto1H1PHGw==",
- "license": "MIT",
- "dependencies": {
- "@next/env": "16.2.12",
- "@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"
- },
- "bin": {
- "next": "dist/bin/next"
- },
- "engines": {
- "node": ">=20.9.0"
- },
- "optionalDependencies": {
- "@next/swc-darwin-arm64": "16.2.12",
- "@next/swc-darwin-x64": "16.2.12",
- "@next/swc-linux-arm64-gnu": "16.2.12",
- "@next/swc-linux-arm64-musl": "16.2.12",
- "@next/swc-linux-x64-gnu": "16.2.12",
- "@next/swc-linux-x64-musl": "16.2.12",
- "@next/swc-win32-arm64-msvc": "16.2.12",
- "@next/swc-win32-x64-msvc": "16.2.12",
- "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"
- },
- "peerDependenciesMeta": {
- "@opentelemetry/api": {
- "optional": true
- },
- "@playwright/test": {
- "optional": true
- },
- "babel-plugin-react-compiler": {
- "optional": true
- },
- "sass": {
- "optional": true
- }
- }
- },
- "node_modules/next-themes": {
- "version": "0.4.6",
- "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz",
- "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==",
- "license": "MIT",
- "peerDependencies": {
- "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc"
- }
- },
- "node_modules/next/node_modules/postcss": {
- "version": "8.4.31",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
- "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "nanoid": "^3.3.6",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.0.2"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/oniguruma-parser": {
- "version": "0.12.2",
- "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz",
- "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==",
- "license": "MIT"
- },
- "node_modules/oniguruma-to-es": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz",
- "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==",
- "license": "MIT",
- "dependencies": {
- "oniguruma-parser": "^0.12.2",
- "regex": "^6.1.0",
- "regex-recursion": "^6.0.2"
- }
- },
- "node_modules/parse-entities": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz",
- "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==",
- "license": "MIT",
- "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"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/parse-entities/node_modules/@types/unist": {
- "version": "2.0.11",
- "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
- "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
- "license": "MIT"
- },
- "node_modules/parse5": {
- "version": "7.3.0",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
- "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
- "license": "MIT",
- "dependencies": {
- "entities": "^6.0.0"
- },
- "funding": {
- "url": "https://github.com/inikulin/parse5?sponsor=1"
- }
- },
- "node_modules/picocolors": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
- "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
- "license": "ISC"
- },
- "node_modules/picomatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
- "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/postcss": {
- "version": "8.5.19",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.19.tgz",
- "integrity": "sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "nanoid": "^3.3.12",
- "picocolors": "^1.1.1",
- "source-map-js": "^1.2.1"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/property-information": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz",
- "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/react": {
- "version": "19.2.7",
- "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz",
- "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/react-dom": {
- "version": "19.2.7",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz",
- "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==",
- "license": "MIT",
- "dependencies": {
- "scheduler": "^0.27.0"
- },
- "peerDependencies": {
- "react": "^19.2.7"
- }
- },
- "node_modules/react-remove-scroll": {
- "version": "2.7.2",
- "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz",
- "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==",
- "license": "MIT",
- "dependencies": {
- "react-remove-scroll-bar": "^2.3.7",
- "react-style-singleton": "^2.2.3",
- "tslib": "^2.1.0",
- "use-callback-ref": "^1.3.3",
- "use-sidecar": "^1.1.3"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/react-remove-scroll-bar": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz",
- "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==",
- "license": "MIT",
- "dependencies": {
- "react-style-singleton": "^2.2.2",
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/react-style-singleton": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz",
- "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==",
- "license": "MIT",
- "dependencies": {
- "get-nonce": "^1.0.0",
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/readdirp": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz",
- "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 20.19.0"
- },
- "funding": {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/recma-build-jsx": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz",
- "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==",
- "license": "MIT",
- "dependencies": {
- "@types/estree": "^1.0.0",
- "estree-util-build-jsx": "^3.0.0",
- "vfile": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/recma-jsx": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz",
- "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==",
- "license": "MIT",
- "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"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- },
- "peerDependencies": {
- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/recma-parse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz",
- "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==",
- "license": "MIT",
- "dependencies": {
- "@types/estree": "^1.0.0",
- "esast-util-from-js": "^2.0.0",
- "unified": "^11.0.0",
- "vfile": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/recma-stringify": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz",
- "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==",
- "license": "MIT",
- "dependencies": {
- "@types/estree": "^1.0.0",
- "estree-util-to-js": "^2.0.0",
- "unified": "^11.0.0",
- "vfile": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/regex": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz",
- "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==",
- "license": "MIT",
- "dependencies": {
- "regex-utilities": "^2.3.0"
- }
- },
- "node_modules/regex-recursion": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz",
- "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==",
- "license": "MIT",
- "dependencies": {
- "regex-utilities": "^2.3.0"
- }
- },
- "node_modules/regex-utilities": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz",
- "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==",
- "license": "MIT"
- },
- "node_modules/rehype-raw": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz",
- "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==",
- "license": "MIT",
- "dependencies": {
- "@types/hast": "^3.0.0",
- "hast-util-raw": "^9.0.0",
- "vfile": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/rehype-recma": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz",
- "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==",
- "license": "MIT",
- "dependencies": {
- "@types/estree": "^1.0.0",
- "@types/hast": "^3.0.0",
- "hast-util-to-estree": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/remark/-/remark-15.0.1.tgz",
- "integrity": "sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==",
- "license": "MIT",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "remark-parse": "^11.0.0",
- "remark-stringify": "^11.0.0",
- "unified": "^11.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-gfm": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz",
- "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==",
- "license": "MIT",
- "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"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-mdx": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz",
- "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==",
- "license": "MIT",
- "dependencies": {
- "mdast-util-mdx": "^3.0.0",
- "micromark-extension-mdxjs": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-parse": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
- "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==",
- "license": "MIT",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "mdast-util-from-markdown": "^2.0.0",
- "micromark-util-types": "^2.0.0",
- "unified": "^11.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-rehype": {
- "version": "11.1.2",
- "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz",
- "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==",
- "license": "MIT",
- "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"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-stringify": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz",
- "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==",
- "license": "MIT",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "mdast-util-to-markdown": "^2.0.0",
- "unified": "^11.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/reselect": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.2.0.tgz",
- "integrity": "sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==",
- "license": "MIT"
- },
- "node_modules/scheduler": {
- "version": "0.27.0",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
- "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
- "license": "MIT"
- },
- "node_modules/scroll-into-view-if-needed": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz",
- "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==",
- "license": "MIT",
- "dependencies": {
- "compute-scroll-into-view": "^3.0.2"
- }
- },
- "node_modules/semver": {
- "version": "7.8.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
- "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
- "license": "ISC",
- "optional": true,
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/sharp": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz",
- "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==",
- "hasInstallScript": true,
- "license": "Apache-2.0",
- "optional": true,
- "dependencies": {
- "@img/colour": "^1.0.0",
- "detect-libc": "^2.1.2",
- "semver": "^7.7.3"
- },
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "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"
- }
- },
- "node_modules/shiki": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.3.1.tgz",
- "integrity": "sha512-oR+qDVi2OjX1tmDpyv+3KviX01KzO6Af+0NNnKnsp9491UEGz2YpxTuJboS/6VhYpTdqzmuJBuiTlrAWWJAssw==",
- "license": "MIT",
- "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"
- },
- "engines": {
- "node": ">=20"
- }
- },
- "node_modules/source-map": {
- "version": "0.7.6",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz",
- "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">= 12"
- }
- },
- "node_modules/source-map-js": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
- "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/space-separated-tokens": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
- "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/stringify-entities": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
- "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
- "license": "MIT",
- "dependencies": {
- "character-entities-html4": "^2.0.0",
- "character-entities-legacy": "^3.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/style-to-js": {
- "version": "1.1.21",
- "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz",
- "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==",
- "license": "MIT",
- "dependencies": {
- "style-to-object": "1.0.14"
- }
- },
- "node_modules/style-to-object": {
- "version": "1.0.14",
- "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz",
- "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==",
- "license": "MIT",
- "dependencies": {
- "inline-style-parser": "0.2.7"
- }
- },
- "node_modules/styled-jsx": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz",
- "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==",
- "license": "MIT",
- "dependencies": {
- "client-only": "0.0.1"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "peerDependencies": {
- "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0"
- },
- "peerDependenciesMeta": {
- "@babel/core": {
- "optional": true
- },
- "babel-plugin-macros": {
- "optional": true
- }
- }
- },
- "node_modules/tailwindcss": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.2.tgz",
- "integrity": "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==",
- "devOptional": true,
- "license": "MIT"
- },
- "node_modules/tapable": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
- "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/tinyexec": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz",
- "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==",
- "license": "MIT",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/tinyglobby": {
- "version": "0.2.17",
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
- "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
- "license": "MIT",
- "dependencies": {
- "fdir": "^6.5.0",
- "picomatch": "^4.0.4"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/SuperchupuDev"
- }
- },
- "node_modules/trim-lines": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
- "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/trough": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz",
- "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/tslib": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
- "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
- "license": "0BSD"
- },
- "node_modules/typescript": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz",
- "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==",
- "dev": true,
- "license": "Apache-2.0",
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=14.17"
- }
- },
- "node_modules/undici-types": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz",
- "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/unified": {
- "version": "11.0.5",
- "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
- "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==",
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "bail": "^2.0.0",
- "devlop": "^1.0.0",
- "extend": "^3.0.0",
- "is-plain-obj": "^4.0.0",
- "trough": "^2.0.0",
- "vfile": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-is": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz",
- "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==",
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-position": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
- "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-position-from-estree": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz",
- "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==",
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-remove-position": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz",
- "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==",
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "unist-util-visit": "^5.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-stringify-position": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
- "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-visit": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz",
- "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==",
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "unist-util-is": "^6.0.0",
- "unist-util-visit-parents": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-visit-parents": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz",
- "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==",
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "unist-util-is": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/use-callback-ref": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz",
- "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==",
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/use-sidecar": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz",
- "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==",
- "license": "MIT",
- "dependencies": {
- "detect-node-es": "^1.1.0",
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/use-sync-external-store": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
- "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==",
- "license": "MIT",
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
- }
- },
- "node_modules/vfile": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
- "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "vfile-message": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/vfile-location": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz",
- "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==",
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "vfile": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/vfile-message": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz",
- "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==",
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "unist-util-stringify-position": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/web-namespaces": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz",
- "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/yaml": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
- "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==",
- "license": "ISC",
- "bin": {
- "yaml": "bin.mjs"
- },
- "engines": {
- "node": ">= 14.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/eemeli"
- }
- },
- "node_modules/zod": {
- "version": "4.4.3",
- "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz",
- "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/colinhacks"
- }
- },
- "node_modules/zwitch": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
- "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- }
- }
-}
diff --git a/workshops/build_workshop/playbook/package.json b/workshops/build_workshop/playbook/package.json
deleted file mode 100644
index 8142edc..0000000
--- a/workshops/build_workshop/playbook/package.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "name": "build-ai-with-ai-playbook",
- "version": "0.1.0",
- "private": true,
- "engines": {
- "node": ">=22.12.0"
- },
- "scripts": {
- "build": "next build",
- "dev": "next dev",
- "start": "next start",
- "types:check": "fumadocs-mdx && next typegen && tsc --noEmit",
- "postinstall": "fumadocs-mdx"
- },
- "dependencies": {
- "cnfast": "^0.0.8",
- "fumadocs-core": "16.11.4",
- "fumadocs-mdx": "15.1.1",
- "fumadocs-ui": "npm:@fumadocs/base-ui@16.11.4",
- "lucide-react": "^1.24.0",
- "next": "16.2.12",
- "react": "^19.2.7",
- "react-dom": "^19.2.7"
- },
- "devDependencies": {
- "@tailwindcss/postcss": "^4.3.2",
- "@types/mdx": "^2.0.14",
- "@types/node": "^26.1.1",
- "@types/react": "^19.2.17",
- "@types/react-dom": "^19.2.3",
- "postcss": "^8.5.17",
- "tailwindcss": "^4.3.2",
- "typescript": "^6.0.3"
- }
-}
\ No newline at end of file
diff --git a/workshops/build_workshop/playbook/postcss.config.mjs b/workshops/build_workshop/playbook/postcss.config.mjs
deleted file mode 100644
index 297374d..0000000
--- a/workshops/build_workshop/playbook/postcss.config.mjs
+++ /dev/null
@@ -1,7 +0,0 @@
-const config = {
- plugins: {
- '@tailwindcss/postcss': {},
- },
-};
-
-export default config;
diff --git a/workshops/build_workshop/playbook/proxy.ts b/workshops/build_workshop/playbook/proxy.ts
deleted file mode 100644
index c5ce1be..0000000
--- a/workshops/build_workshop/playbook/proxy.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { NextRequest, NextResponse } from 'next/server';
-import { isMarkdownPreferred, rewritePath } from 'fumadocs-core/negotiation';
-import { docsContentRoute, docsRoute } from '@/lib/shared';
-
-const { rewrite: rewriteDocs } = rewritePath(
- `${docsRoute}{/*path}`,
- `${docsContentRoute}{/*path}/content.md`,
-);
-const { rewrite: rewriteSuffix } = rewritePath(
- `${docsRoute}{/*path}.md`,
- `${docsContentRoute}{/*path}/content.md`,
-);
-
-export default function proxy(request: NextRequest) {
- const result = rewriteSuffix(request.nextUrl.pathname);
- if (result) {
- return NextResponse.rewrite(new URL(result, request.nextUrl));
- }
-
- if (isMarkdownPreferred(request)) {
- const result = rewriteDocs(request.nextUrl.pathname);
-
- if (result) {
- return NextResponse.rewrite(new URL(result, request.nextUrl));
- }
- }
-
- return NextResponse.next();
-}
diff --git a/workshops/build_workshop/playbook/public/clickhouse-logo.svg b/workshops/build_workshop/playbook/public/clickhouse-logo.svg
deleted file mode 100644
index 99b2d8d..0000000
--- a/workshops/build_workshop/playbook/public/clickhouse-logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/workshops/build_workshop/playbook/public/clickhouse-platform.svg b/workshops/build_workshop/playbook/public/clickhouse-platform.svg
deleted file mode 100644
index 3977621..0000000
--- a/workshops/build_workshop/playbook/public/clickhouse-platform.svg
+++ /dev/null
@@ -1,45 +0,0 @@
-
diff --git a/workshops/build_workshop/playbook/public/screenshots/03-ops-dashboard-live.png b/workshops/build_workshop/playbook/public/screenshots/03-ops-dashboard-live.png
deleted file mode 100644
index 747096b..0000000
Binary files a/workshops/build_workshop/playbook/public/screenshots/03-ops-dashboard-live.png and /dev/null differ
diff --git a/workshops/build_workshop/playbook/public/screenshots/04-clickhouse-agents-nav.png b/workshops/build_workshop/playbook/public/screenshots/04-clickhouse-agents-nav.png
deleted file mode 100644
index 8f84411..0000000
Binary files a/workshops/build_workshop/playbook/public/screenshots/04-clickhouse-agents-nav.png and /dev/null differ
diff --git a/workshops/build_workshop/playbook/public/screenshots/05-hyperdx-traces.png b/workshops/build_workshop/playbook/public/screenshots/05-hyperdx-traces.png
deleted file mode 100644
index 11849c3..0000000
Binary files a/workshops/build_workshop/playbook/public/screenshots/05-hyperdx-traces.png and /dev/null differ
diff --git a/workshops/build_workshop/playbook/public/screenshots/06-agent-health-check.png b/workshops/build_workshop/playbook/public/screenshots/06-agent-health-check.png
deleted file mode 100644
index 1eeddac..0000000
Binary files a/workshops/build_workshop/playbook/public/screenshots/06-agent-health-check.png and /dev/null differ
diff --git a/workshops/build_workshop/playbook/public/screenshots/06-dashboard-ai-build.png b/workshops/build_workshop/playbook/public/screenshots/06-dashboard-ai-build.png
deleted file mode 100644
index 268ded1..0000000
Binary files a/workshops/build_workshop/playbook/public/screenshots/06-dashboard-ai-build.png and /dev/null differ
diff --git a/workshops/build_workshop/playbook/public/screenshots/06-generate-dashboard-prompt.png b/workshops/build_workshop/playbook/public/screenshots/06-generate-dashboard-prompt.png
deleted file mode 100644
index 474ab25..0000000
Binary files a/workshops/build_workshop/playbook/public/screenshots/06-generate-dashboard-prompt.png and /dev/null differ
diff --git a/workshops/build_workshop/playbook/public/screenshots/06-sre-dashboard.png b/workshops/build_workshop/playbook/public/screenshots/06-sre-dashboard.png
deleted file mode 100644
index a653b72..0000000
Binary files a/workshops/build_workshop/playbook/public/screenshots/06-sre-dashboard.png and /dev/null differ
diff --git a/workshops/build_workshop/playbook/public/screenshots/06b-agent-add-mcp.png b/workshops/build_workshop/playbook/public/screenshots/06b-agent-add-mcp.png
deleted file mode 100644
index bb5e2b2..0000000
Binary files a/workshops/build_workshop/playbook/public/screenshots/06b-agent-add-mcp.png and /dev/null differ
diff --git a/workshops/build_workshop/playbook/public/screenshots/06b-agent-create.png b/workshops/build_workshop/playbook/public/screenshots/06b-agent-create.png
deleted file mode 100644
index b948978..0000000
Binary files a/workshops/build_workshop/playbook/public/screenshots/06b-agent-create.png and /dev/null differ
diff --git a/workshops/build_workshop/playbook/public/screenshots/06b-agent-mcp-attached.png b/workshops/build_workshop/playbook/public/screenshots/06b-agent-mcp-attached.png
deleted file mode 100644
index f8ca5f9..0000000
Binary files a/workshops/build_workshop/playbook/public/screenshots/06b-agent-mcp-attached.png and /dev/null differ
diff --git a/workshops/build_workshop/playbook/public/screenshots/06b-agent-ready.png b/workshops/build_workshop/playbook/public/screenshots/06b-agent-ready.png
deleted file mode 100644
index 01e6910..0000000
Binary files a/workshops/build_workshop/playbook/public/screenshots/06b-agent-ready.png and /dev/null differ
diff --git a/workshops/build_workshop/playbook/public/screenshots/06b-clickstack-service-id.png b/workshops/build_workshop/playbook/public/screenshots/06b-clickstack-service-id.png
deleted file mode 100644
index 16e0d33..0000000
Binary files a/workshops/build_workshop/playbook/public/screenshots/06b-clickstack-service-id.png and /dev/null differ
diff --git a/workshops/build_workshop/playbook/public/screenshots/06b-fault01-agent-diagnosis.png b/workshops/build_workshop/playbook/public/screenshots/06b-fault01-agent-diagnosis.png
deleted file mode 100644
index 10da305..0000000
Binary files a/workshops/build_workshop/playbook/public/screenshots/06b-fault01-agent-diagnosis.png and /dev/null differ
diff --git a/workshops/build_workshop/playbook/public/screenshots/07-chat-answer-with-sql.png b/workshops/build_workshop/playbook/public/screenshots/07-chat-answer-with-sql.png
deleted file mode 100644
index 2cb37cf..0000000
Binary files a/workshops/build_workshop/playbook/public/screenshots/07-chat-answer-with-sql.png and /dev/null differ
diff --git a/workshops/build_workshop/playbook/public/screenshots/07-chat-ask-ai-button.png b/workshops/build_workshop/playbook/public/screenshots/07-chat-ask-ai-button.png
deleted file mode 100644
index b3750a8..0000000
Binary files a/workshops/build_workshop/playbook/public/screenshots/07-chat-ask-ai-button.png and /dev/null differ
diff --git a/workshops/build_workshop/playbook/public/screenshots/07-client-session-error.png b/workshops/build_workshop/playbook/public/screenshots/07-client-session-error.png
deleted file mode 100644
index 17e744b..0000000
Binary files a/workshops/build_workshop/playbook/public/screenshots/07-client-session-error.png and /dev/null differ
diff --git a/workshops/build_workshop/playbook/public/screenshots/07-fault01-root-cause.png b/workshops/build_workshop/playbook/public/screenshots/07-fault01-root-cause.png
deleted file mode 100644
index 9324fac..0000000
Binary files a/workshops/build_workshop/playbook/public/screenshots/07-fault01-root-cause.png and /dev/null differ
diff --git a/workshops/build_workshop/playbook/public/screenshots/07-langfuse-trace.png b/workshops/build_workshop/playbook/public/screenshots/07-langfuse-trace.png
deleted file mode 100644
index 9f58ea9..0000000
Binary files a/workshops/build_workshop/playbook/public/screenshots/07-langfuse-trace.png and /dev/null differ
diff --git a/workshops/build_workshop/playbook/public/screenshots/08-chat-answer-with-sql.png b/workshops/build_workshop/playbook/public/screenshots/08-chat-answer-with-sql.png
deleted file mode 100644
index 2cb37cf..0000000
Binary files a/workshops/build_workshop/playbook/public/screenshots/08-chat-answer-with-sql.png and /dev/null differ
diff --git a/workshops/build_workshop/playbook/public/screenshots/08-chat-ask-ai-button.png b/workshops/build_workshop/playbook/public/screenshots/08-chat-ask-ai-button.png
deleted file mode 100644
index b3750a8..0000000
Binary files a/workshops/build_workshop/playbook/public/screenshots/08-chat-ask-ai-button.png and /dev/null differ
diff --git a/workshops/build_workshop/playbook/public/screenshots/08-client-session-error.png b/workshops/build_workshop/playbook/public/screenshots/08-client-session-error.png
deleted file mode 100644
index 17e744b..0000000
Binary files a/workshops/build_workshop/playbook/public/screenshots/08-client-session-error.png and /dev/null differ
diff --git a/workshops/build_workshop/playbook/public/screenshots/08-fault01-root-cause.png b/workshops/build_workshop/playbook/public/screenshots/08-fault01-root-cause.png
deleted file mode 100644
index 9324fac..0000000
Binary files a/workshops/build_workshop/playbook/public/screenshots/08-fault01-root-cause.png and /dev/null differ
diff --git a/workshops/build_workshop/playbook/public/screenshots/08-langfuse-trace.png b/workshops/build_workshop/playbook/public/screenshots/08-langfuse-trace.png
deleted file mode 100644
index 9f58ea9..0000000
Binary files a/workshops/build_workshop/playbook/public/screenshots/08-langfuse-trace.png and /dev/null differ
diff --git a/workshops/build_workshop/playbook/public/screenshots/README.md b/workshops/build_workshop/playbook/public/screenshots/README.md
deleted file mode 100644
index 2d7887b..0000000
--- a/workshops/build_workshop/playbook/public/screenshots/README.md
+++ /dev/null
@@ -1,97 +0,0 @@
-# Console screenshots
-
-Status: SCREENSHOTS-DEFERRED. No authenticated captures exist yet. This directory
-holds the shot list and capture instructions so the screenshots can be taken during
-the dry run against a logged-in ClickHouse Cloud account. The learner modules already
-contain `{/* screenshot: name */}` placeholders (see mapping below); embeds are wired
-in once the PNGs land here.
-
-Why deferred: authenticated capture via the headless/automated browser could not be
-made reliable in the build environment (details in the Capture notes section). The
-fastest reliable path is to capture manually from a browser already logged in to
-ClickHouse Cloud, or to run the automated flow from a machine where the cookie picker
-can extract the session cookie.
-
-## Target service
-
-`build-workshop-e2e-tools` (us-east-1, MCP already enabled). Data may be loading into
-it; that is fine for screenshots.
-
-## Shot list
-
-Save each as a 1280px-wide PNG in this directory, using these exact names.
-
-| File | Surface | What it should show |
-|------|---------|---------------------|
-| `console-services.png` | console.clickhouse.cloud/services | Services list/home with the service tile |
-| `service-overview.png` | the build-workshop-e2e-tools service page | Service overview |
-| `connect-modal-mcp.png` | service > Connect > "Connect with: MCP" | The MCP view: "Enable Model Context Protocol" toggle (already ON) and the endpoint URL |
-| `connect-modal-credentials.png` | same Connect modal, default view | Host/port credentials view. Verify the password stays masked before saving the image |
-| `sql-console.png` | service > SQL console | A trivial read-only result (`SELECT count() FROM system.tables`) if data exists, else the empty editor |
-| `clickpipes-tiles.png` | service > Data sources | The create-source tile grid (Postgres / S3 / Kafka, etc.). Do not configure anything |
-| `clickpipes-postgres-step1.png` | Data sources > new Postgres CDC | The Postgres wizard FIRST screen, connection form EMPTY. Do not fill or submit |
-| `api-keys-page.png` | console.clickhouse.cloud/organizations/keys | Org API Keys list view only. Do NOT create a key; only show existing rows if names are non-sensitive |
-| `agents-ui.png` | ai.clickhouse.cloud | Landing / agent picker, view only |
-| `hyperdx-home.png` | hyperdx.clickhouse.cloud (ClickStack) | The ClickStack/HyperDX entry, only if it opens without requiring "Start Ingestion" clicks. Otherwise capture the pre-click state |
-
-Not captured:
-- Langfuse (`langfuse-traces` placeholder) is a different product with a separate login. Skipped by design.
-- ClickPipes wizard step 2 (`clickpipes-wizard-replication` placeholder) requires filling and submitting the connection form to advance, which violates the read-only rule for this task. Left for the dry run, where a real pipe is configured anyway.
-
-## Placeholder mapping
-
-When a PNG exists, replace the matching `{/* screenshot: name */}` JSX comment in the
-module with an image embed plus a short italic caption (mini-workshop style). Paths are
-relative to the playbook root.
-
-| Placeholder (module:line) | Capture file |
-|---------------------------|--------------|
-| `content/docs/learner/00-setup.mdx` `{/* screenshot: connect-mcp-modal */}` | `connect-modal-mcp.png` |
-| `content/docs/learner/00-setup.mdx` `{/* screenshot: connect-modal */}` | `connect-modal-credentials.png` |
-| `content/docs/learner/00-setup.mdx` `{/* screenshot: api-keys-page */}` | `api-keys-page.png` |
-| `content/docs/learner/03-realtime-cdc.mdx` `{/* screenshot: clickpipes-wizard-connection */}` | `clickpipes-postgres-step1.png` |
-| `content/docs/learner/04-clickhouse-agents.mdx` `{/* screenshot: clickhouse-agents-ui */}` | `agents-ui.png` |
-| `content/docs/learner/05-clickstack.mdx` `{/* screenshot: clickstack-hyperdx */}` | `hyperdx-home.png` |
-| `content/docs/learner/03-realtime-cdc.mdx` `{/* screenshot: clickpipes-wizard-replication */}` | PENDING (wizard step 2, see Not captured) |
-| `content/docs/learner/08-chat-langfuse.mdx` `{/* screenshot: langfuse-traces */}` | PENDING (Langfuse, skipped) |
-
-`console-services.png`, `service-overview.png`, `sql-console.png`, and
-`clickpipes-tiles.png` have no placeholder yet; they can go in a doc gallery or get
-placeholders added later.
-
-The old module-number filenames for the five module 07/08 screenshots are retained as
-compatibility aliases so saved links continue to load after the module reorder. New content
-must use the filenames that match the current module number.
-
-## Redaction (before publishing)
-
-These docs are published, so before committing any capture, check for and blur/crop:
-- The user's email and organization name (often in the top-right account menu and org switcher).
-- Any full API key value. The keys list should show names/prefixes only; never a full secret.
-- The service password in the Connect > credentials view. The console masks it by
- default. Confirm it is masked (dots), not revealed, before saving `connect-modal-credentials.png`.
-- ClickPipes connection strings if any host/credentials get pre-filled.
-
-Flag any capture that still contains identifying info in a note next to it here, and do
-not embed it in a published module until it is redacted.
-
-## Capture notes (for whoever does the dry run)
-
-Deep-link URL patterns for the target service (replace `` with the service UUID
-from the services page):
-- Service overview: `console.clickhouse.cloud/services/`
-- SQL console: `console.clickhouse.cloud/services//console`
-- Data sources / ClickPipes tiles: `console.clickhouse.cloud/services//dataSources`
-- Postgres wizard step 1: `console.clickhouse.cloud/services//dataSources/new/postgres`
-- Org API keys: `console.clickhouse.cloud/organizations/keys`
-
-Manual capture is the reliable path: open each URL in a browser already logged in to
-ClickHouse Cloud, size the window to about 1280px wide, and save with the exact file
-name above.
-
-If capturing via the gstack `browse` tool: the httpOnly session cookie is only
-extractable through the interactive cookie picker (`cookie-import-browser` with no
-args), not through `--domain` import. Keep the browse server alive across commands with
-a background holder and route every command with a fixed `BROWSE_STATE_FILE`; do not use
-`status`/`focus` against a headed session (they spawn a competing server and tear it
-down). See the `gstack-browse-auth-capture` project memory for the full writeup.
diff --git a/workshops/build_workshop/playbook/public/workshop-architecture.svg b/workshops/build_workshop/playbook/public/workshop-architecture.svg
deleted file mode 100644
index a59e3f8..0000000
--- a/workshops/build_workshop/playbook/public/workshop-architecture.svg
+++ /dev/null
@@ -1,104 +0,0 @@
-
diff --git a/workshops/build_workshop/playbook/public/workshop-data-flow.svg b/workshops/build_workshop/playbook/public/workshop-data-flow.svg
deleted file mode 100644
index 565a344..0000000
--- a/workshops/build_workshop/playbook/public/workshop-data-flow.svg
+++ /dev/null
@@ -1,105 +0,0 @@
-
diff --git a/workshops/build_workshop/playbook/public/workshop-module-flow.svg b/workshops/build_workshop/playbook/public/workshop-module-flow.svg
deleted file mode 100644
index 491c75f..0000000
--- a/workshops/build_workshop/playbook/public/workshop-module-flow.svg
+++ /dev/null
@@ -1,76 +0,0 @@
-
diff --git a/workshops/build_workshop/playbook/source.config.ts b/workshops/build_workshop/playbook/source.config.ts
deleted file mode 100644
index a35628a..0000000
--- a/workshops/build_workshop/playbook/source.config.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { defineConfig, defineDocs } from 'fumadocs-mdx/config';
-import { metaSchema, pageSchema } from 'fumadocs-core/source/schema';
-
-// You can customize Zod schemas for frontmatter and `meta.json` here
-// see https://fumadocs.dev/docs/mdx/collections
-export const docs = defineDocs({
- dir: 'content/docs',
- docs: {
- schema: pageSchema,
- postprocess: {
- includeProcessedMarkdown: true,
- },
- },
- meta: {
- schema: metaSchema,
- },
-});
-
-export default defineConfig({
- mdxOptions: {
- // MDX options
- },
-});
diff --git a/workshops/build_workshop/playbook/src/app/(home)/layout.tsx b/workshops/build_workshop/playbook/src/app/(home)/layout.tsx
deleted file mode 100644
index 77379fa..0000000
--- a/workshops/build_workshop/playbook/src/app/(home)/layout.tsx
+++ /dev/null
@@ -1,6 +0,0 @@
-import { HomeLayout } from 'fumadocs-ui/layouts/home';
-import { baseOptions } from '@/lib/layout.shared';
-
-export default function Layout({ children }: LayoutProps<'/'>) {
- return {children};
-}
diff --git a/workshops/build_workshop/playbook/src/app/(home)/page.tsx b/workshops/build_workshop/playbook/src/app/(home)/page.tsx
deleted file mode 100644
index f8f8c8d..0000000
--- a/workshops/build_workshop/playbook/src/app/(home)/page.tsx
+++ /dev/null
@@ -1,40 +0,0 @@
-import Link from 'next/link';
-
-export default function HomePage() {
- return (
-
-
- ClickHouse BUILD Workshop
-
-
- Build AI with AI
-
-
- A three-hour, hands-on session. You bring an agentic coding tool and take an
- NYC-taxi ride-hailing analytics app from a fresh clone to a live analytics
- platform on ClickHouse Cloud: real-time CDC, conversational BI, observability,
- AI-assisted SRE, and an in-app AI chat traced end to end.
-
-
-
- Read the overview
-
-
- Start the workshop
-
-
- Instructor track
-
-