diff --git a/apps/mcp/README.md b/apps/mcp/README.md index 76bdf5ea..61309632 100644 --- a/apps/mcp/README.md +++ b/apps/mcp/README.md @@ -1,24 +1,33 @@ -# Supermemory MCP Server 4.0 +# Supermemory MCP Server -A standalone MCP (Model Context Protocol) server for Supermemory that gives AI assistants persistent memory across conversations. Built on Cloudflare Workers with Durable Objects for scalable, persistent connections. +The Supermemory MCP server gives authenticated AI clients access to a user's +memories, profile, workspaces, and interactive MCP Apps. -## Features +## Runtime Model -- **Authentication** - OAuth 2.1 with dynamic client registration -- **Persistent Memory** - Save and recall information across sessions -- **User Profiles** - Auto-generated profiles from stored memories -- **Project Scoping** - Organize memories by project with `x-sm-project` header -- **Analytics** - PostHog integration for usage tracking +- MCP SDK v2 with a fresh `McpServer` for every HTTP request +- Modern MCP `2026-07-28` plus stateless compatibility for 2025 clients +- OAuth token validation on every request +- No MCP protocol session or protocol Durable Object +- Active workspace stored as application state in a dedicated Durable Object +- Workspace state keyed by authenticated `organizationId + userId` -## Setup +The workspace used by an operation resolves in this order: -### Server URL +1. An explicit `containerTag` tool or prompt argument +2. The account's durable active workspace +3. The Supermemory client default, `sm_project_default` + +An explicit override applies only to that call. It does not mutate the active +workspace. + +## Server URL ```text https://mcp.supermemory.ai/mcp ``` -Add to your MCP client config (Claude, Cursor, Windsurf, VS Code, etc.): +Example client configuration: ```json { @@ -30,223 +39,103 @@ Add to your MCP client config (Claude, Cursor, Windsurf, VS Code, etc.): } ``` -The server requires OAuth authentication. Your MCP client will automatically discover the authorization server via `/.well-known/oauth-protected-resource` and prompt you to authenticate. - -### Project Scoping (Optional) - -To scope all operations to a specific project, add the `x-sm-project` header: - -```json -{ - "mcpServers": { - "supermemory": { - "url": "https://mcp.supermemory.ai/mcp", - "headers": { - "x-sm-project": "your-project-id" - } - } - } -} -``` +The client discovers the OAuth authorization server through +`/.well-known/oauth-protected-resource/mcp`. ## Tools -### `memory` +### Model-visible tools -Save or forget information about the user. +| Tool | Purpose | +| --- | --- | +| `search_memory` | Search memories and optionally include profile context | +| `listMemories` | List extracted memories grouped by source document | +| `listSpaces` | List workspaces visible to the authenticated account | +| `whoAmI` | Return identity, access, client, and active-workspace context | +| `add_memory` | Save or forget a memory | -```json -{ - "content": "User prefers dark mode and uses TypeScript", - "action": "save", - "containerTag": "optional-project-tag" -} -``` +### MCP App launchers -| Parameter | Type | Required | Description | -|-----------|------|----------|-------------| -| `content` | string | Yes | The memory content to save or forget | -| `action` | `"save"` \| `"forget"` | No | Default: `"save"` | -| `containerTag` | string | No | Project tag to scope the memory | +| Tool | Purpose | +| --- | --- | +| `select-workspace` | Open the interactive workspace picker | +| `memory-graph` | Open the interactive memory graph | +| `guided-save` | Open the guided memory form | +| `upload-file` | Open the file upload form | -### `recall` +### App-only tools -Search memories and get user profile. +These tools are available to the embedded MCP App and hidden from the model. -```json -{ - "query": "What are the user's programming preferences?", - "includeProfile": true, - "containerTag": "optional-project-tag" -} -``` +| Tool | Purpose | +| --- | --- | +| `set-active-tag` | Persist the selected active workspace | +| `save-memory` | Submit the guided save form | +| `upload-file-submit` | Submit an encoded file upload | +| `fetch-graph-data` | Fetch graph documents for the app | -| Parameter | Type | Required | Description | -|-----------|------|----------|-------------| -| `query` | string | Yes | Search query to find relevant memories | -| `includeProfile` | boolean | No | Include user profile summary. Default: `true` | -| `containerTag` | string | No | Project tag to scope the search | +## Resources And Prompt -### `listMemories` +| Kind | Name or URI | Purpose | +| --- | --- | --- | +| Resource | `supermemory://profile` | Profile facts in the effective workspace | +| Resource | `supermemory://container-tags` | Visible workspaces | +| Resource | `ui://supermemory/app-v3.html` | Embedded MCP App bundle | +| Prompt | `context` | Profile and recent context for an optional workspace | -Enumerate stored memories grouped by their source document, newest first. Returns only the extracted memory facts — never document content — so responses stay small enough for client output limits. Use it to audit what is on file (e.g. before forgetting stale memories); use `recall` for topic-based search. - -```json -{ - "page": 1, - "limit": 10, - "containerTag": "optional-project-tag" -} -``` - -| Parameter | Type | Required | Description | -|-----------|------|----------|-------------| -| `page` | integer | No | Page number (1-based). Default: `1` | -| `limit` | integer | No | Documents per page, each grouping its extracted memories. Default: `10`, max: `50` | -| `containerTag` | string | No | Project tag to scope the listing | - -### `whoAmI` - -Get the current logged-in user's information. - -```json -{} -``` - -Returns: `{ userId, email, name, client, sessionId }` - -## Resources - -| URI | Description | -|-----|-------------| -| `supermemory://profile` | User profile with stable preferences and recent activity | -| `supermemory://projects` | List of available memory projects | - -## Prompts - -| Name | Description | -|------|-------------| -| `context` | User profile and preferences for system context injection | +The App resource and tool metadata include both current nested `ui` metadata and +the legacy flat resource URI key while MCP Apps completes its SDK v2 migration. +The Worker runtime does not import the SDK v1 Apps server helpers. ## Development -### Prerequisites - -- [Bun](https://bun.sh/) or Node.js -- [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/) - -### Install Dependencies +Install from the repository root: ```bash bun install ``` -### Environment Variables - -Create a `.dev.vars` file: - -```env -API_URL=http://localhost:8787 -or -API_URL=https://api.supermemory.ai -``` - -| Variable | Description | Default | -|----------|-------------|---------| -| `API_URL` | Main Supermemory API URL for OAuth validation | `https://api.supermemory.ai` | - -### Run Locally +Run the local Worker: ```bash +cd apps/mcp bun run dev ``` -The server will start at `http://localhost:8788`. +The portless URL is `http://mcp.dev.supermemory`. -**Note:** For local development, you also need the main Supermemory API running at the `API_URL` for OAuth token validation. - -### End-to-End Tests - -The `e2e/` suite drives a real MCP server over streamable HTTP (no mocks) and asserts the -core journey: handshake → tool/resource/prompt discovery → `whoAmI` → `listProjects` → -`memory` save → `recall` round-trip, plus `memory-graph`/`fetch-graph-data`, resource reads, -the `context` prompt, container-tag isolation, and auth rejections. +Useful commands: ```bash -export SUPERMEMORY_MCP_URL=https://mcp.supermemory.ai/mcp # optional, this is the default -export SUPERMEMORY_API_URL=https://api.supermemory.ai # optional, OAuth authorization server -bun e2e/capture-oauth-token.ts # one-time browser authorization +bun run build +bun run check-types +bun run test:unit bun run test:e2e ``` -| File | Covers | -|------|--------| -| `e2e/auth.test.ts` | `GET /` info, OAuth discovery, 401 on missing/invalid token (runs without a key) | -| `e2e/oauth.test.ts` | OAuth discovery chain, dynamic client registration, token-endpoint negatives, real refresh→access token round-trip | -| `e2e/discovery.test.ts` | handshake, tools/resources/prompts listing, `whoAmI`, `listProjects` | -| `e2e/memory.test.ts` | save→recall round-trip, profile variants, `forget`, container scoping, bad args | -| `e2e/list-memories.test.ts` | `listMemories` discovery, save→list round-trip, pagination, arg validation | -| `e2e/root-scope.test.ts` | `x-sm-project` header strips the `containerTag` param and scopes the whole connection | -| `e2e/graph.test.ts` | `memory-graph`, `fetch-graph-data`, resource reads, `context` prompt | - -#### OAuth flow tests - -`mcp.supermemory.ai` is an OAuth **resource server**; the **authorization server** is the main -API (`api.supermemory.ai`, better-auth). `oauth.test.ts` covers the real flow in tiers: - -- **A–C (no secrets)** — discovery chain, dynamic client registration, and token/authorize - negatives. These exercise the protocol wiring with no key and no browser, so they always run. -- **D (real token)** — exchanges a seeded `refresh_token` for an `access_token` and connects to - `/mcp` with it, exercising the OAuth-token validation path. It **skips** unless both OAuth - credentials below are available. +Authenticated end-to-end tests use credentials captured by: ```bash -# One-time capture (opens a browser for login + consent, prints the env vars): bun e2e/capture-oauth-token.ts -export SUPERMEMORY_MCP_CLIENT_ID=... -export SUPERMEMORY_MCP_REFRESH_TOKEN=... ``` -Notes: -- Authenticated tests **skip** (not fail) without stored OAuth credentials or the refresh-token - environment variables, so CI is safe without secrets. -- `recall` is eventually-consistent (save → ingestion pipeline → memories), so the round-trip - **polls up to ~90s**. `forget` removal is slower still and is asserted as best-effort. -- The suite uses unique per-run markers and forgets them in teardown to avoid polluting the account. +Without stored OAuth credentials, authenticated test groups skip. Public OAuth +discovery and rejection tests still run. -### Deploy +## Configuration -```bash -bun run deploy -``` +| Variable | Purpose | Default | +| --- | --- | --- | +| `API_URL` | Supermemory API and OAuth issuer | `https://api.supermemory.ai` | +| `MCP_RESOURCE` | Expected OAuth audience | `https://mcp.supermemory.ai/mcp` | +| `ALLOWED_MCP_ORIGIN_HOSTNAMES` | Additional comma-separated browser origins | Built-in host allowlist | -## Architecture +## Storage And Rollout -``` -┌─────────────────┐ OAuth ┌──────────────────┐ -│ MCP Client │◄──────────────►│ Supermemory API │ -│ (Claude, Cursor)│ │ (api.supermemory.ai) -└────────┬────────┘ └──────────────────┘ - │ ▲ - │ MCP Protocol │ Auth Validation - ▼ │ -┌─────────────────────────────────────────────────────┐ -│ Supermemory MCP Server │ -│ (mcp.supermemory.ai/mcp) │ -│ ┌─────────────────────────────────────────────┐ │ -│ │ Cloudflare Durable Object │ │ -│ │ • Session state │ │ -│ │ • Client info persistence │ │ -│ │ • MCP protocol handling │ │ -│ └─────────────────────────────────────────────┘ │ -└─────────────────────────────────────────────────────┘ -``` +`WorkspaceState` stores only the active container tag. It never stores bearer +tokens, MCP client identity, or protocol messages. -## Tech Stack - -- **Runtime:** Cloudflare Workers -- **State:** Durable Objects with SQLite -- **Framework:** Hono -- **MCP SDK:** @modelcontextprotocol/sdk + agents -- **API Client:** supermemory SDK -- **Analytics:** PostHog +The old `SupermemoryMCP` class and binding remain inert for one rollout. This +keeps the migration non-destructive and rollback-safe. A later deployment can +delete the old protocol class after production traffic and rollback windows +have been checked. diff --git a/apps/mcp/e2e/graph.test.ts b/apps/mcp/e2e/graph.test.ts index 5a11a9f3..0d0bbe71 100644 --- a/apps/mcp/e2e/graph.test.ts +++ b/apps/mcp/e2e/graph.test.ts @@ -47,22 +47,35 @@ describeWithAuth("MCP — graph, resources & prompts", () => { const res = await s.client.readResource({ uri: "supermemory://profile" }) expect(res.contents.length).toBeGreaterThan(0) expect(res.contents[0].mimeType).toBe("text/plain") - expect(typeof res.contents[0].text).toBe("string") + expect(res.contents[0].text).toMatch(/# Active Workspace Profile/) + expect(res.contents[0].text).toMatch(/Workspace:/) + expect(res.contents[0].text).toMatch( + /Use `listSpaces` to find the relevant workspace key/, + ) }) - it("reads the container-tags resource as JSON", async () => { + it("reads all workspaces in a compact human-readable format", async () => { const res = await s.client.readResource({ uri: "supermemory://container-tags", }) const text = res.contents[0].text as string - const parsed = JSON.parse(text) - expect(Array.isArray(parsed.containerTags)).toBe(true) + expect(res.contents[0].mimeType).toBe("text/plain") + expect(text).toMatch(/# My Workspaces/) + expect(text).toMatch(/Active:/) + expect(text).not.toMatch(/"containerTags":/) }) - it("gets the context prompt as a system message", async () => { + it("gets compact active-workspace context without prompt arguments", async () => { + const prompts = await s.client.listPrompts() + const contextPrompt = prompts.prompts.find( + (prompt) => prompt.name === "context", + ) + expect(contextPrompt?.arguments ?? []).toHaveLength(0) + const res = await s.client.getPrompt({ name: "context", arguments: {} }) expect(res.messages.length).toBeGreaterThan(0) const text = res.messages[0].content.text as string - expect(text).toMatch(/memory|context/i) + expect(text).toMatch(/# Supermemory Context/) + expect(text).toMatch(/Active workspace:/) }) }) diff --git a/apps/mcp/e2e/helpers.ts b/apps/mcp/e2e/helpers.ts index e3dcfe67..e9abc436 100644 --- a/apps/mcp/e2e/helpers.ts +++ b/apps/mcp/e2e/helpers.ts @@ -183,13 +183,13 @@ export const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms)) export type Session = { client: Client; close: () => Promise } export async function connect( - opts: { token?: string; containerTag?: string } = {}, + opts: { token?: string; headers?: Record } = {}, ): Promise { const bearerToken = opts.token ?? (await defaultBearerToken()) const headers: Record = { Authorization: `Bearer ${bearerToken}`, + ...opts.headers, } - if (opts.containerTag) headers["x-sm-project"] = opts.containerTag const transport = new StreamableHTTPClientTransport(new URL(MCP_URL), { requestInit: { headers }, diff --git a/apps/mcp/e2e/root-scope.test.ts b/apps/mcp/e2e/root-scope.test.ts deleted file mode 100644 index 187730eb..00000000 --- a/apps/mcp/e2e/root-scope.test.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { randomUUID } from "node:crypto" -import { describe, expect, it } from "vitest" -import { - OAUTH_CREDENTIALS_AVAILABLE, - callTool, - connect, - recallUntil, - textOf, -} from "./helpers" - -type ToolLike = { - name: string - inputSchema?: { properties?: Record } -} - -const propsOf = (tools: ToolLike[], name: string): Record => - tools.find((t) => t.name === name)?.inputSchema?.properties ?? {} - -// Fixed tag (not a per-run UUID) so the test doesn't mint a new project each run. -const SCOPE_TAG = "sm_e2e_root" -const describeWithAuth = describe.skipIf(!OAUTH_CREDENTIALS_AVAILABLE) - -// x-sm-project locks the connection to one project: strips containerTag from schemas and scopes every op — distinct from the per-call arg. -describeWithAuth("MCP — x-sm-project root scoping", () => { - it("strips containerTag from tool schemas when x-sm-project is set", async () => { - const scoped = await connect({ containerTag: SCOPE_TAG }) - const plain = await connect() - try { - const scopedTools = (await scoped.client.listTools()).tools - const plainTools = (await plain.client.listTools()).tools - - expect(propsOf(plainTools, "add_memory")).toHaveProperty("containerTag") - expect(propsOf(plainTools, "search_memory")).toHaveProperty( - "containerTag", - ) - - expect(propsOf(scopedTools, "add_memory")).not.toHaveProperty( - "containerTag", - ) - expect(propsOf(scopedTools, "search_memory")).not.toHaveProperty( - "containerTag", - ) - } finally { - await scoped.close() - await plain.close() - } - }) - - it("scopes saves to the connection project and isolates them from default", async () => { - const marker = `root-${randomUUID()}` - const content = `e2e root scope. token=${marker}. The root flower is bluebell.` - - const rooted = await connect({ containerTag: SCOPE_TAG }) - try { - const save = await callTool(rooted.client, "add_memory", { - content, - action: "save", - }) - expect(save.isError).toBeFalsy() - expect(textOf(save)).toContain(SCOPE_TAG) - - const found = await recallUntil( - rooted.client, - "root flower bluebell", - marker, - ) - expect(found, "marker not found within its root scope").not.toBeNull() - } finally { - await callTool(rooted.client, "add_memory", { - content, - action: "forget", - }).catch(() => {}) - await rooted.close() - } - - // A default connection searches sm_project_default only — must not see it. - const plain = await connect() - try { - const leaked = await recallUntil( - plain.client, - "root flower bluebell", - marker, - { - tries: 3, - delayMs: 3000, - }, - ) - expect(leaked, "rooted memory leaked into the default project").toBeNull() - } finally { - await plain.close() - } - }, 120_000) -}) diff --git a/apps/mcp/e2e/workspace-scope.test.ts b/apps/mcp/e2e/workspace-scope.test.ts new file mode 100644 index 00000000..ccff5eb7 --- /dev/null +++ b/apps/mcp/e2e/workspace-scope.test.ts @@ -0,0 +1,38 @@ +import { describe, expect, it } from "vitest" +import { OAUTH_CREDENTIALS_AVAILABLE, connect } from "./helpers" + +type ToolLike = { + name: string + inputSchema?: { properties?: Record } +} + +const propsOf = (tools: ToolLike[], name: string): Record => + tools.find((t) => t.name === name)?.inputSchema?.properties ?? {} + +const describeWithAuth = describe.skipIf(!OAUTH_CREDENTIALS_AVAILABLE) + +describeWithAuth("MCP - workspace scoping", () => { + it("keeps per-call containerTag overrides when an obsolete header is sent", async () => { + const scoped = await connect({ + headers: { "x-sm-project": "obsolete-root-scope" }, + }) + const plain = await connect() + try { + const scopedTools = (await scoped.client.listTools()).tools + const plainTools = (await plain.client.listTools()).tools + + expect(propsOf(plainTools, "add_memory")).toHaveProperty("containerTag") + expect(propsOf(plainTools, "search_memory")).toHaveProperty( + "containerTag", + ) + + expect(propsOf(scopedTools, "add_memory")).toHaveProperty("containerTag") + expect(propsOf(scopedTools, "search_memory")).toHaveProperty( + "containerTag", + ) + } finally { + await scoped.close() + await plain.close() + } + }) +}) diff --git a/apps/mcp/package.json b/apps/mcp/package.json index dc08ca1d..8d731aa4 100644 --- a/apps/mcp/package.json +++ b/apps/mcp/package.json @@ -2,6 +2,10 @@ "name": "supermemory-mcp", "version": "1.0.0", "type": "module", + "portless": { + "name": "mcp.dev.supermemory", + "script": "dev:app" + }, "scripts": { "build:widget": "vite build", "build": "vite build", @@ -10,19 +14,23 @@ "dev:widget": "vite --config vite.config.dev.ts", "studio": "vite --config vite.config.dev.ts --open /studio.html", "deploy": "vite build && wrangler deploy --minify", - "check-types": "tsc --noEmit -p tsconfig.widget.json", + "check-types": "tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.widget.json", + "test:unit": "vitest run src/server src/widget", + "test:e2e": "vitest run e2e", "cf-typegen": "wrangler types --env-interface CloudflareBindings" }, "dependencies": { "@cloudflare/workers-oauth-provider": "^0.2.2", - "@modelcontextprotocol/ext-apps": "^1.0.0", - "@modelcontextprotocol/sdk": "^1.25.2", + "@modelcontextprotocol/client": "2.0.0", + "@modelcontextprotocol/ext-apps": "^1.7.5", + "@modelcontextprotocol/sdk": "1.30.0", + "@modelcontextprotocol/server": "2.0.0", "@phosphor-icons/react": "^2.1.10", "@radix-ui/react-popover": "^1.1.15", "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-tooltip": "^1.2.7", "@supermemory/memory-graph": "^0.2.0", - "agents": "^0.3.5", + "agents": "^0.20.1", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "hono": "^4.11.1", @@ -31,7 +39,7 @@ "react-dom": "^19.2.4", "supermemory": "^4.0.0", "tailwind-merge": "^3.4.0", - "zod": "^3.25.76" + "zod": "^4.4.3" }, "devDependencies": { "@cloudflare/workers-types": "^4.20250620.0", @@ -43,6 +51,7 @@ "typescript": "^5.8.3", "vite": "^6.0.0", "vite-plugin-singlefile": "^2.3.0", + "vitest": "^3.2.4", "wrangler": "^4.4.0" } } diff --git a/apps/mcp/src/server/agent.ts b/apps/mcp/src/server/agent.ts deleted file mode 100644 index 9c749ed3..00000000 --- a/apps/mcp/src/server/agent.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" -import { McpAgent } from "agents/mcp" -import type { Props } from "../shared/types" -import { fetchSession } from "./auth" -import { SupermemoryClient } from "./client" -import { registerContextPrompt } from "./prompts/context" -import { registerContainerTagsResource } from "./resources/container-tags" -import { registerProfileResource } from "./resources/profile" -import { registerWidgetResource } from "./resources/widget" -import { registerAllTools } from "./tools" -import { errorResult } from "./tools/types" - -type Env = { - MCP_SERVER: DurableObjectNamespace - API_URL?: string -} - -const DEFAULT_API_URL = "https://api.supermemory.ai" -const ACTIVE_CONTAINER_TAG_KEY = "activeContainerTag" - -export class SupermemoryMCP extends McpAgent { - private clientInfo: { name: string; version?: string } | null = null - - // @ts-expect-error - agents/mcp ships its own bundled @modelcontextprotocol/sdk; - // our installed sdk has a private `_serverInfo` field with a different declaration. - server = new McpServer({ - name: "supermemory", - version: "1.0.0", - }) - - async init() { - const stored = await this.ctx.storage.get<{ - name: string - version?: string - }>("clientInfo") - if (stored) this.clientInfo = stored - - this.server.server.oninitialized = async () => { - const v = this.server.server.getClientVersion() - if (v) { - this.clientInfo = { name: v.name, version: v.version } - await this.ctx.storage.put("clientInfo", this.clientInfo) - } - } - - const deps = { - server: this.server, - props: this.props, - getClient: (containerTag?: string) => this.getClient(containerTag), - getSession: () => this.getSession(), - resolveContainerTag: (explicit?: string) => - this.resolveContainerTag(explicit), - getActiveContainerTag: () => this.getActiveContainerTag(), - setActiveContainerTag: (containerTag: string) => - this.setActiveContainerTag(containerTag), - getClientInfo: () => this.clientInfo, - getMcpSessionId: () => this.getSessionId(), - errorResult, - } - - registerAllTools(deps) - - registerProfileResource(this.server, () => this.getClient()) - registerContainerTagsResource(this.server, () => this.getClient()) - registerWidgetResource(this.server) - - registerContextPrompt( - this.server, - !!this.props?.containerTag, - (tag) => this.getClient(tag), - (explicit) => this.resolveContainerTag(explicit), - ) - } - - private getClient(containerTag?: string): SupermemoryClient { - return new SupermemoryClient( - this.props?.bearerToken || "", - containerTag || this.props?.containerTag, - this.env.API_URL || DEFAULT_API_URL, - ) - } - - private async resolveContainerTag( - explicit?: string, - ): Promise { - if (this.props?.containerTag) return this.props.containerTag - if (explicit) return explicit - const activeTag = await this.getActiveContainerTag() - if (activeTag) return activeTag - return undefined - } - - private workspaceState() { - const userId = this.props?.userId - if (!userId) throw new Error("Authenticated user ID is required") - const organizationId = this.props?.organizationId ?? "default" - return this.env.MCP_SERVER.getByName( - `workspace-state:${userId}:${organizationId}`, - ) - } - - private getActiveContainerTag(): Promise { - return this.workspaceState().readActiveContainerTag() - } - - private setActiveContainerTag(containerTag: string): Promise { - return this.workspaceState().writeActiveContainerTag(containerTag) - } - - async readActiveContainerTag(): Promise { - return this.ctx.storage.get(ACTIVE_CONTAINER_TAG_KEY) - } - - async writeActiveContainerTag(containerTag: string): Promise { - await this.ctx.storage.put(ACTIVE_CONTAINER_TAG_KEY, containerTag) - } - - private getSession() { - return fetchSession( - this.props?.bearerToken || "", - this.env.API_URL || DEFAULT_API_URL, - ) - } -} diff --git a/apps/mcp/src/server/app-metadata.test.ts b/apps/mcp/src/server/app-metadata.test.ts new file mode 100644 index 00000000..2ffe5602 --- /dev/null +++ b/apps/mcp/src/server/app-metadata.test.ts @@ -0,0 +1,27 @@ +import { describe, expect, it } from "vitest" +import { SUPERMEMORY_RESOURCE_URI } from "../shared/types" +import { appResultMeta, appToolMeta } from "./app-metadata" + +describe("MCP Apps metadata compatibility", () => { + it("advertises both current and legacy resource URI metadata", () => { + expect(appToolMeta()).toEqual({ + ui: { resourceUri: SUPERMEMORY_RESOURCE_URI }, + "ui/resourceUri": SUPERMEMORY_RESOURCE_URI, + }) + }) + + it("keeps App-only tools hidden from the model", () => { + expect(appToolMeta(["app"])).toMatchObject({ + ui: { + resourceUri: SUPERMEMORY_RESOURCE_URI, + visibility: ["app"], + }, + }) + }) + + it("provides a stable ChatGPT widget-state key", () => { + expect(appResultMeta("view-123")).toEqual({ + "openai/widgetSessionId": "view-123", + }) + }) +}) diff --git a/apps/mcp/src/server/app-metadata.ts b/apps/mcp/src/server/app-metadata.ts new file mode 100644 index 00000000..676aaebc --- /dev/null +++ b/apps/mcp/src/server/app-metadata.ts @@ -0,0 +1,29 @@ +import { SUPERMEMORY_RESOURCE_URI } from "../shared/types" + +export const APP_RESOURCE_MIME_TYPE = "text/html;profile=mcp-app" + +type AppVisibility = "model" | "app" + +export function appToolMeta( + visibility?: AppVisibility[], +): Record { + const ui = { + resourceUri: SUPERMEMORY_RESOURCE_URI, + ...(visibility ? { visibility } : {}), + } + + return { + ui, + "ui/resourceUri": SUPERMEMORY_RESOURCE_URI, + } +} + +/** + * ChatGPT keys widget-scoped state by this id. Other MCP Apps hosts safely + * ignore the namespaced metadata and use the View's own checkpoint fallback. + */ +export function appResultMeta(viewId: string): Record { + return { + "openai/widgetSessionId": viewId, + } +} diff --git a/apps/mcp/src/server/auth/index.test.ts b/apps/mcp/src/server/auth/index.test.ts index cf3c98f2..e3501890 100644 --- a/apps/mcp/src/server/auth/index.test.ts +++ b/apps/mcp/src/server/auth/index.test.ts @@ -24,9 +24,20 @@ describe("MCP authentication", () => { }) async function signToken( - overrides: { audience?: string; subject?: string; expiresIn?: string } = {}, + overrides: { + audience?: string + subject?: string + expiresIn?: string + organizationId?: string + } = {}, ) { - let token = new SignJWT({ organization_id: "org_test" }) + let token = new SignJWT({ + ...(overrides.organizationId === "" + ? {} + : { organization_id: overrides.organizationId ?? "org_test" }), + azp: "client_test", + scope: "openid profile", + }) .setProtectedHeader({ alg: "RS256", kid: "test-key" }) .setIssuer(ISSUER) .setAudience(overrides.audience ?? MCP_RESOURCE) @@ -51,10 +62,21 @@ describe("MCP authentication", () => { userId: "user_test", organizationId: "org_test", bearerToken: token, + oauthClientId: "client_test", + scopes: ["openid", "profile"], + expiresAt: expect.any(Number), }) expect(fetchSpy).not.toHaveBeenCalled() }) + it("rejects a token without an organization boundary", async () => { + const token = await signToken({ organizationId: "" }) + + await expect( + validateOAuthToken(token, API_URL, MCP_RESOURCE, keySet), + ).resolves.toBeNull() + }) + it("rejects a token issued for a different audience", async () => { vi.spyOn(console, "error").mockImplementation(() => {}) const token = await signToken({ audience: "https://api.example.com" }) diff --git a/apps/mcp/src/server/auth/index.ts b/apps/mcp/src/server/auth/index.ts index 393b8e2a..0d7a5ed4 100644 --- a/apps/mcp/src/server/auth/index.ts +++ b/apps/mcp/src/server/auth/index.ts @@ -5,8 +5,11 @@ const FETCH_TIMEOUT_MS = 30_000 export interface AuthUser { userId: string - organizationId?: string + organizationId: string bearerToken: string + oauthClientId?: string + scopes: string[] + expiresAt?: number } const remoteJwks = new Map>() @@ -65,13 +68,32 @@ export async function validateOAuthToken( if (typeof payload.sub !== "string" || payload.sub.length === 0) { return null } + if ( + typeof payload.organization_id !== "string" || + payload.organization_id.length === 0 + ) { + return null + } + + const rawScopes = payload.scope ?? payload.scopes + const scopes = Array.isArray(rawScopes) + ? rawScopes.filter((scope): scope is string => typeof scope === "string") + : typeof rawScopes === "string" + ? rawScopes.split(/\s+/).filter(Boolean) + : [] + return { userId: payload.sub, - organizationId: - typeof payload.organization_id === "string" - ? payload.organization_id - : undefined, + organizationId: payload.organization_id, bearerToken: token, + oauthClientId: + typeof payload.azp === "string" + ? payload.azp + : typeof payload.client_id === "string" + ? payload.client_id + : undefined, + scopes, + expiresAt: payload.exp, } } catch (error) { console.error("OAuth token validation error:", error) diff --git a/apps/mcp/src/server/client/index.ts b/apps/mcp/src/server/client/index.ts index 0beb9f8d..87c22077 100644 --- a/apps/mcp/src/server/client/index.ts +++ b/apps/mcp/src/server/client/index.ts @@ -7,7 +7,7 @@ import type { } from "../../shared/types" const MAX_CHARS = 200000 -const DEFAULT_PROJECT_ID = "sm_project_default" +export const DEFAULT_PROJECT_ID = "sm_project_default" const FETCH_TIMEOUT_MS = 30_000 export type { diff --git a/apps/mcp/src/server/container-tag.ts b/apps/mcp/src/server/container-tag.ts new file mode 100644 index 00000000..82098f40 --- /dev/null +++ b/apps/mcp/src/server/container-tag.ts @@ -0,0 +1,8 @@ +import { z } from "zod" + +export const containerTagSchema = z + .string() + .min(1, "Container tag is required") + .max(128, "Container tag exceeds maximum length") + +export const optionalContainerTagSchema = containerTagSchema.optional() diff --git a/apps/mcp/src/server/index.ts b/apps/mcp/src/server/index.ts index e0660fd6..9247a745 100644 --- a/apps/mcp/src/server/index.ts +++ b/apps/mcp/src/server/index.ts @@ -1,17 +1,15 @@ +import type { AuthInfo } from "@modelcontextprotocol/server" +import { createMcpHandler } from "agents/mcp/server" import { Hono, type Context } from "hono" import { cors } from "hono/cors" import type { ContentfulStatusCode } from "hono/utils/http-status" -import type { Props } from "../shared/types" -import { SupermemoryMCP } from "./agent" -import { validateOAuthToken } from "./auth" +import { validateOAuthToken, type AuthUser } from "./auth" +import { SupermemoryMCP } from "./legacy-protocol-state" +import { createSupermemoryServer } from "./server" +import type { ActorContext, ServerEnv } from "./types" +import { WorkspaceState } from "./workspace-state" -type Bindings = { - MCP_SERVER: DurableObjectNamespace - API_URL?: string - MCP_RESOURCE?: string -} - -export type { Props } +type Bindings = ServerEnv const app = new Hono<{ Bindings: Bindings }>() @@ -19,22 +17,31 @@ const DEFAULT_API_URL = "https://api.supermemory.ai" const DEFAULT_MCP_RESOURCE = "https://mcp.supermemory.ai/mcp" const PROTECTED_RESOURCE_METADATA_PATH = "/.well-known/oauth-protected-resource/mcp" +const DEFAULT_ALLOWED_ORIGIN_HOSTNAMES = [ + "app.supermemory.ai", + "mcp.supermemory.ai", + "mcp.dev.supermemory.ai", + "mcp.dev.supermemory", + "claude.ai", + "chatgpt.com", + "chat.openai.com", + "gemini.google.com", + "grok.com", + "x.ai", + "t3.chat", + "localhost", + "127.0.0.1", + "[::1]", +] app.use( "*", cors({ origin: "*", allowMethods: ["GET", "POST", "DELETE", "OPTIONS"], - allowHeaders: [ - "Content-Type", - "Authorization", - "x-sm-project", - "Accept", - "Mcp-Session-Id", - "MCP-Protocol-Version", - "Last-Event-ID", - ], - exposeHeaders: ["Mcp-Session-Id", "WWW-Authenticate"], + // When omitted, Hono echoes Access-Control-Request-Headers. This keeps + // modern Mcp-Method/Mcp-Name/Mcp-Param-* routing forward-compatible. + exposeHeaders: ["WWW-Authenticate"], }), ) @@ -42,31 +49,27 @@ app.get("/", (c) => { return c.json({ name: "supermemory-mcp", version: "1.0.0", - description: "Supermemory MCP — AI memory for teams", - docs: "https://docs.supermemory.ai/mcp", + description: "Supermemory MCP - AI memory for teams", + docs: "https://supermemory.ai/docs/supermemory-mcp/mcp", }) }) -// OAuth discovery: resource metadata. The protected resource is the MCP -// endpoint itself, so path-aware clients discover metadata at the well-known -// URL with `/mcp` appended. function resourceMetadata(c: Context<{ Bindings: Bindings }>) { const apiUrl = c.env.API_URL || DEFAULT_API_URL const mcpResource = c.env.MCP_RESOURCE || DEFAULT_MCP_RESOURCE return c.json({ resource: mcpResource, - authorization_servers: [apiUrl], + authorization_servers: [`${apiUrl.replace(/\/+$/, "")}/api/auth`], scopes_supported: ["openid", "profile", "email", "offline_access"], bearer_methods_supported: ["header"], - resource_documentation: "https://docs.supermemory.ai/mcp", + resource_documentation: "https://supermemory.ai/docs/supermemory-mcp/mcp", }) } app.get("/.well-known/oauth-protected-resource", resourceMetadata) app.get(PROTECTED_RESOURCE_METADATA_PATH, resourceMetadata) -// OAuth discovery: proxy authorization server metadata app.get("/.well-known/oauth-authorization-server", async (c) => { const apiUrl = c.env.API_URL || DEFAULT_API_URL @@ -80,42 +83,46 @@ app.get("/.well-known/oauth-authorization-server", async (c) => { { status: response.status as ContentfulStatusCode }, ) } - const metadata = await response.json() - return c.json(metadata) + return c.json(await response.json()) } catch (error) { console.error("Error fetching OAuth metadata:", error) return c.json({ error: "Internal server error" }, 500) } }) -const mcpHandler = SupermemoryMCP.serve("/mcp", { - binding: "MCP_SERVER", - corsOptions: { - origin: "*", - methods: "GET, POST, DELETE, OPTIONS", - headers: "Content-Type, Authorization, x-sm-project", - }, -}) +function allowedOriginHostnames(env: Bindings): string[] { + const configured = + env.ALLOWED_MCP_ORIGIN_HOSTNAMES?.split(",") + .map((hostname) => hostname.trim().toLowerCase()) + .filter(Boolean) ?? [] -async function handleMcpRequest( - c: Context<{ Bindings: Bindings }>, - rewritePath?: string, -) { - const authHeader = c.req.header("Authorization") - const token = authHeader?.replace(/^Bearer\s+/i, "") - const containerTag = c.req.header("x-sm-project") - const apiUrl = c.env.API_URL || DEFAULT_API_URL - const mcpResource = c.env.MCP_RESOURCE || DEFAULT_MCP_RESOURCE + return [...new Set([...DEFAULT_ALLOWED_ORIGIN_HOSTNAMES, ...configured])] +} - // Build absolute resource_metadata URL from incoming request (works - // behind tunnels where the scheme/host differ from localhost) - const reqHost = c.req.header("x-forwarded-host") || c.req.header("host") || "" - const reqProto = c.req.header("x-forwarded-proto") || "https" - const resourceMetadataUrl = reqHost - ? `${reqProto}://${reqHost}${PROTECTED_RESOURCE_METADATA_PATH}` - : PROTECTED_RESOURCE_METADATA_PATH +function authInfoFor( + authUser: AuthUser, + resource: string, +): AuthInfo | undefined { + if (!authUser.oauthClientId) return undefined - if (!token) { + return { + token: authUser.bearerToken, + clientId: authUser.oauthClientId, + scopes: authUser.scopes, + expiresAt: authUser.expiresAt, + resource: new URL(resource), + extra: { + userId: authUser.userId, + organizationId: authUser.organizationId, + }, + } +} + +function unauthorizedResponse( + resourceMetadataUrl: string, + invalidToken = false, +): Response { + if (!invalidToken) { return new Response("Unauthorized", { status: 401, headers: { @@ -126,55 +133,76 @@ async function handleMcpRequest( }) } - const authUser = await validateOAuthToken(token, apiUrl, mcpResource) - - if (!authUser) { - return new Response( - JSON.stringify({ - jsonrpc: "2.0", - error: { - code: -32000, - message: "Invalid or expired token", - }, - id: null, - }), - { - status: 401, - headers: { - "Content-Type": "application/json", - "WWW-Authenticate": `Bearer error="invalid_token", resource_metadata="${resourceMetadataUrl}"`, - "Access-Control-Expose-Headers": "WWW-Authenticate", - "Access-Control-Allow-Origin": "*", - }, + return Response.json( + { + jsonrpc: "2.0", + error: { + code: -32000, + message: "Invalid or expired token", }, - ) + id: null, + }, + { + status: 401, + headers: { + "WWW-Authenticate": `Bearer error="invalid_token", resource_metadata="${resourceMetadataUrl}"`, + "Access-Control-Expose-Headers": "WWW-Authenticate", + "Access-Control-Allow-Origin": "*", + }, + }, + ) +} + +async function handleMcpRequest( + c: Context<{ Bindings: Bindings }>, + rewritePath?: string, +) { + const authHeader = c.req.header("Authorization") + const token = authHeader?.replace(/^Bearer\s+/i, "").trim() + const apiUrl = c.env.API_URL || DEFAULT_API_URL + const mcpResource = c.env.MCP_RESOURCE || DEFAULT_MCP_RESOURCE + + const reqHost = c.req.header("x-forwarded-host") || c.req.header("host") || "" + const reqProto = c.req.header("x-forwarded-proto") || "https" + const resourceMetadataUrl = reqHost + ? `${reqProto}://${reqHost}${PROTECTED_RESOURCE_METADATA_PATH}` + : PROTECTED_RESOURCE_METADATA_PATH + + if (!token) return unauthorizedResponse(resourceMetadataUrl) + + const authUser = await validateOAuthToken(token, apiUrl, mcpResource) + if (!authUser) return unauthorizedResponse(resourceMetadataUrl, true) + + const actor: ActorContext = { + userId: authUser.userId, + organizationId: authUser.organizationId, + bearerToken: authUser.bearerToken, + oauthClientId: authUser.oauthClientId, } - - const ctx = { - ...c.executionCtx, - props: { - userId: authUser.userId, - organizationId: authUser.organizationId, - bearerToken: authUser.bearerToken, - containerTag, - } satisfies Props, - } as ExecutionContext & { props: Props } - const request = rewritePath ? new Request(new URL(rewritePath, c.req.url).toString(), c.req.raw) : c.req.raw + const handler = createMcpHandler( + () => createSupermemoryServer(c.env, actor), + { + route: "/mcp", + legacy: "stateless", + corsOptions: false, + allowedOriginHostnames: allowedOriginHostnames(c.env), + onerror: (error) => console.error("MCP request error:", error), + }, + ) - return mcpHandler.fetch(request, c.env, ctx) + return handler.fetch(request, { + authInfo: authInfoFor(authUser, mcpResource), + }) } -app.all("/", async (c) => { - return handleMcpRequest(c, "/mcp") -}) +app.all("/", (c) => handleMcpRequest(c, "/mcp")) +app.all("/mcp", (c) => handleMcpRequest(c)) +app.all("/mcp/", (c) => handleMcpRequest(c, "/mcp")) -app.all("/mcp/*", async (c) => { - return handleMcpRequest(c) -}) - -export { SupermemoryMCP } +export { SupermemoryMCP, WorkspaceState } +export type { ActorContext, ServerEnv } export default app diff --git a/apps/mcp/src/server/legacy-protocol-state.ts b/apps/mcp/src/server/legacy-protocol-state.ts new file mode 100644 index 00000000..8d4bf2f3 --- /dev/null +++ b/apps/mcp/src/server/legacy-protocol-state.ts @@ -0,0 +1,5 @@ +import { DurableObject } from "cloudflare:workers" + +// Kept for one rollout so the old protocol Durable Object class remains +// deployable and rollback-safe. No request path uses this class anymore. +export class SupermemoryMCP extends DurableObject {} diff --git a/apps/mcp/src/server/prompts/context.ts b/apps/mcp/src/server/prompts/context.ts index 3751b441..927cb88f 100644 --- a/apps/mcp/src/server/prompts/context.ts +++ b/apps/mcp/src/server/prompts/context.ts @@ -1,76 +1,98 @@ -import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" -import { z } from "zod" -import type { SupermemoryClient } from "../client" +import type { McpServer } from "@modelcontextprotocol/server" +import { DEFAULT_PROJECT_ID, type SupermemoryClient } from "../client" +import { + compactDescription, + formatFactSection, + formatWorkspaceRow, + sortWorkspaces, + workspaceDisplayName, + workspaceMetadata, +} from "../workspace-presentation" + +const CONTEXT_FACT_LIMIT = 8 +const RECENT_WORKSPACE_LIMIT = 3 export function registerContextPrompt( server: McpServer, - hasRootContainerTag: boolean, getClient: (tag?: string) => SupermemoryClient, - resolveContainerTag: (explicit?: string) => Promise, + resolveContainerTag: () => Promise, ) { - const containerTagField: Record = hasRootContainerTag - ? {} - : { - containerTag: z - .string() - .max(128, "Container tag exceeds maximum length") - .optional(), - } - - const argsSchema = { - includeRecent: z.boolean().optional().default(true), - ...containerTagField, - } - server.registerPrompt( "context", { - description: "Get user context including profile and workspace info", - argsSchema, + description: "Attach compact context for the active workspace", }, - async (rawArgs) => { - const args = rawArgs as { - includeRecent?: boolean - containerTag?: string - } + async () => { try { - const effectiveTag = await resolveContainerTag(args.containerTag) - const client = getClient(effectiveTag) - const profileResult = await client.getProfile() + const selectedTag = await resolveContainerTag() + const activeKey = selectedTag ?? DEFAULT_PROJECT_ID + const [profileResult, workspaces] = await Promise.all([ + getClient(activeKey).getProfile(), + getClient().listContainerTags(), + ]) + const activeWorkspace = workspaces.find( + (workspace) => workspace.containerTag === activeKey, + ) + const activeLabel = workspaceDisplayName(activeWorkspace, activeKey) + const fallback = selectedTag ? "" : " (default)" + const parts: string[] = [ + "# Supermemory Context", + `Active workspace: ${activeLabel} [${activeKey}]${fallback}`, + ] - const parts: string[] = [] - - if (profileResult.profile.static.length > 0) { - parts.push("## About the user") - for (const fact of profileResult.profile.static) { - parts.push(`- ${fact}`) - } + if (activeWorkspace) { + const metadata = workspaceMetadata(activeWorkspace) + if (metadata) parts.push(metadata) + const description = compactDescription(activeWorkspace.description) + if (description) parts.push(description) } + parts.push( + "", + ...formatFactSection( + "Stable Context", + profileResult.profile.static, + CONTEXT_FACT_LIMIT, + ), + ...formatFactSection( + "Recent Context", + profileResult.profile.dynamic, + CONTEXT_FACT_LIMIT, + ), + ) + if ( - args.includeRecent !== false && - profileResult.profile.dynamic.length > 0 + profileResult.profile.static.length === 0 && + profileResult.profile.dynamic.length === 0 ) { - parts.push("\n## Recent context") - for (const fact of profileResult.profile.dynamic) { - parts.push(`- ${fact}`) - } + parts.push("No profile facts are available for this workspace yet.") } - if (effectiveTag) { - parts.push(`\n## Active workspace: ${effectiveTag}`) + const recentWorkspaces = sortWorkspaces(workspaces, activeKey) + .filter((workspace) => workspace.containerTag !== activeKey) + .slice(0, RECENT_WORKSPACE_LIMIT) + if (recentWorkspaces.length > 0) { + parts.push( + "", + "## Recently Active Workspaces", + ...recentWorkspaces.map((workspace) => + formatWorkspaceRow(workspace, activeKey, 100), + ), + ) } + parts.push( + "", + "Use a workspace key with workspace-aware tools when the user asks about another workspace. Keep workspace contexts separate unless the user asks to combine them.", + ) + return { messages: [ { role: "user" as const, content: { type: "text" as const, - text: - parts.length > 0 - ? parts.join("\n") - : "No user context available yet.", + text: parts.join("\n"), }, }, ], diff --git a/apps/mcp/src/server/resources/container-tags.ts b/apps/mcp/src/server/resources/container-tags.ts index d45fbe0c..f31a7902 100644 --- a/apps/mcp/src/server/resources/container-tags.ts +++ b/apps/mcp/src/server/resources/container-tags.ts @@ -1,23 +1,48 @@ -import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" -import type { SupermemoryClient } from "../client" +import type { McpServer } from "@modelcontextprotocol/server" +import { DEFAULT_PROJECT_ID, type SupermemoryClient } from "../client" +import { + formatWorkspaceRow, + sortWorkspaces, + workspaceDisplayName, +} from "../workspace-presentation" export function registerContainerTagsResource( server: McpServer, getClient: () => SupermemoryClient, + resolveContainerTag: () => Promise, ) { server.registerResource( - "My Container Tags", + "My Workspaces", "supermemory://container-tags", {}, async () => { const client = getClient() - const containerTags = await client.listContainerTags() + const [containerTags, selectedTag] = await Promise.all([ + client.listContainerTags(), + resolveContainerTag(), + ]) + const activeKey = selectedTag ?? DEFAULT_PROJECT_ID + const activeWorkspace = containerTags.find( + (workspace) => workspace.containerTag === activeKey, + ) + const rows = sortWorkspaces(containerTags, activeKey).map((workspace) => + formatWorkspaceRow(workspace, activeKey), + ) + const activeLabel = workspaceDisplayName(activeWorkspace, activeKey) + const fallback = selectedTag ? "" : " (default)" + const text = [ + "# My Workspaces", + `${containerTags.length} available · Active: ${activeLabel} [${activeKey}]${fallback}`, + "", + ...rows, + ].join("\n") + return { contents: [ { uri: "supermemory://container-tags", - mimeType: "application/json", - text: JSON.stringify({ containerTags }, null, 2), + mimeType: "text/plain", + text, }, ], } diff --git a/apps/mcp/src/server/resources/profile.ts b/apps/mcp/src/server/resources/profile.ts index 06ddbb4b..00149eff 100644 --- a/apps/mcp/src/server/resources/profile.ts +++ b/apps/mcp/src/server/resources/profile.ts @@ -1,42 +1,79 @@ -import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" -import type { SupermemoryClient } from "../client" +import type { McpServer } from "@modelcontextprotocol/server" +import { DEFAULT_PROJECT_ID, type SupermemoryClient } from "../client" +import { + compactDescription, + formatFactSection, + workspaceDisplayName, + workspaceMetadata, +} from "../workspace-presentation" + +const PROFILE_FACT_LIMIT = 12 export function registerProfileResource( server: McpServer, - getClient: () => SupermemoryClient, + getClient: (containerTag?: string) => SupermemoryClient, + resolveContainerTag: () => Promise, ) { server.registerResource( - "User Profile", + "Active Workspace Profile", "supermemory://profile", {}, async () => { - const client = getClient() - const profileResult = await client.getProfile() - const parts: string[] = ["# User Profile\n"] + const selectedTag = await resolveContainerTag() + const activeKey = selectedTag ?? DEFAULT_PROJECT_ID + const [profileResult, workspaces] = await Promise.all([ + getClient(activeKey).getProfile(), + getClient().listContainerTags(), + ]) + const activeWorkspace = workspaces.find( + (workspace) => workspace.containerTag === activeKey, + ) + const activeLabel = workspaceDisplayName(activeWorkspace, activeKey) + const fallback = selectedTag ? "" : " (default)" + const parts: string[] = [ + "# Active Workspace Profile", + `Workspace: ${activeLabel} [${activeKey}]${fallback}`, + ] - if (profileResult.profile.static.length > 0) { - parts.push("## Stable Preferences") - for (const fact of profileResult.profile.static) { - parts.push(`- ${fact}`) - } + if (activeWorkspace) { + const metadata = workspaceMetadata(activeWorkspace) + if (metadata) parts.push(metadata) + const description = compactDescription(activeWorkspace.description) + if (description) parts.push(description) } - if (profileResult.profile.dynamic.length > 0) { - parts.push("\n## Recent Activity") - for (const fact of profileResult.profile.dynamic) { - parts.push(`- ${fact}`) - } + parts.push( + "", + ...formatFactSection( + "Stable Context", + profileResult.profile.static, + PROFILE_FACT_LIMIT, + ), + ...formatFactSection( + "Recent Context", + profileResult.profile.dynamic, + PROFILE_FACT_LIMIT, + ), + ) + + if ( + profileResult.profile.static.length === 0 && + profileResult.profile.dynamic.length === 0 + ) { + parts.push("No profile facts are available for this workspace yet.") } + parts.push( + "", + "Other workspaces are available. Use `listSpaces` to find the relevant workspace key, then use that key with workspace-aware tools when the user asks about another workspace. Keep workspace contexts separate unless the user asks to combine them.", + ) + return { contents: [ { uri: "supermemory://profile", mimeType: "text/plain", - text: - parts.length > 1 - ? parts.join("\n") - : "No profile yet. Start saving memories.", + text: parts.join("\n"), }, ], } diff --git a/apps/mcp/src/server/resources/widget.ts b/apps/mcp/src/server/resources/widget.ts index 88cb0edf..44d67a0d 100644 --- a/apps/mcp/src/server/resources/widget.ts +++ b/apps/mcp/src/server/resources/widget.ts @@ -1,10 +1,7 @@ -import { - RESOURCE_MIME_TYPE, - registerAppResource, -} from "@modelcontextprotocol/ext-apps/server" -import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" +import type { McpServer } from "@modelcontextprotocol/server" import supermemoryAppHtml from "../../../dist/src/widget/index.html" import { SUPERMEMORY_RESOURCE_URI } from "../../shared/types" +import { APP_RESOURCE_MIME_TYPE } from "../app-metadata" const CSP_DOMAINS = [ "https://esm.sh", @@ -21,15 +18,14 @@ const RESOURCE_UI_META = { } export function registerWidgetResource(server: McpServer) { - registerAppResource( - server, + server.registerResource( "Supermemory MCP UI", SUPERMEMORY_RESOURCE_URI, // Listing-level metadata: hosts use this when discovering resources // before invoking the read callback. Mirrors the read response below // so prefetch/connect-time decisions match what the host will get. { - mimeType: RESOURCE_MIME_TYPE, + mimeType: APP_RESOURCE_MIME_TYPE, _meta: { ui: RESOURCE_UI_META }, }, // Read response: per spec, content-item `_meta.ui` takes precedence @@ -39,7 +35,7 @@ export function registerWidgetResource(server: McpServer) { contents: [ { uri: SUPERMEMORY_RESOURCE_URI, - mimeType: RESOURCE_MIME_TYPE, + mimeType: APP_RESOURCE_MIME_TYPE, text: supermemoryAppHtml, _meta: { ui: RESOURCE_UI_META }, }, diff --git a/apps/mcp/src/server/server.ts b/apps/mcp/src/server/server.ts new file mode 100644 index 00000000..4a4f4d47 --- /dev/null +++ b/apps/mcp/src/server/server.ts @@ -0,0 +1,80 @@ +import { + CLIENT_INFO_META_KEY, + McpServer, + type ServerContext, +} from "@modelcontextprotocol/server" +import { fetchSession } from "./auth" +import { SupermemoryClient } from "./client" +import { registerContextPrompt } from "./prompts/context" +import { registerContainerTagsResource } from "./resources/container-tags" +import { registerProfileResource } from "./resources/profile" +import { registerWidgetResource } from "./resources/widget" +import { registerAllTools } from "./tools" +import { errorResult } from "./tools/types" +import type { ActorContext, ServerEnv } from "./types" +import { + resolveContainerTag as resolveWorkspaceContainerTag, + workspaceStateName, +} from "./workspace" + +const DEFAULT_API_URL = "https://api.supermemory.ai" + +type ClientInfo = { name: string; version?: string } + +function clientInfoFromContext(context: ServerContext): ClientInfo | null { + const envelope = context.mcpReq.envelope as + | Record + | undefined + const value = envelope?.[CLIENT_INFO_META_KEY] + if (!value || typeof value !== "object") return null + + const name = Reflect.get(value, "name") + const version = Reflect.get(value, "version") + if (typeof name !== "string") return null + + return { + name, + ...(typeof version === "string" ? { version } : {}), + } +} + +export function createSupermemoryServer( + env: ServerEnv, + actor: ActorContext, +): McpServer { + const server = new McpServer({ + name: "supermemory", + version: "1.0.0", + }) + const apiUrl = env.API_URL || DEFAULT_API_URL + const workspaceState = env.WORKSPACE_STATE.getByName( + workspaceStateName(actor), + ) + + const getClient = (containerTag?: string) => + new SupermemoryClient(actor.bearerToken, containerTag, apiUrl) + const getActiveContainerTag = () => workspaceState.getActiveContainerTag() + const setActiveContainerTag = (containerTag: string) => + workspaceState.setActiveContainerTag(containerTag) + const resolveContainerTag = (explicit?: string) => + resolveWorkspaceContainerTag(explicit, getActiveContainerTag) + + registerAllTools({ + server, + actor, + getClient, + getSession: () => fetchSession(actor.bearerToken, apiUrl), + resolveContainerTag, + getActiveContainerTag, + setActiveContainerTag, + getClientInfo: clientInfoFromContext, + errorResult, + }) + + registerProfileResource(server, getClient, resolveContainerTag) + registerContainerTagsResource(server, () => getClient(), resolveContainerTag) + registerWidgetResource(server) + registerContextPrompt(server, getClient, resolveContainerTag) + + return server +} diff --git a/apps/mcp/src/server/tools/add-memory.ts b/apps/mcp/src/server/tools/add-memory.ts index 87141715..91badcc5 100644 --- a/apps/mcp/src/server/tools/add-memory.ts +++ b/apps/mcp/src/server/tools/add-memory.ts @@ -1,26 +1,17 @@ import { z } from "zod" +import { optionalContainerTagSchema } from "../container-tag" import { MEMORY_TOOL_ANNOTATIONS } from "./annotations" import type { ToolDeps } from "./types" export function register(deps: ToolDeps) { - const containerTagField: Record = deps.props - ?.containerTag - ? {} - : { - containerTag: z - .string() - .max(128, "Container tag exceeds maximum length") - .optional(), - } - - const inputSchema = { + const inputSchema = z.object({ content: z .string() .max(200000, "Content exceeds maximum length") .describe("The memory content to save or forget"), action: z.enum(["save", "forget"]).optional().default("save"), - ...containerTagField, - } + containerTag: optionalContainerTagSchema, + }) deps.server.registerTool( "add_memory", @@ -30,12 +21,7 @@ export function register(deps: ToolDeps) { inputSchema, annotations: MEMORY_TOOL_ANNOTATIONS, }, - async (rawArgs) => { - const args = rawArgs as { - content: string - action?: "save" | "forget" - containerTag?: string - } + async (args) => { try { const effectiveTag = await deps.resolveContainerTag(args.containerTag) const client = deps.getClient(effectiveTag) diff --git a/apps/mcp/src/server/tools/fetch-graph-data.ts b/apps/mcp/src/server/tools/fetch-graph-data.ts index 7590bcea..4ab2d726 100644 --- a/apps/mcp/src/server/tools/fetch-graph-data.ts +++ b/apps/mcp/src/server/tools/fetch-graph-data.ts @@ -1,34 +1,23 @@ -import { registerAppTool } from "@modelcontextprotocol/ext-apps/server" import { z } from "zod" -import { SUPERMEMORY_RESOURCE_URI } from "../../shared/types" +import { appToolMeta } from "../app-metadata" +import { optionalContainerTagSchema } from "../container-tag" import { READ_ONLY_TOOL_ANNOTATIONS } from "./annotations" import type { ToolDeps } from "./types" export function register(deps: ToolDeps) { - registerAppTool( - deps.server, + deps.server.registerTool( "fetch-graph-data", { description: "Fetch documents with memories for graph display", - inputSchema: { - containerTag: z.string().optional(), + inputSchema: z.object({ + containerTag: optionalContainerTagSchema, page: z.number().optional().default(1), limit: z.number().optional().default(200), - }, + }), annotations: READ_ONLY_TOOL_ANNOTATIONS, - _meta: { - ui: { - resourceUri: SUPERMEMORY_RESOURCE_URI, - visibility: ["app"], - }, - }, + _meta: appToolMeta(["app"]), }, - async (rawArgs) => { - const args = rawArgs as { - containerTag?: string - page?: number - limit?: number - } + async (args) => { try { const effectiveTag = await deps.resolveContainerTag(args.containerTag) const client = deps.getClient(effectiveTag) diff --git a/apps/mcp/src/server/tools/guided-save.ts b/apps/mcp/src/server/tools/guided-save.ts index 4c52f6ce..97fc1dc9 100644 --- a/apps/mcp/src/server/tools/guided-save.ts +++ b/apps/mcp/src/server/tools/guided-save.ts @@ -1,24 +1,24 @@ -import { registerAppTool } from "@modelcontextprotocol/ext-apps/server" import { z } from "zod" -import { SUPERMEMORY_RESOURCE_URI, type ViewMessage } from "../../shared/types" +import type { ViewMessage } from "../../shared/types" +import { appResultMeta, appToolMeta } from "../app-metadata" import { effectiveContainerTagAccess } from "../auth/rbac" import type { ToolDeps } from "./types" export function register(deps: ToolDeps) { - registerAppTool( - deps.server, + deps.server.registerTool( "guided-save", { title: "Add Memory", description: "Save information to memory with an interactive form.", - inputSchema: { + inputSchema: z.object({ prefill: z.string().optional().describe("Optional content to prefill"), - }, - _meta: { ui: { resourceUri: SUPERMEMORY_RESOURCE_URI } }, + }), + _meta: appToolMeta(), }, async (args) => { try { - const prefill = (args as { prefill?: string }).prefill + const { prefill } = args + const viewId = crypto.randomUUID() const [activeTag, tags, session] = await Promise.all([ deps.getActiveContainerTag(), deps.getClient().listContainerTags(), @@ -33,6 +33,7 @@ export function register(deps: ToolDeps) { const sc: ViewMessage = { view: "save", + viewId, activeTag, writableTags, prefill, @@ -43,6 +44,7 @@ export function register(deps: ToolDeps) { { type: "text" as const, text: "Opening memory save form..." }, ], structuredContent: sc, + _meta: appResultMeta(viewId), } } catch (error) { return deps.errorResult(error) diff --git a/apps/mcp/src/server/tools/list-container-tags.ts b/apps/mcp/src/server/tools/list-container-tags.ts index 6d8856c6..cbdf8ffb 100644 --- a/apps/mcp/src/server/tools/list-container-tags.ts +++ b/apps/mcp/src/server/tools/list-container-tags.ts @@ -1,3 +1,4 @@ +import { z } from "zod" import { READ_ONLY_TOOL_ANNOTATIONS } from "./annotations" import type { ToolDeps } from "./types" @@ -7,7 +8,7 @@ export function register(deps: ToolDeps) { { description: "List the spaces available to you. Spaces are the workspaces you organize memories into — returns each space's name, identifier, emoji, document/memory counts, and last activity. The list is auto-filtered to spaces you have access to.", - inputSchema: {}, + inputSchema: z.object({}), annotations: READ_ONLY_TOOL_ANNOTATIONS, }, async () => { diff --git a/apps/mcp/src/server/tools/list-memories.ts b/apps/mcp/src/server/tools/list-memories.ts index 2fe82833..ef4eb46f 100644 --- a/apps/mcp/src/server/tools/list-memories.ts +++ b/apps/mcp/src/server/tools/list-memories.ts @@ -1,20 +1,11 @@ import { z } from "zod" +import { optionalContainerTagSchema } from "../container-tag" import { formatMemoriesList } from "../format" import { READ_ONLY_TOOL_ANNOTATIONS } from "./annotations" import type { ToolDeps } from "./types" export function register(deps: ToolDeps) { - const containerTagField: Record = deps.props - ?.containerTag - ? {} - : { - containerTag: z - .string() - .max(128, "Container tag exceeds maximum length") - .optional(), - } - - const inputSchema = { + const inputSchema = z.object({ page: z .number() .int() @@ -32,8 +23,8 @@ export function register(deps: ToolDeps) { .describe( "Documents per page; each document groups its extracted memories (default 10, max 50)", ), - ...containerTagField, - } + containerTag: optionalContainerTagSchema, + }) deps.server.registerTool( "listMemories", @@ -43,12 +34,7 @@ export function register(deps: ToolDeps) { inputSchema, annotations: READ_ONLY_TOOL_ANNOTATIONS, }, - async (rawArgs) => { - const args = rawArgs as { - page?: number - limit?: number - containerTag?: string - } + async (args) => { try { const effectiveTag = await deps.resolveContainerTag(args.containerTag) const client = deps.getClient(effectiveTag) diff --git a/apps/mcp/src/server/tools/memory-graph.ts b/apps/mcp/src/server/tools/memory-graph.ts index f58f6cf3..3768ea63 100644 --- a/apps/mcp/src/server/tools/memory-graph.ts +++ b/apps/mcp/src/server/tools/memory-graph.ts @@ -1,21 +1,16 @@ -import { registerAppTool } from "@modelcontextprotocol/ext-apps/server" import { z } from "zod" -import { SUPERMEMORY_RESOURCE_URI, type ViewMessage } from "../../shared/types" +import type { ViewMessage } from "../../shared/types" +import { appToolMeta } from "../app-metadata" +import { optionalContainerTagSchema } from "../container-tag" import { READ_ONLY_TOOL_ANNOTATIONS } from "./annotations" import type { ToolDeps } from "./types" export function register(deps: ToolDeps) { - const inputSchema: Record = deps.props?.containerTag - ? {} - : { - containerTag: z - .string() - .max(128, "Container tag exceeds maximum length") - .optional(), - } + const inputSchema = z.object({ + containerTag: optionalContainerTagSchema, + }) - registerAppTool( - deps.server, + deps.server.registerTool( "memory-graph", { title: "Memory Graph", @@ -23,12 +18,11 @@ export function register(deps: ToolDeps) { "Visualize the user's memory graph as an interactive force-directed graph.", inputSchema, annotations: READ_ONLY_TOOL_ANNOTATIONS, - _meta: { ui: { resourceUri: SUPERMEMORY_RESOURCE_URI } }, + _meta: appToolMeta(), }, - async (rawArgs) => { + async (args) => { try { - const explicit = (rawArgs as { containerTag?: string }).containerTag - const effectiveTag = await deps.resolveContainerTag(explicit) + const effectiveTag = await deps.resolveContainerTag(args.containerTag) const client = deps.getClient(effectiveTag) const containerTags = effectiveTag ? [effectiveTag] : undefined diff --git a/apps/mcp/src/server/tools/save-memory.ts b/apps/mcp/src/server/tools/save-memory.ts index 3e86cdc4..72fb8c0b 100644 --- a/apps/mcp/src/server/tools/save-memory.ts +++ b/apps/mcp/src/server/tools/save-memory.ts @@ -1,34 +1,31 @@ -import { registerAppTool } from "@modelcontextprotocol/ext-apps/server" import { z } from "zod" -import { SUPERMEMORY_RESOURCE_URI, type ViewMessage } from "../../shared/types" +import type { ViewMessage } from "../../shared/types" +import { appResultMeta, appToolMeta } from "../app-metadata" +import { containerTagSchema } from "../container-tag" import { MEMORY_TOOL_ANNOTATIONS } from "./annotations" import type { ToolDeps } from "./types" export function register(deps: ToolDeps) { - registerAppTool( - deps.server, + deps.server.registerTool( "save-memory", { description: "Save content to memory", - inputSchema: { + inputSchema: z.object({ content: z.string().min(1), - containerTag: z.string().min(1), - }, + containerTag: containerTagSchema, + viewId: z.string().uuid().optional(), + }), annotations: MEMORY_TOOL_ANNOTATIONS, - _meta: { - ui: { - resourceUri: SUPERMEMORY_RESOURCE_URI, - visibility: ["app"], - }, - }, + _meta: appToolMeta(["app"]), }, - async (rawArgs) => { - const args = rawArgs as { content: string; containerTag: string } + async (args) => { try { + const viewId = args.viewId ?? crypto.randomUUID() const client = deps.getClient(args.containerTag) const result = await client.createMemory(args.content) const sc: ViewMessage = { view: "save-success", + viewId, id: result.id, containerTag: args.containerTag, } @@ -37,6 +34,7 @@ export function register(deps: ToolDeps) { { type: "text" as const, text: `Memory saved: ${result.id}` }, ], structuredContent: sc, + _meta: appResultMeta(viewId), } } catch (error) { return deps.errorResult(error) diff --git a/apps/mcp/src/server/tools/search-memory.ts b/apps/mcp/src/server/tools/search-memory.ts index de4573fc..59a1d06f 100644 --- a/apps/mcp/src/server/tools/search-memory.ts +++ b/apps/mcp/src/server/tools/search-memory.ts @@ -1,27 +1,18 @@ import { z } from "zod" import { getMemoryText } from "../client" +import { optionalContainerTagSchema } from "../container-tag" import { READ_ONLY_TOOL_ANNOTATIONS } from "./annotations" import type { ToolDeps } from "./types" export function register(deps: ToolDeps) { - const containerTagField: Record = deps.props - ?.containerTag - ? {} - : { - containerTag: z - .string() - .max(128, "Container tag exceeds maximum length") - .optional(), - } - - const inputSchema = { + const inputSchema = z.object({ query: z .string() .max(1000, "Query exceeds maximum length") .describe("The search query to find relevant memories"), includeProfile: z.boolean().optional().default(true), - ...containerTagField, - } + containerTag: optionalContainerTagSchema, + }) deps.server.registerTool( "search_memory", @@ -31,12 +22,7 @@ export function register(deps: ToolDeps) { inputSchema, annotations: READ_ONLY_TOOL_ANNOTATIONS, }, - async (rawArgs) => { - const args = rawArgs as { - query: string - includeProfile?: boolean - containerTag?: string - } + async (args) => { try { const effectiveTag = await deps.resolveContainerTag(args.containerTag) const client = deps.getClient(effectiveTag) diff --git a/apps/mcp/src/server/tools/select-workspace.ts b/apps/mcp/src/server/tools/select-workspace.ts index 51360982..a0422f46 100644 --- a/apps/mcp/src/server/tools/select-workspace.ts +++ b/apps/mcp/src/server/tools/select-workspace.ts @@ -1,21 +1,22 @@ -import { registerAppTool } from "@modelcontextprotocol/ext-apps/server" -import { SUPERMEMORY_RESOURCE_URI, type ViewMessage } from "../../shared/types" +import { z } from "zod" +import type { ViewMessage } from "../../shared/types" +import { appResultMeta, appToolMeta } from "../app-metadata" import { effectiveContainerTagAccess } from "../auth/rbac" import type { ToolDeps } from "./types" export function register(deps: ToolDeps) { - registerAppTool( - deps.server, + deps.server.registerTool( "select-workspace", { title: "Select Workspace", description: "Choose which container tag to work in. Shows available container tags as interactive cards.", - inputSchema: {}, - _meta: { ui: { resourceUri: SUPERMEMORY_RESOURCE_URI } }, + inputSchema: z.object({}), + _meta: appToolMeta(), }, async () => { try { + const viewId = crypto.randomUUID() const client = deps.getClient() const [tags, session, activeTag] = await Promise.all([ client.listContainerTags(), @@ -29,6 +30,7 @@ export function register(deps: ToolDeps) { const sc: ViewMessage = { view: "picker", + viewId, containerTags: tags, activeTag, assignedTags, @@ -42,6 +44,7 @@ export function register(deps: ToolDeps) { }, ], structuredContent: sc, + _meta: appResultMeta(viewId), } } catch (error) { return deps.errorResult(error) diff --git a/apps/mcp/src/server/tools/set-active-tag.ts b/apps/mcp/src/server/tools/set-active-tag.ts index 397589e2..b0669780 100644 --- a/apps/mcp/src/server/tools/set-active-tag.ts +++ b/apps/mcp/src/server/tools/set-active-tag.ts @@ -1,27 +1,24 @@ -import { registerAppTool } from "@modelcontextprotocol/ext-apps/server" import { z } from "zod" -import { SUPERMEMORY_RESOURCE_URI, type ViewMessage } from "../../shared/types" +import type { ViewMessage } from "../../shared/types" +import { appResultMeta, appToolMeta } from "../app-metadata" +import { containerTagSchema } from "../container-tag" import type { ToolDeps } from "./types" export function register(deps: ToolDeps) { - registerAppTool( - deps.server, + deps.server.registerTool( "set-active-tag", { - description: "Set the active container tag for this session", - inputSchema: { - containerTag: z.string().min(1), - }, - _meta: { - ui: { - resourceUri: SUPERMEMORY_RESOURCE_URI, - visibility: ["app"], - }, - }, + description: "Set the active container tag for this account", + inputSchema: z.object({ + containerTag: containerTagSchema, + viewId: z.string().uuid().optional(), + }), + _meta: appToolMeta(["app"]), }, async (args) => { - const containerTag = (args as { containerTag: string }).containerTag + const { containerTag } = args try { + const viewId = args.viewId ?? crypto.randomUUID() const tags = await deps.getClient().listContainerTags() if (!tags.some((tag) => tag.containerTag === containerTag)) { return deps.errorResult( @@ -31,6 +28,7 @@ export function register(deps: ToolDeps) { await deps.setActiveContainerTag(containerTag) const sc: ViewMessage = { view: "confirmation", + viewId, containerTag, } return { @@ -41,6 +39,7 @@ export function register(deps: ToolDeps) { }, ], structuredContent: sc, + _meta: appResultMeta(viewId), } } catch (error) { return deps.errorResult(error) diff --git a/apps/mcp/src/server/tools/types.ts b/apps/mcp/src/server/tools/types.ts index 18b6e5d4..9974cfe3 100644 --- a/apps/mcp/src/server/tools/types.ts +++ b/apps/mcp/src/server/tools/types.ts @@ -1,19 +1,21 @@ -import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" -import type { Props, SessionInfo } from "../../shared/types" +import type { McpServer, ServerContext } from "@modelcontextprotocol/server" +import type { SessionInfo } from "../../shared/types" import type { SupermemoryClient } from "../client" +import type { ActorContext } from "../types" // Dependencies passed to every tool's register() function. // Keep this surface small — tools should read this rather than reach into the agent. export interface ToolDeps { server: McpServer - props: Props | undefined + actor: ActorContext getClient: (containerTag?: string) => SupermemoryClient getSession: () => Promise resolveContainerTag: (explicit?: string) => Promise getActiveContainerTag: () => Promise setActiveContainerTag: (containerTag: string) => Promise - getClientInfo: () => { name: string; version?: string } | null - getMcpSessionId: () => string + getClientInfo: ( + context: ServerContext, + ) => { name: string; version?: string } | null errorResult: (error: unknown) => { content: { type: "text"; text: string }[] isError: true diff --git a/apps/mcp/src/server/tools/upload-file-submit.ts b/apps/mcp/src/server/tools/upload-file-submit.ts index b5537039..33a38b8d 100644 --- a/apps/mcp/src/server/tools/upload-file-submit.ts +++ b/apps/mcp/src/server/tools/upload-file-submit.ts @@ -1,37 +1,28 @@ -import { registerAppTool } from "@modelcontextprotocol/ext-apps/server" import { z } from "zod" -import { SUPERMEMORY_RESOURCE_URI, type ViewMessage } from "../../shared/types" +import type { ViewMessage } from "../../shared/types" +import { appResultMeta, appToolMeta } from "../app-metadata" +import { containerTagSchema } from "../container-tag" import { MEMORY_TOOL_ANNOTATIONS } from "./annotations" import type { ToolDeps } from "./types" export function register(deps: ToolDeps) { - registerAppTool( - deps.server, + deps.server.registerTool( "upload-file-submit", { description: "Submit a file upload", - inputSchema: { + inputSchema: z.object({ fileData: z.string().describe("Base64-encoded file content"), fileName: z.string(), mimeType: z.string(), - containerTag: z.string().min(1), - }, + containerTag: containerTagSchema, + viewId: z.string().uuid().optional(), + }), annotations: MEMORY_TOOL_ANNOTATIONS, - _meta: { - ui: { - resourceUri: SUPERMEMORY_RESOURCE_URI, - visibility: ["app"], - }, - }, + _meta: appToolMeta(["app"]), }, - async (rawArgs) => { - const args = rawArgs as { - fileData: string - fileName: string - mimeType: string - containerTag: string - } + async (args) => { try { + const viewId = args.viewId ?? crypto.randomUUID() const binaryString = atob(args.fileData) const bytes = new Uint8Array(binaryString.length) for (let i = 0; i < binaryString.length; i++) { @@ -48,6 +39,7 @@ export function register(deps: ToolDeps) { const sc: ViewMessage = { view: "upload-success", + viewId, id: result.id, fileName: args.fileName, containerTag: args.containerTag, @@ -61,6 +53,7 @@ export function register(deps: ToolDeps) { }, ], structuredContent: sc, + _meta: appResultMeta(viewId), } } catch (error) { return deps.errorResult(error) diff --git a/apps/mcp/src/server/tools/upload-file.ts b/apps/mcp/src/server/tools/upload-file.ts index 30be4c23..4a6c2f15 100644 --- a/apps/mcp/src/server/tools/upload-file.ts +++ b/apps/mcp/src/server/tools/upload-file.ts @@ -1,20 +1,21 @@ -import { registerAppTool } from "@modelcontextprotocol/ext-apps/server" -import { SUPERMEMORY_RESOURCE_URI, type ViewMessage } from "../../shared/types" +import { z } from "zod" +import type { ViewMessage } from "../../shared/types" +import { appResultMeta, appToolMeta } from "../app-metadata" import { effectiveContainerTagAccess } from "../auth/rbac" import type { ToolDeps } from "./types" export function register(deps: ToolDeps) { - registerAppTool( - deps.server, + deps.server.registerTool( "upload-file", { title: "Upload File", description: "Upload a file (PDF, text, image, video) to memory.", - inputSchema: {}, - _meta: { ui: { resourceUri: SUPERMEMORY_RESOURCE_URI } }, + inputSchema: z.object({}), + _meta: appToolMeta(), }, async () => { try { + const viewId = crypto.randomUUID() const [activeTag, tags, session] = await Promise.all([ deps.getActiveContainerTag(), deps.getClient().listContainerTags(), @@ -29,6 +30,7 @@ export function register(deps: ToolDeps) { const sc: ViewMessage = { view: "upload", + viewId, activeTag, writableTags, } @@ -38,6 +40,7 @@ export function register(deps: ToolDeps) { { type: "text" as const, text: "Opening file upload form..." }, ], structuredContent: sc, + _meta: appResultMeta(viewId), } } catch (error) { return deps.errorResult(error) diff --git a/apps/mcp/src/server/tools/who-am-i.ts b/apps/mcp/src/server/tools/who-am-i.ts index b219f342..7fa2a42d 100644 --- a/apps/mcp/src/server/tools/who-am-i.ts +++ b/apps/mcp/src/server/tools/who-am-i.ts @@ -1,3 +1,4 @@ +import { z } from "zod" import { READ_ONLY_TOOL_ANNOTATIONS } from "./annotations" import type { ToolDeps } from "./types" @@ -6,10 +7,10 @@ export function register(deps: ToolDeps) { "whoAmI", { description: "Get current user info, role, and workspace context", - inputSchema: {}, + inputSchema: z.object({}), annotations: READ_ONLY_TOOL_ANNOTATIONS, }, - async () => { + async (_args, context) => { try { const [session, activeTag] = await Promise.all([ deps.getSession(), @@ -31,8 +32,8 @@ export function register(deps: ToolDeps) { ? session.containerTags : null, scope: session.scope, - client: deps.getClientInfo(), - sessionId: deps.getMcpSessionId(), + client: deps.getClientInfo(context), + sessionId: context.sessionId ?? null, }), }, ], diff --git a/apps/mcp/src/server/types.ts b/apps/mcp/src/server/types.ts new file mode 100644 index 00000000..4698f3dd --- /dev/null +++ b/apps/mcp/src/server/types.ts @@ -0,0 +1,15 @@ +import type { WorkspaceState } from "./workspace-state" + +export interface ActorContext { + userId: string + organizationId: string + bearerToken: string + oauthClientId?: string +} + +export interface ServerEnv { + WORKSPACE_STATE: DurableObjectNamespace + API_URL?: string + MCP_RESOURCE?: string + ALLOWED_MCP_ORIGIN_HOSTNAMES?: string +} diff --git a/apps/mcp/src/server/workspace-presentation.test.ts b/apps/mcp/src/server/workspace-presentation.test.ts new file mode 100644 index 00000000..ce50019f --- /dev/null +++ b/apps/mcp/src/server/workspace-presentation.test.ts @@ -0,0 +1,64 @@ +import { describe, expect, it } from "vitest" +import type { ContainerTag } from "../shared/types" +import { + compactDescription, + formatFactSection, + formatWorkspaceRow, + sortWorkspaces, +} from "./workspace-presentation" + +const workspace = ( + containerTag: string, + lastActivityAt: string | null, +): ContainerTag => ({ + id: containerTag, + name: `Workspace ${containerTag}`, + containerTag, + description: "A compact workspace description.", + visibility: "private", + createdAt: "2026-01-01T00:00:00.000Z", + updatedAt: "2026-01-01T00:00:00.000Z", + isExperimental: false, + isNova: false, + documentCount: 2, + memoryCount: 3, + lastActivityAt, +}) + +describe("workspace presentation", () => { + it("keeps the active workspace first, then sorts by activity", () => { + const sorted = sortWorkspaces( + [ + workspace("older", "2026-01-01T00:00:00.000Z"), + workspace("active", "2025-01-01T00:00:00.000Z"), + workspace("newer", "2026-02-01T00:00:00.000Z"), + ], + "active", + ) + + expect(sorted.map((item) => item.containerTag)).toEqual([ + "active", + "newer", + "older", + ]) + }) + + it("formats compact rows without internal database IDs", () => { + const row = formatWorkspaceRow( + workspace("project-key", "2026-07-29T19:44:28.177Z"), + "project-key", + ) + + expect(row).toContain("[project-key] · Active") + expect(row).toContain("2 documents · 3 memories") + expect(row).toContain("Last active Jul 29, 2026") + expect(row).not.toContain('"id"') + }) + + it("caps descriptions and fact lists", () => { + expect(compactDescription("A".repeat(30), 12)).toBe("AAAAAAAAA...") + expect( + formatFactSection("Recent Context", ["one", "two", "three"], 2), + ).toEqual(["## Recent Context", "- one", "- two", "- +1 more"]) + }) +}) diff --git a/apps/mcp/src/server/workspace-presentation.ts b/apps/mcp/src/server/workspace-presentation.ts new file mode 100644 index 00000000..fa3a2932 --- /dev/null +++ b/apps/mcp/src/server/workspace-presentation.ts @@ -0,0 +1,104 @@ +import type { ContainerTag } from "../shared/types" + +const DEFAULT_DESCRIPTION_LIMIT = 160 + +const plural = (count: number, singular: string, pluralForm: string) => + `${count} ${count === 1 ? singular : pluralForm}` + +export function workspaceDisplayName( + workspace: ContainerTag | undefined, + key: string, +): string { + return workspace?.name || key +} + +export function compactDescription( + description: string | null | undefined, + limit = DEFAULT_DESCRIPTION_LIMIT, +): string | undefined { + const compact = description?.replace(/\s+/g, " ").trim() + if (!compact) return undefined + if (compact.length <= limit) return compact + const candidate = compact.slice(0, Math.max(0, limit - 3)).trimEnd() + const lastSpace = candidate.lastIndexOf(" ") + const boundary = + lastSpace >= Math.floor(limit * 0.6) ? lastSpace : candidate.length + return `${candidate.slice(0, boundary)}...` +} + +export function formatActivityDate(value: string | null): string | undefined { + if (!value) return undefined + const date = new Date(value) + if (Number.isNaN(date.getTime())) return undefined + + return new Intl.DateTimeFormat("en-US", { + month: "short", + day: "numeric", + year: "numeric", + timeZone: "UTC", + }).format(date) +} + +export function workspaceMetadata(workspace: ContainerTag): string { + const lastActivity = formatActivityDate(workspace.lastActivityAt) + const fields = [ + workspace.visibility + ? `${workspace.visibility.charAt(0).toUpperCase()}${workspace.visibility.slice(1)}` + : undefined, + plural(workspace.documentCount, "document", "documents"), + plural(workspace.memoryCount, "memory", "memories"), + lastActivity ? `Last active ${lastActivity}` : undefined, + ] + + return fields.filter(Boolean).join(" · ") +} + +export function formatWorkspaceRow( + workspace: ContainerTag, + activeKey: string, + descriptionLimit = DEFAULT_DESCRIPTION_LIMIT, +): string { + const active = workspace.containerTag === activeKey ? " · Active" : "" + const metadata = workspaceMetadata(workspace) + const description = compactDescription( + workspace.description, + descriptionLimit, + ) + const firstLine = + `- ${workspaceDisplayName(workspace, workspace.containerTag)} ` + + `[${workspace.containerTag}]${active}${metadata ? ` · ${metadata}` : ""}` + + return description ? `${firstLine}\n ${description}` : firstLine +} + +export function sortWorkspaces( + workspaces: ContainerTag[], + activeKey: string, +): ContainerTag[] { + return [...workspaces].sort((left, right) => { + if (left.containerTag === activeKey) return -1 + if (right.containerTag === activeKey) return 1 + + const leftTime = left.lastActivityAt + ? new Date(left.lastActivityAt).getTime() + : 0 + const rightTime = right.lastActivityAt + ? new Date(right.lastActivityAt).getTime() + : 0 + return rightTime - leftTime + }) +} + +export function formatFactSection( + title: string, + facts: string[], + limit: number, +): string[] { + if (facts.length === 0) return [] + + const shown = facts.slice(0, limit) + const lines = [`## ${title}`, ...shown.map((fact) => `- ${fact}`)] + const remaining = facts.length - shown.length + if (remaining > 0) lines.push(`- +${remaining} more`) + return lines +} diff --git a/apps/mcp/src/server/workspace-state.ts b/apps/mcp/src/server/workspace-state.ts new file mode 100644 index 00000000..27344c37 --- /dev/null +++ b/apps/mcp/src/server/workspace-state.ts @@ -0,0 +1,15 @@ +import { DurableObject } from "cloudflare:workers" +import { containerTagSchema } from "./container-tag" + +const ACTIVE_CONTAINER_TAG_KEY = "activeContainerTag" + +export class WorkspaceState extends DurableObject { + async getActiveContainerTag(): Promise { + return this.ctx.storage.get(ACTIVE_CONTAINER_TAG_KEY) + } + + async setActiveContainerTag(containerTag: string): Promise { + const validatedTag = containerTagSchema.parse(containerTag) + await this.ctx.storage.put(ACTIVE_CONTAINER_TAG_KEY, validatedTag) + } +} diff --git a/apps/mcp/src/server/workspace.test.ts b/apps/mcp/src/server/workspace.test.ts new file mode 100644 index 00000000..9d3c92a4 --- /dev/null +++ b/apps/mcp/src/server/workspace.test.ts @@ -0,0 +1,36 @@ +import { describe, expect, it, vi } from "vitest" +import { resolveContainerTag, workspaceStateName } from "./workspace" + +describe("workspace application state", () => { + it("keys active state by organization and user without collisions", () => { + expect( + workspaceStateName({ + organizationId: "org:one", + userId: "user:two", + }), + ).not.toBe( + workspaceStateName({ + organizationId: "org", + userId: "one:user:two", + }), + ) + }) + + it("uses an explicit tool argument without reading active state", async () => { + const getActive = vi.fn().mockResolvedValue("active") + + await expect(resolveContainerTag("explicit", getActive)).resolves.toBe( + "explicit", + ) + expect(getActive).not.toHaveBeenCalled() + }) + + it("falls back to durable active state and then the client default", async () => { + await expect( + resolveContainerTag(undefined, vi.fn().mockResolvedValue("active")), + ).resolves.toBe("active") + await expect( + resolveContainerTag(undefined, vi.fn().mockResolvedValue(undefined)), + ).resolves.toBeUndefined() + }) +}) diff --git a/apps/mcp/src/server/workspace.ts b/apps/mcp/src/server/workspace.ts new file mode 100644 index 00000000..81055cff --- /dev/null +++ b/apps/mcp/src/server/workspace.ts @@ -0,0 +1,14 @@ +import type { ActorContext } from "./types" + +export function workspaceStateName( + actor: Pick, +): string { + return `workspace:${JSON.stringify([actor.organizationId, actor.userId])}` +} + +export async function resolveContainerTag( + explicit: string | undefined, + getActiveContainerTag: () => Promise, +): Promise { + return explicit ?? (await getActiveContainerTag()) +} diff --git a/apps/mcp/src/shared/types.ts b/apps/mcp/src/shared/types.ts index 34affbf2..31329667 100644 --- a/apps/mcp/src/shared/types.ts +++ b/apps/mcp/src/shared/types.ts @@ -31,6 +31,8 @@ export interface ContainerTag { id: string name: string containerTag: string + description?: string | null + visibility?: string | null createdAt: string updatedAt: string isExperimental: boolean @@ -81,7 +83,7 @@ export interface DocumentsApiResponse { // ViewMessage — discriminated union returned by app tools as `structuredContent`. // The widget uses an exhaustive switch on `view` to dispatch to the correct view component. // Adding a new view here is a compile error in App.tsx until the case is handled. -export type ViewMessage = +type ViewMessagePayload = | { view: "picker" containerTags: ContainerTag[] @@ -114,15 +116,18 @@ export type ViewMessage = containerTag?: string } -export type ViewName = ViewMessage["view"] - -// Auth context passed from the OAuth/API-key middleware into the McpAgent via ctx.props. -export type Props = { - userId: string - organizationId?: string - bearerToken: string - containerTag?: string +export type ViewMessage = ViewMessagePayload & { + /** + * Stable identity for one rendered widget instance. + * + * The host may remount the iframe when a conversation is revisited. The + * widget uses this id to restore a completed local view without treating UI + * state as the source of truth for the underlying Supermemory write. + */ + viewId?: string } +export type ViewName = ViewMessage["view"] + // Hosts cache MCP UI resources by URI, so bump this when shipping a new widget bundle. -export const SUPERMEMORY_RESOURCE_URI = "ui://supermemory/app-v2.html" +export const SUPERMEMORY_RESOURCE_URI = "ui://supermemory/app-v3.html" diff --git a/apps/mcp/src/widget/App.tsx b/apps/mcp/src/widget/App.tsx index 158fa364..62749b59 100644 --- a/apps/mcp/src/widget/App.tsx +++ b/apps/mcp/src/widget/App.tsx @@ -105,6 +105,7 @@ function renderView( containerTags={msg.containerTags} onAdvance={setView} onError={setError} + viewId={msg.viewId} /> ) case "save": @@ -114,6 +115,7 @@ function renderView( onAdvance={setView} onError={setError} prefill={msg.prefill} + viewId={msg.viewId} writableTags={msg.writableTags} /> ) @@ -123,6 +125,7 @@ function renderView( activeTag={msg.activeTag} onAdvance={setView} onError={setError} + viewId={msg.viewId} writableTags={msg.writableTags} /> ) diff --git a/apps/mcp/src/widget/hooks/useApp.ts b/apps/mcp/src/widget/hooks/useApp.ts index e011dd91..b8f44fc2 100644 --- a/apps/mcp/src/widget/hooks/useApp.ts +++ b/apps/mcp/src/widget/hooks/useApp.ts @@ -2,6 +2,10 @@ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js" import { useMemo } from "react" import type { ViewMessage } from "../../shared/types" import { app } from "../lib/app" +import { + handoffToModel as performModelHandoff, + type ModelHandoffRequest, +} from "../lib/modelHandoff" export interface ToolCallResult { ok: boolean @@ -59,6 +63,15 @@ export function useApp() { } }, + /** + * Publish a silent state snapshot, then explicitly return control to + * the conversation agent. The message is still attempted when a host + * rejects or drops model-context updates. + */ + handoffToModel(request: ModelHandoffRequest) { + return performModelHandoff(app, request) + }, + /** Send a structured log line to the host. */ log(level: "debug" | "info" | "warning" | "error", message: string) { return app.sendLog({ level, data: message }) diff --git a/apps/mcp/src/widget/hooks/useViewState.ts b/apps/mcp/src/widget/hooks/useViewState.ts index 3e461cb0..bb761b17 100644 --- a/apps/mcp/src/widget/hooks/useViewState.ts +++ b/apps/mcp/src/widget/hooks/useViewState.ts @@ -2,6 +2,7 @@ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js" import { useEffect, useState } from "react" import type { ViewMessage } from "../../shared/types" import { app } from "../lib/app" +import { loadViewCheckpoint, saveViewCheckpoint } from "../lib/viewCheckpoint" function safeLog( level: "debug" | "info" | "warning" | "error", @@ -37,7 +38,12 @@ export function useViewState(): { setView: (msg: ViewMessage) => void setError: (message: string) => void } { - const [state, setState] = useState({ kind: "loading" }) + const [state, setState] = useState(() => { + const checkpoint = loadViewCheckpoint() + return checkpoint + ? { kind: "view", message: checkpoint } + : { kind: "loading" } + }) useEffect(() => { app.ontoolinput = (input: unknown) => { @@ -63,7 +69,8 @@ export function useViewState(): { if ("view" in sc) { const msg = sc as ViewMessage safeLog("info", `[host] ontoolresult: view=${msg.view}`) - setState({ kind: "view", message: msg }) + const checkpoint = loadViewCheckpoint(msg.viewId) + setState({ kind: "view", message: checkpoint ?? msg }) return } safeLog("warning", "[host] ontoolresult: structuredContent without view") @@ -85,7 +92,10 @@ export function useViewState(): { return { state, - setView: (msg) => setState({ kind: "view", message: msg }), + setView: (msg) => { + saveViewCheckpoint(msg) + setState({ kind: "view", message: msg }) + }, setError: (message) => setState({ kind: "error", message }), } } diff --git a/apps/mcp/src/widget/lib/modelHandoff.test.ts b/apps/mcp/src/widget/lib/modelHandoff.test.ts new file mode 100644 index 00000000..2fa289f7 --- /dev/null +++ b/apps/mcp/src/widget/lib/modelHandoff.test.ts @@ -0,0 +1,107 @@ +import { describe, expect, it, vi } from "vitest" +import { handoffToModel } from "./modelHandoff" + +function createApp(overrides?: { + updateModelContext?: () => Promise + sendMessage?: () => Promise<{ isError?: boolean }> +}) { + return { + updateModelContext: + overrides?.updateModelContext ?? vi.fn(async () => ({})), + sendMessage: overrides?.sendMessage ?? vi.fn(async () => ({})), + } +} + +const request = { + context: "Detailed state", + message: "Continue from the widget action", + structuredContent: { action: "saved" }, +} + +describe("handoffToModel", () => { + it("updates context before sending the portable conversation message", async () => { + const order: string[] = [] + const app = createApp({ + updateModelContext: vi.fn(async () => { + order.push("context") + }), + sendMessage: vi.fn(async () => { + order.push("message") + return {} + }), + }) + + const result = await handoffToModel(app, request, undefined) + + expect(order).toEqual(["context", "message"]) + expect(result).toEqual({ + ok: true, + contextUpdate: { ok: true }, + conversationMessage: { ok: true }, + }) + expect(app.updateModelContext).toHaveBeenCalledWith({ + content: [{ type: "text", text: request.context }], + structuredContent: request.structuredContent, + }) + }) + + it("prefers ChatGPT's follow-up helper when available", async () => { + const app = createApp() + const sendFollowUpMessage = vi.fn(async () => undefined) + + const result = await handoffToModel(app, request, { + sendFollowUpMessage, + }) + + expect(result.conversationMessage).toEqual({ ok: true }) + expect(sendFollowUpMessage).toHaveBeenCalledWith({ + prompt: request.message, + scrollToBottom: true, + }) + expect(app.sendMessage).not.toHaveBeenCalled() + }) + + it("falls back to the portable message when ChatGPT's helper fails", async () => { + const app = createApp() + + const result = await handoffToModel(app, request, { + sendFollowUpMessage: vi.fn(async () => { + throw new Error("unavailable") + }), + }) + + expect(result.conversationMessage).toEqual({ ok: true }) + expect(app.sendMessage).toHaveBeenCalledOnce() + }) + + it("still sends the conversation message when context publication fails", async () => { + const app = createApp({ + updateModelContext: vi.fn(async () => { + throw new Error("unsupported") + }), + }) + + const result = await handoffToModel(app, request, undefined) + + expect(result.ok).toBe(true) + expect(result.contextUpdate).toMatchObject({ + ok: false, + error: "Error: unsupported", + }) + expect(app.sendMessage).toHaveBeenCalledOnce() + }) + + it("reports a rejected conversation message as the failed handoff", async () => { + const app = createApp({ + sendMessage: vi.fn(async () => ({ isError: true })), + }) + + const result = await handoffToModel(app, request, undefined) + + expect(result.ok).toBe(false) + expect(result.conversationMessage).toEqual({ + ok: false, + error: "Host rejected the MCP Apps message", + }) + }) +}) diff --git a/apps/mcp/src/widget/lib/modelHandoff.ts b/apps/mcp/src/widget/lib/modelHandoff.ts new file mode 100644 index 00000000..9aa86ba7 --- /dev/null +++ b/apps/mcp/src/widget/lib/modelHandoff.ts @@ -0,0 +1,115 @@ +import type { ChatGptHostApi } from "./openaiHost" +import { getChatGptHostApi } from "./openaiHost" + +interface ModelHandoffApp { + updateModelContext(params: { + content?: Array<{ type: "text"; text: string }> + structuredContent?: Record + }): Promise + sendMessage(params: { + role: "user" + content: Array<{ type: "text"; text: string }> + }): Promise<{ isError?: boolean }> +} + +export interface HandoffStepResult { + ok: boolean + error?: string +} + +export interface ModelHandoffResult { + ok: boolean + contextUpdate: HandoffStepResult + conversationMessage: HandoffStepResult +} + +export interface ModelHandoffRequest { + context: string + message: string + structuredContent?: Record +} + +async function updateContext( + app: ModelHandoffApp, + request: ModelHandoffRequest, +): Promise { + try { + await app.updateModelContext({ + content: [{ type: "text", text: request.context }], + structuredContent: request.structuredContent, + }) + return { ok: true } + } catch (error) { + return { ok: false, error: String(error) } + } +} + +async function sendConversationMessage( + app: ModelHandoffApp, + message: string, + chatGptHost: ChatGptHostApi | undefined, +): Promise { + let chatGptError: string | undefined + + if (chatGptHost?.sendFollowUpMessage) { + try { + await chatGptHost.sendFollowUpMessage({ + prompt: message, + scrollToBottom: true, + }) + return { ok: true } + } catch (error) { + // Match OpenAI's own example: fall back to the portable MCP Apps + // message method when the ChatGPT-specific helper rejects. + chatGptError = String(error) + } + } + + try { + const result = await app.sendMessage({ + role: "user", + content: [{ type: "text", text: message }], + }) + if (result.isError) { + return { + ok: false, + error: chatGptError + ? `ChatGPT follow-up failed (${chatGptError}); host rejected the MCP Apps message` + : "Host rejected the MCP Apps message", + } + } + return { ok: true } + } catch (error) { + const mcpError = String(error) + return { + ok: false, + error: chatGptError + ? `ChatGPT follow-up failed (${chatGptError}); MCP Apps message failed (${mcpError})` + : mcpError, + } + } +} + +/** + * Keep the silent context snapshot and the explicit conversation turn as two + * separate operations. An accepted context update is not proof that a host + * attached it to a model turn, so the message is always attempted. + */ +export async function handoffToModel( + app: ModelHandoffApp, + request: ModelHandoffRequest, + chatGptHost: ChatGptHostApi | undefined = getChatGptHostApi(), +): Promise { + const contextUpdate = await updateContext(app, request) + const conversationMessage = await sendConversationMessage( + app, + request.message, + chatGptHost, + ) + + return { + ok: conversationMessage.ok, + contextUpdate, + conversationMessage, + } +} diff --git a/apps/mcp/src/widget/lib/openaiHost.ts b/apps/mcp/src/widget/lib/openaiHost.ts new file mode 100644 index 00000000..678f04b5 --- /dev/null +++ b/apps/mcp/src/widget/lib/openaiHost.ts @@ -0,0 +1,18 @@ +export interface ChatGptHostApi { + sendFollowUpMessage?: (args: { + prompt: string + scrollToBottom?: boolean + }) => Promise + setWidgetState?: (state: unknown) => unknown + widgetState?: unknown +} + +/** + * Optional ChatGPT host extensions. Shared MCP Apps methods remain the + * cross-host fallback; this bridge is used where ChatGPT provides a stronger + * follow-up or widget-state primitive. + */ +export function getChatGptHostApi(): ChatGptHostApi | undefined { + if (typeof window === "undefined") return undefined + return (window as Window & { openai?: ChatGptHostApi }).openai +} diff --git a/apps/mcp/src/widget/lib/viewCheckpoint.test.ts b/apps/mcp/src/widget/lib/viewCheckpoint.test.ts new file mode 100644 index 00000000..3dc041d2 --- /dev/null +++ b/apps/mcp/src/widget/lib/viewCheckpoint.test.ts @@ -0,0 +1,105 @@ +import { afterEach, describe, expect, it, vi } from "vitest" +import type { ViewMessage } from "../../shared/types" +import { loadViewCheckpoint, saveViewCheckpoint } from "./viewCheckpoint" + +function createStorage() { + const values = new Map() + return { + getItem: vi.fn((key: string) => values.get(key) ?? null), + setItem: vi.fn((key: string, value: string) => { + values.set(key, value) + }), + removeItem: vi.fn((key: string) => { + values.delete(key) + }), + clear: vi.fn(() => values.clear()), + key: vi.fn(() => null), + get length() { + return values.size + }, + } +} + +afterEach(() => { + vi.unstubAllGlobals() +}) + +describe("view checkpoints", () => { + it("restores a completed view from localStorage by stable view id", () => { + const storage = createStorage() + vi.stubGlobal("localStorage", storage) + const view: ViewMessage = { + view: "save-success", + viewId: "80fa74b9-8347-45f7-a2b5-d7a3d5d67616", + id: "memory-123", + containerTag: "model_test", + } + + saveViewCheckpoint(view) + + expect(loadViewCheckpoint(view.viewId)).toEqual(view) + }) + + it("does not persist non-terminal form views", () => { + const storage = createStorage() + vi.stubGlobal("localStorage", storage) + const view: ViewMessage = { + view: "save", + viewId: "80fa74b9-8347-45f7-a2b5-d7a3d5d67616", + writableTags: ["model_test"], + } + + saveViewCheckpoint(view) + + expect(storage.setItem).not.toHaveBeenCalled() + expect(loadViewCheckpoint(view.viewId)).toBeNull() + }) + + it("mirrors compact state into ChatGPT widget state", () => { + const storage = createStorage() + const setWidgetState = vi.fn() + vi.stubGlobal("localStorage", storage) + vi.stubGlobal("window", { + openai: { + widgetState: { + privateContent: { existing: true }, + }, + setWidgetState, + }, + }) + const view: ViewMessage = { + view: "confirmation", + viewId: "80fa74b9-8347-45f7-a2b5-d7a3d5d67616", + containerTag: "model_test", + } + + saveViewCheckpoint(view) + + expect(setWidgetState).toHaveBeenCalledWith({ + modelContent: 'Supermemory active workspace is now "model_test".', + privateContent: { + existing: true, + supermemoryView: view, + }, + }) + }) + + it("can restore from ChatGPT widget state before a tool result is replayed", () => { + const view: ViewMessage = { + view: "upload-success", + viewId: "80fa74b9-8347-45f7-a2b5-d7a3d5d67616", + id: "document-123", + fileName: "notes.txt", + containerTag: "model_test", + } + vi.stubGlobal("window", { + openai: { + widgetState: { + privateContent: { supermemoryView: view }, + }, + }, + }) + + expect(loadViewCheckpoint()).toEqual(view) + }) +}) diff --git a/apps/mcp/src/widget/lib/viewCheckpoint.ts b/apps/mcp/src/widget/lib/viewCheckpoint.ts new file mode 100644 index 00000000..3706e2f6 --- /dev/null +++ b/apps/mcp/src/widget/lib/viewCheckpoint.ts @@ -0,0 +1,143 @@ +import type { ViewMessage, ViewName } from "../../shared/types" +import { getChatGptHostApi } from "./openaiHost" + +const CHECKPOINT_VERSION = 1 +const STORAGE_PREFIX = "supermemory:mcp:view:" +const CHECKPOINTABLE_VIEWS = new Set([ + "confirmation", + "save-success", + "upload-success", +]) +const VIEW_NAMES = new Set([ + "picker", + "confirmation", + "save", + "save-success", + "upload", + "upload-success", + "graph", +]) + +interface CheckpointEnvelope { + version: number + view: ViewMessage +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null +} + +function isViewMessage(value: unknown): value is ViewMessage { + if (!isRecord(value) || typeof value.view !== "string") return false + if (!VIEW_NAMES.has(value.view as ViewName)) return false + return value.viewId === undefined || typeof value.viewId === "string" +} + +function checkpointKey(viewId: string): string { + return `${STORAGE_PREFIX}${viewId}` +} + +function getStorage(): Storage | undefined { + try { + return typeof localStorage === "undefined" ? undefined : localStorage + } catch { + return undefined + } +} + +function modelContentForView(view: ViewMessage): string { + switch (view.view) { + case "confirmation": + return `Supermemory active workspace is now "${view.containerTag}".` + case "save-success": + return `A memory was saved to Supermemory workspace "${view.containerTag}" with memory ID "${view.id}".` + case "upload-success": + return `"${view.fileName}" was uploaded to Supermemory workspace "${view.containerTag}" with document ID "${view.id}".` + default: + return "Supermemory widget state updated." + } +} + +function readHostCheckpoint(): ViewMessage | null { + const state = getChatGptHostApi()?.widgetState + if (!isRecord(state) || !isRecord(state.privateContent)) return null + const checkpoint = state.privateContent.supermemoryView + return isViewMessage(checkpoint) ? checkpoint : null +} + +function readLocalCheckpoint(viewId: string): ViewMessage | null { + const storage = getStorage() + if (!storage) return null + + try { + const raw = storage.getItem(checkpointKey(viewId)) + if (!raw) return null + const parsed: unknown = JSON.parse(raw) + if (!isRecord(parsed) || parsed.version !== CHECKPOINT_VERSION) return null + return isViewMessage(parsed.view) ? parsed.view : null + } catch { + return null + } +} + +/** + * Load the latest completed presentation state for this widget instance. + * Business data remains authoritative on the server. + */ +export function loadViewCheckpoint(viewId?: string): ViewMessage | null { + const hostView = readHostCheckpoint() + if (hostView && (!viewId || hostView.viewId === viewId)) { + return hostView + } + + if (!viewId) return null + const localView = readLocalCheckpoint(viewId) + return localView?.viewId === viewId ? localView : null +} + +/** + * Save only compact terminal views. Forms and graph payloads can be large and + * should always be reconstructed from server tool results. + */ +export function saveViewCheckpoint(view: ViewMessage): void { + if (!view.viewId || !CHECKPOINTABLE_VIEWS.has(view.view)) return + + const envelope: CheckpointEnvelope = { + version: CHECKPOINT_VERSION, + view, + } + const storage = getStorage() + if (storage) { + try { + storage.setItem(checkpointKey(view.viewId), JSON.stringify(envelope)) + } catch { + // Sandboxed hosts may disable or quota-limit localStorage. + } + } + + const chatGptHost = getChatGptHostApi() + if (!chatGptHost?.setWidgetState) return + + const currentState = isRecord(chatGptHost.widgetState) + ? chatGptHost.widgetState + : {} + const currentPrivate = isRecord(currentState.privateContent) + ? currentState.privateContent + : {} + + try { + const stateResult = chatGptHost.setWidgetState({ + ...currentState, + modelContent: modelContentForView(view), + privateContent: { + ...currentPrivate, + supermemoryView: view, + }, + }) + void Promise.resolve(stateResult).catch(() => { + // The local checkpoint remains available if the async host write fails. + }) + } catch { + // The local checkpoint still covers hosts without widget-state support. + } +} diff --git a/apps/mcp/src/widget/views/Picker.tsx b/apps/mcp/src/widget/views/Picker.tsx index e48883cc..09c40a7b 100644 --- a/apps/mcp/src/widget/views/Picker.tsx +++ b/apps/mcp/src/widget/views/Picker.tsx @@ -17,6 +17,7 @@ interface Props { assignedTags?: ContainerTagAccess[] | null onAdvance: (msg: ViewMessage) => void onError: (message: string) => void + viewId?: string } // Show the search box once the list is long enough to need it. @@ -28,8 +29,9 @@ export function Picker({ assignedTags, onAdvance, onError, + viewId, }: Props) { - const { callTool, updateModelContext } = useApp() + const { callTool, handoffToModel } = useApp() const log = useLog() const [pending, setPending] = useState(null) const [query, setQuery] = useState("") @@ -49,6 +51,7 @@ export function Picker({ setPending(containerTag) const result = await callTool("set-active-tag", { containerTag, + viewId, }) setPending(null) if (!result.ok || !result.data) { @@ -57,13 +60,26 @@ export function Picker({ return } onAdvance(result.data) - const contextUpdate = await updateModelContext( - `Supermemory workspace selection changed. Active workspace: "${containerTag}". Use it for future Supermemory actions until another workspace is selected.`, - ) - if (!contextUpdate.ok) { + const handoff = await handoffToModel({ + context: `Supermemory workspace selection changed. Active workspace: "${containerTag}". Use it for future Supermemory actions until another workspace is selected.`, + message: `I selected "${containerTag}" as my active Supermemory workspace. Use this workspace for future Supermemory actions until I select another one.`, + structuredContent: { + supermemory: { + action: "workspace-selected", + activeWorkspace: containerTag, + }, + }, + }) + if (!handoff.contextUpdate.ok) { log( "warning", - `[picker] model context update failed: ${contextUpdate.error}`, + `[picker] model context update failed: ${handoff.contextUpdate.error}`, + ) + } + if (!handoff.conversationMessage.ok) { + log( + "warning", + `[picker] agent handoff failed: ${handoff.conversationMessage.error}`, ) } } diff --git a/apps/mcp/src/widget/views/Save.tsx b/apps/mcp/src/widget/views/Save.tsx index e558c05b..fa354398 100644 --- a/apps/mcp/src/widget/views/Save.tsx +++ b/apps/mcp/src/widget/views/Save.tsx @@ -19,6 +19,7 @@ interface Props { prefill?: string onAdvance: (msg: ViewMessage) => void onError: (message: string) => void + viewId?: string } export function Save({ @@ -27,8 +28,9 @@ export function Save({ prefill, onAdvance, onError, + viewId, }: Props) { - const { callTool, updateModelContext } = useApp() + const { callTool, handoffToModel } = useApp() const log = useLog() const [content, setContent] = useState(prefill ?? "") const [selectedTag, setSelectedTag] = useState( @@ -62,6 +64,7 @@ export function Save({ const result = await callTool("save-memory", { content: trimmed, containerTag: selectedTag, + viewId, }) setSaving(false) if (!result.ok || !result.data) { @@ -72,13 +75,28 @@ export function Save({ const memoryId = result.data.view === "save-success" ? result.data.id : undefined onAdvance(result.data) - const contextUpdate = await updateModelContext( - `Supermemory widget action completed. A memory was saved to workspace "${selectedTag}"${memoryId ? ` with memory ID "${memoryId}"` : ""}. It is already saved; do not save it again.`, - ) - if (!contextUpdate.ok) { + const handoff = await handoffToModel({ + context: `Supermemory widget action completed. A memory was saved to workspace "${selectedTag}"${memoryId ? ` with memory ID "${memoryId}"` : ""}. Saved content:\n\n${trimmed}\n\nIt is already saved; do not save it again.`, + message: `I used the Supermemory widget to save a memory to workspace "${selectedTag}"${memoryId ? ` (memory ID: ${memoryId})` : ""}. The memory is already saved; do not save it again.`, + structuredContent: { + supermemory: { + action: "memory-saved", + activeWorkspace: selectedTag, + memoryId, + content: trimmed, + }, + }, + }) + if (!handoff.contextUpdate.ok) { log( "warning", - `[save] model context update failed: ${contextUpdate.error}`, + `[save] model context update failed: ${handoff.contextUpdate.error}`, + ) + } + if (!handoff.conversationMessage.ok) { + log( + "warning", + `[save] agent handoff failed: ${handoff.conversationMessage.error}`, ) } } diff --git a/apps/mcp/src/widget/views/Upload.tsx b/apps/mcp/src/widget/views/Upload.tsx index 04f7e995..c5e42dfe 100644 --- a/apps/mcp/src/widget/views/Upload.tsx +++ b/apps/mcp/src/widget/views/Upload.tsx @@ -20,6 +20,7 @@ interface Props { writableTags: string[] onAdvance: (msg: ViewMessage) => void onError: (message: string) => void + viewId?: string } function formatFileSize(bytes: number): string { @@ -30,8 +31,14 @@ function formatFileSize(bytes: number): string { const ACCEPT = ".txt,.pdf,.png,.jpg,.jpeg,.mp4" -export function Upload({ activeTag, writableTags, onAdvance, onError }: Props) { - const { callTool, updateModelContext } = useApp() +export function Upload({ + activeTag, + writableTags, + onAdvance, + onError, + viewId, +}: Props) { + const { callTool, handoffToModel } = useApp() const log = useLog() const [file, setFile] = useState(null) const [selectedTag, setSelectedTag] = useState( @@ -62,6 +69,7 @@ export function Upload({ activeTag, writableTags, onAdvance, onError }: Props) { fileName: file.name, mimeType: file.type, containerTag: selectedTag, + viewId, }) if (!result.ok || !result.data) { log("error", `[upload] failed: ${result.error}`) @@ -71,13 +79,28 @@ export function Upload({ activeTag, writableTags, onAdvance, onError }: Props) { const documentId = result.data.view === "upload-success" ? result.data.id : undefined onAdvance(result.data) - const contextUpdate = await updateModelContext( - `Supermemory widget action completed. "${file.name}" was uploaded to workspace "${selectedTag}"${documentId ? ` with document ID "${documentId}"` : ""}. It is already uploaded; do not upload it again.`, - ) - if (!contextUpdate.ok) { + const handoff = await handoffToModel({ + context: `Supermemory widget action completed. "${file.name}" was uploaded to workspace "${selectedTag}"${documentId ? ` with document ID "${documentId}"` : ""}. It is already uploaded; do not upload it again.`, + message: `I used the Supermemory widget to upload "${file.name}" to workspace "${selectedTag}"${documentId ? ` (document ID: ${documentId})` : ""}. The file is already uploaded; do not upload it again.`, + structuredContent: { + supermemory: { + action: "file-uploaded", + activeWorkspace: selectedTag, + documentId, + fileName: file.name, + }, + }, + }) + if (!handoff.contextUpdate.ok) { log( "warning", - `[upload] model context update failed: ${contextUpdate.error}`, + `[upload] model context update failed: ${handoff.contextUpdate.error}`, + ) + } + if (!handoff.conversationMessage.ok) { + log( + "warning", + `[upload] agent handoff failed: ${handoff.conversationMessage.error}`, ) } } catch (err) { diff --git a/apps/mcp/wrangler.jsonc b/apps/mcp/wrangler.jsonc index a7429795..8a85739f 100644 --- a/apps/mcp/wrangler.jsonc +++ b/apps/mcp/wrangler.jsonc @@ -27,6 +27,10 @@ { "name": "MCP_SERVER", "class_name": "SupermemoryMCP" + }, + { + "name": "WORKSPACE_STATE", + "class_name": "WorkspaceState" } ] }, @@ -35,6 +39,10 @@ { "tag": "v1", "new_sqlite_classes": ["SupermemoryMCP"] + }, + { + "tag": "v2", + "new_sqlite_classes": ["WorkspaceState"] } ], diff --git a/bun.lock b/bun.lock index 0512d4a0..3b4f8ba7 100644 --- a/bun.lock +++ b/bun.lock @@ -88,14 +88,16 @@ "version": "1.0.0", "dependencies": { "@cloudflare/workers-oauth-provider": "^0.2.2", - "@modelcontextprotocol/ext-apps": "^1.0.0", - "@modelcontextprotocol/sdk": "^1.25.2", + "@modelcontextprotocol/client": "2.0.0", + "@modelcontextprotocol/ext-apps": "^1.7.5", + "@modelcontextprotocol/sdk": "1.30.0", + "@modelcontextprotocol/server": "2.0.0", "@phosphor-icons/react": "^2.1.10", "@radix-ui/react-popover": "^1.1.15", "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-tooltip": "^1.2.7", "@supermemory/memory-graph": "^0.2.0", - "agents": "^0.3.5", + "agents": "^0.20.1", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "hono": "^4.11.1", @@ -104,7 +106,7 @@ "react-dom": "^19.2.4", "supermemory": "^4.0.0", "tailwind-merge": "^3.4.0", - "zod": "^3.25.76", + "zod": "^4.4.3", }, "devDependencies": { "@cloudflare/workers-types": "^4.20250620.0", @@ -116,9 +118,29 @@ "typescript": "^5.8.3", "vite": "^6.0.0", "vite-plugin-singlefile": "^2.3.0", + "vitest": "^3.2.4", "wrangler": "^4.4.0", }, }, + "apps/mcp-launch-film": { + "name": "@supermemory/mcp-launch-film", + "version": "0.0.0", + "dependencies": { + "@phosphor-icons/react": "^2.1.10", + "gsap": "^3.15.0", + "react": "^19.2.4", + "react-dom": "^19.2.4", + }, + "devDependencies": { + "@tailwindcss/vite": "^4.1.13", + "@types/react": "^19.1.13", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^4.3.4", + "tailwindcss": "^4.1.13", + "typescript": "^5.8.3", + "vite": "^6.0.0", + }, + }, "apps/memory-graph-playground": { "name": "memory-graph-playground", "version": "0.1.0", @@ -622,27 +644,27 @@ "@babel/generator": ["@babel/generator@7.29.1", "", { "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw=="], - "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="], + "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@8.0.0", "", { "dependencies": { "@babel/types": "^8.0.0" } }, "sha512-NSpMkMsvvZqzThJ0p1B02cbtA2ObEyfBvq950bmNkyxsxvcxwhvvCB036rKhlEnuBBo30bOrk13u3FzlKSoRrw=="], "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.28.6", "", { "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA=="], - "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.28.6", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow=="], + "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@8.0.1", "", { "dependencies": { "@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/helper-skip-transparent-expression-wrappers": "^8.0.0", "@babel/traverse": "^8.0.0", "semver": "^7.7.3" }, "peerDependencies": { "@babel/core": "^8.0.0" } }, "sha512-++t3ZktzlLmASAxIlxeXQK9Z2YwUafYGYcvGBFevqOqt16HozVHStUoQvWD09fzAZOb/uJGpUTBuGK41AJAuOA=="], "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], - "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.28.5", "", { "dependencies": { "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5" } }, "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg=="], + "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@8.0.0", "", { "dependencies": { "@babel/traverse": "^8.0.0", "@babel/types": "^8.0.0" } }, "sha512-xkXrMbtk87Gk7+oKBVmBc6EORg/Qwx++AHESldmHkpvG8wgccdhJJFwrzqlF382Fk8wfXhJHWE/g/43QvEGNPQ=="], "@babel/helper-module-imports": ["@babel/helper-module-imports@7.28.6", "", { "dependencies": { "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw=="], "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.6", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA=="], - "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.27.1", "", { "dependencies": { "@babel/types": "^7.27.1" } }, "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw=="], + "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@8.0.0", "", { "dependencies": { "@babel/types": "^8.0.0" } }, "sha512-3W6satvtPuCUkUx63S2jMoW9EQNYkADgs1HTfufmL7gCmAulHMKupA/12WNz4A0GMMFn/YnWWwqOT9IZrJHQjg=="], "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.28.6", "", {}, "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug=="], - "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.28.6", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg=="], + "@babel/helper-replace-supers": ["@babel/helper-replace-supers@8.0.1", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^8.0.0", "@babel/helper-optimise-call-expression": "^8.0.0", "@babel/traverse": "^8.0.0" }, "peerDependencies": { "@babel/core": "^8.0.0" } }, "sha512-B1SZADIcy3tmH8CmWvj4SHi/oAPom4UL3uknTc2QRNsPVLFk/sPnZvQL/8kj7Y5omvjMqie0vklvs6XM4OLW5Q=="], - "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg=="], + "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@8.0.0", "", { "dependencies": { "@babel/traverse": "^8.0.0", "@babel/types": "^8.0.0" } }, "sha512-xmCA9kP3IhySsqhzwIdWGlDN/1A4cCKNBO/uwZx/3YzmDoMePwno2Q5/Bq0q+tYaKbeF940YiKV/kaW8Mzvpjw=="], "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], @@ -654,6 +676,10 @@ "@babel/parser": ["@babel/parser@7.29.0", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww=="], + "@babel/plugin-proposal-decorators": ["@babel/plugin-proposal-decorators@8.0.2", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^8.0.1", "@babel/helper-plugin-utils": "^8.0.1", "@babel/plugin-syntax-decorators": "^8.0.1" }, "peerDependencies": { "@babel/core": "^8.0.0" } }, "sha512-+C6O6KKXU7BBq1GNaIkFJxrALUVGRcr+WeWm4OcuRl3h+l/CmNfcTLMrT2Lm3uvGBimBH/8pEBRrXJFLoO67Gg=="], + + "@babel/plugin-syntax-decorators": ["@babel/plugin-syntax-decorators@8.0.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^8.0.1" }, "peerDependencies": { "@babel/core": "^8.0.0" } }, "sha512-NI+0S/6MvR6GlcQFwjDZ+WIc2qvG6TXN534lYs9llNldwW4b7Dh6KTtk030FA0xWdYGs4t1lWo+OEWN8wGB+Nw=="], + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w=="], "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A=="], @@ -1060,9 +1086,15 @@ "@mjackson/node-fetch-server": ["@mjackson/node-fetch-server@0.2.0", "", {}, "sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng=="], - "@modelcontextprotocol/ext-apps": ["@modelcontextprotocol/ext-apps@1.1.2", "", { "optionalDependencies": { "@oven/bun-darwin-aarch64": "^1.2.21", "@oven/bun-darwin-x64": "^1.2.21", "@oven/bun-darwin-x64-baseline": "^1.2.21", "@oven/bun-linux-aarch64": "^1.2.21", "@oven/bun-linux-aarch64-musl": "^1.2.21", "@oven/bun-linux-x64": "^1.2.21", "@oven/bun-linux-x64-baseline": "^1.2.21", "@oven/bun-linux-x64-musl": "^1.2.21", "@oven/bun-linux-x64-musl-baseline": "^1.2.21", "@oven/bun-windows-x64": "^1.2.21", "@oven/bun-windows-x64-baseline": "^1.2.21", "@rollup/rollup-darwin-arm64": "^4.53.3", "@rollup/rollup-darwin-x64": "^4.53.3", "@rollup/rollup-linux-arm64-gnu": "^4.53.3", "@rollup/rollup-linux-x64-gnu": "^4.53.3", "@rollup/rollup-win32-arm64-msvc": "^4.53.3", "@rollup/rollup-win32-x64-msvc": "^4.53.3" }, "peerDependencies": { "@modelcontextprotocol/sdk": "^1.24.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0", "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["react", "react-dom"] }, "sha512-Gx4TEo3/F8yq1Ix6LdgLwMrKqfZqD7++eakZdbMUewrYtHeeJn3nKpeNhgEfO7nYRwonqWYomOAszWZWJS0IbA=="], + "@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=="], - "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.27.1", "", { "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-sr6GbP+4edBwFndLbM60gf07z0FQ79gaExpnsjMGePXqFcSSb7t6iscpjk9DhFhwd+mTEQrzNafGP8/iGGFYaA=="], + "@modelcontextprotocol/core": ["@modelcontextprotocol/core@2.0.0", "", { "dependencies": { "zod": "^4.2.0" } }, "sha512-pJCEwGG7Lfr/+PQp9ZTwKXNeO5wzbfKL7H3MYpCorM4oFBoQrdjnBgEoqG+RjhsvS1FKrDbKux+M1HhlnGWqcA=="], + + "@modelcontextprotocol/ext-apps": ["@modelcontextprotocol/ext-apps@1.7.5", "", { "dependencies": { "@standard-schema/spec": "^1.1.0" }, "peerDependencies": { "@modelcontextprotocol/sdk": "^1.29.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0", "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["react", "react-dom"] }, "sha512-TjPH2S2y5UEGKhmI6+XGFuqfqOV4ppe1x6DA3txnUaEWkgtA4G5vo14jGKFZmegdkZ1H4QMLyujLvoU1BEdnAg=="], + + "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.30.0", "", { "dependencies": { "@hono/node-server": "^1.19.9 || ^2.0.5", "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-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA=="], + + "@modelcontextprotocol/server": ["@modelcontextprotocol/server@2.0.0", "", { "dependencies": { "@modelcontextprotocol/core": "2.0.0", "zod": "^4.2.0" } }, "sha512-YhHWdHfpFMQfd0prsEnxKeS3Qz3ytIGmsS0sth4KDjnacIT7hxk6hXHkJ9KysxlkvTM+WZAtQbbcUhdoP4Hvtw=="], "@mymediset/sap-ai-provider": ["@mymediset/sap-ai-provider@2.1.0", "", { "dependencies": { "@ai-sdk/provider": "^3.0.0", "@ai-sdk/provider-utils": "^4.0.1", "@sap-ai-sdk/orchestration": "^2.4.0", "zod": "^4.2.1", "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "ai": "^6.0.0" } }, "sha512-mvm2p+evS51GfNJwObLnGruhBrnV7DBCrm3SafYoZHrlmcFsAvCmRcofvk5AX7LdQpTCH+Q8pfo+gZvISOvnzA=="], @@ -1236,28 +1268,6 @@ "@opentelemetry/sql-common": ["@opentelemetry/sql-common@0.41.2", "", { "dependencies": { "@opentelemetry/core": "^2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0" } }, "sha512-4mhWm3Z8z+i508zQJ7r6Xi7y4mmoJpdvH0fZPFRkWrdp5fq7hhZ2HhYokEOLkfqSMgPR4Z9EyB3DBkbKGOqZiQ=="], - "@oven/bun-darwin-aarch64": ["@oven/bun-darwin-aarch64@1.3.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-PXgg5gqcS/rHwa1hF0JdM1y5TiyejVrMHoBmWY/DjtfYZoFTXie1RCFOkoG0b5diOOmUcuYarMpH7CSNTqwj+w=="], - - "@oven/bun-darwin-x64": ["@oven/bun-darwin-x64@1.3.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-Nhssuh7GBpP5PiDSOl3+qnoIG7PJo+ec2oomDevnl9pRY6x6aD2gRt0JE+uf+A8Om2D6gjeHCxjEdrw5ZHE8mA=="], - - "@oven/bun-darwin-x64-baseline": ["@oven/bun-darwin-x64-baseline@1.3.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-w1gaTlqU0IJCmJ1X+PGHkdNU1n8Gemx5YKkjhkJIguvFINXEBB5U1KG82QsT65Tk4KyNMfbLTlmy4giAvUoKfA=="], - - "@oven/bun-linux-aarch64": ["@oven/bun-linux-aarch64@1.3.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-OUgPHfL6+PM2Q+tFZjcaycN3D7gdQdYlWnwMI31DXZKY1r4HINWk9aEz9t/rNaHg65edwNrt7dsv9TF7xK8xIA=="], - - "@oven/bun-linux-aarch64-musl": ["@oven/bun-linux-aarch64-musl@1.3.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-Ui5pAgM7JE9MzHokF0VglRMkbak3lTisY4Mf1AZutPACXWgKJC5aGrgnHBfkl7QS6fEeYb0juy1q4eRznRHOsw=="], - - "@oven/bun-linux-x64": ["@oven/bun-linux-x64@1.3.10", "", { "os": "linux", "cpu": "x64" }, "sha512-bzUgYj/PIZziB/ZesIP9HUyfvh6Vlf3od+TrbTTyVEuCSMKzDPQVW/yEbRp0tcHO3alwiEXwJDrWrHAguXlgiQ=="], - - "@oven/bun-linux-x64-baseline": ["@oven/bun-linux-x64-baseline@1.3.10", "", { "os": "linux", "cpu": "x64" }, "sha512-oqvMDYpX6dGJO03HgO5bXuccEsH3qbdO3MaAiAlO4CfkBPLUXz3N0DDElg5hz0L6ktdDVKbQVE5lfe+LAUISQg=="], - - "@oven/bun-linux-x64-musl": ["@oven/bun-linux-x64-musl@1.3.10", "", { "os": "linux", "cpu": "x64" }, "sha512-poVXvOShekbexHq45b4MH/mRjQKwACAC8lHp3Tz/hEDuz0/20oncqScnmKwzhBPEpqJvydXficXfBYuSim8opw=="], - - "@oven/bun-linux-x64-musl-baseline": ["@oven/bun-linux-x64-musl-baseline@1.3.10", "", { "os": "linux", "cpu": "x64" }, "sha512-/hOZ6S1VsTX6vtbhWVL9aAnOrdpuO54mAGUWpTdMz7dFG5UBZ/VUEiK0pBkq9A1rlBk0GeD/6Y4NBFl8Ha7cRA=="], - - "@oven/bun-windows-x64": ["@oven/bun-windows-x64@1.3.10", "", { "os": "win32", "cpu": "x64" }, "sha512-qaS1In3yfC/Z/IGQriVmF8GWwKuNqiw7feTSJWaQhH5IbL6ENR+4wGNPniZSJFaM/SKUO0e/YCRdoVBvgU4C1g=="], - - "@oven/bun-windows-x64-baseline": ["@oven/bun-windows-x64-baseline@1.3.10", "", { "os": "win32", "cpu": "x64" }, "sha512-gh3UAHbUdDUG6fhLc1Csa4IGdtghue6U8oAIXWnUqawp6lwb3gOCRvp25IUnLF5vUHtgfMxuEUYV7YA2WxVutw=="], - "@oxc-project/types": ["@oxc-project/types@0.115.0", "", {}, "sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw=="], "@peculiar/asn1-android": ["@peculiar/asn1-android@2.6.0", "", { "dependencies": { "@peculiar/asn1-schema": "^2.6.0", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "sha512-cBRCKtYPF7vJGN76/yG8VbxRcHLPF3HnkoHhKOZeHpoVtbMYfY9ROKtH3DtYUY9m8uI1Mh47PRhHf2hSK3xcSQ=="], @@ -1502,7 +1512,9 @@ "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-rc.7", "", { "os": "win32", "cpu": "x64" }, "sha512-3ZJBT47VWLKVKIyvHhUSUgVwHzzZW761YAIkM3tOT+8ZTjFVp0acCM0Y2Z2j3jCl+XYi2d9y2uEWQ8H0PvvpPw=="], - "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.3", "", {}, "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q=="], + "@rolldown/plugin-babel": ["@rolldown/plugin-babel@0.2.3", "", { "dependencies": { "picomatch": "^4.0.4" }, "peerDependencies": { "@babel/core": "^7.29.0 || ^8.0.0-rc.1", "@babel/plugin-transform-runtime": "^7.29.0 || ^8.0.0-rc.1", "@babel/runtime": "^7.27.0 || ^8.0.0-rc.1", "rolldown": "^1.0.0-rc.5", "vite": "^8.0.0" }, "optionalPeers": ["@babel/plugin-transform-runtime", "@babel/runtime", "vite"] }, "sha512-+zEk16yGlz1F9STiRr6uG9hmIXb6nprjLczV/htGptYuLoCuxb+itZ03RKCEeOhBpDDd1NU7qF6x1VLMUp62bw=="], + + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="], "@rollup/plugin-commonjs": ["@rollup/plugin-commonjs@28.0.1", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", "fdir": "^6.2.0", "is-reference": "1.2.1", "magic-string": "^0.30.3", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^2.68.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA=="], @@ -1816,6 +1828,8 @@ "@supermemory/ai-sdk": ["@supermemory/ai-sdk@workspace:packages/ai-sdk"], + "@supermemory/mcp-launch-film": ["@supermemory/mcp-launch-film@workspace:apps/mcp-launch-film"], + "@supermemory/memory-graph": ["@supermemory/memory-graph@workspace:packages/memory-graph"], "@supermemory/tools": ["@supermemory/tools@workspace:packages/tools"], @@ -2104,6 +2118,8 @@ "@types/is-hotkey": ["@types/is-hotkey@0.1.10", "", {}, "sha512-RvC8KMw5BCac1NvRRyaHgMMEtBaZ6wh0pyPTBu7izn4Sj/AX9Y4aXU5c7rX8PnM/knsuUpC1IeoBkANtxBypsQ=="], + "@types/jsesc": ["@types/jsesc@2.5.1", "", {}, "sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw=="], + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], "@types/katex": ["@types/katex@0.16.8", "", {}, "sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg=="], @@ -2186,7 +2202,7 @@ "@vercel/oidc": ["@vercel/oidc@3.1.0", "", {}, "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w=="], - "@vitejs/plugin-react": ["@vitejs/plugin-react@5.1.4", "", { "dependencies": { "@babel/core": "^7.29.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-rc.3", "@types/babel__core": "^7.20.5", "react-refresh": "^0.18.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA=="], + "@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=="], "@vitest/expect": ["@vitest/expect@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig=="], @@ -3180,6 +3196,8 @@ "growly": ["growly@1.3.0", "", {}, "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw=="], + "gsap": ["gsap@3.15.0", "", {}, "sha512-dMW4CWBTUK1AEEDeZc1g4xpPGIrSf9fJF960qbTZmN/QwZIWY5wgliS6JWl9/25fpTGJrMRtSjGtOmPnfjZB+A=="], + "gzip-size": ["gzip-size@6.0.0", "", { "dependencies": { "duplexer": "^0.1.2" } }, "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q=="], "hachure-fill": ["hachure-fill@0.5.2", "", {}, "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg=="], @@ -3942,6 +3960,8 @@ "obliterator": ["obliterator@1.6.1", "", {}, "sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig=="], + "obug": ["obug@2.1.4", "", {}, "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA=="], + "ofetch": ["ofetch@1.5.1", "", { "dependencies": { "destr": "^2.0.5", "node-fetch-native": "^1.6.7", "ufo": "^1.6.1" } }, "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="], "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], @@ -4268,7 +4288,7 @@ "react-reconciler": ["react-reconciler@0.31.0", "", { "dependencies": { "scheduler": "^0.25.0" }, "peerDependencies": { "react": "^19.0.0" } }, "sha512-7Ob7Z+URmesIsIVRjnLoDGwBEG/tVitidU0nMsqX/eeJaLY89RISO/10ERe0MqmzuKUUB1rmY+h1itMbUHg9BQ=="], - "react-refresh": ["react-refresh@0.18.0", "", {}, "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw=="], + "react-refresh": ["react-refresh@0.17.0", "", {}, "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ=="], "react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="], @@ -4886,7 +4906,7 @@ "victory-vendor": ["victory-vendor@36.9.2", "", { "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", "@types/d3-interpolate": "^3.0.1", "@types/d3-scale": "^4.0.2", "@types/d3-shape": "^3.1.0", "@types/d3-time": "^3.0.0", "@types/d3-timer": "^3.0.0", "d3-array": "^3.1.6", "d3-ease": "^3.0.1", "d3-interpolate": "^3.0.1", "d3-scale": "^4.0.2", "d3-shape": "^3.1.0", "d3-time": "^3.0.0", "d3-timer": "^3.0.1" } }, "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ=="], - "vite": ["vite@7.3.1", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA=="], + "vite": ["vite@6.4.1", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g=="], "vite-node": ["vite-node@3.2.4", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.1", "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg=="], @@ -5168,11 +5188,37 @@ "@babel/generator/jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + "@babel/helper-annotate-as-pure/@babel/types": ["@babel/types@8.0.4", "", { "dependencies": { "@babel/helper-string-parser": "^8.0.0", "@babel/helper-validator-identifier": "^8.0.4" } }, "sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g=="], + "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "@babel/helper-create-class-features-plugin/@babel/traverse": ["@babel/traverse@8.0.4", "", { "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/generator": "^8.0.0", "@babel/helper-globals": "^8.0.0", "@babel/parser": "^8.0.4", "@babel/template": "^8.0.0", "@babel/types": "^8.0.4", "obug": "^2.1.1" } }, "sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg=="], + + "@babel/helper-create-class-features-plugin/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + + "@babel/helper-member-expression-to-functions/@babel/traverse": ["@babel/traverse@8.0.4", "", { "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/generator": "^8.0.0", "@babel/helper-globals": "^8.0.0", "@babel/parser": "^8.0.4", "@babel/template": "^8.0.0", "@babel/types": "^8.0.4", "obug": "^2.1.1" } }, "sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg=="], + + "@babel/helper-member-expression-to-functions/@babel/types": ["@babel/types@8.0.4", "", { "dependencies": { "@babel/helper-string-parser": "^8.0.0", "@babel/helper-validator-identifier": "^8.0.4" } }, "sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g=="], + + "@babel/helper-optimise-call-expression/@babel/types": ["@babel/types@8.0.4", "", { "dependencies": { "@babel/helper-string-parser": "^8.0.0", "@babel/helper-validator-identifier": "^8.0.4" } }, "sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g=="], + + "@babel/helper-replace-supers/@babel/traverse": ["@babel/traverse@8.0.4", "", { "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/generator": "^8.0.0", "@babel/helper-globals": "^8.0.0", "@babel/parser": "^8.0.4", "@babel/template": "^8.0.0", "@babel/types": "^8.0.4", "obug": "^2.1.1" } }, "sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg=="], + + "@babel/helper-skip-transparent-expression-wrappers/@babel/traverse": ["@babel/traverse@8.0.4", "", { "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/generator": "^8.0.0", "@babel/helper-globals": "^8.0.0", "@babel/parser": "^8.0.4", "@babel/template": "^8.0.0", "@babel/types": "^8.0.4", "obug": "^2.1.1" } }, "sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg=="], + + "@babel/helper-skip-transparent-expression-wrappers/@babel/types": ["@babel/types@8.0.4", "", { "dependencies": { "@babel/helper-string-parser": "^8.0.0", "@babel/helper-validator-identifier": "^8.0.4" } }, "sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g=="], + + "@babel/plugin-proposal-decorators/@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@8.0.1", "", { "peerDependencies": { "@babel/core": "^8.0.0" } }, "sha512-3PKFgjTyPlhFhorfP+SjKQxLViIL++zWjFOO4hGriYU+Bsm983DxEM1JmDRJVWXV0O9npu+xXRqz7Pbd3mh70g=="], + + "@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=="], + + "@babel/plugin-transform-typescript/@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="], + + "@babel/plugin-transform-typescript/@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.28.6", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow=="], + + "@babel/plugin-transform-typescript/@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg=="], "@better-auth/core/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], @@ -5230,6 +5276,8 @@ "@jridgewell/source-map/@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=="], + "@mastra/core/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.27.1", "", { "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-sr6GbP+4edBwFndLbM60gf07z0FQ79gaExpnsjMGePXqFcSSb7t6iscpjk9DhFhwd+mTEQrzNafGP8/iGGFYaA=="], + "@mastra/core/dotenv": ["dotenv@17.3.1", "", {}, "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA=="], "@mastra/core/hono-openapi": ["hono-openapi@1.3.0", "", { "peerDependencies": { "@hono/standard-validator": "^0.2.0", "@standard-community/standard-json": "^0.3.5", "@standard-community/standard-openapi": "^0.2.9", "@types/json-schema": "^7.0.15", "hono": "^4.8.3", "openapi-types": "^12.1.3" }, "optionalPeers": ["@hono/standard-validator", "hono"] }, "sha512-xDvCWpWEIv0weEmnl3EjRQzqbHIO8LnfzMuYOCmbuyE5aes6aXxLg4vM3ybnoZD5TiTUkA6PuRQPJs3R7WRBig=="], @@ -5318,9 +5366,17 @@ "@mintlify/validation/zod-to-json-schema": ["zod-to-json-schema@3.20.4", "", { "peerDependencies": { "zod": "^3.20.0" } }, "sha512-Un9+kInJ2Zt63n6Z7mLqBifzzPcOyX+b+Exuzf7L1+xqck9Q2EPByyTRduV3kmSPaXaRer1JCsucubpgL1fipg=="], + "@modelcontextprotocol/client/zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], + + "@modelcontextprotocol/core/zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], + + "@modelcontextprotocol/ext-apps/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], + "@modelcontextprotocol/sdk/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=="], - "@modelcontextprotocol/sdk/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], + "@modelcontextprotocol/sdk/zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], + + "@modelcontextprotocol/server/zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], "@mymediset/sap-ai-provider/@ai-sdk/provider": ["@ai-sdk/provider@3.0.8", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ=="], @@ -5438,6 +5494,10 @@ "@repo/web/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + "@rolldown/plugin-babel/picomatch": ["picomatch@4.0.5", "", {}, "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A=="], + + "@rolldown/plugin-babel/vite": ["vite@7.3.1", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA=="], + "@sap-ai-sdk/prompt-registry/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], "@sap-cloud-sdk/connectivity/axios": ["axios@1.13.6", "", { "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ=="], @@ -5490,8 +5550,14 @@ "@supermemory/ai-sdk/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + "@supermemory/mcp-launch-film/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + + "@supermemory/memory-graph/@vitejs/plugin-react": ["@vitejs/plugin-react@5.1.4", "", { "dependencies": { "@babel/core": "^7.29.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-rc.3", "@types/babel__core": "^7.20.5", "react-refresh": "^0.18.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA=="], + "@supermemory/memory-graph/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + "@supermemory/memory-graph/vite": ["vite@7.3.1", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA=="], + "@supermemory/tools/@ai-sdk/anthropic": ["@ai-sdk/anthropic@2.0.70", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.22" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-W3WjQlb0Ho+CVAQUvb8Rtk3hGS3Jlgy79ihY2H0yj2k4yU8XuxpQw0Oz+7JQsB47j+jlHhk7nUXtxhAeRg3S3Q=="], "@supermemory/tools/@ai-sdk/provider": ["@ai-sdk/provider@3.0.8", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ=="], @@ -5542,12 +5608,16 @@ "@voltagent/core/@ai-sdk/xai": ["@ai-sdk/xai@3.0.67", "", { "dependencies": { "@ai-sdk/openai-compatible": "2.0.35", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.19" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-KQQIDc91dUA5IGFMnXBuvPBeraYNTdpDC1qUS+JG8vE+/299//5sZFafI1kKYUu3f3p7LaZrKXYgZ1Ni7QIRbw=="], + "@voltagent/core/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.27.1", "", { "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-sr6GbP+4edBwFndLbM60gf07z0FQ79gaExpnsjMGePXqFcSSb7t6iscpjk9DhFhwd+mTEQrzNafGP8/iGGFYaA=="], + "@voltagent/core/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.204.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-DqxY8yoAaiBPivoJD4UtgrMS8gEmzZ5lnaxzPojzLVHBGqPxgWm4zcuvcUHZiqQ6kRX2Klel2r9y8cA2HAtqpw=="], "@voltagent/core/@opentelemetry/exporter-logs-otlp-http": ["@opentelemetry/exporter-logs-otlp-http@0.204.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.204.0", "@opentelemetry/core": "2.1.0", "@opentelemetry/otlp-exporter-base": "0.204.0", "@opentelemetry/otlp-transformer": "0.204.0", "@opentelemetry/sdk-logs": "0.204.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-cQyIIZxUnXy3M6n9LTW3uhw/cem4WP+k7NtrXp8pf4U3v0RljSCBeD0kA8TRotPJj2YutCjUIDrWOn0u+06PSA=="], "@voltagent/core/@opentelemetry/sdk-logs": ["@opentelemetry/sdk-logs@0.204.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.204.0", "@opentelemetry/core": "2.1.0", "@opentelemetry/resources": "2.1.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, "sha512-y32iNNmpMUVFWSqbNrXE8xY/6EMge+HX3PXsMnCDV4cXT4SNT+W/3NgyMDf80KJL0fUK17/a0NmfXcrBhkFWrg=="], + "@wxt-dev/module-react/@vitejs/plugin-react": ["@vitejs/plugin-react@5.1.4", "", { "dependencies": { "@babel/core": "^7.29.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-rc.3", "@types/babel__core": "^7.20.5", "react-refresh": "^0.18.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA=="], + "accepts/negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], "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=="], @@ -5954,15 +6024,13 @@ "supermemory-browser-extension/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], - "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/agents": ["agents@0.3.10", "", { "dependencies": { "@cfworker/json-schema": "^4.1.1", "@modelcontextprotocol/sdk": "1.25.2", "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.2", "partysocket": "1.1.11", "yargs": "^18.0.0" }, "peerDependencies": { "@ai-sdk/openai": "^3.0.0", "@ai-sdk/react": "^3.0.0", "@cloudflare/ai-chat": "^0.0.6", "@cloudflare/codemode": "^0.0.6", "ai": "^6.0.0", "react": "^19.0.0", "viem": ">=2.0.0", "x402": "^0.7.1", "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["@ai-sdk/openai", "@ai-sdk/react", "viem", "x402"], "bin": { "agents": "dist/cli/index.js" } }, "sha512-hKj3nbej14GA2SgE6/stQheJF35LCS7DxMuHG0QDl1/npnnECYyG0Yf5DXl6AvJAZOFNDwT3iEzKi8yLZngPDA=="], + "supermemory-mcp/agents": ["agents@0.20.1", "", { "dependencies": { "@babel/plugin-proposal-decorators": "^8.0.2", "@cfworker/json-schema": "^4.1.1", "@rolldown/plugin-babel": "^0.2.3", "cron-schedule": "^6.0.0", "esbuild": "^0.28.1", "mimetext": "^3.0.28", "nanoid": "^5.1.16", "partyserver": "^0.5.8", "partysocket": "1.3.0", "yaml": "^2.9.0", "yargs": "^18.0.0" }, "peerDependencies": { "@ai-sdk/react": "^3.0.0 || ^4.0.0", "@cloudflare/codemode": ">=0.5.0", "@modelcontextprotocol/client": "2.0.0", "@modelcontextprotocol/sdk": "1.30.0", "@modelcontextprotocol/server": "2.0.0", "@tanstack/ai": ">=0.10.2 <1.0.0", "@x402/core": "^2.0.0", "@x402/evm": "^2.0.0", "ai": "^6.0.0 || ^7.0.0", "chat": "^4.29.0", "just-bash": "^3.0.0", "react": "^19.0.0", "vite": ">=6.0.0 <9.0.0", "zod": "^4.0.0" }, "optionalPeers": ["@ai-sdk/react", "@cloudflare/codemode", "@tanstack/ai", "@x402/core", "@x402/evm", "ai", "chat", "just-bash", "vite"], "bin": { "agents": "dist/cli/index.js" } }, "sha512-HQRYMeZpD3k8djYBH7atRPojZMee3NvmXkzsmMWXfdHZ94vMljmWqSsD1XZd70LovHyQrw6/R81AZZIsRiFM6Q=="], "supermemory-mcp/supermemory": ["supermemory@4.21.1", "", { "bin": { "supermemory": "bin/cli" } }, "sha512-KayOHtD94g7O+yN2qxaHEO5UIXtDl+duaKuhW7gvaraVtP1RHxFn80Pb5s5rKmqIvC+ruaARRlgMw7s/y+6LGQ=="], "supermemory-mcp/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], - "supermemory-mcp/vite": ["vite@6.4.1", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g=="], + "supermemory-mcp/zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], "tar/minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="], @@ -5990,10 +6058,12 @@ "victory-vendor/d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="], - "vite/esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="], + "vite-node/vite": ["vite@7.3.1", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA=="], "vitest/tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], + "vitest/vite": ["vite@7.3.1", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA=="], + "vscode-languageserver-protocol/vscode-jsonrpc": ["vscode-jsonrpc@8.2.0", "", {}, "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA=="], "web-ext-run/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], @@ -6036,6 +6106,8 @@ "wxt/open": ["open@11.0.0", "", { "dependencies": { "default-browser": "^5.4.0", "define-lazy-prop": "^3.0.0", "is-in-ssh": "^1.0.0", "is-inside-container": "^1.0.0", "powershell-utils": "^0.1.0", "wsl-utils": "^0.3.0" } }, "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw=="], + "wxt/vite": ["vite@7.3.1", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA=="], + "xss/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], "zod-from-json-schema/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], @@ -6100,8 +6172,76 @@ "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], + "@babel/helper-annotate-as-pure/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@8.0.0", "", {}, "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg=="], + + "@babel/helper-annotate-as-pure/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@8.0.4", "", {}, "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg=="], + "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + "@babel/helper-create-class-features-plugin/@babel/traverse/@babel/code-frame": ["@babel/code-frame@8.0.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^8.0.0", "js-tokens": "^10.0.0" } }, "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw=="], + + "@babel/helper-create-class-features-plugin/@babel/traverse/@babel/generator": ["@babel/generator@8.0.0", "", { "dependencies": { "@babel/parser": "^8.0.0", "@babel/types": "^8.0.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "@types/jsesc": "^2.5.0", "jsesc": "^3.0.2" } }, "sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g=="], + + "@babel/helper-create-class-features-plugin/@babel/traverse/@babel/helper-globals": ["@babel/helper-globals@8.0.0", "", {}, "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw=="], + + "@babel/helper-create-class-features-plugin/@babel/traverse/@babel/parser": ["@babel/parser@8.0.4", "", { "dependencies": { "@babel/types": "^8.0.4" }, "bin": "./bin/babel-parser.js" }, "sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g=="], + + "@babel/helper-create-class-features-plugin/@babel/traverse/@babel/template": ["@babel/template@8.0.0", "", { "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/parser": "^8.0.0", "@babel/types": "^8.0.0" } }, "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ=="], + + "@babel/helper-create-class-features-plugin/@babel/traverse/@babel/types": ["@babel/types@8.0.4", "", { "dependencies": { "@babel/helper-string-parser": "^8.0.0", "@babel/helper-validator-identifier": "^8.0.4" } }, "sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g=="], + + "@babel/helper-member-expression-to-functions/@babel/traverse/@babel/code-frame": ["@babel/code-frame@8.0.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^8.0.0", "js-tokens": "^10.0.0" } }, "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw=="], + + "@babel/helper-member-expression-to-functions/@babel/traverse/@babel/generator": ["@babel/generator@8.0.0", "", { "dependencies": { "@babel/parser": "^8.0.0", "@babel/types": "^8.0.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "@types/jsesc": "^2.5.0", "jsesc": "^3.0.2" } }, "sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g=="], + + "@babel/helper-member-expression-to-functions/@babel/traverse/@babel/helper-globals": ["@babel/helper-globals@8.0.0", "", {}, "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw=="], + + "@babel/helper-member-expression-to-functions/@babel/traverse/@babel/parser": ["@babel/parser@8.0.4", "", { "dependencies": { "@babel/types": "^8.0.4" }, "bin": "./bin/babel-parser.js" }, "sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g=="], + + "@babel/helper-member-expression-to-functions/@babel/traverse/@babel/template": ["@babel/template@8.0.0", "", { "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/parser": "^8.0.0", "@babel/types": "^8.0.0" } }, "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ=="], + + "@babel/helper-member-expression-to-functions/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@8.0.0", "", {}, "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg=="], + + "@babel/helper-member-expression-to-functions/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@8.0.4", "", {}, "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg=="], + + "@babel/helper-optimise-call-expression/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@8.0.0", "", {}, "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg=="], + + "@babel/helper-optimise-call-expression/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@8.0.4", "", {}, "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg=="], + + "@babel/helper-replace-supers/@babel/traverse/@babel/code-frame": ["@babel/code-frame@8.0.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^8.0.0", "js-tokens": "^10.0.0" } }, "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw=="], + + "@babel/helper-replace-supers/@babel/traverse/@babel/generator": ["@babel/generator@8.0.0", "", { "dependencies": { "@babel/parser": "^8.0.0", "@babel/types": "^8.0.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "@types/jsesc": "^2.5.0", "jsesc": "^3.0.2" } }, "sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g=="], + + "@babel/helper-replace-supers/@babel/traverse/@babel/helper-globals": ["@babel/helper-globals@8.0.0", "", {}, "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw=="], + + "@babel/helper-replace-supers/@babel/traverse/@babel/parser": ["@babel/parser@8.0.4", "", { "dependencies": { "@babel/types": "^8.0.4" }, "bin": "./bin/babel-parser.js" }, "sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g=="], + + "@babel/helper-replace-supers/@babel/traverse/@babel/template": ["@babel/template@8.0.0", "", { "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/parser": "^8.0.0", "@babel/types": "^8.0.0" } }, "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ=="], + + "@babel/helper-replace-supers/@babel/traverse/@babel/types": ["@babel/types@8.0.4", "", { "dependencies": { "@babel/helper-string-parser": "^8.0.0", "@babel/helper-validator-identifier": "^8.0.4" } }, "sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g=="], + + "@babel/helper-skip-transparent-expression-wrappers/@babel/traverse/@babel/code-frame": ["@babel/code-frame@8.0.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^8.0.0", "js-tokens": "^10.0.0" } }, "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw=="], + + "@babel/helper-skip-transparent-expression-wrappers/@babel/traverse/@babel/generator": ["@babel/generator@8.0.0", "", { "dependencies": { "@babel/parser": "^8.0.0", "@babel/types": "^8.0.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "@types/jsesc": "^2.5.0", "jsesc": "^3.0.2" } }, "sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g=="], + + "@babel/helper-skip-transparent-expression-wrappers/@babel/traverse/@babel/helper-globals": ["@babel/helper-globals@8.0.0", "", {}, "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw=="], + + "@babel/helper-skip-transparent-expression-wrappers/@babel/traverse/@babel/parser": ["@babel/parser@8.0.4", "", { "dependencies": { "@babel/types": "^8.0.4" }, "bin": "./bin/babel-parser.js" }, "sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g=="], + + "@babel/helper-skip-transparent-expression-wrappers/@babel/traverse/@babel/template": ["@babel/template@8.0.0", "", { "dependencies": { "@babel/code-frame": "^8.0.0", "@babel/parser": "^8.0.0", "@babel/types": "^8.0.0" } }, "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ=="], + + "@babel/helper-skip-transparent-expression-wrappers/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@8.0.0", "", {}, "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg=="], + + "@babel/helper-skip-transparent-expression-wrappers/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@8.0.4", "", {}, "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg=="], + + "@babel/plugin-transform-typescript/@babel/helper-create-class-features-plugin/@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.28.5", "", { "dependencies": { "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5" } }, "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg=="], + + "@babel/plugin-transform-typescript/@babel/helper-create-class-features-plugin/@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.27.1", "", { "dependencies": { "@babel/types": "^7.27.1" } }, "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw=="], + + "@babel/plugin-transform-typescript/@babel/helper-create-class-features-plugin/@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.28.6", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg=="], + + "@babel/plugin-transform-typescript/@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "@dotenvx/dotenvx/execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], "@dotenvx/dotenvx/execa/human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], @@ -6180,6 +6320,10 @@ "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + "@mastra/core/@modelcontextprotocol/sdk/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=="], + + "@mastra/core/@modelcontextprotocol/sdk/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], + "@mintlify/cli/inquirer/ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="], "@mintlify/cli/inquirer/run-async": ["run-async@3.0.0", "", {}, "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q=="], @@ -6472,6 +6616,10 @@ "@repo/web/ai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.23", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-z8GlDaCmRSDlqkMF2f4/RFgWxdarvIbyuk+m6WXT1LYgsnGiXRJGTD2Z1+SDl3LqtFuRtGX1aghYvQLoHL/9pg=="], + "@rolldown/plugin-babel/vite/esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="], + + "@rolldown/plugin-babel/vite/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + "@sap-cloud-sdk/util/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "@sentry/bundler-plugin-core/glob/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], @@ -6484,6 +6632,12 @@ "@stoplight/spectral-core/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + "@supermemory/memory-graph/@vitejs/plugin-react/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.3", "", {}, "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q=="], + + "@supermemory/memory-graph/@vitejs/plugin-react/react-refresh": ["react-refresh@0.18.0", "", {}, "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw=="], + + "@supermemory/memory-graph/vite/esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="], + "@supermemory/tools/@ai-sdk/anthropic/@ai-sdk/provider": ["@ai-sdk/provider@2.0.1", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-KCUwswvsC5VsW2PWFqF8eJgSCu5Ysj7m1TxiHTVA6g7k360bk0RNQENT8KTMAYEs+8fWPD3Uu4dEmzGHc+jGng=="], "@supermemory/tools/@ai-sdk/anthropic/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.22", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-fFT1KfUUKktfAFm5mClJhS1oux9tP2qgzmEZVl5UdwltQ1LO/s8hd7znVrgKzivwv1s1FIPza0s9OpJaNB/vHw=="], @@ -6522,6 +6676,10 @@ "@voltagent/core/@ai-sdk/xai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.19", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-3eG55CrSWCu2SXlqq2QCsFjo3+E7+Gmg7i/oRVoSZzIodTuDSfLb3MRje67xE9RFea73Zao7Lm4mADIfUETKGg=="], + "@voltagent/core/@modelcontextprotocol/sdk/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=="], + + "@voltagent/core/@modelcontextprotocol/sdk/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], + "@voltagent/core/@opentelemetry/exporter-logs-otlp-http/@opentelemetry/core": ["@opentelemetry/core@2.1.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-RMEtHsxJs/GiHHxYT58IY57UXAQTuUnZVco6ymDEqTNlJKTimM4qPUPVe8InNFyBjhHBEAx4k3Q8LtNayBsbUQ=="], "@voltagent/core/@opentelemetry/exporter-logs-otlp-http/@opentelemetry/otlp-exporter-base": ["@opentelemetry/otlp-exporter-base@0.204.0", "", { "dependencies": { "@opentelemetry/core": "2.1.0", "@opentelemetry/otlp-transformer": "0.204.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-K1LB1Ht4rGgOtZQ1N8xAwUnE1h9EQBfI4XUbSorbC6OxK6s/fLzl+UAhZX1cmBsDqM5mdx5+/k4QaKlDxX6UXQ=="], @@ -6530,6 +6688,10 @@ "@voltagent/core/@opentelemetry/sdk-logs/@opentelemetry/resources": ["@opentelemetry/resources@2.1.0", "", { "dependencies": { "@opentelemetry/core": "2.1.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-1CJjf3LCvoefUOgegxi8h6r4B/wLSzInyhGP2UmIBYNlo4Qk5CZ73e1eEyWmfXvFtm1ybkmfb2DqWvspsYLrWw=="], + "@wxt-dev/module-react/@vitejs/plugin-react/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.3", "", {}, "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q=="], + + "@wxt-dev/module-react/@vitejs/plugin-react/react-refresh": ["react-refresh@0.18.0", "", {}, "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw=="], + "agents/@modelcontextprotocol/sdk/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=="], "agents/@modelcontextprotocol/sdk/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], @@ -6712,13 +6874,15 @@ "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "supermemory-mcp/@vitejs/plugin-react/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="], + "supermemory-mcp/agents/esbuild": ["esbuild@0.28.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw=="], - "supermemory-mcp/@vitejs/plugin-react/react-refresh": ["react-refresh@0.17.0", "", {}, "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ=="], + "supermemory-mcp/agents/nanoid": ["nanoid@5.1.16", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-kVrnsrJqMR8+oLJnGEmSWw9BivK5mt7H3FZatVRjrc5wGqFYuBxX1yG7+A7Gi5AefkX6t/oCkizcQgpu0cY1dQ=="], - "supermemory-mcp/agents/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "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.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "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.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], + "supermemory-mcp/agents/partyserver": ["partyserver@0.5.9", "", { "dependencies": { "nanoid": "^5.1.9" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20260424.1 || ^5.20260703.1" } }, "sha512-0T1OGQD9Ggllrlp8Bt8XLOglEEktH4bui28Z1dbSGEX/iFmZnEWR148Qmvc1Od3rl64OAOfVtr2sG4XOMI9Y6Q=="], - "supermemory-mcp/agents/partysocket": ["partysocket@1.1.11", "", { "dependencies": { "event-target-polyfill": "^0.0.4" } }, "sha512-P0EtOQiAwvLriqLgdThcSaREfz3bP77LkLSdmXq680BosPKvGSoGTh/d0g3S+UNmaqcw89Ad7JXHHKyRx3xU9Q=="], + "supermemory-mcp/agents/partysocket": ["partysocket@1.3.0", "", { "dependencies": { "event-target-polyfill": "^0.0.4" }, "peerDependencies": { "react": ">=17" }, "optionalPeers": ["react"] }, "sha512-1zToNyolZFK/7nuAw/K2bZrNzFqaZyRoCEkS+9vG6WSC5ikrN6qWRe96q6ImU51uptz2r+dAwSkwhJVdQi4LiA=="], + + "supermemory-mcp/agents/yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], "terser-webpack-plugin/terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], @@ -6774,57 +6938,9 @@ "tsx/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], - "vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], + "vite-node/vite/esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="], - "vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="], - - "vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.3", "", { "os": "android", "cpu": "arm64" }, "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg=="], - - "vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.3", "", { "os": "android", "cpu": "x64" }, "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ=="], - - "vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg=="], - - "vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg=="], - - "vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w=="], - - "vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA=="], - - "vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.3", "", { "os": "linux", "cpu": "arm" }, "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw=="], - - "vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg=="], - - "vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg=="], - - "vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA=="], - - "vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw=="], - - "vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA=="], - - "vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ=="], - - "vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw=="], - - "vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.3", "", { "os": "linux", "cpu": "x64" }, "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA=="], - - "vite/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA=="], - - "vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.3", "", { "os": "none", "cpu": "x64" }, "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA=="], - - "vite/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.3", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw=="], - - "vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ=="], - - "vite/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g=="], - - "vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA=="], - - "vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA=="], - - "vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="], - - "vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], + "vitest/vite/esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="], "webpack/eslint-scope/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], @@ -6968,12 +7084,76 @@ "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], + "@babel/helper-create-class-features-plugin/@babel/traverse/@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@8.0.4", "", {}, "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg=="], + + "@babel/helper-create-class-features-plugin/@babel/traverse/@babel/code-frame/js-tokens": ["js-tokens@10.0.0", "", {}, "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q=="], + + "@babel/helper-create-class-features-plugin/@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=="], + + "@babel/helper-create-class-features-plugin/@babel/traverse/@babel/generator/jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "@babel/helper-create-class-features-plugin/@babel/traverse/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@8.0.0", "", {}, "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg=="], + + "@babel/helper-create-class-features-plugin/@babel/traverse/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@8.0.4", "", {}, "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg=="], + + "@babel/helper-member-expression-to-functions/@babel/traverse/@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@8.0.4", "", {}, "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg=="], + + "@babel/helper-member-expression-to-functions/@babel/traverse/@babel/code-frame/js-tokens": ["js-tokens@10.0.0", "", {}, "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q=="], + + "@babel/helper-member-expression-to-functions/@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=="], + + "@babel/helper-member-expression-to-functions/@babel/traverse/@babel/generator/jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "@babel/helper-replace-supers/@babel/traverse/@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@8.0.4", "", {}, "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg=="], + + "@babel/helper-replace-supers/@babel/traverse/@babel/code-frame/js-tokens": ["js-tokens@10.0.0", "", {}, "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q=="], + + "@babel/helper-replace-supers/@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=="], + + "@babel/helper-replace-supers/@babel/traverse/@babel/generator/jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "@babel/helper-replace-supers/@babel/traverse/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@8.0.0", "", {}, "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg=="], + + "@babel/helper-replace-supers/@babel/traverse/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@8.0.4", "", {}, "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg=="], + + "@babel/helper-skip-transparent-expression-wrappers/@babel/traverse/@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@8.0.4", "", {}, "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg=="], + + "@babel/helper-skip-transparent-expression-wrappers/@babel/traverse/@babel/code-frame/js-tokens": ["js-tokens@10.0.0", "", {}, "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q=="], + + "@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=="], + + "@babel/helper-skip-transparent-expression-wrappers/@babel/traverse/@babel/generator/jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + "@fastify/otel/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], "@inquirer/core/wrap-ansi/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "@inquirer/core/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "@mastra/core/@modelcontextprotocol/sdk/express/accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], + + "@mastra/core/@modelcontextprotocol/sdk/express/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=="], + + "@mastra/core/@modelcontextprotocol/sdk/express/content-disposition": ["content-disposition@1.0.1", "", {}, "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q=="], + + "@mastra/core/@modelcontextprotocol/sdk/express/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], + + "@mastra/core/@modelcontextprotocol/sdk/express/cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], + + "@mastra/core/@modelcontextprotocol/sdk/express/finalhandler": ["finalhandler@2.1.1", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="], + + "@mastra/core/@modelcontextprotocol/sdk/express/fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], + + "@mastra/core/@modelcontextprotocol/sdk/express/merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="], + + "@mastra/core/@modelcontextprotocol/sdk/express/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + + "@mastra/core/@modelcontextprotocol/sdk/express/send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="], + + "@mastra/core/@modelcontextprotocol/sdk/express/serve-static": ["serve-static@2.2.1", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="], + + "@mastra/core/@modelcontextprotocol/sdk/express/type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="], + "@mintlify/cli/inquirer/ansi-escapes/type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], "@mintlify/cli/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -7082,12 +7262,116 @@ "@repo/web/ai/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], + "@rolldown/plugin-babel/vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], + + "@rolldown/plugin-babel/vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="], + + "@rolldown/plugin-babel/vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.3", "", { "os": "android", "cpu": "arm64" }, "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg=="], + + "@rolldown/plugin-babel/vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.3", "", { "os": "android", "cpu": "x64" }, "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ=="], + + "@rolldown/plugin-babel/vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg=="], + + "@rolldown/plugin-babel/vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg=="], + + "@rolldown/plugin-babel/vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w=="], + + "@rolldown/plugin-babel/vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA=="], + + "@rolldown/plugin-babel/vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.3", "", { "os": "linux", "cpu": "arm" }, "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw=="], + + "@rolldown/plugin-babel/vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg=="], + + "@rolldown/plugin-babel/vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg=="], + + "@rolldown/plugin-babel/vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA=="], + + "@rolldown/plugin-babel/vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw=="], + + "@rolldown/plugin-babel/vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA=="], + + "@rolldown/plugin-babel/vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ=="], + + "@rolldown/plugin-babel/vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw=="], + + "@rolldown/plugin-babel/vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.3", "", { "os": "linux", "cpu": "x64" }, "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA=="], + + "@rolldown/plugin-babel/vite/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA=="], + + "@rolldown/plugin-babel/vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.3", "", { "os": "none", "cpu": "x64" }, "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA=="], + + "@rolldown/plugin-babel/vite/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.3", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw=="], + + "@rolldown/plugin-babel/vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ=="], + + "@rolldown/plugin-babel/vite/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g=="], + + "@rolldown/plugin-babel/vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA=="], + + "@rolldown/plugin-babel/vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA=="], + + "@rolldown/plugin-babel/vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="], + + "@rolldown/plugin-babel/vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], + "@sentry/bundler-plugin-core/glob/minimatch/brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], "@so-ric/colorspace/color/color-convert/color-name": ["color-name@2.1.0", "", {}, "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg=="], "@so-ric/colorspace/color/color-string/color-name": ["color-name@2.1.0", "", {}, "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg=="], + "@supermemory/memory-graph/vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], + + "@supermemory/memory-graph/vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="], + + "@supermemory/memory-graph/vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.3", "", { "os": "android", "cpu": "arm64" }, "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg=="], + + "@supermemory/memory-graph/vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.3", "", { "os": "android", "cpu": "x64" }, "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ=="], + + "@supermemory/memory-graph/vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg=="], + + "@supermemory/memory-graph/vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg=="], + + "@supermemory/memory-graph/vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w=="], + + "@supermemory/memory-graph/vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA=="], + + "@supermemory/memory-graph/vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.3", "", { "os": "linux", "cpu": "arm" }, "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw=="], + + "@supermemory/memory-graph/vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg=="], + + "@supermemory/memory-graph/vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg=="], + + "@supermemory/memory-graph/vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA=="], + + "@supermemory/memory-graph/vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw=="], + + "@supermemory/memory-graph/vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA=="], + + "@supermemory/memory-graph/vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ=="], + + "@supermemory/memory-graph/vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw=="], + + "@supermemory/memory-graph/vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.3", "", { "os": "linux", "cpu": "x64" }, "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA=="], + + "@supermemory/memory-graph/vite/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA=="], + + "@supermemory/memory-graph/vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.3", "", { "os": "none", "cpu": "x64" }, "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA=="], + + "@supermemory/memory-graph/vite/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.3", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw=="], + + "@supermemory/memory-graph/vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ=="], + + "@supermemory/memory-graph/vite/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g=="], + + "@supermemory/memory-graph/vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA=="], + + "@supermemory/memory-graph/vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA=="], + + "@supermemory/memory-graph/vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="], + + "@supermemory/memory-graph/vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], + "@supermemory/tools/@ai-sdk/anthropic/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], "@voltagent/core/@ai-sdk/anthropic/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], @@ -7102,6 +7386,30 @@ "@voltagent/core/@ai-sdk/xai/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], + "@voltagent/core/@modelcontextprotocol/sdk/express/accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], + + "@voltagent/core/@modelcontextprotocol/sdk/express/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=="], + + "@voltagent/core/@modelcontextprotocol/sdk/express/content-disposition": ["content-disposition@1.0.1", "", {}, "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q=="], + + "@voltagent/core/@modelcontextprotocol/sdk/express/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], + + "@voltagent/core/@modelcontextprotocol/sdk/express/cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], + + "@voltagent/core/@modelcontextprotocol/sdk/express/finalhandler": ["finalhandler@2.1.1", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="], + + "@voltagent/core/@modelcontextprotocol/sdk/express/fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], + + "@voltagent/core/@modelcontextprotocol/sdk/express/merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="], + + "@voltagent/core/@modelcontextprotocol/sdk/express/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + + "@voltagent/core/@modelcontextprotocol/sdk/express/send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="], + + "@voltagent/core/@modelcontextprotocol/sdk/express/serve-static": ["serve-static@2.2.1", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="], + + "@voltagent/core/@modelcontextprotocol/sdk/express/type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="], + "agents/@modelcontextprotocol/sdk/express/accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], "agents/@modelcontextprotocol/sdk/express/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=="], @@ -7140,11 +7448,161 @@ "memory-graph-playground/next/postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], - "supermemory-mcp/agents/@modelcontextprotocol/sdk/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=="], + "supermemory-mcp/agents/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ=="], - "supermemory-mcp/agents/@modelcontextprotocol/sdk/express-rate-limit": ["express-rate-limit@7.5.1", "", { "peerDependencies": { "express": ">= 4.11" } }, "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw=="], + "supermemory-mcp/agents/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.28.1", "", { "os": "android", "cpu": "arm" }, "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ=="], - "supermemory-mcp/agents/@modelcontextprotocol/sdk/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], + "supermemory-mcp/agents/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.1", "", { "os": "android", "cpu": "arm64" }, "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg=="], + + "supermemory-mcp/agents/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.28.1", "", { "os": "android", "cpu": "x64" }, "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng=="], + + "supermemory-mcp/agents/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q=="], + + "supermemory-mcp/agents/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ=="], + + "supermemory-mcp/agents/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw=="], + + "supermemory-mcp/agents/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ=="], + + "supermemory-mcp/agents/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.1", "", { "os": "linux", "cpu": "arm" }, "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ=="], + + "supermemory-mcp/agents/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g=="], + + "supermemory-mcp/agents/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w=="], + + "supermemory-mcp/agents/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg=="], + + "supermemory-mcp/agents/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ=="], + + "supermemory-mcp/agents/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ=="], + + "supermemory-mcp/agents/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ=="], + + "supermemory-mcp/agents/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag=="], + + "supermemory-mcp/agents/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.1", "", { "os": "linux", "cpu": "x64" }, "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA=="], + + "supermemory-mcp/agents/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw=="], + + "supermemory-mcp/agents/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.1", "", { "os": "none", "cpu": "x64" }, "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg=="], + + "supermemory-mcp/agents/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q=="], + + "supermemory-mcp/agents/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw=="], + + "supermemory-mcp/agents/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg=="], + + "supermemory-mcp/agents/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ=="], + + "supermemory-mcp/agents/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA=="], + + "supermemory-mcp/agents/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg=="], + + "supermemory-mcp/agents/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.1", "", { "os": "win32", "cpu": "x64" }, "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A=="], + + "vite-node/vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], + + "vite-node/vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="], + + "vite-node/vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.3", "", { "os": "android", "cpu": "arm64" }, "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg=="], + + "vite-node/vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.3", "", { "os": "android", "cpu": "x64" }, "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ=="], + + "vite-node/vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg=="], + + "vite-node/vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg=="], + + "vite-node/vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w=="], + + "vite-node/vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA=="], + + "vite-node/vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.3", "", { "os": "linux", "cpu": "arm" }, "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw=="], + + "vite-node/vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg=="], + + "vite-node/vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg=="], + + "vite-node/vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA=="], + + "vite-node/vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw=="], + + "vite-node/vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA=="], + + "vite-node/vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ=="], + + "vite-node/vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw=="], + + "vite-node/vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.3", "", { "os": "linux", "cpu": "x64" }, "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA=="], + + "vite-node/vite/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA=="], + + "vite-node/vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.3", "", { "os": "none", "cpu": "x64" }, "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA=="], + + "vite-node/vite/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.3", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw=="], + + "vite-node/vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ=="], + + "vite-node/vite/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g=="], + + "vite-node/vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA=="], + + "vite-node/vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA=="], + + "vite-node/vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="], + + "vite-node/vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], + + "vitest/vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], + + "vitest/vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="], + + "vitest/vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.3", "", { "os": "android", "cpu": "arm64" }, "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg=="], + + "vitest/vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.3", "", { "os": "android", "cpu": "x64" }, "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ=="], + + "vitest/vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg=="], + + "vitest/vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg=="], + + "vitest/vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w=="], + + "vitest/vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA=="], + + "vitest/vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.3", "", { "os": "linux", "cpu": "arm" }, "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw=="], + + "vitest/vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg=="], + + "vitest/vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg=="], + + "vitest/vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA=="], + + "vitest/vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw=="], + + "vitest/vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA=="], + + "vitest/vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ=="], + + "vitest/vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw=="], + + "vitest/vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.3", "", { "os": "linux", "cpu": "x64" }, "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA=="], + + "vitest/vite/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA=="], + + "vitest/vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.3", "", { "os": "none", "cpu": "x64" }, "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA=="], + + "vitest/vite/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.3", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw=="], + + "vitest/vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ=="], + + "vitest/vite/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g=="], + + "vitest/vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA=="], + + "vitest/vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA=="], + + "vitest/vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="], + + "vitest/vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], "wxt/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], @@ -7154,6 +7612,18 @@ "@aklinker1/rollup-plugin-visualizer/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "@mastra/core/@modelcontextprotocol/sdk/express/accepts/negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], + + "@mastra/core/@modelcontextprotocol/sdk/express/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=="], + + "@mastra/core/@modelcontextprotocol/sdk/express/finalhandler/statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], + + "@mastra/core/@modelcontextprotocol/sdk/express/send/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=="], + + "@mastra/core/@modelcontextprotocol/sdk/express/send/statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], + + "@mastra/core/@modelcontextprotocol/sdk/express/type-is/media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], + "@mintlify/cli/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "@mintlify/cli/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], @@ -7212,6 +7682,18 @@ "@sentry/bundler-plugin-core/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "@voltagent/core/@modelcontextprotocol/sdk/express/accepts/negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], + + "@voltagent/core/@modelcontextprotocol/sdk/express/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=="], + + "@voltagent/core/@modelcontextprotocol/sdk/express/finalhandler/statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], + + "@voltagent/core/@modelcontextprotocol/sdk/express/send/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=="], + + "@voltagent/core/@modelcontextprotocol/sdk/express/send/statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], + + "@voltagent/core/@modelcontextprotocol/sdk/express/type-is/media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], + "agents/@modelcontextprotocol/sdk/express/accepts/negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], "agents/@modelcontextprotocol/sdk/express/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=="], @@ -7224,29 +7706,7 @@ "agents/@modelcontextprotocol/sdk/express/type-is/media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], - "supermemory-mcp/agents/@modelcontextprotocol/sdk/express/accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], - - "supermemory-mcp/agents/@modelcontextprotocol/sdk/express/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=="], - - "supermemory-mcp/agents/@modelcontextprotocol/sdk/express/content-disposition": ["content-disposition@1.0.1", "", {}, "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q=="], - - "supermemory-mcp/agents/@modelcontextprotocol/sdk/express/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], - - "supermemory-mcp/agents/@modelcontextprotocol/sdk/express/cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], - - "supermemory-mcp/agents/@modelcontextprotocol/sdk/express/finalhandler": ["finalhandler@2.1.1", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="], - - "supermemory-mcp/agents/@modelcontextprotocol/sdk/express/fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], - - "supermemory-mcp/agents/@modelcontextprotocol/sdk/express/merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="], - - "supermemory-mcp/agents/@modelcontextprotocol/sdk/express/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], - - "supermemory-mcp/agents/@modelcontextprotocol/sdk/express/send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="], - - "supermemory-mcp/agents/@modelcontextprotocol/sdk/express/serve-static": ["serve-static@2.2.1", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="], - - "supermemory-mcp/agents/@modelcontextprotocol/sdk/express/type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="], + "@mastra/core/@modelcontextprotocol/sdk/express/body-parser/http-errors/statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], "@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=="], @@ -7258,22 +7718,10 @@ "@mintlify/link-rot/@mintlify/scraping/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "@voltagent/core/@modelcontextprotocol/sdk/express/body-parser/http-errors/statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], + "agents/@modelcontextprotocol/sdk/express/body-parser/http-errors/statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], - "supermemory-mcp/agents/@modelcontextprotocol/sdk/express/accepts/negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], - - "supermemory-mcp/agents/@modelcontextprotocol/sdk/express/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=="], - - "supermemory-mcp/agents/@modelcontextprotocol/sdk/express/finalhandler/statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], - - "supermemory-mcp/agents/@modelcontextprotocol/sdk/express/send/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=="], - - "supermemory-mcp/agents/@modelcontextprotocol/sdk/express/send/statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], - - "supermemory-mcp/agents/@modelcontextprotocol/sdk/express/type-is/media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], - "@mintlify/link-rot/@mintlify/scraping/@mintlify/common/tailwindcss/chokidar/readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - - "supermemory-mcp/agents/@modelcontextprotocol/sdk/express/body-parser/http-errors/statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], } }