diff --git a/apps/docs/.gitignore b/apps/docs/.gitignore new file mode 100644 index 0000000..ca86006 --- /dev/null +++ b/apps/docs/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +.next/ +.source/ +out/ diff --git a/apps/docs/app/docs/[[...slug]]/page.tsx b/apps/docs/app/docs/[[...slug]]/page.tsx new file mode 100644 index 0000000..62d2288 --- /dev/null +++ b/apps/docs/app/docs/[[...slug]]/page.tsx @@ -0,0 +1,47 @@ +import { source } from "@/lib/source"; +import { + DocsPage, + DocsBody, + DocsTitle, + DocsDescription, +} from "fumadocs-ui/page"; +import { notFound } from "next/navigation"; +import defaultMdxComponents from "fumadocs-ui/mdx"; +import type { Metadata } from "next"; + +interface PageProps { + params: Promise<{ slug?: string[] }>; +} + +export default async function Page(props: PageProps) { + const params = await props.params; + const page = source.getPage(params.slug); + if (!page) notFound(); + + const MDX = page.data.body; + + return ( + + {page.data.title} + {page.data.description} + + + + + ); +} + +export async function generateStaticParams() { + return source.generateParams(); +} + +export async function generateMetadata(props: PageProps): Promise { + const params = await props.params; + const page = source.getPage(params.slug); + if (!page) notFound(); + + return { + title: page.data.title, + description: page.data.description, + }; +} diff --git a/apps/docs/app/docs/layout.tsx b/apps/docs/app/docs/layout.tsx new file mode 100644 index 0000000..88a8991 --- /dev/null +++ b/apps/docs/app/docs/layout.tsx @@ -0,0 +1,19 @@ +import { DocsLayout } from "fumadocs-ui/layouts/docs"; +import { baseOptions } from "@/lib/layout.shared"; +import { source } from "@/lib/source"; +import type { ReactNode } from "react"; + +export default function Layout({ children }: { children: ReactNode }) { + return ( + + {children} + + ); +} diff --git a/apps/docs/app/global.css b/apps/docs/app/global.css new file mode 100644 index 0000000..dbcc721 --- /dev/null +++ b/apps/docs/app/global.css @@ -0,0 +1,3 @@ +@import "tailwindcss"; +@import "fumadocs-ui/css/neutral.css"; +@import "fumadocs-ui/css/preset.css"; diff --git a/apps/docs/app/layout.tsx b/apps/docs/app/layout.tsx new file mode 100644 index 0000000..179af86 --- /dev/null +++ b/apps/docs/app/layout.tsx @@ -0,0 +1,22 @@ +import { RootProvider } from "fumadocs-ui/provider/next"; +import type { ReactNode } from "react"; +import type { Metadata } from "next"; +import "./global.css"; + +export const metadata: Metadata = { + title: { + template: "%s | GitMem", + default: "GitMem Documentation", + }, + description: "Institutional memory for AI coding agents. Never repeat the same mistake.", +}; + +export default function RootLayout({ children }: { children: ReactNode }) { + return ( + + + {children} + + + ); +} diff --git a/apps/docs/app/page.tsx b/apps/docs/app/page.tsx new file mode 100644 index 0000000..2fb9a12 --- /dev/null +++ b/apps/docs/app/page.tsx @@ -0,0 +1,3 @@ +export default function HomePage() { + return null; +} diff --git a/apps/docs/content/docs/changelog.mdx b/apps/docs/content/docs/changelog.mdx new file mode 100644 index 0000000..33dc711 --- /dev/null +++ b/apps/docs/content/docs/changelog.mdx @@ -0,0 +1,50 @@ +--- +title: Changelog +description: GitMem release history. +--- + +# Changelog + +## v1.0.2 (2026-02-15) + +### Features + +- **`npx gitmem init`** — Interactive setup wizard that detects existing config, prompts, and merges without destroying anything. Replaces the multi-step manual setup. + - 6 steps: memory store, MCP server, CLAUDE.md, permissions, hooks, gitignore + - Flags: `--yes` (non-interactive), `--dry-run` (preview), `--project ` + - Idempotent — re-running safely skips completed steps +- **`npx gitmem uninstall`** — Clean reversal of everything init did. Memory data (`.gitmem/`) preserved by default, `--all` to also delete. + +### Docs + +- Updated README to feature one-command setup, added gitmem.ai link +- Updated docs site installation and getting-started pages + +## v1.0.1 (2026-02-14) + +### Bug Fixes + +- Fixed stdout corruption — 22 `console.log` calls replaced with `console.error` in check.ts +- Error messages now surface in `create_learning` and `record_scar_usage` responses via `errors[]` array +- Session ID validation added to `session_close` — returns clear error with UUID format example instead of confusing DB lookup failure +- Removed hardcoded project enum — project names are now free-form strings + +### Tests + +- +2 regression tests for stdout purity +- +8 tests for error message surfacing +- +10 tests for session ID validation + +## v1.0.0 (2026-02-15) + +### Initial Release + +- 23 core tools (free tier) / 29 tools (pro tier) +- Session management with closing ceremony +- Scar recall with semantic search +- Thread tracking across sessions +- Multi-agent context injection +- Knowledge graph traversal +- Local `.gitmem/` storage (free) or Supabase (pro) +- Claude Code hooks for automatic session management +- 660+ automated tests across 6 tiers diff --git a/apps/docs/content/docs/concepts/index.mdx b/apps/docs/content/docs/concepts/index.mdx new file mode 100644 index 0000000..87fbbd2 --- /dev/null +++ b/apps/docs/content/docs/concepts/index.mdx @@ -0,0 +1,27 @@ +--- +title: Core Concepts +description: Understand the building blocks of GitMem's institutional memory system. +--- + +# Core Concepts + +GitMem is built around a few key ideas that work together to give AI agents persistent, actionable memory. + +## The Memory Loop + +``` +recall → work → learn → close → recall → ... +``` + +1. **Recall** — Before acting, check what you've learned before +2. **Work** — Do the task, applying past lessons +3. **Learn** — Capture new scars, wins, and patterns +4. **Close** — Persist session context for next time + +## Key Concepts + +- [Scars](/docs/concepts/scars) — Mistakes captured as institutional memory, surfaced before you repeat them +- [Sessions](/docs/concepts/sessions) — Bounded work periods with context loading and closing ceremonies +- [Threads](/docs/concepts/threads) — Unresolved work that carries across sessions +- [Learning Types](/docs/concepts/learning-types) — Scars, wins, patterns, and anti-patterns +- [Tiers](/docs/concepts/tiers) — Free (local) vs Pro (Supabase) capabilities diff --git a/apps/docs/content/docs/concepts/learning-types.mdx b/apps/docs/content/docs/concepts/learning-types.mdx new file mode 100644 index 0000000..f531a7c --- /dev/null +++ b/apps/docs/content/docs/concepts/learning-types.mdx @@ -0,0 +1,79 @@ +--- +title: Learning Types +description: The four types of institutional memory in GitMem. +--- + +# Learning Types + +GitMem supports four types of institutional memory, each serving a different purpose. + +## Scars + +**Mistakes to avoid.** The most common learning type. Scars are surfaced automatically via `recall` when an agent plans a similar action. + +```json +{ + "learning_type": "scar", + "title": "Always validate UUID format before DB lookup", + "severity": "medium", + "counter_arguments": ["Internal-only tools may trust input", "UUIDs from trusted sources are pre-validated"] +} +``` + +**Required fields:** title, description, severity, counter_arguments (2+) + +See [Scars](/docs/concepts/scars) for details. + +## Wins + +**Approaches that worked well.** Capture what succeeded so you can replicate it. + +```json +{ + "learning_type": "win", + "title": "Parallel agent spawning cut review time by 60%", + "problem_context": "Code review of 500-line PR was taking too long with sequential analysis", + "solution_approach": "Spawned 3 agents in parallel: one for logic, one for tests, one for security" +} +``` + +**Required fields:** title, description + +## Patterns + +**Reusable strategies.** Document approaches that work in specific contexts. + +```json +{ + "learning_type": "pattern", + "title": "5-Tier Test Pyramid for MCP Servers", + "applies_when": ["shipping MCP servers to npm", "pre-release verification"] +} +``` + +**Required fields:** title, description + +## Anti-Patterns + +**Approaches that seem good but aren't.** Document why a seemingly reasonable approach fails. + +```json +{ + "learning_type": "anti_pattern", + "title": "Don't use console.log in MCP servers", + "description": "MCP uses stdio for JSON-RPC. Any console.log corrupts the transport. Use console.error for diagnostics." +} +``` + +**Required fields:** title, description + +## Severity Levels + +Severity applies to scars and determines surfacing priority: + +| Level | Meaning | Example | +|-------|---------|---------| +| `critical` | Data loss or security risk | "Never store API keys in git" | +| `high` | Significant time waste or user impact | "Done != Deployed != Verified" | +| `medium` | Moderate friction or repeated issue | "Always validate UUIDs before DB lookup" | +| `low` | Minor optimization or preference | "Use descriptive branch names" | diff --git a/apps/docs/content/docs/concepts/meta.json b/apps/docs/content/docs/concepts/meta.json new file mode 100644 index 0000000..c7bd526 --- /dev/null +++ b/apps/docs/content/docs/concepts/meta.json @@ -0,0 +1,4 @@ +{ + "title": "Concepts", + "pages": ["index", "scars", "sessions", "threads", "learning-types", "tiers"] +} diff --git a/apps/docs/content/docs/concepts/scars.mdx b/apps/docs/content/docs/concepts/scars.mdx new file mode 100644 index 0000000..53d161b --- /dev/null +++ b/apps/docs/content/docs/concepts/scars.mdx @@ -0,0 +1,66 @@ +--- +title: Scars +description: How GitMem captures and surfaces mistakes as institutional memory. +--- + +# Scars + +A **scar** is a mistake captured as institutional memory. When an AI agent encounters a problem, the lesson is recorded as a scar so that future agents (or future sessions of the same agent) don't repeat it. + +## How Scars Work + +1. **Something goes wrong** — A deployment fails, a bug slips through, a wrong assumption costs time +2. **The scar is created** — The lesson is captured with title, description, severity, and counter-arguments +3. **Future recall surfaces it** — When an agent plans a similar action, the scar appears automatically + +## Scar Anatomy + +```json +{ + "learning_type": "scar", + "title": "Done != Deployed != Verified Working", + "description": "Marking a task as done after committing code is not enough. The full loop is: commit → push → deploy → verify the service is running and accessible.", + "severity": "high", + "scar_type": "process", + "counter_arguments": [ + "For local-only changes, deployment verification is unnecessary", + "In CI/CD pipelines, deployment may be automatic" + ] +} +``` + +### Required Fields + +| Field | Purpose | +|-------|---------| +| `title` | Short, memorable name for the lesson | +| `description` | Detailed explanation of what went wrong and how to avoid it | +| `severity` | `critical`, `high`, `medium`, or `low` | +| `counter_arguments` | At least 2 reasons why someone might reasonably ignore this scar | + +### Scar Types + +| Type | Decay | Use When | +|------|-------|----------| +| `process` | Never | The lesson is about how to work (e.g., "always run tests before pushing") | +| `incident` | 180 days | A specific incident that may become less relevant over time | +| `context` | 30 days | Temporary context (e.g., "API X is down, use fallback") | + +## Counter-Arguments + +Every scar **requires** at least 2 counter-arguments. This prevents scar accumulation from becoming a burden. Counter-arguments document when it's reasonable to ignore the scar. + +Good counter-arguments: +- Describe specific scenarios where the scar doesn't apply +- Acknowledge trade-offs (speed vs safety) +- Note when the underlying cause has been fixed + +## The Confirm Protocol + +When scars are surfaced via `recall`, the agent must **confirm** each one before proceeding: + +- **APPLYING** — "I've accounted for this lesson" (with evidence) +- **N_A** — "This scar doesn't apply to my current situation" (with reasoning) +- **REFUTED** — "I'm deliberately overriding this scar" (acknowledging risk) + +This ensures scars are actively considered, not just passively displayed. diff --git a/apps/docs/content/docs/concepts/sessions.mdx b/apps/docs/content/docs/concepts/sessions.mdx new file mode 100644 index 0000000..0a5a6a5 --- /dev/null +++ b/apps/docs/content/docs/concepts/sessions.mdx @@ -0,0 +1,72 @@ +--- +title: Sessions +description: How GitMem tracks bounded work periods with context loading and closing ceremonies. +--- + +# Sessions + +A **session** is a bounded work period. It starts when an agent calls `session_start` and ends with `session_close`. Sessions provide continuity between conversations. + +## Session Lifecycle + +### 1. Start + +`session_start` initializes a session and loads context: + +- Creates a unique session ID +- Loads the last session's context (threads, decisions, rapport notes) +- Identifies the agent type (CLI, Desktop, etc.) +- Returns a formatted session banner + +### 2. Work + +During the session, the agent: +- Calls `recall` before consequential actions +- Creates learnings (scars, wins, patterns) +- Logs decisions +- Tracks threads for unfinished work + +### 3. Close + +`session_close` persists the session: + +- **Quick close** — Minimal, for short exploratory sessions +- **Standard close** — Full reflection with 9 questions covering what broke, what worked, and what to remember + +## Session State + +Session state is stored in `.gitmem/`: + +``` +.gitmem/ +├── active-sessions.json # Registry of active sessions +└── sessions/ + └── / + └── session.json # Session data, scars surfaced, etc. +``` + +## Context Loading + +When a new session starts, GitMem loads: + +| Context | Source | Purpose | +|---------|--------|---------| +| Open threads | `threads.json` | Unfinished work to continue | +| Recent decisions | Last session | Architectural context | +| Rapport notes | Last session | How the human prefers to work | + +## The Closing Ceremony + +Standard close asks 9 questions: + +1. What broke that you didn't expect? +2. What took longer than it should have? +3. What would you do differently next time? +4. What pattern or approach worked well? +5. What assumption was wrong? +6. Which scars did you apply? +7. What should be captured as institutional memory? +8. How did the human prefer to work? *(rapport)* +9. What collaborative dynamic worked? *(rapport)* + +These reflections become context for the next session. diff --git a/apps/docs/content/docs/concepts/threads.mdx b/apps/docs/content/docs/concepts/threads.mdx new file mode 100644 index 0000000..e4a234d --- /dev/null +++ b/apps/docs/content/docs/concepts/threads.mdx @@ -0,0 +1,56 @@ +--- +title: Threads +description: Track unresolved work across sessions with GitMem threads. +--- + +# Threads + +**Threads** track unresolved work that carries across sessions. When you can't finish something in the current session, create a thread so the next session picks it up. + +## Creating Threads + +``` +create_thread({ text: "Auth middleware needs rate limiting before production deploy" }) +``` + +Threads include: +- A unique thread ID (e.g., `t-a1b2c3d4`) +- Description text +- Creation timestamp +- Optional Linear issue link + +## Semantic Deduplication + +GitMem uses cosine similarity (threshold > 0.85) to prevent duplicate threads. If you try to create a thread that's semantically identical to an existing one, GitMem returns the existing thread instead. + +## Thread Lifecycle + +``` +create → surface at session_start → resolve +``` + +1. **Create** — `create_thread` during a session +2. **Surface** — Open threads appear in the next `session_start` banner +3. **Resolve** — `resolve_thread` with a resolution note when complete + +## Managing Threads + +| Tool | Purpose | +|------|---------| +| `list_threads` | See all open threads | +| `resolve_thread` | Mark a thread as done | +| `cleanup_threads` | Triage by health (active/cooling/dormant) | + +### Thread Health + +`cleanup_threads` categorizes threads by vitality: + +- **Active** — Recently created or referenced +- **Cooling** — Not referenced in a while +- **Dormant** — Untouched for 30+ days (auto-archivable) + +### Suggested Threads + +`session_start` may suggest threads based on session context. You can: +- **Promote** — `promote_suggestion` converts it to a real thread +- **Dismiss** — `dismiss_suggestion` suppresses it (3 dismissals = permanent suppression) diff --git a/apps/docs/content/docs/concepts/tiers.mdx b/apps/docs/content/docs/concepts/tiers.mdx new file mode 100644 index 0000000..7a62936 --- /dev/null +++ b/apps/docs/content/docs/concepts/tiers.mdx @@ -0,0 +1,41 @@ +--- +title: Tiers +description: GitMem's tier system and how it affects available features. +--- + +# Tiers + +GitMem has three tiers that control which tools and storage backends are available. + +## Free + +- **Storage:** Local `.gitmem/` directory +- **Search:** Local vector cache +- **Tools:** 23 core tools +- **Cost:** $0 +- **Best for:** Solo developers, single-machine workflows + +Set via: `GITMEM_TIER=free` (default) + +## Pro (Coming Soon) + +- **Storage:** Supabase PostgreSQL with pgvector +- **Search:** Semantic search via embeddings +- **Tools:** 29 tools (adds batch, transcripts, cache management) +- **Best for:** Teams, multi-machine workflows, production use + +Pro is currently in development. [Join the mailing list](https://gitmem.ai) to get notified when it launches. + +## Additional Tools (Pro) + +These tools will be available when Pro launches: + +| Tool | Purpose | +|------|---------| +| `record_scar_usage_batch` | Record multiple scar applications at once | +| `save_transcript` | Save session transcript to storage | +| `get_transcript` | Retrieve a saved transcript | +| `search_transcripts` | Semantic search over transcript chunks | +| `cache_status` | Show local cache status | +| `cache_health` | Compare local cache vs remote | +| `cache_flush` | Force reload from Supabase | diff --git a/apps/docs/content/docs/contributing/index.mdx b/apps/docs/content/docs/contributing/index.mdx new file mode 100644 index 0000000..b22720e --- /dev/null +++ b/apps/docs/content/docs/contributing/index.mdx @@ -0,0 +1,72 @@ +--- +title: Contributing +description: How to contribute to GitMem. +--- + +# Contributing + +GitMem is open source. Contributions are welcome. + +## Development Setup + +```bash +git clone https://github.com/nTEG-dev/gitmem +cd gitmem +npm install +npm run build +``` + +## Running Tests + +```bash +# Unit tests (fast, no deps) +npm run test:unit + +# Smoke tests (MCP server boot) +npx vitest run --config vitest.smoke.config.ts + +# All tests +npm test +``` + +See [Testing](/docs/contributing/testing) for the full test pyramid. + +## Project Structure + +``` +gitmem/ +├── src/ +│ ├── server.ts # MCP server entry +│ ├── tools/ # Tool implementations +│ │ ├── definitions.ts # Tool schemas (source of truth) +│ │ ├── recall.ts # Scar surfacing +│ │ ├── session-start.ts +│ │ └── ... +│ ├── services/ # Business logic +│ │ ├── tier.ts # Tier gating +│ │ ├── startup.ts # Cache initialization +│ │ └── ... +│ └── types/ # TypeScript types +├── tests/ +│ ├── unit/ # Unit tests +│ ├── smoke/ # Smoke tests +│ ├── integration/ # Integration tests (Docker) +│ └── e2e/ # End-to-end tests +├── apps/ +│ └── docs/ # This documentation site +└── docs/ # Internal development docs +``` + +## Submitting Changes + +1. Fork the repository +2. Create a feature branch: `git checkout -b feature/my-change` +3. Make your changes with tests +4. Run the test suite: `npm test` +5. Submit a pull request + +## Code Style + +- TypeScript strict mode +- ESM-only (no CommonJS) +- `console.error` for diagnostics (never `console.log` — it corrupts MCP stdio) diff --git a/apps/docs/content/docs/contributing/meta.json b/apps/docs/content/docs/contributing/meta.json new file mode 100644 index 0000000..eb274b3 --- /dev/null +++ b/apps/docs/content/docs/contributing/meta.json @@ -0,0 +1,4 @@ +{ + "title": "Contributing", + "pages": ["index", "testing"] +} diff --git a/apps/docs/content/docs/contributing/testing.mdx b/apps/docs/content/docs/contributing/testing.mdx new file mode 100644 index 0000000..8e14fcb --- /dev/null +++ b/apps/docs/content/docs/contributing/testing.mdx @@ -0,0 +1,85 @@ +--- +title: Testing +description: GitMem's test pyramid and how to run each tier. +--- + +# Testing + +GitMem uses a 6-tier test pyramid. All runnable tests must pass before shipping. + +## Test Tiers + +### Tier 1: Unit Tests + +```bash +npm run test:unit +``` + +- **Count:** 660+ tests +- **Speed:** ~3 seconds +- **Dependencies:** None +- **Coverage:** Schema validation, pure functions, golden regressions + +### Tier 2: Smoke Tests + +```bash +npx vitest run --config vitest.smoke.config.ts +``` + +- **Count:** 9 tests (4 free + 5 pro) +- **Speed:** ~5 seconds +- **Dependencies:** None (free) / Supabase (pro) +- **Coverage:** MCP server boot, tool registration, basic stdio calls + +### Tier 3: Integration Tests + +```bash +npx vitest run --config vitest.integration.config.ts +``` + +- **Count:** 63 tests +- **Speed:** ~30 seconds +- **Dependencies:** Docker (Supabase PostgreSQL) +- **Coverage:** Database operations, session lifecycle, cache, query plans + +### Tier 4: E2E Tests + +```bash +npx vitest run --config vitest.e2e.config.ts +``` + +- **Count:** 60 tests +- **Speed:** ~75 seconds +- **Dependencies:** Varies by suite +- **Coverage:** Full install flow, hooks, MCP via stdio + +### Tier 5: User Journey + +```bash +npx vitest run tests/e2e/user-journey.test.ts --config vitest.e2e.config.ts +``` + +- **Count:** 6 tests +- **Speed:** ~60 seconds +- **Dependencies:** Claude API key +- **Coverage:** Real Claude session verifying hooks, tools, and ceremony + +### Tier 6: Performance + +```bash +npx vitest bench --config vitest.perf.config.ts +``` + +- **Count:** 4 benchmark files +- **Speed:** ~30 seconds +- **Coverage:** Cold start latency, recall speed, cache performance + +## Quick Run (No Docker) + +For development, run the tests that don't need Docker: + +```bash +npm run test:unit && npx vitest run --config vitest.smoke.config.ts +``` + +This covers 670+ tests in under 10 seconds. diff --git a/apps/docs/content/docs/getting-started/configuration.mdx b/apps/docs/content/docs/getting-started/configuration.mdx new file mode 100644 index 0000000..edeee5a --- /dev/null +++ b/apps/docs/content/docs/getting-started/configuration.mdx @@ -0,0 +1,48 @@ +--- +title: Configuration +description: Configure GitMem with environment variables and config files. +--- + +# Configuration + +GitMem works out of the box with zero configuration on the free tier. For Pro tier features (Supabase storage, semantic search), you'll need environment variables. + +## Environment Variables + +| Variable | Default | Purpose | +|----------|---------|---------| +| `GITMEM_DIR` | `.gitmem/` | Override the storage directory location | +| `GITMEM_DEFAULT_PROJECT` | `default` | Default project namespace for scoping | + +## Storage + +### Free Tier (Local) + +All data stored in `.gitmem/` relative to your project root: + +``` +.gitmem/ +├── active-sessions.json # Current session registry +├── sessions/ # Session data per session ID +├── learnings/ # Scars, wins, patterns (JSON) +├── decisions/ # Decision log +├── threads/ # Open threads tracking +└── cache/ # Local vector search cache +``` + +Add `.gitmem/` to your `.gitignore` — session data is machine-specific. + +### Pro Tier (Coming Soon) + +Pro will add Supabase PostgreSQL with pgvector for semantic search, cross-machine sync, and shared team memory. [Join the mailing list](https://gitmem.ai) to get notified. + +## Project Namespaces + +GitMem supports arbitrary project names to scope sessions and searches: + +``` +session_start({ project: "my-api" }) +recall({ plan: "add auth", project: "my-api" }) +``` + +Projects are free-form strings. Use them to separate concerns when working across multiple codebases or domains. diff --git a/apps/docs/content/docs/getting-started/first-session.mdx b/apps/docs/content/docs/getting-started/first-session.mdx new file mode 100644 index 0000000..88ade07 --- /dev/null +++ b/apps/docs/content/docs/getting-started/first-session.mdx @@ -0,0 +1,77 @@ +--- +title: Your First Session +description: Walk through a complete GitMem session from start to close. +--- + +# Your First Session + +This walkthrough shows you what a GitMem-powered session looks like from your AI agent's perspective. + +## 1. Open a Session + +``` +> "Start a GitMem session" +``` + +The agent calls `session_start`, which: +- Creates a session with a unique ID +- Loads context from the last session (threads, decisions, rapport) +- Displays a session banner with status + +## 2. Recall Before Acting + +Before making changes, the agent checks institutional memory: + +``` +> "Add authentication to the API" +``` + +The agent calls `recall` with the plan "add authentication": + +``` +recall({ plan: "add authentication to the API" }) +``` + +GitMem returns relevant scars: +- "JWT token expiry must be validated server-side, not just client-side" +- "Always hash passwords with bcrypt, not SHA-256" + +The agent acknowledges these lessons and applies them. + +## 3. Create Learnings + +When the agent discovers something useful: + +``` +create_learning({ + learning_type: "scar", + title: "OAuth redirect URI must match exactly", + description: "Google OAuth rejects requests where the redirect URI doesn't match character-for-character...", + severity: "medium", + counter_arguments: [ + "In development, localhost variations are usually fine", + "Some providers support wildcard redirects" + ] +}) +``` + +## 4. Close the Session + +``` +> "Let's wrap up" +``` + +The agent calls `session_close`, which persists: +- What was accomplished +- What scars were applied +- Open threads for next session +- A brief reflection + +## What You Get + +After a few sessions, GitMem builds a knowledge base of: +- **Scars** — Mistakes to avoid (surfaced automatically via recall) +- **Wins** — Approaches that worked well +- **Patterns** — Reusable strategies +- **Decisions** — Architectural choices with rationale +- **Threads** — Unfinished work that carries across sessions diff --git a/apps/docs/content/docs/getting-started/free-vs-pro.mdx b/apps/docs/content/docs/getting-started/free-vs-pro.mdx new file mode 100644 index 0000000..1655527 --- /dev/null +++ b/apps/docs/content/docs/getting-started/free-vs-pro.mdx @@ -0,0 +1,46 @@ +--- +title: Free vs Pro +description: What you get today with the free tier and what's coming with Pro. +--- + +# Free vs Pro + +GitMem ships with a fully functional free tier — everything you need to give your AI agents institutional memory. Pro will add cloud storage and team features. + +## What's Included (Free Tier) + +| Feature | How It Works | +|---------|-------------| +| **Session Management** | Local `.gitmem/` directory | +| **Recall (scar surfacing)** | BM25 text search over local scars | +| **Create scars/wins/patterns** | Local JSON files | +| **Threads** | Local tracking across sessions | +| **Session history** | Last session context loaded on start | +| **Semantic search** | Local search over learnings | +| **Multi-agent** | Context injection for agents on the same machine | +| **Analytics** | Basic session analytics | +| **Tools** | 23 core tools | + +## Pro Tier — Coming Soon + +Pro adds cloud-powered features for teams and power users: + +| Feature | What Pro Adds | +|---------|--------------| +| **Storage** | Supabase PostgreSQL (persistent, cross-machine) | +| **Search** | pgvector semantic search with embeddings | +| **Multi-agent** | Shared cloud memory across machines | +| **Session history** | Full history with search | +| **Transcripts** | Save and search session transcripts | +| **Batch operations** | Batch scar recording | +| **Knowledge graph** | Triple-based graph traversal | +| **Cache management** | Status, health, and flush tools | +| **Tools** | 29 tools (6 additional) | + +**Pro will be for you if:** +- You need shared memory across machines or teams +- You want full semantic search with embeddings +- You need session transcript storage +- You're running multi-agent workflows across environments + +[Join the mailing list](https://gitmem.ai) to get notified when Pro launches. diff --git a/apps/docs/content/docs/getting-started/index.mdx b/apps/docs/content/docs/getting-started/index.mdx new file mode 100644 index 0000000..085a131 --- /dev/null +++ b/apps/docs/content/docs/getting-started/index.mdx @@ -0,0 +1,43 @@ +--- +title: Overview +description: Get GitMem running in under 5 minutes. +--- + +# Getting Started + +GitMem gives your AI coding agents institutional memory — the ability to learn from mistakes and remember what works across sessions. + +## Prerequisites + +- **Node.js 18+** (for `npx gitmem init`) +- An MCP-compatible client: [Claude Code](https://claude.com/claude-code), [Claude Desktop](https://claude.ai/download), or [Cursor](https://cursor.sh) + +## Quick Start (30 seconds) + +```bash +# In any project directory +npx gitmem init +``` + +The interactive wizard detects your existing config and sets up everything: +- `.gitmem/` directory with 12 starter scars +- `.mcp.json` with gitmem server entry +- `CLAUDE.md` with memory protocol instructions +- `.claude/settings.json` with lifecycle hooks and tool permissions +- `.gitignore` updated to exclude `.gitmem/` + +Already have `.mcp.json`, `CLAUDE.md`, or hooks? The wizard merges without destroying your existing config. Re-running is safe — completed steps are skipped. + +## What Happens Next + +1. **Start a session** — Your agent calls `session_start` to load context +2. **Recall before acting** — Before consequential actions, `recall` surfaces relevant scars +3. **Learn from outcomes** — Create scars, wins, and patterns as you discover them +4. **Close cleanly** — `session_close` persists what happened for future sessions + +## Next Steps + +- [Installation](/docs/getting-started/installation) — Detailed setup for all environments +- [Configuration](/docs/getting-started/configuration) — Environment variables and config files +- [Your First Session](/docs/getting-started/first-session) — Step-by-step walkthrough +- [Free vs Pro](/docs/getting-started/free-vs-pro) — Tier comparison diff --git a/apps/docs/content/docs/getting-started/installation.mdx b/apps/docs/content/docs/getting-started/installation.mdx new file mode 100644 index 0000000..f2dd2a7 --- /dev/null +++ b/apps/docs/content/docs/getting-started/installation.mdx @@ -0,0 +1,129 @@ +--- +title: Installation +description: Install GitMem via npx, global install, or MCP configuration. +--- + +# Installation + +## Option 1: Init Wizard (Recommended) + +```bash +cd your-project +npx gitmem init +``` + +The interactive wizard walks you through 6 steps: + +1. **Memory Store** — Creates `.gitmem/` with 12 starter scars +2. **MCP Server** — Adds gitmem to `.mcp.json` +3. **Project Instructions** — Appends memory protocols to `CLAUDE.md` +4. **Tool Permissions** — Adds `mcp__gitmem__*` to `.claude/settings.json` +5. **Lifecycle Hooks** — Merges session/recall hooks (preserves your existing hooks) +6. **Gitignore** — Adds `.gitmem/` to `.gitignore` + +### Flags + +```bash +# Accept all defaults (non-interactive) +npx gitmem init --yes + +# Preview what would change (no files written) +npx gitmem init --dry-run + +# Set a project namespace +npx gitmem init --project my-app +``` + +### Idempotent + +Re-running `npx gitmem init` is safe — completed steps are skipped with "Already configured." + +### Uninstall + +```bash +npx gitmem uninstall +``` + +Cleanly reverses everything init did. Your `.gitmem/` data is preserved by default. + +```bash +# Also delete .gitmem/ memory data +npx gitmem uninstall --all +``` + +## Option 2: MCP Server Only + +If you want to configure the MCP server manually without the init wizard: + +### Claude Code + +```bash +claude mcp add gitmem -- npx -y gitmem-mcp +``` + +### Claude Desktop + +Add to `~/Library/Application Support/Claude/claude_desktop_config.json`: + +```json +{ + "mcpServers": { + "gitmem": { + "command": "npx", + "args": ["-y", "gitmem-mcp"] + } + } +} +``` + +Restart Claude Desktop after saving. + +### Cursor + +Add to `.cursor/mcp.json` in your project: + +```json +{ + "mcpServers": { + "gitmem": { + "command": "npx", + "args": ["-y", "gitmem-mcp"] + } + } +} +``` + +## Option 3: Global Install + +```bash +npm install -g gitmem-mcp +``` + +Then reference the global binary in your MCP config: + +```json +{ + "mcpServers": { + "gitmem": { + "command": "gitmem-mcp" + } + } +} +``` + +## Verify Installation + +After setup, ask your AI agent: + +> "Run gitmem-help" + +You should see a list of available commands with your current tier and tool count. + +## Environment Variables + +| Variable | Default | Purpose | +|----------|---------|---------| +| `GITMEM_DIR` | `.gitmem/` | Storage directory | +| `GITMEM_DEFAULT_PROJECT` | `default` | Project namespace for scoping | + +See [Configuration](/docs/getting-started/configuration) for full details. diff --git a/apps/docs/content/docs/getting-started/meta.json b/apps/docs/content/docs/getting-started/meta.json new file mode 100644 index 0000000..2b569b7 --- /dev/null +++ b/apps/docs/content/docs/getting-started/meta.json @@ -0,0 +1,4 @@ +{ + "title": "Getting Started", + "pages": ["index", "installation", "configuration", "first-session", "free-vs-pro"] +} diff --git a/apps/docs/content/docs/guides/closing-ceremony.mdx b/apps/docs/content/docs/guides/closing-ceremony.mdx new file mode 100644 index 0000000..d68d4a2 --- /dev/null +++ b/apps/docs/content/docs/guides/closing-ceremony.mdx @@ -0,0 +1,67 @@ +--- +title: Closing Ceremony +description: How to properly close a GitMem session with reflection and persistence. +--- + +# Closing Ceremony + +The closing ceremony is GitMem's session persistence ritual. It captures what happened, what was learned, and what carries forward. + +## Quick Close vs Standard Close + +| Type | When to Use | What Happens | +|------|-------------|--------------| +| **Quick** | Short sessions (< 30 min), purely exploratory | Minimal persistence, no reflection | +| **Standard** | All substantive work sessions | Full 9-question reflection | + +## Standard Close Flow + +### Step 1: Read Session State + +The agent reads `.gitmem/active-sessions.json` to recover the session ID and any surfaced scars. + +### Step 2: Answer 9 Questions + +The agent reflects on: + +1. **What broke** that you didn't expect? +2. **What took longer** than it should have? +3. **What would you do differently** next time? +4. **What pattern worked** well? +5. **What assumption was wrong?** +6. **Which scars** did you apply? +7. **What should be captured** as institutional memory? +8. **How did the human prefer to work?** (rapport) +9. **What collaborative dynamic** worked or didn't? (rapport) + +### Step 3: Human Review + +The agent asks: "Any corrections or additions?" + +This human checkpoint prevents false learnings from being persisted. + +### Step 4: Create Learnings + +Any new scars, wins, or patterns identified in Q7 are created **before** session close. + +### Step 5: Persist + +`session_close` writes the full session record with: +- Close compliance metadata +- Scar usage records +- Open threads +- Rapport notes for the next session + +## Writing the Payload + +For standard closes, write heavy data to `.gitmem/closing-payload.json` before calling `session_close`. The tool reads this file automatically. + +```json +{ + "closing_reflection": "Session focused on auth migration...", + "task_completion": "partial", + "scars_to_record": [], + "open_threads": ["Rate limiting still needs implementation"], + "decisions": ["Chose JWT over session cookies for stateless auth"] +} +``` diff --git a/apps/docs/content/docs/guides/error-handling.mdx b/apps/docs/content/docs/guides/error-handling.mdx new file mode 100644 index 0000000..ce34ee1 --- /dev/null +++ b/apps/docs/content/docs/guides/error-handling.mdx @@ -0,0 +1,71 @@ +--- +title: Error Handling +description: Understanding and debugging GitMem errors. +--- + +# Error Handling + +GitMem surfaces errors clearly so you can diagnose and fix issues quickly. + +## Error Response Format + +All tools return errors in a consistent format: + +```json +{ + "success": false, + "errors": ["Missing required field: severity"], + "message": "Validation failed" +} +``` + +The `errors` array contains specific, actionable error messages. + +## Common Errors + +### Invalid Session ID + +``` +Error: Invalid session_id format. Expected UUID (e.g., '393adb34-xxxx-xxxx-xxxx-xxxxxxxxxxxx') or short ID (e.g., '393adb34'). Did you forget to run session_start first? +``` + +**Cause:** Passing a placeholder like `SESSION_AUTO` instead of a real session ID. +**Fix:** Call `session_start` first, then use the returned session ID. + +### Missing Severity for Scars + +``` +Error: Missing required field: severity (must be critical, high, medium, or low) +``` + +**Cause:** Creating a scar without specifying severity. +**Fix:** Add `severity: "medium"` (or appropriate level) to your `create_learning` call. + +### Missing Counter-Arguments + +``` +Error: Scars require at least 2 counter_arguments +``` + +**Cause:** Creating a scar with fewer than 2 counter-arguments. +**Fix:** Add at least 2 reasons why someone might reasonably ignore this scar. + +## Silent Failure Prevention + +GitMem tracks all fire-and-forget operations (metrics, cache writes, embeddings) via the Effect Tracker. Use `health` to see success/failure rates: + +``` +health({ failure_limit: 10 }) +``` + +This surfaces any background operations that failed silently. + +## MCP Transport Errors + +If you see garbled JSON or "invalid JSON" errors in your MCP client: + +1. GitMem uses `console.error` (stderr) for all diagnostics +2. `console.log` (stdout) is reserved for MCP JSON-RPC +3. If a plugin or extension writes to stdout, it corrupts the transport + +Check that no other tools are writing to stdout in the same process. diff --git a/apps/docs/content/docs/guides/meta.json b/apps/docs/content/docs/guides/meta.json new file mode 100644 index 0000000..3476943 --- /dev/null +++ b/apps/docs/content/docs/guides/meta.json @@ -0,0 +1,4 @@ +{ + "title": "Guides", + "pages": ["closing-ceremony", "multi-agent", "error-handling"] +} diff --git a/apps/docs/content/docs/guides/multi-agent.mdx b/apps/docs/content/docs/guides/multi-agent.mdx new file mode 100644 index 0000000..b0eade5 --- /dev/null +++ b/apps/docs/content/docs/guides/multi-agent.mdx @@ -0,0 +1,61 @@ +--- +title: Multi-Agent Workflows +description: Inject institutional memory into sub-agents and capture their findings. +--- + +# Multi-Agent Workflows + +GitMem helps coordinate teams of agents on a single machine. The lead agent can inject context into sub-agents and absorb their findings back into institutional memory. + +> **Note:** Cross-machine shared memory requires the Pro tier (coming soon). The workflows below work on the free tier for agents running on the same machine. + +## Context Injection + +Before spawning a sub-agent, use `prepare_context` to generate a memory payload: + +``` +prepare_context({ + plan: "review authentication middleware", + format: "compact" // ~500 tokens +}) +``` + +Formats: +- **`full`** — Rich markdown, unlimited tokens +- **`compact`** — ~500 tokens, one line per scar +- **`gate`** — ~100 tokens, blocking scars only + +Include the payload in the sub-agent's prompt so it starts with institutional awareness. + +## Absorbing Observations + +When a sub-agent returns, capture its findings: + +``` +absorb_observations({ + observations: [ + { + source: "Sub-Agent: code review", + text: "Auth middleware doesn't validate token expiry", + severity: "scar_candidate" + }, + { + source: "Sub-Agent: code review", + text: "Good use of middleware pattern for request validation", + severity: "info" + } + ] +}) +``` + +Severity levels: +- **`info`** — Noteworthy but not actionable +- **`warning`** — Potential issue worth tracking +- **`scar_candidate`** — Should be promoted to a scar + +## Best Practices + +1. **Always `prepare_context` before spawning** — The 2-3 second cost prevents agents from repeating known mistakes +2. **Always `absorb_observations` after return** — Don't lose sub-agent findings +3. **Use `compact` format for most agents** — `gate` for simple tasks, `full` for complex reviews +4. **Scope by project** — Use project namespaces to keep memories relevant diff --git a/apps/docs/content/docs/index.mdx b/apps/docs/content/docs/index.mdx new file mode 100644 index 0000000..411fc0f --- /dev/null +++ b/apps/docs/content/docs/index.mdx @@ -0,0 +1,30 @@ +--- +title: GitMem +description: Institutional memory for AI coding agents. Memory that compounds. +--- + +# GitMem + +**Institutional memory for AI coding agents.** GitMem is an MCP server that gives AI agents the ability to learn from past mistakes, remember what worked, and share knowledge across sessions. + +## What is GitMem? + +Every time an AI agent makes a mistake, fixes a bug, or discovers a better approach, that knowledge disappears when the session ends. GitMem captures these lessons as **scars** (mistakes to avoid), **wins** (approaches that worked), and **patterns** (reusable strategies) — then surfaces them automatically before the agent takes similar actions. + +## Key Features + +- **Automatic Recall** — Before taking action, agents check institutional memory for relevant lessons +- **Session Continuity** — Context carries across sessions via threads and session history +- **Multi-Agent** — Teams of agents share the same institutional memory +- **MCP Native** — Works with any MCP-compatible client (Claude Code, Claude Desktop, Cursor, etc.) +- **Free Tier** — Local `.gitmem/` storage with no external dependencies + +## Quick Start + +```bash +npx gitmem init +``` + +One command sets up everything: `.gitmem/` directory, `.mcp.json`, `CLAUDE.md`, hooks, and permissions. Already have existing config? The wizard merges without destroying anything. + +[Get Started](/docs/getting-started) | [Concepts](/docs/concepts) | [Tool Reference](/docs/tools) diff --git a/apps/docs/content/docs/meta.json b/apps/docs/content/docs/meta.json new file mode 100644 index 0000000..ef1a48e --- /dev/null +++ b/apps/docs/content/docs/meta.json @@ -0,0 +1,11 @@ +{ + "pages": [ + "index", + "getting-started", + "concepts", + "tools", + "guides", + "contributing", + "changelog" + ] +} diff --git a/apps/docs/content/docs/tools/absorb-observations.mdx b/apps/docs/content/docs/tools/absorb-observations.mdx new file mode 100644 index 0000000..46a3a99 --- /dev/null +++ b/apps/docs/content/docs/tools/absorb-observations.mdx @@ -0,0 +1,27 @@ +--- +title: "absorb_observations" +description: "Capture observations from sub-agents and teammates." +--- + +# absorb_observations + +**Tier:** Free · **Aliases:** `gitmem-ao`, `gm-absorb` + +Capture observations from sub-agents and teammates. The lead agent parses findings from sub-agent responses, then calls this to persist and analyze them. Identifies scar candidates. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `task_id` | string | No | Linear issue or task identifier (optional) | +| `observations` | object[] | Yes | Array of observations from sub-agents/teammates | + +### observations items + +| Field | Type | Required | Description | +|-------|------|----------|-------------| +| `source` | string | Yes | Who made this observation (e.g., "Sub-Agent: code review") | +| `text` | string | Yes | What was observed | +| `severity` | `"info"` \| `"warning"` \| `"scar_candidate"` | Yes | Observation severity | +| `context` | string | No | File, function, or area (optional) | + diff --git a/apps/docs/content/docs/tools/analyze.mdx b/apps/docs/content/docs/tools/analyze.mdx new file mode 100644 index 0000000..d6742e3 --- /dev/null +++ b/apps/docs/content/docs/tools/analyze.mdx @@ -0,0 +1,21 @@ +--- +title: "analyze" +description: "Session analytics and insights engine." +--- + +# analyze + +**Tier:** Pro · **Aliases:** `gitmem-analyze`, `gm-analyze` + +Session analytics and insights engine. Returns formatted markdown by default. Use format=json for raw data. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `lens` | `"summary"` \| `"reflections"` \| `"blindspots"` | No | Analysis lens to apply (default: summary) | +| `days` | number | No | Number of days to analyze (default: 30) | +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | +| `agent` | string | No | Filter by agent identity (e.g., CLI, DAC, CODA-1) | +| `format` | `"text"` \| `"json"` | No | Output format: text (default, compact markdown) or json (raw data) | + diff --git a/apps/docs/content/docs/tools/archive-learning.mdx b/apps/docs/content/docs/tools/archive-learning.mdx new file mode 100644 index 0000000..cad4065 --- /dev/null +++ b/apps/docs/content/docs/tools/archive-learning.mdx @@ -0,0 +1,18 @@ +--- +title: "archive_learning" +description: "Archives a learning (scar/win/pattern) by setting is_active=false and recording archived_at timestamp." +--- + +# archive_learning + +**Tier:** Pro · **Aliases:** `gitmem-al`, `gm-archive` + +Archives a learning (scar/win/pattern) by setting is_active=false and recording archived_at timestamp. Archived learnings are excluded from recall and search results but preserved for audit trail. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `id` | string | Yes | UUID of the learning to archive | +| `reason` | string | No | Optional reason for archiving (e.g., 'superseded by PROJ-123', 'no longer relevant') | + diff --git a/apps/docs/content/docs/tools/cache-flush.mdx b/apps/docs/content/docs/tools/cache-flush.mdx new file mode 100644 index 0000000..ed4b198 --- /dev/null +++ b/apps/docs/content/docs/tools/cache-flush.mdx @@ -0,0 +1,17 @@ +--- +title: "gitmem-cache-flush" +description: "gitmem-cache-flush - Force reload cache from Supabase (use when out of sync)." +--- + +# gitmem-cache-flush + +**Tier:** Pro · **Aliases:** `gm-cache-f` + +gitmem-cache-flush - Force reload cache from Supabase (use when out of sync) + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | + diff --git a/apps/docs/content/docs/tools/cache-health.mdx b/apps/docs/content/docs/tools/cache-health.mdx new file mode 100644 index 0000000..597b0b8 --- /dev/null +++ b/apps/docs/content/docs/tools/cache-health.mdx @@ -0,0 +1,17 @@ +--- +title: "gitmem-cache-health" +description: "gitmem-cache-health - Compare local cache against remote Supabase (detect out-of-sync)." +--- + +# gitmem-cache-health + +**Tier:** Pro · **Aliases:** `gm-cache-h` + +gitmem-cache-health - Compare local cache against remote Supabase (detect out-of-sync) + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | + diff --git a/apps/docs/content/docs/tools/cache-status.mdx b/apps/docs/content/docs/tools/cache-status.mdx new file mode 100644 index 0000000..4cde131 --- /dev/null +++ b/apps/docs/content/docs/tools/cache-status.mdx @@ -0,0 +1,17 @@ +--- +title: "gitmem-cache-status" +description: "gitmem-cache-status - Show local search cache status (scar count, age, staleness)." +--- + +# gitmem-cache-status + +**Tier:** Pro · **Aliases:** `gm-cache-s` + +gitmem-cache-status - Show local search cache status (scar count, age, staleness) + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | + diff --git a/apps/docs/content/docs/tools/cleanup-threads.mdx b/apps/docs/content/docs/tools/cleanup-threads.mdx new file mode 100644 index 0000000..d5d710d --- /dev/null +++ b/apps/docs/content/docs/tools/cleanup-threads.mdx @@ -0,0 +1,18 @@ +--- +title: "cleanup_threads" +description: "Triage open threads by lifecycle health." +--- + +# cleanup_threads + +**Tier:** Free · **Aliases:** `gitmem-cleanup`, `gm-cleanup` + +Triage open threads by lifecycle health. Groups threads as active/cooling/dormant with vitality scores. Use auto_archive=true to archive threads dormant 30+ days. Review and resolve stale threads to keep your thread list healthy. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | +| `auto_archive` | boolean | No | If true, auto-archive threads that have been dormant for 30+ days | + diff --git a/apps/docs/content/docs/tools/confirm-scars.mdx b/apps/docs/content/docs/tools/confirm-scars.mdx new file mode 100644 index 0000000..3efe88b --- /dev/null +++ b/apps/docs/content/docs/tools/confirm-scars.mdx @@ -0,0 +1,25 @@ +--- +title: "confirm_scars" +description: "Confirm surfaced scars with APPLYING/N_A/REFUTED decisions and evidence." +--- + +# confirm_scars + +**Tier:** Free · **Aliases:** `gitmem-cs`, `gm-confirm` + +Confirm surfaced scars with APPLYING/N_A/REFUTED decisions and evidence. REQUIRED after recall() before consequential actions. Each recalled scar must be addressed. APPLYING: past-tense evidence of compliance. N_A: explain why scar doesn't apply. REFUTED: acknowledge risk of overriding. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `confirmations` | object[] | Yes | One confirmation per recalled scar. All recalled scars must be addressed. | + +### confirmations items + +| Field | Type | Required | Description | +|-------|------|----------|-------------| +| `scar_id` | string | Yes | UUID of the surfaced scar (from recall result) | +| `decision` | `"APPLYING"` \| `"N_A"` \| `"REFUTED"` | Yes | APPLYING: scar is relevant, evidence of compliance. N_A: scar doesn't apply, explain why. REFUTED: overriding scar, acknowledge risk. | +| `evidence` | string | Yes | Past-tense evidence (APPLYING), scenario comparison (N_A), or risk acknowledgment (REFUTED). Minimum 50 characters. | + diff --git a/apps/docs/content/docs/tools/create-decision.mdx b/apps/docs/content/docs/tools/create-decision.mdx new file mode 100644 index 0000000..be07d0d --- /dev/null +++ b/apps/docs/content/docs/tools/create-decision.mdx @@ -0,0 +1,25 @@ +--- +title: "create_decision" +description: "Log architectural/operational decision to institutional memory." +--- + +# create_decision + +**Tier:** Free · **Aliases:** `gitmem-cd` + +Log architectural/operational decision to institutional memory + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `title` | string | Yes | Decision title | +| `decision` | string | Yes | What was decided | +| `rationale` | string | Yes | Why this decision was made | +| `alternatives_considered` | string[] | No | Alternatives that were rejected | +| `personas_involved` | string[] | No | Personas involved in decision | +| `docs_affected` | string[] | No | Docs/files affected by this decision (relative paths from repo root) | +| `linear_issue` | string | No | Associated Linear issue | +| `session_id` | string | No | Current session ID | +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | + diff --git a/apps/docs/content/docs/tools/create-learning.mdx b/apps/docs/content/docs/tools/create-learning.mdx new file mode 100644 index 0000000..779e3c0 --- /dev/null +++ b/apps/docs/content/docs/tools/create-learning.mdx @@ -0,0 +1,29 @@ +--- +title: "create_learning" +description: "Create scar, win, or pattern entry in institutional memory." +--- + +# create_learning + +**Tier:** Free · **Aliases:** `gitmem-cl`, `gm-scar` + +Create scar, win, or pattern entry in institutional memory + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `learning_type` | `"scar"` \| `"win"` \| `"pattern"` \| `"anti_pattern"` | Yes | Type of learning | +| `title` | string | Yes | Learning title | +| `description` | string | Yes | Detailed description | +| `severity` | `"critical"` \| `"high"` \| `"medium"` \| `"low"` | No | Severity level (required for scars) | +| `scar_type` | `"process"` \| `"incident"` \| `"context"` | No | Scar type (process, incident, or context). Defaults to 'process'. | +| `counter_arguments` | string[] | No | Counter-arguments for scars (min 2 required) | +| `problem_context` | string | No | Problem context (for wins) | +| `solution_approach` | string | No | Solution approach (for wins) | +| `applies_when` | string[] | No | When this pattern applies | +| `domain` | string[] | No | Domain tags | +| `keywords` | string[] | No | Search keywords | +| `source_linear_issue` | string | No | Source Linear issue | +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | + diff --git a/apps/docs/content/docs/tools/create-thread.mdx b/apps/docs/content/docs/tools/create-thread.mdx new file mode 100644 index 0000000..c7cb910 --- /dev/null +++ b/apps/docs/content/docs/tools/create-thread.mdx @@ -0,0 +1,18 @@ +--- +title: "create_thread" +description: "Create an open thread to track unresolved work across sessions." +--- + +# create_thread + +**Tier:** Free · **Aliases:** `gitmem-ct`, `gm-thread-new` + +Create an open thread to track unresolved work across sessions. Includes semantic dedup: if a similar open thread exists (cosine similarity > 0.85), returns the existing thread instead. Check the 'deduplicated' field in the response. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `text` | string | Yes | Thread description — what needs to be tracked or resolved | +| `linear_issue` | string | No | Associated Linear issue (e.g., PROJ-123) | + diff --git a/apps/docs/content/docs/tools/dismiss-suggestion.mdx b/apps/docs/content/docs/tools/dismiss-suggestion.mdx new file mode 100644 index 0000000..d71402b --- /dev/null +++ b/apps/docs/content/docs/tools/dismiss-suggestion.mdx @@ -0,0 +1,17 @@ +--- +title: "dismiss_suggestion" +description: "Dismiss a suggested thread." +--- + +# dismiss_suggestion + +**Tier:** Free · **Aliases:** `gitmem-ds`, `gm-dismiss` + +Dismiss a suggested thread. Incremented dismiss count — suggestions dismissed 3+ times are permanently suppressed. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `suggestion_id` | string | Yes | Suggestion ID (e.g., "ts-a1b2c3d4") from suggested_threads list | + diff --git a/apps/docs/content/docs/tools/get-transcript.mdx b/apps/docs/content/docs/tools/get-transcript.mdx new file mode 100644 index 0000000..262492f --- /dev/null +++ b/apps/docs/content/docs/tools/get-transcript.mdx @@ -0,0 +1,17 @@ +--- +title: "get_transcript" +description: "Retrieve a session transcript from storage." +--- + +# get_transcript + +**Tier:** Dev · **Aliases:** `gitmem-gt` + +Retrieve a session transcript from storage + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `session_id` | string | Yes | Session ID to retrieve transcript for | + diff --git a/apps/docs/content/docs/tools/graph-traverse.mdx b/apps/docs/content/docs/tools/graph-traverse.mdx new file mode 100644 index 0000000..162ba93 --- /dev/null +++ b/apps/docs/content/docs/tools/graph-traverse.mdx @@ -0,0 +1,22 @@ +--- +title: "graph_traverse" +description: "Traverse the knowledge graph over institutional memory triples." +--- + +# graph_traverse + +**Tier:** Pro · **Aliases:** `gitmem-graph`, `gm-graph` + +Traverse the knowledge graph over institutional memory triples. Answers: 'show me everything connected to PROJ-123', 'what did CLI produce', 'trace this decision back', 'which issues produced the most learnings'. Four lenses: connected_to, produced_by, provenance, stats. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `lens` | `"connected_to"` \| `"produced_by"` \| `"provenance"` \| `"stats"` | Yes | Traversal mode: connected_to (all connections to a node), produced_by (what an agent/persona produced), provenance (trace origin chain), stats (aggregate counts) | +| `node` | string | No | Starting node. Examples: 'PROJ-123', 'CLI', 'Scar: Done ≠ Deployed'. Required for all lenses except stats. | +| `predicate` | `"created_in"` \| `"influenced_by"` \| `"supersedes"` \| `"demonstrates"` | No | Filter by predicate (optional) | +| `depth` | number | No | Max chain depth for provenance lens (default: 3) | +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | +| `limit` | number | No | Max triples to return (default: 50) | + diff --git a/apps/docs/content/docs/tools/health.mdx b/apps/docs/content/docs/tools/health.mdx new file mode 100644 index 0000000..33d2ef4 --- /dev/null +++ b/apps/docs/content/docs/tools/health.mdx @@ -0,0 +1,17 @@ +--- +title: "health" +description: "Show write health for the current session." +--- + +# health + +**Tier:** Free · **Aliases:** `gitmem-health`, `gm-health` + +Show write health for the current session. Reports success/failure rates for all tracked fire-and-forget operations (metrics, cache, triple writes, embeddings, scar usage). Use this to diagnose silent failures. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `failure_limit` | number | No | Max number of recent failures to return (default: 10) | + diff --git a/apps/docs/content/docs/tools/help.mdx b/apps/docs/content/docs/tools/help.mdx new file mode 100644 index 0000000..0232060 --- /dev/null +++ b/apps/docs/content/docs/tools/help.mdx @@ -0,0 +1,11 @@ +--- +title: "gitmem-help" +description: "gitmem-help - Show available commands with ASCII art header." +--- + +# gitmem-help + +**Tier:** Free + +gitmem-help - Show available commands with ASCII art header + diff --git a/apps/docs/content/docs/tools/index.mdx b/apps/docs/content/docs/tools/index.mdx new file mode 100644 index 0000000..953a73a --- /dev/null +++ b/apps/docs/content/docs/tools/index.mdx @@ -0,0 +1,77 @@ +--- +title: Tool Reference +description: Complete reference for all GitMem MCP tools. +--- + +# Tool Reference + +GitMem exposes tools via the [Model Context Protocol](https://modelcontextprotocol.io). Each tool has a canonical name and short aliases for convenience. + +## Core Tools (All Tiers) + +### Session Management + +| Tool | Aliases | Purpose | +|------|---------|---------| +| [session_start](/docs/tools/session-start) | `gitmem-ss`, `gm-open` | Initialize session with context | +| [session_refresh](/docs/tools/session-refresh) | `gitmem-sr`, `gm-refresh` | Reload context mid-session | +| [session_close](/docs/tools/session-close) | `gitmem-sc`, `gm-close` | Close session with reflection | + +### Memory Operations + +| Tool | Aliases | Purpose | +|------|---------|---------| +| [recall](/docs/tools/recall) | `gitmem-r` | Surface relevant scars before acting | +| [confirm_scars](/docs/tools/confirm-scars) | `gitmem-cs`, `gm-confirm` | Confirm recalled scars (APPLYING/N_A/REFUTED) | +| [create_learning](/docs/tools/create-learning) | `gitmem-cl`, `gm-scar` | Create scar/win/pattern | +| [create_decision](/docs/tools/create-decision) | `gitmem-cd` | Log architectural decision | +| [record_scar_usage](/docs/tools/record-scar-usage) | `gitmem-rs` | Track scar application | + +### Search and Discovery + +| Tool | Aliases | Purpose | +|------|---------|---------| +| [search](/docs/tools/search) | `gitmem-search`, `gm-search` | Explore institutional memory | +| [log](/docs/tools/log) | `gitmem-log`, `gm-log` | List recent learnings | +| [analyze](/docs/tools/analyze) | `gitmem-analyze`, `gm-analyze` | Session analytics | + +### Thread Management + +| Tool | Aliases | Purpose | +|------|---------|---------| +| [list_threads](/docs/tools/list-threads) | `gitmem-lt`, `gm-threads` | List open threads | +| [create_thread](/docs/tools/create-thread) | `gitmem-ct`, `gm-thread-new` | Create thread with dedup | +| [resolve_thread](/docs/tools/resolve-thread) | `gitmem-rt`, `gm-resolve` | Mark thread resolved | +| [promote_suggestion](/docs/tools/promote-suggestion) | `gitmem-ps`, `gm-promote` | Promote suggested thread | +| [dismiss_suggestion](/docs/tools/dismiss-suggestion) | `gitmem-ds`, `gm-dismiss` | Dismiss suggested thread | +| [cleanup_threads](/docs/tools/cleanup-threads) | `gitmem-cleanup`, `gm-cleanup` | Triage by health | + +### Multi-Agent + +| Tool | Aliases | Purpose | +|------|---------|---------| +| [prepare_context](/docs/tools/prepare-context) | `gitmem-pc`, `gm-pc` | Memory payload for sub-agents | +| [absorb_observations](/docs/tools/absorb-observations) | `gitmem-ao`, `gm-absorb` | Capture sub-agent findings | + +### Utility + +| Tool | Aliases | Purpose | +|------|---------|---------| +| [graph_traverse](/docs/tools/graph-traverse) | `gitmem-graph`, `gm-graph` | Knowledge graph traversal | +| [archive_learning](/docs/tools/archive-learning) | `gitmem-al`, `gm-archive` | Archive a learning | +| [health](/docs/tools/health) | `gitmem-health`, `gm-health` | Write health report | +| `gitmem-help` | — | Show available commands | + +## Pro-Only Tools (Coming Soon) + +These tools will be available when the Pro tier launches: + +| Tool | Aliases | Purpose | +|------|---------|---------| +| record_scar_usage_batch | `gitmem-rsb` | Batch scar recording | +| save_transcript | `gitmem-st` | Save session transcript | +| get_transcript | `gitmem-gt` | Retrieve transcript | +| search_transcripts | `gitmem-stx`, `gm-stx` | Search transcripts | +| cache_status | `gitmem-cache-status`, `gm-cache-s` | Cache status | +| cache_health | `gitmem-cache-health`, `gm-cache-h` | Cache vs remote comparison | +| cache_flush | `gitmem-cache-flush`, `gm-cache-f` | Force cache reload | diff --git a/apps/docs/content/docs/tools/list-threads.mdx b/apps/docs/content/docs/tools/list-threads.mdx new file mode 100644 index 0000000..af86342 --- /dev/null +++ b/apps/docs/content/docs/tools/list-threads.mdx @@ -0,0 +1,19 @@ +--- +title: "list_threads" +description: "List open threads across recent sessions." +--- + +# list_threads + +**Tier:** Free · **Aliases:** `gitmem-lt`, `gm-threads` + +List open threads across recent sessions. Shows unresolved work items that carry over between sessions, with IDs for resolution. Use resolve_thread to mark threads as done. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `status` | `"open"` \| `"resolved"` | No | Filter by status (default: open) | +| `include_resolved` | boolean | No | Include recently resolved threads (default: false) | +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | + diff --git a/apps/docs/content/docs/tools/log.mdx b/apps/docs/content/docs/tools/log.mdx new file mode 100644 index 0000000..ef83426 --- /dev/null +++ b/apps/docs/content/docs/tools/log.mdx @@ -0,0 +1,21 @@ +--- +title: "log" +description: "List recent learnings chronologically (like git log)." +--- + +# log + +**Tier:** Free · **Aliases:** `gitmem-log`, `gm-log` + +List recent learnings chronologically (like git log). Shows scars, wins, and patterns ordered by creation date. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `limit` | number | No | Number of entries to return (default: 10) | +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | +| `learning_type` | `"scar"` \| `"win"` \| `"pattern"` \| `"anti_pattern"` | No | Filter by learning type | +| `severity` | `"critical"` \| `"high"` \| `"medium"` \| `"low"` | No | Filter by severity level | +| `since` | number | No | Days to look back (e.g., 7 = last week) | + diff --git a/apps/docs/content/docs/tools/meta.json b/apps/docs/content/docs/tools/meta.json new file mode 100644 index 0000000..b7e3e9e --- /dev/null +++ b/apps/docs/content/docs/tools/meta.json @@ -0,0 +1,36 @@ +{ + "title": "Tools", + "pages": [ + "index", + "absorb-observations", + "analyze", + "archive-learning", + "cache-flush", + "cache-health", + "cache-status", + "cleanup-threads", + "confirm-scars", + "create-decision", + "create-learning", + "create-thread", + "dismiss-suggestion", + "get-transcript", + "graph-traverse", + "health", + "help", + "list-threads", + "log", + "prepare-context", + "promote-suggestion", + "recall", + "record-scar-usage", + "record-scar-usage-batch", + "resolve-thread", + "save-transcript", + "search", + "search-transcripts", + "session-close", + "session-refresh", + "session-start" + ] +} diff --git a/apps/docs/content/docs/tools/prepare-context.mdx b/apps/docs/content/docs/tools/prepare-context.mdx new file mode 100644 index 0000000..73bebce --- /dev/null +++ b/apps/docs/content/docs/tools/prepare-context.mdx @@ -0,0 +1,21 @@ +--- +title: "prepare_context" +description: "Generate portable memory payload for sub-agent injection." +--- + +# prepare_context + +**Tier:** Free · **Aliases:** `gitmem-pc`, `gm-pc` + +Generate portable memory payload for sub-agent injection. Formats institutional memory into compact or gate payloads that fit in Task tool prompts. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `plan` | string | Yes | What the team is about to do (e.g., 'review auth middleware', 'deploy edge function') | +| `format` | `"full"` \| `"compact"` \| `"gate"` | Yes | Output format: full (rich markdown), compact (~500 tokens, one-line per scar), gate (~100 tokens, blocking scars only) | +| `max_tokens` | number | No | Token budget for payload (default: 500 for compact, 100 for gate, unlimited for full) | +| `agent_role` | string | No | Sub-agent role for relevance filtering (e.g., 'reviewer', 'deployer') — reserved for Phase 3 | +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | + diff --git a/apps/docs/content/docs/tools/promote-suggestion.mdx b/apps/docs/content/docs/tools/promote-suggestion.mdx new file mode 100644 index 0000000..add1426 --- /dev/null +++ b/apps/docs/content/docs/tools/promote-suggestion.mdx @@ -0,0 +1,18 @@ +--- +title: "promote_suggestion" +description: "Promote a suggested thread to an open thread." +--- + +# promote_suggestion + +**Tier:** Free · **Aliases:** `gitmem-ps`, `gm-promote` + +Promote a suggested thread to an open thread. Takes a suggestion_id from session_start's suggested_threads list and creates a real thread from it. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `suggestion_id` | string | Yes | Suggestion ID (e.g., "ts-a1b2c3d4") from suggested_threads list | +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | + diff --git a/apps/docs/content/docs/tools/recall.mdx b/apps/docs/content/docs/tools/recall.mdx new file mode 100644 index 0000000..871e14f --- /dev/null +++ b/apps/docs/content/docs/tools/recall.mdx @@ -0,0 +1,20 @@ +--- +title: "recall" +description: "Check institutional memory for relevant scars before taking action." +--- + +# recall + +**Tier:** Free · **Aliases:** `gitmem-r` + +Check institutional memory for relevant scars before taking action. Returns matching scars and their lessons. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `plan` | string | Yes | What you're about to do (e.g., 'implement auth layer', 'deploy to production') | +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | +| `match_count` | number | No | Number of scars to return (default: 3) | +| `issue_id` | string | No | Linear issue identifier for variant assignment (e.g., 'PROJ-123'). When provided, scars with variants will be randomly assigned and formatted accordingly. | + diff --git a/apps/docs/content/docs/tools/record-scar-usage-batch.mdx b/apps/docs/content/docs/tools/record-scar-usage-batch.mdx new file mode 100644 index 0000000..4290447 --- /dev/null +++ b/apps/docs/content/docs/tools/record-scar-usage-batch.mdx @@ -0,0 +1,33 @@ +--- +title: "record_scar_usage_batch" +description: "Track multiple scar applications in a single batch operation (reduces session close latency)." +--- + +# record_scar_usage_batch + +**Tier:** Dev · **Aliases:** `gitmem-rsb` + +Track multiple scar applications in a single batch operation (reduces session close latency) + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `scars` | object[] | Yes | Array of scar usage entries to record | +| `project` | string | No | Project scope for scar resolution | + +### scars items + +| Field | Type | Required | Description | +|-------|------|----------|-------------| +| `scar_identifier` | string | Yes | UUID or title/description of scar (tool resolves to UUID) | +| `issue_id` | string | No | Linear issue UUID | +| `issue_identifier` | string | No | Linear issue identifier (e.g., PROJ-123) | +| `surfaced_at` | string | Yes | ISO timestamp when scar was retrieved | +| `acknowledged_at` | string | No | ISO timestamp when scar was acknowledged | +| `reference_type` | `"explicit"` \| `"implicit"` \| `"acknowledged"` \| `"refuted"` \| `"none"` | Yes | How the scar was referenced | +| `reference_context` | string | Yes | How the scar was applied (1-2 sentences) | +| `execution_successful` | boolean | No | Whether the task succeeded after applying scar | +| `session_id` | string | No | GitMem session UUID (for non-issue session tracking) | +| `agent` | string | No | Agent identity (CLI, DAC, CODA-1, etc.) | + diff --git a/apps/docs/content/docs/tools/record-scar-usage.mdx b/apps/docs/content/docs/tools/record-scar-usage.mdx new file mode 100644 index 0000000..cf72943 --- /dev/null +++ b/apps/docs/content/docs/tools/record-scar-usage.mdx @@ -0,0 +1,27 @@ +--- +title: "record_scar_usage" +description: "Track scar application for effectiveness measurement." +--- + +# record_scar_usage + +**Tier:** Free · **Aliases:** `gitmem-rs` + +Track scar application for effectiveness measurement + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `scar_id` | string | Yes | UUID of the scar | +| `issue_id` | string | No | Linear issue UUID | +| `issue_identifier` | string | No | Linear issue identifier (e.g., PROJ-123) | +| `surfaced_at` | string | Yes | ISO timestamp when scar was retrieved | +| `acknowledged_at` | string | No | ISO timestamp when scar was acknowledged | +| `reference_type` | `"explicit"` \| `"implicit"` \| `"acknowledged"` \| `"refuted"` \| `"none"` | Yes | How the scar was referenced | +| `reference_context` | string | Yes | How the scar was applied (1-2 sentences) | +| `execution_successful` | boolean | No | Whether the task succeeded after applying scar | +| `session_id` | string | No | GitMem session UUID (for non-issue session tracking) | +| `agent` | string | No | Agent identity (CLI, DAC, CODA-1, etc.) | +| `variant_id` | string | No | UUID of the assigned variant from scar_enforcement_variants (for A/B testing) | + diff --git a/apps/docs/content/docs/tools/resolve-thread.mdx b/apps/docs/content/docs/tools/resolve-thread.mdx new file mode 100644 index 0000000..915d2da --- /dev/null +++ b/apps/docs/content/docs/tools/resolve-thread.mdx @@ -0,0 +1,19 @@ +--- +title: "resolve_thread" +description: "Mark an open thread as resolved." +--- + +# resolve_thread + +**Tier:** Free · **Aliases:** `gitmem-rt`, `gm-resolve` + +Mark an open thread as resolved. Use thread_id for exact match or text_match for fuzzy matching. Updates session state and .gitmem/threads.json. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `thread_id` | string | No | Thread ID (e.g., "t-a1b2c3d4") for exact resolution | +| `text_match` | string | No | Fuzzy text match against thread descriptions (fallback if no thread_id) | +| `resolution_note` | string | No | Brief note explaining how/why thread was resolved | + diff --git a/apps/docs/content/docs/tools/save-transcript.mdx b/apps/docs/content/docs/tools/save-transcript.mdx new file mode 100644 index 0000000..afeddf4 --- /dev/null +++ b/apps/docs/content/docs/tools/save-transcript.mdx @@ -0,0 +1,20 @@ +--- +title: "save_transcript" +description: "Save full session transcript to storage for training data and post-mortems." +--- + +# save_transcript + +**Tier:** Dev · **Aliases:** `gitmem-st` + +Save full session transcript to storage for training data and post-mortems + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `session_id` | string | Yes | Session ID to associate transcript with | +| `transcript` | string | Yes | Full conversation transcript content | +| `format` | `"json"` \| `"markdown"` | No | Transcript format (default: json) | +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | + diff --git a/apps/docs/content/docs/tools/search-transcripts.mdx b/apps/docs/content/docs/tools/search-transcripts.mdx new file mode 100644 index 0000000..9f272bb --- /dev/null +++ b/apps/docs/content/docs/tools/search-transcripts.mdx @@ -0,0 +1,20 @@ +--- +title: "search_transcripts" +description: "Semantic search over session transcript chunks." +--- + +# search_transcripts + +**Tier:** Dev · **Aliases:** `gitmem-stx`, `gm-stx` + +Semantic search over session transcript chunks. Generates embedding for query and calls match_transcript_chunks RPC to find relevant conversation fragments across all indexed sessions. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `query` | string | Yes | Natural language search query (e.g., 'deployment verification discussion', 'what was decided about caching') | +| `match_count` | number | No | Maximum number of chunks to return (default: 10, max: 50) | +| `similarity_threshold` | number | No | Minimum similarity score 0-1 (default: 0.3). Higher values return more relevant results. | +| `project` | string | No | Project namespace to filter by (e.g., 'my-project') | + diff --git a/apps/docs/content/docs/tools/search.mdx b/apps/docs/content/docs/tools/search.mdx new file mode 100644 index 0000000..71e1f74 --- /dev/null +++ b/apps/docs/content/docs/tools/search.mdx @@ -0,0 +1,21 @@ +--- +title: "search" +description: "Search institutional memory by query." +--- + +# search + +**Tier:** Free · **Aliases:** `gitmem-search`, `gm-search` + +Search institutional memory by query. Unlike recall (which is action-oriented), search is exploration-oriented — returns matching scars/wins/patterns without side effects. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `query` | string | Yes | Natural language search query (e.g., 'deployment failures', 'Supabase RLS') | +| `match_count` | number | No | Number of results to return (default: 5) | +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | +| `severity` | `"critical"` \| `"high"` \| `"medium"` \| `"low"` | No | Filter by severity level | +| `learning_type` | `"scar"` \| `"win"` \| `"pattern"` \| `"anti_pattern"` | No | Filter by learning type | + diff --git a/apps/docs/content/docs/tools/session-close.mdx b/apps/docs/content/docs/tools/session-close.mdx new file mode 100644 index 0000000..910d807 --- /dev/null +++ b/apps/docs/content/docs/tools/session-close.mdx @@ -0,0 +1,20 @@ +--- +title: "session_close" +description: "Persist session with compliance validation." +--- + +# session_close + +**Tier:** Free · **Aliases:** `gitmem-sc`, `gm-close` + +Persist session with compliance validation. IMPORTANT: Before calling this tool, write all heavy payload data (closing_reflection, task_completion, human_corrections, scars_to_record, open_threads, decisions, learnings_created) to `gitmem_dir`/closing-payload.json using your file write tool — the gitmem_dir path is returned by session_start (also shown in session start display as 'Payload path'). Then call this tool with ONLY session_id and close_type. The tool reads the payload file automatically and deletes it after processing. Output the display field verbatim as your response — tool results are collapsed in the CLI. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `session_id` | string | Yes | Session ID from session_start | +| `close_type` | `"standard"` \| `"quick"` \| `"autonomous"` | Yes | Type of close (standard requires full reflection) | +| `linear_issue` | string | No | Associated Linear issue | +| `ceremony_duration_ms` | number | No | End-to-end ceremony duration from agent perspective (in milliseconds) | + diff --git a/apps/docs/content/docs/tools/session-refresh.mdx b/apps/docs/content/docs/tools/session-refresh.mdx new file mode 100644 index 0000000..c4d0e5d --- /dev/null +++ b/apps/docs/content/docs/tools/session-refresh.mdx @@ -0,0 +1,17 @@ +--- +title: "session_refresh" +description: "Re-surface institutional context (threads, decisions) for the current active session without creating a new session." +--- + +# session_refresh + +**Tier:** Free · **Aliases:** `gitmem-sr`, `gm-refresh` + +Re-surface institutional context (threads, decisions) for the current active session without creating a new session. Use mid-session when you need to remember where you left off, after context compaction, or after a long gap. Output the display field verbatim as your response — tool results are collapsed in the CLI. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `project` | string | No | Project namespace (default: from active session). Free-form string (e.g., 'my-project'). | + diff --git a/apps/docs/content/docs/tools/session-start.mdx b/apps/docs/content/docs/tools/session-start.mdx new file mode 100644 index 0000000..c0485ce --- /dev/null +++ b/apps/docs/content/docs/tools/session-start.mdx @@ -0,0 +1,23 @@ +--- +title: "session_start" +description: "Initialize session, detect agent, load institutional context (last session, recent decisions, open threads)." +--- + +# session_start + +**Tier:** Free · **Aliases:** `gitmem-ss`, `gm-open` + +Initialize session, detect agent, load institutional context (last session, recent decisions, open threads). Scars surface on-demand via recall(). Output the display field verbatim as your response — tool results are collapsed in the CLI. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `agent_identity` | `"CLI"` \| `"DAC"` \| `"CODA-1"` \| `"Brain_Local"` \| `"Brain_Cloud"` | No | Override agent identity (auto-detects if not provided) | +| `linear_issue` | string | No | Current Linear issue identifier (e.g., PROJ-123) | +| `issue_title` | string | No | Issue title for scar context | +| `issue_description` | string | No | Issue description for scar context | +| `issue_labels` | string[] | No | Issue labels for scar context | +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | +| `force` | boolean | No | Force create new session even if one already exists | + diff --git a/apps/docs/lib/layout.shared.tsx b/apps/docs/lib/layout.shared.tsx new file mode 100644 index 0000000..8d42244 --- /dev/null +++ b/apps/docs/lib/layout.shared.tsx @@ -0,0 +1,31 @@ +import type { BaseLayoutProps } from "fumadocs-ui/layouts/shared"; + +export function baseOptions(): BaseLayoutProps { + return { + nav: { + title: "GitMem", + }, + links: [ + { + text: "Docs", + url: "/docs", + active: "nested-url", + }, + { + text: "Home", + url: "https://gitmem.ai", + external: true, + }, + { + text: "GitHub", + url: "https://github.com/nTEG-dev/gitmem", + external: true, + }, + { + text: "npm", + url: "https://npmjs.com/package/gitmem-mcp", + external: true, + }, + ], + }; +} diff --git a/apps/docs/lib/source.ts b/apps/docs/lib/source.ts new file mode 100644 index 0000000..c5fb60a --- /dev/null +++ b/apps/docs/lib/source.ts @@ -0,0 +1,7 @@ +import { docs } from "@/.source"; +import { loader } from "fumadocs-core/source"; + +export const source = loader({ + baseUrl: "/docs", + source: docs.toFumadocsSource(), +}); diff --git a/apps/docs/next-env.d.ts b/apps/docs/next-env.d.ts new file mode 100644 index 0000000..830fb59 --- /dev/null +++ b/apps/docs/next-env.d.ts @@ -0,0 +1,6 @@ +/// +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/apps/docs/next.config.mjs b/apps/docs/next.config.mjs new file mode 100644 index 0000000..dcb70d6 --- /dev/null +++ b/apps/docs/next.config.mjs @@ -0,0 +1,12 @@ +import { createMDX } from "fumadocs-mdx/next"; + +const config = { + reactStrictMode: true, + output: "export", + trailingSlash: true, + images: { unoptimized: true }, +}; + +const withMDX = createMDX(); + +export default withMDX(config); diff --git a/apps/docs/package-lock.json b/apps/docs/package-lock.json new file mode 100644 index 0000000..a767259 --- /dev/null +++ b/apps/docs/package-lock.json @@ -0,0 +1,7273 @@ +{ + "name": "gitmem-docs", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "gitmem-docs", + "version": "0.1.0", + "dependencies": { + "@tailwindcss/postcss": "^4.1.18", + "fumadocs-core": "^15.8.0", + "fumadocs-mdx": "^13.0.8", + "fumadocs-ui": "^15.8.0", + "next": "^15.3.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@types/mdx": "^2.0.13", + "@types/node": "^22.0.0", + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", + "tailwindcss": "^4.0.0", + "tsx": "^4.19.0", + "typescript": "^5.7.0", + "vite": "^7.0.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==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.4.tgz", + "integrity": "sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.5.tgz", + "integrity": "sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.4", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.7.tgz", + "integrity": "sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.5" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT" + }, + "node_modules/@formatjs/intl-localematcher": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.6.2.tgz", + "integrity": "sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.12.tgz", + "integrity": "sha512-pUvdJN1on574wQHjaBfNGDt9Mz5utDSZFsIIQkMzPgNS8ZvT4H2mwOrOIClwsQOb6EGx5M76/CZr6G8i6pSpLg==", + "license": "MIT" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.12.tgz", + "integrity": "sha512-RnRjBtH8S8eXCpUNkQ+543DUc7ys8y15VxmFU9HRqlo9BG3CcBUiwNtF8SNoi2xvGCVJq1vl2yYq+3oISBS0Zg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.12.tgz", + "integrity": "sha512-nqa9/7iQlboF1EFtNhWxQA0rQstmYRSBGxSM6g3GxvxHxcoeqVXfGNr9stJOme674m2V7r4E3+jEhhGvSQhJRA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.12.tgz", + "integrity": "sha512-dCzAjqhDHwmoB2M4eYfVKqXs99QdQxNQVpftvP1eGVppamXh/OkDAwV737Zr0KPXEqRUMN4uCjh6mjO+XtF3Mw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.12.tgz", + "integrity": "sha512-+fpGWvQiITgf7PUtbWY1H7qUSnBZsPPLyyq03QuAKpVoTy/QUx1JptEDTQMVvQhvizCEuNLEeghrQUyXQOekuw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.12.tgz", + "integrity": "sha512-jSLvgdRRL/hrFAPqEjJf1fFguC719kmcptjNVDJl26BnJIpjL3KH5h6mzR4mAweociLQaqvt4UyzfbFjgAdDcw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.12.tgz", + "integrity": "sha512-/uaF0WfmYqQgLfPmN6BvULwxY0dufI2mlN2JbOKqqceZh1G4hjREyi7pg03zjfyS6eqNemHAZPSoP84x17vo6w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.12.tgz", + "integrity": "sha512-xhsL1OvQSfGmlL5RbOmU+FV120urrgFpYLq+6U8C6KIym32gZT6XF/SDE92jKzzlPWskkbjOKCpqk5m4i8PEfg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.12.tgz", + "integrity": "sha512-Z1Dh6lhFkxvBDH1FoW6OU/L6prYwPSlwjLiZkExIAh8fbP6iI/M7iGTQAJPYJ9YFlWobCZ1PHbchFhFYb2ADkw==", + "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/@radix-ui/number": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz", + "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collapsible": "1.1.12", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", + "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-navigation-menu": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.14.tgz", + "integrity": "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", + "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", + "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz", + "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", + "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", + "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", + "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", + "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.22.0.tgz", + "integrity": "sha512-iAlTtSDDbJiRpvgL5ugKEATDtHdUVkqgHDm/gbD2ZS9c88mx7G1zSYjjOxp5Qa0eaW0MAQosFRmJSk354PRoQA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.22.0.tgz", + "integrity": "sha512-jdKhfgW9CRtj3Tor0L7+yPwdG3CgP7W+ZEqSsojrMzCjD1e0IxIbwUMDDpYlVBlC08TACg4puwFGkZfLS+56Tw==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.4" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.22.0.tgz", + "integrity": "sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.22.0.tgz", + "integrity": "sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0" + } + }, + "node_modules/@shikijs/rehype": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/rehype/-/rehype-3.22.0.tgz", + "integrity": "sha512-69b2VPc6XBy/VmAJlpBU5By+bJSBdE2nvgRCZXav7zujbrjXuT0F60DIrjKuutjPqNufuizE+E8tIZr2Yn8Z+g==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0", + "@types/hast": "^3.0.4", + "hast-util-to-string": "^3.0.1", + "shiki": "3.22.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.1.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.22.0.tgz", + "integrity": "sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0" + } + }, + "node_modules/@shikijs/transformers": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-3.22.0.tgz", + "integrity": "sha512-E7eRV7mwDBjueLF6852n2oYeJYxBq3NSsDk+uyruYAXONv4U8holGmIrT+mPRJQ1J1SNOH6L8G19KRzmBawrFw==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.22.0", + "@shikijs/types": "3.22.0" + } + }, + "node_modules/@shikijs/types": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.22.0.tgz", + "integrity": "sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "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.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", + "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", + "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-x64": "4.1.18", + "@tailwindcss/oxide-freebsd-x64": "4.1.18", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-x64-musl": "4.1.18", + "@tailwindcss/oxide-wasm32-wasi": "4.1.18", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", + "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", + "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", + "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", + "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", + "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", + "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", + "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", + "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", + "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", + "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.0", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", + "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", + "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.18.tgz", + "integrity": "sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.18", + "@tailwindcss/oxide": "4.1.18", + "postcss": "^8.4.41", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "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.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "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.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "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.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "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": "22.19.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.11.tgz", + "integrity": "sha512-BH7YwL6rA93ReqeQS1c4bsPpcfOmJasG+Fkr6Y59q83f9M1WcBRHR2vM+P9eOisYRcN3ujQoiZY8uk5W+1WL8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "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==", + "devOptional": 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.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "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/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/caniuse-lite": { + "version": "1.0.30001769", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", + "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", + "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": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.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/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/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "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.19.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", + "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "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.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "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/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/fumadocs-core": { + "version": "15.8.5", + "resolved": "https://registry.npmjs.org/fumadocs-core/-/fumadocs-core-15.8.5.tgz", + "integrity": "sha512-hyJtKGuB2J/5y7tDfI1EnGMKlNbSXM5N5cpwvgCY0DcBJwFMDG/GpSpaVRzh3aWy67pAYDZFIwdtbKXBa/q5bg==", + "license": "MIT", + "dependencies": { + "@formatjs/intl-localematcher": "^0.6.2", + "@orama/orama": "^3.1.14", + "@shikijs/rehype": "^3.13.0", + "@shikijs/transformers": "^3.13.0", + "github-slugger": "^2.0.0", + "hast-util-to-estree": "^3.1.3", + "hast-util-to-jsx-runtime": "^2.3.6", + "image-size": "^2.0.2", + "negotiator": "^1.0.0", + "npm-to-yarn": "^3.0.1", + "path-to-regexp": "^8.3.0", + "react-remove-scroll": "^2.7.1", + "remark": "^15.0.1", + "remark-gfm": "^4.0.1", + "remark-rehype": "^11.1.2", + "scroll-into-view-if-needed": "^3.1.0", + "shiki": "^3.13.0", + "unist-util-visit": "^5.0.0" + }, + "peerDependencies": { + "@mixedbread/sdk": "^0.19.0", + "@oramacloud/client": "1.x.x || 2.x.x", + "@tanstack/react-router": "1.x.x", + "@types/react": "*", + "algoliasearch": "5.x.x", + "lucide-react": "*", + "next": "14.x.x || 15.x.x", + "react": "18.x.x || 19.x.x", + "react-dom": "18.x.x || 19.x.x", + "react-router": "7.x.x", + "waku": "^0.26.0" + }, + "peerDependenciesMeta": { + "@mixedbread/sdk": { + "optional": true + }, + "@oramacloud/client": { + "optional": true + }, + "@tanstack/react-router": { + "optional": true + }, + "@types/react": { + "optional": true + }, + "algoliasearch": { + "optional": true + }, + "lucide-react": { + "optional": true + }, + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-router": { + "optional": true + }, + "waku": { + "optional": true + } + } + }, + "node_modules/fumadocs-mdx": { + "version": "13.0.8", + "resolved": "https://registry.npmjs.org/fumadocs-mdx/-/fumadocs-mdx-13.0.8.tgz", + "integrity": "sha512-UbUwH0iGvYbytnxhmfd7tWJKFK8L0mrbTAmrQYnpg6Wi/h8afNMJmbHBOzVcaEWJKeFipZ1CGDAsNA2fztwXNg==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.1.1", + "@standard-schema/spec": "^1.0.0", + "chokidar": "^4.0.3", + "esbuild": "^0.25.12", + "estree-util-value-to-estree": "^3.5.0", + "js-yaml": "^4.1.0", + "lru-cache": "^11.2.2", + "mdast-util-to-markdown": "^2.1.2", + "picocolors": "^1.1.1", + "picomatch": "^4.0.3", + "remark-mdx": "^3.1.1", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "zod": "^4.1.12" + }, + "bin": { + "fumadocs-mdx": "dist/bin.js" + }, + "peerDependencies": { + "@fumadocs/mdx-remote": "^1.4.0", + "fumadocs-core": "^15.0.0 || ^16.0.0", + "next": "^15.3.0 || ^16.0.0", + "react": "*", + "vite": "6.x.x || 7.x.x" + }, + "peerDependenciesMeta": { + "@fumadocs/mdx-remote": { + "optional": true + }, + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/fumadocs-ui": { + "version": "15.8.5", + "resolved": "https://registry.npmjs.org/fumadocs-ui/-/fumadocs-ui-15.8.5.tgz", + "integrity": "sha512-9pyB+9rOOsrFnmmZ9xREp/OgVhyaSq2ocEpqTNbeQ7tlJ6JWbdFWfW0C9lRXprQEB6DJWUDtDxqKS5QXLH0EGA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-accordion": "^1.2.12", + "@radix-ui/react-collapsible": "^1.1.12", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-direction": "^1.1.1", + "@radix-ui/react-navigation-menu": "^1.2.14", + "@radix-ui/react-popover": "^1.1.15", + "@radix-ui/react-presence": "^1.1.5", + "@radix-ui/react-scroll-area": "^1.2.10", + "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-tabs": "^1.1.13", + "class-variance-authority": "^0.7.1", + "fumadocs-core": "15.8.5", + "lodash.merge": "^4.6.2", + "next-themes": "^0.4.6", + "postcss-selector-parser": "^7.1.0", + "react-medium-image-zoom": "^5.4.0", + "scroll-into-view-if-needed": "^3.1.0", + "tailwind-merge": "^3.3.1" + }, + "peerDependencies": { + "@types/react": "*", + "next": "14.x.x || 15.x.x", + "react": "18.x.x || 19.x.x", + "react-dom": "18.x.x || 19.x.x", + "tailwindcss": "^3.4.14 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "next": { + "optional": true + }, + "tailwindcss": { + "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/get-tsconfig": { + "version": "4.13.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", + "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "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==", + "license": "ISC" + }, + "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-string": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.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/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/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "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.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "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.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "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.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "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.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "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.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "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.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "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.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "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.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "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.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "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.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "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.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "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.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "license": "MIT" + }, + "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/lru-cache": { + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "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==", + "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.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "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/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.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "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/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/next": { + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/next/-/next-15.5.12.tgz", + "integrity": "sha512-Fi/wQ4Etlrn60rz78bebG1i1SR20QxvV8tVp6iJspjLUSHcZoeUXCt+vmWoEcza85ElZzExK/jJ/F6SvtGktjA==", + "license": "MIT", + "dependencies": { + "@next/env": "15.5.12", + "@swc/helpers": "0.5.15", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "15.5.12", + "@next/swc-darwin-x64": "15.5.12", + "@next/swc-linux-arm64-gnu": "15.5.12", + "@next/swc-linux-arm64-musl": "15.5.12", + "@next/swc-linux-x64-gnu": "15.5.12", + "@next/swc-linux-x64-musl": "15.5.12", + "@next/swc-win32-arm64-msvc": "15.5.12", + "@next/swc-win32-x64-msvc": "15.5.12", + "sharp": "^0.34.3" + }, + "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/npm-to-yarn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-to-yarn/-/npm-to-yarn-3.0.1.tgz", + "integrity": "sha512-tt6PvKu4WyzPwWUzy/hvPFqn+uwXO0K1ZHka8az3NnrhWJDmSqI8ncWq0fkL0k/lmmi5tAC11FXwXuh0rFbt1A==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/nebrelbug/npm-to-yarn?sponsor=1" + } + }, + "node_modules/oniguruma-parser": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", + "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.4.tgz", + "integrity": "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.1", + "regex": "^6.0.1", + "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/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/react-medium-image-zoom": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/react-medium-image-zoom/-/react-medium-image-zoom-5.4.0.tgz", + "integrity": "sha512-BsE+EnFVQzFIlyuuQrZ9iTwyKpKkqdFZV1ImEQN573QPqGrIUuNni7aF+sZwDcxlsuOMayCr6oO/PZR/yJnbRg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/rpearce" + } + ], + "license": "BSD-3-Clause", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "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": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.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-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/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/rollup": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.57.1", + "@rollup/rollup-android-arm64": "4.57.1", + "@rollup/rollup-darwin-arm64": "4.57.1", + "@rollup/rollup-darwin-x64": "4.57.1", + "@rollup/rollup-freebsd-arm64": "4.57.1", + "@rollup/rollup-freebsd-x64": "4.57.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", + "@rollup/rollup-linux-arm64-gnu": "4.57.1", + "@rollup/rollup-linux-arm64-musl": "4.57.1", + "@rollup/rollup-linux-loong64-gnu": "4.57.1", + "@rollup/rollup-linux-loong64-musl": "4.57.1", + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", + "@rollup/rollup-linux-ppc64-musl": "4.57.1", + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", + "@rollup/rollup-linux-riscv64-musl": "4.57.1", + "@rollup/rollup-linux-s390x-gnu": "4.57.1", + "@rollup/rollup-linux-x64-gnu": "4.57.1", + "@rollup/rollup-linux-x64-musl": "4.57.1", + "@rollup/rollup-openbsd-x64": "4.57.1", + "@rollup/rollup-openharmony-arm64": "4.57.1", + "@rollup/rollup-win32-arm64-msvc": "4.57.1", + "@rollup/rollup-win32-ia32-msvc": "4.57.1", + "@rollup/rollup-win32-x64-gnu": "4.57.1", + "@rollup/rollup-win32-x64-msvc": "4.57.1", + "fsevents": "~2.3.2" + } + }, + "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.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "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": "3.22.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.22.0.tgz", + "integrity": "sha512-LBnhsoYEe0Eou4e1VgJACes+O6S6QC0w71fCSp5Oya79inkwkm15gQ1UF6VtQ8j/taMDh79hAB49WUk8ALQW3g==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.22.0", + "@shikijs/engine-javascript": "3.22.0", + "@shikijs/engine-oniguruma": "3.22.0", + "@shikijs/langs": "3.22.0", + "@shikijs/themes": "3.22.0", + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "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/tailwind-merge": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", + "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "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/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "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/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "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-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/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "devOptional": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/vite/node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "devOptional": 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.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "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/apps/docs/package.json b/apps/docs/package.json new file mode 100644 index 0000000..db87743 --- /dev/null +++ b/apps/docs/package.json @@ -0,0 +1,31 @@ +{ + "name": "gitmem-docs", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "npm run generate:tools && npm run generate:llms && next build", + "start": "next start", + "generate:tools": "tsx scripts/generate-tool-docs.ts", + "generate:llms": "tsx scripts/generate-llms-txt.ts" + }, + "dependencies": { + "@tailwindcss/postcss": "^4.1.18", + "fumadocs-core": "^15.8.0", + "fumadocs-mdx": "^13.0.8", + "fumadocs-ui": "^15.8.0", + "next": "^15.3.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@types/mdx": "^2.0.13", + "@types/node": "^22.0.0", + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", + "tailwindcss": "^4.0.0", + "tsx": "^4.19.0", + "typescript": "^5.7.0", + "vite": "^7.0.0" + } +} diff --git a/apps/docs/postcss.config.mjs b/apps/docs/postcss.config.mjs new file mode 100644 index 0000000..79bcf13 --- /dev/null +++ b/apps/docs/postcss.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; + +export default config; diff --git a/apps/docs/public/llms-full.txt b/apps/docs/public/llms-full.txt new file mode 100644 index 0000000..1a4f940 --- /dev/null +++ b/apps/docs/public/llms-full.txt @@ -0,0 +1,1887 @@ +# GitMem — Complete Documentation + +> GitMem is an MCP server that gives AI coding agents persistent institutional memory. +> Install: `npx gitmem init` or add MCP server `npx -y gitmem-mcp` +> Source: https://gitmem.ai +> Index: https://gitmem.ai/llms.txt + +======================================================================== +# Changelog +URL: https://gitmem.ai/docs/changelog +Description: GitMem release history. +======================================================================== + +# Changelog + +## v1.0.2 (2026-02-15) + +### Features + +- **`npx gitmem init`** — Interactive setup wizard that detects existing config, prompts, and merges without destroying anything. Replaces the multi-step manual setup. + - 6 steps: memory store, MCP server, CLAUDE.md, permissions, hooks, gitignore + - Flags: `--yes` (non-interactive), `--dry-run` (preview), `--project ` + - Idempotent — re-running safely skips completed steps +- **`npx gitmem uninstall`** — Clean reversal of everything init did. Memory data (`.gitmem/`) preserved by default, `--all` to also delete. + +### Docs + +- Updated README to feature one-command setup, added gitmem.dev link +- Updated docs site installation and getting-started pages + +## v1.0.1 (2026-02-14) + +### Bug Fixes + +- **OD-590:** Fixed stdout corruption — 22 `console.log` calls replaced with `console.error` in check.ts +- **OD-554:** Error messages now surface in `create_learning` and `record_scar_usage` responses via `errors[]` array +- **OD-548:** Session ID validation added to `session_close` — returns clear error with UUID format example instead of confusing DB lookup failure +- **OD-640:** Removed hardcoded project enum — project names are now free-form strings + +### Tests + +- +2 regression tests for stdout purity +- +8 tests for error message surfacing +- +10 tests for session ID validation + +## v1.0.0 (2026-02-15) + +### Initial Release + +- 23 core tools (free tier) / 29 tools (pro tier) +- Session management with closing ceremony +- Scar recall with semantic search +- Thread tracking across sessions +- Multi-agent context injection +- Knowledge graph traversal +- Local `.gitmem/` storage (free) or Supabase (pro) +- Claude Code hooks for automatic session management +- 660+ automated tests across 6 tiers + +======================================================================== +# Core Concepts +URL: https://gitmem.ai/docs/concepts +Description: Understand the building blocks of GitMem's institutional memory system. +======================================================================== + +# Core Concepts + +GitMem is built around a few key ideas that work together to give AI agents persistent, actionable memory. + +## The Memory Loop + +``` +recall → work → learn → close → recall → ... +``` + +1. **Recall** — Before acting, check what you've learned before +2. **Work** — Do the task, applying past lessons +3. **Learn** — Capture new scars, wins, and patterns +4. **Close** — Persist session context for next time + +## Key Concepts + +- [Scars](/docs/concepts/scars) — Mistakes captured as institutional memory, surfaced before you repeat them +- [Sessions](/docs/concepts/sessions) — Bounded work periods with context loading and closing ceremonies +- [Threads](/docs/concepts/threads) — Unresolved work that carries across sessions +- [Learning Types](/docs/concepts/learning-types) — Scars, wins, patterns, and anti-patterns +- [Tiers](/docs/concepts/tiers) — Free (local) vs Pro (Supabase) capabilities + +======================================================================== +# Learning Types +URL: https://gitmem.ai/docs/concepts/learning-types +Description: The four types of institutional memory in GitMem. +======================================================================== + +# Learning Types + +GitMem supports four types of institutional memory, each serving a different purpose. + +## Scars + +**Mistakes to avoid.** The most common learning type. Scars are surfaced automatically via `recall` when an agent plans a similar action. + +```json +{ + "learning_type": "scar", + "title": "Always validate UUID format before DB lookup", + "severity": "medium", + "counter_arguments": ["Internal-only tools may trust input", "UUIDs from trusted sources are pre-validated"] +} +``` + +**Required fields:** title, description, severity, counter_arguments (2+) + +See [Scars](/docs/concepts/scars) for details. + +## Wins + +**Approaches that worked well.** Capture what succeeded so you can replicate it. + +```json +{ + "learning_type": "win", + "title": "Parallel agent spawning cut review time by 60%", + "problem_context": "Code review of 500-line PR was taking too long with sequential analysis", + "solution_approach": "Spawned 3 agents in parallel: one for logic, one for tests, one for security" +} +``` + +**Required fields:** title, description + +## Patterns + +**Reusable strategies.** Document approaches that work in specific contexts. + +```json +{ + "learning_type": "pattern", + "title": "5-Tier Test Pyramid for MCP Servers", + "applies_when": ["shipping MCP servers to npm", "pre-release verification"] +} +``` + +**Required fields:** title, description + +## Anti-Patterns + +**Approaches that seem good but aren't.** Document why a seemingly reasonable approach fails. + +```json +{ + "learning_type": "anti_pattern", + "title": "Don't use console.log in MCP servers", + "description": "MCP uses stdio for JSON-RPC. Any console.log corrupts the transport. Use console.error for diagnostics." +} +``` + +**Required fields:** title, description + +## Severity Levels + +Severity applies to scars and determines surfacing priority: + +| Level | Meaning | Example | +|-------|---------|---------| +| `critical` | Data loss or security risk | "Never store API keys in git" | +| `high` | Significant time waste or user impact | "Done != Deployed != Verified" | +| `medium` | Moderate friction or repeated issue | "Always validate UUIDs before DB lookup" | +| `low` | Minor optimization or preference | "Use descriptive branch names" | + +======================================================================== +# Scars +URL: https://gitmem.ai/docs/concepts/scars +Description: How GitMem captures and surfaces mistakes as institutional memory. +======================================================================== + +# Scars + +A **scar** is a mistake captured as institutional memory. When an AI agent encounters a problem, the lesson is recorded as a scar so that future agents (or future sessions of the same agent) don't repeat it. + +## How Scars Work + +1. **Something goes wrong** — A deployment fails, a bug slips through, a wrong assumption costs time +2. **The scar is created** — The lesson is captured with title, description, severity, and counter-arguments +3. **Future recall surfaces it** — When an agent plans a similar action, the scar appears automatically + +## Scar Anatomy + +```json +{ + "learning_type": "scar", + "title": "Done != Deployed != Verified Working", + "description": "Marking a task as done after committing code is not enough. The full loop is: commit → push → deploy → verify the service is running and accessible.", + "severity": "high", + "scar_type": "process", + "counter_arguments": [ + "For local-only changes, deployment verification is unnecessary", + "In CI/CD pipelines, deployment may be automatic" + ] +} +``` + +### Required Fields + +| Field | Purpose | +|-------|---------| +| `title` | Short, memorable name for the lesson | +| `description` | Detailed explanation of what went wrong and how to avoid it | +| `severity` | `critical`, `high`, `medium`, or `low` | +| `counter_arguments` | At least 2 reasons why someone might reasonably ignore this scar | + +### Scar Types + +| Type | Decay | Use When | +|------|-------|----------| +| `process` | Never | The lesson is about how to work (e.g., "always run tests before pushing") | +| `incident` | 180 days | A specific incident that may become less relevant over time | +| `context` | 30 days | Temporary context (e.g., "API X is down, use fallback") | + +## Counter-Arguments + +Every scar **requires** at least 2 counter-arguments. This prevents scar accumulation from becoming a burden. Counter-arguments document when it's reasonable to ignore the scar. + +Good counter-arguments: +- Describe specific scenarios where the scar doesn't apply +- Acknowledge trade-offs (speed vs safety) +- Note when the underlying cause has been fixed + +## The Confirm Protocol + +When scars are surfaced via `recall`, the agent must **confirm** each one before proceeding: + +- **APPLYING** — "I've accounted for this lesson" (with evidence) +- **N_A** — "This scar doesn't apply to my current situation" (with reasoning) +- **REFUTED** — "I'm deliberately overriding this scar" (acknowledging risk) + +This ensures scars are actively considered, not just passively displayed. + +======================================================================== +# Sessions +URL: https://gitmem.ai/docs/concepts/sessions +Description: How GitMem tracks bounded work periods with context loading and closing ceremonies. +======================================================================== + +# Sessions + +A **session** is a bounded work period. It starts when an agent calls `session_start` and ends with `session_close`. Sessions provide continuity between conversations. + +## Session Lifecycle + +### 1. Start + +`session_start` initializes a session and loads context: + +- Creates a unique session ID +- Loads the last session's context (threads, decisions, rapport notes) +- Identifies the agent type (CLI, Desktop, etc.) +- Returns a formatted session banner + +### 2. Work + +During the session, the agent: +- Calls `recall` before consequential actions +- Creates learnings (scars, wins, patterns) +- Logs decisions +- Tracks threads for unfinished work + +### 3. Close + +`session_close` persists the session: + +- **Quick close** — Minimal, for short exploratory sessions +- **Standard close** — Full reflection with 9 questions covering what broke, what worked, and what to remember + +## Session State + +Session state is stored in `.gitmem/`: + +``` +.gitmem/ +├── active-sessions.json # Registry of active sessions +└── sessions/ + └── / + └── session.json # Session data, scars surfaced, etc. +``` + +## Context Loading + +When a new session starts, GitMem loads: + +| Context | Source | Purpose | +|---------|--------|---------| +| Open threads | `threads.json` | Unfinished work to continue | +| Recent decisions | Last session | Architectural context | +| Rapport notes | Last session | How the human prefers to work | + +## The Closing Ceremony + +Standard close asks 9 questions: + +1. What broke that you didn't expect? +2. What took longer than it should have? +3. What would you do differently next time? +4. What pattern or approach worked well? +5. What assumption was wrong? +6. Which scars did you apply? +7. What should be captured as institutional memory? +8. How did the human prefer to work? *(rapport)* +9. What collaborative dynamic worked? *(rapport)* + +These reflections become context for the next session. + +======================================================================== +# Threads +URL: https://gitmem.ai/docs/concepts/threads +Description: Track unresolved work across sessions with GitMem threads. +======================================================================== + +# Threads + +**Threads** track unresolved work that carries across sessions. When you can't finish something in the current session, create a thread so the next session picks it up. + +## Creating Threads + +``` +create_thread({ text: "Auth middleware needs rate limiting before production deploy" }) +``` + +Threads include: +- A unique thread ID (e.g., `t-a1b2c3d4`) +- Description text +- Creation timestamp +- Optional Linear issue link + +## Semantic Deduplication + +GitMem uses cosine similarity (threshold > 0.85) to prevent duplicate threads. If you try to create a thread that's semantically identical to an existing one, GitMem returns the existing thread instead. + +## Thread Lifecycle + +``` +create → surface at session_start → resolve +``` + +1. **Create** — `create_thread` during a session +2. **Surface** — Open threads appear in the next `session_start` banner +3. **Resolve** — `resolve_thread` with a resolution note when complete + +## Managing Threads + +| Tool | Purpose | +|------|---------| +| `list_threads` | See all open threads | +| `resolve_thread` | Mark a thread as done | +| `cleanup_threads` | Triage by health (active/cooling/dormant) | + +### Thread Health + +`cleanup_threads` categorizes threads by vitality: + +- **Active** — Recently created or referenced +- **Cooling** — Not referenced in a while +- **Dormant** — Untouched for 30+ days (auto-archivable) + +### Suggested Threads + +`session_start` may suggest threads based on session context. You can: +- **Promote** — `promote_suggestion` converts it to a real thread +- **Dismiss** — `dismiss_suggestion` suppresses it (3 dismissals = permanent suppression) + +======================================================================== +# Tiers +URL: https://gitmem.ai/docs/concepts/tiers +Description: GitMem's tier system and how it affects available features. +======================================================================== + +# Tiers + +GitMem has three tiers that control which tools and storage backends are available. + +## Free + +- **Storage:** Local `.gitmem/` directory +- **Search:** Local vector cache +- **Tools:** 23 core tools +- **Cost:** $0 +- **Best for:** Solo developers, single-machine workflows + +Set via: `GITMEM_TIER=free` (default) + +## Pro (Coming Soon) + +- **Storage:** Supabase PostgreSQL with pgvector +- **Search:** Semantic search via embeddings +- **Tools:** 29 tools (adds batch, transcripts, cache management) +- **Best for:** Teams, multi-machine workflows, production use + +Pro is currently in development. [Join the mailing list](https://gitmem.dev) to get notified when it launches. + +## Additional Tools (Pro) + +These tools will be available when Pro launches: + +| Tool | Purpose | +|------|---------| +| `record_scar_usage_batch` | Record multiple scar applications at once | +| `save_transcript` | Save session transcript to storage | +| `get_transcript` | Retrieve a saved transcript | +| `search_transcripts` | Semantic search over transcript chunks | +| `cache_status` | Show local cache status | +| `cache_health` | Compare local cache vs remote | +| `cache_flush` | Force reload from Supabase | + +======================================================================== +# Contributing +URL: https://gitmem.ai/docs/contributing +Description: How to contribute to GitMem. +======================================================================== + +# Contributing + +GitMem is open source. Contributions are welcome. + +## Development Setup + +```bash +git clone https://github.com/nTEG-dev/gitmem +cd gitmem +npm install +npm run build +``` + +## Running Tests + +```bash +# Unit tests (fast, no deps) +npm run test:unit + +# Smoke tests (MCP server boot) +npx vitest run --config vitest.smoke.config.ts + +# All tests +npm test +``` + +See [Testing](/docs/contributing/testing) for the full test pyramid. + +## Project Structure + +``` +gitmem/ +├── src/ +│ ├── server.ts # MCP server entry +│ ├── tools/ # Tool implementations +│ │ ├── definitions.ts # Tool schemas (source of truth) +│ │ ├── recall.ts # Scar surfacing +│ │ ├── session-start.ts +│ │ └── ... +│ ├── services/ # Business logic +│ │ ├── tier.ts # Tier gating +│ │ ├── startup.ts # Cache initialization +│ │ └── ... +│ └── types/ # TypeScript types +├── tests/ +│ ├── unit/ # Unit tests +│ ├── smoke/ # Smoke tests +│ ├── integration/ # Integration tests (Docker) +│ └── e2e/ # End-to-end tests +├── apps/ +│ └── docs/ # This documentation site +└── docs/ # Internal development docs +``` + +## Submitting Changes + +1. Fork the repository +2. Create a feature branch: `git checkout -b feature/my-change` +3. Make your changes with tests +4. Run the test suite: `npm test` +5. Submit a pull request + +## Code Style + +- TypeScript strict mode +- ESM-only (no CommonJS) +- `console.error` for diagnostics (never `console.log` — it corrupts MCP stdio) + +======================================================================== +# Testing +URL: https://gitmem.ai/docs/contributing/testing +Description: GitMem's test pyramid and how to run each tier. +======================================================================== + +# Testing + +GitMem uses a 6-tier test pyramid. All runnable tests must pass before shipping. + +## Test Tiers + +### Tier 1: Unit Tests + +```bash +npm run test:unit +``` + +- **Count:** 660+ tests +- **Speed:** ~3 seconds +- **Dependencies:** None +- **Coverage:** Schema validation, pure functions, golden regressions + +### Tier 2: Smoke Tests + +```bash +npx vitest run --config vitest.smoke.config.ts +``` + +- **Count:** 9 tests (4 free + 5 pro) +- **Speed:** ~5 seconds +- **Dependencies:** None (free) / Supabase (pro) +- **Coverage:** MCP server boot, tool registration, basic stdio calls + +### Tier 3: Integration Tests + +```bash +npx vitest run --config vitest.integration.config.ts +``` + +- **Count:** 63 tests +- **Speed:** ~30 seconds +- **Dependencies:** Docker (Supabase PostgreSQL) +- **Coverage:** Database operations, session lifecycle, cache, query plans + +### Tier 4: E2E Tests + +```bash +npx vitest run --config vitest.e2e.config.ts +``` + +- **Count:** 60 tests +- **Speed:** ~75 seconds +- **Dependencies:** Varies by suite +- **Coverage:** Full install flow, hooks, MCP via stdio + +### Tier 5: User Journey + +```bash +npx vitest run tests/e2e/user-journey.test.ts --config vitest.e2e.config.ts +``` + +- **Count:** 6 tests +- **Speed:** ~60 seconds +- **Dependencies:** Claude API key +- **Coverage:** Real Claude session verifying hooks, tools, and ceremony + +### Tier 6: Performance + +```bash +npx vitest bench --config vitest.perf.config.ts +``` + +- **Count:** 4 benchmark files +- **Speed:** ~30 seconds +- **Coverage:** Cold start latency, recall speed, cache performance + +## Quick Run (No Docker) + +For development, run the tests that don't need Docker: + +```bash +npm run test:unit && npx vitest run --config vitest.smoke.config.ts +``` + +This covers 670+ tests in under 10 seconds. + +======================================================================== +# Configuration +URL: https://gitmem.ai/docs/getting-started/configuration +Description: Configure GitMem with environment variables and config files. +======================================================================== + +# Configuration + +GitMem works out of the box with zero configuration on the free tier. For Pro tier features (Supabase storage, semantic search), you'll need environment variables. + +## Environment Variables + +| Variable | Default | Purpose | +|----------|---------|---------| +| `GITMEM_DIR` | `.gitmem/` | Override the storage directory location | +| `GITMEM_DEFAULT_PROJECT` | `default` | Default project namespace for scoping | + +## Storage + +### Free Tier (Local) + +All data stored in `.gitmem/` relative to your project root: + +``` +.gitmem/ +├── active-sessions.json # Current session registry +├── sessions/ # Session data per session ID +├── learnings/ # Scars, wins, patterns (JSON) +├── decisions/ # Decision log +├── threads/ # Open threads tracking +└── cache/ # Local vector search cache +``` + +Add `.gitmem/` to your `.gitignore` — session data is machine-specific. + +### Pro Tier (Coming Soon) + +Pro will add Supabase PostgreSQL with pgvector for semantic search, cross-machine sync, and shared team memory. [Join the mailing list](https://gitmem.dev) to get notified. + +## Project Namespaces + +GitMem supports arbitrary project names to scope sessions and searches: + +``` +session_start({ project: "my-api" }) +recall({ plan: "add auth", project: "my-api" }) +``` + +Projects are free-form strings. Use them to separate concerns when working across multiple codebases or domains. + +======================================================================== +# Your First Session +URL: https://gitmem.ai/docs/getting-started/first-session +Description: Walk through a complete GitMem session from start to close. +======================================================================== + +# Your First Session + +This walkthrough shows you what a GitMem-powered session looks like from your AI agent's perspective. + +## 1. Open a Session + +``` +> "Start a GitMem session" +``` + +The agent calls `session_start`, which: +- Creates a session with a unique ID +- Loads context from the last session (threads, decisions, rapport) +- Displays a session banner with status + +## 2. Recall Before Acting + +Before making changes, the agent checks institutional memory: + +``` +> "Add authentication to the API" +``` + +The agent calls `recall` with the plan "add authentication": + +``` +recall({ plan: "add authentication to the API" }) +``` + +GitMem returns relevant scars: +- "JWT token expiry must be validated server-side, not just client-side" +- "Always hash passwords with bcrypt, not SHA-256" + +The agent acknowledges these lessons and applies them. + +## 3. Create Learnings + +When the agent discovers something useful: + +``` +create_learning({ + learning_type: "scar", + title: "OAuth redirect URI must match exactly", + description: "Google OAuth rejects requests where the redirect URI doesn't match character-for-character...", + severity: "medium", + counter_arguments: [ + "In development, localhost variations are usually fine", + "Some providers support wildcard redirects" + ] +}) +``` + +## 4. Close the Session + +``` +> "Let's wrap up" +``` + +The agent calls `session_close`, which persists: +- What was accomplished +- What scars were applied +- Open threads for next session +- A brief reflection + +## What You Get + +After a few sessions, GitMem builds a knowledge base of: +- **Scars** — Mistakes to avoid (surfaced automatically via recall) +- **Wins** — Approaches that worked well +- **Patterns** — Reusable strategies +- **Decisions** — Architectural choices with rationale +- **Threads** — Unfinished work that carries across sessions + +======================================================================== +# Free vs Pro +URL: https://gitmem.ai/docs/getting-started/free-vs-pro +Description: What you get today with the free tier and what's coming with Pro. +======================================================================== + +# Free vs Pro + +GitMem ships with a fully functional free tier — everything you need to give your AI agents institutional memory. Pro will add cloud storage and team features. + +## What's Included (Free Tier) + +| Feature | How It Works | +|---------|-------------| +| **Session Management** | Local `.gitmem/` directory | +| **Recall (scar surfacing)** | BM25 text search over local scars | +| **Create scars/wins/patterns** | Local JSON files | +| **Threads** | Local tracking across sessions | +| **Session history** | Last session context loaded on start | +| **Semantic search** | Local search over learnings | +| **Multi-agent** | Context injection for agents on the same machine | +| **Analytics** | Basic session analytics | +| **Tools** | 23 core tools | + +## Pro Tier — Coming Soon + +Pro adds cloud-powered features for teams and power users: + +| Feature | What Pro Adds | +|---------|--------------| +| **Storage** | Supabase PostgreSQL (persistent, cross-machine) | +| **Search** | pgvector semantic search with embeddings | +| **Multi-agent** | Shared cloud memory across machines | +| **Session history** | Full history with search | +| **Transcripts** | Save and search session transcripts | +| **Batch operations** | Batch scar recording | +| **Knowledge graph** | Triple-based graph traversal | +| **Cache management** | Status, health, and flush tools | +| **Tools** | 29 tools (6 additional) | + +**Pro will be for you if:** +- You need shared memory across machines or teams +- You want full semantic search with embeddings +- You need session transcript storage +- You're running multi-agent workflows across environments + +[Join the mailing list](https://gitmem.dev) to get notified when Pro launches. + +======================================================================== +# Overview +URL: https://gitmem.ai/docs/getting-started +Description: Get GitMem running in under 5 minutes. +======================================================================== + +# Getting Started + +GitMem gives your AI coding agents institutional memory — the ability to learn from mistakes and remember what works across sessions. + +## Prerequisites + +- **Node.js 22+** (required by Fumadocs MDX) +- An MCP-compatible client: [Claude Code](https://claude.com/claude-code), [Claude Desktop](https://claude.ai/download), or [Cursor](https://cursor.sh) + +## Quick Start (30 seconds) + +```bash +# In any project directory +npx gitmem init +``` + +The interactive wizard detects your existing config and sets up everything: +- `.gitmem/` directory with 12 starter scars +- `.mcp.json` with gitmem server entry +- `CLAUDE.md` with memory protocol instructions +- `.claude/settings.json` with lifecycle hooks and tool permissions +- `.gitignore` updated to exclude `.gitmem/` + +Already have `.mcp.json`, `CLAUDE.md`, or hooks? The wizard merges without destroying your existing config. Re-running is safe — completed steps are skipped. + +## What Happens Next + +1. **Start a session** — Your agent calls `session_start` to load context +2. **Recall before acting** — Before consequential actions, `recall` surfaces relevant scars +3. **Learn from outcomes** — Create scars, wins, and patterns as you discover them +4. **Close cleanly** — `session_close` persists what happened for future sessions + +## Next Steps + +- [Installation](/docs/getting-started/installation) — Detailed setup for all environments +- [Configuration](/docs/getting-started/configuration) — Environment variables and config files +- [Your First Session](/docs/getting-started/first-session) — Step-by-step walkthrough +- [Free vs Pro](/docs/getting-started/free-vs-pro) — Tier comparison + +======================================================================== +# Installation +URL: https://gitmem.ai/docs/getting-started/installation +Description: Install GitMem via npx, global install, or MCP configuration. +======================================================================== + +# Installation + +## Option 1: Init Wizard (Recommended) + +```bash +cd your-project +npx gitmem init +``` + +The interactive wizard walks you through 6 steps: + +1. **Memory Store** — Creates `.gitmem/` with 12 starter scars +2. **MCP Server** — Adds gitmem to `.mcp.json` +3. **Project Instructions** — Appends memory protocols to `CLAUDE.md` +4. **Tool Permissions** — Adds `mcp__gitmem__*` to `.claude/settings.json` +5. **Lifecycle Hooks** — Merges session/recall hooks (preserves your existing hooks) +6. **Gitignore** — Adds `.gitmem/` to `.gitignore` + +### Flags + +```bash +# Accept all defaults (non-interactive) +npx gitmem init --yes + +# Preview what would change (no files written) +npx gitmem init --dry-run + +# Set a project namespace +npx gitmem init --project my-app +``` + +### Idempotent + +Re-running `npx gitmem init` is safe — completed steps are skipped with "Already configured." + +### Uninstall + +```bash +npx gitmem uninstall +``` + +Cleanly reverses everything init did. Your `.gitmem/` data is preserved by default. + +```bash +# Also delete .gitmem/ memory data +npx gitmem uninstall --all +``` + +## Option 2: MCP Server Only + +If you want to configure the MCP server manually without the init wizard: + +### Claude Code + +```bash +claude mcp add gitmem -- npx -y gitmem-mcp +``` + +### Claude Desktop + +Add to `~/Library/Application Support/Claude/claude_desktop_config.json`: + +```json +{ + "mcpServers": { + "gitmem": { + "command": "npx", + "args": ["-y", "gitmem-mcp"] + } + } +} +``` + +Restart Claude Desktop after saving. + +### Cursor + +Add to `.cursor/mcp.json` in your project: + +```json +{ + "mcpServers": { + "gitmem": { + "command": "npx", + "args": ["-y", "gitmem-mcp"] + } + } +} +``` + +## Option 3: Global Install + +```bash +npm install -g gitmem-mcp +``` + +Then reference the global binary in your MCP config: + +```json +{ + "mcpServers": { + "gitmem": { + "command": "gitmem-mcp" + } + } +} +``` + +## Verify Installation + +After setup, ask your AI agent: + +> "Run gitmem-help" + +You should see a list of available commands with your current tier and tool count. + +## Environment Variables + +| Variable | Default | Purpose | +|----------|---------|---------| +| `GITMEM_DIR` | `.gitmem/` | Storage directory | +| `GITMEM_DEFAULT_PROJECT` | `default` | Project namespace for scoping | + +See [Configuration](/docs/getting-started/configuration) for full details. + +======================================================================== +# Closing Ceremony +URL: https://gitmem.ai/docs/guides/closing-ceremony +Description: How to properly close a GitMem session with reflection and persistence. +======================================================================== + +# Closing Ceremony + +The closing ceremony is GitMem's session persistence ritual. It captures what happened, what was learned, and what carries forward. + +## Quick Close vs Standard Close + +| Type | When to Use | What Happens | +|------|-------------|--------------| +| **Quick** | Short sessions (< 30 min), purely exploratory | Minimal persistence, no reflection | +| **Standard** | All substantive work sessions | Full 9-question reflection | + +## Standard Close Flow + +### Step 1: Read Session State + +The agent reads `.gitmem/active-sessions.json` to recover the session ID and any surfaced scars. + +### Step 2: Answer 9 Questions + +The agent reflects on: + +1. **What broke** that you didn't expect? +2. **What took longer** than it should have? +3. **What would you do differently** next time? +4. **What pattern worked** well? +5. **What assumption was wrong?** +6. **Which scars** did you apply? +7. **What should be captured** as institutional memory? +8. **How did the human prefer to work?** (rapport) +9. **What collaborative dynamic** worked or didn't? (rapport) + +### Step 3: Human Review + +The agent asks: "Any corrections or additions?" + +This human checkpoint prevents false learnings from being persisted. + +### Step 4: Create Learnings + +Any new scars, wins, or patterns identified in Q7 are created **before** session close. + +### Step 5: Persist + +`session_close` writes the full session record with: +- Close compliance metadata +- Scar usage records +- Open threads +- Rapport notes for the next session + +## Writing the Payload + +For standard closes, write heavy data to `.gitmem/closing-payload.json` before calling `session_close`. The tool reads this file automatically. + +```json +{ + "closing_reflection": "Session focused on auth migration...", + "task_completion": "partial", + "scars_to_record": [], + "open_threads": ["Rate limiting still needs implementation"], + "decisions": ["Chose JWT over session cookies for stateless auth"] +} +``` + +======================================================================== +# Error Handling +URL: https://gitmem.ai/docs/guides/error-handling +Description: Understanding and debugging GitMem errors. +======================================================================== + +# Error Handling + +GitMem surfaces errors clearly so you can diagnose and fix issues quickly. + +## Error Response Format + +All tools return errors in a consistent format: + +```json +{ + "success": false, + "errors": ["Missing required field: severity"], + "message": "Validation failed" +} +``` + +The `errors` array contains specific, actionable error messages. + +## Common Errors + +### Invalid Session ID + +``` +Error: Invalid session_id format. Expected UUID (e.g., '393adb34-xxxx-xxxx-xxxx-xxxxxxxxxxxx') or short ID (e.g., '393adb34'). Did you forget to run session_start first? +``` + +**Cause:** Passing a placeholder like `SESSION_AUTO` instead of a real session ID. +**Fix:** Call `session_start` first, then use the returned session ID. + +### Missing Severity for Scars + +``` +Error: Missing required field: severity (must be critical, high, medium, or low) +``` + +**Cause:** Creating a scar without specifying severity. +**Fix:** Add `severity: "medium"` (or appropriate level) to your `create_learning` call. + +### Missing Counter-Arguments + +``` +Error: Scars require at least 2 counter_arguments +``` + +**Cause:** Creating a scar with fewer than 2 counter-arguments. +**Fix:** Add at least 2 reasons why someone might reasonably ignore this scar. + +## Silent Failure Prevention + +GitMem tracks all fire-and-forget operations (metrics, cache writes, embeddings) via the Effect Tracker. Use `health` to see success/failure rates: + +``` +health({ failure_limit: 10 }) +``` + +This surfaces any background operations that failed silently. + +## MCP Transport Errors + +If you see garbled JSON or "invalid JSON" errors in your MCP client: + +1. GitMem uses `console.error` (stderr) for all diagnostics +2. `console.log` (stdout) is reserved for MCP JSON-RPC +3. If a plugin or extension writes to stdout, it corrupts the transport + +Check that no other tools are writing to stdout in the same process. + +======================================================================== +# Multi-Agent Workflows +URL: https://gitmem.ai/docs/guides/multi-agent +Description: Inject institutional memory into sub-agents and capture their findings. +======================================================================== + +# Multi-Agent Workflows + +GitMem helps coordinate teams of agents on a single machine. The lead agent can inject context into sub-agents and absorb their findings back into institutional memory. + +> **Note:** Cross-machine shared memory requires the Pro tier (coming soon). The workflows below work on the free tier for agents running on the same machine. + +## Context Injection + +Before spawning a sub-agent, use `prepare_context` to generate a memory payload: + +``` +prepare_context({ + plan: "review authentication middleware", + format: "compact" // ~500 tokens +}) +``` + +Formats: +- **`full`** — Rich markdown, unlimited tokens +- **`compact`** — ~500 tokens, one line per scar +- **`gate`** — ~100 tokens, blocking scars only + +Include the payload in the sub-agent's prompt so it starts with institutional awareness. + +## Absorbing Observations + +When a sub-agent returns, capture its findings: + +``` +absorb_observations({ + observations: [ + { + source: "Sub-Agent: code review", + text: "Auth middleware doesn't validate token expiry", + severity: "scar_candidate" + }, + { + source: "Sub-Agent: code review", + text: "Good use of middleware pattern for request validation", + severity: "info" + } + ] +}) +``` + +Severity levels: +- **`info`** — Noteworthy but not actionable +- **`warning`** — Potential issue worth tracking +- **`scar_candidate`** — Should be promoted to a scar + +## Best Practices + +1. **Always `prepare_context` before spawning** — The 2-3 second cost prevents agents from repeating known mistakes +2. **Always `absorb_observations` after return** — Don't lose sub-agent findings +3. **Use `compact` format for most agents** — `gate` for simple tasks, `full` for complex reviews +4. **Scope by project** — Use project namespaces to keep memories relevant + +======================================================================== +# GitMem +URL: https://gitmem.ai/docs +Description: Institutional memory for AI coding agents. Memory that compounds. +======================================================================== + +# GitMem + +**Institutional memory for AI coding agents.** GitMem is an MCP server that gives AI agents the ability to learn from past mistakes, remember what worked, and share knowledge across sessions. + +## What is GitMem? + +Every time an AI agent makes a mistake, fixes a bug, or discovers a better approach, that knowledge disappears when the session ends. GitMem captures these lessons as **scars** (mistakes to avoid), **wins** (approaches that worked), and **patterns** (reusable strategies) — then surfaces them automatically before the agent takes similar actions. + +## Key Features + +- **Automatic Recall** — Before taking action, agents check institutional memory for relevant lessons +- **Session Continuity** — Context carries across sessions via threads and session history +- **Multi-Agent** — Teams of agents share the same institutional memory +- **MCP Native** — Works with any MCP-compatible client (Claude Code, Claude Desktop, Cursor, etc.) +- **Free Tier** — Local `.gitmem/` storage with no external dependencies + +## Quick Start + +```bash +npx gitmem init +``` + +One command sets up everything: `.gitmem/` directory, `.mcp.json`, `CLAUDE.md`, hooks, and permissions. Already have existing config? The wizard merges without destroying anything. + +[Get Started](/docs/getting-started) | [Concepts](/docs/concepts) | [Tool Reference](/docs/tools) + +======================================================================== +# absorb_observations +URL: https://gitmem.ai/docs/tools/absorb-observations +Description: Capture observations from sub-agents and teammates. +======================================================================== + +# absorb_observations + +**Tier:** Free · **Aliases:** `gitmem-ao`, `gm-absorb` + +Capture observations from sub-agents and teammates. The lead agent parses findings from sub-agent responses, then calls this to persist and analyze them. Identifies scar candidates. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `task_id` | string | No | Linear issue or task identifier (optional) | +| `observations` | object[] | Yes | Array of observations from sub-agents/teammates | + +### observations items + +| Field | Type | Required | Description | +|-------|------|----------|-------------| +| `source` | string | Yes | Who made this observation (e.g., "Sub-Agent: code review") | +| `text` | string | Yes | What was observed | +| `severity` | `"info"` \| `"warning"` \| `"scar_candidate"` | Yes | Observation severity | +| `context` | string | No | File, function, or area (optional) | + +======================================================================== +# analyze +URL: https://gitmem.ai/docs/tools/analyze +Description: Session analytics and insights engine. +======================================================================== + +# analyze + +**Tier:** Pro · **Aliases:** `gitmem-analyze`, `gm-analyze` + +Session analytics and insights engine. Returns formatted markdown by default. Use format=json for raw data. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `lens` | `"summary"` \| `"reflections"` \| `"blindspots"` | No | Analysis lens to apply (default: summary) | +| `days` | number | No | Number of days to analyze (default: 30) | +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | +| `agent` | string | No | Filter by agent identity (e.g., CLI, DAC, CODA-1) | +| `format` | `"text"` \| `"json"` | No | Output format: text (default, compact markdown) or json (raw data) | + +======================================================================== +# archive_learning +URL: https://gitmem.ai/docs/tools/archive-learning +Description: Archives a learning (scar/win/pattern) by setting is_active=false and recording archived_at timestamp. +======================================================================== + +# archive_learning + +**Tier:** Pro · **Aliases:** `gitmem-al`, `gm-archive` + +Archives a learning (scar/win/pattern) by setting is_active=false and recording archived_at timestamp. Archived learnings are excluded from recall and search results but preserved for audit trail. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `id` | string | Yes | UUID of the learning to archive | +| `reason` | string | No | Optional reason for archiving (e.g., 'superseded by OD-XXX', 'no longer relevant') | + +======================================================================== +# gitmem-cache-flush +URL: https://gitmem.ai/docs/tools/cache-flush +Description: gitmem-cache-flush - Force reload cache from Supabase (use when out of sync). +======================================================================== + +# gitmem-cache-flush + +**Tier:** Pro · **Aliases:** `gm-cache-f` + +gitmem-cache-flush - Force reload cache from Supabase (use when out of sync) + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | + +======================================================================== +# gitmem-cache-health +URL: https://gitmem.ai/docs/tools/cache-health +Description: gitmem-cache-health - Compare local cache against remote Supabase (detect out-of-sync). +======================================================================== + +# gitmem-cache-health + +**Tier:** Pro · **Aliases:** `gm-cache-h` + +gitmem-cache-health - Compare local cache against remote Supabase (detect out-of-sync) + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | + +======================================================================== +# gitmem-cache-status +URL: https://gitmem.ai/docs/tools/cache-status +Description: gitmem-cache-status - Show local search cache status (scar count, age, staleness). +======================================================================== + +# gitmem-cache-status + +**Tier:** Pro · **Aliases:** `gm-cache-s` + +gitmem-cache-status - Show local search cache status (scar count, age, staleness) + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | + +======================================================================== +# cleanup_threads +URL: https://gitmem.ai/docs/tools/cleanup-threads +Description: Triage open threads by lifecycle health. +======================================================================== + +# cleanup_threads + +**Tier:** Free · **Aliases:** `gitmem-cleanup`, `gm-cleanup` + +Triage open threads by lifecycle health. Groups threads as active/cooling/dormant with vitality scores. Use auto_archive=true to archive threads dormant 30+ days. Review and resolve stale threads to keep your thread list healthy. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | +| `auto_archive` | boolean | No | If true, auto-archive threads that have been dormant for 30+ days | + +======================================================================== +# confirm_scars +URL: https://gitmem.ai/docs/tools/confirm-scars +Description: Confirm surfaced scars with APPLYING/N_A/REFUTED decisions and evidence. +======================================================================== + +# confirm_scars + +**Tier:** Free · **Aliases:** `gitmem-cs`, `gm-confirm` + +Confirm surfaced scars with APPLYING/N_A/REFUTED decisions and evidence. REQUIRED after recall() before consequential actions. Each recalled scar must be addressed. APPLYING: past-tense evidence of compliance. N_A: explain why scar doesn't apply. REFUTED: acknowledge risk of overriding. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `confirmations` | object[] | Yes | One confirmation per recalled scar. All recalled scars must be addressed. | + +### confirmations items + +| Field | Type | Required | Description | +|-------|------|----------|-------------| +| `scar_id` | string | Yes | UUID of the surfaced scar (from recall result) | +| `decision` | `"APPLYING"` \| `"N_A"` \| `"REFUTED"` | Yes | APPLYING: scar is relevant, evidence of compliance. N_A: scar doesn't apply, explain why. REFUTED: overriding scar, acknowledge risk. | +| `evidence` | string | Yes | Past-tense evidence (APPLYING), scenario comparison (N_A), or risk acknowledgment (REFUTED). Minimum 50 characters. | + +======================================================================== +# create_decision +URL: https://gitmem.ai/docs/tools/create-decision +Description: Log architectural/operational decision to institutional memory. +======================================================================== + +# create_decision + +**Tier:** Free · **Aliases:** `gitmem-cd` + +Log architectural/operational decision to institutional memory + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `title` | string | Yes | Decision title | +| `decision` | string | Yes | What was decided | +| `rationale` | string | Yes | Why this decision was made | +| `alternatives_considered` | string[] | No | Alternatives that were rejected | +| `personas_involved` | string[] | No | Personas involved in decision | +| `docs_affected` | string[] | No | Docs/files affected by this decision (relative paths from repo root) | +| `linear_issue` | string | No | Associated Linear issue | +| `session_id` | string | No | Current session ID | +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | + +======================================================================== +# create_learning +URL: https://gitmem.ai/docs/tools/create-learning +Description: Create scar, win, or pattern entry in institutional memory. +======================================================================== + +# create_learning + +**Tier:** Free · **Aliases:** `gitmem-cl`, `gm-scar` + +Create scar, win, or pattern entry in institutional memory + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `learning_type` | `"scar"` \| `"win"` \| `"pattern"` \| `"anti_pattern"` | Yes | Type of learning | +| `title` | string | Yes | Learning title | +| `description` | string | Yes | Detailed description | +| `severity` | `"critical"` \| `"high"` \| `"medium"` \| `"low"` | No | Severity level (required for scars) | +| `scar_type` | `"process"` \| `"incident"` \| `"context"` | No | Scar type (process, incident, or context). Defaults to 'process'. | +| `counter_arguments` | string[] | No | Counter-arguments for scars (min 2 required) | +| `problem_context` | string | No | Problem context (for wins) | +| `solution_approach` | string | No | Solution approach (for wins) | +| `applies_when` | string[] | No | When this pattern applies | +| `domain` | string[] | No | Domain tags | +| `keywords` | string[] | No | Search keywords | +| `source_linear_issue` | string | No | Source Linear issue | +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | + +======================================================================== +# create_thread +URL: https://gitmem.ai/docs/tools/create-thread +Description: Create an open thread to track unresolved work across sessions. +======================================================================== + +# create_thread + +**Tier:** Free · **Aliases:** `gitmem-ct`, `gm-thread-new` + +Create an open thread to track unresolved work across sessions. Includes semantic dedup: if a similar open thread exists (cosine similarity > 0.85), returns the existing thread instead. Check the 'deduplicated' field in the response. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `text` | string | Yes | Thread description — what needs to be tracked or resolved | +| `linear_issue` | string | No | Associated Linear issue (e.g., OD-XXX) | + +======================================================================== +# dismiss_suggestion +URL: https://gitmem.ai/docs/tools/dismiss-suggestion +Description: Dismiss a suggested thread. +======================================================================== + +# dismiss_suggestion + +**Tier:** Free · **Aliases:** `gitmem-ds`, `gm-dismiss` + +Dismiss a suggested thread. Incremented dismiss count — suggestions dismissed 3+ times are permanently suppressed. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `suggestion_id` | string | Yes | Suggestion ID (e.g., "ts-a1b2c3d4") from suggested_threads list | + +======================================================================== +# get_transcript +URL: https://gitmem.ai/docs/tools/get-transcript +Description: Retrieve a session transcript from storage (OD-467). +======================================================================== + +# get_transcript + +**Tier:** Dev · **Aliases:** `gitmem-gt` + +Retrieve a session transcript from storage (OD-467) + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `session_id` | string | Yes | Session ID to retrieve transcript for | + +======================================================================== +# graph_traverse +URL: https://gitmem.ai/docs/tools/graph-traverse +Description: Traverse the knowledge graph over institutional memory triples. +======================================================================== + +# graph_traverse + +**Tier:** Pro · **Aliases:** `gitmem-graph`, `gm-graph` + +Traverse the knowledge graph over institutional memory triples. Answers: 'show me everything connected to OD-466', 'what did CLI produce', 'trace this decision back', 'which issues produced the most learnings'. Four lenses: connected_to, produced_by, provenance, stats. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `lens` | `"connected_to"` \| `"produced_by"` \| `"provenance"` \| `"stats"` | Yes | Traversal mode: connected_to (all connections to a node), produced_by (what an agent/persona produced), provenance (trace origin chain), stats (aggregate counts) | +| `node` | string | No | Starting node. Examples: 'OD-466', 'CLI', 'Scar: Done ≠ Deployed'. Required for all lenses except stats. | +| `predicate` | `"created_in"` \| `"influenced_by"` \| `"supersedes"` \| `"demonstrates"` | No | Filter by predicate (optional) | +| `depth` | number | No | Max chain depth for provenance lens (default: 3) | +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | +| `limit` | number | No | Max triples to return (default: 50) | + +======================================================================== +# health +URL: https://gitmem.ai/docs/tools/health +Description: Show write health for the current session. +======================================================================== + +# health + +**Tier:** Free · **Aliases:** `gitmem-health`, `gm-health` + +Show write health for the current session. Reports success/failure rates for all tracked fire-and-forget operations (metrics, cache, triple writes, embeddings, scar usage). Use this to diagnose silent failures. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `failure_limit` | number | No | Max number of recent failures to return (default: 10) | + +======================================================================== +# gitmem-help +URL: https://gitmem.ai/docs/tools/help +Description: gitmem-help - Show available commands with ASCII art header. +======================================================================== + +# gitmem-help + +**Tier:** Free + +gitmem-help - Show available commands with ASCII art header + +======================================================================== +# Tool Reference +URL: https://gitmem.ai/docs/tools +Description: Complete reference for all GitMem MCP tools. +======================================================================== + +# Tool Reference + +GitMem exposes tools via the [Model Context Protocol](https://modelcontextprotocol.io). Each tool has a canonical name and short aliases for convenience. + +## Core Tools (All Tiers) + +### Session Management + +| Tool | Aliases | Purpose | +|------|---------|---------| +| [session_start](/docs/tools/session-start) | `gitmem-ss`, `gm-open` | Initialize session with context | +| [session_refresh](/docs/tools/session-refresh) | `gitmem-sr`, `gm-refresh` | Reload context mid-session | +| [session_close](/docs/tools/session-close) | `gitmem-sc`, `gm-close` | Close session with reflection | + +### Memory Operations + +| Tool | Aliases | Purpose | +|------|---------|---------| +| [recall](/docs/tools/recall) | `gitmem-r` | Surface relevant scars before acting | +| [confirm_scars](/docs/tools/confirm-scars) | `gitmem-cs`, `gm-confirm` | Confirm recalled scars (APPLYING/N_A/REFUTED) | +| [create_learning](/docs/tools/create-learning) | `gitmem-cl`, `gm-scar` | Create scar/win/pattern | +| [create_decision](/docs/tools/create-decision) | `gitmem-cd` | Log architectural decision | +| [record_scar_usage](/docs/tools/record-scar-usage) | `gitmem-rs` | Track scar application | + +### Search and Discovery + +| Tool | Aliases | Purpose | +|------|---------|---------| +| [search](/docs/tools/search) | `gitmem-search`, `gm-search` | Explore institutional memory | +| [log](/docs/tools/log) | `gitmem-log`, `gm-log` | List recent learnings | +| [analyze](/docs/tools/analyze) | `gitmem-analyze`, `gm-analyze` | Session analytics | + +### Thread Management + +| Tool | Aliases | Purpose | +|------|---------|---------| +| [list_threads](/docs/tools/list-threads) | `gitmem-lt`, `gm-threads` | List open threads | +| [create_thread](/docs/tools/create-thread) | `gitmem-ct`, `gm-thread-new` | Create thread with dedup | +| [resolve_thread](/docs/tools/resolve-thread) | `gitmem-rt`, `gm-resolve` | Mark thread resolved | +| [promote_suggestion](/docs/tools/promote-suggestion) | `gitmem-ps`, `gm-promote` | Promote suggested thread | +| [dismiss_suggestion](/docs/tools/dismiss-suggestion) | `gitmem-ds`, `gm-dismiss` | Dismiss suggested thread | +| [cleanup_threads](/docs/tools/cleanup-threads) | `gitmem-cleanup`, `gm-cleanup` | Triage by health | + +### Multi-Agent + +| Tool | Aliases | Purpose | +|------|---------|---------| +| [prepare_context](/docs/tools/prepare-context) | `gitmem-pc`, `gm-pc` | Memory payload for sub-agents | +| [absorb_observations](/docs/tools/absorb-observations) | `gitmem-ao`, `gm-absorb` | Capture sub-agent findings | + +### Utility + +| Tool | Aliases | Purpose | +|------|---------|---------| +| [graph_traverse](/docs/tools/graph-traverse) | `gitmem-graph`, `gm-graph` | Knowledge graph traversal | +| [archive_learning](/docs/tools/archive-learning) | `gitmem-al`, `gm-archive` | Archive a learning | +| [health](/docs/tools/health) | `gitmem-health`, `gm-health` | Write health report | +| `gitmem-help` | — | Show available commands | + +## Pro-Only Tools (Coming Soon) + +These tools will be available when the Pro tier launches: + +| Tool | Aliases | Purpose | +|------|---------|---------| +| record_scar_usage_batch | `gitmem-rsb` | Batch scar recording | +| save_transcript | `gitmem-st` | Save session transcript | +| get_transcript | `gitmem-gt` | Retrieve transcript | +| search_transcripts | `gitmem-stx`, `gm-stx` | Search transcripts | +| cache_status | `gitmem-cache-status`, `gm-cache-s` | Cache status | +| cache_health | `gitmem-cache-health`, `gm-cache-h` | Cache vs remote comparison | +| cache_flush | `gitmem-cache-flush`, `gm-cache-f` | Force cache reload | + +======================================================================== +# list_threads +URL: https://gitmem.ai/docs/tools/list-threads +Description: List open threads across recent sessions. +======================================================================== + +# list_threads + +**Tier:** Free · **Aliases:** `gitmem-lt`, `gm-threads` + +List open threads across recent sessions. Shows unresolved work items that carry over between sessions, with IDs for resolution. Use resolve_thread to mark threads as done. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `status` | `"open"` \| `"resolved"` | No | Filter by status (default: open) | +| `include_resolved` | boolean | No | Include recently resolved threads (default: false) | +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | + +======================================================================== +# log +URL: https://gitmem.ai/docs/tools/log +Description: List recent learnings chronologically (like git log). +======================================================================== + +# log + +**Tier:** Free · **Aliases:** `gitmem-log`, `gm-log` + +List recent learnings chronologically (like git log). Shows scars, wins, and patterns ordered by creation date. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `limit` | number | No | Number of entries to return (default: 10) | +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | +| `learning_type` | `"scar"` \| `"win"` \| `"pattern"` \| `"anti_pattern"` | No | Filter by learning type | +| `severity` | `"critical"` \| `"high"` \| `"medium"` \| `"low"` | No | Filter by severity level | +| `since` | number | No | Days to look back (e.g., 7 = last week) | + +======================================================================== +# prepare_context +URL: https://gitmem.ai/docs/tools/prepare-context +Description: Generate portable memory payload for sub-agent injection. +======================================================================== + +# prepare_context + +**Tier:** Free · **Aliases:** `gitmem-pc`, `gm-pc` + +Generate portable memory payload for sub-agent injection. Formats institutional memory into compact or gate payloads that fit in Task tool prompts. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `plan` | string | Yes | What the team is about to do (e.g., 'review auth middleware', 'deploy edge function') | +| `format` | `"full"` \| `"compact"` \| `"gate"` | Yes | Output format: full (rich markdown), compact (~500 tokens, one-line per scar), gate (~100 tokens, blocking scars only) | +| `max_tokens` | number | No | Token budget for payload (default: 500 for compact, 100 for gate, unlimited for full) | +| `agent_role` | string | No | Sub-agent role for relevance filtering (e.g., 'reviewer', 'deployer') — reserved for Phase 3 | +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | + +======================================================================== +# promote_suggestion +URL: https://gitmem.ai/docs/tools/promote-suggestion +Description: Promote a suggested thread to an open thread. +======================================================================== + +# promote_suggestion + +**Tier:** Free · **Aliases:** `gitmem-ps`, `gm-promote` + +Promote a suggested thread to an open thread. Takes a suggestion_id from session_start's suggested_threads list and creates a real thread from it. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `suggestion_id` | string | Yes | Suggestion ID (e.g., "ts-a1b2c3d4") from suggested_threads list | +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | + +======================================================================== +# recall +URL: https://gitmem.ai/docs/tools/recall +Description: Check institutional memory for relevant scars before taking action. +======================================================================== + +# recall + +**Tier:** Free · **Aliases:** `gitmem-r` + +Check institutional memory for relevant scars before taking action. Returns matching scars and their lessons. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `plan` | string | Yes | What you're about to do (e.g., 'implement auth layer', 'deploy to production') | +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | +| `match_count` | number | No | Number of scars to return (default: 3) | +| `issue_id` | string | No | Linear issue identifier for variant assignment (e.g., 'OD-525'). When provided, scars with variants will be randomly assigned and formatted accordingly. | + +======================================================================== +# record_scar_usage_batch +URL: https://gitmem.ai/docs/tools/record-scar-usage-batch +Description: Track multiple scar applications in a single batch operation (reduces session close latency). +======================================================================== + +# record_scar_usage_batch + +**Tier:** Dev · **Aliases:** `gitmem-rsb` + +Track multiple scar applications in a single batch operation (reduces session close latency) + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `scars` | object[] | Yes | Array of scar usage entries to record | +| `project` | string | No | Project scope for scar resolution | + +### scars items + +| Field | Type | Required | Description | +|-------|------|----------|-------------| +| `scar_identifier` | string | Yes | UUID or title/description of scar (tool resolves to UUID) | +| `issue_id` | string | No | Linear issue UUID | +| `issue_identifier` | string | No | Linear issue identifier (e.g., OD-XXX) | +| `surfaced_at` | string | Yes | ISO timestamp when scar was retrieved | +| `acknowledged_at` | string | No | ISO timestamp when scar was acknowledged | +| `reference_type` | `"explicit"` \| `"implicit"` \| `"acknowledged"` \| `"refuted"` \| `"none"` | Yes | How the scar was referenced | +| `reference_context` | string | Yes | How the scar was applied (1-2 sentences) | +| `execution_successful` | boolean | No | Whether the task succeeded after applying scar | +| `session_id` | string | No | GitMem session UUID (for non-issue session tracking) | +| `agent` | string | No | Agent identity (CLI, DAC, CODA-1, etc.) | + +======================================================================== +# record_scar_usage +URL: https://gitmem.ai/docs/tools/record-scar-usage +Description: Track scar application for effectiveness measurement. +======================================================================== + +# record_scar_usage + +**Tier:** Free · **Aliases:** `gitmem-rs` + +Track scar application for effectiveness measurement + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `scar_id` | string | Yes | UUID of the scar from orchestra_learnings | +| `issue_id` | string | No | Linear issue UUID | +| `issue_identifier` | string | No | Linear issue identifier (e.g., OD-XXX) | +| `surfaced_at` | string | Yes | ISO timestamp when scar was retrieved | +| `acknowledged_at` | string | No | ISO timestamp when scar was acknowledged | +| `reference_type` | `"explicit"` \| `"implicit"` \| `"acknowledged"` \| `"refuted"` \| `"none"` | Yes | How the scar was referenced | +| `reference_context` | string | Yes | How the scar was applied (1-2 sentences) | +| `execution_successful` | boolean | No | Whether the task succeeded after applying scar | +| `session_id` | string | No | GitMem session UUID (for non-issue session tracking) | +| `agent` | string | No | Agent identity (CLI, DAC, CODA-1, etc.) | +| `variant_id` | string | No | UUID of the assigned variant from scar_enforcement_variants (for A/B testing) | + +======================================================================== +# resolve_thread +URL: https://gitmem.ai/docs/tools/resolve-thread +Description: Mark an open thread as resolved. +======================================================================== + +# resolve_thread + +**Tier:** Free · **Aliases:** `gitmem-rt`, `gm-resolve` + +Mark an open thread as resolved. Use thread_id for exact match or text_match for fuzzy matching. Updates session state and .gitmem/threads.json. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `thread_id` | string | No | Thread ID (e.g., "t-a1b2c3d4") for exact resolution | +| `text_match` | string | No | Fuzzy text match against thread descriptions (fallback if no thread_id) | +| `resolution_note` | string | No | Brief note explaining how/why thread was resolved | + +======================================================================== +# save_transcript +URL: https://gitmem.ai/docs/tools/save-transcript +Description: Save full session transcript to storage for training data and post-mortems (OD-467). +======================================================================== + +# save_transcript + +**Tier:** Dev · **Aliases:** `gitmem-st` + +Save full session transcript to storage for training data and post-mortems (OD-467) + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `session_id` | string | Yes | Session ID to associate transcript with | +| `transcript` | string | Yes | Full conversation transcript content | +| `format` | `"json"` \| `"markdown"` | No | Transcript format (default: json) | +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | + +======================================================================== +# search_transcripts +URL: https://gitmem.ai/docs/tools/search-transcripts +Description: Semantic search over session transcript chunks. +======================================================================== + +# search_transcripts + +**Tier:** Dev · **Aliases:** `gitmem-stx`, `gm-stx` + +Semantic search over session transcript chunks. Generates embedding for query and calls match_transcript_chunks RPC to find relevant conversation fragments across all indexed sessions. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `query` | string | Yes | Natural language search query (e.g., 'deployment verification discussion', 'what was decided about caching') | +| `match_count` | number | No | Maximum number of chunks to return (default: 10, max: 50) | +| `similarity_threshold` | number | No | Minimum similarity score 0-1 (default: 0.3). Higher values return more relevant results. | +| `project` | string | No | Project namespace to filter by (e.g.) | + +======================================================================== +# search +URL: https://gitmem.ai/docs/tools/search +Description: Search institutional memory by query. +======================================================================== + +# search + +**Tier:** Free · **Aliases:** `gitmem-search`, `gm-search` + +Search institutional memory by query. Unlike recall (which is action-oriented), search is exploration-oriented — returns matching scars/wins/patterns without side effects. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `query` | string | Yes | Natural language search query (e.g., 'deployment failures', 'Supabase RLS') | +| `match_count` | number | No | Number of results to return (default: 5) | +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | +| `severity` | `"critical"` \| `"high"` \| `"medium"` \| `"low"` | No | Filter by severity level | +| `learning_type` | `"scar"` \| `"win"` \| `"pattern"` \| `"anti_pattern"` | No | Filter by learning type | + +======================================================================== +# session_close +URL: https://gitmem.ai/docs/tools/session-close +Description: Persist session with compliance validation. +======================================================================== + +# session_close + +**Tier:** Free · **Aliases:** `gitmem-sc`, `gm-close` + +Persist session with compliance validation. IMPORTANT: Before calling this tool, write all heavy payload data (closing_reflection, task_completion, human_corrections, scars_to_record, open_threads, decisions, learnings_created) to `gitmem_dir`/closing-payload.json using your file write tool — the gitmem_dir path is returned by session_start (also shown in session start display as 'Payload path'). Then call this tool with ONLY session_id and close_type. The tool reads the payload file automatically and deletes it after processing. Output the display field verbatim as your response — tool results are collapsed in the CLI. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `session_id` | string | Yes | Session ID from session_start | +| `close_type` | `"standard"` \| `"quick"` \| `"autonomous"` | Yes | Type of close (standard requires full reflection) | +| `linear_issue` | string | No | Associated Linear issue | +| `ceremony_duration_ms` | number | No | End-to-end ceremony duration from agent perspective (in milliseconds) | + +======================================================================== +# session_refresh +URL: https://gitmem.ai/docs/tools/session-refresh +Description: Re-surface institutional context (threads, decisions) for the current active session without creating a new session. +======================================================================== + +# session_refresh + +**Tier:** Free · **Aliases:** `gitmem-sr`, `gm-refresh` + +Re-surface institutional context (threads, decisions) for the current active session without creating a new session. Use mid-session when you need to remember where you left off, after context compaction, or after a long gap. Output the display field verbatim as your response — tool results are collapsed in the CLI. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `project` | string | No | Project namespace (default: from active session). Free-form string (e.g., 'my-project'). | + +======================================================================== +# session_start +URL: https://gitmem.ai/docs/tools/session-start +Description: Initialize session, detect agent, load institutional context (last session, recent decisions, open threads). +======================================================================== + +# session_start + +**Tier:** Free · **Aliases:** `gitmem-ss`, `gm-open` + +Initialize session, detect agent, load institutional context (last session, recent decisions, open threads). Scars surface on-demand via recall(). Output the display field verbatim as your response — tool results are collapsed in the CLI. + +## Parameters + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| `agent_identity` | `"CLI"` \| `"DAC"` \| `"CODA-1"` \| `"Brain_Local"` \| `"Brain_Cloud"` | No | Override agent identity (auto-detects if not provided) | +| `linear_issue` | string | No | Current Linear issue identifier (e.g., OD-XXX) | +| `issue_title` | string | No | Issue title for scar context | +| `issue_description` | string | No | Issue description for scar context | +| `issue_labels` | string[] | No | Issue labels for scar context | +| `project` | string | No | Project namespace (e.g., 'my-project'). Scopes sessions and searches. | +| `force` | boolean | No | Force create new session even if one already exists (OD-558) | + diff --git a/apps/docs/public/llms.txt b/apps/docs/public/llms.txt new file mode 100644 index 0000000..59163a8 --- /dev/null +++ b/apps/docs/public/llms.txt @@ -0,0 +1,94 @@ +# GitMem + +> Institutional memory for AI coding agents. An MCP server that gives agents persistent memory — scars (mistakes to avoid), sessions, threads, and learnings that compound across conversations. + +## Quick Install + +Add GitMem to any MCP-compatible AI agent: + +```bash +# Recommended: interactive setup (Claude Code, Cursor, etc.) +cd your-project && npx gitmem init + +# Or add the MCP server directly +claude mcp add gitmem -- npx -y gitmem-mcp +``` + +Manual MCP config (works with any MCP client): + +```json +{ + "mcpServers": { + "gitmem": { + "command": "npx", + "args": ["-y", "gitmem-mcp"] + } + } +} +``` + +After install, run `gitmem-help` to see available tools. + +## What It Does + +- **Recall** — Before acting, surface relevant past mistakes (scars) so you don't repeat them +- **Sessions** — Bounded work periods with context loading and closing reflection +- **Threads** — Track unresolved work across sessions +- **Learnings** — Scars, wins, patterns, and anti-patterns as institutional memory +- **Multi-agent** — Share memory across teams of AI agents via `prepare_context` + +Free tier stores everything locally in `.gitmem/`. Pro tier adds Supabase-backed semantic search. + +Full docs: https://gitmem.ai/llms-full.txt + +## Pages + +- [Changelog](https://gitmem.ai/docs/changelog): GitMem release history. +- [Core Concepts](https://gitmem.ai/docs/concepts): Understand the building blocks of GitMem's institutional memory system. +- [Learning Types](https://gitmem.ai/docs/concepts/learning-types): The four types of institutional memory in GitMem. +- [Scars](https://gitmem.ai/docs/concepts/scars): How GitMem captures and surfaces mistakes as institutional memory. +- [Sessions](https://gitmem.ai/docs/concepts/sessions): How GitMem tracks bounded work periods with context loading and closing ceremonies. +- [Threads](https://gitmem.ai/docs/concepts/threads): Track unresolved work across sessions with GitMem threads. +- [Tiers](https://gitmem.ai/docs/concepts/tiers): GitMem's tier system and how it affects available features. +- [Contributing](https://gitmem.ai/docs/contributing): How to contribute to GitMem. +- [Testing](https://gitmem.ai/docs/contributing/testing): GitMem's test pyramid and how to run each tier. +- [Configuration](https://gitmem.ai/docs/getting-started/configuration): Configure GitMem with environment variables and config files. +- [Your First Session](https://gitmem.ai/docs/getting-started/first-session): Walk through a complete GitMem session from start to close. +- [Free vs Pro](https://gitmem.ai/docs/getting-started/free-vs-pro): What you get today with the free tier and what's coming with Pro. +- [Overview](https://gitmem.ai/docs/getting-started): Get GitMem running in under 5 minutes. +- [Installation](https://gitmem.ai/docs/getting-started/installation): Install GitMem via npx, global install, or MCP configuration. +- [Closing Ceremony](https://gitmem.ai/docs/guides/closing-ceremony): How to properly close a GitMem session with reflection and persistence. +- [Error Handling](https://gitmem.ai/docs/guides/error-handling): Understanding and debugging GitMem errors. +- [Multi-Agent Workflows](https://gitmem.ai/docs/guides/multi-agent): Inject institutional memory into sub-agents and capture their findings. +- [GitMem](https://gitmem.ai/docs): Institutional memory for AI coding agents. Memory that compounds. +- [absorb_observations](https://gitmem.ai/docs/tools/absorb-observations): Capture observations from sub-agents and teammates. +- [analyze](https://gitmem.ai/docs/tools/analyze): Session analytics and insights engine. +- [archive_learning](https://gitmem.ai/docs/tools/archive-learning): Archives a learning (scar/win/pattern) by setting is_active=false and recording archived_at timestamp. +- [gitmem-cache-flush](https://gitmem.ai/docs/tools/cache-flush): gitmem-cache-flush - Force reload cache from Supabase (use when out of sync). +- [gitmem-cache-health](https://gitmem.ai/docs/tools/cache-health): gitmem-cache-health - Compare local cache against remote Supabase (detect out-of-sync). +- [gitmem-cache-status](https://gitmem.ai/docs/tools/cache-status): gitmem-cache-status - Show local search cache status (scar count, age, staleness). +- [cleanup_threads](https://gitmem.ai/docs/tools/cleanup-threads): Triage open threads by lifecycle health. +- [confirm_scars](https://gitmem.ai/docs/tools/confirm-scars): Confirm surfaced scars with APPLYING/N_A/REFUTED decisions and evidence. +- [create_decision](https://gitmem.ai/docs/tools/create-decision): Log architectural/operational decision to institutional memory. +- [create_learning](https://gitmem.ai/docs/tools/create-learning): Create scar, win, or pattern entry in institutional memory. +- [create_thread](https://gitmem.ai/docs/tools/create-thread): Create an open thread to track unresolved work across sessions. +- [dismiss_suggestion](https://gitmem.ai/docs/tools/dismiss-suggestion): Dismiss a suggested thread. +- [get_transcript](https://gitmem.ai/docs/tools/get-transcript): Retrieve a session transcript from storage (OD-467). +- [graph_traverse](https://gitmem.ai/docs/tools/graph-traverse): Traverse the knowledge graph over institutional memory triples. +- [health](https://gitmem.ai/docs/tools/health): Show write health for the current session. +- [gitmem-help](https://gitmem.ai/docs/tools/help): gitmem-help - Show available commands with ASCII art header. +- [Tool Reference](https://gitmem.ai/docs/tools): Complete reference for all GitMem MCP tools. +- [list_threads](https://gitmem.ai/docs/tools/list-threads): List open threads across recent sessions. +- [log](https://gitmem.ai/docs/tools/log): List recent learnings chronologically (like git log). +- [prepare_context](https://gitmem.ai/docs/tools/prepare-context): Generate portable memory payload for sub-agent injection. +- [promote_suggestion](https://gitmem.ai/docs/tools/promote-suggestion): Promote a suggested thread to an open thread. +- [recall](https://gitmem.ai/docs/tools/recall): Check institutional memory for relevant scars before taking action. +- [record_scar_usage_batch](https://gitmem.ai/docs/tools/record-scar-usage-batch): Track multiple scar applications in a single batch operation (reduces session close latency). +- [record_scar_usage](https://gitmem.ai/docs/tools/record-scar-usage): Track scar application for effectiveness measurement. +- [resolve_thread](https://gitmem.ai/docs/tools/resolve-thread): Mark an open thread as resolved. +- [save_transcript](https://gitmem.ai/docs/tools/save-transcript): Save full session transcript to storage for training data and post-mortems (OD-467). +- [search_transcripts](https://gitmem.ai/docs/tools/search-transcripts): Semantic search over session transcript chunks. +- [search](https://gitmem.ai/docs/tools/search): Search institutional memory by query. +- [session_close](https://gitmem.ai/docs/tools/session-close): Persist session with compliance validation. +- [session_refresh](https://gitmem.ai/docs/tools/session-refresh): Re-surface institutional context (threads, decisions) for the current active session without creating a new session. +- [session_start](https://gitmem.ai/docs/tools/session-start): Initialize session, detect agent, load institutional context (last session, recent decisions, open threads). diff --git a/apps/docs/scripts/generate-llms-txt.ts b/apps/docs/scripts/generate-llms-txt.ts new file mode 100644 index 0000000..5bc5ea9 --- /dev/null +++ b/apps/docs/scripts/generate-llms-txt.ts @@ -0,0 +1,186 @@ +#!/usr/bin/env tsx +/** + * Generate llms.txt and llms-full.txt from MDX content + * + * - public/llms.txt: Structured index with titles + paths + * - public/llms-full.txt: Full content concatenation for LLM consumption + * + * Run: npm run generate:llms (from apps/docs/) + */ + +import { readFileSync, writeFileSync, mkdirSync } from "node:fs"; +import { join, dirname, relative } from "node:path"; +import { fileURLToPath } from "node:url"; +import { globSync } from "node:fs"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const CONTENT_DIR = join(__dirname, "../content/docs"); +const PUBLIC_DIR = join(__dirname, "../public"); +const BASE_URL = "https://gitmem.ai"; + +interface Page { + path: string; + title: string; + description: string; + content: string; +} + +function extractFrontmatter(raw: string): { + title: string; + description: string; + body: string; +} { + const match = raw.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/); + if (!match) return { title: "", description: "", body: raw }; + + const fm = match[1]; + const body = match[2].trim(); + + const titleMatch = fm.match(/title:\s*"?([^"\n]+)"?/); + const descMatch = fm.match(/description:\s*"?([^"\n]+)"?/); + + return { + title: titleMatch?.[1]?.trim() || "", + description: descMatch?.[1]?.trim() || "", + body, + }; +} + +function mdxToUrl(filePath: string): string { + let rel = relative(CONTENT_DIR, filePath); + // Remove .mdx extension + rel = rel.replace(/\.mdx$/, ""); + // index pages map to directory + rel = rel.replace(/\/index$/, ""); + if (rel === "index") rel = ""; + return `${BASE_URL}/docs${rel ? "/" + rel : ""}`; +} + +// ============================================================================ +// Collect all MDX files +// ============================================================================ + +// Use a simple recursive glob approach +function findMdxFiles(dir: string): string[] { + const { readdirSync, statSync } = require("node:fs"); + const results: string[] = []; + + for (const entry of readdirSync(dir)) { + const full = join(dir, entry); + const stat = statSync(full); + if (stat.isDirectory()) { + results.push(...findMdxFiles(full)); + } else if (entry.endsWith(".mdx")) { + results.push(full); + } + } + + return results.sort(); +} + +const mdxFiles = findMdxFiles(CONTENT_DIR); +const pages: Page[] = []; + +for (const file of mdxFiles) { + const raw = readFileSync(file, "utf-8"); + const { title, description, body } = extractFrontmatter(raw); + const url = mdxToUrl(file); + + pages.push({ + path: url, + title: title || relative(CONTENT_DIR, file), + description, + content: body, + }); +} + +// ============================================================================ +// Generate llms.txt (index) +// ============================================================================ + +mkdirSync(PUBLIC_DIR, { recursive: true }); + +let index = `# GitMem + +> Institutional memory for AI coding agents. An MCP server that gives agents persistent memory — scars (mistakes to avoid), sessions, threads, and learnings that compound across conversations. + +## Quick Install + +Add GitMem to any MCP-compatible AI agent: + +\`\`\`bash +# Recommended: interactive setup (Claude Code, Cursor, etc.) +cd your-project && npx gitmem-mcp init + +# Or add the MCP server directly +claude mcp add gitmem -- npx -y gitmem-mcp +\`\`\` + +Manual MCP config (works with any MCP client): + +\`\`\`json +{ + "mcpServers": { + "gitmem": { + "command": "npx", + "args": ["-y", "gitmem-mcp"] + } + } +} +\`\`\` + +After install, run \`gitmem-help\` to see available tools. + +## What It Does + +- **Recall** — Before acting, surface relevant past mistakes (scars) so you don't repeat them +- **Sessions** — Bounded work periods with context loading and closing reflection +- **Threads** — Track unresolved work across sessions +- **Learnings** — Scars, wins, patterns, and anti-patterns as institutional memory +- **Multi-agent** — Share memory across teams of AI agents via \`prepare_context\` + +Free tier stores everything locally in \`.gitmem/\`. Pro tier adds Supabase-backed semantic search. + +Full docs: ${BASE_URL}/llms-full.txt + +## Pages + +`; + +for (const page of pages) { + index += `- [${page.title}](${page.path})`; + if (page.description) { + index += `: ${page.description}`; + } + index += "\n"; +} + +writeFileSync(join(PUBLIC_DIR, "llms.txt"), index); +console.error(`Generated llms.txt (${pages.length} pages indexed)`); + +// ============================================================================ +// Generate llms-full.txt (full content) +// ============================================================================ + +let full = `# GitMem — Complete Documentation + +> GitMem is an MCP server that gives AI coding agents persistent institutional memory. +> Install: \`npx gitmem-mcp init\` or add MCP server \`npx -y gitmem-mcp\` +> Source: ${BASE_URL} +> Index: ${BASE_URL}/llms.txt + +`; + +for (const page of pages) { + full += `${"=".repeat(72)}\n`; + full += `# ${page.title}\n`; + full += `URL: ${page.path}\n`; + if (page.description) { + full += `Description: ${page.description}\n`; + } + full += `${"=".repeat(72)}\n\n`; + full += page.content + "\n\n"; +} + +writeFileSync(join(PUBLIC_DIR, "llms-full.txt"), full); +console.error(`Generated llms-full.txt (${pages.length} pages, ${Math.round(full.length / 1024)}KB)`); diff --git a/apps/docs/scripts/generate-tool-docs.ts b/apps/docs/scripts/generate-tool-docs.ts new file mode 100644 index 0000000..fbdb593 --- /dev/null +++ b/apps/docs/scripts/generate-tool-docs.ts @@ -0,0 +1,239 @@ +#!/usr/bin/env tsx +/** + * Generate tool reference MDX pages from definitions.ts + * + * Reads the TOOLS array and tier gating sets from the GitMem source, + * then generates one MDX file per canonical tool in content/docs/tools/. + * + * Run: npm run generate:tools (from apps/docs/) + */ + +import { writeFileSync, mkdirSync } from "node:fs"; +import { join, dirname } from "node:path"; +import { fileURLToPath } from "node:url"; + +import { + TOOLS, + CACHE_TOOL_NAMES, + BATCH_TOOL_NAMES, + TRANSCRIPT_TOOL_NAMES, + ANALYZE_TOOL_NAMES, + GRAPH_TOOL_NAMES, + ARCHIVE_TOOL_NAMES, +} from "../../../src/tools/definitions.js"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const TOOLS_DIR = join(__dirname, "../content/docs/tools"); + +// ============================================================================ +// Types +// ============================================================================ + +interface PropertySchema { + type?: string; + description?: string; + enum?: string[]; + items?: PropertySchema & { properties?: Record; required?: string[] }; + properties?: Record; + required?: string[]; +} + +interface ToolDef { + name: string; + description: string; + inputSchema: { + type: string; + properties?: Record; + required?: string[]; + }; +} + +// ============================================================================ +// Canonical tool identification +// ============================================================================ + +// Tools without gitmem-/gm- prefix are canonical, plus these special cases: +const SPECIAL_CANONICAL = new Set([ + "gitmem-help", + "gitmem-cache-status", + "gitmem-cache-health", + "gitmem-cache-flush", +]); + +// Virtual names used in gm-cache-* alias descriptions +const VIRTUAL_TO_CANONICAL: Record = { + cache_status: "gitmem-cache-status", + cache_health: "gitmem-cache-health", + cache_flush: "gitmem-cache-flush", +}; + +function isCanonical(tool: ToolDef): boolean { + if (SPECIAL_CANONICAL.has(tool.name)) return true; + return !tool.name.startsWith("gitmem-") && !tool.name.startsWith("gm-"); +} + +function getCanonicalRef(tool: ToolDef): string | null { + // Alias descriptions follow: "alias-name (canonical_name) - description" + const match = tool.description.match(/^\S+\s+\((\w+)\)\s*[-–—]/); + if (!match) return null; + const ref = match[1]; + return VIRTUAL_TO_CANONICAL[ref] || ref; +} + +function getTier(toolName: string): "free" | "pro" | "dev" { + if (BATCH_TOOL_NAMES.has(toolName)) return "dev"; + if (TRANSCRIPT_TOOL_NAMES.has(toolName)) return "dev"; + if (CACHE_TOOL_NAMES.has(toolName)) return "pro"; + if (ANALYZE_TOOL_NAMES.has(toolName)) return "pro"; + if (GRAPH_TOOL_NAMES.has(toolName)) return "pro"; + if (ARCHIVE_TOOL_NAMES.has(toolName)) return "pro"; + return "free"; +} + +function toSlug(name: string): string { + return name.replace(/^gitmem-/, "").replace(/_/g, "-"); +} + +function escapeMarkdown(s: string): string { + return s.replace(/\|/g, "\\|").replace(/\n/g, " "); +} + +function cleanDescription(desc: string): string { + return desc + .replace(/\s*OD-\d+:[^.]+\./g, "") + .replace(/\s*DISPLAY:[^.]+\./g, "") + .replace(/\{(\w+)\}/g, "`$1`") + .trim(); +} + +function formatType(schema: PropertySchema): string { + if (schema.enum) { + return schema.enum.map((v) => `\`"${v}"\``).join(" \\| "); + } + if (schema.type === "array" && schema.items) { + const itemType = schema.items.type || "object"; + return `${itemType}[]`; + } + return schema.type || "any"; +} + +// ============================================================================ +// Build canonical → aliases mapping +// ============================================================================ + +const tools = TOOLS as ToolDef[]; +const canonicalTools = tools.filter(isCanonical); +const aliasMap: Record = {}; + +for (const tool of canonicalTools) { + aliasMap[tool.name] = []; +} + +for (const tool of tools) { + if (isCanonical(tool)) continue; + const ref = getCanonicalRef(tool); + if (ref && aliasMap[ref] !== undefined) { + aliasMap[ref].push(tool.name); + } +} + +// ============================================================================ +// Generate MDX files +// ============================================================================ + +mkdirSync(TOOLS_DIR, { recursive: true }); + +let generated = 0; + +for (const tool of canonicalTools) { + const slug = toSlug(tool.name); + const tier = getTier(tool.name); + const aliases = aliasMap[tool.name] || []; + const description = cleanDescription(tool.description); + const properties = tool.inputSchema.properties || {}; + const required = new Set(tool.inputSchema.required || []); + + const metaDesc = description.split(/\.\s/)[0].replace(/\.$/, "") + "."; + + let mdx = `--- +title: "${tool.name}" +description: "${metaDesc.replace(/"/g, '\\"')}" +--- + +# ${tool.name} + +`; + + // Tier + aliases badge line + const tierLabel = tier.charAt(0).toUpperCase() + tier.slice(1); + const parts = [`**Tier:** ${tierLabel}`]; + if (aliases.length > 0) { + parts.push( + `**Aliases:** ${aliases.map((a) => `\`${a}\``).join(", ")}` + ); + } + mdx += parts.join(" · ") + "\n\n"; + + // Full description + mdx += description + "\n\n"; + + // Parameters table (top-level) + const paramEntries = Object.entries(properties); + if (paramEntries.length > 0) { + mdx += "## Parameters\n\n"; + mdx += "| Parameter | Type | Required | Description |\n"; + mdx += "|-----------|------|----------|-------------|\n"; + + for (const [name, schema] of paramEntries) { + const isReq = required.has(name); + const type = formatType(schema); + const desc = escapeMarkdown(schema.description || ""); + mdx += `| \`${name}\` | ${type} | ${isReq ? "Yes" : "No"} | ${desc} |\n`; + } + mdx += "\n"; + + // Nested object schemas (for array-of-objects params like confirmations, observations) + for (const [name, schema] of paramEntries) { + if ( + schema.type === "array" && + schema.items?.type === "object" && + schema.items.properties + ) { + const nested = schema.items.properties; + const nestedReq = new Set(schema.items.required || []); + + mdx += `### ${name} items\n\n`; + mdx += "| Field | Type | Required | Description |\n"; + mdx += "|-------|------|----------|-------------|\n"; + + for (const [field, fieldSchema] of Object.entries(nested)) { + const type = formatType(fieldSchema as PropertySchema); + const desc = escapeMarkdown( + (fieldSchema as PropertySchema).description || "" + ); + mdx += `| \`${field}\` | ${type} | ${nestedReq.has(field) ? "Yes" : "No"} | ${desc} |\n`; + } + mdx += "\n"; + } + } + } + + const filePath = join(TOOLS_DIR, `${slug}.mdx`); + writeFileSync(filePath, mdx); + generated++; + console.error(` ${slug}.mdx (${tool.name}, ${tier})`); +} + +// ============================================================================ +// Update meta.json +// ============================================================================ + +const slugs = canonicalTools.map((t) => toSlug(t.name)).sort(); +const meta = { + title: "Tools", + pages: ["index", ...slugs], +}; +writeFileSync(join(TOOLS_DIR, "meta.json"), JSON.stringify(meta, null, 2) + "\n"); + +console.error(`\nGenerated ${generated} tool reference pages`); +console.error(`Updated tools/meta.json with ${slugs.length} entries`); diff --git a/apps/docs/source.config.ts b/apps/docs/source.config.ts new file mode 100644 index 0000000..7ca6ea4 --- /dev/null +++ b/apps/docs/source.config.ts @@ -0,0 +1,7 @@ +import { defineDocs, defineConfig } from "fumadocs-mdx/config"; + +export const docs = defineDocs({ + dir: "content/docs", +}); + +export default defineConfig(); diff --git a/apps/docs/tsconfig.json b/apps/docs/tsconfig.json new file mode 100644 index 0000000..12db11e --- /dev/null +++ b/apps/docs/tsconfig.json @@ -0,0 +1,45 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "baseUrl": ".", + "paths": { + "@/*": [ + "./*" + ], + "fumadocs-mdx:collections/*": [ + ".source/*" + ] + } + }, + "include": [ + "**/*.ts", + "**/*.tsx", + ".source/**/*.ts", + "next-env.d.ts", + ".next/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] +}