diff --git a/.github/workflows/ci-python.yml b/.github/workflows/ci-python.yml index 6d730c98..0743bd25 100644 --- a/.github/workflows/ci-python.yml +++ b/.github/workflows/ci-python.yml @@ -82,7 +82,7 @@ jobs: fail-fast: false matrix: include: - - python-version: "3.9" + - python-version: "3.10" dependency-lane: minimum-supermemory supermemory-version: "3.50.0" expected-supermemory-version: "3.50.0" diff --git a/.github/workflows/claude-auto-fix-ci.yml b/.github/workflows/claude-auto-fix-ci.yml index bb1849a0..e84d78c8 100644 --- a/.github/workflows/claude-auto-fix-ci.yml +++ b/.github/workflows/claude-auto-fix-ci.yml @@ -17,7 +17,9 @@ jobs: auto-fix: if: | github.event.workflow_run.conclusion == 'failure' && - github.event.workflow_run.pull_requests[0] + github.event.workflow_run.pull_requests[0] && + github.event.workflow_run.head_repository.full_name == github.event.workflow_run.repository.full_name && + !endsWith(github.event.workflow_run.actor.login, '[bot]') runs-on: ubuntu-latest timeout-minutes: 30 steps: diff --git a/.github/workflows/claude-code-review.yml b/.github/workflows/claude-code-review.yml deleted file mode 100644 index 800b098b..00000000 --- a/.github/workflows/claude-code-review.yml +++ /dev/null @@ -1,121 +0,0 @@ -name: Claude Code Review - -on: - pull_request: - types: [opened, synchronize, ready_for_review, reopened] - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - -jobs: - claude-review: - # Fork PRs run with a read-only token and no secrets/OIDC id-token, so the - # Claude action can never authenticate there and the job always fails. Skip - # it for forks so those PRs report a clean skipped check instead of a red X. - if: | - github.event.pull_request.draft == false && - github.event.pull_request.head.repo.full_name == github.repository && - github.actor != 'graphite-app[bot]' && - github.actor != 'dependabot[bot]' - - runs-on: ubuntu-latest - timeout-minutes: 30 - permissions: - contents: write - pull-requests: write - issues: write - actions: read - id-token: write - - steps: - - name: Checkout repository - uses: actions/checkout@v5 - with: - fetch-depth: 1 - - - name: Run Claude Code Review - uses: anthropics/claude-code-action@v1 - with: - claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} - allowed_bots: "vorflux[bot]" - - # Enable progress tracking - track_progress: true - use_sticky_comment: true - include_fix_links: true - bot_name: Supermemory code review - - # Enable inline comments for specific issues - claude_args: | - --model claude-opus-4-5-20251101 - --allowedTools "Read,Write,Edit,Glob,Grep,Bash(*),WebSearch,WebFetch,Task,mcp__github__*" - - prompt: | - You are a senior engineer reviewing a pull request. Your job is to catch real bugs, security issues, and logic errors that a human reviewer might miss. You are NOT a linter — do not comment on style, naming, formatting, or minor nitpicks. - - REPO: ${{ github.repository }} - PR NUMBER: ${{ github.event.pull_request.number }} - PR TITLE: ${{ github.event.pull_request.title }} - - **REVIEW PHILOSOPHY:** - - Think like a Staff Engineer doing a final review before a deploy to production. Ask yourself: - - "Could this cause a production incident?" - - "Is there a subtle bug hiding here that tests won't catch?" - - "Does this introduce a security vulnerability?" - - "Will this break existing functionality or other parts of the system?" - - If the answer to all of these is "no" for a given line, DO NOT comment on it. Silence is a perfectly good review. A PR with 0 inline comments and a clean summary is ideal when the code is solid. - - **WHAT TO COMMENT ON (only these):** - - Bugs: race conditions, off-by-one errors, null/undefined access, logic errors, wrong operator, missing await, incorrect error handling - - Security: SQL injection, XSS, auth bypass, secrets exposure, insecure defaults, CORS misconfiguration - - Data loss: missing transactions, incorrect cascade deletes, silent data corruption - - Breaking changes: API contract changes, removed fields that clients depend on, changed behavior without migration - - Dependency issues: known CVEs, incompatible version combinations, deprecated APIs that will break - - **WHAT TO NEVER COMMENT ON:** - - Code style, formatting, naming conventions (that's what linters are for) - - "Consider using X instead of Y" unless Y is actually broken - - Missing types/docs/tests (unless the missing test hides a specific bug you found) - - Suggestions that are purely preferential - - Praise or affirmation — no "LGTM" or "nice!" comments - - **WORKFLOW:** - - 1. Use `mcp__github__get_pull_request_diff` to get the full diff - 2. Read the diff carefully. For each changed file, understand the INTENT of the change, not just the syntax - 3. For non-trivial changes, use Read/Grep to look at surrounding code that ISN'T in the diff — bugs often hide at the boundary between changed and unchanged code - 4. Search Supermemory for any relevant past patterns, known issues, or architectural decisions related to the changed code - 5. Check for existing review comments with `mcp__github__get_pull_request_review_comments` to avoid duplicates - 6. Create a pending review with `mcp__github__create_pending_pull_request_review` (event: "COMMENT") - 7. Add inline comments ONLY for issues that meet the bar above. For each comment: - - Explain the actual bug/risk concisely - - Show what could go wrong (e.g., "If X happens, this will Y") - - Provide a concrete fix using a code suggestion block when possible - 8. Submit the review with `mcp__github__submit_pending_pull_request_review` - - **REVIEW SUMMARY FORMAT:** - - Keep the summary short and direct. Format: - - **Overview:** One sentence on what this PR does. - - **Issues found:** List only real issues, or "None — this looks good to ship." if clean. - - **Score: X/10** - - Scoring guide: - - 10/10: No bugs, no security issues, clean logic. This is the COMMON case for competent engineers — don't be stingy. - - 8-9/10: Minor issues that won't cause incidents but should be addressed - - 6-7/10: Real bugs or security concerns that need fixing before merge - - Below 6: Critical issues, data loss risk, or security vulnerabilities - - Most PRs from experienced engineers should score 8-10. Reserve low scores for genuinely problematic code. - - **CRITICAL RESTRICTIONS:** - - DO NOT use `gh pr comment` or `gh api` CLI commands — use MCP tools only - - DO NOT leave more than 5 inline comments. If you find more than 5 issues, pick the 5 most critical ones. - - DO NOT comment on things that are correct but could be "slightly better" - - If the PR is a simple config change, dependency bump, or typo fix, just submit a clean summary with no inline comments diff --git a/.github/workflows/publish-openai-sdk-python.yml b/.github/workflows/publish-openai-sdk-python.yml index e6066bcf..d5232e8d 100644 --- a/.github/workflows/publish-openai-sdk-python.yml +++ b/.github/workflows/publish-openai-sdk-python.yml @@ -23,20 +23,22 @@ jobs: working-directory: ./packages/openai-sdk-python steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false - name: Setup Python - uses: actions/setup-python@v5 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: "3.12" - name: Install build dependencies - run: pip install hatchling build + run: python -m pip install hatchling build - name: Build package run: python -m build - name: Publish to PyPI - uses: pypa/gh-action-pypi-publish@release/v1 + uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2 with: packages-dir: packages/openai-sdk-python/dist/ diff --git a/README.md b/README.md index 17de7dea..e7b92744 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ All of this is in our single memory structure and ontology.

🧑‍💻 I use AI tools

-Give Claude Code, Cursor, Codex and OpenCode **persistent memory across every conversation** with a plugin or the MCP server. +Give Claude Code, Muse Code, Cursor, Codex and OpenCode **persistent memory across every conversation** with a plugin or the MCP server. Your AI remembers your preferences, projects, past discussions — and gets smarter over time. @@ -111,7 +111,7 @@ Plugins and the MCP server give any compatible AI assistant persistent memory. O ### Supermemory Plugins -Supermemory comes built with plugins for Claude Code, Cursor, Codex, OpenCode, OpenClaw, and Hermes. +Supermemory comes built with plugins for Claude Code, Muse Code, Cursor, Codex, OpenCode, OpenClaw, and Hermes. image @@ -120,6 +120,7 @@ These plugins are implementations of the supermemory API, and they are open sour You can find them here: - Claude Code plugin: https://github.com/supermemoryai/claude-supermemory +- Muse Code plugin: https://github.com/supermemoryai/muse-supermemory - Cursor plugin: https://github.com/supermemoryai/cursor-supermemory - Codex plugin: https://github.com/supermemoryai/codex-supermemory - OpenClaw plugin: https://github.com/supermemoryai/openclaw-supermemory diff --git a/apps/docs/.gitignore b/apps/docs/.gitignore index a14702c4..7eb88167 100644 --- a/apps/docs/.gitignore +++ b/apps/docs/.gitignore @@ -1,34 +1,26 @@ -# dependencies (bun install) node_modules -# output out dist *.tgz -# code coverage coverage *.lcov -# logs logs _.log report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json -# dotenv environment variable files .env .env.development.local .env.test.local .env.production.local .env.local -# caches .eslintcache .cache *.tsbuildinfo -# IntelliJ based IDEs .idea -# Finder (MacOS) folder config .DS_Store diff --git a/apps/docs/agents-and-mcp.mdx b/apps/docs/agents-and-mcp.mdx index 4098137f..92e4ed8c 100644 --- a/apps/docs/agents-and-mcp.mdx +++ b/apps/docs/agents-and-mcp.mdx @@ -1,13 +1,13 @@ --- title: "Agents, skills and MCP" -description: "Set up coding agents to integrate Supermemory — CLI, skill, and docs MCP." +description: "Set up coding agents to integrate Supermemory with the CLI, the skill and the docs MCP." sidebarTitle: "Agents, skills and MCP" -icon: "bot" +icon: "/icons/hugeicons/robotic.svg" --- This page is for **building with Supermemory** using coding agents: scaffolding a project, following the real API, and searching product docs. -It is **not** the consumer Memory MCP (give Claude/Cursor long-term memory about *you*). That is a separate product surface — see [Supermemory MCP](/supermemory-mcp/mcp). +This is not the consumer memory MCP that gives Claude or Cursor long-term memory about you. That is a separate product: [Supermemory MCP](/supermemory-mcp/mcp). | Path | How | For | |---|---|---| @@ -52,7 +52,7 @@ npx skills add https://github.com/supermemoryai/skills --skill supermemory Source: [github.com/supermemoryai/skills](https://github.com/supermemoryai/skills). -Best combo for coding agents: **skill** + **docs MCP** + **`npx supermemory setup`**. +For coding agents, use all three together: the skill, the docs MCP and `npx supermemory setup`. ## Docs MCP @@ -186,7 +186,7 @@ You are integrating Supermemory into my app. If the skill is not installed, paste a fuller prompt so the agent asks the right product questions: - + ```` You are integrating Supermemory into my application. Supermemory provides user memory, semantic search, and automatic knowledge extraction for AI applications. @@ -233,16 +233,16 @@ Want your **assistant** to remember you across chats (save/recall/profile in Cla ## Next steps - + Conversation + document ingest, RAG, graph, profile, harness. - + Persistent memory for assistants — separate from docs setup. - + Claude Code, OpenClaw, Codex, Hermes, and more. - + withSupermemory and memory tools in app code. diff --git a/apps/docs/api-reference/connections.mdx b/apps/docs/api-reference/connections.mdx index 47a606cf..d00ca941 100644 --- a/apps/docs/api-reference/connections.mdx +++ b/apps/docs/api-reference/connections.mdx @@ -1,8 +1,8 @@ --- title: "Connections" sidebarTitle: "Overview" -description: "External connectors — create, configure, sync, and manage resources." -icon: "book-open" +description: "Create, configure, sync and manage external connectors." +icon: "/icons/hugeicons/book-open-01.svg" --- Connections pull content from Notion, Google Drive, Gmail, OneDrive, S3, GitHub, and more. diff --git a/apps/docs/api-reference/container-tags.mdx b/apps/docs/api-reference/container-tags.mdx index ce8c6f28..5969f61b 100644 --- a/apps/docs/api-reference/container-tags.mdx +++ b/apps/docs/api-reference/container-tags.mdx @@ -1,8 +1,8 @@ --- title: "Container tags" sidebarTitle: "Overview" -description: "Multi-tenant containers — settings, merge, and delete." -icon: "book-open" +description: "Settings, merge and delete for multi-tenant containers." +icon: "/icons/hugeicons/book-open-01.svg" --- `containerTag` is the primary multi-tenant key (user id, workspace id, etc.). These endpoints manage settings and lifecycle for a tag. diff --git a/apps/docs/api-reference/documents.mdx b/apps/docs/api-reference/documents.mdx index 5f3d0441..3dde4609 100644 --- a/apps/docs/api-reference/documents.mdx +++ b/apps/docs/api-reference/documents.mdx @@ -2,7 +2,7 @@ title: "Documents" sidebarTitle: "Overview" description: "List, get status, update, delete, and inspect ingested documents." -icon: "book-open" +icon: "/icons/hugeicons/book-open-01.svg" --- Documents are the unit of ingestion. Adds return immediately with `status: "queued"`; poll until `done` before relying on search or profiles. diff --git a/apps/docs/api-reference/ingest.mdx b/apps/docs/api-reference/ingest.mdx index 6159cc11..de66584e 100644 --- a/apps/docs/api-reference/ingest.mdx +++ b/apps/docs/api-reference/ingest.mdx @@ -2,7 +2,7 @@ title: "Ingest" sidebarTitle: "Overview" description: "Add documents, files, batches, and conversations to Supermemory." -icon: "book-open" +icon: "/icons/hugeicons/book-open-01.svg" --- Send raw content into the processing pipeline. Supermemory extracts memories, chunks for RAG, and updates profiles asynchronously. diff --git a/apps/docs/api-reference/memories.mdx b/apps/docs/api-reference/memories.mdx index bbe47ff5..94e281d7 100644 --- a/apps/docs/api-reference/memories.mdx +++ b/apps/docs/api-reference/memories.mdx @@ -2,7 +2,7 @@ title: "Memories" sidebarTitle: "Overview" description: "Create, list, update, and forget extracted memory entries (v4)." -icon: "book-open" +icon: "/icons/hugeicons/book-open-01.svg" --- These endpoints operate on **extracted memories**, not raw documents. diff --git a/apps/docs/api-reference/overview.mdx b/apps/docs/api-reference/overview.mdx index 776eb5fc..651ec806 100644 --- a/apps/docs/api-reference/overview.mdx +++ b/apps/docs/api-reference/overview.mdx @@ -1,7 +1,7 @@ --- -title: "API Reference" -description: "Interactive reference for the Supermemory HTTP API — ingest, search, profiles, memories, connectors, and settings." -icon: "unplug" +title: "API reference" +description: "Interactive reference for the Supermemory HTTP API: ingest, search, profiles, memories, connectors and settings." +icon: "/icons/hugeicons/plug-socket.svg" --- This is the **contract-level** reference for Supermemory: methods, paths, parameters, and the playground. diff --git a/apps/docs/api-reference/profiles.mdx b/apps/docs/api-reference/profiles.mdx index 9410bec5..6e185097 100644 --- a/apps/docs/api-reference/profiles.mdx +++ b/apps/docs/api-reference/profiles.mdx @@ -1,8 +1,8 @@ --- title: "Profiles" sidebarTitle: "Profiles overview" -description: "Entity profiles — static and dynamic facts for a container." -icon: "id-card" +description: "Static and dynamic facts about an entity, scoped to a container." +icon: "/icons/hugeicons/id.svg" --- Profiles summarize what Supermemory knows about a user or entity in a `containerTag`. diff --git a/apps/docs/api-reference/search.mdx b/apps/docs/api-reference/search.mdx index 03fb068d..dcd4697c 100644 --- a/apps/docs/api-reference/search.mdx +++ b/apps/docs/api-reference/search.mdx @@ -1,8 +1,8 @@ --- title: "Recall" sidebarTitle: "Overview" -description: "Semantic search over memories, document chunks, or both — plus user profiles." -icon: "book-open" +description: "Semantic search over memories, document chunks or both, plus user profiles." +icon: "/icons/hugeicons/book-open-01.svg" --- Get context back out of Supermemory: search extracted memories / documents, or fetch a user profile. diff --git a/apps/docs/api-reference/settings.mdx b/apps/docs/api-reference/settings.mdx index 6c3308b0..ace06e17 100644 --- a/apps/docs/api-reference/settings.mdx +++ b/apps/docs/api-reference/settings.mdx @@ -2,7 +2,7 @@ title: "Settings" sidebarTitle: "Overview" description: "Organization settings, profile buckets, and data reset." -icon: "book-open" +icon: "/icons/hugeicons/book-open-01.svg" --- Org-level configuration for extraction, customization, and profile buckets. diff --git a/apps/docs/authentication.mdx b/apps/docs/authentication.mdx index d0cf4274..95ae3564 100644 --- a/apps/docs/authentication.mdx +++ b/apps/docs/authentication.mdx @@ -2,10 +2,10 @@ title: "API keys & auth" description: "Org API keys, container-scoped keys, and connector branding." sidebarTitle: "API keys" -icon: "key" +icon: "/icons/hugeicons/key-01.svg" --- -## API Keys +## API keys All API requests require authentication using a Bearer token. Get your API key from the [Developer Platform](https://console.supermemory.ai). @@ -40,7 +40,7 @@ client = Supermemory(api_key="YOUR_API_KEY") --- -## Connector Branding +## Connector branding When users connect external services (Google Drive, Notion, OneDrive), they see a "Log in to **Supermemory**" prompt by default. You can replace this with your own app name by providing your own OAuth credentials via the settings endpoint. diff --git a/apps/docs/concepts/container-tags.mdx b/apps/docs/concepts/container-tags.mdx index 0fa27719..2046bf10 100644 --- a/apps/docs/concepts/container-tags.mdx +++ b/apps/docs/concepts/container-tags.mdx @@ -1,8 +1,8 @@ --- -title: "Container Tags" +title: "Container tags" sidebarTitle: "Container tags" description: "The isolation boundary that groups and partitions memories by user, project, or any logical scope" -icon: "folder" +icon: "/icons/hugeicons/folder-01.svg" --- A **container tag** is the primary way you organize and isolate memories in Supermemory. It's a simple string identifier you attach to content when you add it — and that you pass back when you search, list, or update it. @@ -10,10 +10,10 @@ A **container tag** is the primary way you organize and isolate memories in Supe Think of a container tag as a **namespace**: every memory tagged with `user_alex` lives in its own isolated space, completely separate from memories tagged `user_jordan`. This is what makes Supermemory safe to use in multi-tenant applications — one user can never see another user's memories unless you explicitly query across both tags. - + Bucket memories by user, project, agent, workspace, or any boundary that makes sense for your app. - + Each container tag maps to its own vector namespace, so search and retrieval never leak across boundaries. @@ -167,13 +167,13 @@ Keep tags **deterministic** — derive them directly from IDs you already have ( ## Next steps - + Combine container tags with metadata filters for precise retrieval. - + Mint keys that can only touch one container — multi-tenant clients without the org master key. - + See container tags in action across the add API. diff --git a/apps/docs/concepts/content-types.mdx b/apps/docs/concepts/content-types.mdx index 9aafa528..a9a4a342 100644 --- a/apps/docs/concepts/content-types.mdx +++ b/apps/docs/concepts/content-types.mdx @@ -1,13 +1,13 @@ --- -title: "Supported Content Types" +title: "Supported content types" sidebarTitle: "Multi-modal ingestion" description: "All the content formats Supermemory can ingest and process" -icon: "file-stack" +icon: "/icons/hugeicons/files-01.svg" --- Supermemory automatically extracts and indexes content from various formats. There are two entry points: `client.add()` for text and URLs, `client.documents.uploadFile()` for actual files. See [Add Memories](/ingestion/add-memories) to learn how to ingest content via the API. -## Text Content +## Text content Raw text, conversations, notes, or any string content. @@ -22,7 +22,7 @@ await client.add({ --- -## URLs & Web Pages +## URLs & Web pages Send a URL and Supermemory fetches, extracts, and indexes the content. @@ -55,6 +55,16 @@ await client.documents.uploadFile({ **Extracts:** Text, tables, headers. OCR for scanned documents. +#### Advanced document extraction + +**Scale and Enterprise** include advanced extraction for PDFs: page-by-page OCR with descriptions of figures and diagrams merged into the extracted text. This helps make the visual content in reports, research papers, and technical documents searchable alongside their text. + +**Free, Pro, and Max** continue to support standard PDF extraction, including OCR for scanned documents. The advanced extraction tier applies to PDFs; it does not change support for other file types. + +Use the same `uploadFile` call shown above. Supermemory selects the extraction tier automatically from your organization's plan; no additional request parameter is needed. If advanced extraction cannot process a PDF, Supermemory falls back to standard extraction, so figure and diagram descriptions are not guaranteed for every document. + +See [Billing & usage](/overview/billing#feature-availability) for plan availability. + ### Microsoft Office Word, Excel, and PowerPoint files upload the same way — Supermemory detects the type from the file itself: @@ -76,7 +86,7 @@ Automatically handled via [Google Drive connector](/connectors/google-drive): --- -## Code & Markdown +## Code & markdown Both are plain text, so they go through `add` like any other string content — no file upload needed: @@ -122,7 +132,7 @@ await client.documents.uploadFile({ --- -## Audio & Video +## Audio & video Video has a dedicated `fileType`; audio is uploaded the same way and detected from the file itself: @@ -151,7 +161,7 @@ await client.documents.uploadFile({ --- -## Structured Data +## Structured data JSON and CSV are text — stringify and send them through `add()`, no file upload needed. @@ -177,7 +187,7 @@ await client.add({ --- -## File Upload +## File upload For any binary file, use `uploadFile` — it accepts a stream, not base64: @@ -219,7 +229,7 @@ For files, `uploadFile` detects type from the file itself in most cases. `fileTy --- -## Content Limits +## Content limits | Type | Max Size | |------|----------| @@ -235,13 +245,13 @@ For large files, consider chunking or using [connectors](/connectors/overview) f --- -## Next Steps +## Next steps - + Upload content via the API - + How content is chunked and indexed diff --git a/apps/docs/concepts/customization.mdx b/apps/docs/concepts/customization.mdx index 122433ba..bd2b1cb9 100644 --- a/apps/docs/concepts/customization.mdx +++ b/apps/docs/concepts/customization.mdx @@ -1,13 +1,13 @@ --- -title: "Customizing for Your Use Case" +title: "Customizing for your use case" sidebarTitle: "Customizing" description: "Configure Supermemory's behavior for your specific application" -icon: "settings-2" +icon: "/icons/hugeicons/settings-02.svg" --- Configure how Supermemory processes and retrieves content for your specific use case. -## Filter Prompts +## Filter prompts Tell Supermemory what content matters during ingestion. This helps filter and prioritize what gets indexed. @@ -32,25 +32,25 @@ await client.settings.update({ ``` - + ```typescript filterPrompt: `Personal AI assistant. Prioritize recent content, action items, and personal context. Exclude spam and duplicates.` ``` - + ```typescript filterPrompt: `Customer support agent. Prioritize verified solutions, official docs, and resolved tickets. Exclude internal discussions and PII.` ``` - + ```typescript filterPrompt: `Legal research assistant. Prioritize precedents, current regulations, and approved contract language. Exclude privileged communications.` ``` - + ```typescript filterPrompt: `Financial analysis assistant. Prioritize latest reports, verified data, and regulatory filings. Exclude speculative data and MNPI.` @@ -62,7 +62,7 @@ await client.settings.update({ and FDA-approved info. Exclude PHI and outdated recommendations.` ``` - + ```typescript filterPrompt: `Developer documentation assistant. Prioritize current APIs, working examples, and best practices. Exclude deprecated APIs and test fixtures.` @@ -82,7 +82,7 @@ await client.settings.update({ --- -## Entity Context +## Entity context Guide memory extraction for a specific container tag. Filter prompts are org-wide; entity context is per container. @@ -112,7 +112,7 @@ Entity context persists on the container tag and combines with org-level filter --- -## Chunk Size +## Chunk size Control how documents are split into searchable pieces. Smaller chunks = more precise retrieval but less context per result. @@ -135,7 +135,7 @@ Smaller chunks generate more memories per document. Larger chunks provide more c --- -## Connector Branding +## Connector branding Show "Log in to **YourApp**" instead of "Log in to Supermemory" when users connect external services. See [Connectors Overview](/connectors/overview) for the full list of supported integrations. @@ -180,7 +180,7 @@ Show "Log in to **YourApp**" instead of "Log in to Supermemory" when users conne --- -## API Reference +## API reference ```typescript // Get current settings @@ -200,13 +200,13 @@ Settings are organization-wide. Changes apply to new content only—existing mem --- -## Next Steps +## Next steps - + See your custom settings in action - + Set up automatic syncing from external platforms diff --git a/apps/docs/concepts/filtering.mdx b/apps/docs/concepts/filtering.mdx index cb158583..149bdd8c 100644 --- a/apps/docs/concepts/filtering.mdx +++ b/apps/docs/concepts/filtering.mdx @@ -1,17 +1,17 @@ --- -title: "Organizing & Filtering Memories" +title: "Organizing & filtering memories" sidebarTitle: "Metadata filtering" description: "Use container tags and metadata to organize and retrieve memories" -icon: "filter" +icon: "/icons/hugeicons/filter.svg" --- Supermemory provides two ways to organize your memories: - + **Organize memories** into isolated spaces by user, project, or workspace - + **Query memories** by custom properties like category, status, or date @@ -20,11 +20,11 @@ Both can be used independently or together for precise filtering. --- -## Container Tags +## Container tags Container tags create isolated memory spaces. Use them to separate memories by user, project, or any logical boundary. -### Adding Memories with Tags +### Adding memories with tags ```typescript await client.add({ @@ -33,7 +33,7 @@ await client.add({ }); ``` -### Searching with Tags +### Searching with tags ```typescript const results = await client.search({ @@ -47,7 +47,7 @@ const results = await client.search({ Each search is scoped to a single container tag. Passing `containerTag: "user_123"` restricts results to memories stored in that container. -### Recommended Patterns +### Recommended patterns | Pattern | Example | Use Case | |---------|---------|----------| @@ -56,7 +56,7 @@ Each search is scoped to a single container tag. Passing `containerTag: "user_12 | Hierarchical | `org_{orgId}_team_{teamId}` | Multi-level organization | - + ```typescript // Multi-tenant SaaS - isolate by organization and user await client.add({ @@ -98,7 +98,7 @@ Each search is scoped to a single container tag. Passing `containerTag: "user_12 Metadata lets you attach custom properties to memories and filter by them later. -### Adding Memories with Metadata +### Adding memories with metadata ```typescript await client.add({ @@ -112,7 +112,7 @@ await client.add({ }); ``` -### Searching with Metadata Filters +### Searching with metadata filters Filters must be wrapped in `AND` or `OR` arrays: @@ -130,7 +130,7 @@ const results = await client.search({ }); ``` -### Filter Types +### Filter types | Type | Example | Description | |------|---------|-------------| @@ -139,7 +139,7 @@ const results = await client.search({ | Numeric | `{ filterType: "numeric", key: "priority", value: "5", numericOperator: ">=" }` | Number comparison | | Array contains | `{ filterType: "array_contains", key: "tags", value: "important" }` | Check array membership | -### Combining Filters +### Combining filters Use `AND` and `OR` for complex queries: @@ -161,7 +161,7 @@ const results = await client.search({ }); ``` -### Excluding Results +### Excluding results Use `negate: true` to exclude matches: @@ -178,7 +178,7 @@ const results = await client.search({ ``` - + **String contains (substring search):** ```typescript // Find documents with "machine learning" in the description @@ -270,7 +270,7 @@ const results = await client.search({ - `=` becomes `!=` - + **User's work documents from 2024:** ```typescript const results = await client.search({ @@ -326,9 +326,9 @@ const results = await client.search({ --- -## Quick Reference +## Quick reference -### When Adding Memories +### When adding memories ```typescript await client.add({ @@ -338,7 +338,7 @@ await client.add({ }); ``` -### When Searching +### When searching ```typescript const results = await client.search({ @@ -351,13 +351,13 @@ const results = await client.search({ }); ``` -### Metadata Key Rules +### Metadata key rules - Allowed characters: `a-z`, `A-Z`, `0-9`, `_`, `-`, `.` - Max length: 64 characters - No spaces or special characters -### Query Complexity Limits +### Query complexity limits - Maximum 200 conditions per query - Maximum 8 levels of nested `AND`/`OR` expressions @@ -366,7 +366,7 @@ const results = await client.search({ If you need more conditions than these limits allow, break your query into multiple requests or use broader search terms with post-processing. -### Searching Within a Document +### Searching within a document Use `docId` to scope a search to chunks within one large document — useful for books, podcasts, or other long-form content: @@ -379,13 +379,13 @@ const results = await client.search({ --- -## Next Steps +## Next steps - + Apply filters in search queries - + Add content with container tags and metadata diff --git a/apps/docs/concepts/graph-memory.mdx b/apps/docs/concepts/graph-memory.mdx index d92249ee..eced5485 100644 --- a/apps/docs/concepts/graph-memory.mdx +++ b/apps/docs/concepts/graph-memory.mdx @@ -1,8 +1,8 @@ --- title: "Graph memory" sidebarTitle: "Graph memory" -description: "How facts connect, update, and stay true — memory relationships, temporal truth, and automatic forgetting." -icon: "vector-square" +description: "How facts connect, update and stay true: relationships, temporal truth and automatic forgetting." +icon: "/icons/hugeicons/share-08.svg" --- **How understanding is stored and stays true over time.** @@ -174,16 +174,16 @@ const results = await client.search({ | API: add / search / forget | [Ingestion](/ingestion/add-memories) · [Search](/recall/search) · [Forget & update](/recall/memory-operations) | - + Ingest pipeline, statuses, and outputs. - + When to use memory vs document retrieval. - + Static + dynamic context built from the graph. - + See entity chains in a full conversation + document flow. diff --git a/apps/docs/concepts/how-it-works.mdx b/apps/docs/concepts/how-it-works.mdx index 39bb9328..01f2005c 100644 --- a/apps/docs/concepts/how-it-works.mdx +++ b/apps/docs/concepts/how-it-works.mdx @@ -1,17 +1,17 @@ --- -title: "How Supermemory Works" +title: "How Supermemory works" sidebarTitle: "How it works" -description: "From a file or chat turn to something you can search — the ingest pipeline, statuses, and outputs." -icon: "cpu" +description: "How a file or chat turn becomes something you can search: the ingest pipeline, statuses and outputs." +icon: "/icons/hugeicons/cpu.svg" --- -At it's core, supermemory is powered by a custom learning model and a graph database that we built internally. +At its core, supermemory is powered by a custom learning model and a graph database that we built internally. Decides what and how to learn, what is important, when to forget, creating relations, etc. - + Where the learnings are actually stored, optimized for search. Fact-based temporal graph that has Vector, FTS, and graph built in. @@ -21,20 +21,17 @@ But, you don't have to think about the above. The interface for users is as simp ## Get started in under a minute - + From the [developer console](https://console.supermemory.ai) — **API Keys → Create API Key**. `console.supermemory.ai` is where keys and usage live. - + Install the SDK, drop in your key, add a memory, and search it — right below, or the full [ingest → retrieve loop](/using-supermemory). -```bash TypeScript -npm install supermemory -``` - ```typescript TypeScript +// npm install supermemory import Supermemory from "supermemory"; const client = new Supermemory({ apiKey: "sm_..." }); // from console.supermemory.ai → API Keys @@ -48,6 +45,7 @@ const { results } = await client.search({ ``` ```python Python +# pip install supermemory from supermemory import Supermemory client = Supermemory(api_key="sm_...") # from console.supermemory.ai → API Keys @@ -113,7 +111,7 @@ Larger PDFs and long video take longer. Short chat turns usually finish in secon ## Dreaming (how memories enter the graph) -Document **status `done`** means chunks are indexed for search. **Memories** — the graph facts, updates, and derives — come from a second phase called **dreaming**. +A document with status `done` has its chunks indexed for search. Memories (the graph's facts, updates and derived facts) come from a second phase called **dreaming**. This is when the content is passed through the memory model and merged, arranged and organized for the future. @@ -122,7 +120,7 @@ Pass `dreaming` on [add](/ingestion/add-memories): | Mode | Default? | Behavior | When to use | | --- | --- | --- | --- | | **`dynamic`** | Yes | Related documents are grouped so memories form from **coherent units**, not one isolated write at a time. Graph quality is higher for real multi-turn / multi-doc flows. Memory extraction may continue **after** `status: "done"`. | Production agents, connectors, ongoing sessions | -| **`instant`** | No | This document is dreamed **on its own, right away**. Memories are available as soon as processing finishes for that doc. Bills **one extra [operation](/overview/billing)** per document. | Demos, quickstarts, “I need the graph now” | +| **`instant`** | No | This document is dreamed on its own, right away. Memories are available as soon as processing finishes for that document. Bills one extra [operation](/overview/billing) per document. | Demos, quickstarts, “I need the graph now” | ```typescript // Production default — omit or set explicitly @@ -142,7 +140,7 @@ await client.add({ }); ``` -**Rule of thumb:** prefer **`dynamic`** for quality and cost in real apps, use **`instant`** when the next step is a memory search or profile that must reflect this document immediately (as in the [quickstart](/quickstart)). Keeping it dynamic helps it pair better with other memories and better connections, inferences to be made. +**Rule of thumb:** use `dynamic` in real apps for better quality and cost, because batching lets new memories connect to related ones. Use `instant` when the very next step is a memory search or profile that must already reflect this document, as in the [quickstart](/quickstart). How those memories connect and stay true over time is [Graph memory](/concepts/graph-memory). API detail: [Processing modes](/ingestion/add-memories#processing-modes). @@ -156,27 +154,27 @@ After the pipeline runs, the same document leads to three things -> Chunks, Memo | **Memories** | Extracted facts in a living graph — updates, links, time | [Graph memory](/concepts/graph-memory) | | **Profile** | A sample of memories, static + dynamic summary for always-on context | [Profiles](/concepts/user-profiles), [Profile API](/recall/user-profiles) | -Supermemory does **not** only store the file. It derives **memories** (understanding) and keeps **chunks** (the source) so you can personalize *and* ground. That distinction is the core of [Memory vs RAG](/concepts/memory-vs-rag). +Supermemory does more than store the file. It derives memories (what it understood) and keeps chunks (the source), so you can both personalize and ground answers. That distinction is the core of [Memory vs RAG](/concepts/memory-vs-rag). ## Isolation and identity - **`containerTag`** — hard isolation boundary (user, tenant, project). See [Container tags](/concepts/container-tags). -- **Metadata** — soft dimensions *inside* a tag for filtering. See [Metadata filtering](/concepts/filtering). +- **Metadata**: extra dimensions inside a tag that you can filter on. See [metadata filtering](/concepts/filtering). - **Scoped API keys** — credentials that cannot cross a container. See [API keys](/authentication#scoped-api-keys). ## Next steps - + How facts connect, update, and stay true over time. - + Formats, extractors, and what you can send. - + API: add, customId, files, dreaming, status. - + Query documents and memories after the pipeline finishes. diff --git a/apps/docs/concepts/memory-vs-rag.mdx b/apps/docs/concepts/memory-vs-rag.mdx index 2ef9ea08..c3b3af2b 100644 --- a/apps/docs/concepts/memory-vs-rag.mdx +++ b/apps/docs/concepts/memory-vs-rag.mdx @@ -1,23 +1,23 @@ --- -title: "Memory vs RAG: Understanding the Difference" +title: "Memory vs RAG: Understanding the difference" description: "Learn why agent memory and RAG are fundamentally different, and when to use each approach" sidebarTitle: "Memory vs RAG" -icon: "scale" +icon: "/icons/hugeicons/balance-scale.svg" --- Most developers confuse RAG (Retrieval-Augmented Generation) with agent memory. They're not the same thing, and using RAG for memory is why your agents keep forgetting important context. Let's understand the fundamental difference. -## The Core Problem +## The core problem When building AI agents, developers often treat memory as just another retrieval problem. They store conversations in a vector database, embed queries, and hope semantic search will surface the right context. **This approach fails because memory isn't about finding similar text—it's about understanding relationships, temporal context, and user state over time.** -## Documents vs Memories in Supermemory +## Documents vs memories in Supermemory Supermemory makes a clear distinction between these two concepts: -### Documents: Raw Knowledge +### Documents: Raw knowledge Documents are the raw content you send to Supermemory—PDFs, web pages, text files. They represent static knowledge that doesn't change based on who's accessing it. **Characteristics:** @@ -32,7 +32,7 @@ Documents are the raw content you send to Supermemory—PDFs, web pages, text fi - Research papers - General reference material -### Memories: Contextual Understanding +### Memories: Contextual understanding Memories are the insights, preferences, and relationships extracted from documents and conversations. They're tied to specific users or entities and evolve over time. **Characteristics:** @@ -47,12 +47,12 @@ Memories are the insights, preferences, and relationships extracted from documen - Personal facts and relationships - Behavioral patterns -## Why RAG Fails as Memory +## Why RAG fails as memory Let's look at a real scenario that illustrates the problem: - + ``` Day 1: "I love Adidas sneakers" Day 30: "My Adidas broke after a month, terrible quality" @@ -61,7 +61,7 @@ Let's look at a real scenario that illustrates the problem: ``` - + ```python # RAG sees these as isolated embeddings query = "What sneakers should I buy?" @@ -76,7 +76,7 @@ Let's look at a real scenario that illustrates the problem: **Problem**: RAG finds the most semantically similar text but misses the temporal progression and causal relationships. - + ```python # Supermemory understands temporal context query = "What sneakers should I buy?" @@ -93,16 +93,16 @@ Let's look at a real scenario that illustrates the problem: -## The Technical Difference +## The technical difference -### RAG: Semantic Similarity +### RAG: Semantic similarity ``` Query → Embedding → Vector Search → Top-K Results → LLM ``` RAG excels at finding information that's semantically similar to your query. It's stateless—each query is independent. -### Memory: Contextual Graph +### Memory: Contextual graph ``` Query → Entity Recognition → Graph Traversal → Temporal Filtering → Context Assembly → LLM ``` @@ -113,10 +113,10 @@ Memory systems build a knowledge graph that understands: - **Temporal Context**: When facts were true - **Invalidation**: When facts became outdated -## When to Use Each +## When to use each - + - Static documentation - Knowledge bases - Research queries @@ -124,7 +124,7 @@ Memory systems build a knowledge graph that understands: - Content that doesn't change per user - + - User preferences - Conversation history - Personal facts @@ -133,12 +133,12 @@ Memory systems build a knowledge graph that understands: -## Real-World Examples +## Real-world examples -### E-commerce Assistant +### E-commerce assistant - + Stores product catalogs, specifications, reviews ```python @@ -149,7 +149,7 @@ Memory systems build a knowledge graph that understands: ``` - + Tracks user preferences, purchase history, interactions ```python @@ -161,10 +161,10 @@ Memory systems build a knowledge graph that understands: -### Customer Support Bot +### Customer support bot - + FAQ documents, troubleshooting guides, policies ```python @@ -175,7 +175,7 @@ Memory systems build a knowledge graph that understands: ``` - + Previous issues, user account details, conversation context ```python @@ -187,11 +187,11 @@ Memory systems build a knowledge graph that understands: -## How Supermemory Handles Both +## How Supermemory handles both Supermemory provides a unified platform that correctly handles both patterns: -### 1. Document Storage (RAG) +### 1. Document storage (RAG) ```python # Add a document for RAG-style retrieval client.add( @@ -200,7 +200,7 @@ client.add( ) ``` -### 2. Memory Creation +### 2. Memory creation ```python # Add a user-specific memory client.add( @@ -213,7 +213,7 @@ client.add( ) ``` -### 3. Hybrid Retrieval +### 3. Hybrid retrieval ```python # Search combines both approaches results = client.search.memories( @@ -227,7 +227,7 @@ results = client.search.memories( # - Latest Android phone specs (documents) ``` -## The Bottom Line +## The bottom line **Key Insight**: RAG answers "What do I know?" while Memory answers "What do I remember about you?" @@ -241,19 +241,19 @@ Supermemory provides both capabilities in a unified platform, ensuring your agen --- -## Next Steps +## Next steps - + How memory relationships work - + Our managed RAG solution - + Start ingesting content - + Query your memories and documents diff --git a/apps/docs/concepts/multi-tenancy-examples.mdx b/apps/docs/concepts/multi-tenancy-examples.mdx index 86074ed0..62ba38b1 100644 --- a/apps/docs/concepts/multi-tenancy-examples.mdx +++ b/apps/docs/concepts/multi-tenancy-examples.mdx @@ -1,8 +1,8 @@ --- -title: "Multi-tenancy Examples" +title: "Multi-tenancy examples" sidebarTitle: "Examples" description: "Common container tag and metadata patterns for personal agents, company agents, email assistants, and support platforms" -icon: "list-checks" +icon: "/icons/hugeicons/check-list.svg" --- A few common shapes multi-tenancy takes in practice, combining [container tags](/concepts/container-tags) for isolation with [metadata filters](/concepts/filtering) for organization within a boundary. @@ -122,13 +122,13 @@ const results = await client.search({ ## Next steps - + Why container tags and metadata are separate mechanisms. - + How isolation works, naming rules, and access control. - + Metadata filter types, combining `AND`/`OR`, and query limits. diff --git a/apps/docs/concepts/multi-tenancy.mdx b/apps/docs/concepts/multi-tenancy.mdx index 9d6a9e04..03f07b25 100644 --- a/apps/docs/concepts/multi-tenancy.mdx +++ b/apps/docs/concepts/multi-tenancy.mdx @@ -1,8 +1,8 @@ --- -title: "Multi-tenancy Overview" +title: "Multi-tenancy overview" sidebarTitle: "Overview" description: "How Supermemory isolates and organizes memories across users, tenants, and projects" -icon: "users" +icon: "/icons/hugeicons/user-multiple.svg" --- Most apps built on Supermemory serve more than one user, customer, or tenant out of a single Supermemory organization. Multi-tenancy is how you keep those memories apart — so User A's data is never visible to User B, and so you can still slice and query within a user's own data by things like category, status, or date. @@ -10,10 +10,10 @@ Most apps built on Supermemory serve more than one user, customer, or tenant out Supermemory gives you two complementary tools for this: - + **Isolation.** A container tag is a hard boundary — its own namespace. Memories in one tag are never returned by a search scoped to another tag. - + **Organization.** Metadata is a set of custom key/value properties on a memory that you filter by — category, priority, date, participants, anything you define. @@ -99,16 +99,16 @@ Container tags aren't just organizational — they're enforced as an authorizati ## Next steps - + Personal agents, company agents, email assistants, and support platforms. - + How isolation works, naming rules, and access control. - + Metadata filter types, combining `AND`/`OR`, and query limits. - + Mint keys that can only touch one container tag. diff --git a/apps/docs/concepts/rules.mdx b/apps/docs/concepts/rules.mdx index 735c9227..1464068b 100644 --- a/apps/docs/concepts/rules.mdx +++ b/apps/docs/concepts/rules.mdx @@ -2,7 +2,7 @@ title: "Rules of supermemory" description: "Best practices and things to consider when using supermemory in your system" sidebarTitle: "Rules of supermemory" -icon: "gavel" +icon: "/icons/hugeicons/justice-scale-01.svg" --- Supermemory provides powerful primitives and the full context stack for building AI agents. This page collects rules of thumb from building and running supermemory in production. They aren't hard constraints, just shortcuts that save you time, cost, and confusing search results. @@ -30,7 +30,7 @@ Agents benefit most from having a _general_ idea of the topic alongside tools to Two things about this table that trip people up. -**"Remember" and "look up" are both supermemory, but different reads.** You [ingest documents](/ingestion/add-memories); the pipeline derives memories from them and maintains a profile per [container tag](/concepts/how-it-works). `client.search({ searchMode: "memories" })` recalls the derived facts. `client.search({ searchMode: "documents" })` recalls the source material itself. A support agent usually needs both: memories for "this customer runs self-hosted and already tried reinstalling", documents for the actual troubleshooting guide. +**"Remember" and "look up" are both supermemory, but different reads.** You [ingest documents](/ingestion/add-memories); the pipeline derives memories from them and maintains a profile per container tag. `client.search({ searchMode: "memories" })` recalls the derived facts. `client.search({ searchMode: "documents" })` recalls the source material itself. A support agent usually needs both: memories for "this customer runs self-hosted and already tried reinstalling", documents for the actual troubleshooting guide. **Supermemory is not your system of record.** There's no SQL over memories, no joins, no aggregates, no querying by primary key. Keep transactional data in your database, and ingest the narrative *around* it ("the customer disputed invoice #4821 and churned over it") so your AI understands what the rows mean. diff --git a/apps/docs/concepts/super-rag.mdx b/apps/docs/concepts/super-rag.mdx index f4de2789..9e3eccaa 100644 --- a/apps/docs/concepts/super-rag.mdx +++ b/apps/docs/concepts/super-rag.mdx @@ -1,13 +1,13 @@ --- -title: "SuperRAG (Managed RAG as a service)" +title: "SuperRAG (managed RAG as a service)" sidebarTitle: "SuperRAG" description: "Supermemory provides a managed RAG solution - extraction, indexing, storing, and retrieval." -icon: "bolt" +icon: "/icons/hugeicons/flash.svg" --- Supermemory doesn't just store your content—it transforms it into optimized, searchable knowledge. Every upload goes through an intelligent pipeline that extracts, chunks, and indexes content in the ideal way for its type. -## Automatic Content Intelligence +## Automatic content intelligence When you add content, Supermemory: @@ -86,7 +86,7 @@ When you're searching over a mix of both, `searchMode: "hybrid"` (below) is what --- -## Smart Chunking by Content Type +## Smart chunking by content type Different content types need different chunking strategies. Supermemory applies the optimal approach automatically: @@ -121,7 +121,7 @@ Code is chunked using [code-chunk](https://github.com/supermemoryai/code-chunk), This means searching for "authentication middleware" finds the actual function, not a random slice of code. -### Web Pages +### Web pages URLs are fetched, cleaned of navigation/ads, and chunked by article structure — headings, paragraphs, lists. @@ -133,18 +133,18 @@ See [Content Types](/concepts/content-types) for the full list of supported form --- -## Hybrid Memory + RAG +## Hybrid memory + RAG Supermemory combines the best of both approaches in every search: - + - Finds similar document chunks - Great for knowledge retrieval - Stateless — same results for everyone - + - Extracts and tracks user facts - Understands temporal context - Personalizes results per user @@ -168,7 +168,7 @@ const results = await client.search({ --- -## Search Optimization +## Search optimization Two flags give you fine-grained control over result quality: @@ -185,7 +185,7 @@ const results = await client.search({ **When to use:** Complex queries, technical documentation, when precision matters more than speed. -### Query Rewriting +### Query rewriting Expands your query to capture more relevant results: @@ -200,7 +200,7 @@ const results = await client.search({ --- -## Why It's "Super" +## Why it's "Super" | Traditional RAG | SUPER RAG | |-----------------|-----------| @@ -214,25 +214,25 @@ You focus on building your product. Supermemory handles the RAG complexity. --- -## Next Steps +## Next steps - + All supported formats and how they're processed - + The full processing pipeline - + When to use each approach - + Search parameters and optimization - + Exact meter rates for memory vs SuperRAG tokens - + `taskType` and other ingestion parameters diff --git a/apps/docs/concepts/user-profiles.mdx b/apps/docs/concepts/user-profiles.mdx index 4be4f8b9..980f054a 100644 --- a/apps/docs/concepts/user-profiles.mdx +++ b/apps/docs/concepts/user-profiles.mdx @@ -1,8 +1,8 @@ --- -title: "User Profiles" +title: "User profiles" sidebarTitle: "Profiles" description: "Automatically maintained context about your users" -icon: "circle-user" +icon: "/icons/hugeicons/user-circle.svg" --- User profiles are **automatically maintained collections of facts about your users** that Supermemory builds from all their interactions. Think of it as a persistent "about me" document that's always up-to-date. @@ -12,10 +12,10 @@ Each `containerTag` gets it's own profile. > Note: It's called "user" profile, but in reality it can be anything - an agent, organization, etc. - + No search needed — comprehensive user info always ready - + Profiles update as users interact with your system @@ -70,11 +70,11 @@ This is the general pattern: names, pronouns, timezone, tone/format preferences, --- -## Static vs Dynamic +## Static vs dynamic Profiles separate two types of information: -### Static Profile +### Static profile Long-term, stable facts: @@ -82,7 +82,7 @@ Long-term, stable facts: - "Sarah specializes in distributed systems" - "Sarah prefers technical docs over video tutorials" -### Dynamic Profile +### Dynamic profile Recent context and temporary states: @@ -111,13 +111,13 @@ console.log(profile.buckets.goals); Bucket descriptions steer the classifier, so a precise description ("explicit first-person preferences only, exclude inferred traits") produces cleaner buckets than a vague one. Buckets are separate from [`filterPrompt`](/concepts/customization), which controls what gets ingested at all — buckets only organize facts that already made it into the profile. - + Request bucketed profiles, create buckets at the org or space level, get AI-generated suggestions, and see validation limits. --- -## How It Works +## How it works Profiles are built automatically through ingestion: @@ -132,7 +132,7 @@ You don't manually manage profiles — they build themselves as users interact. --- -## Profiles + Search +## Profiles + search Profiles don't replace search — they complement it: @@ -153,7 +153,7 @@ User asks: **"Can you help me debug this?"** --- -## Filtering Profiles +## Filtering profiles Not many people realize this, but profiles support the same [metadata filtering](/concepts/filtering) as memory and document search. A profile is synthesized from the underlying memories in a container tag, so any `AND`/`OR` metadata filter you'd pass to `search` also narrows which memories are eligible to contribute to `static`, `dynamic`, and `buckets`. @@ -183,9 +183,9 @@ Filters apply on top of the search query too — combine `q` and `filters` to sc --- -## Use Cases +## Use cases -### Personalized AI Assistants +### Personalized AI assistants Profiles provide: expertise level, communication preferences, tools used, current projects. @@ -198,7 +198,7 @@ Current focus: ${profile.dynamic.join('\n')} Adjust responses to their expertise and preferences.`; ``` -### Customer Support +### Customer support Profiles provide: product usage, previous issues, tech proficiency. @@ -206,32 +206,32 @@ Profiles provide: product usage, previous issues, tech proficiency. - Agents immediately understand context - AI support references past interactions naturally -### Educational Platforms +### Educational platforms Profiles provide: learning style, completed courses, strengths/weaknesses. -### Development Tools +### Development tools Profiles provide: preferred languages, coding style, current project context. --- -## Next Steps +## Next steps - + Fetch and use profiles via the API - + Create and configure topical buckets - + How the underlying knowledge graph works - + Automatic profile injection with AI SDK - + Build profiles by adding content diff --git a/apps/docs/connectors/github.mdx b/apps/docs/connectors/github.mdx index e3a9fb63..4a227b77 100644 --- a/apps/docs/connectors/github.mdx +++ b/apps/docs/connectors/github.mdx @@ -1,5 +1,6 @@ --- -title: "GitHub Connector" +title: "GitHub connector" +sidebarTitle: "GitHub" description: "Connect GitHub repositories to sync documentation files into your Supermemory knowledge base" icon: "/images/github-icon.svg" --- @@ -10,9 +11,9 @@ Connect GitHub repositories to sync documentation files into your Supermemory kn The GitHub connector requires a **Scale Plan** or **Enterprise Plan**. -## Quick Setup +## Quick setup -### 1. Create GitHub Connection +### 1. Create GitHub connection @@ -86,11 +87,11 @@ The GitHub connector requires a **Scale Plan** or **Enterprise Plan**. - `admin:repo_hook` - Manage webhooks for incremental sync -### 2. Handle OAuth Callback +### 2. Handle OAuth callback After the user grants permissions, GitHub redirects to your callback URL. The connection is automatically established, and the user can now select which repositories to sync. -### 3. List and Configure Repositories +### 3. List and configure repositories Unlike other connectors, GitHub requires repository selection before syncing begins. This gives your users control over which repositories to index. @@ -202,7 +203,7 @@ Supermemory provides the API endpoints to list and configure repositories. As a This gives you complete control over the user experience and allows you to integrate repository selection seamlessly into your application's workflow. -## Supported Document Types +## Supported document types The GitHub connector syncs documentation and text files with the following extensions: @@ -218,7 +219,7 @@ Files are indexed as `github_markdown` document type in Supermemory. Only text-based documentation files are synced. Binary files, images, and code files (`.js`, `.py`, `.go`, etc.) are excluded by default to focus on searchable documentation content. -## Incremental Sync with Webhooks +## Incremental sync with webhooks The GitHub connector automatically sets up webhooks for real-time incremental syncing. When files are pushed or deleted in configured repositories, Supermemory is notified immediately. @@ -226,14 +227,14 @@ The GitHub connector automatically sets up webhooks for real-time incremental sy **Batch Processing:** Webhook events are processed in batches with a 10-minute delay to optimize performance and prevent excessive syncing during rapid commits. This means changes pushed to your repository will be reflected in Supermemory within approximately 10 minutes. -### How It Works +### How it works 1. **Webhook Setup**: When you configure repositories, a webhook is automatically installed in each repository 2. **Push Events**: When commits are pushed to the default branch, changed documentation files are synced 3. **Delete Events**: When documentation files are deleted, they're removed from your Supermemory knowledge base 4. **Incremental Updates**: Only changed files are processed, keeping sync fast and efficient -### Webhook Security +### Webhook security Webhooks are secured using HMAC-SHA256 signature validation with constant-time comparison. Supermemory automatically validates that webhook events come from GitHub before processing them. Each repository gets a unique webhook secret for maximum security. @@ -269,9 +270,9 @@ Webhooks are secured using HMAC-SHA256 signature validation with constant-time c -## Connection Management +## Connection management -### List All Connections +### List all connections @@ -325,7 +326,7 @@ Webhooks are secured using HMAC-SHA256 signature validation with constant-time c -### Update Repository Configuration +### Update repository configuration You can update which repositories are synced at any time: @@ -404,7 +405,7 @@ When you update the repository configuration: - Existing documents from removed repositories remain in Supermemory unless you delete them manually -### Delete Connection +### Delete connection @@ -451,7 +452,7 @@ Deleting a GitHub connection will: - **Permanently delete all synced documents** from your Supermemory knowledge base (unless you pass `deleteDocuments=false` as a query parameter to keep them) -### Manual Sync +### Manual sync Trigger a manual synchronization for all configured repositories: @@ -502,9 +503,9 @@ Trigger a manual synchronization for all configured repositories: -## Advanced Configuration +## Advanced configuration -### Custom OAuth Application +### Custom OAuth application For white-label deployments or custom branding, configure your own GitHub OAuth app using the settings API: diff --git a/apps/docs/connectors/gmail.mdx b/apps/docs/connectors/gmail.mdx index 73e5063e..64ef15af 100644 --- a/apps/docs/connectors/gmail.mdx +++ b/apps/docs/connectors/gmail.mdx @@ -1,7 +1,8 @@ --- -title: "Gmail Connector" +title: "Gmail connector" +sidebarTitle: "Gmail" description: "Sync email threads from Gmail with real-time Pub/Sub webhooks and incremental sync" -icon: "mail" +icon: "/icons/hugeicons/mail-01.svg" --- Connect Gmail to automatically sync email threads into your supermemory knowledge base. Supports real-time updates via Google Cloud Pub/Sub webhooks and incremental synchronization. @@ -10,9 +11,9 @@ Connect Gmail to automatically sync email threads into your supermemory knowledg **Max Plan Required:** The Gmail connector is available on Max plan and above. -## Quick Setup +## Quick setup -### 1. Create Gmail Connection +### 1. Create Gmail connection @@ -79,11 +80,11 @@ Connect Gmail to automatically sync email threads into your supermemory knowledg -### 2. Handle OAuth Callback +### 2. Handle OAuth callback After user grants permissions, Google redirects to your callback URL. The connection is automatically established and the initial sync begins. -### 3. Check Connection Status +### 3. Check connection status @@ -146,9 +147,9 @@ After user grants permissions, Google redirects to your callback URL. The connec -## What Gets Synced +## What gets synced -### Email Threads +### Email threads Gmail threads (conversations) are synced as individual documents with all messages included: @@ -158,7 +159,7 @@ Gmail threads (conversations) are synced as individual documents with all messag - **HTML content** converted to clean markdown - **Attachment metadata**: filename, mime type, size (attachments are referenced, not stored) -### Document Metadata +### Document metadata Each synced thread includes searchable metadata: @@ -190,9 +191,9 @@ const results = await client.search({ }); ``` -## Connection Management +## Connection management -### List All Connections +### List all connections @@ -241,7 +242,7 @@ const results = await client.search({ -### Delete Connection +### Delete connection @@ -295,7 +296,7 @@ Deleting a connection will: - Keep existing synced documents in supermemory (they won't be deleted) -### Manual Sync +### Manual sync Trigger a manual synchronization: @@ -344,7 +345,7 @@ Trigger a manual synchronization: -## Sync Mechanism +## Sync mechanism Gmail connector supports multiple sync methods: @@ -355,7 +356,7 @@ Gmail connector supports multiple sync methods: | **Manual sync** | On-demand via API | | **Incremental sync** | Uses Gmail `historyId` to fetch only changed threads | -### How Real-time Sync Works +### How real-time sync works 1. When a connection is created, supermemory registers a Gmail API "watch" subscription 2. Gmail sends notifications to a Google Cloud Pub/Sub topic when emails change @@ -366,7 +367,7 @@ Gmail connector supports multiple sync methods: Real-time sync monitors the **INBOX** label. Emails in other labels are synced via scheduled/manual sync. -## Permissions & Scopes +## Permissions & scopes The Gmail connector requests the following OAuth scopes: @@ -383,7 +384,7 @@ The Gmail connector requests the following OAuth scopes: **Important Limitations:** -- **Plan requirement**: Requires Scale Plan or Enterprise Plan +- **Plan requirement**: Requires Max Plan or above - **INBOX only** for real-time sync: Only INBOX label triggers real-time updates; other labels sync via scheduled sync - **Watch expiration**: Gmail watch subscriptions expire after 7 days (automatically renewed by supermemory) - **Document limit**: Default limit is 10,000 threads per connection (configurable via `documentLimit` parameter) @@ -393,7 +394,7 @@ The Gmail connector requests the following OAuth scopes: ## Troubleshooting -### OAuth Fails or Missing Refresh Token +### OAuth fails or missing refresh token If OAuth fails or the connection stops syncing: @@ -416,7 +417,7 @@ const newConnection = await client.connections.create('gmail', { window.location.href = newConnection.authLink; ``` -### Emails Not Syncing in Real-time +### Emails not syncing in real-time If real-time sync isn't working: @@ -425,10 +426,10 @@ If real-time sync isn't working: - Check if the connection was created recently (watch registration happens on creation) - Trigger a manual sync to verify the connection is working -### Permission Denied Errors +### Permission denied errors If you see permission errors: - Ensure the user granted the required Gmail scopes during OAuth -- Verify your organization has Scale Plan or Enterprise Plan access +- Verify your organization has Max Plan or above access - Check if the user revoked app access in their Google Account settings diff --git a/apps/docs/connectors/google-drive.mdx b/apps/docs/connectors/google-drive.mdx index 45cde2e0..409193e4 100644 --- a/apps/docs/connectors/google-drive.mdx +++ b/apps/docs/connectors/google-drive.mdx @@ -1,5 +1,6 @@ --- -title: "Google Drive Connector" +title: "Google Drive connector" +sidebarTitle: "Google Drive" description: "Connect Google Drive to sync documents into your Supermemory knowledge base" icon: "/images/google-drive-icon.svg" --- @@ -18,9 +19,9 @@ Connect Google Drive to sync documents into your Supermemory knowledge base with If you use scoped sync and the user has not finished the picker yet, **scheduled or manual import may skip that connection** until a selection is saved on the connection. -## Quick Setup +## Quick setup -### 1. Create Google Drive Connection +### 1. Create Google Drive connection @@ -94,11 +95,11 @@ If you use scoped sync and the user has not finished the picker yet, **scheduled For **whole Drive** sync, include `"syncScope": "full"` in `metadata` on the same `POST /v3/connections/google-drive` request instead of `"selected"`. -### 2. Handle OAuth Callback +### 2. Handle OAuth callback -After the user grants permissions, Google redirects through Supermemory to finish the connection. With **scoped** sync (`syncScope` omitted or `"selected"`), the user is sent to Supermemory’s **hosted file and folder picker**; they must complete that step before imports run. With **`syncScope: "full"`**, Supermemory redirects to your `redirectUrl` (or returns connection details) **without** the picker. You can open the picker again later for an existing connection (Supermemory console, or `POST /v3/connections/{connectionId}/google-drive/hosted-picker` with an authenticated admin session). +After the user grants permissions, Google redirects through Supermemory to finish the connection. With scoped sync (`syncScope` omitted or `"selected"`), the user is sent to Supermemory's hosted file and folder picker and **must finish that step before imports run**. With `syncScope: "full"`, Supermemory skips the picker and redirects to your `redirectUrl` (or returns connection details). You can open the picker again later for an existing connection (Supermemory console, or `POST /v3/connections/{connectionId}/google-drive/hosted-picker` with an authenticated admin session). -### 3. Check Connection Status +### 3. Check connection status @@ -147,7 +148,7 @@ After the user grants permissions, Google redirects through Supermemory to finis -## Supported Document Types +## Supported document types Based on the API type definitions, Google Drive documents are identified with these types: - `google_doc` - Google Docs @@ -158,9 +159,9 @@ Based on the API type definitions, Google Drive documents are identified with th Drive documents are converted to markdown before ingestion. This conversion is lossy — some formatting may not be preserved. -## Connection Management +## Connection management -### List All Connections +### List all connections @@ -220,7 +221,7 @@ Drive documents are converted to markdown before ingestion. This conversion is l -### Delete Connection +### Delete connection @@ -278,7 +279,7 @@ Deleting a connection will: - Keep existing synced documents in Supermemory (they won't be deleted) -### Manual Sync +### Manual sync Trigger a manual synchronization: @@ -331,9 +332,9 @@ Trigger a manual synchronization: -## Advanced Configuration +## Advanced configuration -### Custom OAuth Application +### Custom OAuth application Configure your own Google OAuth app using the settings API: @@ -387,7 +388,7 @@ Configure your own Google OAuth app using the settings API: -### Document Filtering +### Document filtering Configure filtering using the settings API: diff --git a/apps/docs/connectors/granola.mdx b/apps/docs/connectors/granola.mdx index 92b878f3..f5e33d95 100644 --- a/apps/docs/connectors/granola.mdx +++ b/apps/docs/connectors/granola.mdx @@ -1,5 +1,6 @@ --- -title: "Granola Connector" +title: "Granola connector" +sidebarTitle: "Granola" description: "Sync AI meeting notes and transcripts from Granola into your Supermemory knowledge base" icon: "/images/granola.svg" --- @@ -10,9 +11,9 @@ Connect Granola to sync AI meeting notes and transcripts into your Supermemory k The Granola connector requires a **Pro Plan** or higher in Supermemory and a Granola plan that can create API keys. In Granola, create one from **Settings > Connectors > API keys**. -## Quick Setup +## Quick setup -### From the Console +### From the console 1. Open the [Supermemory Console](https://console.supermemory.ai). 2. Go to **Connectors**. @@ -86,7 +87,7 @@ The console limits connector setup to 500 documents. Use the API setup below for Supermemory validates the Granola API key before creating the connection. The initial sync starts automatically after the connection is created. -## Configuration Options +## Configuration options For Granola, provider-specific fields are passed inside the top-level `metadata` object. General connection options stay top-level. @@ -100,7 +101,7 @@ For Granola, provider-specific fields are passed inside the top-level `metadata` In the Python SDK, use `container_tags` and `document_limit` for top-level options, but keep the Granola metadata key in camelCase: `apiKey`. -## What Gets Synced +## What gets synced Granola notes are synced as markdown documents. Each document can include: @@ -109,7 +110,7 @@ Granola notes are synced as markdown documents. Each document can include: - AI-generated summary when present - Full transcript when present -### Document Metadata +### Document metadata Each synced note includes searchable metadata: @@ -139,9 +140,9 @@ const results = await client.search({ }); ``` -## Connection Management +## Connection management -### Delete Connection +### Delete connection @@ -166,7 +167,7 @@ const results = await client.search({ By default, deleting a connection removes all synced documents from Supermemory. To keep documents, pass `deleteDocuments=false` as a query parameter: `DELETE /v3/connections/:id?deleteDocuments=false` -### Manual Sync +### Manual sync @@ -194,7 +195,7 @@ By default, deleting a connection removes all synced documents from Supermemory. -## Sync Behavior +## Sync behavior | Feature | Behavior | |---------|----------| diff --git a/apps/docs/connectors/managing-resources.mdx b/apps/docs/connectors/managing-resources.mdx index 24cab0ec..e26c1e6a 100644 --- a/apps/docs/connectors/managing-resources.mdx +++ b/apps/docs/connectors/managing-resources.mdx @@ -1,6 +1,6 @@ --- -title: 'Managing Connection Resources' -sidebarTitle: 'Managing Resources' +title: 'Managing connection resources' +sidebarTitle: 'Managing resources' description: 'Get and configure resources for connections that support resource management' icon: 'folder-sync' --- @@ -11,7 +11,7 @@ icon: 'folder-sync' Some connectors require you to select which resources (e.g., repositories) to sync before syncing begins. Use these generic endpoints to list and configure resources for connections that support resource management. -## Get Resources +## Get resources `GET /v3/connections/:connectionId/resources` @@ -66,7 +66,7 @@ curl -X GET \ ``` -### Query Parameters +### Query parameters - `page`: Optional. Page number for pagination. Default: `1` - `per_page`: Optional. Number of resources per page. Default: `30` @@ -101,7 +101,7 @@ curl -X GET \ **Provider Support:** Not all providers support resource fetching. This endpoint is only available for providers that implement the `fetchResources()` method (e.g., GitHub). For providers that don't support this, you'll receive a `501 Not Implemented` response. -## Configure Connection +## Configure connection `POST /v3/connections/:connectionId/configure` @@ -200,7 +200,7 @@ curl -X POST \ ``` -### Request Body +### Request body ```json { @@ -244,7 +244,7 @@ The structure of each resource object depends on the provider. For GitHub, resou **Provider Support:** Not all providers support resource configuration. This endpoint is only available for providers that implement the `configureConnection()` method (e.g., GitHub). For providers that don't support this, you'll receive a `501 Not Implemented` response. -## Example: GitHub Repository Selection +## Example: GitHub repository selection Here's a complete example for GitHub: diff --git a/apps/docs/connectors/notion.mdx b/apps/docs/connectors/notion.mdx index 421714a3..09bafd94 100644 --- a/apps/docs/connectors/notion.mdx +++ b/apps/docs/connectors/notion.mdx @@ -1,13 +1,14 @@ --- -title: "Notion Connector" +title: "Notion connector" +sidebarTitle: "Notion" description: "Sync Notion pages, databases, and blocks with real-time webhooks and workspace integration" icon: "/images/notion-icon.svg" --- Connect Notion workspaces to automatically sync pages, databases, and content blocks into your Supermemory knowledge base. Supports real-time updates, rich formatting, and database properties. -## Quick Setup +## Quick setup -### 1. Create Notion Connection +### 1. Create Notion connection @@ -75,11 +76,11 @@ Connect Notion workspaces to automatically sync pages, databases, and content bl -### 2. Handle OAuth Flow +### 2. Handle OAuth flow After user grants workspace access, Notion redirects to your callback URL. The connection is automatically established. -### 3. Monitor Sync Progress +### 3. Monitor sync progress @@ -151,30 +152,30 @@ After user grants workspace access, Notion redirects to your callback URL. The c ## Document limit -Each connection has a **`documentLimit`** (optional when creating the connection; allowed range **1–10,000**). For Notion, each sync run asks the Notion Search API for **pages** shared with the integration, ordered by **last edited time, newest first**, and **stops after that many pages** (or when Search has no more results). +Each connection has an optional `documentLimit` between 1 and 10,000. For Notion, each sync asks the Notion Search API for pages shared with the integration, newest edits first, and **stops after that many pages** or when Search runs out of results. - **Full sync:** If your workspace has more shareable pages than `documentLimit`, the rest are **not** included in that run. Pages that look “missing” are often older or less recently edited relative to that ordering. Increase `documentLimit` or trigger another sync after pages change if you need broader coverage. - **Incremental sync:** Only pages edited **after** the previous sync are candidates; each one still counts toward the same `documentLimit`. If more pages changed than the limit since last sync, only the first batch in that newest-first order is returned for that run. Nested and child pages still count as normal pages in Search if the integration can access them—they are not skipped *because* they are nested. The limit applies to **how many pages** are fetched per sync, not to depth. -## Supported Content Types +## Supported content types -### Notion Pages +### Notion pages - **Rich text blocks** with formatting preserved - **Nested pages** and hierarchical structure - **Embedded content** (images, videos, files) - **Code blocks** with syntax highlighting - **Callouts and quotes** converted to markdown -### Notion Databases +### Notion databases - **Database entries** synced as individual documents - **Properties** included in metadata - **Relations** between database entries - **Formulas and rollups** calculated values - **Multi-select and select** properties -### Block Types +### Block types | Block Type | Processing | Markdown Output | |------------|------------|-----------------| @@ -188,7 +189,7 @@ Nested and child pages still count as normal pages in Search if the integration | **Image** | Referenced with metadata | `![alt text](url)` | | **Embed** | Link with context | `[Embedded Content](url)` | -## Delete Connection +## Delete connection Remove a Notion connection when no longer needed: @@ -242,9 +243,9 @@ Deleting a connection will: - Keep existing synced documents in Supermemory (they won't be deleted) -## Advanced Configuration +## Advanced configuration -### Custom Notion Integration +### Custom Notion integration For production deployments, create your own Notion integration: @@ -299,7 +300,7 @@ For production deployments, create your own Notion integration: -### Content Filtering +### Content filtering Control which Notion content gets synced: @@ -369,7 +370,7 @@ Control which Notion content gets synced: -## Workspace Permissions +## Workspace permissions Notion connector respects workspace permissions: @@ -381,9 +382,9 @@ Notion connector respects workspace permissions: | **No Access** | Removed from index | -## Database Integration +## Database integration -### Database Properties +### Database properties Notion database properties are mapped to metadata: @@ -412,7 +413,7 @@ const projectWithStatus = await client.search({ }); ``` -### Optimization Strategies +### Optimization strategies 1. **Set `documentLimit` high enough** for your workspace size (see [Document limit](#document-limit)) 2. **Use targeted container tags** for efficient organization diff --git a/apps/docs/connectors/onedrive.mdx b/apps/docs/connectors/onedrive.mdx index fcd1ca3a..ba0eae74 100644 --- a/apps/docs/connectors/onedrive.mdx +++ b/apps/docs/connectors/onedrive.mdx @@ -1,5 +1,6 @@ --- -title: "OneDrive Connector" +title: "OneDrive connector" +sidebarTitle: "OneDrive" description: "Sync Microsoft Office documents from OneDrive with scheduled synchronization and business account support" icon: "/images/microsoft-icon.svg" --- @@ -7,9 +8,9 @@ icon: "/images/microsoft-icon.svg" Connect OneDrive to automatically sync Word documents, Excel spreadsheets, and PowerPoint presentations into your Supermemory knowledge base. Supports both personal and business accounts with scheduled synchronization. -## Quick Setup +## Quick setup -### 1. Create OneDrive Connection +### 1. Create OneDrive connection @@ -89,7 +90,7 @@ curl -X POST "https://api.supermemory.ai/v3/connections/onedrive" \ After user grants permissions, Microsoft redirects to your callback URL. The connection is automatically established and initial sync begins. -### 3. Monitor Sync Status +### 3. Monitor sync status ```typescript Typescript @@ -138,32 +139,32 @@ After user grants permissions, Microsoft redirects to your callback URL. The con ``` -## Supported Document Types +## Supported document types -### Microsoft Word Documents +### Microsoft Word documents - **Rich text formatting** converted to markdown - **Headers and styles** preserved as markdown hierarchy - **Images and charts** extracted and referenced - **Tables** converted to markdown tables -### Excel Spreadsheets +### Excel spreadsheets - **Worksheet data** converted to structured markdown - **Multiple sheets** processed separately - **Charts and graphs** extracted as images - **Formulas** converted to calculated values - **Cell formatting** simplified in markdown -### PowerPoint Presentations +### PowerPoint presentations - **Slide content** converted to structured markdown - **Speaker notes** included when present - **Images and media** extracted and referenced - **Embedded objects** processed when possible -## Sync Mechanism +## Sync mechanism Webhooks lead to real-time syncing of changes in documents. You may also manually trigger a sync. -### Manual Sync Trigger +### Manual sync trigger ```typescript Typescript @@ -198,7 +199,7 @@ Webhooks lead to real-time syncing of changes in documents. You may also manuall ``` -## Delete Connection +## Delete connection Remove a OneDrive connection when no longer needed: @@ -250,9 +251,9 @@ Deleting a connection will: - Keep existing synced documents in Supermemory (they won't be deleted) -## Advanced Configuration +## Advanced configuration -### Custom Microsoft App +### Custom Microsoft app For production deployments, configure your own Microsoft application: @@ -301,7 +302,7 @@ For production deployments, configure your own Microsoft application: ``` -### Document Filtering +### Document filtering Control which OneDrive documents get synced: @@ -366,7 +367,7 @@ Control which OneDrive documents get synced: ``` -### Optimization Tips +### Optimization tips 1. **Set realistic document limits** based on storage and usage 2. **Use targeted filtering** to sync only business-critical documents diff --git a/apps/docs/connectors/overview.mdx b/apps/docs/connectors/overview.mdx index 5b40ef2b..4320954f 100644 --- a/apps/docs/connectors/overview.mdx +++ b/apps/docs/connectors/overview.mdx @@ -1,13 +1,13 @@ --- -title: "Connectors Overview" +title: "Connectors overview" description: "Integrate Google Drive, Gmail, Notion, OneDrive, GitHub, Granola and Web Crawler to automatically sync documents into your knowledge base" sidebarTitle: "Overview" -icon: "layers" +icon: "/icons/hugeicons/layers-01.svg" --- Connect external platforms to automatically sync documents into supermemory. Supported connectors include Google Drive, Gmail, Notion, OneDrive, GitHub, Granola and Web Crawler with real-time synchronization and intelligent content processing. -## Supported Connectors +## Supported connectors @@ -16,7 +16,7 @@ Connect external platforms to automatically sync documents into supermemory. Sup Real-time sync via webhooks. Supports shared drives, nested folders, and collaborative documents. - + **Email Threads** Real-time sync via Pub/Sub webhooks. Syncs threads with full conversation history and metadata. @@ -47,16 +47,16 @@ Connect external platforms to automatically sync documents into supermemory. Sup Syncs AI meeting notes, summaries, attendees, and transcripts from your Granola workspace. - + **Web Pages, Documentation** Crawl websites automatically with robots.txt compliance. Scheduled recrawling keeps content up to date. -## Quick Start +## Quick start -### 1. Create Connection +### 1. Create connection @@ -123,11 +123,11 @@ curl -X POST "https://api.supermemory.ai/v3/connections/notion" \ -### 2. Handle OAuth Callback +### 2. Handle OAuth callback After user completes OAuth, the connection is automatically established and sync begins. -### 3. Monitor Sync Status +### 3. Monitor sync status @@ -203,16 +203,16 @@ curl -X POST "https://api.supermemory.ai/v3/documents/list" \ -## How Connectors Work +## How connectors work -### Authentication Flow +### Authentication flow 1. **Create Connection**: Call `/v3/connections/{provider}` to get an OAuth URL, or create a direct credential-based connection for Granola or Web Crawler 2. **User Authorization**: Redirect user to complete OAuth flow when the provider requires it 3. **Automatic Setup**: Connection established, sync begins immediately 4. **Continuous Sync**: Real-time updates via webhooks + scheduled sync every 4 hours (or scheduled recrawling for Web Crawler) -### Document Processing Pipeline +### Document processing pipeline ```mermaid graph TD @@ -225,7 +225,7 @@ graph TD E --> G[Document Search] ``` -### Sync Mechanisms +### Sync mechanisms | Provider | Real-time Sync | Scheduled Sync | Manual Sync | |----------|---------------|----------------|-------------| @@ -238,9 +238,9 @@ graph TD | **Web Crawler** | ❌ Not supported | ✅ Scheduled recrawling (7+ days) | ✅ On-demand | -## Connection Management +## Connection management -### List All Connections +### List all connections @@ -292,7 +292,7 @@ curl -X POST "https://api.supermemory.ai/v3/connections/list" \ -### Delete Connections +### Delete connections The `DELETE /v3/connections/:connectionId` endpoint accepts an optional `deleteDocuments` query parameter: @@ -369,7 +369,7 @@ curl -X DELETE "https://api.supermemory.ai/v3/connections/conn_abc123?deleteDocu -## Custom OAuth Applications +## Custom OAuth applications By default, Supermemory uses its own OAuth applications to connect to third-party providers. You can configure your own OAuth app credentials via `PATCH /v3/settings` for tighter control over data access — useful for enterprise customers. diff --git a/apps/docs/connectors/s3.mdx b/apps/docs/connectors/s3.mdx index 12d9a285..06032a49 100644 --- a/apps/docs/connectors/s3.mdx +++ b/apps/docs/connectors/s3.mdx @@ -1,7 +1,8 @@ --- title: "S3 Connector" +sidebarTitle: "S3" description: "Connect Amazon S3 or S3-compatible storage to sync files into your Supermemory knowledge base" -icon: "database" +icon: "/icons/hugeicons/database-01.svg" --- Connect Amazon S3 buckets or S3-compatible storage services (MinIO, DigitalOcean Spaces, Cloudflare R2, Tigris) to sync files into your Supermemory knowledge base. @@ -10,7 +11,7 @@ Connect Amazon S3 buckets or S3-compatible storage services (MinIO, DigitalOcean The S3 connector requires a **Scale Plan** or higher. You can also create S3 connections directly from the [Supermemory Console](https://console.supermemory.ai). -## Quick Setup +## Quick setup @@ -69,7 +70,7 @@ The S3 connector requires a **Scale Plan** or higher. You can also create S3 con -## Configuration Options +## Configuration options For S3, provider-specific connection fields are passed inside the top-level `metadata` object. General connection options stay top-level. @@ -89,7 +90,7 @@ For S3, provider-specific connection fields are passed inside the top-level `met In the Python SDK, use `container_tags` for the top-level option, but keep S3 metadata keys in camelCase: `accessKeyId`, `secretAccessKey`, and `containerTagRegex`. -## S3-Compatible Services +## S3-compatible services Use `metadata.endpoint` to connect to S3-compatible storage. These services don't use AWS-style regions, so set `metadata.region` to `auto` — the value is still required for request signing but the service ignores it. @@ -134,7 +135,7 @@ const connection = await client.connections.create('s3', { For S3-compatible services, `metadata.endpoint` is the base S3 endpoint. Do not include the bucket name in the endpoint URL; pass the bucket separately as `metadata.bucket`. -## Prefix Filtering +## Prefix filtering Sync only files within a specific path: @@ -151,7 +152,7 @@ const connection = await client.connections.create('s3', { }); ``` -## Dynamic Container Tags +## Dynamic container tags Extract container tags from S3 key paths for multi-tenant setups: @@ -175,9 +176,9 @@ const connection = await client.connections.create('s3', { The regex must contain a named capture group `(?...)` and be less than 200 characters. -## Connection Management +## Connection management -### Delete Connection +### Delete connection @@ -197,7 +198,7 @@ The regex must contain a named capture group `(?...)` and be less than 2 By default, deleting a connection removes all synced documents from Supermemory. To keep documents, pass `deleteDocuments=false` as a query parameter: `DELETE /v3/connections/:id?deleteDocuments=false` -### Manual Sync +### Manual sync @@ -217,7 +218,7 @@ By default, deleting a connection removes all synced documents from Supermemory. -## Sync Behavior +## Sync behavior | Feature | Behavior | |---------|----------| @@ -226,7 +227,7 @@ By default, deleting a connection removes all synced documents from Supermemory. | **Sync schedule** | Every 4 hours + manual triggers | | **Document limit** | 10,000 files per connection (default) | -## IAM Permissions +## IAM permissions Minimum required permissions: @@ -246,7 +247,7 @@ Minimum required permissions: } ``` -## Error Codes +## Error codes | Code | Message | Solution | |------|---------|----------| diff --git a/apps/docs/connectors/troubleshooting.mdx b/apps/docs/connectors/troubleshooting.mdx index 14ad22d7..a6d81378 100644 --- a/apps/docs/connectors/troubleshooting.mdx +++ b/apps/docs/connectors/troubleshooting.mdx @@ -1,13 +1,13 @@ --- -title: "Connector Troubleshooting" +title: "Connector troubleshooting" sidebarTitle: "Troubleshooting" description: "Diagnose and resolve common issues with Google Drive, Gmail, Notion, and OneDrive connectors" -icon: "wrench" +icon: "/icons/hugeicons/wrench-01.svg" --- Quick guide to resolve common connector issues with authentication, syncing, and permissions. -## Quick Health Check +## Quick health check Check if your connectors are working properly: @@ -66,9 +66,9 @@ curl -X POST "https://api.supermemory.ai/v3/documents/list" \ -## Common Issues +## Common issues -### OAuth Callback Fails +### OAuth callback fails **Problem:** "Invalid redirect URI" error after user grants permissions @@ -90,7 +90,7 @@ const connection = await client.connections.create('notion', { - Copy the exact URL from your OAuth app settings - Test the flow in development first -### Documents Not Syncing +### Documents not syncing **Problem:** Documents stuck in "queued" or "extracting" status for over 30 minutes @@ -108,7 +108,7 @@ If documents consistently fail: - Verify you have permission to access the documents - Ensure the document type is supported -### Permission Denied Errors +### Permission denied errors **Problem:** Some documents show "permission denied" or aren't syncing @@ -129,7 +129,7 @@ const newConnection = await client.connections.create('google-drive', { window.location.href = newConnection.authLink; ``` -### Sync Takes Too Long +### Sync takes too long **Problem:** Hundreds of documents taking hours to sync @@ -143,7 +143,7 @@ const connection = await client.connections.create('onedrive', { }); ``` -## Provider-Specific Issues +## Provider-specific issues ### Google Drive @@ -226,7 +226,7 @@ Gmail connector requires Scale Plan or Enterprise Plan. If you see access errors - Contact support to upgrade your plan -## Best Practices +## Best practices 1. **Set reasonable document limits** - Start with 500-1000 documents 2. **Use descriptive container tags** - Makes debugging easier diff --git a/apps/docs/connectors/web-crawler.mdx b/apps/docs/connectors/web-crawler.mdx index 36808bb0..3917c429 100644 --- a/apps/docs/connectors/web-crawler.mdx +++ b/apps/docs/connectors/web-crawler.mdx @@ -1,7 +1,8 @@ --- -title: "Web Crawler Connector" +title: "Web Crawler connector" +sidebarTitle: "Web Crawler" description: "Crawl and sync websites automatically with scheduled recrawling and robots.txt compliance" -icon: "globe" +icon: "/icons/hugeicons/globe-02.svg" --- Connect websites to automatically crawl and sync web pages into your Supermemory knowledge base. The web crawler respects robots.txt rules, includes SSRF protection, and automatically recrawls sites on a schedule. @@ -10,9 +11,9 @@ Connect websites to automatically crawl and sync web pages into your Supermemory The web crawler connector requires a **Scale Plan** or **Enterprise Plan**. -## Quick Setup +## Quick setup -### 1. Create Web Crawler Connection +### 1. Create Web Crawler connection @@ -85,11 +86,11 @@ The web crawler connector requires a **Scale Plan** or **Enterprise Plan**. -### 2. Connection Established +### 2. Connection established Unlike other connectors, the web crawler doesn't require OAuth authentication. The connection is established immediately upon creation, and crawling begins automatically. -### 3. Monitor Sync Progress +### 3. Monitor sync progress @@ -162,22 +163,22 @@ Unlike other connectors, the web crawler doesn't require OAuth authentication. T -## Supported Content Types +## Supported content types -### Web Pages +### Web pages - **HTML content** extracted and converted to markdown - **Same-domain crawling** only (respects hostname boundaries) - **Robots.txt compliance** - respects disallow rules - **Content filtering** - only HTML pages (skips non-HTML content) -### URL Requirements +### URL requirements The web crawler only processes valid public URLs: - Must be a public URL (not localhost, private IPs, or internal domains) - Must be accessible from the internet - Must return HTML content (non-HTML files are skipped) -## Sync Mechanism +## Sync mechanism The web crawler uses **scheduled recrawling** rather than real-time webhooks: @@ -189,9 +190,9 @@ The web crawler uses **scheduled recrawling** rather than real-time webhooks: The recrawl schedule is automatically assigned when the connection is created. Sites are recrawled periodically to keep content up to date, but updates are not instantaneous. -## Connection Management +## Connection management -### List All Connections +### List all connections @@ -248,7 +249,7 @@ The recrawl schedule is automatically assigned when the connection is created. S -### Delete Connection +### Delete connection Remove a web crawler connection when no longer needed: @@ -302,9 +303,9 @@ Deleting a connection will: - Remove the connection configuration -## Advanced Configuration +## Advanced configuration -### Content Filtering +### Content filtering Control which web pages get synced using the settings API: @@ -365,9 +366,9 @@ Control which web pages get synced using the settings API: -## Security & Compliance +## Security & compliance -### SSRF Protection +### SSRF protection Built-in protection against Server-Side Request Forgery (SSRF) attacks: - Blocks private IP addresses (10.x.x.x, 192.168.x.x, 172.16-31.x.x) @@ -375,7 +376,7 @@ Built-in protection against Server-Side Request Forgery (SSRF) attacks: - Blocks cloud metadata endpoints - Only allows public, internet-accessible URLs -### URL Validation +### URL validation All URLs are validated before crawling: - Must be valid HTTP/HTTPS URLs diff --git a/apps/docs/docs.json b/apps/docs/docs.json index 75d91754..c75b5007 100644 --- a/apps/docs/docs.json +++ b/apps/docs/docs.json @@ -8,23 +8,49 @@ }, "openapi": "https://api.supermemory.ai/v4/openapi" }, + "background": { + "color": { + "dark": "#0A0A0A", + "light": "#FFFFFF" + } + }, "colors": { - "dark": "#1E3A8A", - "light": "#3B82F6", - "primary": "#1E3A8A" + "dark": "#091120", + "light": "#F5F5F5", + "primary": "#091120" }, "contextual": { - "options": ["copy", "view", "assistant", "chatgpt", "claude"] + "options": [ + "copy", + "view", + "assistant", + "chatgpt", + "claude", + "mcp", + "add-mcp", + "cursor", + "vscode", + "download-spec" + ] + }, + "favicon": { + "light": "/favicon-light-mode.png", + "dark": "/favicon-dark-mode.png" + }, + "thumbnails": { + "appearance": "dark", + "background": "/images/og-background.jpg", + "fonts": { + "family": "Geist" + } }, - "favicon": "/favicon.png", "fonts": { "body": { - "family": "Space Grotesk", - "format": "woff2" + "family": "Geist" }, "heading": { - "family": "Space Grotesk", - "format": "woff2" + "family": "Geist", + "weight": 500 } }, "footer": { @@ -66,13 +92,14 @@ "pages": ["index"] }, { - "icon": "code", + "icon": "/icons/hugeicons/source-code.svg", "anchors": [ { - "anchor": "Developer Platform (API)", + "anchor": "Developer platform (API)", + "icon": "/icons/hugeicons/book-open-01.svg", "pages": [ { - "group": "Getting Started", + "group": "Getting started", "pages": [ "overview/what-is-supermemory", "overview/comparison", @@ -88,12 +115,12 @@ "concepts/content-types", { "group": "Retrieval", - "icon": "search", + "icon": "/icons/hugeicons/search-01.svg", "pages": ["concepts/super-rag", "concepts/memory-vs-rag"] }, { "group": "Multi-tenancy and filtering", - "icon": "users", + "icon": "/icons/hugeicons/user-multiple.svg", "pages": [ "concepts/multi-tenancy", "concepts/multi-tenancy-examples", @@ -102,8 +129,8 @@ ] }, { - "group": "User Profiles", - "icon": "id-card", + "group": "User profiles", + "icon": "/icons/hugeicons/id.svg", "pages": ["concepts/user-profiles", "user-profiles/buckets"] } ] @@ -116,7 +143,7 @@ "concepts/customization", { "group": "Ingestion", - "icon": "download", + "icon": "/icons/hugeicons/download-01.svg", "pages": [ "ingestion/add-memories", "ingestion/document-operations" @@ -124,7 +151,7 @@ }, { "group": "Connectors", - "icon": "plug", + "icon": "/icons/hugeicons/plug-01.svg", "pages": [ "connectors/overview", "connectors/notion", @@ -141,7 +168,7 @@ }, { "group": "Recall", - "icon": "upload", + "icon": "/icons/hugeicons/upload-01.svg", "pages": [ "recall/search", "recall/user-profiles", @@ -151,7 +178,7 @@ }, { "group": "SMFS", - "icon": "database", + "icon": "/icons/hugeicons/database-01.svg", "pages": [ "smfs/overview", "smfs/install", @@ -160,7 +187,7 @@ "smfs/bash-tool-python", { "group": "Providers", - "icon": "cloud", + "icon": "/icons/hugeicons/cloud.svg", "pages": [ "smfs/providers/daytona", "smfs/providers/e2b", @@ -179,7 +206,7 @@ "pages": [ { "group": "Supermemory local", - "icon": "server", + "icon": "/icons/hugeicons/server-stack-01.svg", "pages": [ "self-hosting/overview", "self-hosting/quickstart", @@ -196,12 +223,12 @@ "pages": [ { "group": "General", - "icon": "book-open", + "icon": "/icons/hugeicons/book-open-01.svg", "pages": ["ingestion/batch-ingest-historical-data"] }, { "group": "Benchmarking", - "icon": "flask-conical", + "icon": "/icons/hugeicons/test-tube-01.svg", "pages": [ "memorybench/overview", "memorybench/extend-benchmark", @@ -216,11 +243,11 @@ ] }, { - "group": "Migration Guides", + "group": "Migration guides", "pages": [ { "group": "From another provider", - "icon": "truck", + "icon": "/icons/hugeicons/delivery-truck-01.svg", "pages": ["migration/from-mem0", "migration/from-zep"] } ] @@ -228,11 +255,12 @@ ] }, { - "anchor": "API Integrations", - "icon": "plug", + "anchor": "API integrations", + "icon": "/icons/hugeicons/plug-01.svg", "pages": [ "integrations/supermemory-sdk", "integrations/ai-sdk", + "integrations/eve", "integrations/openai", "integrations/langgraph", "integrations/openai-agents-sdk", @@ -251,22 +279,22 @@ "integrations/viasocket", "integrations/zapier", { - "group": "Migration Guides", - "icon": "arrow-up-right", + "group": "Migration guides", + "icon": "/icons/hugeicons/arrow-up-right-01.svg", "pages": ["migration/tools-v2-upgrade"] } ] }, { - "anchor": "API Reference", - "icon": "unplug", + "anchor": "API reference", + "icon": "/icons/hugeicons/plug-socket.svg", "openapi": "https://api.supermemory.ai/v4/openapi", "pages": [ "api-reference/overview", "authentication", { "group": "Ingest", - "icon": "download", + "icon": "/icons/hugeicons/download-01.svg", "pages": [ "api-reference/ingest", "POST /v3/documents", @@ -278,7 +306,7 @@ }, { "group": "Recall", - "icon": "search", + "icon": "/icons/hugeicons/search-01.svg", "pages": [ "api-reference/search", "POST /v4/search", @@ -290,7 +318,7 @@ }, { "group": "Documents", - "icon": "file-text", + "icon": "/icons/hugeicons/file-02.svg", "pages": [ "api-reference/documents", "POST /v3/documents/list", @@ -304,7 +332,7 @@ }, { "group": "Memories", - "icon": "database", + "icon": "/icons/hugeicons/database-01.svg", "pages": [ "api-reference/memories", "POST /v4/memories", @@ -316,7 +344,7 @@ }, { "group": "Container tags", - "icon": "tags", + "icon": "/icons/hugeicons/tag-01.svg", "pages": [ "api-reference/container-tags", "GET /v3/container-tags/{containerTag}", @@ -328,7 +356,7 @@ }, { "group": "Connections", - "icon": "plug", + "icon": "/icons/hugeicons/plug-01.svg", "pages": [ "api-reference/connections", "POST /v3/connections/{provider}", @@ -345,7 +373,7 @@ }, { "group": "Settings", - "icon": "settings", + "icon": "/icons/hugeicons/settings-01.svg", "pages": [ "api-reference/settings", "GET /v3/settings", @@ -357,24 +385,24 @@ ] } ], - "tab": "Developer Platform" + "tab": "Developer platform" }, { - "icon": "puzzle", + "icon": "/icons/hugeicons/puzzle.svg", "anchors": [ { "anchor": "Plugins and MCP", - "icon": "puzzle", + "icon": "/icons/hugeicons/puzzle.svg", "pages": [ { "group": "Supermemory MCP", - "icon": "terminal", + "icon": "/icons/hugeicons/command-line.svg", "pages": [ "supermemory-mcp/mcp", "supermemory-mcp/setup", { "group": "Setups", - "icon": "layers", + "icon": "/icons/hugeicons/layers-01.svg", "pages": [ "supermemory-mcp/chatgpt-web", "supermemory-mcp/claude-desktop" @@ -384,15 +412,16 @@ }, { "group": "Plugins", - "icon": "puzzle", + "icon": "/icons/hugeicons/puzzle.svg", "pages": [ "integrations/openclaw", + "integrations/hermes", "integrations/claude-code", - "integrations/cursor", - "integrations/grok-bot", - "integrations/opencode", + "integrations/muse-code", "integrations/codex", - "integrations/hermes" + "integrations/opencode", + "integrations/cursor", + "integrations/grok-bot" ] } ] @@ -932,9 +961,155 @@ "destination": "/overview/what-is-supermemory", "permanent": true, "source": "/company-brain/:slug*" + }, + { + "source": "/api-reference/conversations/ingest-or-update-conversation", + "destination": "/api-reference/ingest/ingest-or-update-conversation" + }, + { + "source": "/api-reference/manage-documents/add-document", + "destination": "/api-reference/ingest/add-document" + }, + { + "source": "/api-reference/manage-documents/batch-add-documents", + "destination": "/api-reference/ingest/batch-add-documents" + }, + { + "source": "/api-reference/manage-documents/bulk-delete-documents", + "destination": "/api-reference/ingest/bulk-delete-documents" + }, + { + "source": "/api-reference/manage-documents/delete-document-by-id-or-customid", + "destination": "/api-reference/ingest/delete-document-by-id-or-customid" + }, + { + "source": "/api-reference/manage-documents/update-document", + "destination": "/api-reference/ingest/update-document" + }, + { + "source": "/api-reference/manage-documents/upload-a-file", + "destination": "/api-reference/ingest/upload-a-file" + }, + { + "source": "/api-reference/manage-documents/get-document", + "destination": "/api-reference/documents/get-document" + }, + { + "source": "/api-reference/manage-documents/get-document-chunks", + "destination": "/api-reference/documents/get-document-chunks" + }, + { + "source": "/api-reference/manage-documents/list-documents", + "destination": "/api-reference/documents/list-documents" + }, + { + "source": "/api-reference/memories-v4/list-memory-entries-with-history", + "destination": "/api-reference/content-management/list-memory-entries-with-history" + }, + { + "source": "/api-reference/memories/create-memories-directly", + "destination": "/api-reference/content-management/create-memories-directly" + }, + { + "source": "/api-reference/memories/forget-a-memory", + "destination": "/api-reference/content-management/forget-a-memory" + }, + { + "source": "/api-reference/memories/update-a-memory-creates-new-version", + "destination": "/api-reference/content-management/update-a-memory-creates-new-version" + }, + { + "source": "/api-reference/organization-settings/get-settings", + "destination": "/api-reference/settings/get-settings" + }, + { + "source": "/api-reference/profile/get-user-profile", + "destination": "/api-reference/profiles/get-user-profile" + }, + { + "source": "/api-reference/search/search-documents", + "destination": "/api-reference/documents/search-documents" + }, + { + "source": "/api-reference/search/search-memory-entries", + "destination": "/api-reference/recall-search/search-memory-entries" + }, + { + "source": "/api-reference/spaces/delete-container-tag", + "destination": "/api-reference/container-tags/delete-container-tag" + }, + { + "source": "/api-reference/graph/get-graph-bounds", + "destination": "/concepts/graph-memory" + }, + { + "source": "/api-reference/graph/get-graph-statistics", + "destination": "/concepts/graph-memory" + }, + { + "source": "/api-reference/graph/get-graph-viewport-data", + "destination": "/concepts/graph-memory" + }, + { + "source": "/api-reference/knowledge-graph/get-graph-bounds", + "destination": "/concepts/graph-memory" + }, + { + "source": "/api-reference/knowledge-graph/get-graph-statistics", + "destination": "/concepts/graph-memory" + }, + { + "source": "/api-reference/knowledge-graph/get-graph-viewport-data", + "destination": "/concepts/graph-memory" + }, + { + "source": "/api-reference/organization-settings/toggle-overage", + "destination": "/api-reference/settings" + }, + { + "source": "/api-reference/settings/toggle-overage", + "destination": "/api-reference/settings" + }, + { + "source": "/deployment/self-hosting", + "destination": "/self-hosting/configuration" + }, + { + "source": "/self-hosting/embed", + "destination": "/self-hosting/configuration" + }, + { + "source": "/concepts/memory", + "destination": "/concepts/graph-memory" + }, + { + "source": "/architecture.md", + "destination": "/" + }, + { + "source": "/cli/commands", + "destination": "/" + }, + { + "source": "/cli/overview", + "destination": "/" + }, + { + "source": "/integrations/_generated/api", + "destination": "/" + }, + { + "source": "/smfs/providers/Dockerfile", + "destination": "/" } ], "styling": { + "codeblocks": { + "theme": { + "dark": "github-dark-default", + "light": "github-light-default" + } + }, "eyebrows": "breadcrumbs" }, "theme": "aspen" diff --git a/apps/docs/favicon-dark-mode.png b/apps/docs/favicon-dark-mode.png new file mode 100644 index 00000000..0fd5e17b Binary files /dev/null and b/apps/docs/favicon-dark-mode.png differ diff --git a/apps/docs/favicon-light-mode.png b/apps/docs/favicon-light-mode.png new file mode 100644 index 00000000..562ba896 Binary files /dev/null and b/apps/docs/favicon-light-mode.png differ diff --git a/apps/docs/icons/hugeicons/activity-01.svg b/apps/docs/icons/hugeicons/activity-01.svg new file mode 100644 index 00000000..1039a713 --- /dev/null +++ b/apps/docs/icons/hugeicons/activity-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/agreement-01.svg b/apps/docs/icons/hugeicons/agreement-01.svg new file mode 100644 index 00000000..0cb0f507 --- /dev/null +++ b/apps/docs/icons/hugeicons/agreement-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/ai-brain-01.svg b/apps/docs/icons/hugeicons/ai-brain-01.svg new file mode 100644 index 00000000..ca2a474c --- /dev/null +++ b/apps/docs/icons/hugeicons/ai-brain-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/arrow-data-transfer-horizontal.svg b/apps/docs/icons/hugeicons/arrow-data-transfer-horizontal.svg new file mode 100644 index 00000000..c6ad332d --- /dev/null +++ b/apps/docs/icons/hugeicons/arrow-data-transfer-horizontal.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/arrow-up-right-01.svg b/apps/docs/icons/hugeicons/arrow-up-right-01.svg new file mode 100644 index 00000000..ac5f4e6b --- /dev/null +++ b/apps/docs/icons/hugeicons/arrow-up-right-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/award-01.svg b/apps/docs/icons/hugeicons/award-01.svg new file mode 100644 index 00000000..f8c78dca --- /dev/null +++ b/apps/docs/icons/hugeicons/award-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/balance-scale.svg b/apps/docs/icons/hugeicons/balance-scale.svg new file mode 100644 index 00000000..2070b0c0 --- /dev/null +++ b/apps/docs/icons/hugeicons/balance-scale.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/book-02.svg b/apps/docs/icons/hugeicons/book-02.svg new file mode 100644 index 00000000..56ef7af4 --- /dev/null +++ b/apps/docs/icons/hugeicons/book-02.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/book-open-01.svg b/apps/docs/icons/hugeicons/book-open-01.svg new file mode 100644 index 00000000..520f7a96 --- /dev/null +++ b/apps/docs/icons/hugeicons/book-open-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/brain-01.svg b/apps/docs/icons/hugeicons/brain-01.svg new file mode 100644 index 00000000..f0b8b220 --- /dev/null +++ b/apps/docs/icons/hugeicons/brain-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/bug-01.svg b/apps/docs/icons/hugeicons/bug-01.svg new file mode 100644 index 00000000..45bee373 --- /dev/null +++ b/apps/docs/icons/hugeicons/bug-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/building-03.svg b/apps/docs/icons/hugeicons/building-03.svg new file mode 100644 index 00000000..e84847de --- /dev/null +++ b/apps/docs/icons/hugeicons/building-03.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/chart-line-data-01.svg b/apps/docs/icons/hugeicons/chart-line-data-01.svg new file mode 100644 index 00000000..21691b4d --- /dev/null +++ b/apps/docs/icons/hugeicons/chart-line-data-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/chat-bot.svg b/apps/docs/icons/hugeicons/chat-bot.svg new file mode 100644 index 00000000..e7af7c95 --- /dev/null +++ b/apps/docs/icons/hugeicons/chat-bot.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/check-list.svg b/apps/docs/icons/hugeicons/check-list.svg new file mode 100644 index 00000000..89f75194 --- /dev/null +++ b/apps/docs/icons/hugeicons/check-list.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/clipboard.svg b/apps/docs/icons/hugeicons/clipboard.svg new file mode 100644 index 00000000..05742386 --- /dev/null +++ b/apps/docs/icons/hugeicons/clipboard.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/clock-01.svg b/apps/docs/icons/hugeicons/clock-01.svg new file mode 100644 index 00000000..8bd1094a --- /dev/null +++ b/apps/docs/icons/hugeicons/clock-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/cloud.svg b/apps/docs/icons/hugeicons/cloud.svg new file mode 100644 index 00000000..8a2567bf --- /dev/null +++ b/apps/docs/icons/hugeicons/cloud.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/command-line.svg b/apps/docs/icons/hugeicons/command-line.svg new file mode 100644 index 00000000..08240935 --- /dev/null +++ b/apps/docs/icons/hugeicons/command-line.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/compass-01.svg b/apps/docs/icons/hugeicons/compass-01.svg new file mode 100644 index 00000000..e7c32fb1 --- /dev/null +++ b/apps/docs/icons/hugeicons/compass-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/computer.svg b/apps/docs/icons/hugeicons/computer.svg new file mode 100644 index 00000000..ac957b70 --- /dev/null +++ b/apps/docs/icons/hugeicons/computer.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/copy-01.svg b/apps/docs/icons/hugeicons/copy-01.svg new file mode 100644 index 00000000..68a57691 --- /dev/null +++ b/apps/docs/icons/hugeicons/copy-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/cpu.svg b/apps/docs/icons/hugeicons/cpu.svg new file mode 100644 index 00000000..718aab39 --- /dev/null +++ b/apps/docs/icons/hugeicons/cpu.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/credit-card.svg b/apps/docs/icons/hugeicons/credit-card.svg new file mode 100644 index 00000000..3a48fcac --- /dev/null +++ b/apps/docs/icons/hugeicons/credit-card.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/cube.svg b/apps/docs/icons/hugeicons/cube.svg new file mode 100644 index 00000000..ae23bf80 --- /dev/null +++ b/apps/docs/icons/hugeicons/cube.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/cursor-01.svg b/apps/docs/icons/hugeicons/cursor-01.svg new file mode 100644 index 00000000..5d70b8e2 --- /dev/null +++ b/apps/docs/icons/hugeicons/cursor-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/dashboard-speed-01.svg b/apps/docs/icons/hugeicons/dashboard-speed-01.svg new file mode 100644 index 00000000..a0796ae0 --- /dev/null +++ b/apps/docs/icons/hugeicons/dashboard-speed-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/database-01.svg b/apps/docs/icons/hugeicons/database-01.svg new file mode 100644 index 00000000..6aedce34 --- /dev/null +++ b/apps/docs/icons/hugeicons/database-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/delivery-truck-01.svg b/apps/docs/icons/hugeicons/delivery-truck-01.svg new file mode 100644 index 00000000..09f6e86f --- /dev/null +++ b/apps/docs/icons/hugeicons/delivery-truck-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/download-01.svg b/apps/docs/icons/hugeicons/download-01.svg new file mode 100644 index 00000000..03d2eee5 --- /dev/null +++ b/apps/docs/icons/hugeicons/download-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/eraser-01.svg b/apps/docs/icons/hugeicons/eraser-01.svg new file mode 100644 index 00000000..3b65724b --- /dev/null +++ b/apps/docs/icons/hugeicons/eraser-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/file-01.svg b/apps/docs/icons/hugeicons/file-01.svg new file mode 100644 index 00000000..bbdc6340 --- /dev/null +++ b/apps/docs/icons/hugeicons/file-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/file-02.svg b/apps/docs/icons/hugeicons/file-02.svg new file mode 100644 index 00000000..d40d55ea --- /dev/null +++ b/apps/docs/icons/hugeicons/file-02.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/file-search.svg b/apps/docs/icons/hugeicons/file-search.svg new file mode 100644 index 00000000..9d9ffbed --- /dev/null +++ b/apps/docs/icons/hugeicons/file-search.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/files-01.svg b/apps/docs/icons/hugeicons/files-01.svg new file mode 100644 index 00000000..8dcea80d --- /dev/null +++ b/apps/docs/icons/hugeicons/files-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/files-02.svg b/apps/docs/icons/hugeicons/files-02.svg new file mode 100644 index 00000000..7c167066 --- /dev/null +++ b/apps/docs/icons/hugeicons/files-02.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/filter.svg b/apps/docs/icons/hugeicons/filter.svg new file mode 100644 index 00000000..357ae3fb --- /dev/null +++ b/apps/docs/icons/hugeicons/filter.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/flash.svg b/apps/docs/icons/hugeicons/flash.svg new file mode 100644 index 00000000..2fe9e832 --- /dev/null +++ b/apps/docs/icons/hugeicons/flash.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/folder-01.svg b/apps/docs/icons/hugeicons/folder-01.svg new file mode 100644 index 00000000..5490e728 --- /dev/null +++ b/apps/docs/icons/hugeicons/folder-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/github.svg b/apps/docs/icons/hugeicons/github.svg new file mode 100644 index 00000000..de82df3e --- /dev/null +++ b/apps/docs/icons/hugeicons/github.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/globe-02.svg b/apps/docs/icons/hugeicons/globe-02.svg new file mode 100644 index 00000000..a329920c --- /dev/null +++ b/apps/docs/icons/hugeicons/globe-02.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/hard-drive.svg b/apps/docs/icons/hugeicons/hard-drive.svg new file mode 100644 index 00000000..d0c151f6 --- /dev/null +++ b/apps/docs/icons/hugeicons/hard-drive.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/headphones.svg b/apps/docs/icons/hugeicons/headphones.svg new file mode 100644 index 00000000..ab0df5af --- /dev/null +++ b/apps/docs/icons/hugeicons/headphones.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/help-circle.svg b/apps/docs/icons/hugeicons/help-circle.svg new file mode 100644 index 00000000..8051e368 --- /dev/null +++ b/apps/docs/icons/hugeicons/help-circle.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/hierarchy-square-01.svg b/apps/docs/icons/hugeicons/hierarchy-square-01.svg new file mode 100644 index 00000000..bb70b6fd --- /dev/null +++ b/apps/docs/icons/hugeicons/hierarchy-square-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/id.svg b/apps/docs/icons/hugeicons/id.svg new file mode 100644 index 00000000..0c5f25c5 --- /dev/null +++ b/apps/docs/icons/hugeicons/id.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/idea-01.svg b/apps/docs/icons/hugeicons/idea-01.svg new file mode 100644 index 00000000..118badab --- /dev/null +++ b/apps/docs/icons/hugeicons/idea-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/invoice-01.svg b/apps/docs/icons/hugeicons/invoice-01.svg new file mode 100644 index 00000000..ab332379 --- /dev/null +++ b/apps/docs/icons/hugeicons/invoice-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/java-script.svg b/apps/docs/icons/hugeicons/java-script.svg new file mode 100644 index 00000000..439ebb61 --- /dev/null +++ b/apps/docs/icons/hugeicons/java-script.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/justice-scale-01.svg b/apps/docs/icons/hugeicons/justice-scale-01.svg new file mode 100644 index 00000000..ca346f9b --- /dev/null +++ b/apps/docs/icons/hugeicons/justice-scale-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/key-01.svg b/apps/docs/icons/hugeicons/key-01.svg new file mode 100644 index 00000000..a318d6b8 --- /dev/null +++ b/apps/docs/icons/hugeicons/key-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/layers-01.svg b/apps/docs/icons/hugeicons/layers-01.svg new file mode 100644 index 00000000..d3187cca --- /dev/null +++ b/apps/docs/icons/hugeicons/layers-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/left-to-right-list-bullet.svg b/apps/docs/icons/hugeicons/left-to-right-list-bullet.svg new file mode 100644 index 00000000..1f17a417 --- /dev/null +++ b/apps/docs/icons/hugeicons/left-to-right-list-bullet.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/link-01.svg b/apps/docs/icons/hugeicons/link-01.svg new file mode 100644 index 00000000..677bb4ee --- /dev/null +++ b/apps/docs/icons/hugeicons/link-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/location-01.svg b/apps/docs/icons/hugeicons/location-01.svg new file mode 100644 index 00000000..a6b6a069 --- /dev/null +++ b/apps/docs/icons/hugeicons/location-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/lock.svg b/apps/docs/icons/hugeicons/lock.svg new file mode 100644 index 00000000..2698bb6f --- /dev/null +++ b/apps/docs/icons/hugeicons/lock.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/login-01.svg b/apps/docs/icons/hugeicons/login-01.svg new file mode 100644 index 00000000..74538e8e --- /dev/null +++ b/apps/docs/icons/hugeicons/login-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/logout-01.svg b/apps/docs/icons/hugeicons/logout-01.svg new file mode 100644 index 00000000..4f275d27 --- /dev/null +++ b/apps/docs/icons/hugeicons/logout-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/mail-01.svg b/apps/docs/icons/hugeicons/mail-01.svg new file mode 100644 index 00000000..b1eb355c --- /dev/null +++ b/apps/docs/icons/hugeicons/mail-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/message-01.svg b/apps/docs/icons/hugeicons/message-01.svg new file mode 100644 index 00000000..be8416be --- /dev/null +++ b/apps/docs/icons/hugeicons/message-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/message-02.svg b/apps/docs/icons/hugeicons/message-02.svg new file mode 100644 index 00000000..7c3b6b2b --- /dev/null +++ b/apps/docs/icons/hugeicons/message-02.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/note-01.svg b/apps/docs/icons/hugeicons/note-01.svg new file mode 100644 index 00000000..6ed2bc6f --- /dev/null +++ b/apps/docs/icons/hugeicons/note-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/package.svg b/apps/docs/icons/hugeicons/package.svg new file mode 100644 index 00000000..eb61158c --- /dev/null +++ b/apps/docs/icons/hugeicons/package.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/play-circle.svg b/apps/docs/icons/hugeicons/play-circle.svg new file mode 100644 index 00000000..6d105296 --- /dev/null +++ b/apps/docs/icons/hugeicons/play-circle.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/play.svg b/apps/docs/icons/hugeicons/play.svg new file mode 100644 index 00000000..90204233 --- /dev/null +++ b/apps/docs/icons/hugeicons/play.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/plug-01.svg b/apps/docs/icons/hugeicons/plug-01.svg new file mode 100644 index 00000000..7f2fe523 --- /dev/null +++ b/apps/docs/icons/hugeicons/plug-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/plug-socket.svg b/apps/docs/icons/hugeicons/plug-socket.svg new file mode 100644 index 00000000..3dd53ab2 --- /dev/null +++ b/apps/docs/icons/hugeicons/plug-socket.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/plus-sign.svg b/apps/docs/icons/hugeicons/plus-sign.svg new file mode 100644 index 00000000..3eb00df6 --- /dev/null +++ b/apps/docs/icons/hugeicons/plus-sign.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/puzzle.svg b/apps/docs/icons/hugeicons/puzzle.svg new file mode 100644 index 00000000..658b3335 --- /dev/null +++ b/apps/docs/icons/hugeicons/puzzle.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/python.svg b/apps/docs/icons/hugeicons/python.svg new file mode 100644 index 00000000..bc99d742 --- /dev/null +++ b/apps/docs/icons/hugeicons/python.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/refresh.svg b/apps/docs/icons/hugeicons/refresh.svg new file mode 100644 index 00000000..c33c0075 --- /dev/null +++ b/apps/docs/icons/hugeicons/refresh.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/robotic.svg b/apps/docs/icons/hugeicons/robotic.svg new file mode 100644 index 00000000..bcdc8c03 --- /dev/null +++ b/apps/docs/icons/hugeicons/robotic.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/rotate-clockwise.svg b/apps/docs/icons/hugeicons/rotate-clockwise.svg new file mode 100644 index 00000000..dd340346 --- /dev/null +++ b/apps/docs/icons/hugeicons/rotate-clockwise.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/route-01.svg b/apps/docs/icons/hugeicons/route-01.svg new file mode 100644 index 00000000..50b7b65c --- /dev/null +++ b/apps/docs/icons/hugeicons/route-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/route-02.svg b/apps/docs/icons/hugeicons/route-02.svg new file mode 100644 index 00000000..bbf7c05e --- /dev/null +++ b/apps/docs/icons/hugeicons/route-02.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/search-01.svg b/apps/docs/icons/hugeicons/search-01.svg new file mode 100644 index 00000000..78352b5f --- /dev/null +++ b/apps/docs/icons/hugeicons/search-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/server-stack-01.svg b/apps/docs/icons/hugeicons/server-stack-01.svg new file mode 100644 index 00000000..f7dbe8b3 --- /dev/null +++ b/apps/docs/icons/hugeicons/server-stack-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/settings-01.svg b/apps/docs/icons/hugeicons/settings-01.svg new file mode 100644 index 00000000..cb176523 --- /dev/null +++ b/apps/docs/icons/hugeicons/settings-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/settings-02.svg b/apps/docs/icons/hugeicons/settings-02.svg new file mode 100644 index 00000000..f801c650 --- /dev/null +++ b/apps/docs/icons/hugeicons/settings-02.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/share-08.svg b/apps/docs/icons/hugeicons/share-08.svg new file mode 100644 index 00000000..2ef00019 --- /dev/null +++ b/apps/docs/icons/hugeicons/share-08.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/shield-01.svg b/apps/docs/icons/hugeicons/shield-01.svg new file mode 100644 index 00000000..b53f09f3 --- /dev/null +++ b/apps/docs/icons/hugeicons/shield-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/sliders-horizontal.svg b/apps/docs/icons/hugeicons/sliders-horizontal.svg new file mode 100644 index 00000000..17ce24ab --- /dev/null +++ b/apps/docs/icons/hugeicons/sliders-horizontal.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/source-code.svg b/apps/docs/icons/hugeicons/source-code.svg new file mode 100644 index 00000000..5ecad483 --- /dev/null +++ b/apps/docs/icons/hugeicons/source-code.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/sparkles.svg b/apps/docs/icons/hugeicons/sparkles.svg new file mode 100644 index 00000000..7ae8b732 --- /dev/null +++ b/apps/docs/icons/hugeicons/sparkles.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/square.svg b/apps/docs/icons/hugeicons/square.svg new file mode 100644 index 00000000..8fcc5c28 --- /dev/null +++ b/apps/docs/icons/hugeicons/square.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/tag-01.svg b/apps/docs/icons/hugeicons/tag-01.svg new file mode 100644 index 00000000..bb222df4 --- /dev/null +++ b/apps/docs/icons/hugeicons/tag-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/test-tube-01.svg b/apps/docs/icons/hugeicons/test-tube-01.svg new file mode 100644 index 00000000..e48816ff --- /dev/null +++ b/apps/docs/icons/hugeicons/test-tube-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/tick-02.svg b/apps/docs/icons/hugeicons/tick-02.svg new file mode 100644 index 00000000..0ce1e241 --- /dev/null +++ b/apps/docs/icons/hugeicons/tick-02.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/triangle.svg b/apps/docs/icons/hugeicons/triangle.svg new file mode 100644 index 00000000..41be0d32 --- /dev/null +++ b/apps/docs/icons/hugeicons/triangle.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/upload-01.svg b/apps/docs/icons/hugeicons/upload-01.svg new file mode 100644 index 00000000..2ede0991 --- /dev/null +++ b/apps/docs/icons/hugeicons/upload-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/user-circle.svg b/apps/docs/icons/hugeicons/user-circle.svg new file mode 100644 index 00000000..297370b0 --- /dev/null +++ b/apps/docs/icons/hugeicons/user-circle.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/user-multiple.svg b/apps/docs/icons/hugeicons/user-multiple.svg new file mode 100644 index 00000000..9ea8b197 --- /dev/null +++ b/apps/docs/icons/hugeicons/user-multiple.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/user.svg b/apps/docs/icons/hugeicons/user.svg new file mode 100644 index 00000000..69ada85a --- /dev/null +++ b/apps/docs/icons/hugeicons/user.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/workflow-square-01.svg b/apps/docs/icons/hugeicons/workflow-square-01.svg new file mode 100644 index 00000000..a1ffc1b9 --- /dev/null +++ b/apps/docs/icons/hugeicons/workflow-square-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/icons/hugeicons/wrench-01.svg b/apps/docs/icons/hugeicons/wrench-01.svg new file mode 100644 index 00000000..5d961e16 --- /dev/null +++ b/apps/docs/icons/hugeicons/wrench-01.svg @@ -0,0 +1 @@ + diff --git a/apps/docs/images/232.png b/apps/docs/images/232.png deleted file mode 100644 index d3df58c4..00000000 Binary files a/apps/docs/images/232.png and /dev/null differ diff --git a/apps/docs/images/art/bg-branch.jpg b/apps/docs/images/art/bg-branch.jpg new file mode 100644 index 00000000..8806b6e2 Binary files /dev/null and b/apps/docs/images/art/bg-branch.jpg differ diff --git a/apps/docs/images/art/bg-grass.jpg b/apps/docs/images/art/bg-grass.jpg new file mode 100644 index 00000000..906c893f Binary files /dev/null and b/apps/docs/images/art/bg-grass.jpg differ diff --git a/apps/docs/images/art/bg-islands.jpg b/apps/docs/images/art/bg-islands.jpg new file mode 100644 index 00000000..0e4aeef4 Binary files /dev/null and b/apps/docs/images/art/bg-islands.jpg differ diff --git a/apps/docs/images/art/bg-lakeshore.jpg b/apps/docs/images/art/bg-lakeshore.jpg new file mode 100644 index 00000000..4738393f Binary files /dev/null and b/apps/docs/images/art/bg-lakeshore.jpg differ diff --git a/apps/docs/images/art/bg-meadow.jpg b/apps/docs/images/art/bg-meadow.jpg new file mode 100644 index 00000000..144595b8 Binary files /dev/null and b/apps/docs/images/art/bg-meadow.jpg differ diff --git a/apps/docs/images/art/bg-stream.jpg b/apps/docs/images/art/bg-stream.jpg new file mode 100644 index 00000000..baeffc8b Binary files /dev/null and b/apps/docs/images/art/bg-stream.jpg differ diff --git a/apps/docs/images/art/mark-white.svg b/apps/docs/images/art/mark-white.svg new file mode 100644 index 00000000..b950a8a3 --- /dev/null +++ b/apps/docs/images/art/mark-white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/docs/images/art/maya.jpg b/apps/docs/images/art/maya.jpg new file mode 100644 index 00000000..d6c11b1f Binary files /dev/null and b/apps/docs/images/art/maya.jpg differ diff --git a/apps/docs/images/codex.svg b/apps/docs/images/codex.svg new file mode 100644 index 00000000..9ce43929 --- /dev/null +++ b/apps/docs/images/codex.svg @@ -0,0 +1 @@ +Codex diff --git a/apps/docs/images/eve-memory-poster.png b/apps/docs/images/eve-memory-poster.png new file mode 100644 index 00000000..1d766a63 Binary files /dev/null and b/apps/docs/images/eve-memory-poster.png differ diff --git a/apps/docs/images/eve.svg b/apps/docs/images/eve.svg new file mode 100644 index 00000000..d39b889f --- /dev/null +++ b/apps/docs/images/eve.svg @@ -0,0 +1,5 @@ + +Eve + + + diff --git a/apps/docs/images/how-it-works-overview.webp b/apps/docs/images/how-it-works-overview.webp new file mode 100644 index 00000000..ead79c5b Binary files /dev/null and b/apps/docs/images/how-it-works-overview.webp differ diff --git a/apps/docs/images/muse-code-icon.svg b/apps/docs/images/muse-code-icon.svg new file mode 100644 index 00000000..542c7d67 --- /dev/null +++ b/apps/docs/images/muse-code-icon.svg @@ -0,0 +1,4 @@ + + Meta + + diff --git a/apps/docs/images/og-background.jpg b/apps/docs/images/og-background.jpg new file mode 100644 index 00000000..fd838d70 Binary files /dev/null and b/apps/docs/images/og-background.jpg differ diff --git a/apps/docs/images/opencode-logo-dark.svg b/apps/docs/images/opencode-logo-dark.svg new file mode 100644 index 00000000..6a67f627 --- /dev/null +++ b/apps/docs/images/opencode-logo-dark.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/apps/docs/images/opencode-logo.svg b/apps/docs/images/opencode-logo.svg new file mode 100644 index 00000000..a738ad87 --- /dev/null +++ b/apps/docs/images/opencode-logo.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/apps/docs/index.mdx b/apps/docs/index.mdx index 6b3eee98..2a61d4fb 100644 --- a/apps/docs/index.mdx +++ b/apps/docs/index.mdx @@ -4,86 +4,112 @@ description: "Context infrastructure for AI agents" mode: "custom" --- -export const HeroCard = ({ title, description, href, children }) => { - return ( - -
- {children} -
-
-

- {title} -

-

- {description} -

-
+import { AGENT_PROMPT } from "/snippets/agent-prompt.jsx" +import { HERO_TS, HERO_PY, HERO_CURL } from "/snippets/hero-samples.jsx" +import { AgentMarks, CopyPromptButton, PromptPanel } from "/snippets/agent-prompt-panel.jsx" + +export const HomeLink = ({ href, icon, children }) => ( +
+ + {children} + +) + +export const PathCard = ({ title, description, href, image, children }) => ( +
+ + - ) -} - -
-
-
-

- supermemory -

-

- Context infrastructure for AI agents. Use it with the API, your tools, your team, or run it yourself. -

- -
- -
- - Developer platform - - - Plugins and MCP - - - Self-hosting - +
+ {title} +

{description}

+
{children}
+) + +export const ListCard = ({ title, children }) => ( +
+
+
{title}
+
{children}
+
+
+) + +
+ +
+
+

+ Memory and continual learning for the world’s best agents. +

+

+ Supermemory gives your agent long-term memory of every user. Paste one prompt into your coding agent and it wires memory into your project. +

+ + +
+
+ +
+
+ +
+

Platform

+

Choose how you use supermemory

+

Start with the path that fits your app and your team.

+
+ + Quickstart + How it works + API reference + + + Supermemory MCP + Claude Code + Cursor + + + Local quickstart + Configuration + Model providers + +
+
+ +
+

Products

+

Explore features

+

Browse memory, retrieval, profiles, and connectors.

+
+ + Graph memory + SuperRAG + Search memories + User profiles + Filtering + Memory vs RAG + + + Add memories + Connectors + SMFS + Container tags + Customization + Migrate from mem0 + +
+
+
diff --git a/apps/docs/ingestion/add-memories.mdx b/apps/docs/ingestion/add-memories.mdx index ab19a505..fc0dce32 100644 --- a/apps/docs/ingestion/add-memories.mdx +++ b/apps/docs/ingestion/add-memories.mdx @@ -2,12 +2,12 @@ title: "Ingesting context to supermemory" sidebarTitle: "API" description: "Add text, files, and URLs to Supermemory" -icon: "plus" +icon: "/icons/hugeicons/plus-sign.svg" --- Send any raw content to Supermemory — conversations, documents, files, URLs. We extract the memories automatically. Pass `customId` to identify content and avoid duplicates, and `taskType: "superrag"` if you just need it searchable, not remembered — that's [5x cheaper](#memory-vs-superrag-ingestion) per token. -## Quick Start +## Quick start @@ -75,7 +75,7 @@ If an irrecoverable processing error occurs, the document is automatically delet --- -## Updating Content +## Updating content Use `customId` to update existing documents or conversations. When you send content with the same `customId`, Supermemory intelligently processes only what's new. @@ -144,7 +144,7 @@ content: formatConversation(messages) --- -## Upload Files +## Upload files Upload PDFs, images, and documents directly. @@ -178,7 +178,7 @@ Upload PDFs, images, and documents directly. -### Supported File Types +### Supported file types | Type | Formats | Processing | |------|---------|------------| @@ -189,6 +189,10 @@ Upload PDFs, images, and documents directly. **Limits:** 50MB max file size + +Scale and Enterprise include [advanced document extraction for PDFs](/concepts/content-types#advanced-document-extraction), with page-by-page OCR and descriptions of figures and diagrams. It is selected automatically from your organization's plan; no extra upload parameter is needed. Free, Pro, and Max keep standard PDF extraction, including OCR for scans. + + --- ## Parameters @@ -205,7 +209,7 @@ Upload PDFs, images, and documents directly. | `taskType` | `"memory" \| "superrag"` | Pipeline to run. Default `"memory"`. `"superrag"` skips fact extraction and profile updates, doing only chunk/embed/index — at 5x cheaper per token. See [SuperRAG ingestion](/concepts/super-rag#ingesting-as-pure-superrag-tasktype-superrag) | - + **Content Types:** ```typescript // Any text — conversations, notes, documents @@ -279,7 +283,7 @@ Upload PDFs, images, and documents directly. --- -## Processing Modes +## Processing modes ### Dreaming: dynamic vs instant @@ -313,7 +317,7 @@ Use `"superrag"` for reference material you want searchable but that shouldn't s --- -## Filtered Writes +## Filtered writes By default, when you add content, Supermemory uses **all** existing memories in the space as context for generating new memories. With **filtered writes**, you can scope this context to only memories from documents matching specific metadata. @@ -390,7 +394,7 @@ await client.add({ --- -## Processing Pipeline +## Processing pipeline When you add content, Supermemory: @@ -408,7 +412,7 @@ console.log(doc.status); // "queued" | "processing" | "done" ``` - + Process multiple documents with rate limiting: ```typescript @@ -441,7 +445,7 @@ console.log(doc.status); // "queued" | "processing" | "done" - Use `customId` to track and deduplicate - + | Status | Error | Cause | |--------|-------|-------| | 400 | BadRequestError | Missing required fields, invalid parameters | @@ -467,7 +471,7 @@ console.log(doc.status); // "queued" | "processing" | "done" ``` - + **Single delete:** ```typescript await client.documents.delete("doc_id_123"); @@ -494,7 +498,7 @@ console.log(doc.status); // "queued" | "processing" | "done" --- -## Next Steps +## Next steps - [How to backfill historical data](/ingestion/batch-ingest-historical-data) — Import dated content with the batch API - [Search Memories](/recall/search) — Query your content diff --git a/apps/docs/ingestion/batch-ingest-historical-data.mdx b/apps/docs/ingestion/batch-ingest-historical-data.mdx index 17ff4e1b..c727fac4 100644 --- a/apps/docs/ingestion/batch-ingest-historical-data.mdx +++ b/apps/docs/ingestion/batch-ingest-historical-data.mdx @@ -2,7 +2,7 @@ title: "How to backfill historical data into Supermemory" sidebarTitle: "Backfill historical data" description: "Backfill historical documents into Supermemory with documentDate, stable custom IDs, and the batch ingestion API." -icon: "history" +icon: "/icons/hugeicons/clock-01.svg" --- Use `POST /v3/documents/batch` to backfill exports, emails, messages, or other dated records. diff --git a/apps/docs/ingestion/document-operations.mdx b/apps/docs/ingestion/document-operations.mdx index 03a1ea99..565aaa58 100644 --- a/apps/docs/ingestion/document-operations.mdx +++ b/apps/docs/ingestion/document-operations.mdx @@ -1,13 +1,13 @@ --- -title: "Document Operations" +title: "Document operations" sidebarTitle: "Documents" description: "List, get, update, and delete your ingested documents" -icon: "files" +icon: "/icons/hugeicons/files-02.svg" --- Manage documents after ingestion using the SDK. -## List Documents +## List documents Retrieve paginated documents with filtering. @@ -77,7 +77,7 @@ Retrieve paginated documents with filtering. | `sort` | string | `createdAt` | Sort by `createdAt` or `updatedAt` | | `order` | string | `desc` | `desc` (newest) or `asc` (oldest) | - + ```typescript async function getAllDocuments(containerTag: string) { const all = []; @@ -100,7 +100,7 @@ Retrieve paginated documents with filtering. ``` - + ```typescript const documents = await client.documents.list({ containerTags: ["user_123"], @@ -116,7 +116,7 @@ Retrieve paginated documents with filtering. --- -## Get Document +## Get document Get a specific document with its processing status. @@ -145,7 +145,7 @@ Get a specific document with its processing status. -### Processing Status +### Processing status | Status | Description | |--------|-------------| @@ -156,7 +156,7 @@ Get a specific document with its processing status. | `done` | Ready for search | | `failed` | Processing failed | - + ```typescript async function waitForProcessing(docId: string) { while (true) { @@ -173,7 +173,7 @@ Get a specific document with its processing status. --- -## Update Document +## Update document Update a document's content or metadata. **Content changes** trigger full reprocessing; **metadata-only changes** (e.g. updating `accepted`, `version`) do not reindex. @@ -207,7 +207,7 @@ Update a document's content or metadata. **Content changes** trigger full reproc --- -## Delete Documents +## Delete documents Permanently remove documents. @@ -261,7 +261,7 @@ Deletes are permanent — no recovery. --- -## Processing Queue +## Processing queue Check documents currently being processed. @@ -288,7 +288,7 @@ Check documents currently being processed. --- -## Next Steps +## Next steps - [Memory Operations](/recall/memory-operations) — Advanced v4 memory operations - [Search](/recall/search) — Query your memories diff --git a/apps/docs/integrations/agent-framework.mdx b/apps/docs/integrations/agent-framework.mdx index 2fe19114..f8b872bf 100644 --- a/apps/docs/integrations/agent-framework.mdx +++ b/apps/docs/integrations/agent-framework.mdx @@ -318,16 +318,16 @@ except SupermemoryConfigurationError as e: ## Related docs - + How automatic profiling works - + Filtering and search modes - + Memory for OpenAI Agents SDK - + Memory for LangChain apps diff --git a/apps/docs/integrations/agno.mdx b/apps/docs/integrations/agno.mdx index 87248559..bd3a95fb 100644 --- a/apps/docs/integrations/agno.mdx +++ b/apps/docs/integrations/agno.mdx @@ -2,7 +2,7 @@ title: "Agno" sidebarTitle: "Agno" description: "Add persistent memory to Agno agents with Supermemory" -icon: "brain" +icon: "/icons/hugeicons/brain-01.svg" --- Agno agents are stateless by default. Each conversation starts fresh. Supermemory changes that - your agents can remember users, recall past conversations, and build on previous interactions. @@ -368,16 +368,16 @@ results = memory.search.memories( ## Related docs - + How automatic profiling works - + Filtering and search modes - + Memory for LangChain apps - + Multi-agent systems with memory diff --git a/apps/docs/integrations/ai-sdk.mdx b/apps/docs/integrations/ai-sdk.mdx index eede8429..6f93593e 100644 --- a/apps/docs/integrations/ai-sdk.mdx +++ b/apps/docs/integrations/ai-sdk.mdx @@ -2,7 +2,7 @@ title: "Vercel AI SDK" sidebarTitle: "Vercel AI SDK" description: "Use Supermemory with Vercel AI SDK for seamless memory management" -icon: "triangle" +icon: "/icons/hugeicons/triangle.svg" --- The Supermemory AI SDK provides native integration with Vercel's AI SDK through two approaches: **User Profiles** for automatic personalization and **Memory Tools** for agent-based interactions. @@ -11,7 +11,7 @@ The Supermemory AI SDK provides native integration with Vercel's AI SDK through Migrating to v2 from 1.4.x? Check the [migration guide](/migration/tools-v2-upgrade). - + Check out the NPM page for more details @@ -21,7 +21,7 @@ The Supermemory AI SDK provides native integration with Vercel's AI SDK through npm install @supermemory/tools ``` -## Quick Comparison +## Quick comparison | Approach | Use Case | Setup | |----------|----------|-------| @@ -30,7 +30,7 @@ npm install @supermemory/tools --- -## User Profiles with Middleware +## User profiles with middleware Automatically inject user profiles into every LLM call for instant personalization. @@ -69,7 +69,7 @@ Both `containerTag` and `customId` are required. ``` -### Memory Search Modes +### Memory search modes **Profile Mode (Default)** - Retrieves the user's complete profile: @@ -89,7 +89,7 @@ const model = withSupermemory(openai("gpt-4"), { containerTag: "user-123", custo const model = withSupermemory(openai("gpt-4"), { containerTag: "user-123", customId: "conv-1", mode: "full" }) ``` -### Custom Prompt Templates +### Custom prompt templates Customize how memories are formatted. The template receives `userMemories`, `generalSearchMemories`, and `searchResults` (raw array for filtering by metadata): @@ -115,7 +115,7 @@ const model = withSupermemory(anthropic("claude-3-sonnet"), { }) ``` -### Verbose Logging +### Verbose logging ```typescript const model = withSupermemory(openai("gpt-4"), { @@ -140,7 +140,7 @@ const model = withSupermemory(openai("gpt-5"), { }) ``` -### Persisting Tool Calls (default: off) +### Persisting tool calls (default: off) By default, saved conversations include only user and assistant text — tool calls and tool results are dropped, since tool payloads are often large and low-signal and would pollute memory extraction. To persist the full tool round trip (tool calls with their arguments, plus tool results, in their original order), set `includeToolCalls: true`: @@ -154,7 +154,7 @@ const model = withSupermemory(openai("gpt-5"), { --- -## Memory Tools +## Memory tools Add memory capabilities to AI agents with search, add, and fetch operations. @@ -172,7 +172,7 @@ const result = await streamText({ }) ``` -### Available Tools +### Available tools **Search Memories** - Semantic search through user memories: @@ -196,7 +196,7 @@ const result = await streamText({ // AI will call: addMemory({ memory: "User is allergic to peanuts" }) ``` -### Using Individual Tools +### Using individual tools For more control, import tools separately: @@ -216,7 +216,7 @@ const result = await streamText({ }) ``` -### Tool Results +### Tool results ```typescript // searchMemories result diff --git a/apps/docs/integrations/cartesia.mdx b/apps/docs/integrations/cartesia.mdx index 5b790545..8e514ed9 100644 --- a/apps/docs/integrations/cartesia.mdx +++ b/apps/docs/integrations/cartesia.mdx @@ -1,6 +1,6 @@ --- title: "Cartesia" -sidebarTitle: "Cartesia (Voice)" +sidebarTitle: "Cartesia (voice)" description: "Integrate Supermemory with Cartesia for conversational memory in voice AI agents" icon: "/images/cartesia.svg" --- @@ -55,7 +55,7 @@ memory_agent = SupermemoryCartesiaAgent( ) ``` -## Agent Wrapper Pattern +## Agent wrapper pattern The `SupermemoryCartesiaAgent` wraps your existing `LlmAgent` to add memory capabilities: @@ -82,11 +82,11 @@ async def get_agent(env, call_request): app = VoiceAgentApp(get_agent=get_agent) ``` -## How It Works +## How it works When integrated with Cartesia Line, Supermemory provides two key functionalities: -### 1. Memory Retrieval +### 1. Memory retrieval When a `UserTurnEnded` event is detected, Supermemory retrieves relevant memories: @@ -94,15 +94,15 @@ When a `UserTurnEnded` event is detected, Supermemory retrieves relevant memorie - **Dynamic Profile**: Recent context and preferences - **Search Results**: Semantically relevant past memories -### 2. Context Enhancement +### 2. Context enhancement Retrieved memories are formatted and injected into the agent's system prompt before processing, giving the model awareness of past conversations. -### 3. Background Storage +### 3. Background storage Conversations are automatically stored in Supermemory (non-blocking) for future retrieval. -## Memory Modes +## Memory modes | Mode | Static Profile | Dynamic Profile | Search Results | Use Case | | ----------- | -------------- | --------------- | -------------- | ------------------------------ | @@ -110,7 +110,7 @@ Conversations are automatically stored in Supermemory (non-blocking) for future | `"query"` | No | No | Yes | Finding relevant past context | | `"full"` | Yes | Yes | Yes | Complete memory (default) | -## Configuration Options +## Configuration options You can customize how memories are retrieved and used: @@ -132,7 +132,7 @@ SupermemoryCartesiaAgent.MemoryConfig( | `mode` | str | "full" | Memory retrieval mode: `"profile"`, `"query"`, or `"full"` | | `system_prompt` | str | "Based on previous conversations:\n\n" | Prefix text for memory context | -### Agent Parameters +### Agent parameters ```python SupermemoryCartesiaAgent( @@ -158,7 +158,7 @@ SupermemoryCartesiaAgent( | `config` | MemoryConfig | No | Advanced configuration | | `base_url` | str | No | Custom API endpoint | -## Container Tags +## Container tags Container tags allow you to organize memories across multiple dimensions: @@ -179,7 +179,7 @@ Memories are stored with all tags: } ``` -## Automatic Document Grouping +## Automatic document grouping The SDK **automatically groups all messages from the same conversation** into a single Supermemory document using `custom_id`: @@ -197,7 +197,7 @@ memory_agent = SupermemoryCartesiaAgent( - All messages from that conversation are appended to the same document - This ensures conversation continuity and proper memory generation -## Example: Basic Voice Agent with Memory +## Example: Basic voice agent with memory Here's a complete example of a Cartesia Line voice agent with Supermemory integration: @@ -238,7 +238,7 @@ if __name__ == "__main__": app.run(host="0.0.0.0", port=8000) ``` -## Example: Advanced Agent with Tools +## Example: Advanced agent with tools Here's an example with custom tools and multi-tag support: diff --git a/apps/docs/integrations/claude-code.mdx b/apps/docs/integrations/claude-code.mdx index 07917820..1328393d 100644 --- a/apps/docs/integrations/claude-code.mdx +++ b/apps/docs/integrations/claude-code.mdx @@ -1,17 +1,15 @@ --- title: "Claude Code" sidebarTitle: "Claude Code" -description: "Claude Code Supermemory Plugin — persistent memory across coding sessions" +description: "Supermemory plugin for Claude Code. Keeps memory across coding sessions." icon: "/images/claude-code-icon.svg" --- -
- Claude Code + Supermemory -
+Claude Code + Supermemory [supermemory](https://github.com/supermemoryai/claude-supermemory) is a Claude Code plugin that gives your AI persistent memory across sessions. Your agent remembers what you worked on — across sessions, across projects. @@ -19,7 +17,7 @@ icon: "/images/claude-code-icon.svg" **Prefer to keep everything on your machine?** This plugin works with [self-hosted Supermemory](/self-hosting/overview) — run `npx supermemory local`, then set `baseUrl` in project config (or point your install at your local API) and use the API key printed on first boot. -## Install the Plugin +## Install the plugin > **Requires Node.js 18+** on your PATH — the memory hooks run as Node scripts. @@ -67,7 +65,7 @@ Create a Supermemory API key from the [API Keys](https://console.supermemory.ai/ -## How It Works +## How it works Once installed, the plugin runs automatically: @@ -88,14 +86,14 @@ Once installed, the plugin runs automatically: ## Configuration -### Environment Variables +### Environment variables ```bash SUPERMEMORY_CC_API_KEY=sm_... # Required SUPERMEMORY_DEBUG=true # Optional: enable debug logging ``` -### Global Settings +### Global settings Create `~/.supermemory-claude/settings.json`: @@ -118,7 +116,7 @@ Create `~/.supermemory-claude/settings.json`: | `signalTurnsBefore` | Context turns before a signal (default: 3) | | `includeTools` | Tools to explicitly capture | -### Project Config +### Project config Per-repo overrides in `.claude/.supermemory-claude/config.json`. Run `/supermemory:project-config` or create manually: @@ -138,14 +136,14 @@ Per-repo overrides in `.claude/.supermemory-claude/config.json`. Run `/supermemo | `personalContainerTag` | Override personal container | | `repoContainerTag` | Override team container tag | -## Next Steps +## Next steps - + Source code, issues, and detailed README. - + Memory for your Cursor chats. diff --git a/apps/docs/integrations/claude-memory.mdx b/apps/docs/integrations/claude-memory.mdx index ba7fb90c..6afc7947 100644 --- a/apps/docs/integrations/claude-memory.mdx +++ b/apps/docs/integrations/claude-memory.mdx @@ -17,7 +17,7 @@ This integration works with Claude's built-in `memory` tool type, introduced in npm install @supermemory/tools @anthropic-ai/sdk ``` -## Quick Start +## Quick start ```typescript import Anthropic from "@anthropic-ai/sdk" @@ -98,7 +98,7 @@ const memoryTool = createClaudeMemoryTool(process.env.SUPERMEMORY_API_KEY!, { }) ``` -## How It Works +## How it works Claude's memory tool uses a file-system metaphor. Supermemory maps these operations to document storage: @@ -111,7 +111,7 @@ Claude's memory tool uses a file-system metaphor. Supermemory maps these operati | `delete` | Delete document | | `rename` | Move document to new path | -### Memory Path Structure +### Memory path structure All memory paths must start with `/memories/`: @@ -125,9 +125,9 @@ All memory paths must start with `/memories/`: Paths are normalized for storage: `/memories/preferences` is stored as `--memories--preferences`. -## Commands Reference +## Commands reference -### View (Read/List) +### View (read/list) ```typescript // List directory contents @@ -150,7 +150,7 @@ Paths are normalized for storage: `/memories/preferences` is stored as `--memori } ``` -### String Replace +### String replace ```typescript { @@ -188,7 +188,7 @@ Paths are normalized for storage: `/memories/preferences` is stored as `--memori } ``` -## Complete Example +## Complete example ```typescript import Anthropic from "@anthropic-ai/sdk" @@ -253,14 +253,14 @@ async function runConversation() { runConversation() ``` -## Environment Variables +## Environment variables ```bash SUPERMEMORY_API_KEY=your_supermemory_key ANTHROPIC_API_KEY=your_anthropic_key ``` -## Comparison with Other Approaches +## Comparison with other approaches | Feature | Claude Memory Tool | OpenAI SDK Tools | AI SDK Tools | |---------|-------------------|------------------|--------------| @@ -269,14 +269,14 @@ ANTHROPIC_API_KEY=your_anthropic_key | Path organization | ✅ Hierarchical | ❌ Tags only | ❌ Tags only | | Integration | Anthropic SDK only | OpenAI SDK only | Vercel AI SDK | -## Next Steps +## Next steps - + Use with Vercel AI SDK for streamlined development - + Memory tools for OpenAI function calling diff --git a/apps/docs/integrations/codex.mdx b/apps/docs/integrations/codex.mdx index 17978460..1ad88406 100644 --- a/apps/docs/integrations/codex.mdx +++ b/apps/docs/integrations/codex.mdx @@ -1,8 +1,8 @@ --- -title: "OpenAI Codex" -sidebarTitle: "OpenAI Codex" -description: "codex-supermemory — persistent memory for OpenAI Codex CLI" -icon: "terminal" +title: "Codex" +sidebarTitle: "Codex" +description: "Persistent memory for the OpenAI Codex CLI with the codex-supermemory plugin." +icon: "/images/codex.svg" --- [codex-supermemory](https://github.com/supermemoryai/codex-supermemory) wires Supermemory into the [OpenAI Codex CLI](https://github.com/openai/codex) via hooks and skills. Your agent gets **two layers of memory**: @@ -14,7 +14,7 @@ icon: "terminal" **Prefer to keep everything on your machine?** This plugin works with [self-hosted Supermemory](/self-hosting/overview) — run `npx supermemory local`, then `export SUPERMEMORY_API_URL="http://localhost:6767"` (or set `baseUrl` in `~/.codex/supermemory.json`) and use the API key printed on first boot. -## Install the Plugin +## Install the plugin ```bash npx codex-supermemory@latest install @@ -59,7 +59,7 @@ Alternatively: -## How It Works +## How it works Once installed, the plugin runs on every Codex session: @@ -71,7 +71,7 @@ Once installed, the plugin runs on every Codex session: - **Incremental capture** — Memories are saved every N turns (default: 3) so mid-session context is available for later prompts in the same session. - **Privacy** — Content wrapped in `...` is redacted before storage. -### Memory Scopes +### Memory scopes | Tag | Derived from | Description | |-----|-------------|-------------| @@ -89,7 +89,7 @@ Override tags in `~/.codex/supermemory.json` if needed: Set `SUPERMEMORY_ISOLATE_WORKTREES=true` to keep each worktree isolated. -## Explicit Memory Skills +## Explicit memory skills | Skill | Description | |-------|-------------| @@ -110,7 +110,7 @@ Example prompts: > Is Supermemory connected? ``` -## Verify Installation +## Verify installation ```bash npx codex-supermemory status @@ -163,14 +163,14 @@ export SUPERMEMORY_DEBUG=true tail -f ~/.codex-supermemory.log ``` -## Next Steps +## Next steps - + Source code, issues, and detailed README. - + Memory for your Cursor chats. diff --git a/apps/docs/integrations/convex.mdx b/apps/docs/integrations/convex.mdx index 92f106e5..d13aa6a3 100644 --- a/apps/docs/integrations/convex.mdx +++ b/apps/docs/integrations/convex.mdx @@ -2,7 +2,7 @@ title: "Convex" sidebarTitle: "Convex" description: "Add persistent memory to Convex apps with Supermemory" -icon: "database" +icon: "/icons/hugeicons/database-01.svg" --- Convex apps don't have built-in memory for AI. Supermemory fixes that. You get a memory layer that stores conversations, builds user profiles, and gives your AI context about who it's talking to. @@ -193,16 +193,16 @@ export const listMemories = query({ ## Related docs - + How automatic profiling works - + Filtering and search modes - + Memory middleware for Next.js - + Memory for LangChain apps diff --git a/apps/docs/integrations/crewai.mdx b/apps/docs/integrations/crewai.mdx index 92c9772b..cc6b038a 100644 --- a/apps/docs/integrations/crewai.mdx +++ b/apps/docs/integrations/crewai.mdx @@ -2,7 +2,7 @@ title: "CrewAI" sidebarTitle: "CrewAI" description: "Add persistent memory to CrewAI agents with Supermemory" -icon: "users" +icon: "/icons/hugeicons/user-multiple.svg" --- CrewAI agents don't remember anything between runs by default. Supermemory fixes that. You get a memory layer that stores what happened, who the user is, and what they care about. Your crews can pick up where they left off. @@ -31,7 +31,7 @@ OPENAI_API_KEY=your-openai-api-key Get your Supermemory API key from [console.supermemory.ai](https://console.supermemory.ai). -## Basic Integration +## Basic integration Initialize Supermemory and inject user context into your agent's backstory: @@ -81,7 +81,7 @@ Use this context to personalize your work.""", --- -## Core Concepts +## Core concepts ### User profiles @@ -323,16 +323,16 @@ results = memory.search.memories( ## Related docs - + How automatic profiling works - + Filtering and search modes - + Memory for LangChain apps - + Memory middleware for Next.js diff --git a/apps/docs/integrations/cursor.mdx b/apps/docs/integrations/cursor.mdx index 67cbf681..59ec1fdd 100644 --- a/apps/docs/integrations/cursor.mdx +++ b/apps/docs/integrations/cursor.mdx @@ -60,7 +60,7 @@ Restart Cursor after installing the plugin or changing credentials. Check the connection any time with `/supermemory-status`. - + The slash commands just run the plugin's CLI for you. To drive it yourself: ```bash @@ -74,7 +74,7 @@ node "${CURSOR_PLUGIN_ROOT}/dist/cli.js" logout Credentials are stored in `~/.supermemory-cursor/credentials.json`. -## How It Works +## How it works | Layer | What it does | |-------|--------------| @@ -85,7 +85,7 @@ Credentials are stored in `~/.supermemory-cursor/credentials.json`. | Context gatherer | Fans out targeted searches before substantial work | | Always-on rule | Makes the agent recall relevant history proactively | -### Skills and Commands +### Skills and commands | Name | Type | Description | |------|------|-------------| @@ -98,7 +98,7 @@ Credentials are stored in `~/.supermemory-cursor/credentials.json`. | `supermemory-config` | Command | Create or edit the project config file | | `supermemory-logout` | Command | Disconnect Supermemory from Cursor | -## MCP Tools +## MCP tools | Tool | Description | |------|-------------| @@ -120,9 +120,9 @@ Every tool that takes a `container` argument accepts: `user` and `project` write to the same repository container. The `sm_scope` metadata field is what keeps personal and session memories separate from explicit project knowledge when an agent asks for one scope. -## Container Tags +## Container tags -Cursor shares one repository tag with the [Claude Code](/integrations/claude-code), [OpenAI Codex](/integrations/codex), and [OpenCode](/integrations/opencode) plugins, so agents working on the same repo read and write the same memory: +Cursor shares one repository tag with the [Claude Code](/integrations/claude-code), [Muse Code](/integrations/muse-code), [OpenAI Codex](/integrations/codex), and [OpenCode](/integrations/opencode) plugins, so agents working on the same repo read and write the same memory: ```text repo___ @@ -195,14 +195,14 @@ The plugin still reads the former `cursor_user_*` and `cursor_project_*` tags, a You can also set these from the agent with `supermemory_set_config`, or edit the file by hand. -## Log Out +## Log out Run `/supermemory-logout` in Cursor. This removes the stored credentials. Your memories in Supermemory are preserved. -## Next Steps +## Next steps - + Source code, issues, and detailed README. diff --git a/apps/docs/integrations/eve.mdx b/apps/docs/integrations/eve.mdx new file mode 100644 index 00000000..425c28eb --- /dev/null +++ b/apps/docs/integrations/eve.mdx @@ -0,0 +1,149 @@ +--- +title: "Eve" +sidebarTitle: "Eve" +description: "Give your Eve agent memory across conversations with Supermemory." +icon: "/images/eve.svg" +--- + +Your next conversation can start where the last one left off. Supermemory gives your [Eve](https://eve.dev) agent the context to continue a project: what was decided, what changed, and the source material behind it. + +You don't need to build your own parsing, embedding, indexing or memory-retrieval pipeline. Supermemory handles that infrastructure. Eve's memory scope and namespace let you keep context separated by user or workspace. + +## Add Supermemory + +Start with an existing Eve project, Node.js 24 or newer, and an Eve version compatible with `eve@^0.47.3`. + + + + Run this from your Eve project: + + ```bash + eve add memory/supermemory + ``` + + Eve installs `@supermemory/eve` and creates `agent/memory/supermemory.ts`, the file that connects your agent to Supermemory. + + + + Create an [API key in the Supermemory console](https://console.supermemory.ai/keys) and add it to your project's environment: + + ```bash .env.local + SUPERMEMORY_API_KEY="your-supermemory-api-key" + ``` + + + + Start or restart Eve to load the provider and API key: + + ```bash + eve dev + ``` + + Automatic recall and conversation capture are enabled by default. The memory tools are available to your agent alongside its existing tools. + + + +You can also [install the provider manually](#manual-installation). + +## How memory works + +Two conversations about the same launch show the three parts working together: session history, indexed sources and memories. + + + +After a successful turn, the provider saves the user and assistant messages as **session history**. Supermemory processes that conversation into durable **memories**, such as the launch date or the decision to keep the first release web-only. Capture is automatic; processing happens asynchronously. + +Files take a separate path. When Eve works with an attachment, URL, or text, [SuperRAG](/concepts/super-rag) parses or transcribes it into an **indexed source** the agent can read. Eve can then save a useful conclusion as a memory, retaining the source document's ID. In the example, the budget stays connected to the launch brief. + +Before a later turn, the provider loads the [user profile](/concepts/user-profiles) and searches for relevant saved context. Eve can read an earlier session or follow a source-backed memory to the original document when it needs more detail. The new conversation can then use both the earlier decision and the evidence behind it. Recall also runs after context compaction. + +## Memory tools + +The provider gives Eve seven tools alongside automatic recall and capture. The generated file is named `supermemory.ts`, so Eve prefixes their names with `supermemory__`. + + + + | Tool | Purpose | + | --- | --- | + | `search` | Find relevant memories and session history in the current memory scope. | + | `read_session` | Read a stored conversation found through search. | + | `read_document` | Read sections of a processed source, fetching more as needed. | + | `remember` | Save a standalone fact, preference, decision, or correction; optionally retain its `sourceDocumentId`. | + | `extract` | Parse, transcribe, and index an Eve attachment, URL, or text with SuperRAG. | + | `forget` | Remove one memory by ID. | + | `forget_matching` | Preview memories within a requested boundary, then remove selected IDs. | + + + + Eve can find a specific memory with `search` and remove it with `forget`. For a broader request, `forget_matching` supports a dry run that returns candidate memories. Its tool instructions tell Eve to show that preview, ask you to confirm, and remove the exact IDs you approved. + + Forgetting removes derived memories. The original session history and source documents remain stored. + + +## Choose whose memory Eve uses + +The generated memory file uses Eve's `byPrincipal` scope. In an authenticated application, memory follows the caller's identity. During `eve dev`, it uses the shared `local-dev` scope. Outside local development, anonymous and runtime principals have memory disabled. + +For a team or multi-tenant application, derive the scope from verified user and tenant identity. Eve resolves that scope before the provider runs, so the agent's tools cannot choose another user's memory. See [Eve's multi-tenant memory guide](https://eve.dev/docs/patterns/multi-tenant-memory). + +Eve also supplies a default namespace for the memory slot. You only need to set `namespace` yourself when you want a custom memory domain. Keep it stable: changing it selects a different memory space. [Eve's namespace documentation](https://eve.dev/docs/memory#namespace) explains the defaults and how to share a domain intentionally. + +## Configure the provider + +Edit the options passed to `supermemory(...)` in `agent/memory/supermemory.ts`. The generated file only needs your API key; the defaults enable automatic search and capture. + +You can adjust those behaviors independently. Set `autoSearch.enabled` to `false` to disable automatic search while keeping profile recall. Set `capture.enabled` to `false` to stop saving completed turns automatically. Both settings leave the explicit memory tools available. + + + | Option | Default | Purpose | + | --- | --- | --- | + | `apiKey` | Required | Supermemory API key, or a function returning the key synchronously or asynchronously. | + | `containerTagPrefix` | `"eve_agent"` | Prefix for storage tags derived from Eve's scope. Keep it stable to access the same data. | + | `autoSearch.enabled` | `true` | Search for context relevant to the current request during recall. | + | `profileContext.timeZone` | `"UTC"` | IANA time zone used to format profile context. | + | `capture.enabled` | `true` | Save completed turns automatically. | + | `capture.taskType` | `"memory"` | Generate memories from conversations. Use `"superrag"` to index them for document retrieval only. | + | `capture.dreaming` | `"dynamic"` | Memory generation mode: `"dynamic"` or `"instant"`. | + | `capture.entityContext` | Built-in capture policy | Instructions for what durable information to learn from conversations. | + | `capture.metadata` | `{}` | Additional metadata attached to captured conversation documents. | + + Namespace, description, and scope are Eve memory-slot settings. Configure them on `defineMemory(...)`, outside the provider options. + + +## Manual installation + +If you prefer to create the memory file yourself, install the package in your Eve project: + +```bash +npm install @supermemory/eve +``` + +Then create the same memory slot that `eve add` generates: + +```typescript agent/memory/supermemory.ts +import supermemory from "@supermemory/eve"; +import { defineMemory } from "eve/memory"; +import { byPrincipal } from "eve/memory/scope"; + +export default defineMemory({ + description: "Recall and manage durable context for the current user.", + provider: supermemory({ + apiKey: process.env.SUPERMEMORY_API_KEY!, + }), + scope: byPrincipal, +}); +``` + +Set `SUPERMEMORY_API_KEY` in `.env.local` and start your agent as described in [Add Supermemory](#add-supermemory). + +For implementation details, see the [provider repository](https://github.com/supermemoryai/eve-supermemory) and [Eve's Supermemory integration](https://eve.dev/integrations/supermemory). diff --git a/apps/docs/integrations/grok-bot.mdx b/apps/docs/integrations/grok-bot.mdx index 878a64cc..b3d52bc5 100644 --- a/apps/docs/integrations/grok-bot.mdx +++ b/apps/docs/integrations/grok-bot.mdx @@ -45,20 +45,20 @@ Grok Bot picks these up from what you ask. There are no slash commands. | `memory-save` | "Remember that we use Vitest for unit tests" | | `memory-search` | "What do you remember about our database schema?" | -## Log Out +## Log out Ask Grok Bot to `Disconnect Supermemory`. This removes the stored credentials. Your memories in Supermemory are preserved. -## Next Steps +## Next steps - + Source code, issues, and detailed README. - + The same plugin, installed through Cursor. diff --git a/apps/docs/integrations/hermes.mdx b/apps/docs/integrations/hermes.mdx index 7e5c82c7..62518786 100644 --- a/apps/docs/integrations/hermes.mdx +++ b/apps/docs/integrations/hermes.mdx @@ -1,16 +1,16 @@ --- title: "Hermes" sidebarTitle: "Hermes" -description: "Hermes Supermemory Plugin — semantic memory, profiles, and search across Telegram, Discord, Slack, CLI, and more" +description: "Supermemory plugin for Hermes. Semantic memory, profiles and search across Telegram, Discord, Slack, the CLI and more." icon: "/images/hermes.svg" --- [Hermes agent](https://github.com/NousResearch/hermes-agent) ships a native **supermemory** memory provider: semantic long-term memory, profile recall, search, explicit memory tools, and session-aware ingest — not a bolt-on script the model might skip. Hermes runs across Telegram, Discord, Slack, WhatsApp, Signal, and the CLI from one gateway. -Hermes also includes built-in **`MEMORY.md`** and **`USER.md`**. supermemory adds **structure and isolation** (profile-scoped and optional multi-container tags) plus retrieval that goes beyond a single flat file. +Hermes also ships with built-in `MEMORY.md` and `USER.md` files. Supermemory adds structure and isolation (profile-scoped and optional multi-container tags), plus retrieval that goes beyond a single flat file. -## Get Your API Key +## Get your API key Create a supermemory API key from the [API Keys](https://console.supermemory.ai/keys) page in the console. During `hermes memory setup` you can paste it when prompted, or persist it in your environment: @@ -36,7 +36,7 @@ echo 'SUPERMEMORY_API_KEY=sm_...' >> ~/.hermes/.env (Adjust the path if your Hermes home directory differs.) -## How It Works +## How it works Once configured, the provider runs through Hermes’s normal memory lifecycle: @@ -138,14 +138,14 @@ Example profile-scoped container: If you run your own supermemory API, set **`base_url`** (and any other host-specific options) in `supermemory.json` or via env as documented in the [upstream plugin README](https://github.com/NousResearch/hermes-agent/tree/main/plugins/memory/supermemory) — alongside your key and container settings. -## Next Steps +## Next steps Full config table, env vars, and multi-container details. - + Multi-platform memory for Telegram, WhatsApp, Discord, and more. diff --git a/apps/docs/integrations/langchain.mdx b/apps/docs/integrations/langchain.mdx index 5d8e69c7..87d4494a 100644 --- a/apps/docs/integrations/langchain.mdx +++ b/apps/docs/integrations/langchain.mdx @@ -2,7 +2,7 @@ title: "LangChain" sidebarTitle: "LangChain" description: "Build AI agents with persistent memory using LangChain and Supermemory" -icon: "link" +icon: "/icons/hugeicons/link-01.svg" --- Build AI applications with LangChain that remember context across conversations. Supermemory handles memory storage, retrieval, and user profiling while LangChain manages your conversation flow. @@ -32,7 +32,7 @@ OPENAI_API_KEY=your-openai-api-key Get your Supermemory API key from [console.supermemory.ai](https://console.supermemory.ai). -## Basic Integration +## Basic integration Initialize both clients and set up a simple chat function with memory: @@ -90,9 +90,9 @@ Relevant Memories: --- -## Core Concepts +## Core concepts -### User Profiles +### User profiles Supermemory automatically maintains user profiles with two types of information: @@ -110,7 +110,7 @@ print(result.profile.static) # ["User is a Python developer", "Prefers dark mo print(result.profile.dynamic) # ["Currently working on API integration", "Debugging auth issues"] ``` -### Memory Storage +### Memory storage Content you add is automatically processed into searchable memories: @@ -129,7 +129,7 @@ memory.add( ) ``` -### Memory Search +### Memory search Search returns both extracted memories and document chunks: @@ -147,7 +147,7 @@ for r in results.results: --- -## Complete Example: Code Review Assistant +## Complete example: Code review assistant Here's a full example of a code review assistant that learns from past reviews and adapts to the user's coding style: @@ -254,9 +254,9 @@ def calc(x, y): --- -## Advanced Patterns +## Advanced patterns -### Conversation History with Memory +### Conversation history with memory Maintain multi-turn conversations while building long-term memory: @@ -319,7 +319,7 @@ Use this context to provide personalized, contextual responses.""" self.messages = [] ``` -### Metadata Filtering +### Metadata filtering Use metadata to organize and filter memories: @@ -348,7 +348,7 @@ results = memory.search.memories( ) ``` -### Batch Memory Operations +### Batch memory operations Efficiently store multiple memories: @@ -370,19 +370,19 @@ for note in notes: --- -## Next Steps +## Next steps - + Deep dive into automatic user profiling - + Advanced search patterns and filtering - + Native OpenAI integration with memory tools - + Memory middleware for Next.js apps diff --git a/apps/docs/integrations/langgraph.mdx b/apps/docs/integrations/langgraph.mdx index 47cfe284..92f611fb 100644 --- a/apps/docs/integrations/langgraph.mdx +++ b/apps/docs/integrations/langgraph.mdx @@ -408,19 +408,19 @@ app = graph.compile(checkpointer=checkpointer) ## Next steps - + Deep dive into automatic user profiling - + Advanced search patterns and filtering - + Native OpenAI integration with memory tools - + Memory middleware for Next.js apps diff --git a/apps/docs/integrations/mastra.mdx b/apps/docs/integrations/mastra.mdx index 089816f4..968f0f78 100644 --- a/apps/docs/integrations/mastra.mdx +++ b/apps/docs/integrations/mastra.mdx @@ -11,7 +11,7 @@ Integrate Supermemory with [Mastra](https://mastra.ai) to give your AI agents pe Migrating to v2 from 1.4.x? Check the [migration guide](/migration/tools-v2-upgrade). - + Check out the NPM page for more details @@ -21,7 +21,7 @@ Integrate Supermemory with [Mastra](https://mastra.ai) to give your AI agents pe npm install @supermemory/tools @mastra/core ``` -## Quick Start +## Quick start Wrap your agent config with `withSupermemory` to add memory capabilities: @@ -65,7 +65,7 @@ const response = await agent.generate("What do you know about me?") --- -## How It Works +## How it works The Mastra integration uses Mastra's native [Processor](https://mastra.ai/docs/agents/processors) interface: @@ -95,7 +95,7 @@ sequenceDiagram --- -## Configuration Options +## Configuration options | Option | Type | Default | Description | |--------|------|---------|-------------| @@ -110,7 +110,7 @@ sequenceDiagram --- -## Memory Search Modes +## Memory search modes **Profile Mode (Default)** - Retrieves the user's complete profile without query-based filtering: @@ -476,11 +476,11 @@ const agent = new Agent(withSupermemory( ## Next Steps - + Use with Vercel AI SDK for streamlined development - + Learn about user profile management diff --git a/apps/docs/integrations/memory-graph.mdx b/apps/docs/integrations/memory-graph.mdx index decd5f52..719fd547 100644 --- a/apps/docs/integrations/memory-graph.mdx +++ b/apps/docs/integrations/memory-graph.mdx @@ -2,12 +2,12 @@ title: 'Memory Graph' sidebarTitle: "Memory Graph" description: 'Interactive visualization for documents, memories and connections' -icon: "network" +icon: "/icons/hugeicons/hierarchy-square-01.svg" --- Memory Graph is a React component that visualizes your Supermemory documents and memories as an interactive network. Documents appear as rectangular nodes, memories as hexagonal nodes, and connections between them show relationships and similarity. - + Check out the NPM page for more details @@ -19,7 +19,7 @@ npm install @supermemory/memory-graph **Requirements:** React 18.0.0 or higher -## Quick Start +## Quick start ```tsx 'use client'; // For Next.js App Router @@ -59,7 +59,7 @@ export default function GraphPage() { } ``` -## Backend API Route +## Backend API route Create an API route to fetch documents from Supermemory: @@ -150,7 +150,7 @@ app.get('/api/graph', async (req, res) => { ## Examples -### With Pagination +### With pagination ```tsx 'use client'; @@ -200,7 +200,7 @@ export default function PaginatedGraph() { } ``` -### Highlighting Search Results +### Highlighting search results ```tsx ``` -### Controlled Space Selection +### Controlled space selection ```tsx ``` -### Custom Empty State +### Custom empty state ```tsx @@ -234,9 +234,9 @@ export default function PaginatedGraph() { --- -## Props Reference +## Props reference -### Core Props +### Core props | Prop | Type | Default | Description | |------|------|---------|-------------| @@ -246,7 +246,7 @@ export default function PaginatedGraph() { | `variant` | `"console" \| "consumer"` | `"console"` | Visual variant | | `children` | `ReactNode` | - | Custom empty state content | -### Pagination Props +### Pagination props | Prop | Type | Default | Description | |------|------|---------|-------------| @@ -256,7 +256,7 @@ export default function PaginatedGraph() { | `loadMoreDocuments` | `() => Promise` | - | Callback to load more | | `autoLoadOnViewport` | `boolean` | `true` | Auto-load when 80% visible | -### Display Props +### Display props | Prop | Type | Default | Description | |------|------|---------|-------------| @@ -265,7 +265,7 @@ export default function PaginatedGraph() { | `highlightsVisible` | `boolean` | `true` | Whether highlights shown | | `occludedRightPx` | `number` | `0` | Pixels occluded on right | -### Controlled State Props +### Controlled state props | Prop | Type | Description | |------|------|-------------| @@ -275,7 +275,7 @@ export default function PaginatedGraph() { --- -## Data Types +## Data types ### DocumentWithMemories @@ -358,6 +358,6 @@ The graph handles hundreds of nodes efficiently through: For very large datasets (1000+ documents), use pagination to load data in chunks. -## Browser Support +## Browser support Works in all modern browsers supporting Canvas 2D API, ES2020, and CSS custom properties. Tested on Chrome, Firefox, Safari, and Edge. diff --git a/apps/docs/integrations/muse-code.mdx b/apps/docs/integrations/muse-code.mdx new file mode 100644 index 00000000..8eaa0d63 --- /dev/null +++ b/apps/docs/integrations/muse-code.mdx @@ -0,0 +1,138 @@ +--- +title: "Muse Code" +sidebarTitle: "Muse Code" +description: "Persistent memory for Meta Muse Code with the muse-supermemory plugin." +icon: "/images/muse-code-icon.svg" +--- + +[muse-supermemory](https://github.com/supermemoryai/muse-supermemory) is a native [Muse Code](https://dev.meta.ai/docs/muse-code) plugin that gives your agent persistent memory across sessions. Your agent remembers what you worked on — across sessions, across projects. + + +**Prefer to keep everything on your machine?** This plugin works with [self-hosted Supermemory](/self-hosting/overview) — run `npx supermemory local`, then set `baseUrl` in `.muse/supermemory.json` (Muse clears hook env, so `SUPERMEMORY_API_URL` may not reach the plugin) and use the API key printed on first boot. + + +## Install the plugin + +> **Requires Node.js 18+** on your PATH — the memory hooks and MCP proxy run as Node scripts. + +In a Muse session, open `/plugins` and install from the marketplace. Or from the CLI: + +```bash +export MUSE_EXPERIMENTAL_PLUGINS=1 +muse plugins marketplace add supermemory https://github.com/supermemoryai/muse-supermemory +muse plugins install supermemory@supermemory +muse plugins approve supermemory +``` + +`approve` trusts the runtime capabilities (hooks + MCP). Without it, the plugin is installed but inert. + +Local bundle (a clone of the repo): + +```bash +export MUSE_EXPERIMENTAL_PLUGINS=1 +muse plugins install . --scope user +muse plugins approve supermemory +``` + +## Authenticate + +Muse runs hooks with a **cleared environment**, so an exported API key in your shell does not reach them. Auth is file-based. + +The first session opens a browser login and writes `~/.supermemory-muse/credentials.json`. + +If you already logged in through the [Claude Code plugin](/integrations/claude-code), that key is reused from `~/.supermemory-claude/credentials.json`. + +Or write the file yourself with a key from [API Keys](https://console.supermemory.ai/keys): + +```json +{ "apiKey": "sm_..." } +``` + +Check the connection any time with `/supermemory:status`. + +## How it works + +Two layers, same as the other coding plugins: + +| Layer | When | What it does | +| --- | --- | --- | +| Session profile | `SessionStart` | Injects up to 5 persistent profile facts and 5 recent memories for this repo | +| Prompt recall | `UserPromptSubmit` | Searches supermemory with the prompt, injects up to 5 new hits (similarity ≥ 0.55) | +| Auto-approve | `PreToolUse` | Allows read-only supermemory MCP tools without a permission prompt | +| Auto-capture | `Stop` | Saves new user prompts and assistant messages from Muse's `session.jsonl` | +| MCP tools | on demand | Search, save, list, and manage memories explicitly | + +Recalled lines are marked `◪`. When the model uses one, it keeps that mark and says "from supermemory" — never "from memory". + +Slash commands and very short prompts skip recall. Timeouts fail open so a slow network never blocks the turn. + +### Memory scope + +Container tags match [Claude Code](/integrations/claude-code): + +```text +repo___ +``` + +The project ID is a hash of the git remote (or the resolved local path if there isn't one). The same repo in Muse and Claude Code shares memory. Override with `repoContainerTag` in project config. + +## Commands + +| Command | Description | +| --- | --- | +| `/supermemory:index` | Index codebase architecture and patterns | +| `/supermemory:status` | Auth, container tag, API and MCP reachability | +| `/supermemory:logout` | Clear saved Muse credentials | + +A bundled skill also tells the agent when to search vs save on its own. + +## Configuration + +### Global settings + +`~/.supermemory-muse/settings.json` + +```json +{ + "maxProfileItems": 5, + "debug": false +} +``` + +| Option | Description | +| --- | --- | +| `maxProfileItems` | Max profile facts injected at session start (default: 5) | +| `debug` | Log hook activity to stderr | +| `recallDirective` | Replace prompt-recall injection with a fixed instruction | + +### Project config + +Per-repo overrides in `.muse/supermemory.json`. A Claude Code config at `.claude/.supermemory-claude/config.json` is also read, so one repo keeps one container tag across tools. + +```json +{ + "apiKey": "sm_...", + "baseUrl": "https://api.supermemory.ai", + "repoContainerTag": "my-team-project" +} +``` + +| Option | Description | +| --- | --- | +| `apiKey` | Project-specific API key | +| `baseUrl` | Supermemory API URL (use for self-hosted) | +| `repoContainerTag` | Override the auto-derived project container | + +Add the project file to `.gitignore` if it contains an API key. + +## Next steps + + + + Source code, issues, and detailed README. + + + + The same memory in Claude Code. + + diff --git a/apps/docs/integrations/n8n.mdx b/apps/docs/integrations/n8n.mdx index 7376a5af..718c5695 100644 --- a/apps/docs/integrations/n8n.mdx +++ b/apps/docs/integrations/n8n.mdx @@ -2,12 +2,12 @@ title: "n8n" sidebarTitle: "n8n" description: "Automate knowledge management with Supermemory in n8n workflows" -icon: "workflow" +icon: "/icons/hugeicons/workflow-square-01.svg" --- Connect Supermemory to your n8n workflows to build intelligent automation workflows and agents that leverage your full knowledge base. -## Quick Start +## Quick start ### Prerequisites @@ -15,7 +15,7 @@ Connect Supermemory to your n8n workflows to build intelligent automation workfl - Supermemory API key ([get one here](https://console.supermemory.ai/settings)) - Basic understanding of n8n workflows -### Setting Up the HTTP Request Node +### Setting up the HTTP request node The Supermemory integration in n8n uses the HTTP Request node to interact with the Supermemory API. Here's how to configure it: @@ -30,15 +30,15 @@ The Supermemory integration in n8n uses the HTTP Request node to interact with t ![](/images/bearer-auth-add-n8n.png) 6. Check **Send Body** and select **JSON** as the Body Content Type. The fields depend on what API endpoint you're sending the request to. You can find detailed step-by-step examples below. -## Step-by-Step Tutorial +## Step-by-step tutorial In this tutorial, we'll create a workflow that automatically adds every email from Gmail to your Supermemory knowledge base. We'll use the HTTP Request node to send email data to Supermemory's API, creating a searchable archive of all your communications. -### Adding Gmail Emails to Supermemory +### Adding Gmail emails to Supermemory Follow these steps to build a workflow that captures and stores your Gmail messages: -#### Step 1: Set Up Gmail Trigger +#### Step 1: Set up Gmail trigger ![](/images/gmail-trigger.png) @@ -47,14 +47,14 @@ Follow these steps to build a workflow that captures and stores your Gmail messa 3. Set the trigger to **Message Received** 4. Optional: Add labels or filters to process specific emails only -#### Step 2: Configure HTTP Request Node +#### Step 2: Configure HTTP request node 1. **Add an HTTP Request node** after the Gmail Trigger 2. **Method**: `POST` 3. **URL**: `https://api.supermemory.ai/v3/documents` 4. Select your auth credentials you created with the Supermemory API Key. -#### Step 3: Format Email Data for Supermemory +#### Step 3: Format email data for Supermemory In the HTTP Request node's **Body**, select **JSON** and **Using Fields Below** @@ -66,7 +66,7 @@ And create 2 fields: ![](/images/gmail-content.png) -#### Step 4: Handle Attachments (Optional) +#### Step 4: Handle attachments (optional) If you want to process attachments: @@ -76,14 +76,14 @@ If you want to process attachments: 4. **Add another HTTP Request node** to store attachment metadata -#### Step 5: Add Error Handling +#### Step 5: Add error handling 1. **Add an Error Trigger node** connected to your workflow 2. Configure it to catch errors from the HTTP Request node 3. **Add a notification node** (Email, Slack, etc.) to alert you of failures 4. Optional: Add a **Wait node** with retry logic -#### Step 6: Test Your Workflow +#### Step 6: Test your workflow 1. **Activate the workflow** in test mode 2. Send a test email to your Gmail account diff --git a/apps/docs/integrations/openai-agents-sdk.mdx b/apps/docs/integrations/openai-agents-sdk.mdx index 97754759..6d8cc229 100644 --- a/apps/docs/integrations/openai-agents-sdk.mdx +++ b/apps/docs/integrations/openai-agents-sdk.mdx @@ -418,16 +418,16 @@ results = memory.search.memories( ## Related docs - + How automatic profiling works - + Filtering and search modes - + Function calling with the regular OpenAI SDK - + Memory for LangChain apps diff --git a/apps/docs/integrations/openai.mdx b/apps/docs/integrations/openai.mdx index 1d131396..5ef012b2 100644 --- a/apps/docs/integrations/openai.mdx +++ b/apps/docs/integrations/openai.mdx @@ -19,17 +19,17 @@ Add memory capabilities to the official OpenAI SDKs using Supermemory. Two appro - + Check out the NPM page for more details - + Check out the PyPI page for more details --- -## withSupermemory Wrapper +## withSupermemory wrapper The simplest way to add memory to your OpenAI client. Wraps your client to automatically inject relevant memories into system prompts. @@ -39,7 +39,7 @@ The simplest way to add memory to your OpenAI client. Wraps your client to autom npm install @supermemory/tools openai ``` -### Quick Start +### Quick start ```typescript import OpenAI from "openai" @@ -65,7 +65,7 @@ const response = await client.chat.completions.create({ }) ``` -### Configuration Options +### Configuration options ```typescript const client = withSupermemory(openai, { @@ -89,7 +89,7 @@ const client = withSupermemory(openai, { }) ``` -### Modes Explained +### Modes explained | Mode | Description | Use Case | |------|-------------|----------| @@ -97,7 +97,7 @@ const client = withSupermemory(openai, { | `query` | Searches memories based on user message | Question answering | | `full` | Both profile and query-based search | Best for chatbots | -### Works with Responses API Too +### Works with Responses API too ```typescript const client = withSupermemory(openai, { containerTag: "user-123", customId: "conv-456", mode: "full" }) @@ -110,7 +110,7 @@ const response = await client.responses.create({ }) ``` -### Environment Variables +### Environment variables ```bash SUPERMEMORY_API_KEY=your_supermemory_key @@ -119,7 +119,7 @@ OPENAI_API_KEY=your_openai_key --- -## Function Calling Tools +## Function calling tools For explicit control over memory operations, use function calling tools. The model decides when to search or add memories. @@ -141,7 +141,7 @@ npm install @supermemory/tools -## Quick Start +## Quick start @@ -231,7 +231,7 @@ if (completion.choices[0]?.message.tool_calls) { ## Configuration -### Memory Tools Configuration +### Memory tools configuration @@ -258,9 +258,9 @@ const tools = supermemoryTools(process.env.SUPERMEMORY_API_KEY!, { -## Available Tools +## Available tools -### Search Memories +### Search memories Search through user memories using semantic search: @@ -287,7 +287,7 @@ console.log(`Found ${searchResult.memories.length} memories`) -### Add Memory +### Add memory Store new information in memory: @@ -311,7 +311,7 @@ console.log(`Added memory with ID: ${addResult.memory.id}`) -## Individual Tools +## Individual tools Use tools separately for more granular control: @@ -345,7 +345,7 @@ const toolDefinitions = [searchTool.definition, addTool.definition] -## Complete Chat Example +## Complete chat example Here's a complete example showing a multi-turn conversation with memory: @@ -498,7 +498,7 @@ chatWithMemory() -## Error Handling +## Error handling Handle errors gracefully in your applications: @@ -551,7 +551,7 @@ async function safeChat() { -## API Reference +## API reference ### Python SDK @@ -601,7 +601,7 @@ createToolCallExecutor( ) -> (toolCall: OpenAI.Chat.ChatCompletionMessageToolCall) => Promise ``` -## Environment Variables +## Environment variables Set these environment variables: @@ -613,7 +613,7 @@ SUPERMEMORY_BASE_URL=https://custom-endpoint.com # optional ## Development -### Python Setup +### Python setup ```bash # Install uv @@ -635,7 +635,7 @@ uv run black src/ tests/ uv run isort src/ tests/ ``` -### JavaScript Setup +### JavaScript setup ```bash # Install dependencies @@ -651,14 +651,14 @@ npm run type-check npm run lint ``` -## Next Steps +## Next steps - + Use with Vercel AI SDK for streamlined development - + Direct API access for advanced memory management diff --git a/apps/docs/integrations/openclaw.mdx b/apps/docs/integrations/openclaw.mdx index 50b3011d..acb83d9a 100644 --- a/apps/docs/integrations/openclaw.mdx +++ b/apps/docs/integrations/openclaw.mdx @@ -1,7 +1,7 @@ --- title: "OpenClaw" sidebarTitle: "OpenClaw" -description: "OpenClaw Supermemory Plugin — works across Telegram, WhatsApp, Discord, Slack, and more" +description: "Supermemory plugin for OpenClaw. Works across Telegram, WhatsApp, Discord, Slack and more." icon: "/images/openclaw-logo.jpg" --- @@ -11,7 +11,7 @@ icon: "/images/openclaw-logo.jpg" **Prefer to keep everything on your machine?** This plugin works with [self-hosted Supermemory](/self-hosting/overview) — run `npx supermemory local`, then `export SUPERMEMORY_BASE_URL="http://localhost:6767"` (or set `baseUrl` in the plugin config) and use the API key printed on first boot. -## Install the Plugin +## Install the plugin ```bash openclaw plugins install @supermemory/openclaw-supermemory @@ -31,7 +31,7 @@ openclaw gateway restart Enter your API key from the [API Keys](https://console.supermemory.ai/keys) page in the console. That's it. - + Configure all options interactively with the advanced setup command: ```bash @@ -45,7 +45,7 @@ Enter your API key from the [API Keys](https://console.supermemory.ai/keys) page -## How It Works +## How it works Once installed, the plugin runs automatically with zero interaction. @@ -55,7 +55,7 @@ Once installed, the plugin runs automatically with zero interaction. ## Features -### AI Tools +### AI tools The AI can use these tools autonomously during conversations. With custom container tags enabled, all tools support a `containerTag` parameter. @@ -66,7 +66,7 @@ The AI can use these tools autonomously during conversations. With custom contai | `supermemory_forget` | Delete a memory by query or ID. | | `supermemory_profile` | View the user profile — persistent facts and recent context. | -### Slash Commands +### Slash commands Users can interact with memory directly in chat. @@ -75,7 +75,7 @@ Users can interact with memory directly in chat. | `/remember [text]` | Manually save something to memory. | | `/recall [query]` | Search memories and see results with similarity scores. | -### CLI Commands +### CLI commands Manage your memory from the terminal. @@ -91,8 +91,8 @@ openclaw supermemory wipe # Delete all memories (requires confirma - - ### Configuration Options + + ### Configuration options Set API key (and, for self-hosted instances, the base URL) via environment variables: @@ -118,7 +118,7 @@ openclaw supermemory wipe # Delete all memories (requires confirma | `customContainers` | `array` | `[]` | Custom containers with `tag` and `description`. | | `customContainerInstructions` | `string` | `""` | Instructions for AI on container routing. | - ### Full Example + ### Full example ```json { @@ -277,20 +277,20 @@ openclaw supermemory wipe # Delete all memories (requires confirma Automatic per-channel separation is not supported yet. If you need this, let us know — with enough requests, we'll implement it right away. - + Email us with your use case. -## Next Steps +## Next steps - + Source code, issues, and detailed README. - + Use Claude's native memory tool with Supermemory as backend. diff --git a/apps/docs/integrations/opencode.mdx b/apps/docs/integrations/opencode.mdx index 86872de7..a5af8c3b 100644 --- a/apps/docs/integrations/opencode.mdx +++ b/apps/docs/integrations/opencode.mdx @@ -1,8 +1,8 @@ --- title: "OpenCode" sidebarTitle: "OpenCode" -description: "OpenCode Supermemory Plugin — persistent memory across coding sessions" -icon: "/images/opencode-logo.png" +description: "Supermemory plugin for OpenCode. Keeps memory across coding sessions." +icon: "/images/opencode-logo.svg" --- [OpenCode-Supermemory](https://github.com/supermemoryai/opencode-supermemory) is an OpenCode plugin that gives your AI persistent memory across sessions. Your agent remembers what you worked on — across sessions, across projects. @@ -11,7 +11,7 @@ icon: "/images/opencode-logo.png" **Prefer to keep everything on your machine?** This plugin works with [self-hosted Supermemory](/self-hosting/overview) — run `npx supermemory local`, then set `apiKey` / base URL in `~/.config/opencode/supermemory.jsonc` and use the API key printed on first boot. -## Install the Plugin +## Install the plugin ```bash bunx opencode-supermemory@latest install @@ -68,7 +68,7 @@ Ensure your `~/.config/opencode/opencode.jsonc` contains: } ``` -## How It Works +## How it works Once installed, the plugin runs automatically: @@ -77,14 +77,14 @@ Once installed, the plugin runs automatically: - **Smart Compaction** — At 80% context capacity, sessions are summarized and saved as memories. - **Privacy Protection** — Content within `` tags never persists. -### Memory Scopes +### Memory scopes | Scope | Description | |-------|-------------| | `user` | Memories that persist across all projects | | `project` | Memories isolated to the current project (default) | -### Memory Types +### Memory types | Type | Description | |------|-------------| @@ -145,14 +145,14 @@ View plugin activity: tail -f ~/.opencode-supermemory.log ``` -## Next Steps +## Next steps - + Source code, issues, and detailed README. - + Memory plugin for Claude Code. diff --git a/apps/docs/integrations/pipecat.mdx b/apps/docs/integrations/pipecat.mdx index 1637ce44..3a4deb94 100644 --- a/apps/docs/integrations/pipecat.mdx +++ b/apps/docs/integrations/pipecat.mdx @@ -1,6 +1,6 @@ --- title: "Pipecat" -sidebarTitle: "Pipecat (Voice)" +sidebarTitle: "Pipecat (voice)" description: "Integrate Supermemory with Pipecat for conversational memory in voice AI agents" icon: "/images/pipecat.svg" --- @@ -44,7 +44,7 @@ memory = SupermemoryPipecatService( ) ``` -## Pipeline Integration +## Pipeline integration The `SupermemoryPipecatService` should be positioned between your context aggregator and LLM service in the Pipecat pipeline: @@ -61,11 +61,11 @@ pipeline = Pipeline([ ]) ``` -## How It Works +## How it works When integrated with Pipecat, Supermemory provides two key functionalities: -### 1. Memory Retrieval +### 1. Memory retrieval When a user message is detected, Supermemory retrieves relevant memories: @@ -73,11 +73,11 @@ When a user message is detected, Supermemory retrieves relevant memories: - **Dynamic Profile**: Recent context and preferences - **Search Results**: Semantically relevant past memories -### 2. Context Enhancement +### 2. Context enhancement Retrieved memories are formatted and injected into the LLM context before generation, giving the model awareness of past conversations. -## Memory Modes +## Memory modes | Mode | Static Profile | Dynamic Profile | Search Results | Use Case | | ----------- | -------------- | --------------- | -------------- | ------------------------------ | @@ -85,7 +85,7 @@ Retrieved memories are formatted and injected into the LLM context before genera | `"query"` | No | No | Yes | Finding relevant past context | | `"full"` | Yes | Yes | Yes | Complete memory (default) | -## Configuration Options +## Configuration options You can customize how memories are retrieved and used: @@ -109,7 +109,7 @@ InputParams( | `system_prompt` | str | "Based on previous conversations:\n\n" | Prefix text for memory context | | `inject_mode` | str | "auto" | How memories are injected: `"auto"`, `"system"`, or `"user"` | -## Injection Modes +## Injection modes The `inject_mode` parameter controls how memories are added to the LLM context: @@ -119,7 +119,7 @@ The `inject_mode` parameter controls how memories are added to the LLM context: | `"system"` | Always injects memories into the system prompt | | `"user"` | Always injects memories as a user message | -## Speech-to-Speech Models (Gemini Live, etc.) +## Speech-to-speech models (Gemini Live, etc.) For speech-to-speech models like Gemini Live, the SDK **automatically detects** audio frames and injects memories into the system prompt. No configuration needed: @@ -133,7 +133,7 @@ memory = SupermemoryPipecatService( ) ``` -## Example: Voice Agent with Memory +## Example: Voice agent with memory Here's a complete example of a Pipecat voice agent with Supermemory integration: @@ -230,7 +230,7 @@ if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000) ``` -## Example: Gemini Live with Memory +## Example: Gemini Live with memory For a complete example using Gemini Live speech-to-speech with Supermemory, check out the reference implementation: diff --git a/apps/docs/integrations/supermemory-sdk.mdx b/apps/docs/integrations/supermemory-sdk.mdx index 18f7944d..43d2c170 100644 --- a/apps/docs/integrations/supermemory-sdk.mdx +++ b/apps/docs/integrations/supermemory-sdk.mdx @@ -6,10 +6,10 @@ icon: "/images/supermemory.svg" --- - + pip install supermemory - + npm install supermemory @@ -26,7 +26,7 @@ Both SDKs also work against [self-hosted Supermemory](/self-hosting/overview) npm install supermemory ``` - ## Quick Start + ## Quick start ```typescript import Supermemory from 'supermemory'; @@ -52,7 +52,7 @@ Both SDKs also work against [self-hosted Supermemory](/self-hosting/overview) console.log(profile.profile.dynamic); ``` - ## Common Operations + ## Common operations ```typescript // Add with metadata @@ -81,7 +81,7 @@ Both SDKs also work against [self-hosted Supermemory](/self-hosting/overview) await client.documents.delete({ docId: "doc_123" }); ``` - ## Error Handling & Retries + ## Error handling & retries | Status | Error | |--------|-------| @@ -106,7 +106,7 @@ Both SDKs also work against [self-hosted Supermemory](/self-hosting/overview) pip install supermemory ``` - ## Quick Start + ## Quick start ```python import os @@ -133,7 +133,7 @@ Both SDKs also work against [self-hosted Supermemory](/self-hosting/overview) print(profile.profile.dynamic) ``` - ## Common Operations + ## Common operations ```python # Add with metadata @@ -162,7 +162,7 @@ Both SDKs also work against [self-hosted Supermemory](/self-hosting/overview) client.documents.delete(doc_id="doc_123") ``` - ## Error Handling & Retries + ## Error handling & retries Same error classes as the TypeScript SDK (`BadRequestError`, `AuthenticationError`, `PermissionDeniedError`, `NotFoundError`, `ConflictError`, `UnprocessableEntityError`, `RateLimitError`, `InternalServerError`), all inheriting from `supermemory.APIError`. Connection errors, 408, 409, 429, and >=500 responses are retried automatically (`max_retries`, default 2). Requests time out after 1 minute by default (`timeout` option). Set `SUPERMEMORY_LOG=info` (or `debug`) to enable logging. diff --git a/apps/docs/integrations/viasocket.mdx b/apps/docs/integrations/viasocket.mdx index b87a79b0..1da90e73 100644 --- a/apps/docs/integrations/viasocket.mdx +++ b/apps/docs/integrations/viasocket.mdx @@ -12,10 +12,10 @@ Connect Supermemory to viaSocket to build powerful automation flows — search y - A Supermemory API key ([get one here](https://console.supermemory.ai/settings)) - A viaSocket account -## Step-by-Step Tutorial +## Step-by-step tutorial - + - Log in to your [Supermemory account](https://console.supermemory.ai). - Go to **Settings → API Key**. - Copy your Personal API key. @@ -24,7 +24,7 @@ Connect Supermemory to viaSocket to build powerful automation flows — search y - + - Click **Create New Flow** in your viaSocket dashboard. - In the **Trigger** section, search for and select **Supermemory**. - Choose a trigger — **Search Memory** or **Search User Profile**. @@ -32,7 +32,7 @@ Connect Supermemory to viaSocket to build powerful automation flows — search y - + - Click **Connect to Supermemory**. - Paste your Supermemory API key. - Click **Save** to store the connection. @@ -40,14 +40,14 @@ Connect Supermemory to viaSocket to build powerful automation flows — search y ![make a zap - annotated](/images/viasocket-supermemory-connection.png) - + - Provide a **Query** — either a static value or a dynamic input from a previous step. - Click **TEST** to run a sample and verify the output. - Save the trigger once the test returns expected data. ![make a zap - annotated](/images/viasocket-supermemory-configured-trigger.png) - + - Click **Add Step**. - Select **Gmail → Send Email**. - Choose an existing Gmail connection or create a new one. @@ -60,7 +60,7 @@ Connect Supermemory to viaSocket to build powerful automation flows — search y ![make a zap - annotated](/images/viasocket-supermemory-action.png) - + - Click **GO LIVE** to activate your flow. - Confirm the activation prompt. - Use **Flow View** to inspect the flow structure and **Log View** to monitor executions in real time. diff --git a/apps/docs/integrations/voltagent.mdx b/apps/docs/integrations/voltagent.mdx index 5afb000c..2178c13f 100644 --- a/apps/docs/integrations/voltagent.mdx +++ b/apps/docs/integrations/voltagent.mdx @@ -2,7 +2,7 @@ title: "VoltAgent" sidebarTitle: "VoltAgent" description: "Integrate Supermemory with VoltAgent for long-term memory in AI agents" -icon: "bolt" +icon: "/icons/hugeicons/flash.svg" --- Supermemory integrates with [VoltAgent](https://github.com/VoltAgent/voltagent), providing long-term memory capabilities for AI agents. Your VoltAgent applications will remember past conversations and provide personalized responses based on user history. @@ -11,7 +11,7 @@ Supermemory integrates with [VoltAgent](https://github.com/VoltAgent/voltagent), Migrating to v2 from 1.4.x? Check the [migration guide](/migration/tools-v2-upgrade). - + Check out the NPM page for more details @@ -29,7 +29,7 @@ export SUPERMEMORY_API_KEY=your_supermemory_api_key You can obtain an API key from [console.supermemory.ai](https://console.supermemory.ai). -## Quick Start +## Quick start Supermemory provides a `withSupermemory` wrapper that enhances any VoltAgent agent config with automatic memory retrieval and storage: @@ -72,22 +72,22 @@ const result = await agent.generateText("What's my name?") ``` -## How It Works +## How it works When integrated with VoltAgent, Supermemory hooks into two lifecycle events: -### 1. Memory Retrieval (onPrepareMessages) +### 1. Memory retrieval (onPrepareMessages) Before each LLM call, Supermemory automatically: - Extracts the user's latest message - Searches for relevant memories scoped to the `containerTag` - Injects retrieved memories into the system prompt -### 2. Conversation Saving (onEnd) +### 2. Conversation saving (onEnd) After each agent response, the conversation is saved to Supermemory for future retrieval. This requires a `customId` to be set. -## Memory Modes +## Memory modes | Mode | Description | Use Case | | ----------- | ------------------------------------------- | ------------------------------ | @@ -108,7 +108,7 @@ const configWithMemory = withSupermemory({ }) ``` -## Configuration Options +## Configuration options ```typescript const configWithMemory = withSupermemory({ @@ -161,7 +161,7 @@ const configWithMemory = withSupermemory({ When `threshold` or `limit` is omitted, the selected Supermemory backend route applies its own default. Set them explicitly when you need consistent search tuning across modes. -## Search Modes +## Search modes The `searchMode` option controls what type of results are searched: diff --git a/apps/docs/integrations/zapier.mdx b/apps/docs/integrations/zapier.mdx index f00cc6d5..dc50c9d1 100644 --- a/apps/docs/integrations/zapier.mdx +++ b/apps/docs/integrations/zapier.mdx @@ -2,7 +2,7 @@ title: "Zapier" sidebarTitle: "Zapier" description: "Automate memory management with Supermemory in Zapier workflows" -icon: "bolt" +icon: "/icons/hugeicons/flash.svg" --- With Supermemory you can now easily add memory to your Zapier workflow steps. Here's how: diff --git a/apps/docs/logo/wordmark-dark.svg b/apps/docs/logo/wordmark-dark.svg new file mode 100644 index 00000000..e49fa92d --- /dev/null +++ b/apps/docs/logo/wordmark-dark.svg @@ -0,0 +1 @@ +supermemory diff --git a/apps/docs/logo/wordmark-light.svg b/apps/docs/logo/wordmark-light.svg new file mode 100644 index 00000000..f1cbebc1 --- /dev/null +++ b/apps/docs/logo/wordmark-light.svg @@ -0,0 +1 @@ +supermemory diff --git a/apps/docs/memorybench/extend-benchmark.mdx b/apps/docs/memorybench/extend-benchmark.mdx index 231cbb9c..663e8517 100644 --- a/apps/docs/memorybench/extend-benchmark.mdx +++ b/apps/docs/memorybench/extend-benchmark.mdx @@ -1,8 +1,8 @@ --- -title: "Building a Benchmark" +title: "Building a benchmark" description: "Add a custom benchmark dataset when the built-in ones don't match your use case" -sidebarTitle: "Building a Benchmark" -icon: "flask-conical" +sidebarTitle: "Building a benchmark" +icon: "/icons/hugeicons/test-tube-01.svg" --- MemoryBench ships with three datasets — [LoCoMo](https://github.com/snap-research/locomo), [LongMemEval](https://huggingface.co/datasets/xiaowu0162/longmemeval-cleaned), and [ConvoMem](https://huggingface.co/datasets/Salesforce/ConvoMem) — but they won't cover every product. If your agent has a workflow the built-in benchmarks don't exercise (a specific domain, a scenario your users actually hit, a regression you want to guard against), you can add your own benchmark dataset and every provider — including Supermemory — runs against it the same way. @@ -19,7 +19,7 @@ Before building your own, check whether one of the existing datasets already cov You can also run all three to get a full picture of where a memory system is strong or weak — a system that's great at LoCoMo but weak at LongMemEval is good at temporal recall but struggles with dense information retrieval, for example. -## The Benchmark interface +## The benchmark interface Every dataset — built-in or custom — implements the same interface (`src/types/benchmark.ts`): @@ -72,10 +72,10 @@ Full interface details and a working template: [`src/benchmarks/README.md`](http ## Next - + Register a memory system to run against your new benchmark. - + How accuracy, latency, and MemScore are computed. diff --git a/apps/docs/memorybench/extend-provider.mdx b/apps/docs/memorybench/extend-provider.mdx index 2e7f3a6f..5181c193 100644 --- a/apps/docs/memorybench/extend-provider.mdx +++ b/apps/docs/memorybench/extend-provider.mdx @@ -1,8 +1,8 @@ --- -title: "Adding a Provider" +title: "Adding a provider" description: "Register your own memory implementation so MemoryBench can score and compare it" -sidebarTitle: "Adding a Provider" -icon: "plug" +sidebarTitle: "Adding a provider" +icon: "/icons/hugeicons/plug-01.svg" --- A "provider" in MemoryBench is any memory or RAG system that can ingest sessions and answer a search query — Supermemory, Mem0, and Zep ship as built-in providers, and **your own memory implementation is just another provider**. Once it's registered, it runs through the exact same pipeline and gets scored on the exact same footing as everything else. @@ -83,10 +83,10 @@ Full interface, including async-indexing and custom-prompt examples: [`src/provi ## Next - + Run your provider against a dataset built for your own use case. - + What the report actually tells you. diff --git a/apps/docs/memorybench/memscore.mdx b/apps/docs/memorybench/memscore.mdx index 4335dc55..d78d11c1 100644 --- a/apps/docs/memorybench/memscore.mdx +++ b/apps/docs/memorybench/memscore.mdx @@ -1,11 +1,11 @@ --- -title: "Measuring Results" -description: "How MemoryBench scores a run — qualitative judging and quantitative metrics" +title: "Measuring results" +description: "How MemoryBench scores a run with qualitative judging and quantitative metrics." sidebarTitle: "Measuring" -icon: "gauge" +icon: "/icons/hugeicons/dashboard-speed-01.svg" --- -Every question goes through the same pipeline — **ingest → search → answer → evaluate → report** — and produces two different kinds of signal: a **qualitative** judgment on whether the answer was actually right, and **quantitative** measurements of how fast and how expensive getting there was. MemoryBench keeps both instead of collapsing everything into a single number. +Every question goes through the same pipeline (ingest → search → answer → evaluate → report) and produces two kinds of signal: a qualitative judgment on whether the answer was right, and quantitative measurements of how fast and how expensive it was to get there. MemoryBench keeps both instead of collapsing everything into a single number. ## Qualitative: was the answer right? @@ -82,10 +82,10 @@ Results and checkpoints for every run live at `data/runs/{runId}/report.json`, w ## Next - + Get your own system into a run that produces these numbers. - + Measure against scenarios specific to your product. diff --git a/apps/docs/memorybench/overview.mdx b/apps/docs/memorybench/overview.mdx index 1de18701..c0c5aad0 100644 --- a/apps/docs/memorybench/overview.mdx +++ b/apps/docs/memorybench/overview.mdx @@ -1,15 +1,15 @@ --- title: "MemoryBench" -description: "Open-source framework for benchmarking memory providers — including your own" +description: "Open-source framework for benchmarking memory providers, including your own." sidebarTitle: "Overview" -icon: "flask-conical" +icon: "/icons/hugeicons/test-tube-01.svg" --- Benchmarking memory systems is hard, and most comparisons you'll find aren't apples-to-apples — different datasets, different judges, different prompts, cherry-picked runs. **MemoryBench** ([`supermemoryai/memorybench`](https://github.com/supermemoryai/memorybench), MIT licensed) is the open-source framework we built to fix that: the same benchmark questions, the same pipeline, and the same judges run against every provider, so a comparison actually means something. We open-sourced it so you don't have to take our word for anything — you can run it yourself, against your own memory implementation, on the datasets that match your use case. - + Clone it, run it against your own data, or read the source for exactly how each provider is scored. @@ -45,13 +45,13 @@ INGEST → SEARCH → ANSWER → EVALUATE → REPORT Ingestion can take hours for large datasets, and API calls fail — so every phase checkpoints independently and a run resumes from the last completed step instead of starting over. - + Chunk-based semantic search - + LLM-powered memory extraction - + Knowledge graph construction @@ -71,16 +71,16 @@ Judging is judge-agnostic too — score a run with GPT-4o, Claude, Gemini, or an ## Read next - + Test on scenarios that actually match your product, not just the built-in datasets. - + Register your own memory system so it can be scored and compared. - + MemScore, judge scoring, and how to read a report. - + Found a bug, or want a provider/benchmark we don't support yet? diff --git a/apps/docs/migration/from-mem0.mdx b/apps/docs/migration/from-mem0.mdx index 206a886e..24c71632 100644 --- a/apps/docs/migration/from-mem0.mdx +++ b/apps/docs/migration/from-mem0.mdx @@ -6,7 +6,7 @@ sidebarTitle: "From Mem0" Migrating from Mem0 to Supermemory is straightforward. This guide walks you through exporting your memories from Mem0 and importing them into Supermemory. -## Why Migrate to Supermemory? +## Why migrate to Supermemory? Supermemory offers enhanced capabilities over Mem0: - **Knowledge graph** architecture for better context relationships @@ -14,7 +14,7 @@ Supermemory offers enhanced capabilities over Mem0: - **Generous free tier** (100k tokens) with affordable pricing - **Multiple integration options** (API, MCP, SDKs) -## Quick Migration (All-in-One) +## Quick migration (all-in-one) Complete migration in one script: @@ -45,13 +45,13 @@ for memory in data["memories"]: print("Migration complete!") ``` -## Step-by-Step Migration +## Step-by-step migration Mem0 provides two ways to export your memories: - ### Option 1: Export via Dashboard (Recommended) + ### Option 1: Export via dashboard (recommended) 1. Log into your [Mem0 dashboard](https://app.mem0.ai) 2. Navigate to the export section 3. Download your memories as JSON @@ -103,7 +103,7 @@ print("Migration complete!") ``` - + Create your Supermemory account and get your API key: 1. Sign up at [console.supermemory.ai](https://console.supermemory.ai) @@ -158,11 +158,11 @@ print("Migration complete!") -## API Migration Reference +## API migration reference Here's how common Mem0 operations map to Supermemory: -### Adding Memories +### Adding memories @@ -188,7 +188,7 @@ client.add( -### Searching Memories +### Searching memories @@ -208,7 +208,7 @@ results = client.search.memories( -### Getting All Memories +### Getting all memories @@ -227,7 +227,7 @@ memories = client.documents.list( -### Deleting Memories +### Deleting memories @@ -245,7 +245,7 @@ client.documents.delete("mem_123") For enterprise migrations, [contact us](mailto:support@supermemory.ai) for assistance. -## Next Steps +## Next steps 1. [Explore](/concepts/how-it-works) how Supermemory works 2. Read the [quickstart](/quickstart) and add and retrieve your first memories diff --git a/apps/docs/migration/from-zep.mdx b/apps/docs/migration/from-zep.mdx index c95fcd31..2971aa1c 100644 --- a/apps/docs/migration/from-zep.mdx +++ b/apps/docs/migration/from-zep.mdx @@ -4,7 +4,7 @@ description: "Quick guide to migrate from Zep to Supermemory" sidebarTitle: "From Zep" --- -## Key Differences +## Key differences | Zep AI | Supermemory | |--------|-------------| @@ -41,9 +41,9 @@ const client = new Supermemory({ apiKey: "your-api-key" }); -## API Mapping +## API mapping -### Session Management +### Session management @@ -61,7 +61,7 @@ containerTag = "user_123" -### Adding Memories +### Adding memories @@ -102,7 +102,7 @@ results = client.search.execute({ -### Getting All Memories +### Getting all memories @@ -119,7 +119,7 @@ documents = client.documents.list({ -## Migration Steps +## Migration steps 1. **Replace client initialization** - Use Supermemory client instead of Zep 2. **Map sessions to container tags** - Replace `session_id="user_123"` with `containerTag: "user_123"` @@ -127,7 +127,7 @@ documents = client.documents.list({ 4. **Change search parameter** - Use `q` instead of `text` 5. **Handle async processing** - Documents process asynchronously (status: `queued` → `done`) -## Complete Example +## Complete example @@ -169,16 +169,16 @@ results = client.search.execute({ -## Important Notes +## Important notes - **No session creation needed** - Just use `containerTag` in requests - **Messages are documents** - Store with `metadata.role` and `metadata.type` - **Async processing** - Documents may take a moment to be searchable - **Response structure** - Supermemory returns chunks with scores, not direct memory content -## Migrating Existing Data +## Migrating existing data -### Quick Migration (All-in-One) +### Quick migration (all-in-one) Complete migration in one script: @@ -253,7 +253,7 @@ print("Migration complete!") -### Full Migration Script +### Full migration script For a complete migration script with error handling, verification, and progress tracking, copy this TypeScript script: diff --git a/apps/docs/migration/tools-v2-upgrade.mdx b/apps/docs/migration/tools-v2-upgrade.mdx index a948da52..5b9df88b 100644 --- a/apps/docs/migration/tools-v2-upgrade.mdx +++ b/apps/docs/migration/tools-v2-upgrade.mdx @@ -1,6 +1,6 @@ --- title: 'Upgrading @supermemory/tools to v2.0.0' -description: 'Migrate your code from @supermemory/tools 1.4.x to 2.0.0 — config-object signature, customId, and new defaults' +description: "Migrate from @supermemory/tools 1.4.x to 2.0.0: the config-object signature, customId and new defaults." sidebarTitle: 'Tools: v1.4 → 2.0' --- diff --git a/apps/docs/overview/analytics.mdx b/apps/docs/overview/analytics.mdx index 34df64b4..cdbb9de1 100644 --- a/apps/docs/overview/analytics.mdx +++ b/apps/docs/overview/analytics.mdx @@ -1,7 +1,7 @@ --- -title: "Analytics & Monitoring" +title: "Analytics & monitoring" description: "Observe usage, errors, and logs to monitor your Supermemory integration" -icon: "chart-line" +icon: "/icons/hugeicons/chart-line-data-01.svg" --- Monitor your Supermemory usage with detailed analytics on API calls, errors, and performance metrics. @@ -19,7 +19,7 @@ The Analytics API provides comprehensive insights into your Supermemory usage: Analytics data is available for your entire organization and can be filtered by time period. -## Usage Statistics +## Usage statistics Get comprehensive usage statistics including hourly breakdowns and per-key metrics. @@ -37,7 +37,7 @@ Get comprehensive usage statistics including hourly breakdowns and per-key metri | `page` | integer | Page number for pagination (default: 1) | | `limit` | integer | Items per page (default: 20, max: 100) | -### Example Request +### Example request @@ -74,7 +74,7 @@ curl -X GET "https://api.supermemory.ai/v3/analytics/usage?from=2024-01-01T00:00 -### Response Schema +### Response schema ```json { @@ -118,7 +118,7 @@ curl -X GET "https://api.supermemory.ai/v3/analytics/usage?from=2024-01-01T00:00 } ``` -## Error Monitoring +## Error monitoring Track and analyze errors to identify issues and improve reliability. @@ -130,7 +130,7 @@ Track and analyze errors to identify issues and improve reliability. Same as usage endpoint - supports `from`, `to`, `period`, `page`, and `limit`. -### Example Request +### Example request @@ -163,7 +163,7 @@ curl -X GET "https://api.supermemory.ai/v3/analytics/errors?period=7d" \ -### Response Schema +### Response schema ```json { @@ -199,7 +199,7 @@ curl -X GET "https://api.supermemory.ai/v3/analytics/errors?period=7d" \ } ``` -## Detailed Logs +## Detailed logs Access complete request/response logs for debugging and auditing. @@ -214,7 +214,7 @@ Same as usage endpoint, plus optional filters: - `statusCode`: Filter by HTTP status code - `keyId`: Filter by specific API key -### Example Request +### Example request @@ -252,7 +252,7 @@ curl -X GET "https://api.supermemory.ai/v3/analytics/logs?period=1h&limit=50" \ -### Response Schema +### Response schema ```json { @@ -282,7 +282,7 @@ curl -X GET "https://api.supermemory.ai/v3/analytics/logs?period=1h&limit=50" \ } ``` -## Rate Limits +## Rate limits Analytics endpoints have the following rate limits: - 100 requests per minute per organization diff --git a/apps/docs/overview/billing.mdx b/apps/docs/overview/billing.mdx index 8b12af25..936d90a9 100644 --- a/apps/docs/overview/billing.mdx +++ b/apps/docs/overview/billing.mdx @@ -1,8 +1,8 @@ --- title: "Billing & usage" -description: "Enterprise-grade reference for Supermemory metering — SM tokens, operations, search, SuperRAG, plans, diff billing, and programmatic usage APIs." +description: "How Supermemory metering works: SM tokens, operations, search, SuperRAG, plans, diff billing and the usage APIs." sidebarTitle: "Billing & usage" -icon: "credit-card" +icon: "/icons/hugeicons/credit-card.svg" --- Supermemory billing is **usage-based USD credits**. Plans include a monthly credit balance; metered product usage draws that balance down. You manage plan, invoices, top-ups, and auto top-up in the [Developer Console](https://console.supermemory.ai). @@ -16,7 +16,7 @@ Console charts are **estimates**. Invoice / customer-portal line items are autho ## Mental model ```text -PLAN (Free · Pro · Scale · Enterprise) +PLAN (Free · Pro · Max · Scale · Enterprise) │ includes monthly USD credits ▼ USD CREDIT BALANCE ──draw──► METERS @@ -72,7 +72,7 @@ Text-like document types bill on the **text** meters; everything else bills as * **`sm_operations`** is the meter for discrete platform work that is not “how many tokens did we embed.” Examples include: -- **`dreaming: "instant"`** — processes a document’s memory extraction immediately (does not wait for dynamic batch dreaming). Documented as **one extra operation per document** on top of normal token metering. See [Processing modes](/ingestion/add-memories#processing-modes). +- `dreaming: "instant"` extracts a document's memories immediately instead of waiting for the next dynamic batch. It costs **one extra operation per document** on top of normal token metering. See [processing modes](/ingestion/add-memories#processing-modes). - Other non-token platform actions the product attributes to the operations meter (console: “counted platform operations not attributed to token or search meters”). Search is primarily metered as **`sm_search_queries`** (one unit per gated search/profile request). Prefer thinking of operations as **extra platform work**, not as a synonym for “API call.” @@ -104,7 +104,7 @@ When you re-add content under the **same `customId`** (same org / document ident billableTokens = max(0, fullTokenCount - previousTokenCount) ``` -So **tokens Supermemory has already processed are not billed again**. Unchanged content is a **full discount** on the token meters. Only the **net-new delta** (and any new rich extraction on that delta) draws credits. +So **tokens Supermemory has already processed are not billed again**. Unchanged content costs nothing on the token meters; only the net-new delta, and any new extraction on it, draws credits. This is why long-lived agent loops stay cheap: re-sync the same conversation `customId`, re-upload the same policy doc, or connector re-sync with stable IDs — you pay for **new** material, not the whole history every time. @@ -147,7 +147,7 @@ Connectors already use stable IDs (e.g. Drive file id, Gmail thread id, `s3://bu | **Top-up credits** | Purchased USD credits (console presets e.g. 10 / 25 / 50 / 100 USD). Persist until used (do not expire with the calendar month the way subscription inclusion does) | | **Spend order** | Plan inclusion is consumed before top-up balance (Autumn merges both into `usd_credits`) | | **Auto top-up** | Configurable in console for paid plans — adds credits when balance is low | -| **Spend caps** | Scale+ supports hard caps so usage cannot run away | +| **Auto top-up purchase limits** | Paid plans can limit automatic credit purchases per interval. This is not a hard cap on total usage or the full invoice. | | **Depleted balance** | Metered APIs may block (e.g. **402**) until top-up or period reset | ### Plan credit inclusion (approximate) @@ -156,6 +156,7 @@ Connectors already use stable IDs (e.g. Drive file id, Gmail thread id, `s3://bu |---|---|---| | Free | `api_free` | **5 USD** | | Pro | `api_pro` | **20 USD** | +| Max | `api_max` | **130 USD** | | Scale | `api_scale` | **600 USD** | | Enterprise | `api_enterprise` | Custom / unlimited by contract | @@ -171,26 +172,34 @@ Usage meters are shared; **feature gates** differ by tier. | Plan | Price (list) | Included credits | Best for | |---|---|---|---| -| **Free** | 0 USD | 5 USD | Evaluate API, prototypes | -| **Pro** | 19 USD/mo | 20 USD | Developers, plugins, core connectors | +| **Free** | 0 USD | 5 USD | Plugins, API evaluation, prototypes | +| **Pro** | 19 USD/mo | 20 USD | Developers, core connectors | +| **Max** | 100 USD/mo | 130 USD | More usage headroom and Gmail | | **Scale** | 399 USD/mo | 600 USD | Production, full connectors, teams | | **Enterprise** | Custom | Contract | SSO, custom metering, FDE, air-gap | -### Feature matrix (code gates) +### Feature availability -| Feature | Free | Pro | Scale | Enterprise | -|---|---|---|---|---| -| Memory API, search, profiles | Yes | Yes | Yes | Yes | -| Diff / delta token billing | Yes | Yes | Yes | Yes | -| Plugins (Claude Code, Cursor, Hermes, …) | — | Yes | Yes | Yes | -| Team management | — | Yes | Yes | Yes | -| Google Drive, OneDrive, Notion connectors | — | Yes | Yes | Yes | -| Gmail, GitHub, S3, Web Crawler connectors | — | — | Yes | Yes | -| User Insights | — | — | Yes | Yes | -| Org seat limit (members) | 1 | 3 | Unlimited | Unlimited | -| Auto top-up | Limited | Yes | Yes | Contract | -| Spend caps | — | — | Yes | Contract | -| Custom metering / SSO / dedicated deploy | — | — | — | Yes | +| Feature | Free | Pro | Max | Scale | Enterprise | +|---|---|---|---|---|---| +| Memory API, search, profiles | Yes | Yes | Yes | Yes | Yes | +| Standard PDF extraction, including OCR for scans | Yes | Yes | Yes | Yes | Yes | +| [Advanced document extraction for PDFs](/concepts/content-types#advanced-document-extraction) (figure and diagram descriptions) | — | — | — | Yes | Yes | +| Diff / delta token billing | Yes | Yes | Yes | Yes | Yes | +| Coding plugins (Claude Code, Codex, Cursor, OpenCode, OpenClaw, Hermes) | Yes | Yes | Yes | Yes | Yes | +| Team management | — | Yes | Yes | Yes | Yes | +| Google Drive, OneDrive, Notion, Granola connectors | — | Yes | Yes | Yes | Yes | +| Gmail connector | — | — | Yes | Yes | Yes | +| GitHub, S3, Web Crawler connectors | — | — | — | Yes | Yes | +| User Insights | — | — | — | Yes | Yes | +| Org seat limit (members) | 1 | 3 | 3 | Unlimited | Unlimited | +| Auto top-up in the console | — | Yes | Yes | Yes | Contract | +| Auto top-up purchase limits | — | Yes | Yes | Yes | Contract | +| Custom metering / SSO / dedicated deploy | — | — | — | — | Yes | + +Coding plugins are available on every plan, including Free. Their API usage still consumes your plan's credits at the applicable rates. + +PDF uploads use the extraction tier available to your organization automatically; no extra API parameter is required. On plans without advanced extraction, uploads still use standard extraction rather than returning a feature-gate error. Advanced extraction can also fall back to standard extraction if needed. This tier distinction applies to PDFs, not all supported file types. Overrides can be applied per org in metadata (`featureOverrides`) for enterprise deals. @@ -268,7 +277,7 @@ Response includes `byFeature`, `byDay`, `memoryTotal`, `superragTotal`, period s ```http GET /v3/auth/billing/auto-topups -PATCH /v3/auth/billing/auto-topups +POST /v3/auth/billing/auto-topups ``` ### Invoices @@ -320,7 +329,7 @@ console.log({ 3. Use **`dreaming: "instant"`** only when you need immediate memory (extra operation); default `"dynamic"` batches extraction. 4. Cache **profiles** short-TTL in your app if you call them every turn. 5. Scope with **`containerTag`** so you can delete/export a tenant without scanning the org. -6. Enable **spend caps / auto top-up** on Scale for predictable production. +6. Configure **auto top-up purchase limits** on paid plans and monitor usage separately. These limits do not cap the entire invoice. 7. Pull **`/v3/auth/billing/usage-events`** into your own FinOps dashboard for per-day Memory vs SuperRAG spend. --- diff --git a/apps/docs/overview/comparison.mdx b/apps/docs/overview/comparison.mdx index bb1e36cf..e75104c7 100644 --- a/apps/docs/overview/comparison.mdx +++ b/apps/docs/overview/comparison.mdx @@ -1,8 +1,8 @@ --- -title: "Comparison - Should I use supermemory?" -description: "When Supermemory is the right choice versus DIY vector stacks, thin memory layers, pure RAG, and building it yourself. The answer is: you should probably use supermemory" +title: "Comparison - should I use supermemory?" +description: "How Supermemory compares with a DIY vector stack, thin memory layers, pure RAG and building it yourself." sidebarTitle: "Comparison" -icon: "scale" +icon: "/icons/hugeicons/balance-scale.svg" --- @@ -11,27 +11,27 @@ icon: "scale" Non-detailed reasons to pick supermemory over the alternatives. If you're migrating from a specific tool, the [migration guides](/migration/from-mem0) name names and map APIs. -## vs Rolling your own (vector DB + embeddings + glue) +## vs rolling your own (vector DB + embeddings + glue) - **Skip the vendor pile-up.** No stitching together a vector DB, an embedding model, chunking scripts, and a fact-extraction prompt. One engine does it. - **Get temporal truth for free.** "Loved Adidas, switched to Puma" resolves correctly instead of both facts looking equally relevant forever. - **Ship identity, not just similar text.** Entities and profiles come built in, not bolted on later. - **Stay portable.** Use our cloud, or [self-host](/self-hosting/overview) the same engine on your own infra. -## vs "Memory layers" that are thin wrappers +## vs "memory layers" that are thin wrappers - **Facts actually update.** When a user changes their mind, the old fact doesn't sit next to the new one forever. - **Real relationships, not blobs.** A graph connects people, projects, and events across sessions, not a pile of stored chat turns. - **Profiles included.** No extra work to get a standing summary of who a user is. - **Configurable where it matters.** Extractors, retrieval, and isolation are primitives you compose, not a black box. -## vs Pure RAG / document search products +## vs pure RAG / document search products - **Both layers, one engine.** SuperRAG for corpus grounding, memory and profiles for people, sharing the same container tags. - **Personal state isn't just another document.** "What the policy says" and "what this customer decided last quarter" stay distinct but connected. - **No second vendor for personalization.** You're not stitching a memory product onto your RAG stack. -## vs Building a full context engine in-house +## vs building a full context engine in-house - **Skip years of infra work.** Extraction models, temporal updates, conflict resolution, and connector maintenance, already built. - **Compliance comes standard.** SOC 2, GDPR, and HIPAA paths, plus scoped keys, without a dedicated platform team. @@ -72,7 +72,7 @@ If you are migrating from a specific tool, use the [migration guides](/migration - You spend lots of time on just figuring out the right plumbing and combinations of vendors - Not very scalable for memory. New facts need knowledge of all previous facts -**Supermemory instead:** one engine that derives **memories** using our custom model, a **temporal vector-graph engine**, and **profiles**, with hybrid retrieval and isolation primitives built in. You keep the option to [self-host](/self-hosting/overview) when you want the stack on your metal. +**Supermemory instead:** one engine that derives memories with our own model, stores them in a temporal vector-graph engine and builds profiles, with hybrid retrieval and isolation built in. You can still [self-host](/self-hosting/overview) when you want the stack on your own machines.

vs “Memory layers” that are thin wrappers

@@ -91,7 +91,7 @@ If you are migrating from a specific tool, use the [migration guides](/migration - There's no concept of Profiles since they don't have the same underlying learning model and store engine - You still have to build the entire thing around it, on their abstraction. Low configurability and doesn't support many use cases (Extractors, retrieval, etc.) -**Supermemory instead:** memory is a first-class data model (documents → derived memories → graph → profiles), not a convenience wrapper. Same store from API, MCP, and plugins, all primitives built in for you to compose for your use case. See [How it works](/concepts/how-it-works) and [Graph memory](/concepts/graph-memory). +**Supermemory instead:** memory is a first-class data model (documents → derived memories → graph → profiles), not a convenience wrapper. The API, MCP and plugins share one store, and every primitive is there for you to compose. Read [how it works](/concepts/how-it-works).

vs Pure RAG / document search products

@@ -111,7 +111,7 @@ If you are migrating from a specific tool, use the [migration guides](/migration - You still have to build in the contextualization and bear the cost of it. Also need to sign up for many vendors for the same. - Treating user state as another document collection -**Supermemory instead:** **both** layers in one engine, SuperRAG for corpus grounding, memory + profiles for people and entities. They share container tags so isolation stays coherent. Deep dive: [Memory vs RAG](/concepts/memory-vs-rag). +**Supermemory instead:** both layers in one engine. SuperRAG grounds answers in your documents, and memory plus profiles cover people and entities. They share container tags, so isolation stays consistent. Read [Memory vs RAG](/concepts/memory-vs-rag).

vs Building a full context engine in-house

@@ -172,16 +172,16 @@ Most AI applications should use supermemory. ## Related - + Product overview and one-engine mental model. - + Why nearest-neighbor text is not memory. - + Usage model if cost is part of the evaluation. - + Trust posture for production and enterprise buyers. diff --git a/apps/docs/overview/security.mdx b/apps/docs/overview/security.mdx index b69f238c..3934832b 100644 --- a/apps/docs/overview/security.mdx +++ b/apps/docs/overview/security.mdx @@ -1,8 +1,8 @@ --- title: "Security & compliance" -description: "How Supermemory protects data — encryption, isolation, SOC 2, GDPR, HIPAA BAA, and deletion." +description: "How Supermemory protects data: encryption, isolation, SOC 2, GDPR, HIPAA BAA and deletion." sidebarTitle: "Security & compliance" -icon: "shield" +icon: "/icons/hugeicons/shield-01.svg" --- Supermemory stores long-horizon context about people and organizations. Security and compliance are part of the product surface, not a footer claim. @@ -73,16 +73,16 @@ If policy requires data never leave your network, run the [self-hosted engine](/ ## Related - + Which tiers include BAAs, seats, and self-host options. - + How isolation works in the data model. - + API keys and access for the Developer Platform. - + Keep memory on your infrastructure. diff --git a/apps/docs/overview/use-cases.mdx b/apps/docs/overview/use-cases.mdx index 8f306980..53d09c1b 100644 --- a/apps/docs/overview/use-cases.mdx +++ b/apps/docs/overview/use-cases.mdx @@ -1,8 +1,8 @@ --- title: "Use cases" -description: "What teams build with Supermemory — agents, knowledge, multi-tenant products, and tools." +description: "What teams build with Supermemory: agents, knowledge bases, multi-tenant products and tools." sidebarTitle: "Use cases" -icon: "lightbulb" +icon: "/icons/hugeicons/idea-01.svg" --- Supermemory is one context engine. These are the shapes teams ship on top of it. @@ -10,16 +10,16 @@ Supermemory is one context engine. These are the shapes teams ship on top of it. ## Agents that remember - + Preferences, people, projects, and decisions across sessions — without replaying the entire chat history into every prompt. - + Account history, past tickets, and product facts at answer time. Isolate each customer with a container tag. - + Remember the account, stakeholders, and last commitments. Profiles keep “always know” context warm. - + Project conventions, past decisions, and repo context via API, MCP, or plugins (Claude Code, Codex, OpenClaw, and more). @@ -27,16 +27,16 @@ Supermemory is one context engine. These are the shapes teams ship on top of it. ## Knowledge and retrieval - + Drive, Notion, Gmail, OneDrive, S3, GitHub, web crawler — sync sources, then ask questions with managed SuperRAG. - + Policies, wikis, and internal docs as shared memory for the team. - + Papers, notes, and long documents with multimodal ingestion (PDF, images, audio/video) and hybrid search. - + Contracts and policy corpora with strict isolation and audit-friendly deletion paths. See [Security](/overview/security). @@ -64,10 +64,10 @@ Deep dive lives in Developer Platform concepts ([container tags](/concepts/conta ## Related - + Product overview and mental model. - + Concepts, API guides, and integrations. diff --git a/apps/docs/overview/what-is-supermemory.mdx b/apps/docs/overview/what-is-supermemory.mdx index c1a319f9..5122db20 100644 --- a/apps/docs/overview/what-is-supermemory.mdx +++ b/apps/docs/overview/what-is-supermemory.mdx @@ -2,148 +2,174 @@ title: "What is Supermemory?" description: "Supermemory is the long term and short term context and memory infrastructure for agents." sidebarTitle: "What is Supermemory?" -icon: "book-open" -mode: "wide" +icon: "/icons/hugeicons/book-open-01.svg" --- -export const BuildingBlock = ({ title, href, children }) => { +export const ArtTile = ({ title, href, art, pos = "center", flip, children }) => { return ( -
- {children} - - {title} - + +
+ +
+ +
+
+
+ {title} + +
+
) } -Supermemory is **context infrastructure for AI agents**. We're one of the leading memory providers, with components to go beyond memory and configure it to be perfect for every usecase. +export const At = ({ x, y, w, className, children }) => ( +
{children}
+) -It provides all the building blocks — Memory, Retrieval, Profiles, Connectors, Extractors, Evals, observability, and more. +export const Tile = ({ x, y, size = 36, src, icon, logo, on, faded, badge }) => ( +
+ {src ? : } + {badge ? : null} +
+) -
- - - - - - - - - - - - - - - - - - - - - - - - +export const Lines = ({ d }) => ( + +) + +Supermemory is **context infrastructure for AI agents**. It gives your agent memory, retrieval and user profiles through one API, and you can configure each part for your use case. + +These are the building blocks it ships with: + +
+ + Prefers Python + Uses TypeScriptUpdates + + Bun for scripts + + + refund policy for annual plans + + + 0.92 + + + + + +
profile.md
+
notes.md
+
meetings
+
+
+ + +
+ + Maya KapoorPayments engineer +
+
Based in BerlinStatic
+
Fixing webhooksDynamic
+
+
+ + + + + + + + + PDF + + + + + + + +
LongMemEval
+
Supermemory1st
+
+
+
+
+ + + + + +
-With supermemory, developers can provide perfect recall about their users to build AI agents that are more intelligent, more personalized, and more consistent. +With Supermemory, your agent remembers what each user has told it and uses that to answer more personally and more consistently. -It is the [state of the art](https://supermemory.ai/research) across multiple different benchmarks, like LongMemEval and LoCoMo. It's also the best in a lot of independantly run benchmarks, like the [SWEContext](https://arxiv.org/pdf/2602.08316) bench. +Supermemory leads the LongMemEval and LoCoMo benchmarks and independent ones such as SWEContext. See the [benchmark results](https://supermemory.ai/research). ## How does it work? (at a glance) -![](/images/232.png) +![Text, files, chats and connectors flow into Supermemory. The RAG path runs through the smart memory engine for search over documents; the user memory path builds a memory graph that tracks how facts change over time.](/images/how-it-works-overview.webp) -- You send Supermemory raw data in any format - text, files, and chats, or connect it to the data sources -- Supermemory [intelligently indexes them](/concepts/how-it-works) using our user understanding model and builds a semantic understanding graph on top of an entity (e.g., a user, a document, a project, an organization). We call these entities `containerTag` -- This knowledge is now traversed by the agent, and an automatic profile is built for it. The agent may now use it for memory operations or for retrieval. +- You send raw data in any format (text, files and chats), or connect a data source. +- Supermemory indexes it and builds a graph of what it learns about each entity: a user, a document, a project or an organization. Each entity is identified by a `containerTag`. +- Your agent searches that graph for memory or retrieval, and Supermemory keeps a profile of each entity up to date. + +For the full pipeline, read [how ingestion works](/concepts/how-it-works). ## Why add memory to your agent? Without memory, every session starts from zero. The model cannot know what the user preferred last week, which project they are on, or that a fact has changed since yesterday. -**Memory** gives an agent durable understanding of *people and entities over time* — preferences, decisions, relationships, corrections. **Retrieval (RAG)** grounds answers in *documents and knowledge bases*. You usually want both. +Memory gives an agent a lasting understanding of people and entities over time: their preferences, decisions, relationships and corrections. Retrieval (RAG) grounds answers in documents and knowledge bases. Most agents need both. -By adding memory to your agent, you can: +With memory, your agent can: -- **Personalize** — remember preferences, roles, and history across sessions without stuffing the full chat log into every prompt -- **Stay correct as facts change** — “I love Adidas” then “switching to Puma” should not leave both preferences equally true -- **Ground answers** — pull the right policy, ticket, or doc when the question needs source material -- **Ship multi-tenant products** — isolate each user or workspace so one customer’s memory never leaks into another’s +- Personalize answers with preferences, roles and history from earlier sessions, without putting the whole chat log in every prompt. +- Stay correct when facts change. If a user says "I love Adidas" and later "I'm switching to Puma", only the newer preference should hold. +- Pull the right policy, ticket or document when a question needs source material. +- Keep each customer's memory separate, so one user's data never leaks into another's. -You can think of memory as the always-on context a skilled teammate would carry — not a search box over raw logs. - -For the full category argument (vs DIY vectors, thin memory wrappers, pure RAG), see [Comparison](/overview/comparison) and [Memory vs RAG](/concepts/memory-vs-rag). +Think of memory as the context a good teammate carries in their head, not a search box over raw logs. To see where retrieval ends and memory begins, read [Memory vs RAG](/concepts/memory-vs-rag). ## Why Supermemory? -- **State of the art on long-horizon memory** — #1 on [LongMemEval](https://supermemory.ai/research), [LoCoMo](https://supermemory.ai/research), and [ConvoMem](https://supermemory.ai/research), plus independent benches like [SWEContext](https://arxiv.org/pdf/2602.08316) -- **Memory is a graph, not a blob store** — facts [update, connect, and forget](/concepts/graph-memory) in real time; not nearest-neighbor chunks alone -- **User profiles built in** — static + dynamic context the agent should [always know](/concepts/user-profiles), ~ready for the prompt -- **Memory + SuperRAG in one engine** — personalize *and* ground on the same `containerTag` / context pool -- **Every door, one store** — API, [MCP](/supermemory-mcp/mcp), plugins, [SMFS](/smfs/overview), and connectors share the same memories -- **Multimodal by default** — text, chats, PDFs, images, video, code via [extractors](/concepts/content-types) and [connectors](/connectors/overview) -- **Run it your way** — managed cloud or [self-host](/self-hosting/overview) as a single binary (including offline) +- **It leads long-horizon memory benchmarks.** First on LongMemEval, LoCoMo and ConvoMem, and strong on independent benchmarks like SWEContext. +- **Memory is a graph.** Facts update, connect and expire in real time instead of sitting as nearest-neighbor chunks. +- **User profiles are built in.** Static and dynamic facts about each user are ready to drop into the prompt. +- **Memory and RAG share one engine.** Personalization and document search run on the same `containerTag`. +- **Every entry point uses one store.** The API, MCP, plugins, SMFS and connectors all read and write the same memories. +- **It is multimodal by default.** Text, chats, PDFs, images, video and code are extracted automatically, whether you upload them or sync them. +- **It runs where you need it.** Use the managed cloud, or self-host a single binary that also works offline. ![memory graph](/images/readme-memory-graph.png) -Memory, profiles, and SuperRAG share the **same context pool** when you use the same isolation (`containerTag`). Mix and match for your product! A container can be anything - a user, a project, team, organization, etc. +Memory, profiles and SuperRAG share one context pool when they use the same `containerTag`. A container can be any scope you choose: a user, a project, a team or an organization. ## Next steps - + Make your first API call in minutes - + Understand the knowledge graph architecture - + vs DIY vectors, thin memory layers, pure RAG - + One binary, zero config, fully offline - + Credits, SM tokens, and how usage works - + SOC 2, GDPR, HIPAA BAA, encryption diff --git a/apps/docs/package.json b/apps/docs/package.json index a3aff8c2..957c64bc 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -10,7 +10,7 @@ }, "devDependencies": { "@types/bun": "latest", - "mintlify": "^4.2.112", + "mintlify": "4.2.933", "typescript": "^5.9.2" }, "dependencies": { diff --git a/apps/docs/quickstart.mdx b/apps/docs/quickstart.mdx index 7edb05e1..ad73b4f6 100644 --- a/apps/docs/quickstart.mdx +++ b/apps/docs/quickstart.mdx @@ -1,7 +1,7 @@ --- title: "Quickstart" -description: "Ingest a conversation and a document, then use document search, memory graph traversal, and profiles — and wire it into a chat harness." -icon: "play" +description: "Ingest a conversation and a document, retrieve them three ways, then wire it into a chat harness." +icon: "/icons/hugeicons/play.svg" --- By the end of this page you will: @@ -114,7 +114,7 @@ curl -X POST "https://api.supermemory.ai/v3/documents" \ `add` returns immediately with `status: "queued"`. Processing is still **async** — wait until `done` before searching. -**`dreaming: "instant"`** — By default, dreaming is `"dynamic"`: Supermemory may batch related documents so memories form from coherent units, which can lag after `status: "done"`. For this quickstart (and any path where you need memories/profiles right away), pass **`dreaming: "instant"`** so the document is processed on its own as soon as it finishes indexing. That bills one extra operation per document. See [Processing Modes](/ingestion/add-memories#processing-modes). +By default, dreaming is `"dynamic"`: Supermemory may batch related documents so memories form from coherent units, which can lag behind `status: "done"`. This quickstart passes `dreaming: "instant"` so each document is processed on its own as soon as it finishes indexing. Use it whenever you need memories or profiles right away; it bills one extra operation per document. See [processing modes](/ingestion/add-memories#processing-modes). ## 2. Ingest a document @@ -603,22 +603,22 @@ Nothing was reloaded from your process. Memory and docs live in supermemory. ## Where next - + Conversations, files, URLs, customId updates, and status. - + Hybrid vs memories, filters, thresholds, rerank. - + How relations and entity chains are produced. - + Static vs dynamic, and when to inject a profile every turn. - + withSupermemory modes, customId, addMemory. - + Isolation for multi-tenant products. diff --git a/apps/docs/recall/memory-operations.mdx b/apps/docs/recall/memory-operations.mdx index 6e58e8e2..c34ef4d8 100644 --- a/apps/docs/recall/memory-operations.mdx +++ b/apps/docs/recall/memory-operations.mdx @@ -1,8 +1,8 @@ --- -title: "Memory Operations" -sidebarTitle: "CRUD & Forgetting" +title: "Memory operations" +sidebarTitle: "CRUD & forgetting" description: "Advanced memory operations (v4 API)" -icon: "database" +icon: "/icons/hugeicons/database-01.svg" --- @@ -12,7 +12,7 @@ For document management (list, get, update, delete), see [Document Operations](/ For ingesting raw content (text, files, URLs) through the processing pipeline, see [Add Context](/ingestion/add-memories). -## Create Memories +## Create memories Create memories directly without going through the document ingestion workflow. Memories are embedded and immediately searchable. @@ -112,14 +112,12 @@ This is useful for storing user preferences, traits, or any structured facts whe | `memories[].createdAt` | string | ISO 8601 timestamp | -**When to use this vs [Add Context](/ingestion/add-memories)?** - -Use **Create Memories** when you already know the exact facts to store (user preferences, traits, structured data). Use **Add Context** when you have raw content (conversations, documents, URLs) that Supermemory should process and extract memories from. +**When should you create memories directly?** When you already know the exact facts to store, such as user preferences, traits or structured data. When you have raw content (conversations, documents, URLs) that Supermemory should process and extract memories from, [add context](/ingestion/add-memories) instead. --- -## Forget Memory +## Forget memory Soft-delete a single memory — excluded from search results but preserved in the database. Identify it by `id` or by exact `content`, scoped to its `containerTag`. @@ -171,7 +169,7 @@ The memory will no longer appear in search results but remains in the database ( --- -## Forget Matching +## Forget matching Forget in bulk in one call, two ways. Give a **`query`** (a prompt or topic) and the service semantically searches the container, an LLM decides which memories are genuinely about your target, and those are soft-deleted — use this for "forget everything about X". Or give an explicit **`ids`** list to forget exactly those memories with no search. Provide one or the other. @@ -288,7 +286,7 @@ Identity is server-owned: the LLM only ever references opaque handles for the me --- -## Update Memory (Versioned) +## Update memory (versioned) Update a memory by creating a new version. The original is preserved with `isLatest=false`. @@ -341,7 +339,7 @@ Update a memory by creating a new version. The original is preserved with `isLat --- -## Next Steps +## Next steps - [Review Inferred Memories](/recall/memory-review) — Approve or decline low-confidence memories - [Document Operations](/ingestion/document-operations) — Manage documents (SDK supported) diff --git a/apps/docs/recall/memory-review.mdx b/apps/docs/recall/memory-review.mdx index 8184bb96..50420c57 100644 --- a/apps/docs/recall/memory-review.mdx +++ b/apps/docs/recall/memory-review.mdx @@ -1,18 +1,17 @@ --- -title: "Review Inferred Memories" -sidebarTitle: "Memory Review" -description: "List and act on low-confidence inferred memories — approve, decline, or undo" -icon: "list-checks" +title: "Review inferred memories" +sidebarTitle: "Memory review" +description: "List low-confidence inferred memories, then approve, decline or undo them." +icon: "/icons/hugeicons/check-list.svg" --- -Supermemory's graph automatically **derives** new facts from patterns across your -existing memories (see [Graph Memory](/concepts/graph-memory)). These derived facts -are guesses — the engine wasn't told them directly — so they are flagged as -**inferred** (`isInference: true`) and **down-weighted in search** until confirmed. +Supermemory's graph derives new facts from patterns across your existing memories +(see [graph memory](/concepts/graph-memory)). Because nobody stated these facts +directly, they are flagged as inferred (`isInference: true`) and **down-weighted in +search until someone confirms them**. -These two endpoints let you build a review experience on top of that queue: list the -inferred memories awaiting review, then **approve**, **decline**, or **undo** a -decision on each one. +These two endpoints let you build a review flow on top of that queue: list the +inferred memories awaiting review, then approve, decline or undo a decision on each one. These endpoints are scoped to a single [container tag](/concepts/container-tags) @@ -37,7 +36,7 @@ clears that stamp — and un-forgets a declined memory — bringing it back. --- -## List Inferred Memories +## List inferred memories Return the inferred memories for a container tag that are still awaiting review (the review queue). Reviewed memories are excluded. @@ -108,7 +107,7 @@ is forgotten, expired, or already reviewed. An unknown or empty container tag re --- -## Review an Inferred Memory +## Review an inferred memory Record a decision on a single inferred memory. @@ -281,7 +280,7 @@ a request and the memory simply stays in the queue for a later session. --- -## Next Steps +## Next steps - [Graph Memory](/concepts/graph-memory) — How inferred (`derive`) memories are created - [Memory Operations](/recall/memory-operations) — Create, forget, and update memories diff --git a/apps/docs/recall/search.mdx b/apps/docs/recall/search.mdx index 07f93515..6e58e226 100644 --- a/apps/docs/recall/search.mdx +++ b/apps/docs/recall/search.mdx @@ -2,7 +2,7 @@ title: "Search" sidebarTitle: "Search API" description: "Semantic search across your memories and documents" -icon: "search" +icon: "/icons/hugeicons/search-01.svg" --- Search through your memories and documents with a single API call. @@ -15,7 +15,7 @@ Search through your memories and documents with a single API call. **TypeScript SDK:** call `client.search({ q, searchMode })` directly — `searchMode` (`"memories"`, `"documents"`, or `"hybrid"`) picks what comes back. `client.search.memories()` and `client.search.documents()` still work but are deprecated; no migration is required, just use `client.search()` going forward. The Python SDK is unaffected — `client.search.memories()` remains the call there. -## Quick Start +## Quick start @@ -114,7 +114,7 @@ In hybrid mode, results contain either a `memory` field (extracted facts) or a ` | `filters` | object | — | Metadata filters (`AND`/`OR` structure) | | `include` | object | — | `{ documents, summaries, relatedMemories, forgottenMemories }` — opt in to extra context per result | -### Search Modes +### Search modes - **`hybrid`** (recommended) — Searches both memories and document chunks, and returns both in the response - **`memories`** — Only searches extracted memories @@ -165,7 +165,7 @@ const results = await client.search({ }); ``` - + - **String equality:** `{ key: "status", value: "active" }` - **String contains:** `{ filterType: "string_contains", key: "title", value: "react" }` - **Numeric:** `{ filterType: "numeric", key: "priority", value: "5", numericOperator: ">=" }` @@ -177,7 +177,7 @@ const results = await client.search({ --- -## Query Optimization +## Query optimization ### Reranking @@ -203,7 +203,7 @@ await client.search({ q: "...", threshold: 0.3 }); await client.search({ q: "...", threshold: 0.8 }); ``` -### Including Forgotten Memories +### Including forgotten memories By default, search excludes memories that have been forgotten or have passed their `forgetAfter` expiration. Set `include.forgottenMemories` to `true` to recover them: @@ -216,7 +216,7 @@ await client.search({ --- -## Chatbot Example +## Chatbot example Optimal configuration for conversational AI: @@ -236,7 +236,7 @@ async function getContext(userId: string, message: string) { } ``` - + ```typescript interface SearchResult { id: string; @@ -258,7 +258,7 @@ async function getContext(userId: string, message: string) { --- -## Next Steps +## Next steps - [Ingesting Content](/ingestion/add-memories) — Add content to search - [User Profiles](/recall/user-profiles) — Get user context with search diff --git a/apps/docs/recall/user-profiles.mdx b/apps/docs/recall/user-profiles.mdx index b2348093..d1be45ae 100644 --- a/apps/docs/recall/user-profiles.mdx +++ b/apps/docs/recall/user-profiles.mdx @@ -1,8 +1,8 @@ --- -title: "User Profiles" +title: "User profiles" sidebarTitle: "Overview" description: "Fetch and use automatically maintained user context" -icon: "user" +icon: "/icons/hugeicons/user.svg" --- User profiles are extremely short summaries of context about an entity (Usually a user, but can be anything) which includes both the *static* facts about them, as well as a few recent episodes. @@ -17,7 +17,7 @@ Get a user's profile — their static facts and dynamic context — with a singl Profiles are built automatically as you [ingest content](/ingestion/add-memories). No setup required. -## Quick Start +## Quick start @@ -76,7 +76,7 @@ Profiles are built automatically as you [ingest content](/ingestion/add-memories --- -## Profile + Search +## Profile + search Get profile and search results in one call by adding the `q` parameter: @@ -127,7 +127,7 @@ Get profile and search results in one call by adding the `q` parameter: --- -## Filtering Profiles +## Filtering profiles Profiles support the same [metadata filters](/concepts/filtering) as `/search` and `/documents/list` — `filters` narrows which memories are eligible to contribute to `static`, `dynamic`, and `buckets`, not just which search results come back. @@ -179,7 +179,7 @@ All filter types from [Organizing & Filtering](/concepts/filtering) are supporte --- -## Building Prompts +## Building prompts The most common pattern — inject profile into your LLM's system prompt: @@ -208,7 +208,7 @@ Personalize responses to their expertise and preferences.`; --- -## Full Context Pattern +## Full context pattern Get profile + query-specific memories in one call: @@ -235,22 +235,22 @@ ${result.searchResults?.results.map(m => m.memory).join('\n') || 'None'} --- -## Profile Buckets +## Profile buckets Buckets are **custom topical categories** for a profile — an axis that sits alongside `static` and `dynamic`, grouping facts by subject (e.g. `preferences`, `goals`, `work`) instead of by how long-lived they are. - + Read and configure buckets — request bucketed profiles, create org/space buckets, get AI-generated bucket suggestions, and see validation limits. --- -## Framework Examples +## Framework examples - + ```typescript async function withProfile(req, res, next) { if (!req.user?.id) return next(); @@ -274,7 +274,7 @@ Buckets are **custom topical categories** for a profile — an axis that sits al ``` - + ```typescript // app/api/chat/route.ts export async function POST(req: NextRequest) { @@ -290,7 +290,7 @@ Buckets are **custom topical categories** for a profile — an axis that sits al ``` - + ```typescript import { withSupermemory } from "@supermemory/tools/ai-sdk" import { openai } from "@ai-sdk/openai" @@ -312,7 +312,7 @@ Buckets are **custom topical categories** for a profile — an axis that sits al --- -## Response Schema +## Response schema ```typescript interface ProfileResponse { @@ -331,7 +331,7 @@ interface ProfileResponse { --- -## Next Steps +## Next steps - [Profile Buckets](/user-profiles/buckets) — Custom topical categories for profiles - [User Profiles Concept](/concepts/user-profiles) — Understand static vs dynamic diff --git a/apps/docs/self-hosting/configuration.mdx b/apps/docs/self-hosting/configuration.mdx index 655d40d6..b2584bad 100644 --- a/apps/docs/self-hosting/configuration.mdx +++ b/apps/docs/self-hosting/configuration.mdx @@ -1,8 +1,8 @@ --- -title: "Self-Hosting Configuration" +title: "Self-hosting configuration" sidebarTitle: "Configuration" description: "Every environment variable the self-hosted server understands." -icon: "settings" +icon: "/icons/hugeicons/settings-01.svg" --- The self-hosted server aims for **zero configuration** — the only required input is one LLM provider key, which the first-boot wizard collects interactively (or set via env var for non-interactive deployments). Embeddings default to local English; you can pick another provider in the optional wizard step or via env. Everything else below is opt-in. @@ -65,7 +65,7 @@ Nothing to configure. Uploaded files (PDFs, images) are stored on local disk ins By default, vectors are computed locally with `Xenova/bge-base-en-v1.5` (768d) — no embedding API key. On interactive first boot you can pick a different provider after the LLM key step; for Docker/CI set env vars instead. -Full provider table, multilingual guidance, remote examples (OpenAI / Gemini / Ollama), and the re-ingestion / dimension-lock warning: **[Embeddings (self-hosted)](/self-hosting/embeddings)**. +The full provider table, multilingual guidance, remote examples (OpenAI, Gemini, Ollama) and the dimension-lock warning are in [embeddings for self-hosting](/self-hosting/embeddings). | Variable | Purpose | Default | |---|---|---| diff --git a/apps/docs/self-hosting/embeddings.mdx b/apps/docs/self-hosting/embeddings.mdx index 4d66f223..19f4653a 100644 --- a/apps/docs/self-hosting/embeddings.mdx +++ b/apps/docs/self-hosting/embeddings.mdx @@ -1,170 +1,170 @@ ---- -title: "Embeddings (self-hosted)" -sidebarTitle: "Embeddings" -description: "Local and remote embedding providers for Supermemory local — defaults, env vars, multilingual options, and dimension lock." -icon: "waypoints" ---- - -Self-hosted Supermemory uses the **same embedding provider stack** as the hosted platform: local ONNX models, OpenAI, Gemini, or any OpenAI-compatible embeddings endpoint (including Ollama). LLM keys power extraction and summarization; embeddings are configured separately. - -## Defaults - -| | | -|---|---| -| Provider | `local` | -| Model | `Xenova/bge-base-en-v1.5` | -| Dimensions | `768` | -| API key | None — runs on your machine | - -Press Enter at the optional first-boot picker to keep this default. Nothing is sent off-box to embed. - - -The default local model is **English-only**. Non-English content can ingest successfully while dense semantic recall stays weak. See [Multilingual](#multilingual). - - -## First-time setup (interactive) - -On first boot with a TTY, Supermemory asks for an LLM API key (required), then optionally which embedding model to use. - -1. Choose or paste an LLM provider key (OpenAI, Anthropic, Gemini, Groq, or OpenAI-compatible). -2. Optionally pick an embedding provider/model. **Press Enter to keep the local English model.** -3. Choices are saved encrypted under your data directory (`$SUPERMEMORY_DATA_DIR`, typically `./.supermemory` / `~/.supermemory`). - -Boot order is intentional: LLM keys load first so remote embedding options can reuse them (for example OpenAI or Gemini embeddings with the same key). - - -**First boot (terminal):** Supermemory asks for an LLM API key (required), then optionally which embedding model to use. Press Enter to keep the local English model. Choices are saved encrypted under your data directory. - - -## Configuration (env) - -For Docker, CI, or any non-interactive deploy, set env vars — there is **no interactive prompt without a TTY**. - -| Variable | Purpose | Default | -|---|---|---| -| `SUPERMEMORY_EMBEDDING_PROVIDER` | Embedding backend: `local`, `openai`, `openai-compatible`, or `gemini` (for Ollama, use `openai-compatible` with `SUPERMEMORY_EMBEDDING_BASE_URL`) | `local` | -| `SUPERMEMORY_EMBEDDING_MODEL` | Model id for the chosen provider (e.g., `Xenova/bge-m3`, `text-embedding-3-small`) | `Xenova/bge-base-en-v1.5` (local) | -| `SUPERMEMORY_EMBEDDING_DIMENSIONS` | Vector size; must match the model's native dimensions and stored data | `768` (local default) | -| `SUPERMEMORY_EMBEDDING_BASE_URL` | Base URL for OpenAI-compatible embedding APIs (Ollama, vLLM, etc.) | unset | -| `SUPERMEMORY_EMBEDDING_API_KEY` | API key for embedding endpoint (falls back to `OPENAI_API_KEY` / `GEMINI_API_KEY`; required for `openai-compatible`, use any non-empty string if unauthenticated) | unset | -| `OPENAI_API_KEY` | Used when provider is `openai` (or compatible) if not otherwise supplied | unset | -| `GEMINI_API_KEY` | Used when provider is `gemini` | unset | - -Local worker tuning (throughput only — does not change model or dimensions): - -| Variable | Purpose | Default | -|---|---|---| -| `SUPERMEMORY_LOCAL_EMBEDDING_POOL_SIZE` | Number of embedding workers | `1` | -| `SUPERMEMORY_LOCAL_EMBEDDING_WASM_THREADS` | Compute threads per worker | `1` | -| `SUPERMEMORY_LOCAL_EMBEDDING_BATCH_SIZE` | Texts per worker dispatch | `8` | -| `SUPERMEMORY_LOCAL_EMBEDDING_IDLE_TIMEOUT_MS` | Idle time before workers shut down | `120000` | -| `SUPERMEMORY_SKIP_EMBEDDING_PREWARM` | Skip startup prewarm, load on first use | unset | - -Ingestion memory headroom is controlled by `SUPERMEMORY_EMBEDDING_RAM_LIMIT` — see [Memory limits & ingestion queue](/self-hosting/configuration#memory-limits-&-ingestion-queue). - - -**Docker / production:** Set at least one LLM key and, if you don’t want local embeddings, set `SUPERMEMORY_EMBEDDING_PROVIDER` / `SUPERMEMORY_EMBEDDING_MODEL` / `SUPERMEMORY_EMBEDDING_DIMENSIONS` (and base URL or API key as needed). There is no interactive prompt without a TTY. - - -## Multilingual - -The default `Xenova/bge-base-en-v1.5` model is trained for English. For German, Dutch, and other non-English corpora, dense recall can fail even when hybrid keyword search still finds rare tokens. - -For multilingual or non-English deployments, switch **before** large backfills: - -```bash -# Example: local multilingual (set dimensions to match the model) -SUPERMEMORY_EMBEDDING_PROVIDER=local -SUPERMEMORY_EMBEDDING_MODEL=Xenova/bge-m3 -SUPERMEMORY_EMBEDDING_DIMENSIONS=1024 -``` - -Or use a remote multilingual embedding API (OpenAI, Gemini, or Ollama with a multilingual embed model). Set provider, model, and dimensions together. Changing them later requires a fresh data directory or full re-ingestion — see below. - -## Remote providers - -### Local (default) - -```bash -# Explicit local default — no embedding API key -SUPERMEMORY_EMBEDDING_PROVIDER=local -SUPERMEMORY_EMBEDDING_MODEL=Xenova/bge-base-en-v1.5 -SUPERMEMORY_EMBEDDING_DIMENSIONS=768 -``` - -#### Supported local models & dimensions - -When using `SUPERMEMORY_EMBEDDING_PROVIDER=local`, local ONNX models do not support dimension reduction. `SUPERMEMORY_EMBEDDING_DIMENSIONS` must match the model's native dimensions: - -| Model ID | Native Dimensions | Description | -|---|---|---| -| `Xenova/bge-base-en-v1.5` | `768` | Default local model (English) | -| `Xenova/bge-m3` | `1024` | Multilingual (uses `cls` pooling) | -| `Xenova/bge-small-en-v1.5` | `384` | English (lightweight) | -| `Xenova/bge-large-en-v1.5` | `1024` | English (high capacity) | -| `Xenova/multilingual-e5-small` | `384` | Multilingual (lightweight) | -| `Xenova/multilingual-e5-base` | `768` | Multilingual | -| `Xenova/multilingual-e5-large` | `1024` | Multilingual (high capacity) | -| `Xenova/all-MiniLM-L6-v2` | `384` | English general purpose | -| `Xenova/paraphrase-multilingual-MiniLM-L12-v2` | `384` | Multilingual sentence similarity | - -### OpenAI - -```bash -OPENAI_API_KEY=sk-... -SUPERMEMORY_EMBEDDING_PROVIDER=openai -SUPERMEMORY_EMBEDDING_MODEL=text-embedding-3-small -SUPERMEMORY_EMBEDDING_DIMENSIONS=1536 -``` - -### Gemini - -```bash -GEMINI_API_KEY=... -SUPERMEMORY_EMBEDDING_PROVIDER=gemini -SUPERMEMORY_EMBEDDING_MODEL=text-embedding-004 -SUPERMEMORY_EMBEDDING_DIMENSIONS=768 -``` - -### Ollama (OpenAI-compatible) - -```bash -SUPERMEMORY_EMBEDDING_PROVIDER=openai-compatible -SUPERMEMORY_EMBEDDING_BASE_URL=http://localhost:11434/v1 -SUPERMEMORY_EMBEDDING_API_KEY=ollama -SUPERMEMORY_EMBEDDING_MODEL=nomic-embed-text -SUPERMEMORY_EMBEDDING_DIMENSIONS=768 -``` - -Use the dimension published for your chosen model. A mismatch with vectors already in the store fails boot. - -## Changing models later - - -**Not supported in place.** Embeddings from different models (or different dimensions) are not comparable. Start from a fresh data directory or re-ingest all content so vectors stay in one space. If configured dimensions disagree with stored data, the server **refuses to boot**. - - -**Changing embeddings later:** Not supported in place. Start from a fresh data directory or re-ingest all content so vectors stay comparable. - -> [!IMPORTANT] -> **Release Binary Env Var Support (v0.0.6 / v0.0.7-rc.2 vs v0.0.7+)** -> -> In release `v0.0.6` and `v0.0.7-rc.2`, the compiled standalone release binaries were built without pluggable embedding configuration hooks (environment variables like `SUPERMEMORY_EMBEDDING_PROVIDER`, `SUPERMEMORY_EMBEDDING_MODEL`, and `SUPERMEMORY_EMBEDDING_DIMENSIONS` were omitted from the binary and defaulted to local English `Xenova/bge-base-en-v1.5`). -> -> **Resolution & Upgrade Steps:** -> - Full pluggable embedding configuration via environment variables is active in `v0.0.7` and `v0.0.8+`. -> - **Existing Data Directory Notice:** If your data directory (`$SUPERMEMORY_DATA_DIR`) was created on `v0.0.6`, it contains pre-existing rows embedded with the 768d local model without an `embedding-plan.json` lock file. When upgrading to `v0.0.8+`, the server automatically assumes and locks to legacy `local · Xenova/bge-base-en-v1.5 · 768d` to preserve vector compatibility. -> - To switch to a custom provider or multilingual model (`bge-m3`, `openai`, etc.), you **must wipe the data directory** (e.g. `rm -rf "$SUPERMEMORY_DATA_DIR"`) or point `SUPERMEMORY_DATA_DIR` to a fresh directory before starting the server with your new embedding variables. - -> [!IMPORTANT] -> **Model Mixing Bug in v0.0.5 (Exact match returns nothing)** -> -> In version `v0.0.5`, there was a bug where the server could mix different embedding models between write and read paths (e.g., document ingestion using OpenAI but memory queries using local default embeddings). In multilingual contexts like Japanese (which lacks space tokenization for fallback lexical FTS matching), this caused exact-text memory searches through `/v4/search` and `/v4/profile` to silently return `{"results":[],"total":0}`. -> -> **Resolution:** -> This was fully resolved in `v0.0.7` by locking the embedding plan uniformly across all document and query embedding paths (enforced via a locked plan in the database store). If you are running `v0.0.5` and experiencing this issue, you should upgrade to `v0.0.7` or later. - -## Related - -- [Configuration](/self-hosting/configuration) — LLM providers, storage, ingestion limits -- [Quickstart](/self-hosting/quickstart) — install and first memory +--- +title: "Embeddings (self-hosted)" +sidebarTitle: "Embeddings" +description: "Local and remote embedding providers for Supermemory local: defaults, env vars, multilingual options and dimension lock." +icon: "/icons/hugeicons/route-02.svg" +--- + +Self-hosted Supermemory uses the **same embedding provider stack** as the hosted platform: local ONNX models, OpenAI, Gemini, or any OpenAI-compatible embeddings endpoint (including Ollama). LLM keys power extraction and summarization; embeddings are configured separately. + +## Defaults + +| | | +|---|---| +| Provider | `local` | +| Model | `Xenova/bge-base-en-v1.5` | +| Dimensions | `768` | +| API key | None — runs on your machine | + +Press Enter at the optional first-boot picker to keep this default. Nothing is sent off-box to embed. + + +The default local model is **English-only**. Non-English content can ingest successfully while dense semantic recall stays weak. See [Multilingual](#multilingual). + + +## First-time setup (interactive) + +On first boot with a TTY, Supermemory asks for an LLM API key (required), then optionally which embedding model to use. + +1. Choose or paste an LLM provider key (OpenAI, Anthropic, Gemini, Groq, or OpenAI-compatible). +2. Optionally pick an embedding provider/model. **Press Enter to keep the local English model.** +3. Choices are saved encrypted under your data directory (`$SUPERMEMORY_DATA_DIR`, typically `./.supermemory` / `~/.supermemory`). + +Boot order is intentional: LLM keys load first so remote embedding options can reuse them (for example OpenAI or Gemini embeddings with the same key). + + +**First boot (terminal):** Supermemory asks for an LLM API key (required), then optionally which embedding model to use. Press Enter to keep the local English model. Choices are saved encrypted under your data directory. + + +## Configuration (env) + +For Docker, CI, or any non-interactive deploy, set env vars — there is **no interactive prompt without a TTY**. + +| Variable | Purpose | Default | +|---|---|---| +| `SUPERMEMORY_EMBEDDING_PROVIDER` | Embedding backend: `local`, `openai`, `gemini`, or an OpenAI-compatible remote (`ollama` / custom base URL) | `local` | +| `SUPERMEMORY_EMBEDDING_MODEL` | Model id for the chosen provider (e.g. `Xenova/bge-m3`, `text-embedding-3-small`) | `Xenova/bge-base-en-v1.5` (local) | +| `SUPERMEMORY_EMBEDDING_DIMENSIONS` | Vector size; must match the model's native dimensions and stored data | `768` (local default) | +| `SUPERMEMORY_EMBEDDING_BASE_URL` | Base URL for OpenAI-compatible embedding APIs (Ollama, vLLM, etc.) | unset | +| `SUPERMEMORY_EMBEDDING_API_KEY` | API key for embedding endpoint (falls back to `OPENAI_API_KEY` / `GEMINI_API_KEY`; required for `openai-compatible`, use any non-empty string if unauthenticated) | unset | +| `OPENAI_API_KEY` | Used when provider is `openai` (or compatible) if not otherwise supplied | unset | +| `GEMINI_API_KEY` | Used when provider is `gemini` | unset | + +Local worker tuning (throughput only — does not change model or dimensions): + +| Variable | Purpose | Default | +|---|---|---| +| `SUPERMEMORY_LOCAL_EMBEDDING_POOL_SIZE` | Number of embedding workers | `1` | +| `SUPERMEMORY_LOCAL_EMBEDDING_WASM_THREADS` | Compute threads per worker | `1` | +| `SUPERMEMORY_LOCAL_EMBEDDING_BATCH_SIZE` | Texts per worker dispatch | `8` | +| `SUPERMEMORY_LOCAL_EMBEDDING_IDLE_TIMEOUT_MS` | Idle time before workers shut down | `120000` | +| `SUPERMEMORY_SKIP_EMBEDDING_PREWARM` | Skip startup prewarm, load on first use | unset | + +Ingestion memory headroom is controlled by `SUPERMEMORY_EMBEDDING_RAM_LIMIT` — see [Memory limits & ingestion queue](/self-hosting/configuration#memory-limits-&-ingestion-queue). + + +**Docker / production:** Set at least one LLM key and, if you don’t want local embeddings, set `SUPERMEMORY_EMBEDDING_PROVIDER` / `SUPERMEMORY_EMBEDDING_MODEL` / `SUPERMEMORY_EMBEDDING_DIMENSIONS` (and base URL or API key as needed). There is no interactive prompt without a TTY. + + +## Multilingual + +The default `Xenova/bge-base-en-v1.5` model is trained for English. For German, Dutch, and other non-English corpora, dense recall can fail even when hybrid keyword search still finds rare tokens. + +For multilingual or non-English deployments, switch **before** large backfills: + +```bash +# Example: local multilingual (set dimensions to match the model) +SUPERMEMORY_EMBEDDING_PROVIDER=local +SUPERMEMORY_EMBEDDING_MODEL=Xenova/bge-m3 +SUPERMEMORY_EMBEDDING_DIMENSIONS=1024 +``` + +Or use a remote multilingual embedding API (OpenAI, Gemini, or Ollama with a multilingual embed model). Set provider, model, and dimensions together. Changing them later requires a fresh data directory or full re-ingestion — see below. + +## Remote providers + +### Local (default) + +```bash +# Explicit local default — no embedding API key +SUPERMEMORY_EMBEDDING_PROVIDER=local +SUPERMEMORY_EMBEDDING_MODEL=Xenova/bge-base-en-v1.5 +SUPERMEMORY_EMBEDDING_DIMENSIONS=768 +``` + +#### Supported local models & dimensions + +When using `SUPERMEMORY_EMBEDDING_PROVIDER=local`, local ONNX models do not support dimension reduction. `SUPERMEMORY_EMBEDDING_DIMENSIONS` must match the model's native dimensions: + +| Model ID | Native Dimensions | Description | +|---|---|---| +| `Xenova/bge-base-en-v1.5` | `768` | Default local model (English) | +| `Xenova/bge-m3` | `1024` | Multilingual (uses `cls` pooling) | +| `Xenova/bge-small-en-v1.5` | `384` | English (lightweight) | +| `Xenova/bge-large-en-v1.5` | `1024` | English (high capacity) | +| `Xenova/multilingual-e5-small` | `384` | Multilingual (lightweight) | +| `Xenova/multilingual-e5-base` | `768` | Multilingual | +| `Xenova/multilingual-e5-large` | `1024` | Multilingual (high capacity) | +| `Xenova/all-MiniLM-L6-v2` | `384` | English general purpose | +| `Xenova/paraphrase-multilingual-MiniLM-L12-v2` | `384` | Multilingual sentence similarity | + +### OpenAI + +```bash +OPENAI_API_KEY=sk-... +SUPERMEMORY_EMBEDDING_PROVIDER=openai +SUPERMEMORY_EMBEDDING_MODEL=text-embedding-3-small +SUPERMEMORY_EMBEDDING_DIMENSIONS=1536 +``` + +### Gemini + +```bash +GEMINI_API_KEY=... +SUPERMEMORY_EMBEDDING_PROVIDER=gemini +SUPERMEMORY_EMBEDDING_MODEL=text-embedding-004 +SUPERMEMORY_EMBEDDING_DIMENSIONS=768 +``` + +### Ollama (OpenAI-compatible) + +```bash +SUPERMEMORY_EMBEDDING_PROVIDER=openai +SUPERMEMORY_EMBEDDING_BASE_URL=http://localhost:11434/v1 +OPENAI_API_KEY=ollama +SUPERMEMORY_EMBEDDING_MODEL=nomic-embed-text +SUPERMEMORY_EMBEDDING_DIMENSIONS=768 +``` + +Use the dimension published for your chosen model. A mismatch with vectors already in the store fails boot. + +## Changing models later + + +**Not supported in place.** Embeddings from different models (or different dimensions) are not comparable. Start from a fresh data directory or re-ingest all content so vectors stay in one space. If configured dimensions disagree with stored data, the server **refuses to boot**. + + +**Changing embeddings later:** Not supported in place. Start from a fresh data directory or re-ingest all content so vectors stay comparable. + +> [!IMPORTANT] +> **Release Binary Env Var Support (v0.0.6 / v0.0.7-rc.2 vs v0.0.7+)** +> +> In release `v0.0.6` and `v0.0.7-rc.2`, the compiled standalone release binaries were built without pluggable embedding configuration hooks (environment variables like `SUPERMEMORY_EMBEDDING_PROVIDER`, `SUPERMEMORY_EMBEDDING_MODEL`, and `SUPERMEMORY_EMBEDDING_DIMENSIONS` were omitted from the binary and defaulted to local English `Xenova/bge-base-en-v1.5`). +> +> **Resolution & Upgrade Steps:** +> - Full pluggable embedding configuration via environment variables is active in `v0.0.7` and `v0.0.8+`. +> - **Existing Data Directory Notice:** If your data directory (`$SUPERMEMORY_DATA_DIR`) was created on `v0.0.6`, it contains pre-existing rows embedded with the 768d local model without an `embedding-plan.json` lock file. When upgrading to `v0.0.8+`, the server automatically assumes and locks to legacy `local · Xenova/bge-base-en-v1.5 · 768d` to preserve vector compatibility. +> - To switch to a custom provider or multilingual model (`bge-m3`, `openai`, etc.), you **must wipe the data directory** (e.g. `rm -rf "$SUPERMEMORY_DATA_DIR"`) or point `SUPERMEMORY_DATA_DIR` to a fresh directory before starting the server with your new embedding variables. + +> [!IMPORTANT] +> **Model Mixing Bug in v0.0.5 (Exact match returns nothing)** +> +> In version `v0.0.5`, there was a bug where the server could mix different embedding models between write and read paths (e.g., document ingestion using OpenAI but memory queries using local default embeddings). In multilingual contexts like Japanese (which lacks space tokenization for fallback lexical FTS matching), this caused exact-text memory searches through `/v4/search` and `/v4/profile` to silently return `{"results":[],"total":0}`. +> +> **Resolution:** +> This was fully resolved in `v0.0.7` by locking the embedding plan uniformly across all document and query embedding paths (enforced via a locked plan in the database store). If you are running `v0.0.5` and experiencing this issue, you should upgrade to `v0.0.7` or later. + +## Related + +- [Configuration](/self-hosting/configuration) — LLM providers, storage, ingestion limits +- [Quickstart](/self-hosting/quickstart) — install and first memory diff --git a/apps/docs/self-hosting/local-vs-enterprise.mdx b/apps/docs/self-hosting/local-vs-enterprise.mdx index 3aecdf10..8325b17c 100644 --- a/apps/docs/self-hosting/local-vs-enterprise.mdx +++ b/apps/docs/self-hosting/local-vs-enterprise.mdx @@ -2,7 +2,7 @@ title: "Local vs. Enterprise" sidebarTitle: "Local vs. Enterprise" description: "Supermemory local is for builders. Supermemory Enterprise is for organizations." -icon: "building-2" +icon: "/icons/hugeicons/building-03.svg" --- Supermemory local — the self-hosted binary — is free, open source, and built for individual developers: local-first workflows, prototyping, air-gapped experiments, privacy-sensitive side projects. @@ -47,10 +47,10 @@ Local is bounded by one machine — which is the point. Enterprise runs on globa The two speak the same API. Code written against your local server moves to Enterprise by changing the `baseURL` — and vice versa. Prototype locally, ship on Enterprise. - + Get a walkthrough of Supermemory Enterprise for your team - + Install the binary and build against the same API today diff --git a/apps/docs/self-hosting/overview.mdx b/apps/docs/self-hosting/overview.mdx index 8fc9fe23..4dea776a 100644 --- a/apps/docs/self-hosting/overview.mdx +++ b/apps/docs/self-hosting/overview.mdx @@ -2,7 +2,7 @@ title: "Supermemory local" sidebarTitle: "Overview" description: "State-of-the-art memory, running on your machine. One binary, zero config." -icon: "server" +icon: "/icons/hugeicons/server-stack-01.svg" --- Supermemory runs on your own hardware. It's the same memory engine behind the [hosted platform](https://console.supermemory.ai) — ingestion, memory extraction, hybrid semantic search, and the full API — as a single self-contained binary. @@ -54,7 +54,7 @@ const client = new Supermemory({ }) ``` -Everything in the [Memory API docs](/quickstart) works the same way. The coding plugins do too — [Claude Code](/integrations/claude-code), [Codex](/integrations/codex), and [OpenCode](/integrations/opencode) all target your local server with `SUPERMEMORY_API_URL=http://localhost:6767`. +Everything in the [Memory API docs](/quickstart) works the same way. The coding plugins do too — [Claude Code](/integrations/claude-code), [Muse Code](/integrations/muse-code), [Codex](/integrations/codex), and [OpenCode](/integrations/opencode) all target your local server with `SUPERMEMORY_API_URL=http://localhost:6767` (Muse: set `baseUrl` in `.muse/supermemory.json`, because hook env is cleared). ## Self-hosted vs. the platform @@ -76,13 +76,13 @@ If you outgrow a single machine — or want connectors, MCP, and the best-tuned ## Next steps - + Install, run, and store your first memory in under two minutes - + Every environment variable: LLM providers, storage, auth, tuning - + Local default, remote providers, multilingual, dimension lock diff --git a/apps/docs/self-hosting/providers.mdx b/apps/docs/self-hosting/providers.mdx index 84ec1c4e..741d1c7e 100644 --- a/apps/docs/self-hosting/providers.mdx +++ b/apps/docs/self-hosting/providers.mdx @@ -2,7 +2,7 @@ title: "Using supermemory local with different providers" sidebarTitle: "Providers" description: "Copy-paste .env setup for Ollama, OpenAI, Anthropic, Gemini, and OpenRouter" -icon: "route" +icon: "/icons/hugeicons/route-01.svg" --- Supermemory local needs one model provider to power summaries, contextual chunking, and memory extraction. Pick the tab for whichever one you already have a key for. For the full variable reference (fast/text model overrides, offline setup, tuning), see [Configuration](/self-hosting/configuration). diff --git a/apps/docs/self-hosting/quickstart.mdx b/apps/docs/self-hosting/quickstart.mdx index d0b37991..2fca989b 100644 --- a/apps/docs/self-hosting/quickstart.mdx +++ b/apps/docs/self-hosting/quickstart.mdx @@ -1,8 +1,8 @@ --- -title: "Self-Hosting Quickstart" +title: "Self-hosting quickstart" sidebarTitle: "Quickstart" description: "From zero to your first memory in under two minutes." -icon: "play" +icon: "/icons/hugeicons/play.svg" --- ## Install @@ -168,13 +168,13 @@ By default, all state lives in a single directory you can back up or move: ## Next steps - + LLM providers, local models, performance tuning - + Local default, OpenAI / Gemini / Ollama, multilingual - + The full API — it all works against your local server diff --git a/apps/docs/smfs/bash-tool-python.mdx b/apps/docs/smfs/bash-tool-python.mdx index 61092813..9f74f957 100644 --- a/apps/docs/smfs/bash-tool-python.mdx +++ b/apps/docs/smfs/bash-tool-python.mdx @@ -1,8 +1,8 @@ --- -title: "Bash Tool (Python)" -sidebarTitle: "Bash Tool (Python)" +title: "Bash tool (Python)" +sidebarTitle: "Bash tool (Python)" description: "supermemory-bash. The SMFS idea wrapped as a single agent tool, for Python agents and serverless runtimes." -icon: "terminal" +icon: "/icons/hugeicons/command-line.svg" --- `supermemory-bash` is the SMFS idea wrapped as a single agent tool: `run_bash(command)`. The "filesystem" is your Supermemory container. Runs anywhere Python runs. AWS Lambda, Modal, Fly Machines, Cloud Run, your laptop. No mount, no FUSE, no local disk. diff --git a/apps/docs/smfs/bash-tool.mdx b/apps/docs/smfs/bash-tool.mdx index 19aadd60..9c67ba6d 100644 --- a/apps/docs/smfs/bash-tool.mdx +++ b/apps/docs/smfs/bash-tool.mdx @@ -1,8 +1,8 @@ --- -title: "Bash Tool" -sidebarTitle: "Bash Tool" +title: "Bash tool" +sidebarTitle: "Bash tool" description: "@supermemory/bash. The SMFS idea wrapped as a single agent tool, for serverless and edge runtimes." -icon: "terminal" +icon: "/icons/hugeicons/command-line.svg" --- `@supermemory/bash` is the SMFS idea wrapped as a single agent tool: `run_bash(command)`. The "filesystem" is your Supermemory container. Runs anywhere TypeScript runs. Cloudflare Workers, AWS Lambda, Vercel, Node, the browser. No mount, no FUSE, no local disk. diff --git a/apps/docs/smfs/examples.mdx b/apps/docs/smfs/examples.mdx index 59cf60ff..836452d8 100644 --- a/apps/docs/smfs/examples.mdx +++ b/apps/docs/smfs/examples.mdx @@ -2,7 +2,7 @@ title: "Examples" sidebarTitle: "Examples" description: "Full web-based demo apps you can clone and run." -icon: "code" +icon: "/icons/hugeicons/source-code.svg" --- Web-based example apps showing SMFS in realistic use cases. Each one is a @@ -11,7 +11,7 @@ complete project with its own README, dependencies, and a working UI. Upload documents and chat with an AI that can search and cite them. @@ -19,7 +19,7 @@ complete project with its own README, dependencies, and a working UI. Add notes and chat with an AI that can search your knowledge base. @@ -27,7 +27,7 @@ complete project with its own README, dependencies, and a working UI. Write and run code in an E2B sandbox with persistent AI memory. diff --git a/apps/docs/smfs/install.mdx b/apps/docs/smfs/install.mdx index 64d20d0b..71b0d9d5 100644 --- a/apps/docs/smfs/install.mdx +++ b/apps/docs/smfs/install.mdx @@ -2,7 +2,7 @@ title: "Install SMFS" sidebarTitle: "Install" description: "Install, log in, mount." -icon: "download" +icon: "/icons/hugeicons/download-01.svg" --- ## 1. Install the binary diff --git a/apps/docs/smfs/mount.mdx b/apps/docs/smfs/mount.mdx index 1c31bcb2..d3b48c91 100644 --- a/apps/docs/smfs/mount.mdx +++ b/apps/docs/smfs/mount.mdx @@ -2,7 +2,7 @@ title: "Mount" sidebarTitle: "Mount" description: "Mount a Supermemory container, generate memories, and sync." -icon: "hard-drive" +icon: "/icons/hugeicons/hard-drive.svg" --- A mount turns a Supermemory container into a directory on your machine. macOS uses NFSv3, Linux uses FUSE. Both are handled for you. @@ -130,7 +130,7 @@ Pushes pending writes and pulls remote changes immediately. Useful right before Every `smfs` subcommand. Click any one to expand. - + Mount a container. Defaults to `.//`; pass `--path` to mount elsewhere. ```bash @@ -141,7 +141,7 @@ Every `smfs` subcommand. Click any one to expand. See the flags table above for everything you can pass. - + Unmount a running mount. Drains pending writes up to `--drain-timeout`, then exits the daemon. Anything not drained resumes on the next mount. ```bash @@ -156,7 +156,7 @@ Every `smfs` subcommand. Click any one to expand. ``` - + List every SMFS mount running on this machine. ```bash @@ -164,7 +164,7 @@ Every `smfs` subcommand. Click any one to expand. ``` - + Show daemon status for a mount: connectivity, queue depth, last sync. Auto-detects the tag via the nearest `.smfs` marker. ```bash @@ -174,7 +174,7 @@ Every `smfs` subcommand. Click any one to expand. ``` - + Tail the daemon log for a mount. Auto-detects the tag via the nearest `.smfs` marker. ```bash @@ -184,7 +184,7 @@ Every `smfs` subcommand. Click any one to expand. ``` - + Force an immediate sync cycle. Push pending writes, pull remote changes. ```bash @@ -198,7 +198,7 @@ Every `smfs` subcommand. Click any one to expand. ``` - + Semantic search across a container without being inside the mount. The optional second argument scopes the search to a subpath inside the container. Inside a mount, plain `grep` already does this; `smfs grep` is the explicit form for scripts. ```bash @@ -207,7 +207,7 @@ Every `smfs` subcommand. Click any one to expand. ``` - + One-time auth. Prompts for your Supermemory API key and stores it in your global credentials. You can also pass it directly with `--key`. ```bash @@ -216,7 +216,7 @@ Every `smfs` subcommand. Click any one to expand. ``` - + Print the currently-authenticated user, organization, and API endpoint. ```bash @@ -224,7 +224,7 @@ Every `smfs` subcommand. Click any one to expand. ``` - + Remove stored credentials. Active mounts keep running until you `smfs unmount` them. ```bash @@ -232,7 +232,7 @@ Every `smfs` subcommand. Click any one to expand. ``` - + Force-installs the shell wrapper that makes plain `grep` semantic inside mounts. Writes directly to `~/.zshrc`. `smfs mount` also installs it automatically the first time, so you only need this to refresh after an upgrade. ```bash @@ -242,7 +242,7 @@ Every `smfs` subcommand. Click any one to expand. Reopen your terminal (or `source ~/.zshrc`) after running it. - + Self-install. Copies the running binary to `~/.local/bin` and resets permissions. Run this if your `smfs` install ever feels broken. ```bash @@ -254,19 +254,19 @@ Every `smfs` subcommand. Click any one to expand. ## FAQ - + Run `smfs init` to force-install the shell wrapper. It writes directly to `~/.zshrc`. Then reopen your terminal so the new shell picks it up. The wrapper only triggers when you're inside a mount (it looks for the `.smfs` marker file at the mount root). Outside a mount, `grep` stays normal. Inside a mount, any flag you pass falls through to the real `grep`. - + Not yet. SMFS supports macOS (arm64, x64) and Linux (arm64, x64) for now. Windows isn't on the v0 roadmap. On Windows, use the [Bash Tool](/smfs/bash-tool) instead. It runs anywhere TypeScript runs and gives your agent the same `ls`, `cat`, `grep`, `sgrep` surface without needing a mount. - + Re-mount with `--clean` to wipe the local cache and pull everything fresh from the API: ```bash @@ -277,11 +277,11 @@ Every `smfs` subcommand. Click any one to expand. Nothing on the server changes; only the local SQLite cache gets reset. - + Yes. Once a container is mounted, anything on that machine can read and write through the mount path. The constraint is one mount per container tag per device. Mount it once, point both agents at the same folder. - + Yes, absolutely. Mount the same container tag from each sandbox. Bidirectional sync keeps everything in step as either side writes, so Agent A in sandbox 1 sees Agent B's writes from sandbox 2 within a sync interval. To avoid stepping on each other, give each agent its own subdirectory (`/agent_a/`, `/agent_b/`, etc.). They can still read across the whole mount, cross-reference each other's findings, and build on each other's work. The shared container is the point. diff --git a/apps/docs/smfs/overview.mdx b/apps/docs/smfs/overview.mdx index 74884a12..5a9464cf 100644 --- a/apps/docs/smfs/overview.mdx +++ b/apps/docs/smfs/overview.mdx @@ -2,7 +2,7 @@ title: "SMFS" sidebarTitle: "Overview" description: "Memory your agent can grep." -icon: "database" +icon: "/icons/hugeicons/database-01.svg" --- **SMFS** mounts your Supermemory container as a real directory. Agents read it with `ls`, `cat`, and `grep`. No SDK to learn, no client to wire up, no embeddings to think about. @@ -29,10 +29,10 @@ You get filesystem ergonomics without paying the filesystem tax in tokens. Pick by where your agent runs. - + For agents and tools with a real filesystem. Claude Code, Cursor, devcontainers, Docker, Codespaces. NFSv3 on macOS, FUSE on Linux. - + For agents running serverless or at the edge. Cloudflare Workers, AWS Lambda, Vercel, Modal. A virtual bash where the filesystem is your container. Available as [`@supermemory/bash`](/smfs/bash-tool) for TypeScript and [`supermemory-bash`](/smfs/bash-tool-python) for Python. @@ -42,16 +42,16 @@ Pick by where your agent runs. Already using a sandbox or agent platform? Jump straight to the guide for your provider. - + Isolated Linux sandboxes with millisecond boot times. Mount SMFS inside or use the bash tool from your orchestrating code. - + Firecracker microVMs for AI code execution. Install SMFS directly or use a custom template with it pre-installed. - + The most popular TypeScript agent framework. Add memory as a tool with one function call. - + Edge-first agents. Use the bash tool in Workers, or mount SMFS in Cloudflare Containers. @@ -59,13 +59,13 @@ Already using a sandbox or agent platform? Jump straight to the guide for your p ## Next steps - + One curl, one mount, you're done. - + Drop SMFS into a TypeScript or Python agent without mounting anything. - + Full working apps you can clone and run — legal docs, support agents, and more. diff --git a/apps/docs/smfs/providers/vercel.mdx b/apps/docs/smfs/providers/vercel.mdx index d3e13daa..35a115f8 100644 --- a/apps/docs/smfs/providers/vercel.mdx +++ b/apps/docs/smfs/providers/vercel.mdx @@ -16,7 +16,7 @@ your code actually runs: ## How it works -### Self-hosted Node (real mount) +### Self-hosted node (real mount) The agent runs as a separate process with direct access to the SMFS mount. Best when you want full bash, read, and write capabilities and your server is @@ -30,7 +30,7 @@ graph LR Mount -->|sync| SM["Supermemory"] ``` -### Vercel Functions / serverless (Bash Tool) +### Vercel functions / serverless (Bash tool) The agent runs inside `generateText` and accesses memory through `@supermemory/bash`, which proxies bash commands to your Supermemory container over HTTP. No mount, @@ -52,7 +52,7 @@ graph LR --- -## Pattern A: Claude Agent SDK on self-hosted Node +## Pattern A: Claude Agent SDK on self-hosted node Use this when the Vercel AI SDK is just the orchestrator and your real workload is a Claude agent running on a long-lived server you control. @@ -100,7 +100,7 @@ python3 agent.py --- -## Pattern B: Vercel AI SDK + Bash Tool (serverless-friendly) +## Pattern B: Vercel AI SDK + Bash tool (serverless-friendly) `@supermemory/bash` exposes your Supermemory container as a single agent tool — `run_bash(command)` — without mounting anything. It runs anywhere TypeScript diff --git a/apps/docs/snippets/agent-prompt-panel.jsx b/apps/docs/snippets/agent-prompt-panel.jsx new file mode 100644 index 00000000..e23aa1f7 --- /dev/null +++ b/apps/docs/snippets/agent-prompt-panel.jsx @@ -0,0 +1,235 @@ +export const AgentMarks = () => ( +

+ Or add memory to + + + Claude Code + + + + Cursor + + + + Codex + + + + OpenCode + +

+) + +export const CopyPromptButton = ({ prompt, className, label, copiedLabel }) => { + const [copied, setCopied] = useState(false) + const onCopy = async () => { + try { + await navigator.clipboard.writeText(prompt) + setCopied(true) + setTimeout(() => setCopied(false), 1600) + } catch {} + } + return ( + + ) +} + +export const PromptPanel = ({ tabs }) => { + const [active, setActive] = useState(0) + const [copied, setCopied] = useState(false) + const tab = tabs[active] + + const onCopy = async () => { + try { + await navigator.clipboard.writeText(tab.text) + setCopied(true) + setTimeout(() => setCopied(false), 1600) + } catch {} + } + + const promptLine = (line) => { + const h = /^(#{1,6}) (.*)$/.exec(line) + if (h) { + return ( + <> + {h[1]} + {h[2]} + + ) + } + if (/^\|[-| ]+\|$/.test(line)) + return {line} + const out = [] + let last = 0 + let k = 0 + for (const m of line.matchAll( + /(\|)|(\b(?:GET|POST|PATCH|DELETE) \/[^\s|]+)/g, + )) { + const at = m.index ?? 0 + if (at > last) out.push(line.slice(last, at)) + out.push( + m[1] ? ( + + | + + ) : ( + + {m[2]} + + ), + ) + last = at + m[0].length + } + if (last < line.length) out.push(line.slice(last)) + return out + } + + const codeLine = (line) => { + if (/^\s*(\/\/|#)/.test(line)) + return {line} + const out = [] + let last = 0 + let k = 0 + for (const m of line.matchAll(/"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'/g)) { + const at = m.index ?? 0 + if (at > last) out.push(line.slice(last, at)) + out.push( + + {m[0]} + , + ) + last = at + m[0].length + } + if (last < line.length) out.push(line.slice(last)) + return out + } + + const render = tab.kind === "prompt" ? promptLine : codeLine + + return ( +
+
+
+ {tabs.map((t, i) => ( + + ))} +
+ +
+
+
+					{tab.text.split("\n").map((text, i) => (
+						
+							{text.length === 0 ? " " : render(text)}
+						
+					))}
+				
+
+
+ ) +} diff --git a/apps/docs/snippets/agent-prompt.jsx b/apps/docs/snippets/agent-prompt.jsx new file mode 100644 index 00000000..08b90bf5 --- /dev/null +++ b/apps/docs/snippets/agent-prompt.jsx @@ -0,0 +1,2 @@ +export const AGENT_PROMPT = + '# You are onboarding this project to Supermemory\n\nSupermemory is a memory API for AI apps and agents: ingest conversations, documents, files, and URLs; get semantic search, extracted facts, and per-user profiles back. Every call is scoped to one containerTag, with strict isolation between tags.\n\n## What you can call\n\n| Operation | Endpoint | Use when |\n|---|---|---|\n| Add content | POST /v3/documents | Ingest conversations, documents, files, URLs |\n| Search memories | POST /v4/search | Find extracted facts with graph context |\n| Search documents | POST /v3/search | Find raw chunks for RAG grounding |\n| Get profile | POST /v4/profile | Static + dynamic context for a user |\n| List documents | POST /v3/documents/list | Paginate and filter ingested content |\n| Forget memory | DELETE /v4/memories | Soft-delete one fact; JSON body with containerTag plus id or exact content |\n| Forget matching | POST /v4/memories/forget-matching | Soft-delete every fact matching a query or an ids list; dryRun previews first |\n\nTwo processing modes: taskType "memory" (full pipeline: facts, profile, graph — for conversations and personal context) and taskType "superrag" (chunk/embed only, 5x cheaper — for reference material). Search returns memories, documents, or hybrid via searchMode.\n\nFull API reference for agents: https://docs.supermemory.ai/llms.txt\n\nNow work the steps below in order. Do not skip ahead. Stop where a step says to.\n\n## Step 1 — Credentials\n\nAPI key env var: SUPERMEMORY_API_KEY (never hardcode it, never print it back).\n\nKey for this project: YOUR_SUPERMEMORY_API_KEY\n\nIf that reads YOUR_SUPERMEMORY_API_KEY, ask the user to create a key at https://console.supermemory.ai/keys, export it as SUPERMEMORY_API_KEY, and tell you when it is set. Wait for confirmation.\n\n## Step 2 — Install the docs MCP server, then brief the user\n\nAdd this MCP server to your client (public, no auth): https://supermemory.ai/docs/mcp\n\nIt serves search over the full Supermemory docs plus a skill resource with integration rules. Verify it works by searching it for "container tag rules" and confirming a real result returns. Prefer its answers over prior knowledge for anything Supermemory-specific.\n\nThen give the user a short rundown of what Supermemory can do for THIS project, using the table above.\n\n## Step 3 — Scan this repo for integration points\n\nIf this directory has application source, read enough to understand it, then map findings against this table. Cite exact files and lines. If the repo is empty or docs-only, say so and skip to Step 5.\n\n| Code pattern | Replace / augment with |\n|---|---|\n| Chat or agent loop with no memory between sessions | Add each exchange (taskType "memory"), search before the model answers |\n| Full conversation history stuffed into the prompt | Retrieved context from POST /v4/search instead of replaying everything |\n| Homegrown embeddings pipeline (pgvector, pinecone, chroma) | POST /v3/documents + POST /v3/search, no pipeline to maintain |\n| RAG over files or docs sites | Ingest with taskType "superrag", search with searchMode "documents" |\n| Per-user preferences or personalization tables | POST /v4/profile |\n| Multi-tenant SaaS serving many end users | One containerTag per end user (user_123); never share or cross-query tags |\n\n## Step 4 — Propose, then get approval before touching code\n\nPresent findings as a numbered list: file + line range, the endpoint(s) involved, one line on why it is an improvement. Ask which to implement. Do not modify files until the user approves specific items.\n\nWhen implementing, use the official SDK (supermemory on npm and PyPI). The client reads SUPERMEMORY_API_KEY from the environment:\n\n import Supermemory from "supermemory"\n const client = new Supermemory()\n\nContainer tag rules, non-negotiable: singular containerTag (the plural form is deprecated), one tag per end user or project, format ^[a-zA-Z0-9_:-]+$, no cross-tag queries. First write with a new tag creates it.\n\n## Step 5 — Suggest uses tailored to this project\n\nOnly if Step 3 found no application code: propose 3-5 concrete places in the user\'s stack where a memory layer would save effort, each tied to a specific endpoint from the table. Propose, do not build.' diff --git a/apps/docs/snippets/getting-api-key.mdx b/apps/docs/snippets/getting-api-key.mdx index 1531f5dc..755cc633 100644 --- a/apps/docs/snippets/getting-api-key.mdx +++ b/apps/docs/snippets/getting-api-key.mdx @@ -1,13 +1,13 @@ Head to [supermemory's Developer Platform](https://console.supermemory.ai) built to help you monitor and manage every aspect of the API. - + - + An account will automatically be created on your first login. ![Dev Platform Login Pn](/images/dev-platform-login.png) - + ![Dev Platform Api Keys Pn](/images/dev-platform-api-keys.png) @@ -22,7 +22,7 @@ Head to [supermemory's Developer Platform](https://console.supermemory.ai) built ![Dev Platform Copy Key Pn](/images/dev-platform-copy-key.png) - Click to copy + Click to copy diff --git a/apps/docs/snippets/hero-samples.jsx b/apps/docs/snippets/hero-samples.jsx new file mode 100644 index 00000000..bbf90bd2 --- /dev/null +++ b/apps/docs/snippets/hero-samples.jsx @@ -0,0 +1,8 @@ +export const HERO_TS = + 'import Supermemory from "supermemory";\n\nconst client = new Supermemory();\n\n// March\nawait client.add({\n content: "I work at Google on the Maps team.",\n containerTag: "user_4f8a",\n});\n\n// June\nawait client.add({\n content: "Big news: I just started at Stripe!",\n containerTag: "user_4f8a",\n});\n\n// Later: what does your agent know about this user?\nconst { profile } = await client.profile({ containerTag: "user_4f8a" });\n\nconsole.log(profile.static);\n// \u2192 ["Now works at Stripe."]' + +export const HERO_PY = + 'from supermemory import Supermemory\n\nclient = Supermemory()\n\n# March\nclient.add(\n content="I work at Google on the Maps team.",\n container_tag="user_4f8a",\n)\n\n# June\nclient.add(\n content="Big news: I just started at Stripe!",\n container_tag="user_4f8a",\n)\n\n# Later: what does your agent know about this user?\nprofile = client.profile(container_tag="user_4f8a").profile\n\nprint(profile.static)\n# \u2192 ["Now works at Stripe."]' + +export const HERO_CURL = + '# March\ncurl https://api.supermemory.ai/v3/documents \\\n -H "Authorization: Bearer $SUPERMEMORY_API_KEY" \\\n -H "Content-Type: application/json" \\\n -d \'{"content": "I work at Google on the Maps team.", "containerTag": "user_4f8a"}\'\n\n# June\ncurl https://api.supermemory.ai/v3/documents \\\n -H "Authorization: Bearer $SUPERMEMORY_API_KEY" \\\n -H "Content-Type: application/json" \\\n -d \'{"content": "Big news: I just started at Stripe!", "containerTag": "user_4f8a"}\'\n\n# Later: what does your agent know about this user?\ncurl https://api.supermemory.ai/v4/profile \\\n -H "Authorization: Bearer $SUPERMEMORY_API_KEY" \\\n -H "Content-Type: application/json" \\\n -d \'{"containerTag": "user_4f8a"}\'\n# \u2192 {"profile": {"static": ["Now works at Stripe."], "dynamic": []}}' diff --git a/apps/docs/style.css b/apps/docs/style.css index ff7208ae..a1b4271c 100644 --- a/apps/docs/style.css +++ b/apps/docs/style.css @@ -1,5 +1,1887 @@ +@import url("https://fonts.googleapis.com/css2?family=Geist+Mono:wght@400;500&display=swap"); + +:root { + --sm-bg: #ffffff; + --sm-bg-2: #f5f5f5; + --sm-bg-3: #f1f2f4; + --sm-surface: #ffffff; + --sm-control: #ffffff; + --sm-control-hover: #f1f2f4; + --sm-border: #ededed; + --sm-border-muted: #f4f4f5; + --sm-border-hover: #dcdcdc; + + --sm-text-strong: #05080f; + --sm-text: #091120; + --sm-text-2: #5b6472; + --sm-text-3: #9ea3ad; + --sm-text-body: #3d424d; + + --sm-accent: #2f86ff; + --sm-accent-hover: #1d6fe8; + --sm-accent-text: #175cd4; + --sm-accent-text-hover: #1148f7; + --sm-tint: #f5f9ff; + --sm-tint-stroke: #b8d1ff; + + --sm-success: #187a44; + --sm-success-muted: rgba(24, 122, 68, 0.12); + --sm-error: #b82929; + --sm-error-muted: rgba(184, 41, 41, 0.1); + --sm-warning: #8c540d; + --sm-warning-muted: rgba(140, 84, 13, 0.12); + --sm-info: #175cd4; + --sm-info-muted: rgba(23, 92, 212, 0.1); + + --sm-shadow-sm: 0 1px 2px 0 rgba(9, 17, 32, 0.05); + --sm-shadow-md: + 0 2px 6px -1px rgba(9, 17, 32, 0.07), 0 1px 2px 0 rgba(9, 17, 32, 0.05); + --sm-shadow-float: + 0 8px 40px 0 rgba(0, 0, 0, 0.08), 0 1px 3px 0 rgba(0, 0, 0, 0.1), + 0 1px 2px 0 rgba(0, 0, 0, 0.06); + --sm-sidebar-active-fill: #f1f2f4; + --sm-shadow-sidebar-active: none; + + --sm-radius-sm: 6px; + --sm-radius-md: 8px; + --sm-radius-lg: 10px; + --sm-radius-xl: 14px; + + --sm-ease-out: cubic-bezier(0.23, 1, 0.32, 1); + --sm-dur-fast: 180ms; + --sm-dur-hover: 150ms; + --sm-dur-press: 100ms; + + --sm-font-sans: "Geist", ui-sans-serif, system-ui, sans-serif; + --sm-font-mono: + "Geist Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, + monospace; +} + +.dark { + --sm-bg: #0a0a0a; + --sm-bg-2: #101010; + --sm-bg-3: #121212; + --sm-surface: #0a0a0a; + --sm-control: #0a0a0a; + --sm-control-hover: #121212; + --sm-border: rgba(255, 255, 255, 0.07); + --sm-border-muted: rgba(255, 255, 255, 0.04); + --sm-border-hover: rgba(255, 255, 255, 0.14); + + --sm-text-strong: #fafafa; + --sm-text: #f5f5f5; + --sm-text-2: #a2a2a2; + --sm-text-3: #838383; + --sm-text-body: #a1a1a1; + + --sm-accent-text: #6fa8ff; + --sm-accent-text-hover: #86b6ff; + --sm-tint: #0d131a; + --sm-tint-stroke: #1e3973; + + --sm-success: #4fb877; + --sm-success-muted: rgba(79, 184, 119, 0.16); + --sm-error: #f27070; + --sm-error-muted: rgba(242, 112, 112, 0.14); + --sm-warning: #f0b359; + --sm-warning-muted: rgba(240, 179, 89, 0.14); + --sm-info: #6fa8ff; + --sm-info-muted: rgba(111, 168, 255, 0.14); + + --sm-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.3); + --sm-shadow-md: + 0 4px 6px -1px rgba(0, 0, 0, 0.4), 0 2px 4px -2px rgba(0, 0, 0, 0.3); + --sm-shadow-float: + 0 8px 40px 0 rgba(0, 0, 0, 0.5), 0 1px 3px 0 rgba(0, 0, 0, 0.4); + --sm-sidebar-active-fill: rgba(255, 255, 255, 0.07); + --sm-shadow-sidebar-active: none; +} + +html, +body { + background-color: var(--sm-bg); +} + +body { + font-family: var(--sm-font-sans); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: var(--sm-font-sans) !important; + font-weight: 500 !important; + letter-spacing: -0.01em; + text-wrap: balance; +} + +h1#page-title { + font-size: 2.25rem; + line-height: 2.5rem; + letter-spacing: -0.025em; + color: var(--sm-text-strong); +} + +#header .prose { + font-size: 1.0625rem; + line-height: 1.65; + color: var(--sm-text-2); +} + +#content.prose, +#content .prose { + font-size: 1rem; + line-height: 1.75rem; + color: var(--sm-text-body); + hyphens: manual; + text-wrap: pretty; +} + +#content h2:not([data-component-part]), +#content h3:not([data-component-part]), +#content a h2:not([data-component-part]), +#content a h3:not([data-component-part]) { + margin: 0; +} + +#content h4:not([data-component-part]) { + color: var(--sm-text-strong); +} + +#content h2:not([data-component-part]) { + font-size: 1.5rem; + line-height: 2rem; + letter-spacing: -0.025em; + margin-top: 2.25rem; + margin-bottom: 1.125rem; +} + +#content h3:not([data-component-part]) { + font-size: 1.25rem; + line-height: 1.75rem; + letter-spacing: -0.025em; + margin-top: 2rem; + margin-bottom: 0.875rem; +} + +#content h4:not([data-component-part]) { + font-size: 1.0625rem; + line-height: 1.625rem; + letter-spacing: -0.015em; + margin-top: 1.75rem; + margin-bottom: 0.625rem; +} + +#content a.link:not(.mint-group):not(.card):not(.sm-card), +#header .prose a.link { + font-weight: inherit !important; + color: var(--sm-accent-text) !important; + border-bottom: 0 !important; + text-decoration-line: underline; + text-decoration-thickness: 1px; + text-underline-offset: 0.2em; + text-decoration-color: color-mix( + in srgb, + var(--sm-accent-text) 30%, + transparent + ); + transition: + text-decoration-color var(--sm-dur-fast) var(--sm-ease-out), + color var(--sm-dur-fast) var(--sm-ease-out); +} + +#content a.link:not(.mint-group):not(.card):not(.sm-card):hover, +#header .prose a.link:hover { + color: var(--sm-accent-text-hover) !important; + text-decoration-color: currentColor; +} + +#content a.link:not(.mint-group):not(.card):not(.sm-card) strong, +#content a.link:not(.mint-group):not(.card):not(.sm-card) code { + color: inherit !important; +} + +#content :not(pre) > code { + font-size: 0.875em !important; + font-weight: 400 !important; + padding: 0.1em 0.35em !important; + border-radius: var(--sm-radius-sm) !important; + background: var(--sm-bg-3) !important; + color: var(--sm-text-strong) !important; + border: 0 !important; +} + +.dark #content :not(pre) > code { + background: rgba(255, 255, 255, 0.06) !important; +} + +#content strong { + color: var(--sm-text-strong); + font-weight: 500; +} + +#table-of-contents-content .toc-item[data-depth="2"], +#table-of-contents-content .toc-item[data-depth="3"] { + display: none; +} + +code, +kbd, +pre, +samp { + font-family: var(--sm-font-mono) !important; +} + +::selection { + background: color-mix(in srgb, var(--sm-text) 16%, transparent); + color: var(--sm-text-strong); +} + +:focus-visible { + outline: 2px solid var(--sm-text); + outline-offset: 2px; +} + +#sidebar-content .sidebar-group-header, +#sidebar-content .sidebar-group-header .sidebar-title, +#header .breadcrumb-list { + font-family: var(--sm-font-sans) !important; + font-size: 0.875rem; + line-height: 1.25rem; + letter-spacing: -0.005em; + text-transform: none; + font-weight: 500 !important; + color: var(--sm-text-strong) !important; +} + +#header .breadcrumb-list .breadcrumb-item { + color: var(--sm-text-2) !important; +} + +#header .breadcrumb-list .breadcrumb-item:last-child { + color: var(--sm-text-strong) !important; +} + +#table-of-contents h2 button { + font-family: var(--sm-font-sans) !important; + font-size: 0.875rem; + text-transform: none; + letter-spacing: normal; + font-weight: 400 !important; + color: var(--sm-text-2) !important; +} + +#table-of-contents-content .toc-item, +#table-of-contents-content .toc-item > a { + border-left: 0 !important; + margin-left: 0 !important; + padding-left: 0 !important; +} + +#table-of-contents-content .toc-item[data-depth="0"] > a { + color: var(--sm-text-2) !important; + font-weight: 500; +} + +#table-of-contents-content .toc-item[data-depth="1"] > a { + padding-left: 16px !important; + color: var(--sm-text-2) !important; + font-weight: 400; +} + +#table-of-contents-content .toc-item[data-active="true"] > a { + color: var(--sm-text-strong) !important; + font-weight: 500; +} + +#search-bar-entry, +#search-bar-entry-mobile, +#assistant-entry, +#assistant-entry-mobile, +li.navbar-link a, +#topbar-cta-button [class*="rounded"], +#theme-preference-menu-trigger, +.chat-assistant-floating-input [class*="rounded"] { + border-radius: var(--sm-radius-md) !important; +} + +#page-context-menu-button { + border-top-left-radius: var(--sm-radius-md) !important; + border-bottom-left-radius: var(--sm-radius-md) !important; +} + +#page-context-menu [class*="rounded-r"] { + border-top-right-radius: var(--sm-radius-md) !important; + border-bottom-right-radius: var(--sm-radius-md) !important; +} + +#navigation-items li > a, +#navigation-items a[class*="rounded-xl"], +#content .card, +#content [class*="rounded-2xl"] { + border-radius: var(--sm-radius-lg) !important; +} + +#navigation-items li > a { + transition: + color var(--sm-dur-fast) var(--sm-ease-out), + background-color var(--sm-dur-fast) var(--sm-ease-out); +} + +#navigation-items a[class*="bg-primary"] { + background-image: none !important; + background-color: var(--sm-sidebar-active-fill) !important; + box-shadow: var(--sm-shadow-sidebar-active); + color: var(--sm-text-strong) !important; + font-weight: 500; +} + +.dark #topbar-cta-button a > span.absolute { + background-color: var(--sm-text-strong) !important; +} + +.dark #topbar-cta-button a .text-white, +.dark #topbar-cta-button a svg { + color: var(--sm-bg) !important; +} + +.dark .chat-assistant-send-button { + background-color: color-mix( + in srgb, + var(--sm-text-strong) 30%, + transparent + ) !important; + color: var(--sm-bg) !important; +} + +.dark .chat-assistant-send-button svg { + color: var(--sm-bg) !important; +} + +[class*="bg-blue-400/20"], +[class*="bg-green-400/20"], +[class*="bg-orange-400/20"], +[class*="bg-red-400/20"], +[class*="bg-yellow-400/20"], +[class*="bg-purple-400/20"] { + background-color: var(--sm-bg-3) !important; + color: var(--sm-text-2) !important; +} + +#content .code-block, +#content .code-group, +.sm-home-sample .code-group { + border-color: var(--sm-border) !important; + border-radius: var(--sm-radius-lg) !important; + background: var(--sm-bg-2) !important; +} + +#content .code-block > .code-block-background { + border: 0 !important; + border-radius: calc(var(--sm-radius-lg) - 1px) !important; + background: transparent !important; +} + +#content .code-group, +.sm-home-sample .code-group { + --rounded-xl: var(--sm-radius-md); +} + +#content .code-group .code-block-background, +.sm-home-sample .code-group .code-block-background { + border: 1px solid var(--sm-border) !important; + border-radius: var(--sm-radius-md) !important; + background: var(--sm-bg-2) !important; +} + +#content .code-block-fade-overlay, +.sm-home-sample .code-block-fade-overlay { + background-image: linear-gradient( + to right, + transparent 0, + var(--sm-bg-2) 40px + ) !important; +} + +#content .card [data-component-part="card-title"] { + font-size: 1rem !important; + line-height: 1.5 !important; + letter-spacing: -0.005em; + margin-top: 12px !important; +} + +#content .card [data-component-part="card-content"], +#content .card .prose { + font-size: 0.9375rem !important; + line-height: 1.6 !important; + color: var(--sm-text-2) !important; +} + +#content a.link.mint-group { + border-radius: var(--sm-radius-lg) !important; + border-color: var(--sm-border) !important; + box-shadow: none !important; + transition: border-color var(--sm-dur-fast) var(--sm-ease-out) !important; +} + +#content a.link.mint-group:hover { + border-color: var(--sm-border-hover) !important; +} + +#content img.rounded, +#content img[class*="rounded-lg"] { + border-radius: var(--sm-radius-lg) !important; + outline: 1px solid rgba(0, 0, 0, 0.08); + outline-offset: -1px; + box-shadow: none !important; +} + +.dark #content img.rounded, +.dark #content img[class*="rounded-lg"] { + outline-color: rgba(255, 255, 255, 0.1); +} + +#content .callout { + --sm-callout: var(--sm-text-2); + background: color-mix(in srgb, var(--sm-callout) 5%, var(--sm-bg)) !important; + border-color: color-mix( + in srgb, + var(--sm-callout) 20%, + var(--sm-bg) + ) !important; + border-radius: var(--sm-radius-lg) !important; +} + +#content .callout[data-callout-type="tip"], +#content .callout[data-callout-type="check"] { + --sm-callout: var(--sm-success); +} + +#content .callout[data-callout-type="warning"] { + --sm-callout: var(--sm-warning); +} + +#content .callout[data-callout-type="danger"] { + --sm-callout: var(--sm-error); +} + +#content .callout[data-callout-type="info"] { + background: var(--sm-bg-2) !important; + border-color: var(--sm-border) !important; +} + +.dark #content .callout { + background: color-mix(in srgb, var(--sm-callout) 8%, var(--sm-bg)) !important; + border-color: color-mix( + in srgb, + var(--sm-callout) 24%, + var(--sm-bg) + ) !important; +} + +.dark #content .callout[data-callout-type="info"] { + background: var(--sm-bg-2) !important; + border-color: var(--sm-border) !important; +} + +#content .callout [data-component-part="callout-content"] { + color: var(--sm-text-body) !important; +} + +#content .callout [data-component-part="callout-content"] strong { + color: var(--sm-text-strong) !important; +} + +#content .callout [data-component-part="callout-icon"], +#content .callout [data-component-part="callout-icon"] svg { + color: var(--sm-callout) !important; +} + +#content + .callout[data-callout-type="info"] + [data-component-part="callout-icon"], +#content + .callout[data-callout-type="info"] + [data-component-part="callout-icon"] + svg { + color: var(--sm-text-2) !important; +} + +.api-section-heading-title { + font-size: 1.25rem !important; + line-height: 1.75rem !important; + letter-spacing: -0.025em; + color: var(--sm-text-strong) !important; +} + +.api-section .prose, +.api-section .prose p { + font-size: 0.9375rem !important; + line-height: 1.6rem !important; + color: var(--sm-text-body) !important; + hyphens: manual !important; +} + +.api-section .prose a { + font-weight: inherit !important; + color: var(--sm-accent-text) !important; + border-bottom: 0 !important; + text-decoration-line: underline; + text-decoration-thickness: 1px; + text-underline-offset: 0.2em; + text-decoration-color: color-mix( + in srgb, + var(--sm-accent-text) 30%, + transparent + ); +} + +.api-section .prose a:hover { + color: var(--sm-accent-text-hover) !important; + text-decoration-color: currentColor; +} + +.api-section .prose :not(pre) > code { + font-size: 0.875em !important; + font-weight: 400 !important; + padding: 0.1em 0.35em !important; + border-radius: var(--sm-radius-sm) !important; + background: var(--sm-bg-3) !important; + color: var(--sm-text-strong) !important; + border: 0 !important; +} + +.dark .api-section .prose :not(pre) > code { + background: rgba(255, 255, 255, 0.06) !important; +} + +#search-bar-entry, +#assistant-entry, +li.navbar-link a, +#topbar-cta-button a, +#topbar-cta-button a > span, +#theme-preference-menu-trigger, +#page-context-menu-button, +#page-context-menu button, +.code-block-copy-button button, +[data-component-part="tab-button"], +.code-group [role="tab"], +a.nav-tabs-item, +a.nav-tabs-item > div, +#navigation-items li > a, +#table-of-contents-content a, +#pagination a, +#content .card, +#content details > summary, +#content [data-component-part="accordion-button"] { + transition-property: + color, background-color, border-color, opacity, transform; + transition-duration: + var(--sm-dur-hover), var(--sm-dur-hover), var(--sm-dur-hover), + var(--sm-dur-hover), var(--sm-dur-press); + transition-timing-function: var(--sm-ease-out); +} + +#navigation-items li > a:not([class*="bg-primary"]):hover, +#theme-preference-menu-trigger:hover, +.code-block-copy-button button:hover { + background-color: var(--sm-control-hover) !important; + color: var(--sm-text) !important; +} + +#table-of-contents-content .toc-item:not([data-active="true"]) > a:hover, +[data-component-part="tab-button"]:not([data-active="true"]):hover, +.code-group [role="tab"]:not([aria-selected="true"]):hover { + color: var(--sm-text) !important; +} + +#content details > summary:hover, +#content [data-component-part="accordion-button"]:hover { + background-color: var(--sm-control-hover) !important; +} + +#content .card:hover, +#pagination a:hover { + border-color: var(--sm-border-hover) !important; +} + +#content { + --sm-primary-keep: var(--primary); + --sm-primary-light-keep: var(--primary-light); +} + +#content .card:hover { + --primary: 220 220 220; + --primary-light: 45 45 45; +} + +#content .card:hover > * { + --primary: var(--sm-primary-keep); + --primary-light: var(--sm-primary-light-keep); +} + +#search-bar-entry:active, +#assistant-entry:active, +#topbar-cta-button a:active, +#theme-preference-menu-trigger:active, +#page-context-menu-button:active, +.code-block-copy-button button:active { + transform: scale(0.96); +} + +@media (prefers-reduced-motion: reduce) { + .sm-home-btn, + .sm-card-title svg, + #search-bar-entry, + #assistant-entry, + #topbar-cta-button a, + #theme-preference-menu-trigger, + #page-context-menu-button, + .code-block-copy-button button { + transition-property: + color, background-color, border-color, opacity !important; + transform: none !important; + } +} + .dark img[src*="openai.svg"], .dark img[src*="pipecat.svg"], +.dark img[src*="eve.svg"], .dark img[src*="supermemory.svg"] { filter: invert(1); } + +.dark img[src*="opencode-logo.svg"] { + content: url("/images/opencode-logo-dark.svg"); +} + +.eve-memory-video { + display: block; + width: 100%; + border-radius: 0; +} + +.sm-home { + max-width: 1240px; + margin: 0 auto; + padding: 56px 24px 96px; + font-family: var(--sm-font-sans); + color: var(--sm-text); +} + +.sm-home-hero { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); + gap: 64px; + align-items: center; +} + +.sm-home-title { + margin: 0; + font-family: var(--sm-font-sans) !important; + font-size: 48px; + font-weight: 500 !important; + line-height: 1.05; + letter-spacing: -0.025em; + color: var(--sm-text); + text-wrap: balance; +} + +.sm-home-lede { + max-width: 480px; + margin: 20px 0 0; + font-size: 17px; + line-height: 1.55; + color: var(--sm-text-2); +} + +.sm-home-actions { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 8px; + margin-top: 28px; +} + +.sm-home-btn { + display: inline-flex; + align-items: center; + gap: 8px; + height: 36px; + padding: 0 14px; + border-radius: var(--sm-radius-md); + font-size: 13px; + font-weight: 500; + line-height: 1; + text-decoration: none !important; + transition-property: background-color, border-color, color, transform; + transition-duration: + var(--sm-dur-hover), var(--sm-dur-hover), var(--sm-dur-hover), + var(--sm-dur-press); + transition-timing-function: var(--sm-ease-out); +} + +.sm-home-btn:active { + transform: scale(0.96); +} + +.sm-home-btn-primary { + background: var(--sm-accent); + color: #ffffff !important; +} + +.sm-home-btn-primary:hover { + background: var(--sm-accent-hover); +} + +.sm-home-btn-secondary { + border: 1px solid var(--sm-border); + background: var(--sm-control); + box-shadow: var(--sm-shadow-sm); + color: var(--sm-text) !important; +} + +.sm-home-btn-secondary:hover { + border-color: var(--sm-border-hover); + background: var(--sm-control-hover); +} + +.sm-home-sample { + min-width: 0; +} + +.sm-home-sample > div { + margin: 0 !important; +} + +.sm-home-hero-copy { + display: flex; + flex-direction: column; + container-type: inline-size; +} + +.sm-home-title-split > span { + display: block; +} + +.sm-home-title-muted { + color: color-mix(in srgb, var(--sm-text-2) 60%, var(--sm-text-3)); +} + +@media (min-width: 1025px) { + .sm-home-title-split { + font-size: min(40px, 6.9cqi); + } + + .sm-home-hero-copy .sm-home-lede { + text-wrap: pretty; + } +} + +.sm-home-btn-primary { + border: 0; + cursor: pointer; + font-family: inherit; +} + +.sm-works { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 6px 16px; + margin: 24px 0 0 !important; + font-size: 13px; + line-height: 20px; + color: var(--sm-text-2); +} + +.sm-works-label { + color: var(--sm-text-3); +} + +.sm-works-item { + display: inline-flex; + align-items: center; + gap: 6px; + color: var(--sm-text-2) !important; + text-decoration: none !important; + transition: color var(--sm-dur-hover) var(--sm-ease-out); +} + +.sm-works-item:hover { + color: var(--sm-text) !important; +} + +.sm-works-item svg { + width: auto; + height: 14px; + flex-shrink: 0; +} + +.sm-prompt-panel { + min-width: 0; + border: 1px solid var(--sm-border); + border-radius: var(--sm-radius-lg); + background: var(--sm-bg-2); + padding: 0 2px 2px; +} + +.sm-prompt-header { + display: flex; + align-items: center; + justify-content: space-between; + height: 40px; + padding: 0 6px 0 12px; +} + +.sm-prompt-tabs { + display: flex; + gap: 16px; + min-width: 0; + overflow-x: auto; + scrollbar-width: none; +} + +.sm-prompt-tab { + display: inline-flex; + flex-shrink: 0; + align-items: center; + height: 40px; + padding: 0; + border: 0; + border-bottom: 1.5px solid transparent; + background: transparent; + font-family: inherit; + font-size: 13px; + font-weight: 500; + color: var(--sm-text-2); + cursor: pointer; + transition: color var(--sm-dur-hover) var(--sm-ease-out); +} + +.sm-prompt-tab:hover { + color: var(--sm-text); +} + +.sm-prompt-tab[aria-selected="true"] { + border-bottom-color: var(--sm-text); + color: var(--sm-text); +} + +.sm-prompt-string { + color: var(--sm-accent-text); +} + +.sm-prompt-code { + font-size: 13px; + line-height: 1.7; + color: var(--sm-text); +} + +.sm-prompt-copy-icon { + display: inline-flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + border: 0; + border-radius: var(--sm-radius-sm); + background: transparent; + color: var(--sm-text-3); + cursor: pointer; + transition-property: background-color, color, transform; + transition-duration: + var(--sm-dur-hover), var(--sm-dur-hover), var(--sm-dur-press); + transition-timing-function: var(--sm-ease-out); +} + +.sm-prompt-copy-icon:hover { + background: var(--sm-control-hover); + color: var(--sm-text); +} + +.sm-prompt-copy-icon:active { + transform: scale(0.96); +} + +.sm-prompt-body { + position: relative; + overflow: hidden; + border: 1px solid var(--sm-border); + border-radius: var(--sm-radius-md); + background: var(--sm-surface); +} + +.sm-prompt-scroll { + height: 360px; + margin: 0 !important; + padding: 14px 18px 28px !important; + overflow-y: auto; + background: transparent !important; + font-family: var( + --sm-font-mono, + ui-monospace, + SFMono-Regular, + Menlo, + monospace + ); + font-size: 12.5px; + line-height: 20px; + white-space: pre-wrap; + overflow-wrap: anywhere; + color: var(--sm-text-2); +} + +.sm-prompt-line { + display: block; +} + +.sm-prompt-muted { + color: var(--sm-text-3); +} + +.sm-prompt-heading { + font-weight: 500; + color: var(--sm-text); +} + +.sm-prompt-endpoint { + font-weight: 500; + color: var(--sm-accent-text); +} + +.sm-prompt-fade { + position: absolute; + right: 0; + bottom: 0; + left: 0; + height: 40px; + background: linear-gradient(to top, var(--sm-surface), transparent); + pointer-events: none; +} + +.sm-home-section { + margin-top: 112px; +} + +.sm-home-label { + margin: 0; + font-size: 16px; + line-height: 24px; + color: var(--sm-text-2); +} + +.sm-home-heading { + margin: 8px 0 0 !important; + font-family: var(--sm-font-sans) !important; + font-size: 34px !important; + font-weight: 500 !important; + line-height: 1.2 !important; + letter-spacing: -0.03em !important; + color: var(--sm-text-strong) !important; +} + +.sm-home-sub { + margin: 12px 0 0; + font-size: 16px; + line-height: 24px; + color: var(--sm-text-2); +} + +.sm-home-grid { + display: grid; + gap: 24px; + margin-top: 36px; +} + +.sm-home-grid-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.sm-home-grid-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.sm-home-card { + display: flex; + flex-direction: column; + overflow: hidden; + border: 1px solid var(--sm-border); + border-radius: var(--sm-radius-lg); + background: var(--sm-surface); +} + +.sm-home-card-media { + display: block; + border-bottom: 1px solid var(--sm-border) !important; +} + +.sm-home-card-media img { + display: block; + width: 100%; + height: auto; + margin: 0; +} + +.sm-home-card-body { + display: flex; + flex-direction: column; + flex: 1; + padding: 24px; +} + +.sm-home-card-title { + font-size: 22px; + font-weight: 500; + line-height: 28px; + letter-spacing: -0.02em; + color: var(--sm-text-strong) !important; + text-decoration: none !important; + border: 0 !important; +} + +.sm-home-card-desc { + margin: 8px 0 0; + font-size: 14px; + line-height: 22px; + color: var(--sm-text-2); +} + +.sm-home-links { + display: flex; + flex-direction: column; + gap: 4px; + margin-top: 20px; +} + +.sm-home-list-card .sm-home-links { + display: grid; + grid-template-columns: 1fr 1fr; + column-gap: 16px; +} + +.sm-home-link { + display: flex; + align-items: center; + gap: 10px; + height: 36px; + margin: 0 -8px; + padding: 0 8px; + border: 0 !important; + border-radius: var(--sm-radius-md); + color: var(--sm-text) !important; + font-size: 15px; + font-weight: 400; + text-decoration: none !important; + transition: background-color var(--sm-dur-hover) var(--sm-ease-out); +} + +.sm-home-link:hover { + background: var(--sm-control-hover); +} + +.sm-home-link-icon { + display: grid; + place-items: center; + flex-shrink: 0; + width: 22px; + height: 22px; + border-radius: var(--sm-radius-sm); + background: var(--sm-bg-3); +} + +.sm-home-link-icon svg.icon { + background-color: var(--sm-text-2) !important; +} + +.sm-card { + display: flex; + flex-direction: column; + border: 1px solid var(--sm-border); + border-radius: var(--sm-radius-lg); + background: var(--sm-surface); + overflow: hidden; + color: var(--sm-text) !important; + text-decoration: none !important; + transition: border-color var(--sm-dur-fast) var(--sm-ease-out); +} + +.sm-card:hover { + border-color: var(--sm-border-hover); +} + +.sm-card-media { + height: clamp(84px, 14vh, 140px); + border-bottom: 1px solid var(--sm-border); + overflow: hidden; + background: var(--sm-bg-2); +} + +.sm-card-media { + position: relative; +} + +.sm-card-media::after { + content: ""; + position: absolute; + inset: 0; + pointer-events: none; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.04); +} + +.sm-card-media img { + width: 100%; + height: 100%; + object-fit: cover; + display: block; + margin: 0; +} + +.sm-card-body { + padding: 14px 16px 16px; + display: flex; + flex-direction: column; + gap: 4px; +} + +.sm-card-title { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; + font-size: 15px; + font-weight: 500; + letter-spacing: -0.01em; +} + +.sm-card-title svg { + color: var(--sm-text-3); + flex-shrink: 0; +} + +.sm-card-title svg { + transition: + color var(--sm-dur-hover) var(--sm-ease-out), + transform var(--sm-dur-fast) var(--sm-ease-out); +} + +.sm-card:hover .sm-card-title svg { + color: var(--sm-text); + transform: translateX(2px); +} + +.sm-card-desc { + font-size: 13px; + line-height: 1.5; + color: var(--sm-text-2); + margin: 0; +} + +.sm-art-grid { + display: grid; + grid-template-columns: 1fr; + gap: 12px; + margin: 32px 0; +} + +@media (min-width: 640px) { + .sm-art-grid { + grid-template-columns: 1fr 1fr; + } +} + +#content a.sm-card { + border-color: var(--sm-border) !important; +} + +#content a.sm-card:hover { + border-color: var(--sm-border-hover) !important; +} + +.sm-card-media.sm-art-media { + height: auto; + aspect-ratio: 2 / 1; +} + +.sm-art-media > img { + position: absolute; + inset: 0; + filter: blur(14px) saturate(1.05); + transform: scale(1.2) scaleX(var(--flip, 1)); +} + +.sm-art-wash { + position: absolute; + inset: 0; + background: radial-gradient( + ellipse 75% 70% at 50% 50%, + rgba(255, 255, 255, 0.5), + rgba(255, 255, 255, 0.12) 75% + ); +} + +.dark .sm-art-wash { + background: radial-gradient( + ellipse 75% 70% at 50% 50%, + rgba(10, 10, 10, 0.42), + rgba(10, 10, 10, 0.1) 75% + ); +} + +.sm-scene { + --m-surface: linear-gradient(180deg, #ffffff 0%, #fafbfc 100%); + --m-surface-2: linear-gradient(180deg, #f7f8fa 0%, #f1f3f6 100%); + --m-ring: rgba(9, 17, 32, 0.06); + --m-highlight: inset 0 1px 0 #ffffff; + --m-shadow: + 0 1px 2px rgba(9, 17, 32, 0.05), 0 6px 16px -6px rgba(9, 17, 32, 0.12), + 0 22px 40px -18px rgba(9, 17, 32, 0.2); + --m-shadow-2: + 0 1px 2px rgba(9, 17, 32, 0.04), 0 8px 18px -10px rgba(9, 17, 32, 0.12); + --m-well: #eef1f5; + --m-fg-muted: 0.5; + --m-accent-fill: linear-gradient( + 180deg, + #58a0ff 0%, + #2a7ef7 55%, + #1c6ae0 100% + ); + --m-accent-glow: 0 6px 16px -6px rgba(28, 106, 224, 0.55); + --m-focus-ring: + 0 0 0 1px rgba(47, 134, 255, 0.55), 0 0 0 4px rgba(47, 134, 255, 0.14); + position: absolute; + top: 50%; + left: 50%; + width: 264px; + height: 152px; + transform: translate(-50%, -50%) scale(0.84); + font-size: 11.5px; + line-height: 16px; + letter-spacing: -0.005em; + color: var(--sm-text); +} + +.dark .sm-scene { + --m-surface: linear-gradient(180deg, #1c1c1c 0%, #161616 100%); + --m-surface-2: linear-gradient(180deg, #151515 0%, #121212 100%); + --m-ring: rgba(255, 255, 255, 0.08); + --m-highlight: inset 0 1px 0 rgba(255, 255, 255, 0.06); + --m-shadow: + 0 1px 2px rgba(0, 0, 0, 0.35), 0 6px 16px -6px rgba(0, 0, 0, 0.45), + 0 22px 40px -18px rgba(0, 0, 0, 0.6); + --m-shadow-2: + 0 1px 2px rgba(0, 0, 0, 0.3), 0 8px 18px -10px rgba(0, 0, 0, 0.45); + --m-well: #262626; + --m-focus-ring: + 0 0 0 1px rgba(111, 168, 255, 0.6), 0 0 0 4px rgba(111, 168, 255, 0.14); +} + +.sm-scene *, +.sm-scene *::before { + box-sizing: border-box; +} + +.sm-scene > * { + position: absolute; +} + +.sm-scene .m { + background: var(--m-surface); + box-shadow: + 0 0 0 1px var(--m-ring), + var(--m-highlight), + var(--m-shadow); +} + +.sm-scene .m.is-faded { + background: var(--m-surface-2); + box-shadow: + 0 0 0 1px var(--m-ring), + var(--m-highlight), + var(--m-shadow-2); +} + +.sm-scene .is-faded > * { + opacity: var(--m-fg-muted); +} + +.sm-scene svg.m-lines { + inset: 0; + width: 100%; + height: 100%; + fill: none; + stroke: #ffffff; + stroke-width: 1.5; + stroke-linecap: round; + stroke-dasharray: 0.01 4.5; + opacity: 0.9; +} + +.sm-scene .m-card { + border-radius: var(--sm-radius-lg); +} + +.sm-scene .m-row { + display: flex; + align-items: center; + gap: 8px; + height: 38px; + padding: 0 10px 0 8px; + font-weight: 500; + white-space: nowrap; +} + +.sm-scene .m-grow { + flex: 1; + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; +} + +.sm-scene .m-row s { + color: var(--sm-text-2); + text-decoration-thickness: 1px; +} + +.sm-scene .m-ic { + display: grid; + place-items: center; + flex-shrink: 0; + width: 22px; + height: 22px; + border-radius: var(--sm-radius-sm); + background: var(--m-well); +} + +.sm-scene .m-ic.is-on { + background: var(--m-accent-fill); + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.28), + var(--m-accent-glow); +} + +.sm-scene .m-tag, +.sm-scene .m-score { + flex-shrink: 0; + height: 18px; + padding: 0 6px; + border-radius: 5px; + background: var(--sm-tint); + box-shadow: inset 0 0 0 1px var(--sm-tint-stroke); + color: var(--sm-accent-text); + font-size: 10.5px; + line-height: 18px; +} + +.sm-scene .m-score { + font-family: var(--sm-font-mono); + font-variant-numeric: tabular-nums; + letter-spacing: 0; +} + +.sm-scene .is-front { + z-index: 2; +} + +.sm-scene .m-chip { + display: inline-flex; + align-items: center; + gap: 5px; + height: 28px; + padding: 0 10px 0 8px; + border-radius: var(--sm-radius-md); + font-weight: 500; + white-space: nowrap; +} + +.sm-scene .m-search { + gap: 8px; + padding: 0 12px; + color: var(--sm-text-2); + font-weight: 400; +} + +.sm-scene .m-ghost { + height: 38px; +} + +.sm-scene .m-skel { + display: block; + height: 5px; + border-radius: 3px; + background: var(--m-well); +} + +.sm-scene .m-skel + .m-skel { + margin-top: 5px; +} + +.sm-scene .m-folder { + width: 84px; + height: 70px; + border-radius: 4px 12px 12px 12px; + background: linear-gradient(180deg, #3b8cff 0%, #1f6fe6 100%); + box-shadow: + 0 14px 28px -12px rgba(28, 106, 224, 0.6), + 0 2px 4px rgba(28, 106, 224, 0.2); +} + +.sm-scene .m-folder::before { + content: ""; + position: absolute; + left: 0; + top: -8px; + width: 34px; + height: 11px; + border-radius: 6px 8px 0 0; + background: #3b8cff; +} + +.sm-scene .m-folder-front { + position: absolute; + left: 0; + right: 0; + bottom: 0; + height: 58px; + display: grid; + place-items: center; + border-radius: 10px 10px 12px 12px; + background: linear-gradient(180deg, #74b2ff 0%, #3d8fff 100%); + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.45), + 0 -1px 3px rgba(9, 30, 90, 0.12); +} + +.sm-scene .m-folder-front img { + width: 23px; + height: auto; + margin: 0; + opacity: 0.95; +} + +.sm-scene .m-files { + padding: 4px; +} + +.sm-scene .m-file { + display: flex; + align-items: center; + gap: 7px; + height: 28px; + padding: 0 8px; + border-radius: var(--sm-radius-sm); + color: var(--sm-text-2); + white-space: nowrap; +} + +.sm-scene .m-file svg { + flex-shrink: 0; +} + +.sm-scene .m-file.is-on { + background: var(--sm-tint); + box-shadow: inset 0 0 0 1px var(--sm-tint-stroke); + color: var(--sm-accent-text); +} + +.sm-scene .m-tile { + display: grid; + place-items: center; + border-radius: var(--sm-radius-lg); +} + +.sm-scene .m-tile img { + display: block; + width: 100%; + height: 100%; + margin: 0; + object-fit: contain; +} + +.sm-scene .m-tile.is-app img { + border-radius: inherit; +} + +.sm-scene .m-tile.is-logo { + background: linear-gradient(180deg, #ffffff 0%, #f7f8fa 100%); + box-shadow: + 0 0 0 1px rgba(9, 17, 32, 0.07), + inset 0 1px 0 #ffffff, + var(--m-shadow); +} + +.sm-scene .m-tile.is-logo.is-on { + box-shadow: + 0 0 0 1px rgba(47, 134, 255, 0.55), + 0 0 0 4px rgba(47, 134, 255, 0.14), + var(--m-shadow); +} + +.sm-scene .m-tile.is-on { + box-shadow: var(--m-focus-ring), var(--m-shadow); +} + +.sm-scene .m-badge { + position: absolute; + right: -5px; + bottom: -5px; + display: grid; + place-items: center; + width: 16px; + height: 16px; + border-radius: 50%; + background: var(--m-accent-fill); + box-shadow: + 0 0 0 2px var(--sm-bg), + 0 2px 4px rgba(9, 17, 32, 0.18); +} + +.sm-scene .m-orb { + display: grid; + place-items: center; + width: 52px; + height: 52px; + border-radius: var(--sm-radius-xl); + background: var(--m-accent-fill); + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.3), + 0 12px 24px -8px rgba(28, 106, 224, 0.6), + 0 2px 4px rgba(28, 106, 224, 0.2); +} + +.sm-scene .m-orb::before { + content: ""; + position: absolute; + inset: -7px; + border-radius: calc(var(--sm-radius-xl) + 7px); + background: rgba(255, 255, 255, 0.22); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.7); + z-index: -1; +} + +.dark .sm-scene .m-orb::before { + background: rgba(255, 255, 255, 0.06); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.22); +} + +.sm-scene .m-orb img { + width: 24px; + height: auto; + margin: 0; +} + +.sm-scene .m-profile { + padding: 0 12px 6px; +} + +.sm-scene .m-profile-head { + display: flex; + align-items: flex-end; + gap: 10px; + padding: 10px 0; + box-shadow: inset 0 -1px 0 var(--m-ring); +} + +.sm-scene .m-profile-head .m-grow { + display: flex; + flex-direction: column; + padding-bottom: 1px; +} + +.sm-scene .m-profile-head b { + font-size: 12px; + font-weight: 500; + line-height: 16px; +} + +.sm-scene .m-profile-head .m-grow > span { + color: var(--sm-text-2); + font-size: 11px; + line-height: 14px; +} + +.sm-scene .m-avatar { + display: grid; + place-items: center; + flex-shrink: 0; + width: 40px; + height: 40px; + align-self: flex-start; + margin-top: -24px; + border-radius: 50%; + background: linear-gradient(180deg, #eaf2ff 0%, #cfe0ff 100%); + box-shadow: + 0 0 0 3px #ffffff, + 0 0 0 4px var(--m-ring), + 0 6px 14px -4px rgba(28, 106, 224, 0.35); + color: var(--sm-accent-text); + font-size: 12px; + font-weight: 500; + letter-spacing: 0.01em; +} + +.sm-scene .m-avatar img { + display: block; + width: 100%; + height: 100%; + margin: 0; + border-radius: 50%; + object-fit: cover; +} + +.dark .sm-scene .m-avatar { + background: linear-gradient(180deg, #1d2d4a 0%, #142240 100%); + box-shadow: + 0 0 0 3px #1c1c1c, + 0 0 0 4px var(--m-ring), + 0 6px 14px -4px rgba(0, 0, 0, 0.6); +} + +.sm-scene .m-fact { + display: flex; + align-items: center; + gap: 8px; + height: 30px; + font-weight: 500; + white-space: nowrap; +} + +.sm-scene .m-fact + .m-fact { + box-shadow: inset 0 1px 0 var(--m-ring); +} + +.sm-scene .m-fact .m-ic { + width: 20px; + height: 20px; +} + +.sm-scene .m-fact-kind { + flex-shrink: 0; + color: var(--sm-text-3); + font-size: 10.5px; +} + +.sm-scene .m-pdf { + display: grid; + place-items: center; + width: 64px; + height: 80px; +} + +.sm-scene .m-pdf-tag { + position: absolute; + left: -6px; + bottom: 12px; + height: 16px; + padding: 0 5px; + border-radius: 4px; + background: linear-gradient(180deg, #ef5b5b 0%, #d23a3a 100%); + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.25), + 0 3px 8px -2px rgba(210, 58, 58, 0.5); + color: #ffffff; + font-size: 9.5px; + font-weight: 500; + line-height: 16px; + letter-spacing: 0.02em; +} + +.sm-scene .m-chunk { + height: 26px; + padding: 0 10px; + display: flex; + align-items: center; +} + +.sm-scene .m-chunk .m-skel { + flex: none; +} + +.sm-scene .m-chunk.is-on { + box-shadow: var(--m-focus-ring), var(--m-highlight), var(--m-shadow); +} + +.sm-scene .m-chunk.is-on .m-skel { + background: rgba(47, 134, 255, 0.3); +} + +.sm-scene .m-board { + padding: 0 12px 4px; +} + +.sm-scene .m-board-head { + height: 30px; + line-height: 30px; + color: var(--sm-text-2); + font-weight: 500; +} + +.sm-scene .m-board-row { + display: flex; + align-items: center; + gap: 8px; + height: 34px; + box-shadow: inset 0 1px 0 var(--m-ring); + font-weight: 500; +} + +.sm-scene .m-board-row.is-faded > * { + opacity: 0.6; +} + +.sm-scene .m-board-row > :last-child:not(.m-grow) { + color: var(--sm-accent-text); + font-variant-numeric: tabular-nums; +} + +.sm-scene svg.icon { + background-color: var(--sm-text-2) !important; +} + +.sm-scene .is-on > svg.icon, +.sm-scene .m-search svg.icon { + background-color: var(--sm-accent-text) !important; +} + +.sm-scene .m-ic.is-on svg.icon, +.sm-scene .m-badge svg.icon { + background-color: #ffffff !important; +} + +.font-semibold, +.font-bold, +.font-extrabold, +.font-black, +strong, +b, +th, +h1, +h2, +h3, +h4, +h5, +h6, +[class*="font-semibold"], +[class*="font-bold"] { + font-weight: 500 !important; +} + +:is(h1, h2, h3, h4, h5, h6) a, +a[class*="-ml-10"] { + font-weight: inherit !important; +} + +.dark img[src*="/icons/hugeicons/"], +.sm-scene .m-ic.is-on img[src*="/icons/hugeicons/"], +.sm-scene .m-badge img[src*="/icons/hugeicons/"] { + filter: invert(1); +} + +@media (prefers-reduced-motion: reduce) { + .sm-home *, + #navigation-items li > a { + transition-duration: 0.01ms !important; + } +} + +@media (max-width: 1024px) { + .sm-home { + padding-top: 56px; + } + + .sm-home-hero { + grid-template-columns: minmax(0, 1fr); + gap: 40px; + } + + .sm-home-grid-3 { + gap: 16px; + } + + .sm-home-grid-3 .sm-home-card-body { + padding: 20px; + } +} + +@media (max-width: 767px) { + .sm-prompt-scroll { + height: 280px; + } + + .sm-home-grid-3 { + grid-template-columns: minmax(0, 1fr); + } +} + +@media (max-width: 640px) { + .sm-home { + padding: 40px 16px 64px; + } + + .sm-home-title { + font-size: 34px; + line-height: 1.1; + } + + .sm-home-actions { + flex-direction: column; + align-items: stretch; + } + + .sm-home-btn { + justify-content: center; + height: 44px; + font-size: 14px; + } + + .sm-home-lede { + font-size: 16px; + } + + .sm-home-section { + margin-top: 72px; + } + + .sm-home-heading { + font-size: 26px !important; + } + + .sm-home-grid-3, + .sm-home-grid-2, + .sm-home-list-card .sm-home-links { + grid-template-columns: minmax(0, 1fr); + } +} + +html:has(.sm-home) a:has(> img.nav-logo) { + display: inline-flex !important; + align-items: center; + gap: 10px; +} + +html:has(.sm-home) img.nav-logo[src="/logo/light.svg"] { + content: url("/logo/wordmark-light.svg"); + height: 18px !important; +} + +html:has(.sm-home) img.nav-logo[src="/logo/dark.svg"] { + content: url("/logo/wordmark-dark.svg"); + height: 18px !important; +} + +html:has(.sm-home) a:has(> img.nav-logo)::after { + content: "Docs"; + padding-left: 10px; + border-left: 1px solid var(--sm-border-hover); + font-family: var(--sm-font-sans); + font-size: 15px; + font-weight: 500; + line-height: 18px; + color: var(--sm-text-2); +} diff --git a/apps/docs/supermemory-mcp/chatgpt-web.mdx b/apps/docs/supermemory-mcp/chatgpt-web.mdx index c7106133..507564eb 100644 --- a/apps/docs/supermemory-mcp/chatgpt-web.mdx +++ b/apps/docs/supermemory-mcp/chatgpt-web.mdx @@ -7,7 +7,7 @@ sidebarTitle: "ChatGPT Web" Connect Supermemory MCP to [ChatGPT Web](https://chatgpt.com) to use your Supermemory context directly in a conversation. -## Step 1: Open Settings +## Step 1: Open settings Open your profile menu in the lower-left corner of ChatGPT Web and select **Settings**. @@ -22,7 +22,7 @@ Open your profile menu in the lower-left corner of ChatGPT Web and select **Sett alt="ChatGPT Web profile menu in light mode with Settings highlighted" /> -## Step 2: Open Plugins +## Step 2: Open plugins Select **Plugins** in the Settings sidebar. @@ -37,7 +37,7 @@ Select **Plugins** in the Settings sidebar. alt="ChatGPT Web Plugins settings in light mode" /> -## Step 3: Open Developer mode +## Step 3: Open developer mode Scroll to the bottom of **Plugins** and select **Developer mode**. @@ -52,7 +52,7 @@ Scroll to the bottom of **Plugins** and select **Developer mode**. alt="Developer mode and Browse plugins at the bottom of ChatGPT Web Plugins settings in light mode" /> -## Step 4: Enable Developer mode +## Step 4: Enable developer mode ChatGPT opens the **Developer mode** section under **Security and login**. Turn **Developer mode** on. @@ -78,7 +78,7 @@ ChatGPT opens the **Developer mode** section under **Security and login**. Turn alt="Developer mode enabled in ChatGPT Web light mode" /> -## Step 5: Open Browse plugins +## Step 5: Open browse plugins Return to **Plugins**, scroll to the bottom, and select **Browse plugins**. diff --git a/apps/docs/supermemory-mcp/claude-desktop.mdx b/apps/docs/supermemory-mcp/claude-desktop.mdx index 8dbd8c7a..30646598 100644 --- a/apps/docs/supermemory-mcp/claude-desktop.mdx +++ b/apps/docs/supermemory-mcp/claude-desktop.mdx @@ -1,19 +1,19 @@ --- title: "Claude Desktop" description: "Connect Supermemory MCP in Claude via Settings → Connectors" -icon: "monitor" +icon: "/icons/hugeicons/computer.svg" sidebarTitle: "Claude Desktop" --- -This guide walks through adding Supermemory as a **custom connector** in [Claude](https://claude.ai) (Desktop or web): open **Settings → Connectors**, add the MCP URL, connect, and authorize. For other clients, see [Setup and Usage](/supermemory-mcp/setup). +This guide adds Supermemory to Claude, on desktop or the web, as a custom connector. For other clients, see [setup and usage](/supermemory-mcp/setup). -## Step 1 — Open Connectors and add a custom connector +## Step 1: Open connectors and add a custom connector In Claude, open **Settings → Connectors**. Click **Add**, then choose **Add custom connector**. ![Claude settings Connectors page with Add custom connector highlighted](/images/supermemory-mcp/claude-desktop/step-1.jpg) -## Step 2 — Enter name and remote MCP URL +## Step 2: Enter name and remote MCP URL In the **Add custom connector** dialog: @@ -26,13 +26,13 @@ Leave **OAuth Client ID** and **OAuth Client Secret** empty unless you have cust ![Add custom connector dialog with Supermemory name and mcp.supermemory.ai URL](/images/supermemory-mcp/claude-desktop/step-2.png) -## Step 3 — Connect +## Step 3: Connect Supermemory appears under your connectors. Click **Connect**. ![Connectors list with supermemory and Connect button](/images/supermemory-mcp/claude-desktop/step-3.png) -## Step 4 — Authorize +## Step 4: Authorize You’ll be redirected to Supermemory to sign in and choose access scopes (for example **Read + Write** or **Full access**). Select the scopes you want, then click **Authorize**. diff --git a/apps/docs/supermemory-mcp/mcp.mdx b/apps/docs/supermemory-mcp/mcp.mdx index f38845af..c7f5f6dc 100644 --- a/apps/docs/supermemory-mcp/mcp.mdx +++ b/apps/docs/supermemory-mcp/mcp.mdx @@ -1,7 +1,7 @@ --- title: "Overview" description: "Give every MCP-compatible assistant shared memory, team spaces, and interactive workflows" -icon: "brain-circuit" +icon: "/icons/hugeicons/ai-brain-01.svg" --- Supermemory MCP gives every MCP-compatible assistant a shared memory layer, so technical and non-technical teams can collaborate with AI using the same authorized context. Connect once to search decisions, save knowledge, upload source material, and explore relationships from the AI tools your team already uses. @@ -20,7 +20,7 @@ After you connect, your client opens Supermemory in a browser. Sign in or create For client-specific instructions, see [Setup and Usage](/supermemory-mcp/setup) or the [Claude Desktop guide](/supermemory-mcp/claude-desktop). - + MCP clients that use JSON configuration generally accept this shape: ```json @@ -46,25 +46,27 @@ Your assistant chooses these tools automatically. Use this table when you need t | Tool | Use it for | Inputs | Result | | --- | --- | --- | --- | -| `search_memory` | Semantic recall from one space, with optional profile context | `query` (required), `includeProfile`, `containerTag` | Profile context and matching memories | +| `search_memory` | Semantic recall from one space | `query` (required), `containerTag` | Matching memories | +| `get_profile` | Stable and recent profile context for one space | `containerTag` | Profile facts | | `add_memory` | Save information or forget outdated information | `content` (required), `action` (`save` or `forget`), `containerTag` | Save or forget confirmation | -| `listDocuments` | Browse stored source documents and their summaries | `page`, `limit`, `containerTag` | Document IDs, titles, types, status, dates, and summaries | -| `getDocument` | Read the available content of one document | `documentId` (required) | Document metadata, summary, and available content | -| `listMemories` | Browse recent extracted memory entries and their source document IDs | `page`, `limit`, `containerTag` | Memory IDs, text, versions, and source document IDs | -| `listSpaces` | List accessible spaces and resolve a space name to its key | None | Formatted list plus structured `spaces` and `count` fields | -| `whoAmI` | Inspect the authenticated account, permissions, scope, and active space | None | Account and access context | +| `list_documents` | Browse stored source documents and their summaries | `page`, `limit`, `containerTag` | Document IDs, titles, types, status, dates, and summaries | +| `get_document` | Read the available content of one document | `documentId` (required) | Document metadata, summary, and available content | +| `list_memories` | Browse recent extracted memory entries and their source document IDs | `page`, `limit`, `containerTag` | Memory IDs, text, versions, and source document IDs | +| `list_spaces` | List accessible spaces and resolve a space name to its key | None | Formatted list plus structured `spaces` and `count` fields | +| `who_am_i` | Inspect the authenticated account, permissions, scope, and active space | None | Account and access context | ### Search -`search_memory` accepts a natural-language query and returns semantically relevant memories. By default, it also includes stable and recent profile context from the same space. Set `includeProfile` to `false` when only matching memories are needed. +`search_memory` accepts a natural-language query and returns semantically relevant memories. It does not include the space profile. Use `get_profile` when the assistant needs stable facts or recent context that search did not return. Use the retrieval tools for different questions: - Use `search_memory` to answer a question from remembered context. -- Use `listDocuments` to discover stored sources, then `getDocument` to read one source in full. -- Use `listMemories` to inspect the extracted memory entries themselves, including their IDs and source document IDs. +- Use `get_profile` for who-the-user-is, preferences, and recent context. +- Use `list_documents` to discover stored sources, then `get_document` to read one source in full. +- Use `list_memories` to inspect the extracted memory entries themselves, including their IDs and source document IDs. -`listDocuments` and `listMemories` default to 10 results per page and accept up to 50. +`list_documents` and `list_memories` default to 10 results per page and accept up to 50. ### Save or forget @@ -74,7 +76,7 @@ If the content is already final, the assistant should use `add_memory`. If you w ### Access control -`whoAmI` returns the current identity, role, access type, granted scope, and active space. `listSpaces` returns only spaces the authenticated account can access, with names, keys, document and memory counts, and recent activity. +`who_am_i` returns the current identity, role, access type, granted scope, and active space. `list_spaces` returns only spaces the authenticated account can access, with names, keys, document and memory counts, and recent activity. ## Interactive widgets @@ -138,7 +140,7 @@ Supported types include text, Markdown, PDF, Word, CSV, common images, MP3, WAV, `memory-graph` renders the selected space as an interactive graph of source documents and extracted memories. -When no space is named, the server automatically uses the active space or account default. If you name a specific space, the assistant calls `listSpaces` to resolve its name to a space key, then opens that space's graph. +When no space is named, the server automatically uses the active space or account default. If you name a specific space, the assistant calls `list_spaces` to resolve its name to a space key, then opens that space's graph. - + Configure Supermemory in supported MCP clients. diff --git a/apps/docs/supermemory-mcp/setup.mdx b/apps/docs/supermemory-mcp/setup.mdx index 6b444f54..5c48cc17 100644 --- a/apps/docs/supermemory-mcp/setup.mdx +++ b/apps/docs/supermemory-mcp/setup.mdx @@ -1,7 +1,7 @@ --- -title: "Setup and Usage" +title: "Setup and usage" description: "Connect Supermemory to an MCP client with OAuth and choose how requests use spaces" -icon: "settings" +icon: "/icons/hugeicons/settings-01.svg" --- ## Server URL diff --git a/apps/docs/test.py b/apps/docs/test.py index 85ce6f82..463eb786 100644 --- a/apps/docs/test.py +++ b/apps/docs/test.py @@ -9,7 +9,6 @@ conversation = [ {"role": "user", "content": "Can I go to the club?"}, ] -# Get user profile + relevant memories for context profile = client.profile(container_tag=USER_ID, q=conversation[-1]["content"]) static = "\n".join(profile.profile.static) @@ -25,12 +24,8 @@ Dynamic profile: Relevant memories: {memories}""" -# Build messages with memory-enriched context messages = [{"role": "system", "content": f"User context:\n{context}"}, *conversation] -# response = llm.chat(messages=messages) - -# Store conversation for future context client.add( content="\n".join(f"{m['role']}: {m['content']}" for m in conversation), container_tag=USER_ID, diff --git a/apps/docs/test.ts b/apps/docs/test.ts index 8eab02ff..a04732d6 100644 --- a/apps/docs/test.ts +++ b/apps/docs/test.ts @@ -12,7 +12,6 @@ const conversation = [ { role: "user", content: "Can I go to the club?" }, ] -// Get user profile + relevant memories for context const profile = await client.profile({ containerTag: USER_ID, q: conversation.at(-1)?.content, @@ -27,15 +26,11 @@ ${profile.profile.dynamic.join("\n")} Relevant memories: ${profile.searchResults?.results.map((r) => r.content).join("\n")}` -// Build messages with memory-enriched context const _messages = [ { role: "system", content: `User context:\n${context}` }, ...conversation, ] -// const response = await llm.chat({ messages }); - -// Store conversation for future context await client.add({ content: conversation.map((m) => `${m.role}: ${m.content}`).join("\n"), containerTag: USER_ID, diff --git a/apps/docs/theme-switch.js b/apps/docs/theme-switch.js new file mode 100644 index 00000000..16a43479 --- /dev/null +++ b/apps/docs/theme-switch.js @@ -0,0 +1,18 @@ +;(() => { + var root = document.documentElement + var wasDark = root.classList.contains("dark") + + new MutationObserver(() => { + var isDark = root.classList.contains("dark") + if (isDark === wasDark) return + wasDark = isDark + + var style = document.createElement("style") + style.textContent = "*,*::before,*::after{transition:none !important}" + document.head.appendChild(style) + void root.offsetHeight + requestAnimationFrame(() => { + style.remove() + }) + }).observe(root, { attributes: true, attributeFilter: ["class"] }) +})() diff --git a/apps/docs/user-profiles/buckets.mdx b/apps/docs/user-profiles/buckets.mdx index b44e686c..8249758b 100644 --- a/apps/docs/user-profiles/buckets.mdx +++ b/apps/docs/user-profiles/buckets.mdx @@ -1,8 +1,8 @@ --- -title: "Profile Buckets" +title: "Profile buckets" sidebarTitle: "Buckets" description: "Custom topical categories for user profiles" -icon: "tags" +icon: "/icons/hugeicons/tag-01.svg" --- Buckets are **custom topical categories** for a profile — an axis that sits alongside `static` and `dynamic`. Where static/dynamic split facts by how long-lived they are, buckets group them by subject (e.g. `preferences`, `goals`, `work`). As content is ingested, a classifier assigns each memory to the buckets it matches, so you can pull just the slice of context a given surface needs. @@ -365,7 +365,7 @@ The model behind extraction and bucket classification isn't configurable through --- -## Next Steps +## Next steps - [User Profiles](/recall/user-profiles) — Fetch and use profiles via the API - [User Profiles Concept](/concepts/user-profiles) — Static vs dynamic vs buckets diff --git a/apps/docs/using-supermemory.mdx b/apps/docs/using-supermemory.mdx index be38bf80..6fc156b1 100644 --- a/apps/docs/using-supermemory.mdx +++ b/apps/docs/using-supermemory.mdx @@ -2,7 +2,7 @@ title: "Using Supermemory" sidebarTitle: "Overview" description: "The full loop: authenticate, put context in, get it back out, keep it correct." -icon: "compass" +icon: "/icons/hugeicons/compass-01.svg" --- import { Journey, JourneyStep, JourneyItem } from "/snippets/journey.mdx"; @@ -11,55 +11,55 @@ Everything in this section is one of four steps. Same loop whether you're buildi - - - + + + - - - - - - + + + + + + - - - - + + + + - - - - - - + + + + + + -Raw input becomes **memories** (the knowledge graph) and/or indexed **document chunks** (for RAG) automatically — see [how it works](/concepts/how-it-works). You don't choose one or the other; both build from the same write. Retrieval gives you three ways to read that same pool back — see [Memory vs RAG](/concepts/memory-vs-rag) if you're not sure which one fits. +Raw input automatically becomes memories (the knowledge graph) and indexed document chunks (for RAG). You don't choose one or the other; both come from the same write. Retrieval then gives you three ways to read that pool back. If you're unsure which fits, read [Memory vs RAG](/concepts/memory-vs-rag). ## Where next - + Walk the whole loop end to end with one working example. - + What happens between `add()` and a memory showing up in search. - + The isolation boundary every ingest and retrieve call is scoped to. - + When to reach for search, profiles, or both. - + Run standardized, reproducible evals against Supermemory and other providers — including your own. diff --git a/apps/docs/videos/eve-memory.mp4 b/apps/docs/videos/eve-memory.mp4 new file mode 100644 index 00000000..e32af87d Binary files /dev/null and b/apps/docs/videos/eve-memory.mp4 differ diff --git a/apps/mcp/README.md b/apps/mcp/README.md index 1cf39bc1..fc40803f 100644 --- a/apps/mcp/README.md +++ b/apps/mcp/README.md @@ -48,12 +48,13 @@ The client discovers the OAuth authorization server through | Tool | Purpose | | --- | --- | -| `search_memory` | Search memories and optionally include profile context | -| `listDocuments` | List document metadata and summaries in a space | -| `getDocument` | Read one document's available content by ID | -| `listMemories` | List extracted memory entries and their source document IDs | -| `listSpaces` | List spaces visible to the authenticated account | -| `whoAmI` | Return identity, access, and active-space context | +| `search_memory` | Search memories in a space | +| `get_profile` | Get stable and recent profile context for a space | +| `list_documents` | List document metadata and summaries in a space | +| `get_document` | Read one document's available content by ID | +| `list_memories` | List extracted memory entries and their source document IDs | +| `list_spaces` | List spaces visible to the authenticated account | +| `who_am_i` | Return identity, access, and active-space context | | `add_memory` | Save or forget a memory | ### MCP App launchers diff --git a/apps/mcp/e2e/discovery.test.ts b/apps/mcp/e2e/discovery.test.ts index 3da201c2..66c503f2 100644 --- a/apps/mcp/e2e/discovery.test.ts +++ b/apps/mcp/e2e/discovery.test.ts @@ -10,11 +10,12 @@ import { const EXPECTED_TOOLS = [ "add_memory", "fetch-graph-data", - "getDocument", + "get_document", + "get_profile", "guided-save", - "listDocuments", - "listMemories", - "listSpaces", + "list_documents", + "list_memories", + "list_spaces", "memory-graph", "prepare-file-upload", "save-memory", @@ -22,17 +23,18 @@ const EXPECTED_TOOLS = [ "select-space", "set-active-tag", "upload-file", - "whoAmI", + "who_am_i", ] const describeWithAuth = describe.skipIf(!OAUTH_CREDENTIALS_AVAILABLE) const READ_ONLY_TOOL_NAMES = [ "search_memory", - "listDocuments", - "listMemories", - "getDocument", - "listSpaces", - "whoAmI", + "get_profile", + "list_documents", + "list_memories", + "get_document", + "list_spaces", + "who_am_i", "memory-graph", ] @@ -74,7 +76,7 @@ describeWithAuth("MCP — discovery & identity", () => { } }) - it("marks add_memory as mutating", async () => { + it("marks addMemory as mutating", async () => { const { tools } = await s.client.listTools() const memory = tools.find((t) => t.name === "add_memory") expect(memory?.annotations).toMatchObject(MEMORY_TOOL_ANNOTATIONS) @@ -93,7 +95,7 @@ describeWithAuth("MCP — discovery & identity", () => { }) it("whoAmI resolves to the authenticated account", async () => { - const res = await callTool(s.client, "whoAmI") + const res = await callTool(s.client, "who_am_i") expect(res.isError).toBeFalsy() const parsed = JSON.parse(textOf(res)) expect(parsed.userId).toBeTruthy() @@ -101,7 +103,7 @@ describeWithAuth("MCP — discovery & identity", () => { }) it("listSpaces returns content", async () => { - const res = await callTool(s.client, "listSpaces") + const res = await callTool(s.client, "list_spaces") expect(res.isError).toBeFalsy() expect(textOf(res).length).toBeGreaterThan(0) }) diff --git a/apps/mcp/e2e/graph.test.ts b/apps/mcp/e2e/graph.test.ts index 5b9d45a5..9e654464 100644 --- a/apps/mcp/e2e/graph.test.ts +++ b/apps/mcp/e2e/graph.test.ts @@ -52,7 +52,7 @@ describeWithAuth("MCP — graph, resources & prompts", () => { expect(res.contents[0].text).toMatch(/# Active Space Profile/) expect(res.contents[0].text).toMatch(/Space:/) expect(res.contents[0].text).toMatch( - /Use `listSpaces` to find the relevant space key/, + /Use `list_spaces` to find the relevant space key/, ) }) diff --git a/apps/mcp/e2e/helpers.ts b/apps/mcp/e2e/helpers.ts index 2d8a379d..0118106d 100644 --- a/apps/mcp/e2e/helpers.ts +++ b/apps/mcp/e2e/helpers.ts @@ -225,7 +225,6 @@ export async function recallUntil( for (let i = 0; i < tries; i++) { const res = await callTool(client, "search_memory", { query, - includeProfile: false, ...(containerTag ? { containerTag } : {}), }) const txt = textOf(res) diff --git a/apps/mcp/e2e/list-memories.test.ts b/apps/mcp/e2e/list-memories.test.ts index e171cc9b..72c20985 100644 --- a/apps/mcp/e2e/list-memories.test.ts +++ b/apps/mcp/e2e/list-memories.test.ts @@ -97,7 +97,7 @@ describe.skipIf(!OAUTH_CREDENTIALS_AVAILABLE)( const listedDocument = await waitForToolText( session, - "listDocuments", + "list_documents", { page: 1, limit: 50, containerTag }, `[${savedView.id}]`, 20, @@ -107,7 +107,7 @@ describe.skipIf(!OAUTH_CREDENTIALS_AVAILABLE)( const document = await waitForToolText( session, - "getDocument", + "get_document", { documentId: savedView.id }, `Document ID: ${savedView.id}`, 20, @@ -115,7 +115,7 @@ describe.skipIf(!OAUTH_CREDENTIALS_AVAILABLE)( ) expect(document, "saved document could not be read").not.toBeNull() - const memoriesResult = await callTool(session.client, "listMemories", { + const memoriesResult = await callTool(session.client, "list_memories", { page: 1, limit: 10, containerTag: "sm_project_default", @@ -132,7 +132,7 @@ describe.skipIf(!OAUTH_CREDENTIALS_AVAILABLE)( throw new Error("Listed memory did not include a source document") } - const sourceDocument = await callTool(session.client, "getDocument", { + const sourceDocument = await callTool(session.client, "get_document", { documentId: sourceDocumentId, }) expect(sourceDocument.isError).toBeFalsy() @@ -182,7 +182,7 @@ describe.skipIf(!OAUTH_CREDENTIALS_AVAILABLE)( const document = await waitForToolText( session, - "getDocument", + "get_document", { documentId: uploaded.id }, `Document ID: ${uploaded.id}`, 20, diff --git a/apps/mcp/e2e/memory.test.ts b/apps/mcp/e2e/memory.test.ts index 7ff5664a..8b098441 100644 --- a/apps/mcp/e2e/memory.test.ts +++ b/apps/mcp/e2e/memory.test.ts @@ -43,21 +43,29 @@ describe.skipIf(!OAUTH_CREDENTIALS_AVAILABLE)("MCP — memory behaviors", () => expect(found, `recall never returned marker ${marker}`).not.toBeNull() }, 120_000) - it("recall includeProfile=true returns profile + memories sections", async () => { + it("searchMemory does not include profile sections", async () => { const res = await callTool(s.client, "search_memory", { query: "dragonfruit", - includeProfile: true, }) expect(res.isError).toBeFalsy() const txt = textOf(res) - expect(txt).toMatch(/## (Profile|Recent context|Matching memories)/) + expect(txt).not.toMatch(/## (Profile|Stable Context|Recent [Cc]ontext)/) + expect(txt).toMatch(/## Matching memories|No matching memories found/i) + }, 30_000) + + it("getProfile returns profile sections", async () => { + const res = await callTool(s.client, "get_profile", {}) + expect(res.isError).toBeFalsy() + const txt = textOf(res) + expect(txt).toMatch( + /## (Stable Context|Recent Context)|No profile facts are available/i, + ) }, 30_000) // Hybrid search returns nearest matches even for unrelated queries — assert it responds gracefully, not empty. it("recall responds gracefully for an unmatched query", async () => { const res = await callTool(s.client, "search_memory", { query: `zzz-no-such-memory-${randomUUID()}`, - includeProfile: false, }) expect(res.isError).toBeFalsy() expect(textOf(res)).toMatch( diff --git a/apps/mcp/e2e/oauth.test.ts b/apps/mcp/e2e/oauth.test.ts index ba2eaca0..2aa79cbb 100644 --- a/apps/mcp/e2e/oauth.test.ts +++ b/apps/mcp/e2e/oauth.test.ts @@ -128,7 +128,7 @@ describe.skipIf(!OAUTH_REFRESH_TOKEN || !OAUTH_CLIENT_ID)( it("connects to /mcp with the OAuth token and resolves identity", async () => { s = await connect({ token: accessToken }) - const res = await callTool(s.client, "whoAmI") + const res = await callTool(s.client, "who_am_i") expect(res.isError).toBeFalsy() expect(JSON.parse(textOf(res)).userId).toBeTruthy() }) diff --git a/apps/mcp/e2e/space-scope.test.ts b/apps/mcp/e2e/space-scope.test.ts index 1dab7267..3b5c013b 100644 --- a/apps/mcp/e2e/space-scope.test.ts +++ b/apps/mcp/e2e/space-scope.test.ts @@ -25,11 +25,13 @@ describeWithAuth("MCP - space scoping", () => { expect(propsOf(plainTools, "search_memory")).toHaveProperty( "containerTag", ) + expect(propsOf(plainTools, "get_profile")).toHaveProperty("containerTag") expect(propsOf(scopedTools, "add_memory")).toHaveProperty("containerTag") expect(propsOf(scopedTools, "search_memory")).toHaveProperty( "containerTag", ) + expect(propsOf(scopedTools, "get_profile")).toHaveProperty("containerTag") } finally { await scoped.close() await plain.close() diff --git a/apps/mcp/e2e/widgets.test.ts b/apps/mcp/e2e/widgets.test.ts index 438d3033..13824549 100644 --- a/apps/mcp/e2e/widgets.test.ts +++ b/apps/mcp/e2e/widgets.test.ts @@ -62,7 +62,7 @@ describe.skipIf(!OAUTH_CREDENTIALS_AVAILABLE)( const separateSession = await connect() try { - const identity = await callTool(separateSession.client, "whoAmI") + const identity = await callTool(separateSession.client, "who_am_i") expect(identity.isError).toBeFalsy() expect(JSON.parse(textOf(identity))).toMatchObject({ activeSpace: firstTag, diff --git a/apps/mcp/package.json b/apps/mcp/package.json index d33880d5..e219c276 100644 --- a/apps/mcp/package.json +++ b/apps/mcp/package.json @@ -26,6 +26,7 @@ "@modelcontextprotocol/sdk": "1.30.0", "@modelcontextprotocol/server": "2.0.0", "@phosphor-icons/react": "^2.1.10", + "@posthog/mcp": "0.21.0", "@radix-ui/react-popover": "^1.1.15", "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-tooltip": "^1.2.7", diff --git a/apps/mcp/pnpm-lock.yaml b/apps/mcp/pnpm-lock.yaml index 2747cdfb..c3530142 100644 --- a/apps/mcp/pnpm-lock.yaml +++ b/apps/mcp/pnpm-lock.yaml @@ -4,6 +4,14 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + fast-uri: 3.1.7 + ip-address: 10.3.1 + nanoid@3: 3.3.18 + postcss: 8.5.18 + sharp: 0.35.4 + undici: 7.29.1 + importers: .: @@ -16,16 +24,19 @@ importers: version: 2.0.0 '@modelcontextprotocol/ext-apps': specifier: ^1.7.5 - version: 1.7.5(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.4.3))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(zod@4.4.3) + version: 1.7.5(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(supports-color@10.2.2)(zod@4.4.3))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(zod@4.4.3) '@modelcontextprotocol/sdk': specifier: 1.30.0 - version: 1.30.0(@cfworker/json-schema@4.1.1)(zod@4.4.3) + version: 1.30.0(@cfworker/json-schema@4.1.1)(supports-color@10.2.2)(zod@4.4.3) '@modelcontextprotocol/server': specifier: 2.0.0 version: 2.0.0 '@phosphor-icons/react': specifier: ^2.1.10 version: 2.1.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@posthog/mcp': + specifier: 0.21.0 + version: 0.21.0(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(supports-color@10.2.2)(zod@4.4.3))(@modelcontextprotocol/server@2.0.0)(posthog-node@5.38.2) '@radix-ui/react-popover': specifier: ^1.1.15 version: 1.1.23(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -40,7 +51,7 @@ importers: version: 0.2.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) agents: specifier: ^0.20.1 - version: 0.20.1(@babel/core@7.29.7)(@babel/runtime@7.29.7)(@cloudflare/workers-types@4.20260620.1)(@modelcontextprotocol/client@2.0.0)(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.4.3))(@modelcontextprotocol/server@2.0.0)(ai@6.0.208(zod@4.4.3))(react@19.2.8)(rolldown@1.2.1)(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))(zod@4.4.3) + version: 0.20.1(@babel/core@8.0.6)(@babel/runtime@7.29.7)(@cloudflare/workers-types@4.20260620.1)(@modelcontextprotocol/client@2.0.0)(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(supports-color@10.2.2)(zod@4.4.3))(@modelcontextprotocol/server@2.0.0)(ai@6.0.208(zod@4.4.3))(react@19.2.8)(rolldown@1.2.1)(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))(zod@4.4.3) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -86,7 +97,7 @@ importers: version: 19.2.3(@types/react@19.2.17) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.7.0(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) + version: 4.7.0(supports-color@10.2.2)(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) tailwindcss: specifier: ^4.1.13 version: 4.3.3 @@ -101,7 +112,7 @@ importers: version: 2.3.3(rollup@4.62.2)(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) vitest: specifier: ^3.2.4 - version: 3.2.6(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) + version: 3.2.6(jiti@2.7.0)(lightningcss@1.32.0)(supports-color@10.2.2)(yaml@2.9.0) wrangler: specifier: ^4.4.0 version: 4.103.0(@cloudflare/workers-types@4.20260620.1) @@ -132,14 +143,26 @@ packages: resolution: {integrity: sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==} engines: {node: ^22.18.0 || >=24.11.0} + '@babel/code-frame@8.0.6': + resolution: {integrity: sha512-uMHhvmDmwFiLuiozaoRYTZHqMFuu3fem/X9JY78lohAuLoh8LSGGC8JqUzo2cVuBsBxkjMZNk56CE7ock8Xxkw==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/compat-data@7.29.7': resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} engines: {node: '>=6.9.0'} + '@babel/compat-data@8.0.5': + resolution: {integrity: sha512-YLsYoQMvL8l8WrGpN3Zj7O1wK5LEBN+cQtux7BcuHyxIXve724XG+zuJ1n3U1cUweRtTzQOA4IHbuQw3N34SZw==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/core@7.29.7': resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} engines: {node: '>=6.9.0'} + '@babel/core@8.0.6': + resolution: {integrity: sha512-5zwYt1V4ji3mXKKRIAkohSJ29WepxNwxQi+7y7P5AcVPh1dcxnZBU2cfxHnPwS+u9+lZnXPsv30TQaF2xg+Tfg==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/generator@7.29.7': resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} engines: {node: '>=6.9.0'} @@ -148,6 +171,10 @@ packages: resolution: {integrity: sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g==} engines: {node: ^22.18.0 || >=24.11.0} + '@babel/generator@8.0.6': + resolution: {integrity: sha512-/pcanjdRsonCexCuxgGD8fKnBLLzk2i9uM4kmcmGyyev2R5YDs+rafMYZ89RvaGY1mW8T7C5au0TyYaEeHBGng==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-annotate-as-pure@8.0.0': resolution: {integrity: sha512-NSpMkMsvvZqzThJ0p1B02cbtA2ObEyfBvq950bmNkyxsxvcxwhvvCB036rKhlEnuBBo30bOrk13u3FzlKSoRrw==} engines: {node: ^22.18.0 || >=24.11.0} @@ -156,6 +183,10 @@ packages: resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@8.0.6': + resolution: {integrity: sha512-HTrtZ4+iA0+kzdbCgvdSk1U4pEl3BvpGnlUbualCGNbrVhhQvhgBzurTUmqpWyvyHbWYWaIfdx2mOlL9LJjsew==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-create-class-features-plugin@8.0.1': resolution: {integrity: sha512-++t3ZktzlLmASAxIlxeXQK9Z2YwUafYGYcvGBFevqOqt16HozVHStUoQvWD09fzAZOb/uJGpUTBuGK41AJAuOA==} engines: {node: ^22.18.0 || >=24.11.0} @@ -170,6 +201,10 @@ packages: resolution: {integrity: sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==} engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-globals@8.0.6': + resolution: {integrity: sha512-OdnA/N52LhzFpeUuVz5YGuSWjc7TPHiFmVYZbPlSgExocO2GwbxVpSni9MVs5wwW+wZ4kPuwBEBN9pIPDYz1mA==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-member-expression-to-functions@8.0.0': resolution: {integrity: sha512-xkXrMbtk87Gk7+oKBVmBc6EORg/Qwx++AHESldmHkpvG8wgccdhJJFwrzqlF382Fk8wfXhJHWE/g/43QvEGNPQ==} engines: {node: ^22.18.0 || >=24.11.0} @@ -216,6 +251,10 @@ packages: resolution: {integrity: sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==} engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-string-parser@8.0.6': + resolution: {integrity: sha512-+6HYEBnsDRZHJtUTAEfMQd0zMDqdFHS7C+5vAsEZqBUr3vEMWOWlHJ0Jz1gS8jJIlCvLsuA6ivmeoqzH936YcA==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-validator-identifier@7.29.7': resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} @@ -224,14 +263,26 @@ packages: resolution: {integrity: sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==} engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-validator-identifier@8.0.6': + resolution: {integrity: sha512-HYx0YmuchRxRSpnjvcNffnPS8DCauKNmnumIuHG3jnQAVewRA7kfJGwF13ayEpSZs7s4R/oBH4eppuXcAQd5JQ==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-validator-option@7.29.7': resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@8.0.0': + resolution: {integrity: sha512-U4Dybxh4WESWHt5XhBeExi4DrY0/DNK1aHpQbsrQXCUbFHuMweT0TpLEWKvaraV2Y6fS+ZXunsZ8zIuZIgvF2Q==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helpers@7.29.7': resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} engines: {node: '>=6.9.0'} + '@babel/helpers@8.0.5': + resolution: {integrity: sha512-fQtPOXjYOYv85PIdwotp2TJGVYOycX0PQq+l844fFAxOULtBy8BVF35GyeueX0r4KvDthqPH5xAI1clQPk/2uA==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/parser@7.29.7': resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} engines: {node: '>=6.0.0'} @@ -242,6 +293,11 @@ packages: engines: {node: ^22.18.0 || >=24.11.0} hasBin: true + '@babel/parser@8.0.6': + resolution: {integrity: sha512-LpGDIYJAzc3Y3PT9x+FxBrGYu2PlWxLmyN7SwPTzaX0LSwEmFJBsRnPBqmaXF2r1v+Zhz6lNiEJ+7yKtM5+Ugg==} + engines: {node: ^22.18.0 || >=24.11.0} + hasBin: true + '@babel/plugin-proposal-decorators@8.0.2': resolution: {integrity: sha512-+C6O6KKXU7BBq1GNaIkFJxrALUVGRcr+WeWm4OcuRl3h+l/CmNfcTLMrT2Lm3uvGBimBH/8pEBRrXJFLoO67Gg==} engines: {node: ^22.18.0 || >=24.11.0} @@ -290,6 +346,10 @@ packages: resolution: {integrity: sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg==} engines: {node: ^22.18.0 || >=24.11.0} + '@babel/traverse@8.0.6': + resolution: {integrity: sha512-ilYV+qLStGzSKLipJlETdvdtpK3rAuwfCmCoGKv15MU4EoeIuLkespSNoNLFGOPSciEHx9TLWtN5mv0fz5w5mQ==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/types@7.29.7': resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} @@ -298,6 +358,10 @@ packages: resolution: {integrity: sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g==} engines: {node: ^22.18.0 || >=24.11.0} + '@babel/types@8.0.6': + resolution: {integrity: sha512-c+xgSWboV2pdwXP67BUWDVRHi2BO5Q3KwxyFVs7taVTY+fsK47/L51ZXQoV9rozHJDNHvJ4v4WEsI/IlxV2l2A==} + engines: {node: ^22.18.0 || >=24.11.0} + '@cfworker/json-schema@4.1.1': resolution: {integrity: sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==} @@ -357,8 +421,8 @@ packages: '@emnapi/core@2.0.0-alpha.3': resolution: {integrity: sha512-AZypUeJ/yByuxyS7BlSNRDOMLMlROYtjYdIAuBmJssVz1UJDSeYxLrdizhXCFYhedC5bqd/ASy8EuNXbVVXp9g==} - '@emnapi/runtime@1.11.1': - resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + '@emnapi/runtime@1.11.3': + resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} '@emnapi/runtime@2.0.0-alpha.3': resolution: {integrity: sha512-hFPAhMUjJD9BSyCANEISPOogeXC9Zo9ZQl7L6vKnaVsMkCtzznaW/naYypeyl0Gv5rYfWYsZbpixTMpjDJzQeA==} @@ -703,158 +767,170 @@ packages: resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} - '@img/sharp-darwin-arm64@0.34.5': - resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-darwin-arm64@0.35.4': + resolution: {integrity: sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.34.5': - resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-darwin-x64@0.35.4': + resolution: {integrity: sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.2.4': - resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + '@img/sharp-freebsd-wasm32@0.35.4': + resolution: {integrity: sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==} + engines: {node: '>=20.9.0'} + os: [freebsd] + + '@img/sharp-libvips-darwin-arm64@1.3.3': + resolution: {integrity: sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.2.4': - resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + '@img/sharp-libvips-darwin-x64@1.3.3': + resolution: {integrity: sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.2.4': - resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + '@img/sharp-libvips-linux-arm64@1.3.3': + resolution: {integrity: sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==} cpu: [arm64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-arm@1.2.4': - resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + '@img/sharp-libvips-linux-arm@1.3.3': + resolution: {integrity: sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==} cpu: [arm] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-ppc64@1.2.4': - resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + '@img/sharp-libvips-linux-ppc64@1.3.3': + resolution: {integrity: sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==} cpu: [ppc64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-riscv64@1.2.4': - resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + '@img/sharp-libvips-linux-riscv64@1.3.3': + resolution: {integrity: sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==} cpu: [riscv64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-s390x@1.2.4': - resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + '@img/sharp-libvips-linux-s390x@1.3.3': + resolution: {integrity: sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==} cpu: [s390x] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-x64@1.2.4': - resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + '@img/sharp-libvips-linux-x64@1.3.3': + resolution: {integrity: sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==} cpu: [x64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': - resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + '@img/sharp-libvips-linuxmusl-arm64@1.3.3': + resolution: {integrity: sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==} cpu: [arm64] os: [linux] libc: [musl] - '@img/sharp-libvips-linuxmusl-x64@1.2.4': - resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + '@img/sharp-libvips-linuxmusl-x64@1.3.3': + resolution: {integrity: sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==} cpu: [x64] os: [linux] libc: [musl] - '@img/sharp-linux-arm64@0.34.5': - resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-arm64@0.35.4': + resolution: {integrity: sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [linux] libc: [glibc] - '@img/sharp-linux-arm@0.34.5': - resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-arm@0.35.4': + resolution: {integrity: sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==} + engines: {node: '>=20.9.0'} cpu: [arm] os: [linux] libc: [glibc] - '@img/sharp-linux-ppc64@0.34.5': - resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-ppc64@0.35.4': + resolution: {integrity: sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==} + engines: {node: '>=20.9.0'} cpu: [ppc64] os: [linux] libc: [glibc] - '@img/sharp-linux-riscv64@0.34.5': - resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-riscv64@0.35.4': + resolution: {integrity: sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==} + engines: {node: '>=20.9.0'} cpu: [riscv64] os: [linux] libc: [glibc] - '@img/sharp-linux-s390x@0.34.5': - resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-s390x@0.35.4': + resolution: {integrity: sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==} + engines: {node: '>=20.9.0'} cpu: [s390x] os: [linux] libc: [glibc] - '@img/sharp-linux-x64@0.34.5': - resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-x64@0.35.4': + resolution: {integrity: sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [linux] libc: [glibc] - '@img/sharp-linuxmusl-arm64@0.34.5': - resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linuxmusl-arm64@0.35.4': + resolution: {integrity: sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [linux] libc: [musl] - '@img/sharp-linuxmusl-x64@0.34.5': - resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linuxmusl-x64@0.35.4': + resolution: {integrity: sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [linux] libc: [musl] - '@img/sharp-wasm32@0.34.5': - resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-wasm32@0.35.4': + resolution: {integrity: sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==} + engines: {node: '>=20.9.0'} + + '@img/sharp-webcontainers-wasm32@0.35.4': + resolution: {integrity: sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==} + engines: {node: '>=20.9.0'} cpu: [wasm32] - '@img/sharp-win32-arm64@0.34.5': - resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-win32-arm64@0.35.4': + resolution: {integrity: sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [win32] - '@img/sharp-win32-ia32@0.34.5': - resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-win32-ia32@0.35.4': + resolution: {integrity: sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==} + engines: {node: ^20.9.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.34.5': - resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-win32-x64@0.35.4': + resolution: {integrity: sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [win32] '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/gen-mapping@0.4.0-beta.0': + resolution: {integrity: sha512-JdGNkbE4GlNPYQhM0L95fBQr7ctLZJ276QXQLTad4t1oSdnnCI3fDq9DW3BqYAWv8Wc3+HS+4Gsii1oPMCfz1w==} + '@jridgewell/remapping@2.3.5': resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} @@ -865,6 +941,9 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} + '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} @@ -940,9 +1019,28 @@ packages: '@posthog/core@1.35.3': resolution: {integrity: sha512-EsGPbSLl39Jgo2KZ+kI9UAxFnh5nddaN5bNm2rXvUwF+vGmam9eN1EXeNbxhRU7ulEeIiGdm7XjoU7pzavkgIQ==} + '@posthog/core@1.55.2': + resolution: {integrity: sha512-2mYxGbDmTLUs096VbcZqSWo0lrI48/BrX65r54NynxxFq409BOx9w73HxOAtOKZ1vblkdV6/GxQTe7KDcIQidg==} + + '@posthog/mcp@0.21.0': + resolution: {integrity: sha512-LhoQm2nUsXzGWgvxL4LHq1p2qC1B/FGoWxcRtMqQmirGQTCCfBNcNhlurX0J92X1iR7ZZuM7cZfkobdnQ43hvg==} + engines: {node: ^20.20.0 || >=22.22.0} + peerDependencies: + '@modelcontextprotocol/sdk': '>=1.26.0' + '@modelcontextprotocol/server': '>=2.0.0' + posthog-node: ^5.0.0 + peerDependenciesMeta: + '@modelcontextprotocol/sdk': + optional: true + '@modelcontextprotocol/server': + optional: true + '@posthog/types@1.390.2': resolution: {integrity: sha512-WcfKz2GNn2vfDX8vXmJYbKxegPxVWHuDQ/pHdAn0HoZDXDFnEp/+x3qBQA+fEvtbPjjtjgAt2wIgJMlM7asx7g==} + '@posthog/types@1.412.4': + resolution: {integrity: sha512-Q7lV9O9TbLngjOYw1ucm3bS3tn48xb1B4ZQdDy8gv7yfKe99hCTeWYG4xZ36nJM80VxpTF9TriiJt5hngDOkBg==} + '@radix-ui/primitive@1.1.7': resolution: {integrity: sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==} @@ -1567,6 +1665,9 @@ packages: '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/gensync@1.0.5': + resolution: {integrity: sha512-MbsRCT7mTikHwKZ0X+LVUTLRrZZRLipTuXEO9qOYO+zmjMVk81axyClMROf6uoPD9MRVu46bx8zoR0Ad9q3NAg==} + '@types/jsesc@2.5.1': resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} @@ -1849,6 +1950,10 @@ packages: emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + empathic@2.1.0: + resolution: {integrity: sha512-AnfC1ATldl49/cvZdLPDjBfrRNwbDO05aibiOtzQu3qtlbJtomNLhF30HEtn/7iBz50dlMECqATo3fG0LrdEgw==} + engines: {node: '>=14'} + encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} @@ -1927,8 +2032,8 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-uri@3.1.2: - resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} + fast-uri@3.1.7: + resolution: {integrity: sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg==} fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} @@ -1947,6 +2052,10 @@ packages: resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} engines: {node: '>= 18.0.0'} + flru@1.0.2: + resolution: {integrity: sha512-kWyh8ADvHBFz6ua5xYOPnUroZTT/bwWfrCeL0Wj1dzG4/YOmOcfJ99W8dOVyyynJN35rZ9aCOtHChqQovV7yog==} + engines: {node: '>=6'} + forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -2014,11 +2123,14 @@ packages: resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - ip-address@10.2.0: - resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==} + ip-address@10.3.1: + resolution: {integrity: sha512-1e9d3kb97NHJTIJDZW9rKqW2h6+dFa50Dy0fpPSMQp2ADje5gvKsXmdiK6dwY5t76TaTt5+P5N1Y/LoToIxP6g==} engines: {node: '>= 12'} ipaddr.js@1.9.1: @@ -2203,8 +2315,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.14: - resolution: {integrity: sha512-U9kYi5bpVMEI31yC8iw4bJJp0avcHXA0W8/wNfLfnvJYzihQo2ZRPYPvpAAd570HAcCBjCTN7vnr+v4StKl1IQ==} + nanoid@3.3.18: + resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -2289,8 +2401,8 @@ packages: resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} engines: {node: '>=16.20.0'} - postcss@8.5.15: - resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} + postcss@8.5.18: + resolution: {integrity: sha512-xdB1oSLHbz1vRWgCDalrCqEFTWzFlhqFC5tIHLMOSUIjhm3XXQ1qrFy8S/ESr1JYRRXqM3c1QFiMZUJdUTqyMQ==} engines: {node: ^10 || ^12 || >=14} posthog-node@5.38.2: @@ -2405,9 +2517,14 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - sharp@0.34.5: - resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + sharp@0.35.4: + resolution: {integrity: sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==} + engines: {node: '>=20.9.0'} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} @@ -2521,8 +2638,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - undici@7.28.0: - resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} + undici@7.29.1: + resolution: {integrity: sha512-RYONW2MeafgYlkVOKYKkA/Ag7BmXqgIWCa8t1m0JcxrQg9pI9lEqRhAOruOBCbAohOa/gkCF+iPi9hrgvTzu6Q==} engines: {node: '>=20.18.1'} unenv@2.0.0-rc.24: @@ -2562,6 +2679,10 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + verkit@0.3.2: + resolution: {integrity: sha512-zj/ob3UsvJGN0whEAKFp53REA5X66hvffVqoCtVQAakJKnKlH+/PcOfMoFwIG/o4rElqLv/ycAFlx8ZlXUorCg==} + engines: {node: '>=18.12.0'} + vite-node@3.2.4: resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -2757,28 +2878,54 @@ snapshots: '@babel/helper-validator-identifier': 8.0.4 js-tokens: 10.0.0 + '@babel/code-frame@8.0.6': + dependencies: + '@babel/helper-validator-identifier': 8.0.6 + js-tokens: 10.0.0 + '@babel/compat-data@7.29.7': {} - '@babel/core@7.29.7': + '@babel/compat-data@8.0.5': {} + + '@babel/core@7.29.7(supports-color@10.2.2)': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.7 '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) '@babel/helpers': 7.29.7 '@babel/parser': 7.29.7 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@10.2.2) '@babel/types': 7.29.7 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color + '@babel/core@8.0.6': + dependencies: + '@babel/code-frame': 8.0.6 + '@babel/generator': 8.0.6 + '@babel/helper-compilation-targets': 8.0.6 + '@babel/helpers': 8.0.5 + '@babel/parser': 8.0.6 + '@babel/template': 8.0.0 + '@babel/traverse': 8.0.6 + '@babel/types': 8.0.6 + '@types/gensync': 1.0.5 + convert-source-map: 2.0.0 + empathic: 2.1.0 + gensync: 1.0.0-beta.2 + import-meta-resolve: 4.2.0 + json5: 2.2.3 + obug: 2.1.4 + verkit: 0.3.2 + '@babel/generator@7.29.7': dependencies: '@babel/parser': 7.29.7 @@ -2796,6 +2943,15 @@ snapshots: '@types/jsesc': 2.5.1 jsesc: 3.1.0 + '@babel/generator@8.0.6': + dependencies: + '@babel/parser': 8.0.6 + '@babel/types': 8.0.6 + '@jridgewell/gen-mapping': 0.4.0-beta.0 + '@jridgewell/trace-mapping': 0.3.31 + '@types/jsesc': 2.5.1 + jsesc: 3.1.0 + '@babel/helper-annotate-as-pure@8.0.0': dependencies: '@babel/types': 8.0.4 @@ -2808,13 +2964,21 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@8.0.1(@babel/core@7.29.7)': + '@babel/helper-compilation-targets@8.0.6': dependencies: - '@babel/core': 7.29.7 + '@babel/compat-data': 8.0.5 + '@babel/helper-validator-option': 8.0.0 + browserslist: 4.28.7 + flru: 1.0.2 + verkit: 0.3.2 + + '@babel/helper-create-class-features-plugin@8.0.1(@babel/core@8.0.6)': + dependencies: + '@babel/core': 8.0.6 '@babel/helper-annotate-as-pure': 8.0.0 '@babel/helper-member-expression-to-functions': 8.0.0 '@babel/helper-optimise-call-expression': 8.0.0 - '@babel/helper-replace-supers': 8.0.1(@babel/core@7.29.7) + '@babel/helper-replace-supers': 8.0.1(@babel/core@8.0.6) '@babel/helper-skip-transparent-expression-wrappers': 8.0.0 '@babel/traverse': 8.0.4 semver: 7.8.5 @@ -2823,24 +2987,26 @@ snapshots: '@babel/helper-globals@8.0.0': {} + '@babel/helper-globals@8.0.6': {} + '@babel/helper-member-expression-to-functions@8.0.0': dependencies: '@babel/traverse': 8.0.4 '@babel/types': 8.0.4 - '@babel/helper-module-imports@7.29.7': + '@babel/helper-module-imports@7.29.7(supports-color@10.2.2)': dependencies: - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@10.2.2) '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-imports': 7.29.7 + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-module-imports': 7.29.7(supports-color@10.2.2) '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@10.2.2) transitivePeerDependencies: - supports-color @@ -2850,13 +3016,13 @@ snapshots: '@babel/helper-plugin-utils@7.29.7': {} - '@babel/helper-plugin-utils@8.0.1(@babel/core@7.29.7)': + '@babel/helper-plugin-utils@8.0.1(@babel/core@8.0.6)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 8.0.6 - '@babel/helper-replace-supers@8.0.1(@babel/core@7.29.7)': + '@babel/helper-replace-supers@8.0.1(@babel/core@8.0.6)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 8.0.6 '@babel/helper-member-expression-to-functions': 8.0.0 '@babel/helper-optimise-call-expression': 8.0.0 '@babel/traverse': 8.0.4 @@ -2870,17 +3036,28 @@ snapshots: '@babel/helper-string-parser@8.0.0': {} + '@babel/helper-string-parser@8.0.6': {} + '@babel/helper-validator-identifier@7.29.7': {} '@babel/helper-validator-identifier@8.0.4': {} + '@babel/helper-validator-identifier@8.0.6': {} + '@babel/helper-validator-option@7.29.7': {} + '@babel/helper-validator-option@8.0.0': {} + '@babel/helpers@7.29.7': dependencies: '@babel/template': 7.29.7 '@babel/types': 7.29.7 + '@babel/helpers@8.0.5': + dependencies: + '@babel/template': 8.0.0 + '@babel/types': 8.0.6 + '@babel/parser@7.29.7': dependencies: '@babel/types': 7.29.7 @@ -2889,26 +3066,30 @@ snapshots: dependencies: '@babel/types': 8.0.4 - '@babel/plugin-proposal-decorators@8.0.2(@babel/core@7.29.7)': + '@babel/parser@8.0.6': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-class-features-plugin': 8.0.1(@babel/core@7.29.7) - '@babel/helper-plugin-utils': 8.0.1(@babel/core@7.29.7) - '@babel/plugin-syntax-decorators': 8.0.1(@babel/core@7.29.7) + '@babel/types': 8.0.6 - '@babel/plugin-syntax-decorators@8.0.1(@babel/core@7.29.7)': + '@babel/plugin-proposal-decorators@8.0.2(@babel/core@8.0.6)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 8.0.1(@babel/core@7.29.7) + '@babel/core': 8.0.6 + '@babel/helper-create-class-features-plugin': 8.0.1(@babel/core@8.0.6) + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.6) + '@babel/plugin-syntax-decorators': 8.0.1(@babel/core@8.0.6) - '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-syntax-decorators@8.0.1(@babel/core@8.0.6)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 8.0.6 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.6) + + '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.29.7 '@babel/runtime-corejs3@7.29.7': @@ -2925,11 +3106,11 @@ snapshots: '@babel/template@8.0.0': dependencies: - '@babel/code-frame': 8.0.0 - '@babel/parser': 8.0.4 - '@babel/types': 8.0.4 + '@babel/code-frame': 8.0.6 + '@babel/parser': 8.0.6 + '@babel/types': 8.0.6 - '@babel/traverse@7.29.7': + '@babel/traverse@7.29.7(supports-color@10.2.2)': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.7 @@ -2937,7 +3118,7 @@ snapshots: '@babel/parser': 7.29.7 '@babel/template': 7.29.7 '@babel/types': 7.29.7 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color @@ -2951,6 +3132,16 @@ snapshots: '@babel/types': 8.0.4 obug: 2.1.4 + '@babel/traverse@8.0.6': + dependencies: + '@babel/code-frame': 8.0.6 + '@babel/generator': 8.0.6 + '@babel/helper-globals': 8.0.6 + '@babel/parser': 8.0.6 + '@babel/template': 8.0.0 + '@babel/types': 8.0.6 + obug: 2.1.4 + '@babel/types@7.29.7': dependencies: '@babel/helper-string-parser': 7.29.7 @@ -2961,6 +3152,11 @@ snapshots: '@babel/helper-string-parser': 8.0.0 '@babel/helper-validator-identifier': 8.0.4 + '@babel/types@8.0.6': + dependencies: + '@babel/helper-string-parser': 8.0.6 + '@babel/helper-validator-identifier': 8.0.6 + '@cfworker/json-schema@4.1.1': {} '@cloudflare/kv-asset-handler@0.5.0': {} @@ -3000,7 +3196,7 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/runtime@1.11.1': + '@emnapi/runtime@1.11.3': dependencies: tslib: 2.8.1 optional: true @@ -3194,98 +3390,108 @@ snapshots: '@img/colour@1.1.0': {} - '@img/sharp-darwin-arm64@0.34.5': + '@img/sharp-darwin-arm64@0.35.4': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-arm64': 1.3.3 optional: true - '@img/sharp-darwin-x64@0.34.5': + '@img/sharp-darwin-x64@0.35.4': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.3.3 optional: true - '@img/sharp-libvips-darwin-arm64@1.2.4': - optional: true - - '@img/sharp-libvips-darwin-x64@1.2.4': - optional: true - - '@img/sharp-libvips-linux-arm64@1.2.4': - optional: true - - '@img/sharp-libvips-linux-arm@1.2.4': - optional: true - - '@img/sharp-libvips-linux-ppc64@1.2.4': - optional: true - - '@img/sharp-libvips-linux-riscv64@1.2.4': - optional: true - - '@img/sharp-libvips-linux-s390x@1.2.4': - optional: true - - '@img/sharp-libvips-linux-x64@1.2.4': - optional: true - - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': - optional: true - - '@img/sharp-libvips-linuxmusl-x64@1.2.4': - optional: true - - '@img/sharp-linux-arm64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.2.4 - optional: true - - '@img/sharp-linux-arm@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.2.4 - optional: true - - '@img/sharp-linux-ppc64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.2.4 - optional: true - - '@img/sharp-linux-riscv64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-riscv64': 1.2.4 - optional: true - - '@img/sharp-linux-s390x@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.2.4 - optional: true - - '@img/sharp-linux-x64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.2.4 - optional: true - - '@img/sharp-linuxmusl-arm64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 - optional: true - - '@img/sharp-linuxmusl-x64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.2.4 - optional: true - - '@img/sharp-wasm32@0.34.5': + '@img/sharp-freebsd-wasm32@0.35.4': dependencies: - '@emnapi/runtime': 1.11.1 + '@img/sharp-wasm32': 0.35.4 optional: true - '@img/sharp-win32-arm64@0.34.5': + '@img/sharp-libvips-darwin-arm64@1.3.3': optional: true - '@img/sharp-win32-ia32@0.34.5': + '@img/sharp-libvips-darwin-x64@1.3.3': optional: true - '@img/sharp-win32-x64@0.34.5': + '@img/sharp-libvips-linux-arm64@1.3.3': + optional: true + + '@img/sharp-libvips-linux-arm@1.3.3': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.3.3': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.3.3': + optional: true + + '@img/sharp-libvips-linux-s390x@1.3.3': + optional: true + + '@img/sharp-libvips-linux-x64@1.3.3': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.3.3': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.3.3': + optional: true + + '@img/sharp-linux-arm64@0.35.4': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.3.3 + optional: true + + '@img/sharp-linux-arm@0.35.4': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.3.3 + optional: true + + '@img/sharp-linux-ppc64@0.35.4': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.3.3 + optional: true + + '@img/sharp-linux-riscv64@0.35.4': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.3.3 + optional: true + + '@img/sharp-linux-s390x@0.35.4': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.3.3 + optional: true + + '@img/sharp-linux-x64@0.35.4': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.3.3 + optional: true + + '@img/sharp-linuxmusl-arm64@0.35.4': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.3.3 + optional: true + + '@img/sharp-linuxmusl-x64@0.35.4': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.3.3 + optional: true + + '@img/sharp-wasm32@0.35.4': + dependencies: + '@emnapi/runtime': 1.11.3 + optional: true + + '@img/sharp-webcontainers-wasm32@0.35.4': + dependencies: + '@img/sharp-wasm32': 0.35.4 + optional: true + + '@img/sharp-win32-arm64@0.35.4': + optional: true + + '@img/sharp-win32-ia32@0.35.4': + optional: true + + '@img/sharp-win32-x64@0.35.4': optional: true '@jridgewell/gen-mapping@0.3.13': @@ -3293,6 +3499,11 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/gen-mapping@0.4.0-beta.0': + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/remapping@2.3.5': dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -3302,10 +3513,12 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/sourcemap-codec@1.6.0': {} + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 '@jridgewell/trace-mapping@0.3.9': dependencies: @@ -3326,16 +3539,16 @@ snapshots: dependencies: zod: 4.4.3 - '@modelcontextprotocol/ext-apps@1.7.5(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.4.3))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(zod@4.4.3)': + '@modelcontextprotocol/ext-apps@1.7.5(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(supports-color@10.2.2)(zod@4.4.3))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(zod@4.4.3)': dependencies: - '@modelcontextprotocol/sdk': 1.30.0(@cfworker/json-schema@4.1.1)(zod@4.4.3) + '@modelcontextprotocol/sdk': 1.30.0(@cfworker/json-schema@4.1.1)(supports-color@10.2.2)(zod@4.4.3) '@standard-schema/spec': 1.1.0 zod: 4.4.3 optionalDependencies: react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - '@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.4.3)': + '@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(supports-color@10.2.2)(zod@4.4.3)': dependencies: '@hono/node-server': 1.19.14(hono@4.12.26) ajv: 8.20.0 @@ -3345,8 +3558,8 @@ snapshots: cross-spawn: 7.0.6 eventsource: 3.0.7 eventsource-parser: 3.1.0 - express: 5.2.1 - express-rate-limit: 8.5.2(express@5.2.1) + express: 5.2.1(supports-color@10.2.2) + express-rate-limit: 8.5.2(express@5.2.1(supports-color@10.2.2)) hono: 4.12.26 jose: 6.2.3 json-schema-typed: 8.0.2 @@ -3397,8 +3610,22 @@ snapshots: dependencies: '@posthog/types': 1.390.2 + '@posthog/core@1.55.2': + dependencies: + '@posthog/types': 1.412.4 + + '@posthog/mcp@0.21.0(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(supports-color@10.2.2)(zod@4.4.3))(@modelcontextprotocol/server@2.0.0)(posthog-node@5.38.2)': + dependencies: + '@posthog/core': 1.55.2 + posthog-node: 5.38.2 + optionalDependencies: + '@modelcontextprotocol/sdk': 1.30.0(@cfworker/json-schema@4.1.1)(supports-color@10.2.2)(zod@4.4.3) + '@modelcontextprotocol/server': 2.0.0 + '@posthog/types@1.390.2': {} + '@posthog/types@1.412.4': {} + '@radix-ui/primitive@1.1.7': {} '@radix-ui/react-arrow@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': @@ -3658,9 +3885,9 @@ snapshots: '@rolldown/binding-win32-x64-msvc@1.2.1': optional: true - '@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.7)(rolldown@1.2.1)(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))': + '@rolldown/plugin-babel@0.2.3(@babel/core@8.0.6)(@babel/runtime@7.29.7)(rolldown@1.2.1)(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 8.0.6 picomatch: 4.0.4 rolldown: 1.2.1 optionalDependencies: @@ -3861,6 +4088,8 @@ snapshots: '@types/estree@1.0.9': {} + '@types/gensync@1.0.5': {} + '@types/jsesc@2.5.1': {} '@types/react-dom@19.2.3(@types/react@19.2.17)': @@ -3874,11 +4103,11 @@ snapshots: '@vercel/oidc@3.2.0': optional: true - '@vitejs/plugin-react@4.7.0(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))': + '@vitejs/plugin-react@4.7.0(supports-color@10.2.2)(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))': dependencies: - '@babel/core': 7.29.7 - '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) + '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 @@ -3933,14 +4162,14 @@ snapshots: mime-types: 3.0.2 negotiator: 1.0.0 - agents@0.20.1(@babel/core@7.29.7)(@babel/runtime@7.29.7)(@cloudflare/workers-types@4.20260620.1)(@modelcontextprotocol/client@2.0.0)(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.4.3))(@modelcontextprotocol/server@2.0.0)(ai@6.0.208(zod@4.4.3))(react@19.2.8)(rolldown@1.2.1)(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))(zod@4.4.3): + agents@0.20.1(@babel/core@8.0.6)(@babel/runtime@7.29.7)(@cloudflare/workers-types@4.20260620.1)(@modelcontextprotocol/client@2.0.0)(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(supports-color@10.2.2)(zod@4.4.3))(@modelcontextprotocol/server@2.0.0)(ai@6.0.208(zod@4.4.3))(react@19.2.8)(rolldown@1.2.1)(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))(zod@4.4.3): dependencies: - '@babel/plugin-proposal-decorators': 8.0.2(@babel/core@7.29.7) + '@babel/plugin-proposal-decorators': 8.0.2(@babel/core@8.0.6) '@cfworker/json-schema': 4.1.1 '@modelcontextprotocol/client': 2.0.0 - '@modelcontextprotocol/sdk': 1.30.0(@cfworker/json-schema@4.1.1)(zod@4.4.3) + '@modelcontextprotocol/sdk': 1.30.0(@cfworker/json-schema@4.1.1)(supports-color@10.2.2)(zod@4.4.3) '@modelcontextprotocol/server': 2.0.0 - '@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.7)(rolldown@1.2.1)(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) + '@rolldown/plugin-babel': 0.2.3(@babel/core@8.0.6)(@babel/runtime@7.29.7)(rolldown@1.2.1)(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) cron-schedule: 6.0.0 esbuild: 0.28.1 mimetext: 3.0.28 @@ -3977,7 +4206,7 @@ snapshots: ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.2 + fast-uri: 3.1.7 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -3995,11 +4224,11 @@ snapshots: blake3-wasm@2.1.5: {} - body-parser@2.3.0: + body-parser@2.3.0(supports-color@10.2.2): dependencies: bytes: 3.1.2 content-type: 2.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) http-errors: 2.0.1 iconv-lite: 0.7.2 on-finished: 2.4.1 @@ -4102,9 +4331,11 @@ snapshots: d3-timer@3.0.1: {} - debug@4.4.3: + debug@4.4.3(supports-color@10.2.2): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 10.2.2 deep-eql@5.0.2: {} @@ -4126,6 +4357,8 @@ snapshots: emoji-regex@10.6.0: {} + empathic@2.1.0: {} + encodeurl@2.0.0: {} enhanced-resolve@5.24.4: @@ -4223,25 +4456,25 @@ snapshots: expect-type@1.3.0: {} - express-rate-limit@8.5.2(express@5.2.1): + express-rate-limit@8.5.2(express@5.2.1(supports-color@10.2.2)): dependencies: - express: 5.2.1 - ip-address: 10.2.0 + express: 5.2.1(supports-color@10.2.2) + ip-address: 10.3.1 - express@5.2.1: + express@5.2.1(supports-color@10.2.2): dependencies: accepts: 2.0.0 - body-parser: 2.3.0 + body-parser: 2.3.0(supports-color@10.2.2) content-disposition: 1.1.0 content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) depd: 2.0.0 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 2.1.1 + finalhandler: 2.1.1(supports-color@10.2.2) fresh: 2.0.0 http-errors: 2.0.1 merge-descriptors: 2.0.0 @@ -4252,9 +4485,9 @@ snapshots: proxy-addr: 2.0.7 qs: 6.15.2 range-parser: 1.2.1 - router: 2.2.0 - send: 1.2.1 - serve-static: 2.2.1 + router: 2.2.0(supports-color@10.2.2) + send: 1.2.1(supports-color@10.2.2) + serve-static: 2.2.1(supports-color@10.2.2) statuses: 2.0.2 type-is: 2.1.0 vary: 1.1.2 @@ -4263,7 +4496,7 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-uri@3.1.2: {} + fast-uri@3.1.7: {} fdir@6.5.0(picomatch@4.0.4): optionalDependencies: @@ -4273,9 +4506,9 @@ snapshots: dependencies: to-regex-range: 5.0.1 - finalhandler@2.1.1: + finalhandler@2.1.1(supports-color@10.2.2): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 @@ -4284,6 +4517,8 @@ snapshots: transitivePeerDependencies: - supports-color + flru@1.0.2: {} + forwarded@0.2.0: {} fresh@2.0.0: {} @@ -4343,9 +4578,11 @@ snapshots: dependencies: safer-buffer: 2.1.2 + import-meta-resolve@4.2.0: {} + inherits@2.0.4: {} - ip-address@10.2.0: {} + ip-address@10.3.1: {} ipaddr.js@1.9.1: {} @@ -4472,18 +4709,19 @@ snapshots: miniflare@4.20260617.1: dependencies: '@cspotcode/source-map-support': 0.8.1 - sharp: 0.34.5 - undici: 7.28.0 + sharp: 0.35.4 + undici: 7.29.1 workerd: 1.20260617.1 ws: 8.21.0 youch: 4.1.0-beta.10 transitivePeerDependencies: + - '@types/node' - bufferutil - utf-8-validate ms@2.1.3: {} - nanoid@3.3.14: {} + nanoid@3.3.18: {} nanoid@5.1.16: {} @@ -4536,9 +4774,9 @@ snapshots: pkce-challenge@5.0.1: {} - postcss@8.5.15: + postcss@8.5.18: dependencies: - nanoid: 3.3.14 + nanoid: 3.3.18 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -4654,9 +4892,9 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.62.2 fsevents: 2.3.3 - router@2.2.0: + router@2.2.0(supports-color@10.2.2): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 @@ -4672,9 +4910,9 @@ snapshots: semver@7.8.5: {} - send@1.2.1: + send@1.2.1(supports-color@10.2.2): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -4688,47 +4926,48 @@ snapshots: transitivePeerDependencies: - supports-color - serve-static@2.2.1: + serve-static@2.2.1(supports-color@10.2.2): dependencies: encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 1.2.1 + send: 1.2.1(supports-color@10.2.2) transitivePeerDependencies: - supports-color setprototypeof@1.2.0: {} - sharp@0.34.5: + sharp@0.35.4: dependencies: '@img/colour': 1.1.0 detect-libc: 2.1.2 semver: 7.8.5 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 + '@img/sharp-darwin-arm64': 0.35.4 + '@img/sharp-darwin-x64': 0.35.4 + '@img/sharp-freebsd-wasm32': 0.35.4 + '@img/sharp-libvips-darwin-arm64': 1.3.3 + '@img/sharp-libvips-darwin-x64': 1.3.3 + '@img/sharp-libvips-linux-arm': 1.3.3 + '@img/sharp-libvips-linux-arm64': 1.3.3 + '@img/sharp-libvips-linux-ppc64': 1.3.3 + '@img/sharp-libvips-linux-riscv64': 1.3.3 + '@img/sharp-libvips-linux-s390x': 1.3.3 + '@img/sharp-libvips-linux-x64': 1.3.3 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.3 + '@img/sharp-libvips-linuxmusl-x64': 1.3.3 + '@img/sharp-linux-arm': 0.35.4 + '@img/sharp-linux-arm64': 0.35.4 + '@img/sharp-linux-ppc64': 0.35.4 + '@img/sharp-linux-riscv64': 0.35.4 + '@img/sharp-linux-s390x': 0.35.4 + '@img/sharp-linux-x64': 0.35.4 + '@img/sharp-linuxmusl-arm64': 0.35.4 + '@img/sharp-linuxmusl-x64': 0.35.4 + '@img/sharp-webcontainers-wasm32': 0.35.4 + '@img/sharp-win32-arm64': 0.35.4 + '@img/sharp-win32-ia32': 0.35.4 + '@img/sharp-win32-x64': 0.35.4 shebang-command@2.0.0: dependencies: @@ -4829,7 +5068,7 @@ snapshots: typescript@5.9.3: {} - undici@7.28.0: {} + undici@7.29.1: {} unenv@2.0.0-rc.24: dependencies: @@ -4860,10 +5099,12 @@ snapshots: vary@1.1.2: {} - vite-node@3.2.4(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0): + verkit@0.3.2: {} + + vite-node@3.2.4(jiti@2.7.0)(lightningcss@1.32.0)(supports-color@10.2.2)(yaml@2.9.0): dependencies: cac: 6.7.14 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) es-module-lexer: 1.7.0 pathe: 2.0.3 vite: 6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) @@ -4893,7 +5134,7 @@ snapshots: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - postcss: 8.5.15 + postcss: 8.5.18 rollup: 4.62.2 tinyglobby: 0.2.17 optionalDependencies: @@ -4902,7 +5143,7 @@ snapshots: lightningcss: 1.32.0 yaml: 2.9.0 - vitest@3.2.6(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0): + vitest@3.2.6(jiti@2.7.0)(lightningcss@1.32.0)(supports-color@10.2.2)(yaml@2.9.0): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.6 @@ -4913,7 +5154,7 @@ snapshots: '@vitest/spy': 3.2.6 '@vitest/utils': 3.2.6 chai: 5.3.3 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) expect-type: 1.3.0 magic-string: 0.30.21 pathe: 2.0.3 @@ -4925,7 +5166,7 @@ snapshots: tinypool: 1.1.1 tinyrainbow: 2.0.0 vite: 6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) - vite-node: 3.2.4(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) + vite-node: 3.2.4(jiti@2.7.0)(lightningcss@1.32.0)(supports-color@10.2.2)(yaml@2.9.0) why-is-node-running: 2.3.0 transitivePeerDependencies: - jiti @@ -4972,6 +5213,7 @@ snapshots: '@cloudflare/workers-types': 4.20260620.1 fsevents: 2.3.3 transitivePeerDependencies: + - '@types/node' - bufferutil - utf-8-validate diff --git a/apps/mcp/pnpm-workspace.yaml b/apps/mcp/pnpm-workspace.yaml new file mode 100644 index 00000000..b74b81ab --- /dev/null +++ b/apps/mcp/pnpm-workspace.yaml @@ -0,0 +1,9 @@ +minimumReleaseAgeExclude: + - '@posthog/mcp@0.21.0' +overrides: + fast-uri: 3.1.7 + ip-address: 10.3.1 + nanoid@3: 3.3.18 + postcss: 8.5.18 + sharp: 0.35.4 + undici: 7.29.1 diff --git a/apps/mcp/src/server/analytics.test.ts b/apps/mcp/src/server/analytics.test.ts deleted file mode 100644 index ac016419..00000000 --- a/apps/mcp/src/server/analytics.test.ts +++ /dev/null @@ -1,169 +0,0 @@ -import type { McpServer, ServerContext } from "@modelcontextprotocol/server" -import { describe, expect, it, vi } from "vitest" -import { z } from "zod" -import { - createTrackedToolServer, - posthogEventForToolExecution, - type McpToolAnalytics, -} from "./analytics" - -function testServer() { - let callback: ((...args: unknown[]) => unknown) | undefined - const registerTool = vi.fn( - ( - _name: string, - _config: unknown, - handler: (...args: unknown[]) => unknown, - ) => { - callback = handler - return {} - }, - ) - - return { - server: { registerTool } as unknown as McpServer, - invoke(...args: unknown[]) { - if (!callback) throw new Error("Tool was not registered") - return callback(...args) - }, - } -} - -const context = { - mcpReq: { envelope: {} }, -} as unknown as ServerContext - -describe("MCP tool analytics", () => { - it("records sanitized completion metadata without tool content", async () => { - const harness = testServer() - const record = vi.fn() - const analytics: McpToolAnalytics = { record } - const server = createTrackedToolServer(harness.server, analytics, () => ({ - name: "claude", - version: "1.2.3", - })) - - server.registerTool( - "search_memory", - { - inputSchema: z.object({ query: z.string(), containerTag: z.string() }), - }, - async () => ({ - content: [{ type: "text" as const, text: "secret result" }], - }), - ) - - await harness.invoke( - { query: "private query", containerTag: "private-space" }, - context, - ) - - expect(record).toHaveBeenCalledOnce() - expect(record).toHaveBeenCalledWith( - expect.objectContaining({ - toolName: "search_memory", - surface: "model_tool", - outcome: "success", - spaceExplicit: true, - client: { name: "claude", version: "1.2.3" }, - }), - ) - expect(JSON.stringify(record.mock.calls[0])).not.toContain("private query") - expect(JSON.stringify(record.mock.calls[0])).not.toContain("private-space") - expect(JSON.stringify(record.mock.calls[0])).not.toContain("secret result") - }) - - it("treats returned MCP errors as failed executions", async () => { - const harness = testServer() - const record = vi.fn() - const server = createTrackedToolServer( - harness.server, - { record }, - () => null, - ) - - server.registerTool( - "save-memory", - { inputSchema: z.object({}) }, - async () => ({ - content: [{ type: "text" as const, text: "failed" }], - isError: true, - }), - ) - - await harness.invoke({}, context) - - expect(record).toHaveBeenCalledWith( - expect.objectContaining({ - surface: "app_action", - outcome: "error", - errorType: "tool_result", - }), - ) - }) - - it("records thrown error categories and preserves the rejection", async () => { - const harness = testServer() - const record = vi.fn() - const server = createTrackedToolServer( - harness.server, - { record }, - () => null, - ) - - server.registerTool( - "fetch-graph-data", - { inputSchema: z.object({}) }, - async () => { - throw new TypeError("sensitive failure") - }, - ) - - await expect(harness.invoke({}, context)).rejects.toThrow( - "sensitive failure", - ) - expect(record).toHaveBeenCalledWith( - expect.objectContaining({ - surface: "app_internal", - outcome: "error", - errorType: "TypeError", - }), - ) - expect(JSON.stringify(record.mock.calls[0])).not.toContain( - "sensitive failure", - ) - }) - - it("uses the existing user identity and company group", () => { - const event = posthogEventForToolExecution( - { - userId: "user_123", - organizationId: "org_123", - oauthClientId: "client_123", - }, - { - toolName: "guided-save", - surface: "app_launcher", - outcome: "success", - durationMs: 42, - spaceExplicit: false, - }, - ) - - expect(event).toEqual({ - distinctId: "user_123", - event: "mcp_tool_executed", - groups: { company: "org_123" }, - properties: { - app: "mcp", - tool_name: "guided-save", - outcome: "success", - duration_ms: 42, - mcp_runtime: "stateless", - mcp_surface: "app_launcher", - space_explicit: false, - oauth_client_id: "client_123", - }, - }) - }) -}) diff --git a/apps/mcp/src/server/analytics.ts b/apps/mcp/src/server/analytics.ts index aac932d1..c2b30c0b 100644 --- a/apps/mcp/src/server/analytics.ts +++ b/apps/mcp/src/server/analytics.ts @@ -1,216 +1,112 @@ -import type { McpServer, ServerContext } from "@modelcontextprotocol/server" +import type { McpServer } from "@modelcontextprotocol/server" +import { instrument, type MCPAnalyticsOptions } from "@posthog/mcp" import { PostHog } from "posthog-node" import type { ActorContext, ServerEnv } from "./types" const DEFAULT_POSTHOG_HOST = "https://us.i.posthog.com" - -export type McpToolSurface = - | "model_tool" - | "app_launcher" - | "app_action" - | "app_internal" - -export type McpToolOutcome = "success" | "error" - -export interface McpToolExecution { - toolName: string - surface: McpToolSurface - outcome: McpToolOutcome - durationMs: number - spaceExplicit: boolean - client?: { name: string; version?: string } - errorType?: string -} - -export interface McpToolAnalytics { - record(execution: McpToolExecution): void -} +const PERSONLESS_DISTINCT_ID_NAMESPACE = "supermemory-posthog-personless-v1" +const MCP_EVENT_PROPERTIES = [ + "$mcp_source", + "$mcp_server_name", + "$mcp_server_version", + "$mcp_tool_name", + "$mcp_duration_ms", + "$mcp_is_error", + "$mcp_client_name", + "$mcp_client_version", + "$mcp_protocol_version", + "$mcp_listed_tool_names", + "$mcp_conversation_id", + "$session_id", + "$groups", +] as const export type WaitUntil = (promise: Promise) => void -type ClientInfoResolver = ( - context: ServerContext, -) => { name: string; version?: string } | null - -const TOOL_SURFACES: Record = { - search_memory: "model_tool", - listDocuments: "model_tool", - getDocument: "model_tool", - listMemories: "model_tool", - listSpaces: "model_tool", - whoAmI: "model_tool", - add_memory: "model_tool", - "select-space": "app_launcher", - "memory-graph": "app_launcher", - "guided-save": "app_launcher", - "upload-file": "app_launcher", - "set-active-tag": "app_action", - "save-memory": "app_action", - "prepare-file-upload": "app_action", - "fetch-graph-data": "app_internal", +// Must match the API's personless id hashing so MCP and API events share one id. +async function personlessDistinctId(userId: string): Promise { + const input = new TextEncoder().encode( + `${PERSONLESS_DISTINCT_ID_NAMESPACE}:${userId}`, + ) + const digest = await crypto.subtle.digest("SHA-256", input) + const hash = Array.from(new Uint8Array(digest), (byte) => + byte.toString(16).padStart(2, "0"), + ).join("") + return `personless_${hash}` } -let posthogConfig: - | { - apiKey: string - host: string - client: PostHog - } - | undefined - -function posthogClient(apiKey: string, host: string): PostHog { - if (posthogConfig?.apiKey === apiKey && posthogConfig.host === host) { - return posthogConfig.client +class ImmediateMcpPostHog extends PostHog { + constructor( + apiKey: string, + host: string, + private readonly waitUntil: WaitUntil, + ) { + super(apiKey, { host }) } - const client = new PostHog(apiKey, { - host, - flushAt: 1, - flushInterval: 0, - }) - posthogConfig = { apiKey, host, client } - return client + override capture(event: Parameters[0]): void { + try { + this.waitUntil( + this.captureImmediate(event).catch((error) => + console.error("PostHog MCP tracking error:", error), + ), + ) + } catch (error) { + console.error("PostHog MCP tracking error:", error) + } + } } -export function posthogEventForToolExecution( - actor: Pick, - execution: McpToolExecution, -) { +const metadataOnlyMcpEvent: NonNullable = ( + event, +) => { + if ( + !["$mcp_tool_call", "$mcp_tools_list", "$mcp_initialize"].includes( + event.event, + ) + ) { + return null + } + return { - distinctId: actor.userId, - event: "mcp_tool_executed", - groups: { company: actor.organizationId }, + ...event, properties: { - app: "mcp", - tool_name: execution.toolName, - outcome: execution.outcome, - duration_ms: execution.durationMs, - mcp_runtime: "stateless", - mcp_surface: execution.surface, - space_explicit: execution.spaceExplicit, - ...(execution.client - ? { - mcp_client_name: execution.client.name, - ...(execution.client.version - ? { mcp_client_version: execution.client.version } - : {}), - } - : {}), - ...(actor.oauthClientId ? { oauth_client_id: actor.oauthClientId } : {}), - ...(execution.errorType ? { error_type: execution.errorType } : {}), + ...Object.fromEntries( + MCP_EVENT_PROPERTIES.filter( + (key) => event.properties[key] !== undefined, + ).map((key) => [key, event.properties[key]]), + ), + $process_person_profile: false, }, } } -export function createPosthogAnalytics( +// Stateless HTTP builds a server per request, so only the echoed conversation id groups calls. +export function instrumentPosthogMcp( + server: McpServer, env: ServerEnv, actor: ActorContext, waitUntil: WaitUntil, -): McpToolAnalytics { - const apiKey = env.POSTHOG_API_KEY - if (!apiKey) return { record: () => undefined } +): void { + if (!env.POSTHOG_API_KEY) return - const client = posthogClient(apiKey, env.POSTHOG_HOST || DEFAULT_POSTHOG_HOST) - - return { - record(execution) { - try { - const capture = client - .captureImmediate(posthogEventForToolExecution(actor, execution)) - .catch((error) => console.error("PostHog MCP tracking error:", error)) - waitUntil(capture) - } catch (error) { - console.error("PostHog MCP tracking error:", error) - } + instrument( + server, + new ImmediateMcpPostHog( + env.POSTHOG_API_KEY, + env.POSTHOG_HOST || DEFAULT_POSTHOG_HOST, + waitUntil, + ), + { + identify: async () => ({ + distinctId: await personlessDistinctId(actor.userId), + groups: { company: actor.organizationId }, + }), + context: false, + captureModel: false, + enableConversationId: true, + enableExceptionAutocapture: false, + beforeSend: metadataOnlyMcpEvent, }, - } -} - -function spaceWasExplicit(value: unknown): boolean { - if (!value || typeof value !== "object") return false - const containerTag = Reflect.get(value, "containerTag") - return typeof containerTag === "string" && containerTag.trim().length > 0 -} - -function isErrorResult(value: unknown): boolean { - return ( - !!value && - typeof value === "object" && - Reflect.get(value, "isError") === true ) } - -function thrownErrorType(error: unknown): string { - if (error instanceof Error && error.name) return error.name - if (error && typeof error === "object") { - const status = Reflect.get(error, "status") - if (typeof status === "number") return `http_${status}` - } - return "unknown" -} - -function safeRecord(analytics: McpToolAnalytics, execution: McpToolExecution) { - try { - analytics.record(execution) - } catch (error) { - console.error("MCP analytics recording error:", error) - } -} - -export function createTrackedToolServer( - server: McpServer, - analytics: McpToolAnalytics, - getClientInfo: ClientInfoResolver, -): Pick { - const registerTool = (( - name: string, - config: unknown, - handler: (...args: unknown[]) => unknown, - ) => { - const trackedHandler = async (...callbackArgs: unknown[]) => { - const startedAt = performance.now() - const input = callbackArgs.length > 1 ? callbackArgs[0] : undefined - const context = callbackArgs.at(-1) as ServerContext - - const finish = (outcome: McpToolOutcome, errorType?: string) => { - let client: ReturnType = null - try { - client = getClientInfo(context) - } catch { - // Client metadata is optional and must never affect a tool call. - } - - safeRecord(analytics, { - toolName: name, - surface: TOOL_SURFACES[name] ?? "model_tool", - outcome, - durationMs: Math.max(0, Math.round(performance.now() - startedAt)), - spaceExplicit: spaceWasExplicit(input), - ...(client ? { client } : {}), - ...(errorType ? { errorType } : {}), - }) - } - - try { - const result = await handler(...callbackArgs) - if (isErrorResult(result)) { - finish("error", "tool_result") - } else { - finish("success") - } - return result - } catch (error) { - finish("error", thrownErrorType(error)) - throw error - } - } - - return Reflect.apply(server.registerTool, server, [ - name, - config, - trackedHandler, - ]) - }) as McpServer["registerTool"] - - return { registerTool } -} diff --git a/apps/mcp/src/server/auth/rbac.test.ts b/apps/mcp/src/server/auth/rbac.test.ts index bbb0143d..b75bfb70 100644 --- a/apps/mcp/src/server/auth/rbac.test.ts +++ b/apps/mcp/src/server/auth/rbac.test.ts @@ -46,4 +46,16 @@ describe("effectiveContainerTagAccess", () => { { containerTag: "one", permission: "read" }, ]) }) + + it("treats full-scope read-only grants as read on every tag", () => { + const session: SessionInfo = { + ...baseSession, + scope: { type: "full", permission: "read" }, + } + + expect(effectiveContainerTagAccess(["one", "two"], session)).toEqual([ + { containerTag: "one", permission: "read" }, + { containerTag: "two", permission: "read" }, + ]) + }) }) diff --git a/apps/mcp/src/server/auth/rbac.ts b/apps/mcp/src/server/auth/rbac.ts index 327587a2..bc1198af 100644 --- a/apps/mcp/src/server/auth/rbac.ts +++ b/apps/mcp/src/server/auth/rbac.ts @@ -21,10 +21,12 @@ export function effectiveContainerTagAccess( permission = memberAccess.get(containerTag) ?? "read" } - if ( + if (session.scope?.permission === "read") { + permission = "read" + } else if ( session.scope?.type === "scoped" && - (session.scope.permission === "read" || - (scopedTags.size > 0 && !scopedTags.has(containerTag))) + scopedTags.size > 0 && + !scopedTags.has(containerTag) ) { permission = "read" } diff --git a/apps/mcp/src/server/container-tag.ts b/apps/mcp/src/server/container-tag.ts index 5657794a..0924e758 100644 --- a/apps/mcp/src/server/container-tag.ts +++ b/apps/mcp/src/server/container-tag.ts @@ -4,10 +4,10 @@ export const containerTagSchema = z .string() .min(1, "Container tag is required") .max(128, "Container tag exceeds maximum length") - .describe("Space key returned by listSpaces") + .describe("Space key returned by list_spaces") export const optionalContainerTagSchema = containerTagSchema .optional() .describe( - "Space key to use for this call. If the user names a space, call listSpaces to resolve its key and pass it here. If no space is named, omit this field so the server uses the active space or account default.", + "Space key to use for this call. If the user names a space, call list_spaces to resolve its key and pass it here. If no space is named, omit this field so the server uses the active space or account default.", ) diff --git a/apps/mcp/src/server/format.ts b/apps/mcp/src/server/format.ts index c9bb3f11..b4dd07a5 100644 --- a/apps/mcp/src/server/format.ts +++ b/apps/mcp/src/server/format.ts @@ -60,12 +60,12 @@ export function formatDocumentsList(response: DocumentsListResponse): string { "", blocks.join("\n\n"), "", - "Use getDocument with a document ID to read its content.", + "Use get_document with a document ID to read its content.", ] if (pagination.currentPage < pagination.totalPages) { parts.push( - `More available - call listDocuments with page: ${pagination.currentPage + 1}.`, + `More available - call list_documents with page: ${pagination.currentPage + 1}.`, ) } @@ -121,7 +121,7 @@ export function formatMemoryEntriesList( if (pagination.currentPage < pagination.totalPages) { parts.push( "", - `More available - call listMemories with page: ${pagination.currentPage + 1}.`, + `More available - call list_memories with page: ${pagination.currentPage + 1}.`, ) } diff --git a/apps/mcp/src/server/resources/profile.ts b/apps/mcp/src/server/resources/profile.ts index afcac032..b203ae1b 100644 --- a/apps/mcp/src/server/resources/profile.ts +++ b/apps/mcp/src/server/resources/profile.ts @@ -65,7 +65,7 @@ export function registerProfileResource( parts.push( "", - "Other spaces are available. Use `listSpaces` to find the relevant space key, then use that key with space-aware tools when the user asks about another space. Keep space contexts separate unless the user asks to combine them.", + "Other spaces are available. Use `list_spaces` to find the relevant space key, then use that key with space-aware tools when the user asks about another space. Keep space contexts separate unless the user asks to combine them.", ) return { diff --git a/apps/mcp/src/server/server.ts b/apps/mcp/src/server/server.ts index 432bddd3..8c0857ed 100644 --- a/apps/mcp/src/server/server.ts +++ b/apps/mcp/src/server/server.ts @@ -3,11 +3,7 @@ import { McpServer, type ServerContext, } from "@modelcontextprotocol/server" -import { - createPosthogAnalytics, - createTrackedToolServer, - type WaitUntil, -} from "./analytics" +import { instrumentPosthogMcp, type WaitUntil } from "./analytics" import { fetchSession } from "./auth" import { DEFAULT_PROJECT_ID, SupermemoryClient } from "./client" import { registerContextPrompt } from "./prompts/context" @@ -26,7 +22,7 @@ import { uploadStateName } from "./space-state" const DEFAULT_API_URL = "https://api.supermemory.ai" const UPLOAD_SESSION_TTL_MS = 2 * 60 * 1000 const SERVER_INSTRUCTIONS = - "Supermemory is the authenticated user's persistent memory and knowledge layer across conversations and spaces. Use these tools whenever the user wants to recall something they may have saved, inspect stored sources or extracted memories, remember or upload new information, check their Supermemory account or access, change their active space, or explore their memory graph, even if they do not mention Supermemory by name. Use the active or account-default space when none is named. Resolve a named space with listSpaces and pass its key to the relevant tool; change the active space only when the user explicitly asks." + "Supermemory is the authenticated user's persistent memory and knowledge layer across conversations and spaces. Use these tools whenever the user wants to recall something they may have saved, inspect stored sources or extracted memories, remember or upload new information, check their Supermemory account or access, change their active space, or explore their memory graph, even if they do not mention Supermemory by name. Use the active or account-default space when none is named. Resolve a named space with list_spaces and pass its key to the relevant tool; change the active space only when the user explicitly asks." type ClientInfo = { name: string; version?: string } @@ -59,6 +55,7 @@ export function createSupermemoryServer( }, { instructions: SERVER_INSTRUCTIONS }, ) + instrumentPosthogMcp(server, env, actor, waitUntil) const apiUrl = env.API_URL || DEFAULT_API_URL const spaceState = env.SPACE_STATE.getByName(spaceStateName(actor)) @@ -88,15 +85,8 @@ export function createSupermemoryServer( expiresAt, } } - const analytics = createPosthogAnalytics(env, actor, waitUntil) - const toolServer = createTrackedToolServer( - server, - analytics, - clientInfoFromContext, - ) - registerAllTools({ - server: toolServer, + server, actor, getClient, getSession: () => fetchSession(actor.bearerToken, apiUrl), diff --git a/apps/mcp/src/server/space.test.ts b/apps/mcp/src/server/space.test.ts index e9034b16..0af5dfde 100644 --- a/apps/mcp/src/server/space.test.ts +++ b/apps/mcp/src/server/space.test.ts @@ -39,7 +39,7 @@ describe("space application state", () => { expect(optionalContainerTagSchema.description).toContain( "If the user names a space", ) - expect(optionalContainerTagSchema.description).toContain("listSpaces") + expect(optionalContainerTagSchema.description).toContain("list_spaces") expect(optionalContainerTagSchema.description).toContain("active space") }) }) diff --git a/apps/mcp/src/server/tools/get-document.ts b/apps/mcp/src/server/tools/get-document.ts index 0db8c898..b6ebed04 100644 --- a/apps/mcp/src/server/tools/get-document.ts +++ b/apps/mcp/src/server/tools/get-document.ts @@ -13,15 +13,15 @@ export function register(deps: ToolDeps) { .string() .min(1, "Document ID is required") .max(255, "Document ID exceeds maximum length") - .describe("Document ID returned by listDocuments or a memory result"), + .describe("Document ID returned by list_documents or a memory result"), }) deps.server.registerTool( - "getDocument", + "get_document", { title: "Get Document", description: - "Read one stored document by ID from any space you can access, including its summary and available content. Use listDocuments to discover document IDs.", + "Read one stored document by ID from any space you can access, including its summary and available content. Use list_documents to discover document IDs.", inputSchema, outputSchema: getDocumentOutputSchema, annotations: READ_ONLY_TOOL_ANNOTATIONS, diff --git a/apps/mcp/src/server/tools/get-profile.ts b/apps/mcp/src/server/tools/get-profile.ts new file mode 100644 index 00000000..70b7b437 --- /dev/null +++ b/apps/mcp/src/server/tools/get-profile.ts @@ -0,0 +1,63 @@ +import { z } from "zod" +import { optionalContainerTagSchema } from "../container-tag" +import { formatFactSection } from "../space-presentation" +import { READ_ONLY_TOOL_ANNOTATIONS } from "./annotations" +import { getProfileOutputSchema, type GetProfileOutput } from "./output-schemas" +import { textContent, type ToolDeps } from "./types" + +export function register(deps: ToolDeps) { + const inputSchema = z.object({ + containerTag: optionalContainerTagSchema, + }) + + deps.server.registerTool( + "get_profile", + { + title: "Get Profile", + description: + "Get the stable and recent profile for one space — long-lived facts plus recent context. search_memory does not include this. After searching, call this if matching memories are not enough and you need who-the-user-is, preferences, or recent context. When the user names a space, resolve it with list_spaces and pass containerTag; otherwise use the active space. Use who_am_i for account identity and access, not profile facts.", + inputSchema, + outputSchema: getProfileOutputSchema, + annotations: READ_ONLY_TOOL_ANNOTATIONS, + }, + async (args) => { + try { + const effectiveTag = await deps.resolveContainerTag(args.containerTag) + const profileResult = await deps.getClient(effectiveTag).getProfile() + const profile = { + static: profileResult.profile.static, + dynamic: profileResult.profile.dynamic, + } + + const parts = [ + ...formatFactSection( + "Stable Context", + profile.static, + profile.static.length, + ), + ...formatFactSection( + "Recent Context", + profile.dynamic, + profile.dynamic.length, + ), + ] + + if (parts.length === 0) { + parts.push("No profile facts are available for this space yet.") + } + + const structuredContent: GetProfileOutput = { + containerTag: effectiveTag, + profile, + } + + return { + content: [textContent(parts.join("\n"))], + structuredContent, + } + } catch (error) { + return deps.errorResult(error) + } + }, + ) +} diff --git a/apps/mcp/src/server/tools/index.ts b/apps/mcp/src/server/tools/index.ts index 6effe28d..232c3932 100644 --- a/apps/mcp/src/server/tools/index.ts +++ b/apps/mcp/src/server/tools/index.ts @@ -1,6 +1,7 @@ import * as addMemory from "./add-memory" import * as fetchGraphData from "./fetch-graph-data" import * as getDocument from "./get-document" +import * as getProfile from "./get-profile" import * as guidedSave from "./guided-save" import * as listContainerTags from "./list-container-tags" import * as listDocuments from "./list-documents" @@ -17,6 +18,7 @@ import * as whoAmI from "./who-am-i" export function registerAllTools(deps: ToolDeps) { searchMemory.register(deps) + getProfile.register(deps) listDocuments.register(deps) getDocument.register(deps) listMemories.register(deps) diff --git a/apps/mcp/src/server/tools/list-container-tags.ts b/apps/mcp/src/server/tools/list-container-tags.ts index 8f9aeb27..30bf2c89 100644 --- a/apps/mcp/src/server/tools/list-container-tags.ts +++ b/apps/mcp/src/server/tools/list-container-tags.ts @@ -5,7 +5,7 @@ import { textContent, type ToolDeps } from "./types" export function register(deps: ToolDeps) { deps.server.registerTool( - "listSpaces", + "list_spaces", { description: "List the spaces available to the user. Returns each space's name, key, emoji, document/memory counts, and last activity. Use this first to resolve a named space before calling a space-aware tool, or when the user asks which space may contain something. The list is auto-filtered to spaces the user can access.", diff --git a/apps/mcp/src/server/tools/list-documents.ts b/apps/mcp/src/server/tools/list-documents.ts index 20f8b59b..10285793 100644 --- a/apps/mcp/src/server/tools/list-documents.ts +++ b/apps/mcp/src/server/tools/list-documents.ts @@ -29,11 +29,11 @@ export function register(deps: ToolDeps) { }) deps.server.registerTool( - "listDocuments", + "list_documents", { title: "List Documents", description: - "List documents in one space with their IDs, titles, types, processing status, dates, and summaries. This does not return full document content; use getDocument with an ID from this result to read one document. When the user names a space, resolve it with listSpaces and pass containerTag; otherwise use the active space.", + "List documents in one space with their IDs, titles, types, processing status, dates, and summaries. This does not return full document content; use get_document with an ID from this result to read one document. When the user names a space, resolve it with list_spaces and pass containerTag; otherwise use the active space.", inputSchema, outputSchema: listDocumentsOutputSchema, annotations: READ_ONLY_TOOL_ANNOTATIONS, diff --git a/apps/mcp/src/server/tools/list-memories.ts b/apps/mcp/src/server/tools/list-memories.ts index 37c36b07..79ccee16 100644 --- a/apps/mcp/src/server/tools/list-memories.ts +++ b/apps/mcp/src/server/tools/list-memories.ts @@ -29,11 +29,11 @@ export function register(deps: ToolDeps) { }) deps.server.registerTool( - "listMemories", + "list_memories", { title: "List Memories", description: - "List the latest extracted memory entries in one space, including stable memory IDs, version information, and source document IDs. This lists memories directly, not documents. When the user names a space, resolve it with listSpaces and pass containerTag; otherwise use the active space. Use search_memory instead for semantic recall.", + "List the latest extracted memory entries in one space, including stable memory IDs, version information, and source document IDs. This lists memories directly, not documents. When the user names a space, resolve it with list_spaces and pass containerTag; otherwise use the active space. Use search_memory instead for semantic recall.", inputSchema, outputSchema: listMemoriesOutputSchema, annotations: READ_ONLY_TOOL_ANNOTATIONS, diff --git a/apps/mcp/src/server/tools/memory-graph.ts b/apps/mcp/src/server/tools/memory-graph.ts index 173c0ed3..3a5385ce 100644 --- a/apps/mcp/src/server/tools/memory-graph.ts +++ b/apps/mcp/src/server/tools/memory-graph.ts @@ -15,7 +15,7 @@ export function register(deps: ToolDeps) { { title: "Memory Graph", description: - "Render a space's memory graph directly as an interactive MCP App. This tool is the final visualization; do not create another graph, file, or artifact unless the user explicitly asks for one. If the user names a space, call listSpaces to resolve its key and pass it as containerTag. If the user does not name a space, call this tool directly and omit containerTag; the server uses the active space or account default. Do not open the space picker unless the user asks to change their active space.", + "Render a space's memory graph directly as an interactive MCP App. This tool is the final visualization; do not create another graph, file, or artifact unless the user explicitly asks for one. If the user names a space, call list_spaces to resolve its key and pass it as containerTag. If the user does not name a space, call this tool directly and omit containerTag; the server uses the active space or account default. Do not open the space picker unless the user asks to change their active space.", inputSchema, outputSchema: graphViewSchema, annotations: READ_ONLY_TOOL_ANNOTATIONS, diff --git a/apps/mcp/src/server/tools/output-schemas.ts b/apps/mcp/src/server/tools/output-schemas.ts index 2ea8bb3b..8f10d65a 100644 --- a/apps/mcp/src/server/tools/output-schemas.ts +++ b/apps/mcp/src/server/tools/output-schemas.ts @@ -107,6 +107,16 @@ export const searchMemoryOutputSchema = z.object({ export type SearchMemoryOutput = z.infer +export const getProfileOutputSchema = z.object({ + containerTag: z.string(), + profile: z.object({ + static: z.array(z.string()), + dynamic: z.array(z.string()), + }), +}) + +export type GetProfileOutput = z.infer + export const whoAmIOutputSchema = z.object({ userId: z.string(), email: z.string().optional(), diff --git a/apps/mcp/src/server/tools/search-memory.ts b/apps/mcp/src/server/tools/search-memory.ts index f4bfbc63..9818cb20 100644 --- a/apps/mcp/src/server/tools/search-memory.ts +++ b/apps/mcp/src/server/tools/search-memory.ts @@ -14,7 +14,6 @@ export function register(deps: ToolDeps) { .string() .max(1000, "Query exceeds maximum length") .describe("The search query to find relevant memories"), - includeProfile: z.boolean().optional().default(true), containerTag: optionalContainerTagSchema, }) @@ -22,7 +21,7 @@ export function register(deps: ToolDeps) { "search_memory", { description: - "Search memories in one space with a natural-language query. Returns relevant memories plus that space's profile summary. When the user names a space, resolve it with listSpaces and pass containerTag; otherwise use the active space.", + "Search memories in one space with a natural-language query. Returns matching memories only — not the space profile. If you need who-the-user-is, preferences, or recent context after searching, call get_profile. When the user names a space, resolve it with list_spaces and pass containerTag; otherwise use the active space.", inputSchema, outputSchema: searchMemoryOutputSchema, annotations: READ_ONLY_TOOL_ANNOTATIONS, @@ -32,28 +31,6 @@ export function register(deps: ToolDeps) { const effectiveTag = await deps.resolveContainerTag(args.containerTag) const client = deps.getClient(effectiveTag) - const parts: string[] = [] - let profile: SearchMemoryOutput["profile"] - - if (args.includeProfile !== false) { - const profileResult = await client.getProfile(args.query) - profile = profileResult.profile - - if (profileResult.profile.static.length > 0) { - parts.push("## Profile") - for (const fact of profileResult.profile.static) { - parts.push(`- ${fact}`) - } - } - - if (profileResult.profile.dynamic.length > 0) { - parts.push("\n## Recent context") - for (const fact of profileResult.profile.dynamic) { - parts.push(`- ${fact}`) - } - } - } - const searchResult = await client.search(args.query) const results = searchResult.results.map((result) => ({ id: result.id, @@ -62,21 +39,21 @@ export function register(deps: ToolDeps) { ...(result.title ? { title: result.title } : {}), })) + const parts: string[] = [] if (searchResult.results.length > 0) { - parts.push("\n## Matching memories") + parts.push("## Matching memories") for (const result of searchResult.results) { const text = getMemoryText(result) const similarity = (result.similarity * 100).toFixed(0) parts.push(`- [${similarity}%] ${text}`) } } else { - parts.push("\nNo matching memories found.") + parts.push("No matching memories found.") } const structuredContent: SearchMemoryOutput = { query: args.query, containerTag: effectiveTag, - ...(profile ? { profile } : {}), results, total: searchResult.total, timing: searchResult.timing, diff --git a/apps/mcp/src/server/tools/select-space.ts b/apps/mcp/src/server/tools/select-space.ts index 0eadeb3b..c25f2ce3 100644 --- a/apps/mcp/src/server/tools/select-space.ts +++ b/apps/mcp/src/server/tools/select-space.ts @@ -11,7 +11,7 @@ export function register(deps: ToolDeps) { { title: "Select Space", description: - "Open an interactive picker to choose or change the active Supermemory space used for future actions. Use this only when the user asks to switch, select, or change their active or default space. Do not use it merely because the user names a space for a search, list, graph, save, or upload; resolve that space with listSpaces and pass containerTag to the relevant tool instead.", + "Open an interactive picker to choose or change the active Supermemory space used for future actions. Use this only when the user asks to switch, select, or change their active or default space. Do not use it merely because the user names a space for a search, list, graph, save, or upload; resolve that space with list_spaces and pass containerTag to the relevant tool instead.", inputSchema: z.object({}), outputSchema: pickerViewSchema, _meta: appToolMeta(), diff --git a/apps/mcp/src/server/tools/who-am-i.ts b/apps/mcp/src/server/tools/who-am-i.ts index 83d33040..af570b7e 100644 --- a/apps/mcp/src/server/tools/who-am-i.ts +++ b/apps/mcp/src/server/tools/who-am-i.ts @@ -5,10 +5,10 @@ import { textContent, type ToolDeps } from "./types" export function register(deps: ToolDeps) { deps.server.registerTool( - "whoAmI", + "who_am_i", { description: - "Get the current Supermemory account context, including user identity, role, access type, permissions, scope, and active space. Use this when the user asks who they are, what access they have, or which space is currently active. Use listSpaces instead when the user asks which spaces are available.", + "Get the current Supermemory account context, including user identity, role, access type, permissions, scope, and active space. Use this when the user asks who they are, what access they have, or which space is currently active. Use list_spaces instead when the user asks which spaces are available.", inputSchema: z.object({}), outputSchema: whoAmIOutputSchema, annotations: READ_ONLY_TOOL_ANNOTATIONS, diff --git a/apps/mcp/src/widget/design/tokens.css b/apps/mcp/src/widget/design/tokens.css index 0b1a1df4..e139230a 100644 --- a/apps/mcp/src/widget/design/tokens.css +++ b/apps/mcp/src/widget/design/tokens.css @@ -196,6 +196,7 @@ --graph-text-primary: #171717; --graph-text-secondary: #5f5f5f; --graph-text-muted: #737373; + --graph-edge-document: #d9d9d4; --graph-edge-derives: #b8b8b3; --graph-edge-updates: #2e6fe6; --graph-edge-extends: #0e9488; @@ -298,6 +299,7 @@ --graph-text-primary: #eef2f7; --graph-text-secondary: #a9b4c2; --graph-text-muted: #6f7d8f; + --graph-edge-document: #2b3a4e; --graph-edge-derives: #5b6675; --graph-edge-updates: #4ba0fa; --graph-edge-extends: #2dd4bf; @@ -400,6 +402,7 @@ --graph-text-primary: #eef2f7; --graph-text-secondary: #a9b4c2; --graph-text-muted: #6f7d8f; + --graph-edge-document: #2b3a4e; --graph-edge-derives: #5b6675; --graph-edge-updates: #4ba0fa; --graph-edge-extends: #2dd4bf; diff --git a/apps/mcp/src/widget/views/Graph.tsx b/apps/mcp/src/widget/views/Graph.tsx index 1c9631be..5c74f501 100644 --- a/apps/mcp/src/widget/views/Graph.tsx +++ b/apps/mcp/src/widget/views/Graph.tsx @@ -15,10 +15,7 @@ import { useApp } from "../hooks/useApp" import { useHostContext } from "../hooks/useHostContext" import { ArrowsIn, ArrowsOut } from "../lib/icons" -// GraphThemeColors key → the --graph-* CSS variable it resolves from. Same -// mapping as the package's internal useGraphTheme, but we drive it ourselves -// so we can re-read at a reliable time (see useGraphColors). -const GRAPH_VARS: Record = { +const GRAPH_VARS = { bg: "--graph-bg", docFill: "--graph-doc-fill", docStroke: "--graph-doc-stroke", @@ -30,6 +27,7 @@ const GRAPH_VARS: Record = { textPrimary: "--graph-text-primary", textSecondary: "--graph-text-secondary", textMuted: "--graph-text-muted", + edgeDocument: "--graph-edge-document", edgeDerives: "--graph-edge-derives", edgeUpdates: "--graph-edge-updates", edgeExtends: "--graph-edge-extends", @@ -45,23 +43,18 @@ const GRAPH_VARS: Record = { popoverTextMuted: "--graph-popover-text-muted", controlBg: "--graph-control-bg", controlBorder: "--graph-control-border", -} +} satisfies Record, string> function readGraphColors(): GraphThemeColors { const s = getComputedStyle(document.documentElement) const out = {} as GraphThemeColors - for (const key of Object.keys(GRAPH_VARS) as (keyof GraphThemeColors)[]) { + for (const key of Object.keys(GRAPH_VARS) as (keyof typeof GRAPH_VARS)[]) { out[key] = s.getPropertyValue(GRAPH_VARS[key]).trim() || DEFAULT_COLORS[key] } return out } -// Read the graph palette from CSS, and re-read whenever the document theme -// flips. We can't rely on the package's own useGraphTheme (it watches `class`), -// nor on the `theme` prop alone: the host themes via `data-theme`, and in -// standalone/Studio the attribute can change without the prop changing. So we -// observe `data-theme`/`class` on directly and re-read after the next -// paint (rAF), by which point the --graph-* values are current. +// Host themes can update CSS variables after render, so re-read after theme mutations. function useGraphColors(theme: string): GraphThemeColors { const [colors, setColors] = useState(readGraphColors) useEffect(() => { diff --git a/apps/raycast-extension/package-lock.json b/apps/raycast-extension/package-lock.json index 323af290..a0407d53 100644 --- a/apps/raycast-extension/package-lock.json +++ b/apps/raycast-extension/package-lock.json @@ -480,9 +480,9 @@ } }, "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -491,9 +491,9 @@ } }, "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.4.tgz", + "integrity": "sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==", "dev": true, "license": "ISC", "dependencies": { @@ -551,9 +551,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -575,9 +575,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.4.tgz", + "integrity": "sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==", "dev": true, "license": "ISC", "dependencies": { @@ -1606,9 +1606,9 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -1970,9 +1970,9 @@ } }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -1994,9 +1994,9 @@ } }, "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.4.tgz", + "integrity": "sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==", "dev": true, "license": "ISC", "dependencies": { @@ -2178,9 +2178,9 @@ } }, "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.8.tgz", + "integrity": "sha512-7RN35vit8DeBclkofOVmBY0eDAZZQd1HzmukRdSyz95CRh8FT54eqnbj0krQr3mrHR6sfRyYkyhwBWjoV5uqlQ==", "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -2234,9 +2234,9 @@ } }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, @@ -2447,10 +2447,20 @@ } }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -2564,12 +2574,12 @@ } }, "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -2697,9 +2707,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -2961,9 +2971,9 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", "engines": { "node": ">=12" diff --git a/bun.lock b/bun.lock index 18d25f0d..90980bb4 100644 --- a/bun.lock +++ b/bun.lock @@ -57,7 +57,7 @@ }, "devDependencies": { "@types/bun": "latest", - "mintlify": "^4.2.112", + "mintlify": "4.2.933", "typescript": "^5.9.2", }, }, @@ -71,6 +71,7 @@ "@modelcontextprotocol/sdk": "1.30.0", "@modelcontextprotocol/server": "2.0.0", "@phosphor-icons/react": "^2.1.10", + "@posthog/mcp": "0.21.0", "@radix-ui/react-popover": "^1.1.15", "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-tooltip": "^1.2.7", @@ -221,7 +222,7 @@ }, "packages/memory-graph": { "name": "@supermemory/memory-graph", - "version": "0.2.3", + "version": "0.2.4", "dependencies": { "d3-force": "^3.0.0", }, @@ -384,6 +385,24 @@ "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], + "@anthropic-ai/claude-agent-sdk": ["@anthropic-ai/claude-agent-sdk@0.3.241", "", { "optionalDependencies": { "@anthropic-ai/claude-agent-sdk-darwin-arm64": "0.3.241", "@anthropic-ai/claude-agent-sdk-darwin-x64": "0.3.241", "@anthropic-ai/claude-agent-sdk-linux-arm64": "0.3.241", "@anthropic-ai/claude-agent-sdk-linux-arm64-musl": "0.3.241", "@anthropic-ai/claude-agent-sdk-linux-x64": "0.3.241", "@anthropic-ai/claude-agent-sdk-linux-x64-musl": "0.3.241", "@anthropic-ai/claude-agent-sdk-win32-arm64": "0.3.241", "@anthropic-ai/claude-agent-sdk-win32-x64": "0.3.241" }, "peerDependencies": { "@anthropic-ai/sdk": ">=0.93.0", "@modelcontextprotocol/sdk": "^1.29.0", "zod": "^4.0.0" } }, "sha512-pIHdCSTywFe30H0oWDCKZzC4ipBLtF5YMDRKjf6PHyARg57O4l/72v3b6QKnnefwtKKMe6uWJ1Y9lUJg/sKWyA=="], + + "@anthropic-ai/claude-agent-sdk-darwin-arm64": ["@anthropic-ai/claude-agent-sdk-darwin-arm64@0.3.241", "", { "os": "darwin", "cpu": "arm64" }, "sha512-v26ta54lKFMFEZzbOE+6p3YhKERWnDiEA6OmkSAg+3fAQHOa1+aLTKw222cfgzxgiVixwFtHMk8c63zsDd8aXQ=="], + + "@anthropic-ai/claude-agent-sdk-darwin-x64": ["@anthropic-ai/claude-agent-sdk-darwin-x64@0.3.241", "", { "os": "darwin", "cpu": "x64" }, "sha512-5jweT0vft1ZCaGSoxZHF9vJlHbx8Yxx4+x5aHAIXTd4lx7ZbT4o5buEF8kpmTeHUB+Fw9jtFIm4QDsRiBXgf+Q=="], + + "@anthropic-ai/claude-agent-sdk-linux-arm64": ["@anthropic-ai/claude-agent-sdk-linux-arm64@0.3.241", "", { "os": "linux", "cpu": "arm64" }, "sha512-SxszQGffXiLzMEnAv+pJXEmQbA8haijKyRjjH/jOt1CLeMIfpjKcO9WQDv8dEA8nREWS3zJ103zjgecAF7oOQQ=="], + + "@anthropic-ai/claude-agent-sdk-linux-arm64-musl": ["@anthropic-ai/claude-agent-sdk-linux-arm64-musl@0.3.241", "", { "os": "linux", "cpu": "arm64" }, "sha512-GslvPvSzehfCZyzOaJAt4lgodznm5zpl/LMXN8ygD12z5qnpM+I9/eFnmAaISJ0L8/vyohtlAP1jjaeR2jz1AQ=="], + + "@anthropic-ai/claude-agent-sdk-linux-x64": ["@anthropic-ai/claude-agent-sdk-linux-x64@0.3.241", "", { "os": "linux", "cpu": "x64" }, "sha512-gJRa922Qcm7loumHcXMDFEFg//tz1aOi7Nx0sQa9I9lC1JSN8yL6i7/idzOU5Hp193tEDFOgqIMFL/yRiXg+rw=="], + + "@anthropic-ai/claude-agent-sdk-linux-x64-musl": ["@anthropic-ai/claude-agent-sdk-linux-x64-musl@0.3.241", "", { "os": "linux", "cpu": "x64" }, "sha512-kZigJ5Ug2I2G/n7Cunmwy4TGr0lOGnWrz6TkzyWiDcUmJOodoTH6GZECNarWAtETfN03AAeLfrpiz8z3hOEDqA=="], + + "@anthropic-ai/claude-agent-sdk-win32-arm64": ["@anthropic-ai/claude-agent-sdk-win32-arm64@0.3.241", "", { "os": "win32", "cpu": "arm64" }, "sha512-/3yA9jQuCvHDVlILzhtslH6kFYOvydXyMZiKwnzqM8ZfvFTNO41w8TpiFpBLseyM+4A4E8QMeTKu3L01Xyb5IQ=="], + + "@anthropic-ai/claude-agent-sdk-win32-x64": ["@anthropic-ai/claude-agent-sdk-win32-x64@0.3.241", "", { "os": "win32", "cpu": "x64" }, "sha512-cHYdAgORl9kynujMeYXyV1uj/hbmsBjRw9dRVkIW4/4sF7S6L4u/qDSzn1/wiNP7g2yWSJ4KbsvHDH2WWDnCBQ=="], + "@anthropic-ai/sdk": ["@anthropic-ai/sdk@0.55.1", "", { "bin": { "anthropic-ai-sdk": "bin/cli" } }, "sha512-gjOMS4chmm8BxClKmCjNHmvf1FrO1Cn++CSX6K3YCZjz5JG4I9ZttQ/xEH4FBsz6HQyZvnUpiKlOAkmxaGmEaQ=="], "@anycable/core": ["@anycable/core@0.9.2", "", { "dependencies": { "nanoevents": "^7.0.1" } }, "sha512-x5ZXDcW/N4cxWl93CnbHs/u7qq4793jS2kNPWm+duPrXlrva+ml2ZGT7X9tuOBKzyIHf60zWCdIK7TUgMPAwXA=="], @@ -578,6 +597,10 @@ "@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + "@base-ui/react": ["@base-ui/react@1.8.0", "", { "dependencies": { "@babel/runtime": "^7.29.7", "@base-ui/utils": "0.4.0", "@floating-ui/react-dom": "^2.1.9", "@floating-ui/utils": "^0.2.12", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "@date-fns/tz": "^1.2.0", "@types/react": "^17 || ^18 || ^19", "date-fns": "^4.0.0", "react": "^17 || ^18 || ^19", "react-dom": "^17 || ^18 || ^19" }, "optionalPeers": ["@date-fns/tz", "@types/react", "date-fns"] }, "sha512-P0/1sxo6SBVZOklKMIedvTWqw2s2IQzi9x5bIVsXu980cuSOD4NeuRSs+/L7LZQfDkZP/uRZyGPyfFl/B1oH+Q=="], + + "@base-ui/utils": ["@base-ui/utils@0.4.0", "", { "dependencies": { "@babel/runtime": "^7.29.7", "@floating-ui/utils": "^0.2.12", "reselect": "^5.2.0", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "@types/react": "^17 || ^18 || ^19", "react": "^17 || ^18 || ^19", "react-dom": "^17 || ^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-bO9fz25kKtPf+aZVyfQrC0PDmJdmVni31W2hCS5/Owb+inwdIL3XU26pCPRPlt4LSxZrBgLwubXQXQlKaFEZzw=="], + "@better-auth/core": ["@better-auth/core@1.5.3", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "zod": "^4.3.6" }, "peerDependencies": { "@better-auth/utils": "0.3.1", "@better-fetch/fetch": "1.1.21", "@cloudflare/workers-types": ">=4", "better-call": "1.3.2", "jose": "^6.1.0", "kysely": "^0.28.5", "nanostores": "^1.0.1" }, "optionalPeers": ["@cloudflare/workers-types"] }, "sha512-fORsQjNZ6BQ7o96xMe7elz3Y4Y8DsqXmQrdyzt289G9rmzX4auwBCPTtE2cXTRTYGiVvH9bv0b97t1Uo/OWynQ=="], "@better-auth/kysely-adapter": ["@better-auth/kysely-adapter@1.5.3", "", { "peerDependencies": { "@better-auth/core": "1.5.3", "@better-auth/utils": "^0.3.0", "kysely": "^0.27.0 || ^0.28.0" } }, "sha512-eAm1KPrlPXkH/qXUXnGBcHPDgCX153b6BSlc2QJ2IeqmiWym9D/6XORqBIZOl71JiP0Cifzocr2GLpnz0gt31Q=="], @@ -828,6 +851,8 @@ "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], + "@isaacs/ttlcache": ["@isaacs/ttlcache@2.1.4", "", {}, "sha512-7kMz0BJpMvgAMkyglums7B2vtrn5g0a0am77JY0GjkZZNetOBCFn7AG7gKCwT0QPiXyxW7YIQSgtARknUEOcxQ=="], "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], @@ -866,25 +891,25 @@ "@mdx-js/react": ["@mdx-js/react@3.1.1", "", { "dependencies": { "@types/mdx": "^2.0.0" }, "peerDependencies": { "@types/react": ">=16", "react": ">=16" } }, "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw=="], - "@mintlify/cli": ["@mintlify/cli@4.0.1010", "", { "dependencies": { "@inquirer/prompts": "7.9.0", "@mintlify/common": "1.0.778", "@mintlify/link-rot": "3.0.945", "@mintlify/models": "0.0.283", "@mintlify/prebuild": "1.0.916", "@mintlify/previewing": "4.0.974", "@mintlify/scraping": "4.0.640", "@mintlify/validation": "0.1.625", "adm-zip": "0.5.16", "chalk": "5.2.0", "color": "4.2.3", "detect-port": "1.5.1", "front-matter": "4.0.2", "fs-extra": "11.2.0", "ink": "6.3.0", "inquirer": "12.3.0", "js-yaml": "4.1.0", "mdast-util-mdx-jsx": "3.2.0", "react": "19.2.3", "semver": "7.7.2", "unist-util-visit": "5.0.0", "yargs": "17.7.1" }, "bin": { "mint": "bin/index.js", "mintlify": "bin/index.js" } }, "sha512-hfYvUE/fwpWoZTrUgTCC2Y1CL2Qw1JRpFQNeQumCbleZW0OdTRywHISP920ujnqJs9V6cC+6E6Y4TaZHMXanfQ=="], + "@mintlify/cli": ["@mintlify/cli@4.0.1536", "", { "dependencies": { "@inquirer/prompts": "7.9.0", "@mintlify/common": "1.0.1170", "@mintlify/link-rot": "3.0.1375", "@mintlify/models": "0.0.362", "@mintlify/prebuild": "1.0.1327", "@mintlify/previewing": "4.0.1399", "@mintlify/validation": "0.1.873", "adm-zip": "0.6.0", "chalk": "5.2.0", "color": "4.2.3", "detect-port": "1.5.1", "fs-extra": "11.2.0", "ink": "6.3.0", "inquirer": "12.3.0", "js-yaml": "4.3.1", "jsonc-parser": "^3.3.1", "mdast-util-mdx-jsx": "3.2.0", "open": "8.4.2", "openid-client": "6.8.2", "posthog-node": "5.17.2", "prosemirror-model": "^1.25.0", "react": "19.2.3", "remark": "^15.0.1", "remark-frontmatter": "^5.0.0", "remark-gfm": "^4.0.1", "remark-math": "^6.0.0", "remark-mdx": "^3.1.1", "remark-stringify": "^11.0.0", "unified": "^11.0.5", "unist-util-visit": "5.0.0", "yaml": "^2.8.3", "yargs": "17.7.1", "zod": "4.3.6" }, "optionalDependencies": { "@anthropic-ai/claude-agent-sdk": "0.3.241", "@anthropic-ai/sdk": "0.120.0", "@modelcontextprotocol/sdk": "1.30.0", "@openai/codex-sdk": "0.149.1", "keytar": "7.9.0" }, "bin": { "mint": "bin/index.js", "mintlify": "bin/index.js" } }, "sha512-15BfOGqqqgrAHFwqnkY9zWcBsTUQugWTe1Fuk5qyjGQegsT3qxvHHAB0+IFtla92mJU6XEoCFfMZTp54lmNHaA=="], - "@mintlify/common": ["@mintlify/common@1.0.778", "", { "dependencies": { "@asyncapi/parser": "3.4.0", "@asyncapi/specs": "6.8.1", "@mintlify/mdx": "^3.0.4", "@mintlify/models": "0.0.283", "@mintlify/openapi-parser": "^0.0.8", "@mintlify/validation": "0.1.625", "@sindresorhus/slugify": "2.2.0", "@types/mdast": "4.0.4", "acorn": "8.11.2", "acorn-jsx": "5.3.2", "color-blend": "4.0.0", "estree-util-to-js": "2.0.0", "estree-walker": "3.0.3", "front-matter": "4.0.2", "hast-util-from-html": "2.0.3", "hast-util-to-html": "9.0.4", "hast-util-to-text": "4.0.2", "hex-rgb": "5.0.0", "ignore": "7.0.5", "js-yaml": "4.1.0", "lodash": "4.17.21", "mdast-util-from-markdown": "2.0.2", "mdast-util-gfm": "3.0.0", "mdast-util-mdx": "3.0.0", "mdast-util-mdx-jsx": "3.1.3", "micromark-extension-gfm": "3.0.0", "micromark-extension-mdx-jsx": "3.0.1", "micromark-extension-mdxjs": "3.0.0", "openapi-types": "12.1.3", "postcss": "8.5.6", "rehype-stringify": "10.0.1", "remark": "15.0.1", "remark-frontmatter": "5.0.0", "remark-gfm": "4.0.0", "remark-math": "6.0.0", "remark-mdx": "3.1.0", "remark-parse": "11.0.0", "remark-rehype": "11.1.1", "remark-stringify": "11.0.0", "sucrase": "^3.34.0", "tailwindcss": "3.4.4", "unified": "11.0.5", "unist-builder": "4.0.0", "unist-util-map": "4.0.0", "unist-util-remove": "4.0.0", "unist-util-remove-position": "5.0.0", "unist-util-visit": "5.0.0", "unist-util-visit-parents": "6.0.1", "vfile": "6.0.3", "xss": "1.0.15" } }, "sha512-zVztDrMuYcCRP3ZgcTDwvTu8MXAWwXgC2bvvnz9PU66TreZPOjuZLR3BSoQgffCRnllATR5GFIppw0iH6fN0tA=="], + "@mintlify/common": ["@mintlify/common@1.0.1170", "", { "dependencies": { "@asyncapi/parser": "3.4.0", "@mintlify/mdx": "4.0.6", "@mintlify/models": "0.0.362", "@mintlify/openapi-parser": "0.0.8", "@mintlify/validation": "0.1.873", "@sindresorhus/slugify": "2.2.0", "@types/mdast": "4.0.4", "acorn": "8.11.2", "acorn-jsx": "5.3.2", "estree-util-to-js": "2.0.0", "estree-walker": "3.0.3", "front-matter": "4.0.2", "hast-util-from-html": "2.0.3", "hast-util-to-estree": "3.1.0", "hast-util-to-html": "9.0.4", "ignore": "7.0.5", "iregexp-check": "^0.1.2", "js-yaml": "4.3.1", "json-p3": "2.2.2", "lodash": "4.18.1", "mdast-util-from-markdown": "2.0.2", "mdast-util-gfm": "3.0.0", "mdast-util-mdx": "3.0.0", "mdast-util-mdx-jsx": "3.1.3", "micromark-extension-gfm": "3.0.0", "micromark-extension-mdxjs": "3.0.0", "openapi-types": "12.1.3", "postcss": "8.5.23", "re2js": "^2.8.6", "rehype-katex": "7.0.1", "rehype-stringify": "10.0.1", "remark": "15.0.1", "remark-frontmatter": "5.0.0", "remark-gfm": "4.0.0", "remark-math": "6.0.0", "remark-mdx": "3.1.0", "remark-parse": "11.0.0", "remark-rehype": "11.1.1", "remark-smartypants": "3.0.2", "remark-stringify": "11.0.0", "sucrase": "3.34.0", "tailwindcss-v3": "npm:tailwindcss@3.4.17", "unified": "11.0.5", "unist-builder": "4.0.0", "unist-util-map": "4.0.0", "unist-util-remove": "4.0.0", "unist-util-remove-position": "5.0.0", "unist-util-visit": "5.0.0", "unist-util-visit-parents": "6.0.1", "vfile": "6.0.3", "xss": "1.0.15" } }, "sha512-fQPkbSL1Eu0JOcl8Yj8swUK8HNYZomISQ1R+XRqYkNk98tegk4s6PgiNxP2jJTbtaNr07YeSNy+9iCfpaCma/g=="], - "@mintlify/link-rot": ["@mintlify/link-rot@3.0.945", "", { "dependencies": { "@mintlify/common": "1.0.778", "@mintlify/prebuild": "1.0.916", "@mintlify/previewing": "4.0.974", "@mintlify/scraping": "4.0.522", "@mintlify/validation": "0.1.625", "fs-extra": "11.1.0", "unist-util-visit": "4.1.2" } }, "sha512-7zzyp+LipfqyHOdqMTaCxDjd8HvrYMsVaaUKgsU47sm6YxjbdUvnWURWTnY9Pp+mAbSXPdMHe/l+woGgT2T6ag=="], + "@mintlify/link-rot": ["@mintlify/link-rot@3.0.1375", "", { "dependencies": { "@mintlify/common": "1.0.1170", "@mintlify/models": "0.0.362", "@mintlify/prebuild": "1.0.1327", "@mintlify/previewing": "4.0.1399", "@mintlify/scraping": "4.0.1040", "@mintlify/validation": "0.1.873", "fs-extra": "11.1.0", "unist-util-visit": "4.1.2" } }, "sha512-amIL05QelM511zHuJ5Myk5pACto0D6xuLo1IMewRL+7QBLXyjRFVqbLUNBLRVol4NiuFxQywCBBbRK63dLhUFQ=="], - "@mintlify/mdx": ["@mintlify/mdx@3.0.4", "", { "dependencies": { "@shikijs/transformers": "^3.11.0", "@shikijs/twoslash": "^3.12.2", "arktype": "^2.1.26", "hast-util-to-string": "^3.0.1", "mdast-util-from-markdown": "^2.0.2", "mdast-util-gfm": "^3.1.0", "mdast-util-mdx-jsx": "^3.2.0", "mdast-util-to-hast": "^13.2.0", "next-mdx-remote-client": "^1.0.3", "rehype-katex": "^7.0.1", "remark-gfm": "^4.0.0", "remark-math": "^6.0.0", "remark-smartypants": "^3.0.2", "shiki": "^3.11.0", "unified": "^11.0.0", "unist-util-visit": "^5.0.0" }, "peerDependencies": { "@radix-ui/react-popover": "^1.1.15", "react": "^18.3.1", "react-dom": "^18.3.1" } }, "sha512-tJhdpnM5ReJLNJ2fuDRIEr0zgVd6id7/oAIfs26V46QlygiLsc8qx4Rz3LWIX51rUXW/cfakjj0EATxIciIw+g=="], + "@mintlify/mdx": ["@mintlify/mdx@4.0.6", "", { "dependencies": { "@shikijs/transformers": "^3.23.0", "@shikijs/twoslash": "^3.23.0", "arktype": "^2.1.26", "hast-util-to-string": "^3.0.1", "mdast-util-from-markdown": "^2.0.2", "mdast-util-gfm": "^3.1.0", "mdast-util-mdx-jsx": "^3.2.0", "mdast-util-to-hast": "^13.2.0", "next-mdx-remote-client": "^2.1.11", "rehype-katex": "^7.0.1", "remark-gfm": "^4.0.0", "remark-math": "^6.0.0", "remark-smartypants": "^3.0.2", "shiki": "^3.23.0", "twoslash": "^0.3.4", "unified": "^11.0.0", "unist-util-visit": "^5.0.0" }, "peerDependencies": { "@base-ui/react": "^1.6.0", "react": "^19.2.1", "react-dom": "^19.2.1" } }, "sha512-mNyug9COogTzMfS0C2WOlwMUb9lHjwBEm6Zap70OouO+9KIdPO0UKdh6YnbuT20ybftk5SRfhv1J1yFYELCrZw=="], - "@mintlify/models": ["@mintlify/models@0.0.283", "", { "dependencies": { "axios": "1.13.2", "openapi-types": "12.1.3" } }, "sha512-UY4PgxMZqD9QN6G0uSZgTLlMf7Ik0pliw+0AUPm+PGIlsIUMHfB1OyxuWZl9BD3Kpqm61QHI61Ud77NAGRUfUA=="], + "@mintlify/models": ["@mintlify/models@0.0.362", "", { "dependencies": { "axios": "1.18.0", "openapi-types": "12.1.3" } }, "sha512-BkWs2/bcBBwzmCuoDoiT/LYjtZV9Bj8zTM0WEkJuwnQuoylzDBbt9+TQfduDy8u5D6WsgSpGcVTUQXsRjwjdiQ=="], "@mintlify/openapi-parser": ["@mintlify/openapi-parser@0.0.8", "", { "dependencies": { "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "ajv-formats": "^3.0.1", "jsonpointer": "^5.0.1", "leven": "^4.0.0", "yaml": "^2.4.5" } }, "sha512-9MBRq9lS4l4HITYCrqCL7T61MOb20q9IdU7HWhqYMNMM1jGO1nHjXasFy61yZ8V6gMZyyKQARGVoZ0ZrYN48Og=="], - "@mintlify/prebuild": ["@mintlify/prebuild@1.0.916", "", { "dependencies": { "@mintlify/common": "1.0.778", "@mintlify/openapi-parser": "^0.0.8", "@mintlify/scraping": "4.0.640", "@mintlify/validation": "0.1.625", "chalk": "5.3.0", "favicons": "7.2.0", "front-matter": "4.0.2", "fs-extra": "11.1.0", "js-yaml": "4.1.0", "openapi-types": "12.1.3", "sharp": "0.33.5", "sharp-ico": "0.1.5", "unist-util-visit": "4.1.2", "uuid": "11.1.0" } }, "sha512-R3gOp8sIAPo8J5BPGptqMX7EAFnM2azmYmmoxx+tALCqmBUliJ6BmgSHCCGqjrfVWUHn572fd0qgvQ5w73Fo/Q=="], + "@mintlify/prebuild": ["@mintlify/prebuild@1.0.1327", "", { "dependencies": { "@mintlify/common": "1.0.1170", "@mintlify/scraping": "4.0.1040", "@mintlify/validation": "0.1.873", "chalk": "5.3.0", "favicons": "7.2.0", "fflate": "^0.8.2", "fs-extra": "11.1.0", "js-yaml": "4.3.1", "openapi-types": "12.1.3", "sharp": "0.33.5", "sharp-ico": "0.1.5", "uuid": "11.1.1" } }, "sha512-5/aDtnjGy3ADikAC8KhukBObM5mjnDIXYQ/owEWrjg8M1VQ/l7dVDsYJtXVZS2PvGqzEn3YMRs2b9YTx8Yl4ag=="], - "@mintlify/previewing": ["@mintlify/previewing@4.0.974", "", { "dependencies": { "@mintlify/common": "1.0.778", "@mintlify/prebuild": "1.0.916", "@mintlify/validation": "0.1.625", "better-opn": "3.0.2", "chalk": "5.2.0", "chokidar": "3.5.3", "express": "4.18.2", "front-matter": "4.0.2", "fs-extra": "11.1.0", "got": "13.0.0", "ink": "6.3.0", "ink-spinner": "5.0.0", "is-online": "10.0.0", "js-yaml": "4.1.0", "openapi-types": "12.1.3", "react": "19.2.3", "socket.io": "4.7.2", "tar": "6.1.15", "unist-util-visit": "4.1.2", "yargs": "17.7.1" } }, "sha512-tT+0cbnsKcKcYjt0jBE/a/BNe7ExfVxTHYjl3U6QwVA5PvwRRdkzrATYFlwzQvJye4tuX64rvDkZtRRmHSlqTA=="], + "@mintlify/previewing": ["@mintlify/previewing@4.0.1399", "", { "dependencies": { "@mintlify/common": "1.0.1170", "@mintlify/prebuild": "1.0.1327", "@mintlify/validation": "0.1.873", "adm-zip": "0.6.0", "better-opn": "3.0.2", "chalk": "5.2.0", "chokidar": "3.5.3", "express": "4.22.0", "fs-extra": "11.1.0", "got": "13.0.0", "ink": "6.3.0", "ink-spinner": "5.0.0", "is-online": "10.0.0", "js-yaml": "4.3.1", "react": "19.2.3", "socket.io": "4.8.0", "tar": "7.5.21", "yargs": "17.7.1" } }, "sha512-nEdcCmL8vtdp107mbN0UFYBjQX/7GwzmyREe1+KslyOOkVyfdItI5pARLCmBQHEnVquPpefZldM0LdUf81kWOw=="], - "@mintlify/scraping": ["@mintlify/scraping@4.0.640", "", { "dependencies": { "@mintlify/common": "1.0.778", "@mintlify/openapi-parser": "^0.0.8", "fs-extra": "11.1.1", "hast-util-to-mdast": "10.1.0", "js-yaml": "4.1.0", "mdast-util-mdx-jsx": "3.1.3", "neotraverse": "0.6.18", "puppeteer": "22.14.0", "rehype-parse": "9.0.1", "remark-gfm": "4.0.0", "remark-mdx": "3.0.1", "remark-parse": "11.0.0", "remark-stringify": "11.0.0", "unified": "11.0.5", "unist-util-visit": "5.0.0", "yargs": "17.7.1", "zod": "3.24.0" }, "bin": { "mintlify-scrape": "bin/cli.js" } }, "sha512-/XD+KKOE1vdQ/mKKuD9CYq7I0acWK4M9fqxCL+1lAPOrmncDKSsoEnXGaAklk1oDXBjKBu128CKV86E1J3GrjA=="], + "@mintlify/scraping": ["@mintlify/scraping@4.0.1040", "", { "dependencies": { "@mintlify/common": "1.0.1170", "fast-xml-parser": "5.7.3", "fs-extra": "11.1.1", "graphql": "16.11.0", "hast-util-to-mdast": "10.1.0", "js-yaml": "4.3.1", "mdast-util-mdx-jsx": "3.1.3", "neotraverse": "0.6.18", "rehype-parse": "9.0.1", "remark-gfm": "4.0.0", "remark-mdx": "3.0.1", "remark-parse": "11.0.0", "remark-stringify": "11.0.0", "unified": "11.0.5", "unist-util-visit": "5.0.0", "yargs": "17.7.1", "zod": "3.24.0" }, "peerDependencies": { "puppeteer": "24.3.1" }, "optionalPeers": ["puppeteer"], "bin": { "mintlify-scrape": "bin/cli.js" } }, "sha512-7mFq0Q+CKYd/KQV9p4Duy6fUgw1WSAQzsDaysUqhbgl7XdjvfM31CcNmoZrLujmfGzOk/JGHhEZRNMwScxmzQQ=="], - "@mintlify/validation": ["@mintlify/validation@0.1.625", "", { "dependencies": { "@mintlify/mdx": "^3.0.4", "@mintlify/models": "0.0.283", "arktype": "2.1.27", "js-yaml": "4.1.0", "lcm": "0.0.3", "lodash": "4.17.21", "object-hash": "3.0.0", "openapi-types": "12.1.3", "uuid": "11.1.0", "zod": "3.24.0", "zod-to-json-schema": "3.20.4" } }, "sha512-fVq26eWNwc1NOwrss0oLZe/Y6cwcQr8oC4/1bcGwY88epj0k8if1UpOK9dv1S+h7Vqp1IZ/KN5i+G69LdO+5iQ=="], + "@mintlify/validation": ["@mintlify/validation@0.1.873", "", { "dependencies": { "@mintlify/mdx": "4.0.6", "@mintlify/models": "0.0.362", "fractional-indexing": "3.2.0", "js-yaml": "4.3.1", "lcm": "0.0.3", "lodash": "4.18.1", "neotraverse": "0.6.18", "object-hash": "3.0.0", "openapi-types": "12.1.3", "uuid": "11.1.1", "zod": "3.24.0", "zod-to-json-schema": "3.20.4" } }, "sha512-OlxJBg887orHyiPhJUJhntsp0R1z8RwtNJsDQDiJhenP2F4utuGPYVIlPiVaO9fQ3qLhQttSlEfUM5M9ELM1PA=="], "@modelcontextprotocol/client": ["@modelcontextprotocol/client@2.0.0", "", { "dependencies": { "@modelcontextprotocol/core": "2.0.0", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "jose": "^6.1.3", "pkce-challenge": "^5.0.0", "zod": "^4.2.0" } }, "sha512-8f1OghQ2rjzIOfqgUCP+8GiUWqRs89njoWLNqAe8kWmDePv3s1fZXseej+QXemssEuuOvLLmLO/kqM3IQHtISw=="], @@ -924,6 +949,8 @@ "@noble/hashes": ["@noble/hashes@2.0.1", "", {}, "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw=="], + "@nodable/entities": ["@nodable/entities@2.2.0", "", {}, "sha512-9uGyhaQavEUMC8AIddIjau4NsnsXhou+j5sBAGojCM1oxmQpVKTWR/9JxABD6UAv12vpIms55fPZKFQEhG6uBg=="], + "@node-minify/core": ["@node-minify/core@8.0.6", "", { "dependencies": { "@node-minify/utils": "8.0.6", "glob": "9.3.5", "mkdirp": "1.0.4" } }, "sha512-/vxN46ieWDLU67CmgbArEvOb41zlYFOkOtr9QW9CnTrBLuTyGgkyNWC2y5+khvRw3Br58p2B5ZVSx/PxCTru6g=="], "@node-minify/terser": ["@node-minify/terser@8.0.6", "", { "dependencies": { "@node-minify/utils": "8.0.6", "terser": "5.16.9" } }, "sha512-grQ1ipham743ch2c3++C8Isk6toJnxJSyDiwUI/IWUCh4CZFD6aYVw6UAY40IpCnjrq5aXGwiv5OZJn6Pr0hvg=="], @@ -960,6 +987,22 @@ "@octokit/types": ["@octokit/types@14.1.0", "", { "dependencies": { "@octokit/openapi-types": "^25.1.0" } }, "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g=="], + "@openai/codex": ["@openai/codex@0.149.1", "", { "optionalDependencies": { "@openai/codex-darwin-arm64": "npm:@openai/codex@0.149.1-darwin-arm64", "@openai/codex-darwin-x64": "npm:@openai/codex@0.149.1-darwin-x64", "@openai/codex-linux-arm64": "npm:@openai/codex@0.149.1-linux-arm64", "@openai/codex-linux-x64": "npm:@openai/codex@0.149.1-linux-x64", "@openai/codex-win32-arm64": "npm:@openai/codex@0.149.1-win32-arm64", "@openai/codex-win32-x64": "npm:@openai/codex@0.149.1-win32-x64" }, "bin": { "codex": "bin/codex.js" } }, "sha512-6q5pbcpFbJbqOpkubSDBwXmktQ55aD8eUzGzBF1zASob2DjwhBKDSNGtdZKalfrNJUdTDTPDMmzCXEXs5tMBYA=="], + + "@openai/codex-darwin-arm64": ["@openai/codex@0.149.1-darwin-arm64", "", { "os": "darwin", "cpu": "arm64" }, "sha512-6X84kTCbnTgPIJ2EdcPsrvwS0Wxsqpa+bCswGmRf4BjhcQ5nPMnBC6yCAaCMj+vrbXQHj+L6sa9FaR4QkmA1qw=="], + + "@openai/codex-darwin-x64": ["@openai/codex@0.149.1-darwin-x64", "", { "os": "darwin", "cpu": "x64" }, "sha512-MfLBQLfcElJL9tvj6y45qVHHMGSXCPnQOixuD3/Zq0g1BW/eFizkrGLdn48cFpc+l8cK+gt5nYG5pQYwVs6g4A=="], + + "@openai/codex-linux-arm64": ["@openai/codex@0.149.1-linux-arm64", "", { "os": "linux", "cpu": "arm64" }, "sha512-OqxUfZ1TVvHd18zHPKK/8ZRlpk8Vy11mg5CMHaLxNWldTbwVImDKtSLWT+m8m4NM5Sz4PbjtZMrVT/RfpBW/mQ=="], + + "@openai/codex-linux-x64": ["@openai/codex@0.149.1-linux-x64", "", { "os": "linux", "cpu": "x64" }, "sha512-Of5fGYgr7tAMsyj6vhXb4/RM/UoA3Zq8BLegUBDC09UNy1XTLGYP/2XD+UX8z3qh0NDwxYdCjFIWdDNijKZggQ=="], + + "@openai/codex-sdk": ["@openai/codex-sdk@0.149.1", "", { "dependencies": { "@openai/codex": "0.149.1" } }, "sha512-R00Rz5327LefZggAxl28r7vFQq1vxa91OxtjZJOsQfAM/MyH8InW5qwwRu6pzUmRGp1E29XrOzm7u1TeV5Yz2A=="], + + "@openai/codex-win32-arm64": ["@openai/codex@0.149.1-win32-arm64", "", { "os": "win32", "cpu": "arm64" }, "sha512-5K0DmOKGK9Bos627p8sK8ATHjovPK0sDyT6h9Cb+4v+5CW5SGw1HLgjGxoLfJ8g3cg6mtg/pRCXXo2L/j71UVA=="], + + "@openai/codex-win32-x64": ["@openai/codex@0.149.1-win32-x64", "", { "os": "win32", "cpu": "x64" }, "sha512-G3QXGAg7nyyhqOeooAMUekBCeHd8a1QByhKcVAFyzNBaI06t6Ft7nsF+1SzFS0spuIdU4YyMi5YD26ukADBQUQ=="], + "@openapi-contrib/openapi-schema-to-json-schema": ["@openapi-contrib/openapi-schema-to-json-schema@3.2.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" } }, "sha512-Gj6C0JwCr8arj0sYuslWXUBSP/KnUlEGnPW4qxlXvAl543oaNQgMgIgkQUA6vs5BCCvwTEiL8m/wdWzfl4UvSw=="], "@opennextjs/aws": ["@opennextjs/aws@3.9.16", "", { "dependencies": { "@ast-grep/napi": "^0.40.5", "@aws-sdk/client-cloudfront": "3.984.0", "@aws-sdk/client-dynamodb": "3.984.0", "@aws-sdk/client-lambda": "3.984.0", "@aws-sdk/client-s3": "3.984.0", "@aws-sdk/client-sqs": "3.984.0", "@node-minify/core": "^8.0.6", "@node-minify/terser": "^8.0.6", "@tsconfig/node18": "^1.0.3", "aws4fetch": "^1.0.20", "chalk": "^5.6.2", "cookie": "^1.0.2", "esbuild": "0.25.4", "express": "^5.1.0", "path-to-regexp": "^6.3.0", "urlpattern-polyfill": "^10.1.0", "yaml": "^2.8.1" }, "peerDependencies": { "next": "~15.0.8 || ~15.1.12 || ~15.2.9 || ~15.3.9 || ~15.4.11 || ~15.5.10 || ~16.0.11 || ^16.1.5" }, "bin": { "open-next": "dist/index.js" } }, "sha512-jQQStCysIllNCPqz5W2KSguXpr+ETlOcD8SyNu+h9zwpRVYk4uEPQge+ErG3avI5xsT8vKA7EGLYG59dhj/B6Q=="], @@ -1038,6 +1081,8 @@ "@posthog/core": ["@posthog/core@1.23.2", "", { "dependencies": { "cross-spawn": "^7.0.6" } }, "sha512-zTDdda9NuSHrnwSOfFMxX/pyXiycF4jtU1kTr8DL61dHhV+7LF6XF1ndRZZTuaGGbfbb/GJYkEsjEX9SXfNZeQ=="], + "@posthog/mcp": ["@posthog/mcp@0.21.0", "", { "dependencies": { "@posthog/core": "^1.55.2" }, "peerDependencies": { "@modelcontextprotocol/sdk": ">=1.26.0", "@modelcontextprotocol/server": ">=2.0.0", "posthog-node": "^5.0.0" }, "optionalPeers": ["@modelcontextprotocol/sdk", "@modelcontextprotocol/server"] }, "sha512-LhoQm2nUsXzGWgvxL4LHq1p2qC1B/FGoWxcRtMqQmirGQTCCfBNcNhlurX0J92X1iR7ZZuM7cZfkobdnQ43hvg=="], + "@posthog/types": ["@posthog/types@1.359.0", "", {}, "sha512-IcRRmDqDwXnwcB1ISg2NofvDXUwJKUjmIWuRqaEzD1sB+VyY7YX9R1pctXoZ4181cdjYG8Ed/g7fnpJMloZY/A=="], "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], @@ -1060,8 +1105,6 @@ "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], - "@puppeteer/browsers": ["@puppeteer/browsers@2.3.0", "", { "dependencies": { "debug": "^4.3.5", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.4.0", "semver": "^7.6.3", "tar-fs": "^3.0.6", "unbzip2-stream": "^1.4.3", "yargs": "^17.7.2" }, "bin": { "browsers": "lib/cjs/main-cli.js" } }, "sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA=="], - "@quansync/fs": ["@quansync/fs@1.0.0", "", { "dependencies": { "quansync": "^1.0.0" } }, "sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ=="], "@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="], @@ -1446,6 +1489,8 @@ "@speed-highlight/core": ["@speed-highlight/core@1.2.14", "", {}, "sha512-G4ewlBNhUtlLvrJTb88d2mdy2KRijzs4UhnlrOSRT4bmjh/IqNElZa3zkrZ+TC47TwtlDWzVLFADljF1Ijp5hA=="], + "@stablelib/base64": ["@stablelib/base64@1.0.1", "", {}, "sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ=="], + "@standard-community/standard-json": ["@standard-community/standard-json@0.3.5", "", { "peerDependencies": { "@standard-schema/spec": "^1.0.0", "@types/json-schema": "^7.0.15", "@valibot/to-json-schema": "^1.3.0", "arktype": "^2.1.20", "effect": "^3.16.8", "quansync": "^0.2.11", "sury": "^10.0.0", "typebox": "^1.0.17", "valibot": "^1.1.0", "zod": "^3.25.0 || ^4.0.0", "zod-to-json-schema": "^3.24.5" }, "optionalPeers": ["@valibot/to-json-schema", "arktype", "effect", "sury", "typebox", "valibot", "zod", "zod-to-json-schema"] }, "sha512-4+ZPorwDRt47i+O7RjyuaxHRK/37QY/LmgxlGrRrSTLYoFatEOzvqIc85GTlM18SFZ5E91C+v0o/M37wZPpUHA=="], "@standard-community/standard-openapi": ["@standard-community/standard-openapi@0.2.9", "", { "peerDependencies": { "@standard-community/standard-json": "^0.3.5", "@standard-schema/spec": "^1.0.0", "arktype": "^2.1.20", "effect": "^3.17.14", "openapi-types": "^12.1.3", "sury": "^10.0.0", "typebox": "^1.0.0", "valibot": "^1.1.0", "zod": "^3.25.0 || ^4.0.0", "zod-openapi": "^4" }, "optionalPeers": ["arktype", "effect", "sury", "typebox", "valibot", "zod", "zod-openapi"] }, "sha512-htj+yldvN1XncyZi4rehbf9kLbu8os2Ke/rfqoZHCMHuw34kiF3LP/yQPdA0tQ940y8nDq3Iou8R3wG+AGGyvg=="], @@ -1542,8 +1587,6 @@ "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="], - "@tootallnate/quickjs-emscripten": ["@tootallnate/quickjs-emscripten@0.23.0", "", {}, "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA=="], - "@total-typescript/tsconfig": ["@total-typescript/tsconfig@1.0.4", "", {}, "sha512-fO4ctMPGz1kOFOQ4RCPBRBfMy3gDn+pegUfrGyUFRMv/Rd0ZM3/SHH3hFCYG4u6bPLG8OlmOGcBLDexvyr3A5w=="], "@tsconfig/node18": ["@tsconfig/node18@1.0.3", "", {}, "sha512-RbwvSJQsuN9TB04AQbGULYfOGE/RnSFk/FLQ5b0NmDf5Kx2q/lABZbHQPKCO1vZ6Fiwkplu+yb9pGdLy1iGseQ=="], @@ -1570,8 +1613,6 @@ "@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="], - "@types/cookie": ["@types/cookie@0.4.1", "", {}, "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q=="], - "@types/cors": ["@types/cors@2.8.19", "", { "dependencies": { "@types/node": "*" } }, "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg=="], "@types/d3-array": ["@types/d3-array@3.2.2", "", {}, "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw=="], @@ -1630,7 +1671,7 @@ "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], - "@types/mdx": ["@types/mdx@2.0.13", "", {}, "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw=="], + "@types/mdx": ["@types/mdx@2.0.14", "", {}, "sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg=="], "@types/mime": ["@types/mime@1.3.5", "", {}, "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w=="], @@ -1672,8 +1713,6 @@ "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], - "@types/yauzl": ["@types/yauzl@2.10.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="], - "@typescript/vfs": ["@typescript/vfs@1.6.4", "", { "dependencies": { "debug": "^4.4.3" }, "peerDependencies": { "typescript": "*" } }, "sha512-PJFXFS4ZJKiJ9Qiuix6Dz/OwEIqHD7Dme1UwZhTK11vR+5dqW2ACbdndWQexBzCx+CPuMe5WBYQWCsFyGlQLlQ=="], "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], @@ -1720,7 +1759,7 @@ "address": ["address@1.2.2", "", {}, "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA=="], - "adm-zip": ["adm-zip@0.5.16", "", {}, "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ=="], + "adm-zip": ["adm-zip@0.6.1", "", {}, "sha512-Xwrja8nx9e5o2N1my4DsKCeKpdrnACyr1wtbPxBDgGzKzKyE9kRtBFA8mWldI+RVlD7CBZNWY/wQ2+ydwOR6kQ=="], "agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], @@ -1760,6 +1799,8 @@ "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + "anynum": ["anynum@1.0.1", "", {}, "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A=="], + "arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], @@ -1792,8 +1833,6 @@ "ast-kit": ["ast-kit@2.2.0", "", { "dependencies": { "@babel/parser": "^7.28.5", "pathe": "^2.0.3" } }, "sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw=="], - "ast-types": ["ast-types@0.13.4", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w=="], - "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="], "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], @@ -1818,34 +1857,18 @@ "axios": ["axios@1.13.2", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA=="], - "b4a": ["b4a@1.8.0", "", { "peerDependencies": { "react-native-b4a": "*" }, "optionalPeers": ["react-native-b4a"] }, "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg=="], - "babel-plugin-react-compiler": ["babel-plugin-react-compiler@1.0.0", "", { "dependencies": { "@babel/types": "^7.26.0" } }, "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw=="], "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "bare-events": ["bare-events@2.8.2", "", { "peerDependencies": { "bare-abort-controller": "*" }, "optionalPeers": ["bare-abort-controller"] }, "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ=="], - - "bare-fs": ["bare-fs@4.5.5", "", { "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", "bare-stream": "^2.6.4", "bare-url": "^2.2.2", "fast-fifo": "^1.3.2" }, "peerDependencies": { "bare-buffer": "*" }, "optionalPeers": ["bare-buffer"] }, "sha512-XvwYM6VZqKoqDll8BmSww5luA5eflDzY0uEFfBJtFKe4PAAtxBjU3YIxzIBzhyaEQBy1VXEQBto4cpN5RZJw+w=="], - - "bare-os": ["bare-os@3.7.1", "", {}, "sha512-ebvMaS5BgZKmJlvuWh14dg9rbUI84QeV3WlWn6Ph6lFI8jJoh7ADtVTyD2c93euwbe+zgi0DVrl4YmqXeM9aIA=="], - - "bare-path": ["bare-path@3.0.0", "", { "dependencies": { "bare-os": "^3.0.1" } }, "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw=="], - - "bare-stream": ["bare-stream@2.8.0", "", { "dependencies": { "streamx": "^2.21.0", "teex": "^1.0.1" }, "peerDependencies": { "bare-buffer": "*", "bare-events": "*" }, "optionalPeers": ["bare-buffer", "bare-events"] }, "sha512-reUN0M2sHRqCdG4lUK3Fw8w98eeUIZHL5c3H7Mbhk2yVBL+oofgaIp0ieLfD5QXwPCypBpmEEKU2WZKzbAk8GA=="], - - "bare-url": ["bare-url@2.3.2", "", { "dependencies": { "bare-path": "^3.0.0" } }, "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw=="], - "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], "base64id": ["base64id@2.0.0", "", {}, "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="], "baseline-browser-mapping": ["baseline-browser-mapping@2.10.0", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA=="], - "basic-ftp": ["basic-ftp@5.2.0", "", {}, "sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw=="], - "before-after-hook": ["before-after-hook@3.0.2", "", {}, "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A=="], "better-auth": ["better-auth@1.5.3", "", { "dependencies": { "@better-auth/core": "1.5.3", "@better-auth/kysely-adapter": "1.5.3", "@better-auth/memory-adapter": "1.5.3", "@better-auth/telemetry": "1.5.3", "@better-auth/utils": "0.3.1", "@better-fetch/fetch": "1.1.21", "@noble/ciphers": "^2.1.1", "@noble/hashes": "^2.0.1", "better-call": "1.3.2", "defu": "^6.1.4", "jose": "^6.1.3", "kysely": "^0.28.11", "nanostores": "^1.1.1", "zod": "^4.3.6" }, "peerDependencies": { "@better-auth/drizzle-adapter": "1.5.3", "@better-auth/mongo-adapter": "1.5.3", "@better-auth/prisma-adapter": "1.5.3", "@lynx-js/react": "*", "@prisma/client": "^5.0.0 || ^6.0.0 || ^7.0.0", "@sveltejs/kit": "^2.0.0", "@tanstack/react-start": "^1.0.0", "@tanstack/solid-start": "^1.0.0", "better-sqlite3": "^12.0.0", "drizzle-kit": ">=0.31.4", "drizzle-orm": ">=0.41.0", "mongodb": "^6.0.0 || ^7.0.0", "mysql2": "^3.0.0", "next": "^14.0.0 || ^15.0.0 || ^16.0.0", "pg": "^8.0.0", "prisma": "^5.0.0 || ^6.0.0 || ^7.0.0", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0", "solid-js": "^1.0.0", "svelte": "^4.0.0 || ^5.0.0", "vitest": "^2.0.0 || ^3.0.0 || ^4.0.0", "vue": "^3.0.0" }, "optionalPeers": ["@better-auth/drizzle-adapter", "@better-auth/mongo-adapter", "@better-auth/prisma-adapter", "@lynx-js/react", "@prisma/client", "@sveltejs/kit", "@tanstack/react-start", "@tanstack/solid-start", "better-sqlite3", "drizzle-kit", "drizzle-orm", "mongodb", "mysql2", "next", "pg", "prisma", "react", "react-dom", "solid-js", "svelte", "vitest", "vue"] }, "sha512-E+9kA9GMX1+gT3FfMCqRz0NufT4X/+tNhpOsHW1jLmyPZKinkHtfZkUffSBnG5qGkvfBaH/slT5c1fKttnmF5w=="], @@ -1860,6 +1883,8 @@ "birpc": ["birpc@2.9.0", "", {}, "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw=="], + "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], + "blake3-wasm": ["blake3-wasm@2.1.5", "", {}, "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g=="], "body-parser": ["body-parser@2.2.2", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA=="], @@ -1876,8 +1901,6 @@ "buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], - "buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], - "buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="], "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], @@ -1900,8 +1923,6 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "camelcase": ["camelcase@8.0.0", "", {}, "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA=="], "camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="], @@ -1928,9 +1949,7 @@ "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], - "chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], - - "chromium-bidi": ["chromium-bidi@0.6.2", "", { "dependencies": { "mitt": "3.0.1", "urlpattern-polyfill": "10.0.0", "zod": "3.23.8" }, "peerDependencies": { "devtools-protocol": "*" } }, "sha512-4WVBa6ijmUTVr9cZD4eicQD8Mdy/HCX3bzEIYYpmk0glqYLoWH+LqQEvV9RpDRzoQSbY1KJHloYXbDMXMbDPhg=="], + "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], @@ -1964,8 +1983,6 @@ "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="], - "color-blend": ["color-blend@4.0.0", "", {}, "sha512-fYODTHhI/NG+B5GnzvuL3kiFrK/UnkUezWFTgEPBTY5V+kpyfAn95Vn9sJeeCX6omrCOdxnqCL3CvH+6sXtIbw=="], - "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], @@ -2006,8 +2023,6 @@ "cors": ["cors@2.8.6", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw=="], - "cosmiconfig": ["cosmiconfig@9.0.1", "", { "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ=="], - "cron-schedule": ["cron-schedule@6.0.0", "", {}, "sha512-BoZaseYGXOo5j5HUwTaegIog3JJbuH4BbrY9A1ArLjXpy+RWb3mV28F/9Gv1dDA7E2L8kngWva4NWisnLTyfgQ=="], "cross-fetch": ["cross-fetch@3.2.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q=="], @@ -2076,6 +2091,8 @@ "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="], + "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], + "deep-object-diff": ["deep-object-diff@1.1.9", "", {}, "sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA=="], "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], @@ -2094,8 +2111,6 @@ "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="], - "degenerator": ["degenerator@5.0.1", "", { "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", "esprima": "^4.0.1" } }, "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ=="], - "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], @@ -2116,8 +2131,6 @@ "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], - "devtools-protocol": ["devtools-protocol@0.0.1312386", "", {}, "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA=="], - "didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="], "diff": ["diff@8.0.3", "", {}, "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ=="], @@ -2190,7 +2203,7 @@ "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], - "engine.io": ["engine.io@6.5.5", "", { "dependencies": { "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", "cookie": "~0.4.1", "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", "ws": "~8.17.1" } }, "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA=="], + "engine.io": ["engine.io@6.6.11", "", { "dependencies": { "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", "@types/ws": "^8.5.12", "accepts": "~1.3.4", "cookie": "~0.7.2", "cors": "~2.8.5", "debug": "~4.4.1", "engine.io-parser": "~5.2.1", "ws": "~8.21.0" } }, "sha512-z34mGpLoY/82ZbkX1LqGMIaf3wjVMPL6gVC681QDqnmzJ26synI8qAE32P+a7UazmpJZ8UGrFIeAavgRfXzYrg=="], "engine.io-client": ["engine.io-client@6.6.4", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.4.1", "engine.io-parser": "~5.2.1", "ws": "~8.18.3", "xmlhttprequest-ssl": "~2.1.1" } }, "sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw=="], @@ -2206,8 +2219,6 @@ "environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="], - "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], - "error-stack-parser-es": ["error-stack-parser-es@1.0.5", "", {}, "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA=="], "es-abstract": ["es-abstract@1.24.1", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw=="], @@ -2242,12 +2253,8 @@ "escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], - "escodegen": ["escodegen@2.1.0", "", { "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2" }, "optionalDependencies": { "source-map": "~0.6.1" }, "bin": { "esgenerate": "bin/esgenerate.js", "escodegen": "bin/escodegen.js" } }, "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w=="], - "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], - "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], - "estree-util-attach-comments": ["estree-util-attach-comments@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw=="], "estree-util-build-jsx": ["estree-util-build-jsx@3.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-walker": "^3.0.0" } }, "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ=="], @@ -2262,8 +2269,6 @@ "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], - "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], - "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], "event-target-polyfill": ["event-target-polyfill@0.0.4", "", {}, "sha512-Gs6RLjzlLRdT8X9ZipJdIZI/Y6/HhRLyq9RdDlCsnpxr/+Nn6bU2EFGuC94GjxqhM+Nmij2Vcq98yoHrU8uNFQ=="], @@ -2272,14 +2277,14 @@ "eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="], - "events-universal": ["events-universal@1.0.1", "", { "dependencies": { "bare-events": "^2.7.0" } }, "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw=="], - "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="], "eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="], "execa": ["execa@9.6.1", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.6", "figures": "^6.1.0", "get-stream": "^9.0.0", "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", "pretty-ms": "^9.2.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", "yoctocolors": "^2.1.1" } }, "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA=="], + "expand-template": ["expand-template@2.0.3", "", {}, "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="], + "expect-type": ["expect-type@1.3.0", "", {}, "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA=="], "express": ["express@5.2.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="], @@ -2292,8 +2297,6 @@ "extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="], - "extract-zip": ["extract-zip@2.0.1", "", { "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "optionalDependencies": { "@types/yauzl": "^2.9.1" }, "bin": { "extract-zip": "cli.js" } }, "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg=="], - "extsprintf": ["extsprintf@1.4.1", "", {}, "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA=="], "fast-content-type-parse": ["fast-content-type-parse@2.0.1", "", {}, "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q=="], @@ -2302,14 +2305,14 @@ "fast-equals": ["fast-equals@5.4.0", "", {}, "sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw=="], - "fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="], - "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], "fast-json-patch": ["fast-json-patch@3.1.1", "", {}, "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ=="], "fast-memoize": ["fast-memoize@2.5.2", "", {}, "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw=="], + "fast-sha256": ["fast-sha256@1.3.0", "", {}, "sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ=="], + "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], "fast-xml-builder": ["fast-xml-builder@1.0.0", "", {}, "sha512-fpZuDogrAgnyt9oDDz+5DBz0zgPdPZz6D4IR7iESxRXElrlGTRkHJ9eEt+SACRJwT0FNFrt71DFQIUFBJfX/uQ=="], @@ -2322,8 +2325,6 @@ "favicons": ["favicons@7.2.0", "", { "dependencies": { "escape-html": "^1.0.3", "sharp": "^0.33.1", "xml2js": "^0.6.1" } }, "sha512-k/2rVBRIRzOeom3wI9jBPaSEvoTSQEW4iM0EveBmBBKFxO8mSyyRWtDlfC3VnEfu0avmjrMzy8/ZFPSe6F71Hw=="], - "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="], - "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], "fecha": ["fecha@4.2.3", "", {}, "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw=="], @@ -2362,15 +2363,17 @@ "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], + "fractional-indexing": ["fractional-indexing@3.2.0", "", {}, "sha512-PcOxmqwYCW7O2ovKRU8OoQQj2yqTfEB/yeTYk4gPid6dN5ODRfU1hXd9tTVZzax/0NkO7AxpHykvZnT1aYp/BQ=="], + "framer-motion": ["framer-motion@12.35.0", "", { "dependencies": { "motion-dom": "^12.35.0", "motion-utils": "^12.29.2", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-w8hghCMQ4oq10j6aZh3U2yeEQv5K69O/seDI/41PK4HtgkLrcBovUNc0ayBC3UyyU7V1mrY2yLzvYdWJX9pGZQ=="], "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], "front-matter": ["front-matter@4.0.2", "", { "dependencies": { "js-yaml": "^3.13.1" } }, "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg=="], - "fs-extra": ["fs-extra@11.2.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw=="], + "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], - "fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="], + "fs-extra": ["fs-extra@11.2.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw=="], "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], @@ -2408,10 +2411,10 @@ "get-tsconfig": ["get-tsconfig@4.13.6", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw=="], - "get-uri": ["get-uri@6.0.5", "", { "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", "debug": "^4.3.4" } }, "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg=="], - "gifuct-js": ["gifuct-js@2.1.2", "", { "dependencies": { "js-binary-schema-parser": "^2.0.3" } }, "sha512-rI2asw77u0mGgwhV3qA+OEgYqaDn5UNqgs+Bx0FGwSpuqfYn+Ir6RQY5ENNQ8SbIiG/m5gVa7CD5RriO4f4Lsg=="], + "github-from-package": ["github-from-package@0.0.0", "", {}, "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="], + "glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], @@ -2476,7 +2479,7 @@ "hast-util-phrasing": ["hast-util-phrasing@3.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-embedded": "^3.0.0", "hast-util-has-property": "^3.0.0", "hast-util-is-body-ok-link": "^3.0.0", "hast-util-is-element": "^3.0.0" } }, "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ=="], - "hast-util-to-estree": ["hast-util-to-estree@3.1.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-attach-comments": "^3.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w=="], + "hast-util-to-estree": ["hast-util-to-estree@3.1.0", "", { "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": "^6.0.0", "space-separated-tokens": "^2.0.0", "style-to-object": "^0.4.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw=="], "hast-util-to-html": ["hast-util-to-html@9.0.4", "", { "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": "^6.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA=="], @@ -2492,8 +2495,6 @@ "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="], - "hex-rgb": ["hex-rgb@5.0.0", "", {}, "sha512-NQO+lgVUCtHxZ792FodgW0zflK+ozS9X9dwGp9XvvmPlH7pyxd588cn24TD3rmPm/N0AIRXF10Otah8yKqGw4w=="], - "hono": ["hono@4.12.5", "", {}, "sha512-3qq+FUBtlTHhtYxbxheZgY8NIFnkkC/MR8u5TTsr7YZ3wixryQ3cCwn3iZbg8p8B88iDBBAYSfZDS75t8MN7Vg=="], "hono-openapi": ["hono-openapi@0.4.8", "", { "dependencies": { "json-schema-walker": "^2.0.0" }, "peerDependencies": { "@hono/arktype-validator": "^2.0.0", "@hono/effect-validator": "^1.2.0", "@hono/typebox-validator": "^0.2.0 || ^0.3.0", "@hono/valibot-validator": "^0.5.1", "@hono/zod-validator": "^0.4.1", "@sinclair/typebox": "^0.34.9", "@valibot/to-json-schema": "^1.0.0-beta.3", "arktype": "^2.0.0", "effect": "^3.11.3", "hono": "^4.6.13", "openapi-types": "^12.1.3", "valibot": "^1.0.0-beta.9", "zod": "^3.23.8", "zod-openapi": "^4.0.0" }, "optionalPeers": ["@hono/arktype-validator", "@hono/effect-validator", "@hono/typebox-validator", "@hono/valibot-validator", "@hono/zod-validator", "@sinclair/typebox", "@valibot/to-json-schema", "arktype", "effect", "hono", "valibot", "zod", "zod-openapi"] }, "sha512-LYr5xdtD49M7hEAduV1PftOMzuT8ZNvkyWfh1DThkLsIr4RkvDb12UxgIiFbwrJB6FLtFXLoOZL9x4IeDk2+VA=="], @@ -2510,8 +2511,6 @@ "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], - "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], - "http2-wrapper": ["http2-wrapper@2.2.1", "", { "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" } }, "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ=="], "https-proxy-agent": ["https-proxy-agent@5.0.1", "", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="], @@ -2532,17 +2531,19 @@ "immer": ["immer@9.0.21", "", {}, "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA=="], - "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], - "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], + "ink": ["ink@6.3.0", "", { "dependencies": { "@alcalzone/ansi-tokenize": "^0.2.0", "ansi-escapes": "^7.0.0", "ansi-styles": "^6.2.1", "auto-bind": "^5.0.1", "chalk": "^5.6.0", "cli-boxes": "^3.0.0", "cli-cursor": "^4.0.0", "cli-truncate": "^4.0.0", "code-excerpt": "^4.0.0", "es-toolkit": "^1.39.10", "indent-string": "^5.0.0", "is-in-ci": "^2.0.0", "patch-console": "^2.0.0", "react-reconciler": "^0.32.0", "signal-exit": "^3.0.7", "slice-ansi": "^7.1.0", "stack-utils": "^2.0.6", "string-width": "^7.2.0", "type-fest": "^4.27.0", "widest-line": "^5.0.0", "wrap-ansi": "^9.0.0", "ws": "^8.18.0", "yoga-layout": "~3.2.1" }, "peerDependencies": { "@types/react": ">=19.0.0", "react": ">=19.0.0", "react-devtools-core": "^4.19.1" }, "optionalPeers": ["@types/react", "react-devtools-core"] }, "sha512-2CbJAa7XeziZYe6pDS5RVLirRY28iSGMQuEV8jRU5NQsONQNfcR/BZHHc9vkMg2lGYTHTM2pskxC1YmY28p6bQ=="], "ink-spinner": ["ink-spinner@5.0.0", "", { "dependencies": { "cli-spinners": "^2.7.0" }, "peerDependencies": { "ink": ">=4.0.0", "react": ">=18.0.0" } }, "sha512-EYEasbEjkqLGyPOUc8hBJZNuC5GvXGMLu0w5gdTNskPc7Izc5vO3tdQEYnzvshucyGCBXc86ig0ujXPMWaQCdA=="], - "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="], + "inline-style-parser": ["inline-style-parser@0.1.1", "", {}, "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q=="], "inquirer": ["inquirer@12.11.1", "", { "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/core": "^10.3.2", "@inquirer/prompts": "^7.10.1", "@inquirer/type": "^3.0.10", "mute-stream": "^2.0.0", "run-async": "^4.0.6", "rxjs": "^7.8.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-9VF7mrY+3OmsAfjH3yKz/pLbJ5z22E23hENKw3/LNSaA/sAt3v49bDRY+Ygct1xwuKT+U+cBfTzjCPySna69Qw=="], @@ -2556,6 +2557,8 @@ "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], + "iregexp-check": ["iregexp-check@0.1.2", "", {}, "sha512-RCcV2SFO5JKh+DdmWiY7yVyiZzzk6XZiHEJvTKbzVs8Z0u404gnoSqDtFqg6C5qJBEG4QseWBQz9zhI68zskEQ=="], + "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="], "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], @@ -2670,7 +2673,7 @@ "js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="], - "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + "js-yaml": ["js-yaml@4.3.2", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA=="], "jsep": ["jsep@1.4.0", "", {}, "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw=="], @@ -2680,7 +2683,7 @@ "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], - "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + "json-p3": ["json-p3@2.2.2", "", {}, "sha512-TmTgkx+C1ne8Wdm9dFQ4/jCeYYbSoeYJAkRpvTz6O+zWN1Dc3cKW8Mt52sa8mSRXy/+JykA5I6rmM+k8h+JRRg=="], "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], @@ -2698,7 +2701,7 @@ "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], - "jsonc-parser": ["jsonc-parser@2.2.1", "", {}, "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w=="], + "jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="], "jsondiffpatch": ["jsondiffpatch@0.6.0", "", { "dependencies": { "@types/diff-match-patch": "^1.0.36", "chalk": "^5.3.0", "diff-match-patch": "^1.0.5" }, "bin": { "jsondiffpatch": "bin/jsondiffpatch.js" } }, "sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ=="], @@ -2720,6 +2723,8 @@ "katex": ["katex@0.16.35", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-S0+riEvy1CK4VKse1ivMff8gmabe/prY7sKB3njjhyoLLsNFDQYtKNgXrbWUggGDCJBz7Fctl5i8fLCESHXzSg=="], + "keytar": ["keytar@7.9.0", "", { "dependencies": { "node-addon-api": "^4.3.0", "prebuild-install": "^7.0.1" } }, "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ=="], + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="], @@ -2766,7 +2771,7 @@ "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.31.1", "", { "os": "win32", "cpu": "x64" }, "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw=="], - "lilconfig": ["lilconfig@2.1.0", "", {}, "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ=="], + "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], @@ -2964,14 +2969,14 @@ "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], - "minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="], + "minizlib": ["minizlib@3.1.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="], - "mintlify": ["mintlify@4.2.407", "", { "dependencies": { "@mintlify/cli": "4.0.1010" }, "bin": { "mintlify": "index.js" } }, "sha512-jDHEq7tDadH2gStxIJuYqyxhR8EzssB67O+k6S7ek27nT9FDYJMZvulqVudlxy9syiaZQnVWWqtBsgOrQgYpAQ=="], - - "mitt": ["mitt@3.0.1", "", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="], + "mintlify": ["mintlify@4.2.933", "", { "dependencies": { "@mintlify/cli": "4.0.1536" }, "bin": { "mintlify": "index.js" } }, "sha512-eWvSdK3xyjjY3r9kxLhbTeJpxb2HnQ7fDxhY2UEiL1WZw4VntZROuFsMBrz6U8ff8WpLgyjg6QAn62QlstuXug=="], "mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], + "mkdirp-classic": ["mkdirp-classic@0.5.3", "", {}, "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="], + "mnemonist": ["mnemonist@0.38.3", "", { "dependencies": { "obliterator": "^1.6.1" } }, "sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw=="], "modern-ahocorasick": ["modern-ahocorasick@1.1.0", "", {}, "sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ=="], @@ -2994,17 +2999,17 @@ "nanostores": ["nanostores@1.1.1", "", {}, "sha512-EYJqS25r2iBeTtGQCHidXl1VfZ1jXM7Q04zXJOrMlxVVmD0ptxJaNux92n1mJ7c5lN3zTq12MhH/8x59nP+qmg=="], + "napi-build-utils": ["napi-build-utils@2.0.0", "", {}, "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA=="], + "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], "neotraverse": ["neotraverse@0.6.18", "", {}, "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA=="], - "netmask": ["netmask@2.0.2", "", {}, "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg=="], - "neverthrow": ["neverthrow@8.2.0", "", { "optionalDependencies": { "@rollup/rollup-linux-x64-gnu": "^4.24.0" } }, "sha512-kOCT/1MCPAxY5iUV3wytNFUMUolzuwd/VF/1KCx7kf6CutrOsTie+84zTGTpgQycjvfLdBBdvBvFLqFD2c0wkQ=="], "next": ["next@16.1.6", "", { "dependencies": { "@next/env": "16.1.6", "@swc/helpers": "0.5.15", "baseline-browser-mapping": "^2.8.3", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.1.6", "@next/swc-darwin-x64": "16.1.6", "@next/swc-linux-arm64-gnu": "16.1.6", "@next/swc-linux-arm64-musl": "16.1.6", "@next/swc-linux-x64-gnu": "16.1.6", "@next/swc-linux-x64-musl": "16.1.6", "@next/swc-win32-arm64-msvc": "16.1.6", "@next/swc-win32-x64-msvc": "16.1.6", "sharp": "^0.34.4" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw=="], - "next-mdx-remote-client": ["next-mdx-remote-client@1.1.6", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@mdx-js/mdx": "^3.1.1", "@mdx-js/react": "^3.1.1", "remark-mdx-remove-esm": "^1.2.3", "serialize-error": "^13.0.1", "vfile": "^6.0.3", "vfile-matter": "^5.0.1" }, "peerDependencies": { "react": ">= 18.3.0 < 19.0.0", "react-dom": ">= 18.3.0 < 19.0.0" } }, "sha512-O4HIpi44d6SismhfG5W78aTUfgxfbsj6FgoM4/G3o4Vtcobt0Ej439IiDPkv+IqsmtouVYG1tGAsz1DIuj9Tfg=="], + "next-mdx-remote-client": ["next-mdx-remote-client@2.1.12", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@mdx-js/mdx": "^3.1.1", "@mdx-js/react": "^3.1.1", "@types/mdx": "^2.0.14", "remark-mdx-remove-esm": "^1.3.2", "serialize-error": "^13.0.1", "vfile": "^6.0.3", "vfile-matter": "^5.0.1" }, "peerDependencies": { "react": ">= 19.1.0", "react-dom": ">= 19.1.0" } }, "sha512-KDfhIk5aEM0kkZ0xQ8XBkmo4O5xmJeGWUomm40Ac/xhkt5sIDOTmTU/QFfmJGLJUJipD5o0BAHqVSIZKuXgNEw=="], "next-themes": ["next-themes@0.4.6", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="], @@ -3012,6 +3017,10 @@ "nlcst-to-string": ["nlcst-to-string@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0" } }, "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA=="], + "node-abi": ["node-abi@3.96.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-rebQ/lz7i0EkoLzUVSrKRzA69zMkwLp95kKMWoMDkkM00Suxz0D7zEQPwRml5fQum24mj7bPvmlgLAmu2JCiYg=="], + + "node-addon-api": ["node-addon-api@4.3.0", "", {}, "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ=="], + "node-cache": ["node-cache@5.1.2", "", { "dependencies": { "clone": "2.x" } }, "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg=="], "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], @@ -3034,6 +3043,8 @@ "npm-run-path": ["npm-run-path@6.0.0", "", { "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" } }, "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA=="], + "oauth4webapi": ["oauth4webapi@3.8.8", "", {}, "sha512-8N28E+a/oxfXWBgOMt+ZP/JUf/XR+IFbvkAEPP3gznXOMv9BpAAwiIj0TFNz3tGTPc0ZQ8zmWBNgN1nAys0gng=="], + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], "object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="], @@ -3074,8 +3085,12 @@ "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="], + "openid-client": ["openid-client@6.8.2", "", { "dependencies": { "jose": "^6.1.3", "oauth4webapi": "^3.8.4" } }, "sha512-uOvTCndr4udZsKihJ68H9bUICrriHdUVJ6Az+4Ns6cW55rwM5h0bjVIzDz2SxgOI84LKjFyjOFvERLzdTUROGA=="], + "opossum": ["opossum@9.0.0", "", {}, "sha512-K76U0QkxOfUZamneQuzz+AP0fyfTJcCplZ2oZL93nxeupuJbN4s6uFNbmVCt4eWqqGqRnnowdFuBicJ1fLMVxw=="], + "orderedmap": ["orderedmap@2.1.1", "", {}, "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g=="], + "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], "p-any": ["p-any@4.0.0", "", { "dependencies": { "p-cancelable": "^3.0.0", "p-some": "^6.0.0" } }, "sha512-S/B50s+pAVe0wmEZHmBs/9yJXeZ5KhHzOsgKzt0hRdgkoR3DxW9ts46fcsWi/r3VnzsnkKS7q4uimze+zjdryw=="], @@ -3090,20 +3105,12 @@ "p-timeout": ["p-timeout@5.1.0", "", {}, "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew=="], - "pac-proxy-agent": ["pac-proxy-agent@7.2.0", "", { "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.6", "pac-resolver": "^7.0.1", "socks-proxy-agent": "^8.0.5" } }, "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA=="], - - "pac-resolver": ["pac-resolver@7.0.1", "", { "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" } }, "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg=="], - "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], - "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], - "parse-latin": ["parse-latin@7.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "@types/unist": "^3.0.0", "nlcst-to-string": "^4.0.0", "unist-util-modify-children": "^4.0.0", "unist-util-visit-children": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ=="], "parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="], @@ -3122,6 +3129,10 @@ "patch-console": ["patch-console@2.0.0", "", {}, "sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA=="], + "path-expression-matcher": ["path-expression-matcher@1.6.2", "", {}, "sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], @@ -3136,8 +3147,6 @@ "peberminta": ["peberminta@0.9.0", "", {}, "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ=="], - "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="], - "pg": ["pg@8.20.0", "", { "dependencies": { "pg-connection-string": "^2.12.0", "pg-pool": "^3.13.0", "pg-protocol": "^1.13.0", "pg-types": "2.2.0", "pgpass": "1.0.5" }, "optionalDependencies": { "pg-cloudflare": "^1.3.0" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA=="], "pg-cloudflare": ["pg-cloudflare@1.3.0", "", {}, "sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ=="], @@ -3206,6 +3215,8 @@ "preact": ["preact@10.28.4", "", {}, "sha512-uKFfOHWuSNpRFVTnljsCluEFq57OKT+0QdOiQo8XWnQ/pSvg7OpX5eNOejELXJMWy+BwM2nobz0FkvzmnpCNsQ=="], + "prebuild-install": ["prebuild-install@7.1.3", "", { "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", "simple-get": "^4.0.0", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, "bin": { "prebuild-install": "bin.js" } }, "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug=="], + "prettier": ["prettier@3.8.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg=="], "pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], @@ -3224,22 +3235,18 @@ "property-information": ["property-information@6.5.0", "", {}, "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig=="], + "prosemirror-model": ["prosemirror-model@1.25.12", "", { "dependencies": { "orderedmap": "^2.0.0" } }, "sha512-Ue2gTmXMa7EhpLNhC7J+h4+ykD8ha12K6rrZFFKKJHBForfIStw5gJ6Zrf1mqqAa9NmpmEB4wp9bKmA4eUVjWg=="], + "protobufjs": ["protobufjs@7.5.4", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg=="], "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], - "proxy-agent": ["proxy-agent@6.5.0", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "http-proxy-agent": "^7.0.1", "https-proxy-agent": "^7.0.6", "lru-cache": "^7.14.1", "pac-proxy-agent": "^7.1.0", "proxy-from-env": "^1.1.0", "socks-proxy-agent": "^8.0.5" } }, "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A=="], - "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], "public-ip": ["public-ip@5.0.0", "", { "dependencies": { "dns-socket": "^4.2.2", "got": "^12.0.0", "is-ip": "^3.1.0" } }, "sha512-xaH3pZMni/R2BG7ZXXaWS9Wc9wFlhyDVJF47IJ+3ali0TGv+2PsckKxbmo+rnx3ZxiV2wblVhtdS3bohAP6GGw=="], "pump": ["pump@3.0.4", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA=="], - "puppeteer": ["puppeteer@22.14.0", "", { "dependencies": { "@puppeteer/browsers": "2.3.0", "cosmiconfig": "^9.0.0", "devtools-protocol": "0.0.1312386", "puppeteer-core": "22.14.0" }, "bin": { "puppeteer": "lib/esm/puppeteer/node/cli.js" } }, "sha512-MGTR6/pM8zmWbTdazb6FKnwIihzsSEXBPH49mFFU96DNZpQOevCAZMnjBZGlZRGRzRK6aADCavR6SQtrbv5dQw=="], - - "puppeteer-core": ["puppeteer-core@22.14.0", "", { "dependencies": { "@puppeteer/browsers": "2.3.0", "chromium-bidi": "0.6.2", "debug": "^4.3.5", "devtools-protocol": "0.0.1312386", "ws": "^8.18.0" } }, "sha512-rl4tOY5LcA3e374GAlsGGHc05HL3eGNf5rZ+uxkl6id9zVZKcwcp1Z+Nd6byb6WPiPeecT/dwz8f/iUm+AZQSw=="], - "pvtsutils": ["pvtsutils@1.3.6", "", { "dependencies": { "tslib": "^2.8.1" } }, "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg=="], "pvutils": ["pvutils@1.1.5", "", {}, "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA=="], @@ -3264,6 +3271,10 @@ "raw-body": ["raw-body@3.0.2", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.7.0", "unpipe": "~1.0.0" } }, "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA=="], + "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], + + "re2js": ["re2js@2.8.6", "", {}, "sha512-xLgQil4kIUCrAzVk9fRSkxkFNwmygLFjVxXrLc65aE1F0+Zsb8rxumFBy4XKyvgMCTL6kilDq3EZ0piE2dP/Dg=="], + "react": ["react@19.2.4", "", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="], "react-dom": ["react-dom@19.2.4", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.4" } }, "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ=="], @@ -3334,13 +3345,13 @@ "remark-frontmatter": ["remark-frontmatter@5.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-frontmatter": "^2.0.0", "micromark-extension-frontmatter": "^2.0.0", "unified": "^11.0.0" } }, "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ=="], - "remark-gfm": ["remark-gfm@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA=="], + "remark-gfm": ["remark-gfm@4.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="], "remark-math": ["remark-math@6.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-math": "^3.0.0", "micromark-extension-math": "^3.0.0", "unified": "^11.0.0" } }, "sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA=="], - "remark-mdx": ["remark-mdx@3.1.0", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA=="], + "remark-mdx": ["remark-mdx@3.1.1", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg=="], - "remark-mdx-remove-esm": ["remark-mdx-remove-esm@1.2.3", "", { "dependencies": { "@types/mdast": "^4.0.4", "mdast-util-mdxjs-esm": "^2.0.1", "unist-util-remove": "^4.0.0" }, "peerDependencies": { "unified": "^11" } }, "sha512-n6r36SaE+7cno7pmshWbGzYolDVLxJm5EKuw67+q4SPQT6kelNJHyZAiFYYtOB0axh+/1xF4BC57Ec3jncAGXQ=="], + "remark-mdx-remove-esm": ["remark-mdx-remove-esm@1.3.3", "", { "dependencies": { "@types/mdast": "^4.0.4", "unist-util-remove": "^4.0.0" }, "peerDependencies": { "unified": "^11" } }, "sha512-KgGfD4JV3lKse0n/m8UxW4jK6H/9ffkCVxVAJ60aGY4uiPX/+SQCT5/lQcRGcjyQuRLDq2Df2krv6pD/qWJRVw=="], "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], @@ -3354,14 +3365,14 @@ "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + "reselect": ["reselect@5.3.0", "", {}, "sha512-XGoLeRAVzUTcJ1qkxPQhDJyIZ5d6zzZD9nT7AEZOaaU9UbWclhycElmhO+VD5bFeLuzhPBaOV2oXC8uG35ZSpg=="], + "resend": ["resend@4.8.0", "", { "dependencies": { "@react-email/render": "1.1.2" } }, "sha512-R8eBOFQDO6dzRTDmaMEdpqrkmgSjPpVXt4nGfWsZdYOet0kqra0xgbvTES6HmCriZEXbmGk3e0DiGIaLFTFSHA=="], "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], "resolve-alpn": ["resolve-alpn@1.2.1", "", {}, "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="], - "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "responselike": ["responselike@3.0.0", "", { "dependencies": { "lowercase-keys": "^3.0.0" } }, "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg=="], @@ -3468,15 +3479,17 @@ "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + "simple-concat": ["simple-concat@1.0.1", "", {}, "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="], + "simple-eval": ["simple-eval@1.0.1", "", { "dependencies": { "jsep": "^1.3.6" } }, "sha512-LH7FpTAkeD+y5xQC4fzS+tFtaNlvt3Ib1zKzvhjv/Y+cioV4zIuw4IZr2yhRLu67CWL7FR9/6KXKnjRoZTvGGQ=="], + "simple-get": ["simple-get@4.0.1", "", { "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA=="], + "simple-swizzle": ["simple-swizzle@0.2.4", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw=="], "slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="], - "smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="], - - "socket.io": ["socket.io@4.7.2", "", { "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "cors": "~2.8.5", "debug": "~4.3.2", "engine.io": "~6.5.2", "socket.io-adapter": "~2.5.2", "socket.io-parser": "~4.2.4" } }, "sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw=="], + "socket.io": ["socket.io@4.8.0", "", { "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "cors": "~2.8.5", "debug": "~4.3.2", "engine.io": "~6.6.0", "socket.io-adapter": "~2.5.2", "socket.io-parser": "~4.2.4" } }, "sha512-8U6BEgGjQOfGz3HHTYaC/L1GaxDCJ/KM0XTkJly0EhZ5U/du9uNEZy4ZgYzEzIqlx2CMm25CrCqr1ck899eLNA=="], "socket.io-adapter": ["socket.io-adapter@2.5.6", "", { "dependencies": { "debug": "~4.4.1", "ws": "~8.18.3" } }, "sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ=="], @@ -3484,10 +3497,6 @@ "socket.io-parser": ["socket.io-parser@4.2.5", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.4.1" } }, "sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ=="], - "socks": ["socks@2.8.7", "", { "dependencies": { "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" } }, "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A=="], - - "socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="], - "sonic-boom": ["sonic-boom@4.2.1", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q=="], "sonner": ["sonner@2.0.7", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w=="], @@ -3510,14 +3519,14 @@ "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], + "standardwebhooks": ["standardwebhooks@1.1.1", "", { "dependencies": { "@stablelib/base64": "^1.0.0", "fast-sha256": "^1.3.0" } }, "sha512-bCbX9ZEyFkWPsRz7Bl3NuQUJohmwGSev/yhr7vhaGPlc4AfIrspIRa6cPTBuI1ItmrTDJ4d/S2hCsfe4+vQGnQ=="], + "statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], "std-env": ["std-env@3.10.0", "", {}, "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg=="], "stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="], - "streamx": ["streamx@2.23.0", "", { "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" } }, "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg=="], - "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -3542,6 +3551,8 @@ "strip-indent": ["strip-indent@3.0.0", "", { "dependencies": { "min-indent": "^1.0.0" } }, "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ=="], + "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "strip-literal": ["strip-literal@3.1.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg=="], "strnum": ["strnum@2.2.0", "", {}, "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg=="], @@ -3550,11 +3561,11 @@ "style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="], - "style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="], + "style-to-object": ["style-to-object@0.4.4", "", { "dependencies": { "inline-style-parser": "0.1.1" } }, "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg=="], "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], - "sucrase": ["sucrase@3.35.1", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw=="], + "sucrase": ["sucrase@3.34.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "7.1.6", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw=="], "suffix-thumb": ["suffix-thumb@5.0.2", "", {}, "sha512-I5PWXAFKx3FYnI9a+dQMWNqTxoRt6vdBdb0O+BJ1sxXCWtSoQCusc13E58f+9p4MYx/qCnEMkD5jac6K2j3dgA=="], @@ -3574,20 +3585,18 @@ "tailwindcss": ["tailwindcss@4.2.1", "", {}, "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw=="], + "tailwindcss-v3": ["tailwindcss@3.4.17", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.6", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.2", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og=="], + "tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="], - "tar": ["tar@6.1.15", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A=="], + "tar": ["tar@7.5.21", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-XdhtCvlMywwxpCW8YEq3lOXBJpUPTR2OHHcwLPO3HwsJqOHa2Ok/oJ7ruGzp+JrKoRPVCzJwAdEjqLW/vNRPHA=="], - "tar-fs": ["tar-fs@3.1.2", "", { "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" }, "optionalDependencies": { "bare-fs": "^4.0.1", "bare-path": "^3.0.0" } }, "sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw=="], + "tar-fs": ["tar-fs@2.1.5", "", { "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw=="], - "tar-stream": ["tar-stream@3.1.8", "", { "dependencies": { "b4a": "^1.6.4", "bare-fs": "^4.5.5", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ=="], - - "teex": ["teex@1.0.1", "", { "dependencies": { "streamx": "^2.12.5" } }, "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg=="], + "tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], "terser": ["terser@5.16.9", "", { "dependencies": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg=="], - "text-decoder": ["text-decoder@1.2.7", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ=="], - "text-hex": ["text-hex@1.0.0", "", {}, "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="], "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], @@ -3598,8 +3607,6 @@ "throttleit": ["throttleit@2.1.0", "", {}, "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw=="], - "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], - "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], "tiny-lru": ["tiny-lru@11.4.7", "", {}, "sha512-w/Te7uMUVeH0CR8vZIjr+XiN41V+30lkDdK+NRIDCUYKKuL9VcmaUEmaPISuwGhLlrTGh5yu18lENtR9axSxYw=="], @@ -3652,6 +3659,8 @@ "tsyringe": ["tsyringe@4.10.0", "", { "dependencies": { "tslib": "^1.9.3" } }, "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw=="], + "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], + "turbo": ["turbo@2.8.13", "", { "optionalDependencies": { "turbo-darwin-64": "2.8.13", "turbo-darwin-arm64": "2.8.13", "turbo-linux-64": "2.8.13", "turbo-linux-arm64": "2.8.13", "turbo-windows-64": "2.8.13", "turbo-windows-arm64": "2.8.13" }, "bin": { "turbo": "bin/turbo" } }, "sha512-nyM99hwFB9/DHaFyKEqatdayGjsMNYsQ/XBNO6MITc7roncZetKb97MpHxWf3uiU+LB9c9HUlU3Jp2Ixei2k1A=="], "turbo-darwin-64": ["turbo-darwin-64@2.8.13", "", { "os": "darwin", "cpu": "x64" }, "sha512-PmOvodQNiOj77+Zwoqku70vwVjKzL34RTNxxoARjp5RU5FOj/CGiC6vcDQhNtFPUOWSAaogHF5qIka9TBhX4XA=="], @@ -3692,8 +3701,6 @@ "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], - "unbzip2-stream": ["unbzip2-stream@1.4.3", "", { "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" } }, "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg=="], - "unconfig": ["unconfig@7.5.0", "", { "dependencies": { "@quansync/fs": "^1.0.0", "defu": "^6.1.4", "jiti": "^2.6.1", "quansync": "^1.0.0", "unconfig-core": "7.5.0" } }, "sha512-oi8Qy2JV4D3UQ0PsopR28CzdQ3S/5A1zwsUwp/rosSbfhJ5z7b90bIyTwi/F7hCLD4SGcZVjDzd4XoUQcEanvA=="], "unconfig-core": ["unconfig-core@7.5.0", "", { "dependencies": { "@quansync/fs": "^1.0.0", "quansync": "^1.0.0" } }, "sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w=="], @@ -3838,6 +3845,8 @@ "wsl-utils": ["wsl-utils@0.1.0", "", { "dependencies": { "is-wsl": "^3.1.0" } }, "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw=="], + "xml-naming": ["xml-naming@0.3.0", "", {}, "sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ=="], + "xml2js": ["xml2js@0.6.2", "", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA=="], "xmlbuilder": ["xmlbuilder@11.0.1", "", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="], @@ -3852,7 +3861,7 @@ "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], - "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], "yaml": ["yaml@2.8.2", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="], @@ -3860,8 +3869,6 @@ "yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], - "yauzl": ["yauzl@2.10.0", "", { "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g=="], - "yocto-spinner": ["yocto-spinner@1.1.0", "", { "dependencies": { "yoctocolors": "^2.1.1" } }, "sha512-/BY0AUXnS7IKO354uLLA2eRcWiqDifEbd6unXCsOxkFDAkhgUL3PH9X2bFoaU0YchnDXsF+iKleeTLJGckbXfA=="], "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="], @@ -4034,6 +4041,16 @@ "@babel/plugin-syntax-decorators/@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@8.0.1", "", { "peerDependencies": { "@babel/core": "^8.0.0" } }, "sha512-3PKFgjTyPlhFhorfP+SjKQxLViIL++zWjFOO4hGriYU+Bsm983DxEM1JmDRJVWXV0O9npu+xXRqz7Pbd3mh70g=="], + "@base-ui/react/@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="], + + "@base-ui/react/@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.9", "", { "dependencies": { "@floating-ui/dom": "^1.8.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg=="], + + "@base-ui/react/@floating-ui/utils": ["@floating-ui/utils@0.2.12", "", {}, "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww=="], + + "@base-ui/utils/@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="], + + "@base-ui/utils/@floating-ui/utils": ["@floating-ui/utils@0.2.12", "", {}, "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww=="], + "@better-auth/core/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], "@cloudflare/ai-chat/agents": ["agents@0.4.1", "", { "dependencies": { "@cfworker/json-schema": "^4.1.1", "@modelcontextprotocol/sdk": "1.26.0", "cron-schedule": "^6.0.0", "escape-html": "^1.0.3", "json-schema": "^0.4.0", "json-schema-to-typescript": "^15.0.4", "mimetext": "^3.0.28", "nanoid": "^5.1.6", "partyserver": "^0.1.4", "partysocket": "1.1.13", "yargs": "^18.0.0" }, "peerDependencies": { "@ai-sdk/openai": "^3.0.0", "@ai-sdk/react": "^3.0.0", "@cloudflare/ai-chat": "^0.0.8", "@cloudflare/codemode": "^0.0.7", "@x402/core": "^2.0.0", "@x402/evm": "^2.0.0", "ai": "^6.0.0", "react": "^19.0.0", "viem": ">=2.0.0", "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["@ai-sdk/openai", "@ai-sdk/react", "@x402/core", "@x402/evm", "viem"], "bin": { "agents": "dist/cli/index.js" } }, "sha512-1ARZ5AXpPEn1+Wv/Dt++nH3iLStDxlci7Bm47sfE6qLlJpY9oG5nzyH2TRKwFFt9bMAgYz177i6p2NiEd/coVQ=="], @@ -4082,31 +4099,47 @@ "@mastra/core/p-retry": ["p-retry@7.1.1", "", { "dependencies": { "is-network-error": "^1.1.0" } }, "sha512-J5ApzjyRkkf601HpEeykoiCvzHQjWxPAHhyjFcEUP2SWq0+35NKh8TLhpLw+Dkq5TZBFvUM6UigdE9hIVYTl5w=="], + "@mdx-js/mdx/@types/mdx": ["@types/mdx@2.0.13", "", {}, "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw=="], + + "@mdx-js/mdx/remark-mdx": ["remark-mdx@3.1.0", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA=="], + "@mdx-js/mdx/remark-rehype": ["remark-rehype@11.1.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="], "@mdx-js/mdx/source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], + "@mdx-js/react/@types/mdx": ["@types/mdx@2.0.13", "", {}, "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw=="], + + "@mintlify/cli/@anthropic-ai/sdk": ["@anthropic-ai/sdk@0.120.0", "", { "dependencies": { "json-schema-to-ts": "^3.1.1", "standardwebhooks": "^1.0.0" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["zod"], "bin": { "anthropic-ai-sdk": "bin/cli" } }, "sha512-ZlvmNFT/iIF6JD13rxbbMWD8nvGR0RaUp6yMQnoc+4Af0YjVVe/bIdW1XSQQsoxXAtg1NaT6Vak0LKFlJ4d37Q=="], + "@mintlify/cli/chalk": ["chalk@5.2.0", "", {}, "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA=="], "@mintlify/cli/inquirer": ["inquirer@12.3.0", "", { "dependencies": { "@inquirer/core": "^10.1.2", "@inquirer/prompts": "^7.2.1", "@inquirer/type": "^3.0.2", "ansi-escapes": "^4.3.2", "mute-stream": "^2.0.0", "run-async": "^3.0.0", "rxjs": "^7.8.1" }, "peerDependencies": { "@types/node": ">=18" } }, "sha512-3NixUXq+hM8ezj2wc7wC37b32/rHq1MwNZDYdvx+d6jokOD+r+i8Q4Pkylh9tISYP114A128LCX8RKhopC5RfQ=="], + "@mintlify/cli/open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="], + + "@mintlify/cli/posthog-node": ["posthog-node@5.17.2", "", { "dependencies": { "@posthog/core": "1.7.1" } }, "sha512-lz3YJOr0Nmiz0yHASaINEDHqoV+0bC3eD8aZAG+Ky292dAnVYul+ga/dMX8KCBXg8hHfKdxw0SztYD5j6dgUqQ=="], + "@mintlify/cli/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], + "@mintlify/cli/yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], + "@mintlify/cli/yargs": ["yargs@17.7.1", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw=="], + "@mintlify/cli/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], + "@mintlify/common/@sindresorhus/slugify": ["@sindresorhus/slugify@2.2.0", "", { "dependencies": { "@sindresorhus/transliterate": "^1.0.0", "escape-string-regexp": "^5.0.0" } }, "sha512-9Vybc/qX8Kj6pxJaapjkFbiUJPk7MAkCh/GFCxIBnnsuYCFPIXKvnLidG8xlepht3i24L5XemUmGtrJ3UWrl6w=="], "@mintlify/common/acorn": ["acorn@8.11.2", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w=="], - "@mintlify/common/lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + "@mintlify/common/lodash": ["lodash@4.18.1", "", {}, "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q=="], "@mintlify/common/mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.1.3", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ=="], - "@mintlify/common/postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + "@mintlify/common/postcss": ["postcss@8.5.23", "", { "dependencies": { "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg=="], - "@mintlify/common/tailwindcss": ["tailwindcss@3.4.4", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.5.3", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.0", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.0", "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.0.0", "postcss": "^8.4.23", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.1", "postcss-nested": "^6.0.1", "postcss-selector-parser": "^6.0.11", "resolve": "^1.22.2", "sucrase": "^3.32.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A=="], + "@mintlify/common/remark-gfm": ["remark-gfm@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA=="], - "@mintlify/link-rot/@mintlify/scraping": ["@mintlify/scraping@4.0.522", "", { "dependencies": { "@mintlify/common": "1.0.661", "@mintlify/openapi-parser": "^0.0.8", "fs-extra": "11.1.1", "hast-util-to-mdast": "10.1.0", "js-yaml": "4.1.0", "mdast-util-mdx-jsx": "3.1.3", "neotraverse": "0.6.18", "puppeteer": "22.14.0", "rehype-parse": "9.0.1", "remark-gfm": "4.0.0", "remark-mdx": "3.0.1", "remark-parse": "11.0.0", "remark-stringify": "11.0.0", "unified": "11.0.5", "unist-util-visit": "5.0.0", "yargs": "17.7.1", "zod": "3.21.4" }, "bin": { "mintlify-scrape": "bin/cli.js" } }, "sha512-PL2k52WT5S5OAgnT2K13bP7J2El6XwiVvQlrLvxDYw5KMMV+y34YVJI8ZscKb4trjitWDgyK0UTq2KN6NQgn6g=="], + "@mintlify/common/remark-mdx": ["remark-mdx@3.1.0", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA=="], "@mintlify/link-rot/fs-extra": ["fs-extra@11.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw=="], @@ -4114,45 +4147,49 @@ "@mintlify/mdx/mdast-util-gfm": ["mdast-util-gfm@3.1.0", "", { "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" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="], - "@mintlify/mdx/remark-gfm": ["remark-gfm@4.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="], + "@mintlify/models/axios": ["axios@1.18.0", "", { "dependencies": { "follow-redirects": "^1.16.0", "form-data": "^4.0.5", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } }, "sha512-E32NzpYKp++W7XRe52rHiXV2ehxmh3wbdgO7MHeFM+vqxLBYHzt0ElkiImtOBxtOmyp0yoC8C6uESVV84Y2/hw=="], "@mintlify/prebuild/chalk": ["chalk@5.3.0", "", {}, "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w=="], + "@mintlify/prebuild/fflate": ["fflate@0.8.3", "", {}, "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA=="], + "@mintlify/prebuild/fs-extra": ["fs-extra@11.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw=="], "@mintlify/prebuild/sharp": ["sharp@0.33.5", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.6.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.33.5", "@img/sharp-darwin-x64": "0.33.5", "@img/sharp-libvips-darwin-arm64": "1.0.4", "@img/sharp-libvips-darwin-x64": "1.0.4", "@img/sharp-libvips-linux-arm": "1.0.5", "@img/sharp-libvips-linux-arm64": "1.0.4", "@img/sharp-libvips-linux-s390x": "1.0.4", "@img/sharp-libvips-linux-x64": "1.0.4", "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", "@img/sharp-libvips-linuxmusl-x64": "1.0.4", "@img/sharp-linux-arm": "0.33.5", "@img/sharp-linux-arm64": "0.33.5", "@img/sharp-linux-s390x": "0.33.5", "@img/sharp-linux-x64": "0.33.5", "@img/sharp-linuxmusl-arm64": "0.33.5", "@img/sharp-linuxmusl-x64": "0.33.5", "@img/sharp-wasm32": "0.33.5", "@img/sharp-win32-ia32": "0.33.5", "@img/sharp-win32-x64": "0.33.5" } }, "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw=="], - "@mintlify/prebuild/unist-util-visit": ["unist-util-visit@4.1.2", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0", "unist-util-visit-parents": "^5.1.1" } }, "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg=="], - - "@mintlify/prebuild/uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], + "@mintlify/prebuild/uuid": ["uuid@11.1.1", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ=="], "@mintlify/previewing/chalk": ["chalk@5.2.0", "", {}, "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA=="], "@mintlify/previewing/chokidar": ["chokidar@3.5.3", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw=="], - "@mintlify/previewing/express": ["express@4.18.2", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "1.2.0", "fresh": "0.5.2", "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", "serve-static": "1.15.0", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ=="], + "@mintlify/previewing/express": ["express@4.22.0", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "~1.20.3", "content-disposition": "~0.5.4", "content-type": "~1.0.4", "cookie": "~0.7.1", "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "~1.3.1", "fresh": "~0.5.2", "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "~2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "~0.19.0", "serve-static": "~1.16.2", "setprototypeof": "1.2.0", "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-c2iPh3xp5vvCLgaHK03+mWLFPhox7j1LwyxcZwFVApEv5i0X+IjPpbT50SJJwwLpdBVfp45AkK/v+AFgv/XlfQ=="], "@mintlify/previewing/fs-extra": ["fs-extra@11.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw=="], "@mintlify/previewing/react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], - "@mintlify/previewing/unist-util-visit": ["unist-util-visit@4.1.2", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0", "unist-util-visit-parents": "^5.1.1" } }, "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg=="], - "@mintlify/previewing/yargs": ["yargs@17.7.1", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw=="], + "@mintlify/scraping/fast-xml-parser": ["fast-xml-parser@5.7.3", "", { "dependencies": { "@nodable/entities": "^2.1.0", "fast-xml-builder": "^1.1.7", "path-expression-matcher": "^1.5.0", "strnum": "^2.2.3" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg=="], + "@mintlify/scraping/fs-extra": ["fs-extra@11.1.1", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ=="], + "@mintlify/scraping/graphql": ["graphql@16.11.0", "", {}, "sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw=="], + "@mintlify/scraping/mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.1.3", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ=="], + "@mintlify/scraping/remark-gfm": ["remark-gfm@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA=="], + "@mintlify/scraping/remark-mdx": ["remark-mdx@3.0.1", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA=="], "@mintlify/scraping/yargs": ["yargs@17.7.1", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw=="], "@mintlify/scraping/zod": ["zod@3.24.0", "", {}, "sha512-Hz+wiY8yD0VLA2k/+nsg2Abez674dDGTai33SwNvMPuf9uIrBC9eFgIMQxBBbHFxVXi8W+5nX9DcAh9YNSQm/w=="], - "@mintlify/validation/lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + "@mintlify/validation/lodash": ["lodash@4.18.1", "", {}, "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q=="], - "@mintlify/validation/uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], + "@mintlify/validation/uuid": ["uuid@11.1.1", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ=="], "@mintlify/validation/zod": ["zod@3.24.0", "", {}, "sha512-Hz+wiY8yD0VLA2k/+nsg2Abez674dDGTai33SwNvMPuf9uIrBC9eFgIMQxBBbHFxVXi8W+5nX9DcAh9YNSQm/w=="], @@ -4222,7 +4259,7 @@ "@poppinss/dumper/supports-color": ["supports-color@10.2.2", "", {}, "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g=="], - "@puppeteer/browsers/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + "@posthog/mcp/@posthog/core": ["@posthog/core@1.55.2", "", { "dependencies": { "@posthog/types": "^1.412.4" } }, "sha512-2mYxGbDmTLUs096VbcZqSWo0lrI48/BrX65r54NynxxFq409BOx9w73HxOAtOKZ1vblkdV6/GxQTe7KDcIQidg=="], "@radix-ui/react-alert-dialog/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "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" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], @@ -4286,6 +4323,8 @@ "@stoplight/better-ajv-errors/leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="], + "@stoplight/json/jsonc-parser": ["jsonc-parser@2.2.1", "", {}, "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w=="], + "@stoplight/json/safe-stable-stringify": ["safe-stable-stringify@1.1.1", "", {}, "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw=="], "@stoplight/json-ref-readers/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], @@ -4394,14 +4433,12 @@ "better-opn/open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="], + "bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + "body-parser/http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], "cacheable-request/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], - "chromium-bidi/urlpattern-polyfill": ["urlpattern-polyfill@10.0.0", "", {}, "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg=="], - - "chromium-bidi/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], - "cli-truncate/slice-ansi": ["slice-ansi@5.0.0", "", { "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" } }, "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ=="], "cloudflare/@types/node": ["@types/node@18.19.130", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg=="], @@ -4412,8 +4449,6 @@ "concurrently/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], - "cosmiconfig/env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], - "decompress-response/mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], "docs-test/@ai-sdk/anthropic": ["@ai-sdk/anthropic@3.0.58", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.19" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-/53SACgmVukO4bkms4dpxpRlYhW8Ct6QZRe6sj1Pi5H00hYhxIrqfiLbZBGxkdRvjsBQeP/4TVGsXgH5rQeb8Q=="], @@ -4440,24 +4475,18 @@ "engine.io/accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], - "engine.io/cookie": ["cookie@0.4.2", "", {}, "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA=="], + "engine.io/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], - "engine.io/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], - - "engine.io/ws": ["ws@8.17.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ=="], + "engine.io/ws": ["ws@8.21.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw=="], "engine.io-client/ws": ["ws@8.18.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg=="], "enquirer/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "error-ex/is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], - "estree-util-to-js/source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], "express/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], - "extract-zip/get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], - "favicons/sharp": ["sharp@0.33.5", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.6.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.33.5", "@img/sharp-darwin-x64": "0.33.5", "@img/sharp-libvips-darwin-arm64": "1.0.4", "@img/sharp-libvips-darwin-x64": "1.0.4", "@img/sharp-libvips-linux-arm": "1.0.5", "@img/sharp-libvips-linux-arm64": "1.0.4", "@img/sharp-libvips-linux-s390x": "1.0.4", "@img/sharp-libvips-linux-x64": "1.0.4", "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", "@img/sharp-libvips-linuxmusl-x64": "1.0.4", "@img/sharp-linux-arm": "0.33.5", "@img/sharp-linux-arm64": "0.33.5", "@img/sharp-linux-s390x": "0.33.5", "@img/sharp-linux-x64": "0.33.5", "@img/sharp-linuxmusl-arm64": "0.33.5", "@img/sharp-linuxmusl-x64": "0.33.5", "@img/sharp-wasm32": "0.33.5", "@img/sharp-win32-ia32": "0.33.5", "@img/sharp-win32-x64": "0.33.5" } }, "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw=="], "fetch-blob/web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], @@ -4472,14 +4501,10 @@ "front-matter/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], - "fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], - "gaxios/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], "gaxios/node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], - "get-uri/data-uri-to-buffer": ["data-uri-to-buffer@6.0.2", "", {}, "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw=="], - "got/@sindresorhus/is": ["@sindresorhus/is@5.6.0", "", {}, "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g=="], "got/form-data-encoder": ["form-data-encoder@2.1.4", "", {}, "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw=="], @@ -4490,16 +4515,12 @@ "hast-util-from-parse5/property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], - "hast-util-to-estree/property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], - "hast-util-to-jsx-runtime/property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], "hastscript/property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], "htmlparser2/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], - "http-proxy-agent/agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], - "ink/indent-string": ["indent-string@5.0.0", "", {}, "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg=="], "ink/react-reconciler": ["react-reconciler@0.32.0", "", { "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.0" } }, "sha512-2NPMOzgTlG0ZWdIf3qG+dcbLSoAc/uLfOwckc3ofy5sSK0pLJqnQLpUFxvGcN2rlXSjnVtGeeFLNimCQEj5gOQ=="], @@ -4534,7 +4555,9 @@ "miniflare/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], - "minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + "next-mdx-remote-client/@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="], + + "node-abi/semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], @@ -4542,10 +4565,6 @@ "openai/@types/node": ["@types/node@18.19.130", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg=="], - "pac-proxy-agent/agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], - - "pac-proxy-agent/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], - "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], "parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], @@ -4556,8 +4575,6 @@ "postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], - "postcss-load-config/lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], - "pretty-format/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], @@ -4570,12 +4587,6 @@ "proper-lockfile/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], - "proxy-agent/agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], - - "proxy-agent/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], - - "proxy-agent/lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], - "public-ip/got": ["got@12.6.1", "", { "dependencies": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", "cacheable-lookup": "^7.0.0", "cacheable-request": "^10.2.8", "decompress-response": "^6.0.0", "form-data-encoder": "^2.1.2", "get-stream": "^6.0.1", "http2-wrapper": "^2.1.10", "lowercase-keys": "^3.0.0", "p-cancelable": "^3.0.0", "responselike": "^3.0.0" } }, "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ=="], "raw-body/http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], @@ -4588,6 +4599,10 @@ "recharts/eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="], + "rehype-recma/hast-util-to-estree": ["hast-util-to-estree@3.1.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-attach-comments": "^3.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w=="], + + "remark-gfm/mdast-util-gfm": ["mdast-util-gfm@3.1.0", "", { "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" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="], + "restore-cursor/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], "rolldown/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.7", "", {}, "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA=="], @@ -4626,8 +4641,6 @@ "socket.io-adapter/ws": ["ws@8.18.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg=="], - "socks-proxy-agent/agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], - "stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], @@ -4638,8 +4651,12 @@ "strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "style-to-js/style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="], + "sucrase/commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], + "sucrase/glob": ["glob@7.1.6", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA=="], + "supermemory-mcp/@vitejs/plugin-react": ["@vitejs/plugin-react@4.7.0", "", { "dependencies": { "@babel/core": "^7.28.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.27", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA=="], "supermemory-mcp/supermemory": ["supermemory@4.21.1", "", { "bin": { "supermemory": "bin/cli" } }, "sha512-KayOHtD94g7O+yN2qxaHEO5UIXtDl+duaKuhW7gvaraVtP1RHxFn80Pb5s5rKmqIvC+ruaARRlgMw7s/y+6LGQ=="], @@ -4650,7 +4667,19 @@ "supermemory-mcp/zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], - "tar/minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="], + "tailwindcss-v3/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], + + "tailwindcss-v3/glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "tailwindcss-v3/jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], + + "tailwindcss-v3/postcss": ["postcss@8.5.23", "", { "dependencies": { "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg=="], + + "tailwindcss-v3/sucrase": ["sucrase@3.35.1", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw=="], + + "tar-fs/chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="], + + "tar-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], @@ -4792,6 +4821,8 @@ "@babel/helper-skip-transparent-expression-wrappers/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@8.0.4", "", {}, "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg=="], + "@base-ui/react/@floating-ui/react-dom/@floating-ui/dom": ["@floating-ui/dom@1.8.0", "", { "dependencies": { "@floating-ui/core": "^1.8.0", "@floating-ui/utils": "^0.2.12" } }, "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg=="], + "@cloudflare/ai-chat/agents/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.26.0", "", { "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.2.1", "express-rate-limit": "^8.2.1", "hono": "^4.11.4", "jose": "^6.1.3", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-Y5RmPncpiDtTXDbLKswIJzTqu2hyBKxTNsgKqKclDbhIgg1wgtf1fRuvxgTnRfcnxtvvgbIEcqUOzZrJ6iSReg=="], "@cloudflare/ai-chat/agents/partyserver": ["partyserver@0.1.5", "", { "dependencies": { "nanoid": "^5.1.6" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20240729.0" } }, "sha512-kaE3GYaYWFc70EJQDQEhyYbO2Wczz/NgsFXerfjRo0t2s7ZxL1XggWT+HkMrdEyqbZOv3b66CV93WG0Lcg/ThQ=="], @@ -4882,33 +4913,21 @@ "@mintlify/cli/inquirer/run-async": ["run-async@3.0.0", "", {}, "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q=="], + "@mintlify/cli/open/define-lazy-prop": ["define-lazy-prop@2.0.0", "", {}, "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="], + + "@mintlify/cli/open/is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + + "@mintlify/cli/open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "@mintlify/cli/posthog-node/@posthog/core": ["@posthog/core@1.7.1", "", { "dependencies": { "cross-spawn": "^7.0.6" } }, "sha512-kjK0eFMIpKo9GXIbts8VtAknsoZ18oZorANdtuTj1CbgS28t4ZVq//HAWhnxEuXRTrtkd+SUJ6Ux3j2Af8NCuA=="], + "@mintlify/cli/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], "@mintlify/cli/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], "@mintlify/cli/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], - "@mintlify/common/postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], - - "@mintlify/common/tailwindcss/chokidar": ["chokidar@3.5.3", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw=="], - - "@mintlify/common/tailwindcss/glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - - "@mintlify/common/tailwindcss/jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], - - "@mintlify/link-rot/@mintlify/scraping/@mintlify/common": ["@mintlify/common@1.0.661", "", { "dependencies": { "@asyncapi/parser": "3.4.0", "@mintlify/mdx": "^3.0.4", "@mintlify/models": "0.0.255", "@mintlify/openapi-parser": "^0.0.8", "@mintlify/validation": "0.1.555", "@sindresorhus/slugify": "2.2.0", "@types/mdast": "4.0.4", "acorn": "8.11.2", "acorn-jsx": "5.3.2", "color-blend": "4.0.0", "estree-util-to-js": "2.0.0", "estree-walker": "3.0.3", "front-matter": "4.0.2", "hast-util-from-html": "2.0.3", "hast-util-to-html": "9.0.4", "hast-util-to-text": "4.0.2", "hex-rgb": "5.0.0", "ignore": "7.0.5", "js-yaml": "4.1.0", "lodash": "4.17.21", "mdast-util-from-markdown": "2.0.2", "mdast-util-gfm": "3.0.0", "mdast-util-mdx": "3.0.0", "mdast-util-mdx-jsx": "3.1.3", "micromark-extension-gfm": "3.0.0", "micromark-extension-mdx-jsx": "3.0.1", "micromark-extension-mdxjs": "3.0.0", "openapi-types": "12.1.3", "postcss": "8.5.6", "rehype-stringify": "10.0.1", "remark": "15.0.1", "remark-frontmatter": "5.0.0", "remark-gfm": "4.0.0", "remark-math": "6.0.0", "remark-mdx": "3.1.0", "remark-parse": "11.0.0", "remark-rehype": "11.1.1", "remark-stringify": "11.0.0", "tailwindcss": "3.4.4", "unified": "11.0.5", "unist-builder": "4.0.0", "unist-util-map": "4.0.0", "unist-util-remove": "4.0.0", "unist-util-remove-position": "5.0.0", "unist-util-visit": "5.0.0", "unist-util-visit-parents": "6.0.1", "vfile": "6.0.3" } }, "sha512-/Hdiblzaomp+AWStQ4smhVMgesQhffzQjC9aYBnmLReNdh2Js+ccQFUaWL3TNIxwiS2esaZvsHSV/D+zyRS3hg=="], - - "@mintlify/link-rot/@mintlify/scraping/fs-extra": ["fs-extra@11.1.1", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ=="], - - "@mintlify/link-rot/@mintlify/scraping/mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.1.3", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ=="], - - "@mintlify/link-rot/@mintlify/scraping/remark-mdx": ["remark-mdx@3.0.1", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA=="], - - "@mintlify/link-rot/@mintlify/scraping/unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="], - - "@mintlify/link-rot/@mintlify/scraping/yargs": ["yargs@17.7.1", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw=="], - - "@mintlify/link-rot/@mintlify/scraping/zod": ["zod@3.21.4", "", {}, "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw=="], + "@mintlify/common/postcss/nanoid": ["nanoid@3.3.18", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w=="], "@mintlify/link-rot/unist-util-visit/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], @@ -4916,6 +4935,10 @@ "@mintlify/link-rot/unist-util-visit/unist-util-visit-parents": ["unist-util-visit-parents@5.1.3", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0" } }, "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg=="], + "@mintlify/models/axios/follow-redirects": ["follow-redirects@1.16.0", "", { "peerDependencies": { "debug": "*" }, "optionalPeers": ["debug"] }, "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw=="], + + "@mintlify/models/axios/proxy-from-env": ["proxy-from-env@2.1.0", "", {}, "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA=="], + "@mintlify/prebuild/sharp/@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="], "@mintlify/prebuild/sharp/@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.4" }, "os": "darwin", "cpu": "x64" }, "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="], @@ -4956,56 +4979,48 @@ "@mintlify/prebuild/sharp/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], - "@mintlify/prebuild/unist-util-visit/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], - - "@mintlify/prebuild/unist-util-visit/unist-util-is": ["unist-util-is@5.2.1", "", { "dependencies": { "@types/unist": "^2.0.0" } }, "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw=="], - - "@mintlify/prebuild/unist-util-visit/unist-util-visit-parents": ["unist-util-visit-parents@5.1.3", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0" } }, "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg=="], - "@mintlify/previewing/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], "@mintlify/previewing/express/accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], - "@mintlify/previewing/express/body-parser": ["body-parser@1.20.1", "", { "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.11.0", "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" } }, "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw=="], + "@mintlify/previewing/express/body-parser": ["body-parser@1.20.4", "", { "dependencies": { "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "~1.2.0", "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "on-finished": "~2.4.1", "qs": "~6.14.0", "raw-body": "~2.5.3", "type-is": "~1.6.18", "unpipe": "~1.0.0" } }, "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA=="], "@mintlify/previewing/express/content-disposition": ["content-disposition@0.5.4", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="], - "@mintlify/previewing/express/cookie": ["cookie@0.5.0", "", {}, "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="], + "@mintlify/previewing/express/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], "@mintlify/previewing/express/cookie-signature": ["cookie-signature@1.0.6", "", {}, "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="], "@mintlify/previewing/express/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - "@mintlify/previewing/express/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], - - "@mintlify/previewing/express/finalhandler": ["finalhandler@1.2.0", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" } }, "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg=="], + "@mintlify/previewing/express/finalhandler": ["finalhandler@1.3.2", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "~2.4.1", "parseurl": "~1.3.3", "statuses": "~2.0.2", "unpipe": "~1.0.0" } }, "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg=="], "@mintlify/previewing/express/fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], - "@mintlify/previewing/express/merge-descriptors": ["merge-descriptors@1.0.1", "", {}, "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="], + "@mintlify/previewing/express/http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], - "@mintlify/previewing/express/path-to-regexp": ["path-to-regexp@0.1.7", "", {}, "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="], + "@mintlify/previewing/express/merge-descriptors": ["merge-descriptors@1.0.3", "", {}, "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="], - "@mintlify/previewing/express/qs": ["qs@6.11.0", "", { "dependencies": { "side-channel": "^1.0.4" } }, "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q=="], + "@mintlify/previewing/express/path-to-regexp": ["path-to-regexp@0.1.13", "", {}, "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA=="], - "@mintlify/previewing/express/send": ["send@0.18.0", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg=="], + "@mintlify/previewing/express/send": ["send@0.19.2", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "~0.5.2", "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "~2.4.1", "range-parser": "~1.2.1", "statuses": "~2.0.2" } }, "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg=="], - "@mintlify/previewing/express/serve-static": ["serve-static@1.15.0", "", { "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.18.0" } }, "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g=="], + "@mintlify/previewing/express/serve-static": ["serve-static@1.16.3", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "~0.19.1" } }, "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA=="], + + "@mintlify/previewing/express/statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], "@mintlify/previewing/express/type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="], - "@mintlify/previewing/unist-util-visit/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], - - "@mintlify/previewing/unist-util-visit/unist-util-is": ["unist-util-is@5.2.1", "", { "dependencies": { "@types/unist": "^2.0.0" } }, "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw=="], - - "@mintlify/previewing/unist-util-visit/unist-util-visit-parents": ["unist-util-visit-parents@5.1.3", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0" } }, "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg=="], - "@mintlify/previewing/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], "@mintlify/previewing/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], "@mintlify/previewing/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + "@mintlify/scraping/fast-xml-parser/fast-xml-builder": ["fast-xml-builder@1.3.1", "", { "dependencies": { "path-expression-matcher": "^1.6.2", "xml-naming": "^0.3.0" } }, "sha512-pIM/1n3ntFXKYrUZwW7QCK0gAW7XY+wzj1YMIV3tLDvPj/V+zTGJK5e3/4WJfwj0qWw2ElNXiTixda/R+3YSug=="], + + "@mintlify/scraping/fast-xml-parser/strnum": ["strnum@2.4.2", "", { "dependencies": { "anynum": "^1.0.1" } }, "sha512-rDG3Ah4TV0k1hWvLSzkZtMmLN9+eS+h3knq4MP6A42Y3Yh5qGNnOUs1jJkoSr8FG5dsL28c7KgkIBzSEykqtuw=="], + "@mintlify/scraping/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], "@mintlify/scraping/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -5094,11 +5109,7 @@ "@opentelemetry/otlp-exporter-base/@opentelemetry/otlp-transformer/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw=="], - "@puppeteer/browsers/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], - - "@puppeteer/browsers/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "@puppeteer/browsers/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + "@posthog/mcp/@posthog/core/@posthog/types": ["@posthog/types@1.412.4", "", {}, "sha512-Q7lV9O9TbLngjOYw1ucm3bS3tn48xb1B4ZQdDy8gv7yfKe99hCTeWYG4xZ36nJM80VxpTF9TriiJt5hngDOkBg=="], "@repo/lib/better-auth/@better-auth/utils": ["@better-auth/utils@0.2.5", "", { "dependencies": { "typescript": "^5.8.2", "uncrypto": "^0.1.3" } }, "sha512-uI2+/8h/zVsH8RrYdG8eUErbuGBk16rZKQfz8CjxQOyCE6v7BqFYEbFwvOkvl1KbUdxhqOnXp78+uE5h8qVEgQ=="], @@ -5356,6 +5367,10 @@ "mimetext/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + "next-mdx-remote-client/@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], + + "next-mdx-remote-client/@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + "openai/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], "public-ip/got/@sindresorhus/is": ["@sindresorhus/is@5.6.0", "", {}, "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g=="], @@ -5366,6 +5381,8 @@ "raw-body/http-errors/statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], + "rehype-recma/hast-util-to-estree/property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], + "sdk-playground/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], "sdk-playground/next/@next/env": ["@next/env@16.3.4", "", {}, "sha512-cjWZnUUa6jZq2kFaNe/ZyJdZonOZ/QoN0Zka2nz/FLOrfx14pQuM9c5RaSVkWMqgdt4ksgPAMWPyHSs/CyV48Q=="], @@ -5398,12 +5415,24 @@ "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "style-to-js/style-to-object/inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="], + + "sucrase/glob/minimatch": ["minimatch@3.1.4", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw=="], + "supermemory-mcp/@vitejs/plugin-react/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="], "supermemory-mcp/@vitejs/plugin-react/react-refresh": ["react-refresh@0.17.0", "", {}, "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ=="], "supermemory-mcp/vite/postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + "tailwindcss-v3/chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "tailwindcss-v3/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], + + "tailwindcss-v3/postcss/nanoid": ["nanoid@3.3.18", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w=="], + + "tailwindcss-v3/sucrase/commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], + "tsx/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], "tsx/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="], @@ -5628,6 +5657,8 @@ "@babel/helper-skip-transparent-expression-wrappers/@babel/traverse/@babel/generator/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + "@base-ui/react/@floating-ui/react-dom/@floating-ui/dom/@floating-ui/core": ["@floating-ui/core@1.8.0", "", { "dependencies": { "@floating-ui/utils": "^0.2.12" } }, "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ=="], + "@cloudflare/ai-chat/agents/@modelcontextprotocol/sdk/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], "@cloudflare/codemode/agents/@modelcontextprotocol/sdk/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], @@ -5646,33 +5677,7 @@ "@mintlify/cli/yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "@mintlify/common/tailwindcss/chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - - "@mintlify/common/tailwindcss/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], - - "@mintlify/link-rot/@mintlify/scraping/@mintlify/common/@mintlify/models": ["@mintlify/models@0.0.255", "", { "dependencies": { "axios": "1.10.0", "openapi-types": "12.1.3" } }, "sha512-LIUkfA7l7ypHAAuOW74ZJws/NwNRqlDRD/U466jarXvvSlGhJec/6J4/I+IEcBvWDnc9anLFKmnGO04jPKgAsg=="], - - "@mintlify/link-rot/@mintlify/scraping/@mintlify/common/@mintlify/validation": ["@mintlify/validation@0.1.555", "", { "dependencies": { "@mintlify/mdx": "^3.0.4", "@mintlify/models": "0.0.255", "arktype": "2.1.27", "js-yaml": "4.1.0", "lcm": "0.0.3", "lodash": "4.17.21", "object-hash": "3.0.0", "openapi-types": "12.1.3", "uuid": "11.1.0", "zod": "3.21.4", "zod-to-json-schema": "3.20.4" } }, "sha512-11QVUReL4N5u8wSCgZt4RN7PA0jYQoMEBZ5IrUp5pgb5ZJBOoGV/vPsQrxPPa1cxsUDAuToNhtGxRQtOav/w8w=="], - - "@mintlify/link-rot/@mintlify/scraping/@mintlify/common/@sindresorhus/slugify": ["@sindresorhus/slugify@2.2.0", "", { "dependencies": { "@sindresorhus/transliterate": "^1.0.0", "escape-string-regexp": "^5.0.0" } }, "sha512-9Vybc/qX8Kj6pxJaapjkFbiUJPk7MAkCh/GFCxIBnnsuYCFPIXKvnLidG8xlepht3i24L5XemUmGtrJ3UWrl6w=="], - - "@mintlify/link-rot/@mintlify/scraping/@mintlify/common/acorn": ["acorn@8.11.2", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w=="], - - "@mintlify/link-rot/@mintlify/scraping/@mintlify/common/lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], - - "@mintlify/link-rot/@mintlify/scraping/@mintlify/common/postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], - - "@mintlify/link-rot/@mintlify/scraping/@mintlify/common/remark-mdx": ["remark-mdx@3.1.0", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA=="], - - "@mintlify/link-rot/@mintlify/scraping/@mintlify/common/tailwindcss": ["tailwindcss@3.4.4", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.5.3", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.0", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.0", "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.0.0", "postcss": "^8.4.23", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.1", "postcss-nested": "^6.0.1", "postcss-selector-parser": "^6.0.11", "resolve": "^1.22.2", "sucrase": "^3.32.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A=="], - - "@mintlify/link-rot/@mintlify/scraping/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], - - "@mintlify/link-rot/@mintlify/scraping/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "@mintlify/link-rot/@mintlify/scraping/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], - - "@mintlify/previewing/chokidar/readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "@mintlify/previewing/chokidar/readdirp/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], "@mintlify/previewing/express/accepts/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], @@ -5680,7 +5685,7 @@ "@mintlify/previewing/express/body-parser/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], - "@mintlify/previewing/express/body-parser/raw-body": ["raw-body@2.5.1", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig=="], + "@mintlify/previewing/express/body-parser/raw-body": ["raw-body@2.5.3", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "unpipe": "~1.0.0" } }, "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA=="], "@mintlify/previewing/express/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], @@ -5708,14 +5713,6 @@ "@opennextjs/cloudflare/glob/minimatch/brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], - "@puppeteer/browsers/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "@puppeteer/browsers/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - - "@puppeteer/browsers/yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "@puppeteer/browsers/yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "@repo/lib/better-auth/@better-auth/utils/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], "@so-ric/colorspace/color/color-convert/color-name": ["color-name@2.1.0", "", {}, "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg=="], @@ -5838,8 +5835,12 @@ "socket.io/accepts/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + "sucrase/glob/minimatch/brace-expansion": ["brace-expansion@1.1.18", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw=="], + "supermemory-mcp/vite/postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "tailwindcss-v3/chokidar/readdirp/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], + "@a2a-js/sdk/express/accepts/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], "@a2a-js/sdk/express/body-parser/http-errors/statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], @@ -5852,30 +5853,6 @@ "@mintlify/cli/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "@mintlify/common/tailwindcss/chokidar/readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - - "@mintlify/link-rot/@mintlify/scraping/@mintlify/common/@mintlify/models/axios": ["axios@1.10.0", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw=="], - - "@mintlify/link-rot/@mintlify/scraping/@mintlify/common/@mintlify/validation/uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], - - "@mintlify/link-rot/@mintlify/scraping/@mintlify/common/@mintlify/validation/zod-to-json-schema": ["zod-to-json-schema@3.20.4", "", { "peerDependencies": { "zod": "^3.20.0" } }, "sha512-Un9+kInJ2Zt63n6Z7mLqBifzzPcOyX+b+Exuzf7L1+xqck9Q2EPByyTRduV3kmSPaXaRer1JCsucubpgL1fipg=="], - - "@mintlify/link-rot/@mintlify/scraping/@mintlify/common/postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], - - "@mintlify/link-rot/@mintlify/scraping/@mintlify/common/tailwindcss/chokidar": ["chokidar@3.5.3", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw=="], - - "@mintlify/link-rot/@mintlify/scraping/@mintlify/common/tailwindcss/glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - - "@mintlify/link-rot/@mintlify/scraping/@mintlify/common/tailwindcss/jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], - - "@mintlify/link-rot/@mintlify/scraping/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "@mintlify/link-rot/@mintlify/scraping/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - - "@mintlify/link-rot/@mintlify/scraping/yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "@mintlify/link-rot/@mintlify/scraping/yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "@mintlify/previewing/express/accepts/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], "@mintlify/previewing/express/type-is/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], @@ -5894,28 +5871,10 @@ "@opennextjs/cloudflare/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "@puppeteer/browsers/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "@puppeteer/browsers/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - - "@puppeteer/browsers/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "concurrently/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "concurrently/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "concurrently/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "@mintlify/link-rot/@mintlify/scraping/@mintlify/common/tailwindcss/chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - - "@mintlify/link-rot/@mintlify/scraping/@mintlify/common/tailwindcss/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], - - "@mintlify/link-rot/@mintlify/scraping/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "@mintlify/link-rot/@mintlify/scraping/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - - "@mintlify/link-rot/@mintlify/scraping/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "@mintlify/link-rot/@mintlify/scraping/@mintlify/common/tailwindcss/chokidar/readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], } } diff --git a/packages/memory-graph/README.md b/packages/memory-graph/README.md index 83710f5a..fe5bb828 100644 --- a/packages/memory-graph/README.md +++ b/packages/memory-graph/README.md @@ -53,7 +53,7 @@ function App() { - **Relationship visualization** - Edges show document similarity and memory version chains - **Space filtering** - Filter by workspace or view all memories - **Two variants** - Full-featured console mode or embedded consumer mode -- **Pagination support** - Load more documents on demand +- **Pagination support** - Keep the initial graph fitted as pages arrive; manual pan, zoom, or selection takes control of the view - **TypeScript support** - Full type definitions included ## Essential Props @@ -67,6 +67,14 @@ function App() { | `loadMoreDocuments` | `() => Promise` | Function to load more data | | `highlightDocumentIds` | `string[]` | IDs of documents to highlight | +Console mode uses the supplied theme colors for its surface, 16px dot grid, document icons, and node fills and strokes. Consumer mode keeps its transparent surface and cluster colors. + +Set `colors.dotColor` or the `--graph-dot` CSS variable to style the dot grid independently of text. When neither is set, the grid uses `textMuted`. + +Document-to-memory links use `colors.edgeDocument` or `--graph-edge-document`, while derived-memory relations use `colors.edgeDerives` or `--graph-edge-derives`. + +For paginated initial loading, pass `hasMore` and `isLoadingMore` alongside `documents`. In both variants, new batches gradually warm the force layout from the existing node positions. Initial and appended nodes relax until their movement stays low, then cool automatically; a tick limit bounds settling for layouts that keep drifting. The initial view smoothly follows the changing bounds until loading and settling finish. Manual interaction immediately cancels automatic camera movement. Clicking a node selects it without restarting the forces; dragging warms the layout until release, including release outside the canvas. Changing the document selection starts a new fit; the Fit control remains available at any time. The existing static layout safeguard for more than 6,000 nodes remains in place. + ## Documentation Full documentation available at [docs.supermemory.ai](https://docs.supermemory.ai): diff --git a/packages/memory-graph/package.json b/packages/memory-graph/package.json index aea9f1d6..d6400257 100644 --- a/packages/memory-graph/package.json +++ b/packages/memory-graph/package.json @@ -1,6 +1,6 @@ { "name": "@supermemory/memory-graph", - "version": "0.2.3", + "version": "0.2.4", "description": "Interactive graph visualization component for Supermemory - visualize and explore your memory connections", "type": "module", "main": "./src/index.tsx", diff --git a/packages/memory-graph/src/__tests__/edge-logic.test.ts b/packages/memory-graph/src/__tests__/edge-logic.test.ts index 8426a7d3..9891ce24 100644 --- a/packages/memory-graph/src/__tests__/edge-logic.test.ts +++ b/packages/memory-graph/src/__tests__/edge-logic.test.ts @@ -20,7 +20,10 @@ import { describe, it, expect } from "vitest" import type { GraphApiDocument, GraphApiMemory } from "../types" -import { getEdgeVisualProps } from "../hooks/use-graph-data" +import { + computeEdges as computeGraphEdges, + getEdgeVisualProps, +} from "../hooks/use-graph-data" // --------------------------------------------------------------------------- // Pure extraction of edges useMemo from use-graph-data.ts @@ -48,14 +51,13 @@ function computeEdges(documents: GraphApiDocument[]): ComputedEdge[] { for (const mem of doc.memories) allNodeIds.add(mem.id) } - // 1. Derives edges: document -> memory (structural) for (const doc of documents) { for (const mem of doc.memories) { result.push({ id: `dm-${doc.id}-${mem.id}`, source: doc.id, target: mem.id, - edgeType: "derives", + edgeType: "document", }) } } @@ -574,12 +576,8 @@ describe("MCP transformData: forward-reference fix (pre-populated nodeIds)", () }) }) -// =========================================================================== -// (6) Structural correctness: derives edges always created, doc->mem -// =========================================================================== - -describe("use-graph-data edges: derives edges always present for all doc->mem pairs", () => { - it("creates exactly one derives edge per memory across multiple documents", () => { +describe("use-graph-data edges: document edges always present for all doc->mem pairs", () => { + it("creates exactly one document edge per memory across multiple documents", () => { const docs = [ makeDoc("d1", [makeMem({ id: "m1" }), makeMem({ id: "m2" })]), makeDoc("d2", [ @@ -589,10 +587,9 @@ describe("use-graph-data edges: derives edges always present for all doc->mem pa ]), ] const edges = computeEdges(docs) - const derivesEdges = edges.filter((e) => e.edgeType === "derives") - // 2 memories in d1 + 3 in d2 = 5 derives edges - expect(derivesEdges.length).toBe(5) - expect(derivesEdges.map((e) => e.target).sort()).toEqual([ + const documentEdges = edges.filter((e) => e.edgeType === "document") + expect(documentEdges.length).toBe(5) + expect(documentEdges.map((e) => e.target).sort()).toEqual([ "m1", "m2", "m3", @@ -618,6 +615,27 @@ describe("use-graph-data edges: derives edges always present for all doc->mem pa }) }) +describe("document and derives edge types", () => { + it("keeps document links separate from derives relations", () => { + const docs = [ + makeDoc("d1", [ + makeMem({ id: "source" }), + makeMem({ + id: "derived", + memoryRelations: { source: "derives" }, + }), + ]), + ] + + const edges = computeGraphEdges(docs) + + expect(edges.filter((edge) => edge.edgeType === "document")).toHaveLength(2) + expect( + edges.find((edge) => edge.id === "rel-source-derived")?.edgeType, + ).toBe("derives") + }) +}) + // =========================================================================== // (7) getEdgeVisualProps: the MemoryRelation type is the canonical source // =========================================================================== diff --git a/packages/memory-graph/src/__tests__/renderer-utils.test.ts b/packages/memory-graph/src/__tests__/renderer-utils.test.ts index 02630037..795ee816 100644 --- a/packages/memory-graph/src/__tests__/renderer-utils.test.ts +++ b/packages/memory-graph/src/__tests__/renderer-utils.test.ts @@ -80,8 +80,8 @@ describe("relation edge level-of-detail helpers", () => { expect(getRelationEdgeStride(1040, 0.1)).toBe(4) }) - test("always draws structural derives edges", () => { - expect(shouldDrawRelationEdge("edge-1", "derives", 10)).toBe(true) + test("always draws structural document edges", () => { + expect(shouldDrawRelationEdge("edge-1", "document", 10)).toBe(true) }) test("deterministically samples non-structural relation edges", () => { diff --git a/packages/memory-graph/src/__tests__/simulation.test.ts b/packages/memory-graph/src/__tests__/simulation.test.ts index cd0035a2..f9179bd7 100644 --- a/packages/memory-graph/src/__tests__/simulation.test.ts +++ b/packages/memory-graph/src/__tests__/simulation.test.ts @@ -30,7 +30,7 @@ function makeEdge(source: string, target: string): GraphEdge { source, target, visualProps: { opacity: 0.5, thickness: 1.5 }, - edgeType: "derives", + edgeType: "document", } } diff --git a/packages/memory-graph/src/canvas/input-handler.ts b/packages/memory-graph/src/canvas/input-handler.ts index a26c37ff..d3a82f16 100644 --- a/packages/memory-graph/src/canvas/input-handler.ts +++ b/packages/memory-graph/src/canvas/input-handler.ts @@ -23,6 +23,11 @@ export class InputHandler { private posHistory: Array<{ x: number; y: number; t: number }> = [] private draggingNode: GraphNode | null = null + private pressedNode: GraphNode | null = null + private pressX = 0 + private pressY = 0 + private grabOffset = { x: 0, y: 0 } + private gestureWindow: Window | null = null private didDrag = false private currentHoveredId: string | null = null @@ -45,6 +50,8 @@ export class InputHandler { private boundMouseDown: (e: MouseEvent) => void private boundMouseMove: (e: MouseEvent) => void private boundMouseUp: (e: MouseEvent) => void + private boundWindowMove: (e: MouseEvent) => void + private boundBlur: () => void private boundWheel: (e: WheelEvent) => void private boundClick: (e: MouseEvent) => void private boundDblClick: (e: MouseEvent) => void @@ -67,6 +74,10 @@ export class InputHandler { this.boundMouseDown = this.onMouseDown.bind(this) this.boundMouseMove = this.onMouseMove.bind(this) this.boundMouseUp = this.onMouseUp.bind(this) + this.boundWindowMove = (event) => { + if (event.target !== this.canvas) this.onMouseMove(event) + } + this.boundBlur = () => this.endMouseGesture(false) this.boundWheel = this.onWheel.bind(this) this.boundClick = this.onClick.bind(this) this.boundDblClick = this.onDblClick.bind(this) @@ -77,7 +88,6 @@ export class InputHandler { canvas.addEventListener("mousedown", this.boundMouseDown) canvas.addEventListener("mousemove", this.boundMouseMove) - canvas.addEventListener("mouseup", this.boundMouseUp) canvas.addEventListener("click", this.boundClick) canvas.addEventListener("dblclick", this.boundDblClick) canvas.addEventListener("wheel", this.boundWheel, { passive: false }) @@ -98,10 +108,10 @@ export class InputHandler { } destroy(): void { + this.endMouseGesture(false) const c = this.canvas c.removeEventListener("mousedown", this.boundMouseDown) c.removeEventListener("mousemove", this.boundMouseMove) - c.removeEventListener("mouseup", this.boundMouseUp) c.removeEventListener("click", this.boundClick) c.removeEventListener("dblclick", this.boundDblClick) c.removeEventListener("wheel", this.boundWheel) @@ -117,12 +127,32 @@ export class InputHandler { return this.draggingNode } + syncNodes(nodes: Map): void { + if (this.pressedNode) { + this.pressedNode = nodes.get(this.pressedNode.id) ?? null + } + if (!this.draggingNode) return + const current = nodes.get(this.draggingNode.id) + if (!current) { + this.endMouseGesture(false) + } else if (current !== this.draggingNode) { + current.x = current.fx = this.draggingNode.x + current.y = current.fy = this.draggingNode.y + this.draggingNode.fx = null + this.draggingNode.fy = null + this.draggingNode = current + } + } + private canvasXY(e: MouseEvent): { x: number; y: number } { const rect = this.canvas.getBoundingClientRect() return { x: e.clientX - rect.left, y: e.clientY - rect.top } } private onMouseDown(e: MouseEvent): void { + if (e.button !== 0) return + this.endMouseGesture(false) + this.viewport.cancelAnimation() const { x, y } = this.canvasXY(e) const world = this.viewport.screenToWorld(x, y) const node = this.spatialIndex.queryPoint(world.x, world.y) @@ -131,13 +161,16 @@ export class InputHandler { this.lastMouseY = y this.posHistory = [{ x, y, t: performance.now() }] this.didDrag = false + this.pressX = x + this.pressY = y + this.gestureWindow = this.canvas.ownerDocument.defaultView + this.gestureWindow?.addEventListener("mousemove", this.boundWindowMove) + this.gestureWindow?.addEventListener("mouseup", this.boundMouseUp) + this.gestureWindow?.addEventListener("blur", this.boundBlur) if (node) { - this.draggingNode = node - node.fx = node.x - node.fy = node.y - this.callbacks.onNodeDragStart(node.id, node) - this.canvas.style.cursor = "grabbing" + this.pressedNode = node + this.grabOffset = { x: world.x - node.x, y: world.y - node.y } } else { this.isPanning = true this.canvas.style.cursor = "grabbing" @@ -146,13 +179,18 @@ export class InputHandler { private onMouseMove(e: MouseEvent): void { const { x, y } = this.canvasXY(e) + if (this.pressedNode) { + if (Math.hypot(x - this.pressX, y - this.pressY) < 4) return + this.draggingNode = this.pressedNode + this.pressedNode = null + this.callbacks.onNodeDragStart(this.draggingNode.id, this.draggingNode) + this.canvas.style.cursor = "grabbing" + } if (this.draggingNode) { const world = this.viewport.screenToWorld(x, y) - this.draggingNode.fx = world.x - this.draggingNode.fy = world.y - this.draggingNode.x = world.x - this.draggingNode.y = world.y + this.draggingNode.x = this.draggingNode.fx = world.x - this.grabOffset.x + this.draggingNode.y = this.draggingNode.fy = world.y - this.grabOffset.y this.didDrag = true this.callbacks.onRequestRender() return @@ -186,6 +224,15 @@ export class InputHandler { } private onMouseUp(_e: MouseEvent): void { + this.endMouseGesture(true) + } + + private endMouseGesture(withInertia: boolean): void { + this.gestureWindow?.removeEventListener("mousemove", this.boundWindowMove) + this.gestureWindow?.removeEventListener("mouseup", this.boundMouseUp) + this.gestureWindow?.removeEventListener("blur", this.boundBlur) + this.gestureWindow = null + this.pressedNode = null if (this.draggingNode) { this.draggingNode.fx = null this.draggingNode.fy = null @@ -198,7 +245,7 @@ export class InputHandler { if (this.isPanning) { this.isPanning = false - if (this.posHistory.length >= 2) { + if (withInertia && this.posHistory.length >= 2) { const newest = this.posHistory[this.posHistory.length - 1] const oldest = this.posHistory[0] if (!newest || !oldest) return diff --git a/packages/memory-graph/src/canvas/renderer.ts b/packages/memory-graph/src/canvas/renderer.ts index 291c04dd..79b72577 100644 --- a/packages/memory-graph/src/canvas/renderer.ts +++ b/packages/memory-graph/src/canvas/renderer.ts @@ -21,8 +21,8 @@ const edgeBatches = new Map() const RELATION_LOD_ZOOM = 0.5 const RELATION_LOD_MAX_BACKGROUND_EDGES = 260 const RELATION_LOD_DENSE_COUNT = 180 -const DERIVES_LOD_ZOOM = 0.38 -const DERIVES_LOD_MAX_BACKGROUND_EDGES = 3200 +const DOCUMENT_LOD_ZOOM = 0.38 +const DOCUMENT_LOD_MAX_BACKGROUND_EDGES = 3200 const DENSE_POINT_THRESHOLD = 25000 const DENSE_POINT_ZOOM = 0.42 @@ -83,6 +83,8 @@ function edgeStyle( edge: GraphEdge, colors: GraphThemeColors, ): { color: string; width: number; opacity: number } { + if (edge.edgeType === "document") + return { color: colors.edgeDocument, width: 1.2, opacity: 0.4 } if (edge.edgeType === "derives") return { color: colors.edgeDerives, width: 1.2, opacity: 0.4 } if (edge.edgeType === "updates") @@ -104,14 +106,17 @@ export function getRelationEdgeStride( return Math.ceil(relationEdgeCount / RELATION_LOD_MAX_BACKGROUND_EDGES) } -function getDerivesEdgeStride(derivesEdgeCount: number, zoom: number): number { +function getDocumentEdgeStride( + documentEdgeCount: number, + zoom: number, +): number { if ( - zoom >= DERIVES_LOD_ZOOM || - derivesEdgeCount <= DERIVES_LOD_MAX_BACKGROUND_EDGES + zoom >= DOCUMENT_LOD_ZOOM || + documentEdgeCount <= DOCUMENT_LOD_MAX_BACKGROUND_EDGES ) { return 1 } - return Math.ceil(derivesEdgeCount / DERIVES_LOD_MAX_BACKGROUND_EDGES) + return Math.ceil(documentEdgeCount / DOCUMENT_LOD_MAX_BACKGROUND_EDGES) } export function shouldDrawRelationEdge( @@ -119,7 +124,7 @@ export function shouldDrawRelationEdge( edgeType: string, stride: number, ): boolean { - if (edgeType === "derives" || stride <= 1) return true + if (edgeType === "document" || stride <= 1) return true return hashString(edgeId) % stride === 0 } @@ -135,7 +140,7 @@ function applyRelationLevelOfDetail( hasFocus: boolean, hasActiveHover: boolean, ) { - if (edgeType === "derives") return { style, glow: true } + if (edgeType === "document") return { style, glow: true } if (hasFocus || hasActiveHover) { const isUpdate = edgeType === "updates" const minOpacity = hasActiveHover ? 0.9 : 0.76 @@ -213,17 +218,17 @@ function drawEdges( const margin = 100 const hasDim = state.selectedNodeId !== null && state.dimProgress > 0 const relationEdgeCount = edges.reduce( - (count, edge) => count + (edge.edgeType === "derives" ? 0 : 1), + (count, edge) => count + (edge.edgeType === "document" ? 0 : 1), 0, ) - const derivesEdgeCount = edges.length - relationEdgeCount + const documentEdgeCount = edges.length - relationEdgeCount const relationStride = getRelationEdgeStride(relationEdgeCount, viewport.zoom) - const derivesStride = getDerivesEdgeStride(derivesEdgeCount, viewport.zoom) + const documentStride = getDocumentEdgeStride(documentEdgeCount, viewport.zoom) const prepared: PreparedEdge[] = [] for (const edge of edges) { - const edgeType = edge.edgeType ?? "derives" + const edgeType = edge.edgeType ?? "document" const srcId = typeof edge.source === "string" ? edge.source : edge.source.id const tgtId = typeof edge.target === "string" ? edge.target : edge.target.id const hoverConnected = @@ -235,7 +240,7 @@ function drawEdges( const activeConnected = hoverConnected || selectedConnected const shouldAlwaysDrawActiveUpdate = edgeType === "updates" && activeConnected - const edgeStride = edgeType === "derives" ? derivesStride : relationStride + const edgeStride = edgeType === "document" ? documentStride : relationStride if ( !shouldAlwaysDrawActiveUpdate && !hasDim && @@ -248,7 +253,7 @@ function drawEdges( const tgt = nodeMap.get(tgtId) if (!src || !tgt) continue - if (edgeType === "derives") { + if (edgeType === "document") { const mem = src.type === "memory" ? src : tgt if (mem.size * viewport.zoom < 3) continue } @@ -297,9 +302,9 @@ function drawEdges( ) let style = edgeDetail.style let glow = edgeDetail.glow - if (edgeType === "derives" && derivesStride > 1 && !activeConnected) { + if (edgeType === "document" && documentStride > 1 && !activeConnected) { const zoomFactor = clampNumber( - viewport.zoom / DERIVES_LOD_ZOOM, + viewport.zoom / DOCUMENT_LOD_ZOOM, 0.08, 0.32, ) @@ -728,8 +733,18 @@ function drawDocumentNode( sx + half, sy + half, ) - grad.addColorStop(0, mixHexColors(colors.docFill, clusterColor, 0.1)) - grad.addColorStop(1, mixHexColors(colors.docFill, clusterColor, 0.22)) + grad.addColorStop( + 0, + node.clusterColor + ? mixHexColors(colors.docFill, clusterColor, 0.1) + : colors.docFill, + ) + grad.addColorStop( + 1, + node.clusterColor + ? mixHexColors(colors.docFill, clusterColor, 0.22) + : colors.docFill, + ) ctx.fillStyle = grad ctx.strokeStyle = @@ -750,14 +765,23 @@ function drawDocumentNode( const innerSize = size * 0.72 const innerHalf = innerSize * 0.5 const innerR = 6 * (size / 50) - ctx.fillStyle = mixHexColors(colors.docInnerFill, clusterColor, 0.08) + ctx.fillStyle = node.clusterColor + ? mixHexColors(colors.docInnerFill, clusterColor, 0.08) + : colors.docInnerFill roundRect(ctx, sx - innerHalf, sy - innerHalf, innerSize, innerSize, innerR) ctx.fill() const iconSize = size * 0.35 const docType = node.type === "document" ? (node.data as DocumentNodeData).type : "text" - drawDocIcon(ctx, sx, sy, iconSize, docType || "text", clusterColor) + drawDocIcon( + ctx, + sx, + sy, + iconSize, + docType || "text", + node.clusterColor ? clusterColor : colors.iconColor, + ) } function drawMemoryNode( diff --git a/packages/memory-graph/src/canvas/simulation.ts b/packages/memory-graph/src/canvas/simulation.ts index b04cee27..01bca6b0 100644 --- a/packages/memory-graph/src/canvas/simulation.ts +++ b/packages/memory-graph/src/canvas/simulation.ts @@ -6,14 +6,12 @@ export const DENSE_GRAPH_STATIC_THRESHOLD = 6000 export class ForceSimulation { private sim: d3.Simulation | null = null + private holdingHeat = false init(nodes: GraphNode[], edges: GraphEdge[]): void { this.destroy() try { - // Only use structural edges (derives, updates) for the force layout. - // "extends" edges are visual-only -- they connect documents sharing a - // spaceId but should not pull documents together into a single mass. const structuralEdges = edges.filter((e) => e.edgeType !== "extends") this.sim = d3 @@ -28,12 +26,12 @@ export class ForceSimulation { .forceLink(structuralEdges) .id((d) => d.id) .distance((link) => - link.edgeType === "derives" + link.edgeType === "document" ? getDocMemoryDistance(link) : FORCE_CONFIG.linkDistance, ) .strength((link) => { - if (link.edgeType === "derives") + if (link.edgeType === "document") return FORCE_CONFIG.linkStrength.docMemory if (link.edgeType === "updates") return FORCE_CONFIG.linkStrength.version @@ -72,7 +70,7 @@ export class ForceSimulation { if (nodes.length > DENSE_GRAPH_STATIC_THRESHOLD) { this.stop() } else { - this.sim.alphaTarget(0).restart() + this.settle() } } catch (e) { console.error("ForceSimulation.init failed:", e) @@ -89,22 +87,62 @@ export class ForceSimulation { } reheat(): void { + this.holdingHeat = true + this.sim?.on("tick.settle", null) this.sim?.alphaTarget(FORCE_CONFIG.alphaTarget).restart() } + settle(): void { + const sim = this.sim + if (!sim || this.holdingHeat) return + let ticks = 0 + let stableTicks = 0 + sim + .alphaTarget(FORCE_CONFIG.alphaTarget) + .on("tick.settle", () => { + let squaredVelocity = 0 + let maxSquaredVelocity = 0 + const nodes = sim.nodes() + for (const node of nodes) { + const velocity = (node.vx ?? 0) ** 2 + (node.vy ?? 0) ** 2 + squaredVelocity += velocity + maxSquaredVelocity = Math.max(maxSquaredVelocity, velocity) + } + const settled = + sim.alpha() >= FORCE_CONFIG.alphaTarget * 0.9 && + squaredVelocity / Math.max(1, nodes.length) <= + FORCE_CONFIG.settleMeanVelocity ** 2 && + maxSquaredVelocity <= FORCE_CONFIG.settleMaxVelocity ** 2 + stableTicks = settled ? stableTicks + 1 : 0 + if ( + ++ticks >= FORCE_CONFIG.settleMaxTicks || + stableTicks >= FORCE_CONFIG.settleStableTicks + ) { + sim.alphaTarget(0).on("tick.settle", null) + } + }) + .restart() + } + coolDown(): void { - this.sim?.alphaTarget(0) + this.holdingHeat = false + this.sim?.alphaTarget(0).on("tick.settle", null) } stop(): void { - this.sim?.alpha(0).alphaTarget(0).stop() + this.coolDown() + this.sim?.alpha(0).stop() } isActive(): boolean { - return (this.sim?.alpha() ?? 0) > FORCE_CONFIG.alphaMin + return ( + Math.max(this.sim?.alpha() ?? 0, this.sim?.alphaTarget() ?? 0) > + FORCE_CONFIG.alphaMin + ) } destroy(): void { + this.holdingHeat = false if (this.sim) { this.sim.stop() this.sim = null diff --git a/packages/memory-graph/src/canvas/viewport.ts b/packages/memory-graph/src/canvas/viewport.ts index c33a1681..648b6ce8 100644 --- a/packages/memory-graph/src/canvas/viewport.ts +++ b/packages/memory-graph/src/canvas/viewport.ts @@ -43,12 +43,21 @@ export class ViewportState { } pan(dx: number, dy: number): void { + this.cancelAnimation() this.panX += dx this.panY += dy this.targetPanX = null this.targetPanY = null } + cancelAnimation(): void { + this.velocityX = 0 + this.velocityY = 0 + this.targetZoom = this.zoom + this.targetPanX = null + this.targetPanY = null + } + releaseWithVelocity(vx: number, vy: number): void { this.velocityX = vx this.velocityY = vy @@ -72,6 +81,7 @@ export class ViewportState { nodes: Array<{ x: number; y: number; size: number }>, width: number, height: number, + { animate = true }: { animate?: boolean } = {}, ): void { const fit = computeFit(nodes, width, height) if (!fit) return @@ -83,6 +93,12 @@ export class ViewportState { this.zoomAnchorY = height / 2 this.targetPanX = width / 2 - cx * this.targetZoom this.targetPanY = height / 2 - cy * this.targetZoom + if (!animate) { + this.zoom = this.targetZoom + this.panX = this.targetPanX + this.panY = this.targetPanY + this.cancelAnimation() + } } setMinZoomForNodes( @@ -99,7 +115,6 @@ export class ViewportState { ViewportState.ABSOLUTE_MIN_ZOOM, ViewportState.DEFAULT_MIN_ZOOM, ) - this.zoom = clamp(this.zoom, this.minZoom, ViewportState.MAX_ZOOM) this.targetZoom = clamp( this.targetZoom, this.minZoom, @@ -132,7 +147,7 @@ export class ViewportState { } const zoomDiff = this.targetZoom - this.zoom - if (Math.abs(zoomDiff) > 0.001) { + if (Math.abs(zoomDiff) > this.zoom * 0.001) { const world = this.screenToWorld(this.zoomAnchorX, this.zoomAnchorY) this.zoom += zoomDiff * this.zoomSpring this.panX = this.zoomAnchorX - world.x * this.zoom diff --git a/packages/memory-graph/src/components/graph-canvas.tsx b/packages/memory-graph/src/components/graph-canvas.tsx index c5aea910..ca070b9b 100644 --- a/packages/memory-graph/src/components/graph-canvas.tsx +++ b/packages/memory-graph/src/components/graph-canvas.tsx @@ -99,6 +99,7 @@ export const GraphCanvas = memo(function GraphCanvas({ const map = nodeMapRef.current map.clear() for (const n of nodes) map.set(n.id, n) + inputRef.current?.syncNodes(map) spatialRef.current.rebuild(nodes) renderNeeded.current = true }, [nodes]) diff --git a/packages/memory-graph/src/components/legend.tsx b/packages/memory-graph/src/components/legend.tsx index e9be3a22..c65073f4 100644 --- a/packages/memory-graph/src/components/legend.tsx +++ b/packages/memory-graph/src/components/legend.tsx @@ -309,6 +309,7 @@ export const Legend = memo(function Legend({ const memoryCount = nodes.filter((n) => n.type === "memory").length const documentCount = nodes.filter((n) => n.type === "document").length const connectionCount = edges.length + const documentEdgeCount = countEdgesByType(edges, "document") const derivesCount = countEdgesByType(edges, "derives") const updatesCount = countEdgesByType(edges, "updates") const extendsCount = countEdgesByType(edges, "extends") @@ -320,6 +321,7 @@ export const Legend = memo(function Legend({ .filter(Boolean), ).size const updateNodeCount = nodes.filter(isUpdateMemoryNode).length + const hasClusterColors = nodes.some((node) => node.clusterColor) const outerStyle: React.CSSProperties = { overflow: "hidden", @@ -530,17 +532,29 @@ export const Legend = memo(function Legend({
- + {labels.documentSourceEdge}
- {derivesCount} + {documentEdgeCount}
{labels.documentToMemoryEdge}
+
+
+
+ + Derives +
+ {derivesCount} +
+
+ Memory derived from another memory +
+
@@ -571,22 +585,26 @@ export const Legend = memo(function Legend({
- Color -
- -
- Cluster - - Same document or connected memory group - + + {hasClusterColors ? "Color" : "Clusters"} + + {hasClusterColors && ( +
+ +
+ Cluster + + Same document or connected memory group + +
-
+ )}
Visible clusters {clusterCount} diff --git a/packages/memory-graph/src/components/memory-graph.tsx b/packages/memory-graph/src/components/memory-graph.tsx index d165ac71..016d9428 100644 --- a/packages/memory-graph/src/components/memory-graph.tsx +++ b/packages/memory-graph/src/components/memory-graph.tsx @@ -1,4 +1,11 @@ -import { useCallback, useEffect, useMemo, useRef, useState } from "react" +import { + useCallback, + useEffect, + useLayoutEffect, + useMemo, + useRef, + useState, +} from "react" import { DENSE_GRAPH_STATIC_THRESHOLD, ForceSimulation, @@ -8,6 +15,7 @@ import { VersionChainIndex } from "../canvas/version-chain" import type { ViewportState } from "../canvas/viewport" import { useGraphData } from "../hooks/use-graph-data" import { useGraphTheme } from "../hooks/use-graph-theme" +import { useInitialGraphFit } from "../hooks/use-initial-graph-fit" import type { GraphApiDocument, GraphThemeColors, @@ -116,6 +124,7 @@ export function MemoryGraph({ containerSize.width, containerSize.height, colors, + variant === "console" ? "theme" : "cluster", ) const isCompactViewport = containerSize.width > 0 && containerSize.width < 640 const graphFitHeight = isCompactViewport @@ -131,10 +140,8 @@ export function MemoryGraph({ // that makes this a no-op on re-renders where limitedDocuments hasn't changed. chainIndex.current.rebuild(limitedDocuments) - // Initial loads get a full force settle. Append-only pagination keeps - // existing coordinates stable and renders new nodes in nearby open areas. const prevSimIdsRef = useRef>(new Set()) - useEffect(() => { + useLayoutEffect(() => { if (nodes.length === 0) { simulationRef.current?.destroy() simulationRef.current = null @@ -172,7 +179,7 @@ export function MemoryGraph({ } else if (idsChanged && isAppendOnly) { prevSimIdsRef.current = currentIds simulationRef.current.update(nodes, edges) - simulationRef.current.stop() + simulationRef.current.settle() } else { simulationRef.current.update(nodes, edges) } @@ -195,81 +202,17 @@ export function MemoryGraph({ ) }, [nodes, containerSize.width, graphFitHeight]) - // Auto-fit when data first loads. Mobile needs a few passes because the - // force simulation can move nodes after the first layout frame. - const hasAutoFittedRef = useRef(false) - const hadValidContainerSizeRef = useRef(false) - useEffect(() => { - if ( - !hasAutoFittedRef.current && - nodes.length > 0 && - viewportRef.current && - hasContainerSize - ) { - const fitDelays = isCompactViewport ? [100, 450, 900] : [100, 300] - const timers = fitDelays.map((delay, index) => - setTimeout(() => { - if (!viewportRef.current || !hasContainerSize) return - viewportRef.current.fitToNodes( - nodes, - containerSize.width, - graphFitHeight, - ) - if (index === fitDelays.length - 1) { - hasAutoFittedRef.current = true - } - }, delay), - ) - return () => { - for (const timer of timers) clearTimeout(timer) - } - } - }, [ + const stopFollowing = useInitialGraphFit({ + documents: limitedDocuments, nodes, - containerSize.width, - graphFitHeight, - isCompactViewport, - hasContainerSize, - ]) - - useEffect(() => { - if (!isCompactViewport || nodes.length === 0 || !viewportRef.current) return - if (!hasContainerSize) return - const timer = setTimeout(() => { - viewportRef.current?.fitToNodes( - nodes, - containerSize.width, - graphFitHeight, - ) - }, 120) - return () => clearTimeout(timer) - }, [ - isCompactViewport, - nodes, - containerSize.width, - graphFitHeight, - hasContainerSize, - ]) - - useEffect(() => { - if (nodes.length === 0) hasAutoFittedRef.current = false - }, [nodes.length]) - - useEffect(() => { - if (isCompactViewport) { - hasAutoFittedRef.current = false - } - }, [isCompactViewport]) - - useEffect(() => { - if (hasContainerSize && !hadValidContainerSizeRef.current) { - hadValidContainerSizeRef.current = true - hasAutoFittedRef.current = false - } - if (!hasContainerSize) { - hadValidContainerSizeRef.current = false - } - }, [hasContainerSize]) + viewportRef, + simulationRef, + width: containerSize.width, + height: hasContainerSize ? graphFitHeight : 0, + isLoading: externalIsLoading, + isLoadingMore, + hasMore, + }) // Container resize observer useEffect(() => { @@ -375,11 +318,18 @@ export function MemoryGraph({ // Navigation const handleAutoFit = useCallback(() => { if (nodes.length === 0 || !viewportRef.current) return + stopFollowing() + viewportRef.current.setMinZoomForNodes( + nodes, + containerSize.width, + graphFitHeight, + ) viewportRef.current.fitToNodes(nodes, containerSize.width, graphFitHeight) - }, [nodes, containerSize.width, graphFitHeight]) + }, [nodes, containerSize.width, graphFitHeight, stopFollowing]) const handleCenter = useCallback(() => { if (nodes.length === 0 || !viewportRef.current) return + stopFollowing() let sx = 0 let sy = 0 for (const n of nodes) { @@ -392,19 +342,21 @@ export function MemoryGraph({ containerSize.width, graphFitHeight, ) - }, [nodes, containerSize.width, graphFitHeight]) + }, [nodes, containerSize.width, graphFitHeight, stopFollowing]) const handleZoomIn = useCallback(() => { const vp = viewportRef.current if (!vp) return + stopFollowing() vp.zoomTo(vp.zoom * 1.3, containerSize.width / 2, graphFitHeight / 2) - }, [containerSize.width, graphFitHeight]) + }, [containerSize.width, graphFitHeight, stopFollowing]) const handleZoomOut = useCallback(() => { const vp = viewportRef.current if (!vp) return + stopFollowing() vp.zoomTo(vp.zoom / 1.3, containerSize.width / 2, graphFitHeight / 2) - }, [containerSize.width, graphFitHeight]) + }, [containerSize.width, graphFitHeight, stopFollowing]) // Wrap onOpenDocument to dismiss the popover before opening the modal. // Without this, the popover overlay stays mounted on top of the @@ -460,6 +412,7 @@ export function MemoryGraph({ // Arrow key navigation through nodes const selectAndCenter = useCallback( (nodeId: string) => { + stopFollowing() setSelectedNode(nodeId) const n = nodes.find((nd) => nd.id === nodeId) if (n && viewportRef.current) @@ -470,7 +423,7 @@ export function MemoryGraph({ graphFitHeight, ) }, - [nodes, containerSize.width, graphFitHeight], + [nodes, containerSize.width, graphFitHeight, stopFollowing], ) const navigateUp = useCallback(() => { @@ -613,7 +566,6 @@ export function MemoryGraph({ if (!isSlideshowActive || nodes.length === 0) { if (!isSlideshowActive) { setSelectedNode(null) - simulationRef.current?.coolDown() } return } @@ -653,6 +605,7 @@ export function MemoryGraph({ return () => { clearInterval(interval) if (coolDownTimer) clearTimeout(coolDownTimer) + simulationRef.current?.coolDown() } }, [isSlideshowActive, nodes.length]) @@ -692,7 +645,7 @@ export function MemoryGraph({ display: "flex", alignItems: "center", justifyContent: "center", - backgroundColor: "transparent", + backgroundColor: variant === "console" ? colors.bg : "transparent", borderRadius: 12, } @@ -718,7 +671,12 @@ export function MemoryGraph({ height: "100%", borderRadius: 12, overflow: "hidden", - backgroundColor: "transparent", + backgroundColor: variant === "console" ? colors.bg : "transparent", + backgroundImage: + variant === "console" + ? `radial-gradient(circle, ${colors.dotColor ?? colors.textMuted} 0.5px, transparent 0.5px)` + : undefined, + backgroundSize: variant === "console" ? "16px 16px" : undefined, } const canvasContainerStyle: React.CSSProperties = { @@ -767,7 +725,16 @@ export function MemoryGraph({
{children}
)} -
+
{ + if (event.target instanceof HTMLCanvasElement) stopFollowing() + }} + onWheelCapture={(event) => { + if (event.target instanceof HTMLCanvasElement) stopFollowing() + }} + > {hasContainerSize && ( ( {zoomLevel}%