diff --git a/apps/mcp/README.md b/apps/mcp/README.md index fc40803f8..9608db6ee 100644 --- a/apps/mcp/README.md +++ b/apps/mcp/README.md @@ -14,7 +14,7 @@ memories, profile, spaces, and interactive MCP Apps. The space used by an operation resolves in this order: -1. An explicit `containerTag` tool or prompt argument +1. An explicit `namespace` tool or prompt argument 2. The account's durable active space 3. The Supermemory client default, `sm_project_default` @@ -137,7 +137,8 @@ discovery and rejection tests still run. ## Storage And Rollout -`SpaceState` stores only the active space's container tag. It never stores bearer +`SpaceState` stores only the active space's namespace (under the legacy +`activeContainerTag` key, so existing selections survive). It never stores bearer tokens, MCP client identity, or protocol messages. The old `SupermemoryMCP` class and binding remain inert for one rollout. This diff --git a/apps/mcp/e2e/graph.test.ts b/apps/mcp/e2e/graph.test.ts index 9e654464f..1ef04d324 100644 --- a/apps/mcp/e2e/graph.test.ts +++ b/apps/mcp/e2e/graph.test.ts @@ -64,7 +64,7 @@ describeWithAuth("MCP — graph, resources & prompts", () => { expect(res.contents[0].mimeType).toBe("text/plain") expect(text).toMatch(/# My Spaces/) expect(text).toMatch(/Active:/) - expect(text).not.toMatch(/"containerTags":/) + expect(text).not.toMatch(/"namespaces":/) }) it("gets compact active-space context without prompt arguments", async () => { diff --git a/apps/mcp/e2e/helpers.ts b/apps/mcp/e2e/helpers.ts index 0118106d7..dc140d562 100644 --- a/apps/mcp/e2e/helpers.ts +++ b/apps/mcp/e2e/helpers.ts @@ -219,13 +219,13 @@ export async function recallUntil( { tries = 18, delayMs = 5000, - containerTag = undefined as string | undefined, + namespace = undefined as string | undefined, } = {}, ): Promise { for (let i = 0; i < tries; i++) { const res = await callTool(client, "search_memory", { query, - ...(containerTag ? { containerTag } : {}), + ...(namespace ? { namespace } : {}), }) const txt = textOf(res) if (txt.includes(needle)) return txt diff --git a/apps/mcp/e2e/list-memories.test.ts b/apps/mcp/e2e/list-memories.test.ts index 72c209856..d8fa537fb 100644 --- a/apps/mcp/e2e/list-memories.test.ts +++ b/apps/mcp/e2e/list-memories.test.ts @@ -18,8 +18,8 @@ type AppView = { viewId?: string id?: string fileName?: string - containerTag?: string - writableTags?: string[] + namespace?: string + writableNamespaces?: string[] } async function waitForToolText( @@ -45,7 +45,7 @@ describe.skipIf(!OAUTH_CREDENTIALS_AVAILABLE)( let session: Session const createdMemories: Array<{ content: string - containerTag: string + namespace: string }> = [] beforeAll(async () => { @@ -57,7 +57,7 @@ describe.skipIf(!OAUTH_CREDENTIALS_AVAILABLE)( await callTool(session.client, "add_memory", { content: memory.content, action: "forget", - containerTag: memory.containerTag, + namespace: memory.namespace, }).catch(() => {}) } await session?.close() @@ -72,33 +72,33 @@ describe.skipIf(!OAUTH_CREDENTIALS_AVAILABLE)( expect(launcher.isError).toBeFalsy() const launcherView = launcher.structuredContent as AppView - const containerTag = launcherView.writableTags?.[0] + const namespace = launcherView.writableNamespaces?.[0] expect(launcherView.view).toBe("save") expect(launcherView.viewId).toBeTruthy() - expect(containerTag).toBeTruthy() - if (!launcherView.viewId || !containerTag) { + expect(namespace).toBeTruthy() + if (!launcherView.viewId || !namespace) { throw new Error("Guided save did not provide a writable space") } const saved = await callTool(session.client, "save-memory", { content, - containerTag, + namespace, viewId: launcherView.viewId, }) expect(saved.isError).toBeFalsy() const savedView = saved.structuredContent as AppView expect(savedView).toMatchObject({ view: "save-success", - containerTag, + namespace, }) expect(savedView.id).toBeTruthy() if (!savedView.id) throw new Error("Save did not return a document ID") - createdMemories.push({ content, containerTag }) + createdMemories.push({ content, namespace }) const listedDocument = await waitForToolText( session, "list_documents", - { page: 1, limit: 50, containerTag }, + { page: 1, limit: 50, namespace }, `[${savedView.id}]`, 20, 1000, @@ -108,7 +108,7 @@ describe.skipIf(!OAUTH_CREDENTIALS_AVAILABLE)( const document = await waitForToolText( session, "get_document", - { documentId: savedView.id }, + { documentId: savedView.id, namespace }, `Document ID: ${savedView.id}`, 20, 1000, @@ -118,27 +118,11 @@ describe.skipIf(!OAUTH_CREDENTIALS_AVAILABLE)( const memoriesResult = await callTool(session.client, "list_memories", { page: 1, limit: 10, - containerTag: "sm_project_default", + namespace: "sm_project_default", }) expect(memoriesResult.isError).toBeFalsy() const memories = textOf(memoriesResult) expect(memories).toMatch(/active memor(?:y|ies) \(page 1 of \d+/i) - - const sourceDocumentId = memories.match( - /Source documents: ([^,\n]+)/, - )?.[1] - expect(sourceDocumentId).toBeTruthy() - if (!sourceDocumentId) { - throw new Error("Listed memory did not include a source document") - } - - const sourceDocument = await callTool(session.client, "get_document", { - documentId: sourceDocumentId, - }) - expect(sourceDocument.isError).toBeFalsy() - expect(textOf(sourceDocument)).toContain( - `Document ID: ${sourceDocumentId}`, - ) }, 60_000) it("uploads and reads a text document", async () => { @@ -149,22 +133,23 @@ describe.skipIf(!OAUTH_CREDENTIALS_AVAILABLE)( expect(launcher.isError).toBeFalsy() const launcherView = launcher.structuredContent as AppView - const containerTag = launcherView.writableTags?.[0] + const namespace = launcherView.writableNamespaces?.[0] expect(launcherView.view).toBe("upload") expect(launcherView.viewId).toBeTruthy() - expect(containerTag).toBeTruthy() - if (!launcherView.viewId || !containerTag) { + expect(namespace).toBeTruthy() + if (!launcherView.viewId || !namespace) { throw new Error("Upload did not provide a writable space") } - const prepared = await callTool(session.client, "prepare-file-upload") + const prepared = await callTool(session.client, "prepare-file-upload", { + namespace, + }) expect(prepared.isError).toBeFalsy() const preparation = uploadPreparationSchema.parse( prepared.structuredContent, ) const formData = new FormData() formData.append("file", new Blob([fileContent]), fileName) - formData.append("containerTag", containerTag) formData.append( "metadata", JSON.stringify({ sm_source: "supermemory-mcp" }), @@ -183,7 +168,7 @@ describe.skipIf(!OAUTH_CREDENTIALS_AVAILABLE)( const document = await waitForToolText( session, "get_document", - { documentId: uploaded.id }, + { documentId: uploaded.id, namespace }, `Document ID: ${uploaded.id}`, 20, 1000, diff --git a/apps/mcp/e2e/memory.test.ts b/apps/mcp/e2e/memory.test.ts index 8b0984413..c0fef8695 100644 --- a/apps/mcp/e2e/memory.test.ts +++ b/apps/mcp/e2e/memory.test.ts @@ -11,17 +11,17 @@ import { describe.skipIf(!OAUTH_CREDENTIALS_AVAILABLE)("MCP — memory behaviors", () => { let s: Session - const created: Array<{ content: string; containerTag?: string }> = [] + const created: Array<{ content: string; namespace?: string }> = [] beforeAll(async () => { s = await connect() }) afterAll(async () => { - for (const { content, containerTag } of created) { + for (const { content, namespace } of created) { await callTool(s.client, "add_memory", { content, action: "forget", - ...(containerTag ? { containerTag } : {}), + ...(namespace ? { namespace } : {}), }).catch(() => {}) } await s?.close() @@ -90,32 +90,32 @@ describe.skipIf(!OAUTH_CREDENTIALS_AVAILABLE)("MCP — memory behaviors", () => expect(textOf(forgotten)).toMatch(/forgot|No matching memory found/i) }, 120_000) - it("containerTag scopes memories (isolation)", async () => { - // Fixed tags (not per-run UUIDs) so the test doesn't mint a new project each run. - const tagA = "sm_e2e_scope_a" - const tagB = "sm_e2e_scope_b" + it("namespace scopes memories (isolation)", async () => { + // Fixed namespaces (not per-run UUIDs) so the test doesn't mint a new one each run. + const namespaceA = "sm_e2e_scope_a" + const namespaceB = "sm_e2e_scope_b" const marker = `sc-${randomUUID()}` const content = `e2e scoping. token=${marker}. Project color is teal.` - created.push({ content, containerTag: tagA }) + created.push({ content, namespace: namespaceA }) await callTool(s.client, "add_memory", { content, action: "save", - containerTag: tagA, + namespace: namespaceA, }) const inA = await recallUntil(s.client, "project color teal", marker, { - containerTag: tagA, + namespace: namespaceA, }) - expect(inA, "marker should be found in its own container").not.toBeNull() + expect(inA, "marker should be found in its own namespace").not.toBeNull() - // Same query scoped to a different container must NOT see it. + // Same query scoped to a different namespace must NOT see it. const leaked = await recallUntil(s.client, "project color teal", marker, { - containerTag: tagB, + namespace: namespaceB, tries: 3, delayMs: 3000, }) - expect(leaked, "marker leaked across containers").toBeNull() + expect(leaked, "marker leaked across namespaces").toBeNull() }, 120_000) it("returns an error result for a missing required argument", async () => { diff --git a/apps/mcp/e2e/space-scope.test.ts b/apps/mcp/e2e/space-scope.test.ts index 3b5c013bd..c11579511 100644 --- a/apps/mcp/e2e/space-scope.test.ts +++ b/apps/mcp/e2e/space-scope.test.ts @@ -12,7 +12,7 @@ const propsOf = (tools: ToolLike[], name: string): Record => const describeWithAuth = describe.skipIf(!OAUTH_CREDENTIALS_AVAILABLE) describeWithAuth("MCP - space scoping", () => { - it("keeps per-call containerTag overrides when an obsolete header is sent", async () => { + it("keeps per-call namespace overrides when an obsolete header is sent", async () => { const scoped = await connect({ headers: { "x-sm-project": "obsolete-root-scope" }, }) @@ -21,17 +21,13 @@ describeWithAuth("MCP - space scoping", () => { 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(plainTools, "get_profile")).toHaveProperty("containerTag") + expect(propsOf(plainTools, "add_memory")).toHaveProperty("namespace") + expect(propsOf(plainTools, "search_memory")).toHaveProperty("namespace") + expect(propsOf(plainTools, "get_profile")).toHaveProperty("namespace") - expect(propsOf(scopedTools, "add_memory")).toHaveProperty("containerTag") - expect(propsOf(scopedTools, "search_memory")).toHaveProperty( - "containerTag", - ) - expect(propsOf(scopedTools, "get_profile")).toHaveProperty("containerTag") + expect(propsOf(scopedTools, "add_memory")).toHaveProperty("namespace") + expect(propsOf(scopedTools, "search_memory")).toHaveProperty("namespace") + expect(propsOf(scopedTools, "get_profile")).toHaveProperty("namespace") } finally { await scoped.close() await plain.close() diff --git a/apps/mcp/e2e/widgets.test.ts b/apps/mcp/e2e/widgets.test.ts index 13824549b..60fffa145 100644 --- a/apps/mcp/e2e/widgets.test.ts +++ b/apps/mcp/e2e/widgets.test.ts @@ -25,20 +25,20 @@ describe.skipIf(!OAUTH_CREDENTIALS_AVAILABLE)( expect(result.isError).toBeFalsy() const content = result.structuredContent as { view?: string - containerTags?: Array<{ containerTag: string }> - assignedTags?: Array<{ - containerTag: string + namespaces?: Array<{ namespace: string }> + assignedNamespaces?: Array<{ + namespace: string permission: "read" | "write" }> } expect(content.view).toBe("picker") - expect(Array.isArray(content.containerTags)).toBe(true) - expect(content.assignedTags).toHaveLength( - content.containerTags?.length ?? 0, + expect(Array.isArray(content.namespaces)).toBe(true) + expect(content.assignedNamespaces).toHaveLength( + content.namespaces?.length ?? 0, ) expect( - content.assignedTags?.every((tag) => - ["read", "write"].includes(tag.permission), + content.assignedNamespaces?.every((access) => + ["read", "write"].includes(access.permission), ), ).toBe(true) }) @@ -46,18 +46,18 @@ describe.skipIf(!OAUTH_CREDENTIALS_AVAILABLE)( it("shares the selected space across MCP transport sessions", async () => { const picker = await callTool(session.client, "select-space") const pickerContent = picker.structuredContent as { - containerTags?: Array<{ containerTag: string }> + namespaces?: Array<{ namespace: string }> } - const firstTag = pickerContent.containerTags?.[0]?.containerTag - expect(firstTag).toBeTruthy() + const firstNamespace = pickerContent.namespaces?.[0]?.namespace + expect(firstNamespace).toBeTruthy() const result = await callTool(session.client, "set-active-tag", { - containerTag: firstTag, + namespace: firstNamespace, }) expect(result.isError).toBeFalsy() expect(result.structuredContent).toMatchObject({ view: "confirmation", - containerTag: firstTag, + namespace: firstNamespace, }) const separateSession = await connect() @@ -65,7 +65,7 @@ describe.skipIf(!OAUTH_CREDENTIALS_AVAILABLE)( const identity = await callTool(separateSession.client, "who_am_i") expect(identity.isError).toBeFalsy() expect(JSON.parse(textOf(identity))).toMatchObject({ - activeSpace: firstTag, + activeSpace: firstNamespace, }) } finally { await separateSession.close() diff --git a/apps/mcp/package.json b/apps/mcp/package.json index e219c276f..982b090b9 100644 --- a/apps/mcp/package.json +++ b/apps/mcp/package.json @@ -39,7 +39,7 @@ "posthog-node": "^5.18.0", "react": "^19.2.4", "react-dom": "^19.2.4", - "supermemory": "^4.0.0", + "supermemory": "^5.0.0", "tailwind-merge": "^3.4.0", "zod": "^4.4.3" }, diff --git a/apps/mcp/pnpm-lock.yaml b/apps/mcp/pnpm-lock.yaml deleted file mode 100644 index c3530142e..000000000 --- a/apps/mcp/pnpm-lock.yaml +++ /dev/null @@ -1,5264 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -overrides: - fast-uri: 3.1.7 - ip-address: 10.3.1 - nanoid@3: 3.3.18 - postcss: 8.5.18 - sharp: 0.35.4 - undici: 7.29.1 - -importers: - - .: - dependencies: - '@cloudflare/workers-oauth-provider': - specifier: ^0.2.2 - version: 0.2.4 - '@modelcontextprotocol/client': - specifier: 2.0.0 - version: 2.0.0 - '@modelcontextprotocol/ext-apps': - specifier: ^1.7.5 - version: 1.7.5(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(supports-color@10.2.2)(zod@4.4.3))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(zod@4.4.3) - '@modelcontextprotocol/sdk': - specifier: 1.30.0 - version: 1.30.0(@cfworker/json-schema@4.1.1)(supports-color@10.2.2)(zod@4.4.3) - '@modelcontextprotocol/server': - specifier: 2.0.0 - version: 2.0.0 - '@phosphor-icons/react': - specifier: ^2.1.10 - version: 2.1.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@posthog/mcp': - specifier: 0.21.0 - version: 0.21.0(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(supports-color@10.2.2)(zod@4.4.3))(@modelcontextprotocol/server@2.0.0)(posthog-node@5.38.2) - '@radix-ui/react-popover': - specifier: ^1.1.15 - version: 1.1.23(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-slot': - specifier: ^1.2.3 - version: 1.3.3(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-tooltip': - specifier: ^1.2.7 - version: 1.2.16(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@supermemory/memory-graph': - specifier: ^0.2.0 - version: 0.2.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - agents: - specifier: ^0.20.1 - version: 0.20.1(@babel/core@8.0.6)(@babel/runtime@7.29.7)(@cloudflare/workers-types@4.20260620.1)(@modelcontextprotocol/client@2.0.0)(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(supports-color@10.2.2)(zod@4.4.3))(@modelcontextprotocol/server@2.0.0)(ai@6.0.208(zod@4.4.3))(react@19.2.8)(rolldown@1.2.1)(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))(zod@4.4.3) - class-variance-authority: - specifier: ^0.7.1 - version: 0.7.1 - clsx: - specifier: ^2.1.1 - version: 2.1.1 - hono: - specifier: ^4.11.1 - version: 4.12.26 - jose: - specifier: ^6.2.0 - version: 6.2.3 - posthog-node: - specifier: ^5.18.0 - version: 5.38.2 - react: - specifier: ^19.2.4 - version: 19.2.8 - react-dom: - specifier: ^19.2.4 - version: 19.2.8(react@19.2.8) - supermemory: - specifier: ^4.0.0 - version: 4.24.12 - tailwind-merge: - specifier: ^3.4.0 - version: 3.6.0 - zod: - specifier: ^4.4.3 - version: 4.4.3 - devDependencies: - '@cloudflare/workers-types': - specifier: ^4.20250620.0 - version: 4.20260620.1 - '@tailwindcss/vite': - specifier: ^4.1.13 - version: 4.3.3(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) - '@types/react': - specifier: ^19.1.13 - version: 19.2.17 - '@types/react-dom': - specifier: ^19.1.9 - version: 19.2.3(@types/react@19.2.17) - '@vitejs/plugin-react': - specifier: ^4.3.4 - version: 4.7.0(supports-color@10.2.2)(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) - tailwindcss: - specifier: ^4.1.13 - version: 4.3.3 - typescript: - specifier: ^5.8.3 - version: 5.9.3 - vite: - specifier: ^6.0.0 - version: 6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) - vite-plugin-singlefile: - specifier: ^2.3.0 - version: 2.3.3(rollup@4.62.2)(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) - vitest: - specifier: ^3.2.4 - version: 3.2.6(jiti@2.7.0)(lightningcss@1.32.0)(supports-color@10.2.2)(yaml@2.9.0) - wrangler: - specifier: ^4.4.0 - version: 4.103.0(@cloudflare/workers-types@4.20260620.1) - -packages: - - '@ai-sdk/gateway@3.0.133': - resolution: {integrity: sha512-Ebs+7iS9zUgJu5B0RlxM2JmDWzq79Cpd6YdiqcCzB5qFdpfQJPUDiXutqlQP89F2XGjOdDeidulBTXUdXWzOxw==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - '@ai-sdk/provider-utils@4.0.30': - resolution: {integrity: sha512-VO7I+vPffqI5sMnPoUq5DCSqKIgQIk/naJWRdQVpz2ma2zoprC/lqiJiUEl2s6DfvTD76TbhD3q39ROjlA6rGw==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - '@ai-sdk/provider@3.0.10': - resolution: {integrity: sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw==} - engines: {node: '>=18'} - - '@babel/code-frame@7.29.7': - resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} - engines: {node: '>=6.9.0'} - - '@babel/code-frame@8.0.0': - resolution: {integrity: sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/code-frame@8.0.6': - resolution: {integrity: sha512-uMHhvmDmwFiLuiozaoRYTZHqMFuu3fem/X9JY78lohAuLoh8LSGGC8JqUzo2cVuBsBxkjMZNk56CE7ock8Xxkw==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/compat-data@7.29.7': - resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@8.0.5': - resolution: {integrity: sha512-YLsYoQMvL8l8WrGpN3Zj7O1wK5LEBN+cQtux7BcuHyxIXve724XG+zuJ1n3U1cUweRtTzQOA4IHbuQw3N34SZw==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/core@7.29.7': - resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} - engines: {node: '>=6.9.0'} - - '@babel/core@8.0.6': - resolution: {integrity: sha512-5zwYt1V4ji3mXKKRIAkohSJ29WepxNwxQi+7y7P5AcVPh1dcxnZBU2cfxHnPwS+u9+lZnXPsv30TQaF2xg+Tfg==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/generator@7.29.7': - resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} - engines: {node: '>=6.9.0'} - - '@babel/generator@8.0.0': - resolution: {integrity: sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/generator@8.0.6': - resolution: {integrity: sha512-/pcanjdRsonCexCuxgGD8fKnBLLzk2i9uM4kmcmGyyev2R5YDs+rafMYZ89RvaGY1mW8T7C5au0TyYaEeHBGng==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/helper-annotate-as-pure@8.0.0': - resolution: {integrity: sha512-NSpMkMsvvZqzThJ0p1B02cbtA2ObEyfBvq950bmNkyxsxvcxwhvvCB036rKhlEnuBBo30bOrk13u3FzlKSoRrw==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/helper-compilation-targets@7.29.7': - resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@8.0.6': - resolution: {integrity: sha512-HTrtZ4+iA0+kzdbCgvdSk1U4pEl3BvpGnlUbualCGNbrVhhQvhgBzurTUmqpWyvyHbWYWaIfdx2mOlL9LJjsew==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/helper-create-class-features-plugin@8.0.1': - resolution: {integrity: sha512-++t3ZktzlLmASAxIlxeXQK9Z2YwUafYGYcvGBFevqOqt16HozVHStUoQvWD09fzAZOb/uJGpUTBuGK41AJAuOA==} - engines: {node: ^22.18.0 || >=24.11.0} - peerDependencies: - '@babel/core': ^8.0.0 - - '@babel/helper-globals@7.29.7': - resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-globals@8.0.0': - resolution: {integrity: sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/helper-globals@8.0.6': - resolution: {integrity: sha512-OdnA/N52LhzFpeUuVz5YGuSWjc7TPHiFmVYZbPlSgExocO2GwbxVpSni9MVs5wwW+wZ4kPuwBEBN9pIPDYz1mA==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/helper-member-expression-to-functions@8.0.0': - resolution: {integrity: sha512-xkXrMbtk87Gk7+oKBVmBc6EORg/Qwx++AHESldmHkpvG8wgccdhJJFwrzqlF382Fk8wfXhJHWE/g/43QvEGNPQ==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/helper-module-imports@7.29.7': - resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.29.7': - resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-optimise-call-expression@8.0.0': - resolution: {integrity: sha512-3W6satvtPuCUkUx63S2jMoW9EQNYkADgs1HTfufmL7gCmAulHMKupA/12WNz4A0GMMFn/YnWWwqOT9IZrJHQjg==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/helper-plugin-utils@7.29.7': - resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-plugin-utils@8.0.1': - resolution: {integrity: sha512-3PKFgjTyPlhFhorfP+SjKQxLViIL++zWjFOO4hGriYU+Bsm983DxEM1JmDRJVWXV0O9npu+xXRqz7Pbd3mh70g==} - engines: {node: ^22.18.0 || >=24.11.0} - peerDependencies: - '@babel/core': ^8.0.0 - - '@babel/helper-replace-supers@8.0.1': - resolution: {integrity: sha512-B1SZADIcy3tmH8CmWvj4SHi/oAPom4UL3uknTc2QRNsPVLFk/sPnZvQL/8kj7Y5omvjMqie0vklvs6XM4OLW5Q==} - engines: {node: ^22.18.0 || >=24.11.0} - peerDependencies: - '@babel/core': ^8.0.0 - - '@babel/helper-skip-transparent-expression-wrappers@8.0.0': - resolution: {integrity: sha512-xmCA9kP3IhySsqhzwIdWGlDN/1A4cCKNBO/uwZx/3YzmDoMePwno2Q5/Bq0q+tYaKbeF940YiKV/kaW8Mzvpjw==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/helper-string-parser@7.29.7': - resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@8.0.0': - resolution: {integrity: sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/helper-string-parser@8.0.6': - resolution: {integrity: sha512-+6HYEBnsDRZHJtUTAEfMQd0zMDqdFHS7C+5vAsEZqBUr3vEMWOWlHJ0Jz1gS8jJIlCvLsuA6ivmeoqzH936YcA==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/helper-validator-identifier@7.29.7': - resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@8.0.4': - resolution: {integrity: sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/helper-validator-identifier@8.0.6': - resolution: {integrity: sha512-HYx0YmuchRxRSpnjvcNffnPS8DCauKNmnumIuHG3jnQAVewRA7kfJGwF13ayEpSZs7s4R/oBH4eppuXcAQd5JQ==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/helper-validator-option@7.29.7': - resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@8.0.0': - resolution: {integrity: sha512-U4Dybxh4WESWHt5XhBeExi4DrY0/DNK1aHpQbsrQXCUbFHuMweT0TpLEWKvaraV2Y6fS+ZXunsZ8zIuZIgvF2Q==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/helpers@7.29.7': - resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@8.0.5': - resolution: {integrity: sha512-fQtPOXjYOYv85PIdwotp2TJGVYOycX0PQq+l844fFAxOULtBy8BVF35GyeueX0r4KvDthqPH5xAI1clQPk/2uA==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/parser@7.29.7': - resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/parser@8.0.4': - resolution: {integrity: sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==} - engines: {node: ^22.18.0 || >=24.11.0} - hasBin: true - - '@babel/parser@8.0.6': - resolution: {integrity: sha512-LpGDIYJAzc3Y3PT9x+FxBrGYu2PlWxLmyN7SwPTzaX0LSwEmFJBsRnPBqmaXF2r1v+Zhz6lNiEJ+7yKtM5+Ugg==} - engines: {node: ^22.18.0 || >=24.11.0} - hasBin: true - - '@babel/plugin-proposal-decorators@8.0.2': - resolution: {integrity: sha512-+C6O6KKXU7BBq1GNaIkFJxrALUVGRcr+WeWm4OcuRl3h+l/CmNfcTLMrT2Lm3uvGBimBH/8pEBRrXJFLoO67Gg==} - engines: {node: ^22.18.0 || >=24.11.0} - peerDependencies: - '@babel/core': ^8.0.0 - - '@babel/plugin-syntax-decorators@8.0.1': - resolution: {integrity: sha512-NI+0S/6MvR6GlcQFwjDZ+WIc2qvG6TXN534lYs9llNldwW4b7Dh6KTtk030FA0xWdYGs4t1lWo+OEWN8wGB+Nw==} - engines: {node: ^22.18.0 || >=24.11.0} - peerDependencies: - '@babel/core': ^8.0.0 - - '@babel/plugin-transform-react-jsx-self@7.29.7': - resolution: {integrity: sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx-source@7.29.7': - resolution: {integrity: sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/runtime-corejs3@7.29.7': - resolution: {integrity: sha512-ppj9ouYku+RX0ljtgZd+KMO5mkM2bCqg8H2PYAFWnLsHEIKIdRojqbJ2i3eVHrisuxy7nOFCmngTDdWtUCdXUQ==} - engines: {node: '>=6.9.0'} - - '@babel/runtime@7.29.7': - resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.29.7': - resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} - engines: {node: '>=6.9.0'} - - '@babel/template@8.0.0': - resolution: {integrity: sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/traverse@7.29.7': - resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@8.0.4': - resolution: {integrity: sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/traverse@8.0.6': - resolution: {integrity: sha512-ilYV+qLStGzSKLipJlETdvdtpK3rAuwfCmCoGKv15MU4EoeIuLkespSNoNLFGOPSciEHx9TLWtN5mv0fz5w5mQ==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/types@7.29.7': - resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} - engines: {node: '>=6.9.0'} - - '@babel/types@8.0.4': - resolution: {integrity: sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/types@8.0.6': - resolution: {integrity: sha512-c+xgSWboV2pdwXP67BUWDVRHi2BO5Q3KwxyFVs7taVTY+fsK47/L51ZXQoV9rozHJDNHvJ4v4WEsI/IlxV2l2A==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@cfworker/json-schema@4.1.1': - resolution: {integrity: sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==} - - '@cloudflare/kv-asset-handler@0.5.0': - resolution: {integrity: sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==} - engines: {node: '>=22.0.0'} - - '@cloudflare/unenv-preset@2.16.1': - resolution: {integrity: sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw==} - peerDependencies: - unenv: 2.0.0-rc.24 - workerd: '>1.20260305.0 <2.0.0-0' - peerDependenciesMeta: - workerd: - optional: true - - '@cloudflare/workerd-darwin-64@1.20260617.1': - resolution: {integrity: sha512-jWwmgEVVWbsHNrLSNXzwjJaH90VzRxq1cWkQFUidxyeUPnMxemeNE8I9qFAfrpzGgE11e9sKDcE3ettJW08swQ==} - engines: {node: '>=16'} - cpu: [x64] - os: [darwin] - - '@cloudflare/workerd-darwin-arm64@1.20260617.1': - resolution: {integrity: sha512-LHH7b565g9znfCUOkwbec6FG2rmRbsgCy6aJiU9KN662mNheWl5sw/iKleiFSiljPKQQP3HkjnC/NSkdgi/aSA==} - engines: {node: '>=16'} - cpu: [arm64] - os: [darwin] - - '@cloudflare/workerd-linux-64@1.20260617.1': - resolution: {integrity: sha512-FMnaAKXe4Cfd8TQurCVd9fs2XQVBFRCsP+Id/SRdUv89MlwYu9zXfoyx6BxM+brPTIUK38SHbo8iaxiwzLi9JQ==} - engines: {node: '>=16'} - cpu: [x64] - os: [linux] - - '@cloudflare/workerd-linux-arm64@1.20260617.1': - resolution: {integrity: sha512-MRoifFYcqbxxIIQy7PqO5tFY/qPFSnjXzakWl0sO93l+HLyG35jRAgOi6jfqa4kBxc7gKKtH861DcewjxUfkjA==} - engines: {node: '>=16'} - cpu: [arm64] - os: [linux] - - '@cloudflare/workerd-windows-64@1.20260617.1': - resolution: {integrity: sha512-rgBV9wQrv0OSKgCTTbhFUFY3sLGNANZ88aqaLvtmEn2gmbFVb1J4PDGochVUdB7NSEp4D/ghHva6/8SZmbONpw==} - engines: {node: '>=16'} - cpu: [x64] - os: [win32] - - '@cloudflare/workers-oauth-provider@0.2.4': - resolution: {integrity: sha512-xovAzPPj0QT+HeSTgRIMlxlHciaUOOrojwra9/sRoIWsHRFbN04cNvXnXQEFlpc0pDENE23OZS2Do8wswySR2g==} - - '@cloudflare/workers-types@4.20260620.1': - resolution: {integrity: sha512-WB81w9u1bAS7KcekpC7/nYhLpIXAEtgybso7XgGJV8CQKNkNPYcyjvICLdghOlDBi/9Ivk+f7NRckV2Bkq1bDg==} - - '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - - '@emnapi/core@2.0.0-alpha.3': - resolution: {integrity: sha512-AZypUeJ/yByuxyS7BlSNRDOMLMlROYtjYdIAuBmJssVz1UJDSeYxLrdizhXCFYhedC5bqd/ASy8EuNXbVVXp9g==} - - '@emnapi/runtime@1.11.3': - resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} - - '@emnapi/runtime@2.0.0-alpha.3': - resolution: {integrity: sha512-hFPAhMUjJD9BSyCANEISPOogeXC9Zo9ZQl7L6vKnaVsMkCtzznaW/naYypeyl0Gv5rYfWYsZbpixTMpjDJzQeA==} - - '@emnapi/wasi-threads@2.0.1': - resolution: {integrity: sha512-9DsSk+o5NBX0CCJT8s0EROGSGxjR/tKu6aBTaVyq+SjAEQH4XcdcRxPBRzsBLizTTJ49MJjF+jgu3qnO9GLQcQ==} - - '@esbuild/aix-ppc64@0.25.12': - resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/aix-ppc64@0.28.1': - resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.25.12': - resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.28.1': - resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.25.12': - resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.28.1': - resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.25.12': - resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.28.1': - resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.25.12': - resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-arm64@0.28.1': - resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.25.12': - resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/darwin-x64@0.28.1': - resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.25.12': - resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-arm64@0.28.1': - resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.25.12': - resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.28.1': - resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.25.12': - resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.28.1': - resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.25.12': - resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-arm@0.28.1': - resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.25.12': - resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.28.1': - resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.25.12': - resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-loong64@0.28.1': - resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.25.12': - resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.28.1': - resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.25.12': - resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-ppc64@0.28.1': - resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.25.12': - resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.28.1': - resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.25.12': - resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-s390x@0.28.1': - resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.25.12': - resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/linux-x64@0.28.1': - resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.25.12': - resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-arm64@0.28.1': - resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.25.12': - resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.28.1': - resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.25.12': - resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-arm64@0.28.1': - resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.25.12': - resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.28.1': - resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openharmony-arm64@0.25.12': - resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/openharmony-arm64@0.28.1': - resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/sunos-x64@0.25.12': - resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/sunos-x64@0.28.1': - resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.25.12': - resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.28.1': - resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.25.12': - resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-ia32@0.28.1': - resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.25.12': - resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@esbuild/win32-x64@0.28.1': - resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@floating-ui/core@1.8.0': - resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==} - - '@floating-ui/dom@1.8.0': - resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==} - - '@floating-ui/react-dom@2.1.9': - resolution: {integrity: sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/utils@0.2.12': - resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==} - - '@hono/node-server@1.19.14': - resolution: {integrity: sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==} - engines: {node: '>=18.14.1'} - peerDependencies: - hono: ^4 - - '@img/colour@1.1.0': - resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} - engines: {node: '>=18'} - - '@img/sharp-darwin-arm64@0.35.4': - resolution: {integrity: sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==} - engines: {node: '>=20.9.0'} - cpu: [arm64] - os: [darwin] - - '@img/sharp-darwin-x64@0.35.4': - resolution: {integrity: sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==} - engines: {node: '>=20.9.0'} - cpu: [x64] - os: [darwin] - - '@img/sharp-freebsd-wasm32@0.35.4': - resolution: {integrity: sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==} - engines: {node: '>=20.9.0'} - os: [freebsd] - - '@img/sharp-libvips-darwin-arm64@1.3.3': - resolution: {integrity: sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==} - cpu: [arm64] - os: [darwin] - - '@img/sharp-libvips-darwin-x64@1.3.3': - resolution: {integrity: sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==} - cpu: [x64] - os: [darwin] - - '@img/sharp-libvips-linux-arm64@1.3.3': - resolution: {integrity: sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@img/sharp-libvips-linux-arm@1.3.3': - resolution: {integrity: sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==} - cpu: [arm] - os: [linux] - libc: [glibc] - - '@img/sharp-libvips-linux-ppc64@1.3.3': - resolution: {integrity: sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@img/sharp-libvips-linux-riscv64@1.3.3': - resolution: {integrity: sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==} - cpu: [riscv64] - os: [linux] - libc: [glibc] - - '@img/sharp-libvips-linux-s390x@1.3.3': - resolution: {integrity: sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==} - cpu: [s390x] - os: [linux] - libc: [glibc] - - '@img/sharp-libvips-linux-x64@1.3.3': - resolution: {integrity: sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@img/sharp-libvips-linuxmusl-arm64@1.3.3': - resolution: {integrity: sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@img/sharp-libvips-linuxmusl-x64@1.3.3': - resolution: {integrity: sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==} - cpu: [x64] - os: [linux] - libc: [musl] - - '@img/sharp-linux-arm64@0.35.4': - resolution: {integrity: sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==} - engines: {node: '>=20.9.0'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@img/sharp-linux-arm@0.35.4': - resolution: {integrity: sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==} - engines: {node: '>=20.9.0'} - cpu: [arm] - os: [linux] - libc: [glibc] - - '@img/sharp-linux-ppc64@0.35.4': - resolution: {integrity: sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==} - engines: {node: '>=20.9.0'} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@img/sharp-linux-riscv64@0.35.4': - resolution: {integrity: sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==} - engines: {node: '>=20.9.0'} - cpu: [riscv64] - os: [linux] - libc: [glibc] - - '@img/sharp-linux-s390x@0.35.4': - resolution: {integrity: sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==} - engines: {node: '>=20.9.0'} - cpu: [s390x] - os: [linux] - libc: [glibc] - - '@img/sharp-linux-x64@0.35.4': - resolution: {integrity: sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==} - engines: {node: '>=20.9.0'} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@img/sharp-linuxmusl-arm64@0.35.4': - resolution: {integrity: sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==} - engines: {node: '>=20.9.0'} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@img/sharp-linuxmusl-x64@0.35.4': - resolution: {integrity: sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==} - engines: {node: '>=20.9.0'} - cpu: [x64] - os: [linux] - libc: [musl] - - '@img/sharp-wasm32@0.35.4': - resolution: {integrity: sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==} - engines: {node: '>=20.9.0'} - - '@img/sharp-webcontainers-wasm32@0.35.4': - resolution: {integrity: sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==} - engines: {node: '>=20.9.0'} - cpu: [wasm32] - - '@img/sharp-win32-arm64@0.35.4': - resolution: {integrity: sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==} - engines: {node: '>=20.9.0'} - cpu: [arm64] - os: [win32] - - '@img/sharp-win32-ia32@0.35.4': - resolution: {integrity: sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==} - engines: {node: ^20.9.0} - cpu: [ia32] - os: [win32] - - '@img/sharp-win32-x64@0.35.4': - resolution: {integrity: sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg==} - engines: {node: '>=20.9.0'} - cpu: [x64] - os: [win32] - - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - - '@jridgewell/gen-mapping@0.4.0-beta.0': - resolution: {integrity: sha512-JdGNkbE4GlNPYQhM0L95fBQr7ctLZJ276QXQLTad4t1oSdnnCI3fDq9DW3BqYAWv8Wc3+HS+4Gsii1oPMCfz1w==} - - '@jridgewell/remapping@2.3.5': - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - - '@jridgewell/sourcemap-codec@1.6.0': - resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} - - '@jridgewell/trace-mapping@0.3.31': - resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - - '@jridgewell/trace-mapping@0.3.9': - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - - '@modelcontextprotocol/client@2.0.0': - resolution: {integrity: sha512-8f1OghQ2rjzIOfqgUCP+8GiUWqRs89njoWLNqAe8kWmDePv3s1fZXseej+QXemssEuuOvLLmLO/kqM3IQHtISw==} - engines: {node: '>=20'} - - '@modelcontextprotocol/core@2.0.0': - resolution: {integrity: sha512-pJCEwGG7Lfr/+PQp9ZTwKXNeO5wzbfKL7H3MYpCorM4oFBoQrdjnBgEoqG+RjhsvS1FKrDbKux+M1HhlnGWqcA==} - engines: {node: '>=20'} - - '@modelcontextprotocol/ext-apps@1.7.5': - resolution: {integrity: sha512-TjPH2S2y5UEGKhmI6+XGFuqfqOV4ppe1x6DA3txnUaEWkgtA4G5vo14jGKFZmegdkZ1H4QMLyujLvoU1BEdnAg==} - engines: {node: '>=20'} - 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 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - - '@modelcontextprotocol/sdk@1.30.0': - resolution: {integrity: sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==} - engines: {node: '>=18'} - peerDependencies: - '@cfworker/json-schema': ^4.1.1 - zod: ^3.25 || ^4.0 - peerDependenciesMeta: - '@cfworker/json-schema': - optional: true - - '@modelcontextprotocol/server@2.0.0': - resolution: {integrity: sha512-YhHWdHfpFMQfd0prsEnxKeS3Qz3ytIGmsS0sth4KDjnacIT7hxk6hXHkJ9KysxlkvTM+WZAtQbbcUhdoP4Hvtw==} - engines: {node: '>=20'} - - '@napi-rs/wasm-runtime@1.2.1': - resolution: {integrity: sha512-KjZdi8Q1wh89gsVmghvbrMgWl6ZWmRmHV6wjB7/g4Zf0dyO+hH3neZUtuDNPO00qq5YE5RITVWvrIZKRaAmzGQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} - peerDependencies: - '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.3 - '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.3 - - '@opentelemetry/api@1.9.1': - resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} - engines: {node: '>=8.0.0'} - - '@oxc-project/types@0.142.0': - resolution: {integrity: sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ==} - - '@phosphor-icons/react@2.1.10': - resolution: {integrity: sha512-vt8Tvq8GLjheAZZYa+YG/pW7HDbov8El/MANW8pOAz4eGxrwhnbfrQZq0Cp4q8zBEu8NIhHdnr+r8thnfRSNYA==} - engines: {node: '>=10'} - peerDependencies: - react: '>= 16.8' - react-dom: '>= 16.8' - - '@poppinss/colors@4.1.6': - resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==} - - '@poppinss/dumper@0.6.5': - resolution: {integrity: sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==} - - '@poppinss/exception@1.2.3': - resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} - - '@posthog/core@1.35.3': - resolution: {integrity: sha512-EsGPbSLl39Jgo2KZ+kI9UAxFnh5nddaN5bNm2rXvUwF+vGmam9eN1EXeNbxhRU7ulEeIiGdm7XjoU7pzavkgIQ==} - - '@posthog/core@1.55.2': - resolution: {integrity: sha512-2mYxGbDmTLUs096VbcZqSWo0lrI48/BrX65r54NynxxFq409BOx9w73HxOAtOKZ1vblkdV6/GxQTe7KDcIQidg==} - - '@posthog/mcp@0.21.0': - resolution: {integrity: sha512-LhoQm2nUsXzGWgvxL4LHq1p2qC1B/FGoWxcRtMqQmirGQTCCfBNcNhlurX0J92X1iR7ZZuM7cZfkobdnQ43hvg==} - engines: {node: ^20.20.0 || >=22.22.0} - peerDependencies: - '@modelcontextprotocol/sdk': '>=1.26.0' - '@modelcontextprotocol/server': '>=2.0.0' - posthog-node: ^5.0.0 - peerDependenciesMeta: - '@modelcontextprotocol/sdk': - optional: true - '@modelcontextprotocol/server': - optional: true - - '@posthog/types@1.390.2': - resolution: {integrity: sha512-WcfKz2GNn2vfDX8vXmJYbKxegPxVWHuDQ/pHdAn0HoZDXDFnEp/+x3qBQA+fEvtbPjjtjgAt2wIgJMlM7asx7g==} - - '@posthog/types@1.412.4': - resolution: {integrity: sha512-Q7lV9O9TbLngjOYw1ucm3bS3tn48xb1B4ZQdDy8gv7yfKe99hCTeWYG4xZ36nJM80VxpTF9TriiJt5hngDOkBg==} - - '@radix-ui/primitive@1.1.7': - resolution: {integrity: sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==} - - '@radix-ui/react-arrow@1.1.15': - resolution: {integrity: sha512-v4zggRcjadnI+ClKDuijlQEW4tw3NoaeHc/PwpKnLoLLKNUG4InLegkstooLcRIUWCs+8L22dGURCVuFfOKfnA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-compose-refs@1.1.5': - resolution: {integrity: sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-context@1.2.2': - resolution: {integrity: sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-dismissable-layer@1.1.19': - resolution: {integrity: sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-focus-guards@1.1.6': - resolution: {integrity: sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-focus-scope@1.1.16': - resolution: {integrity: sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFIQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-id@1.1.4': - resolution: {integrity: sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-popover@1.1.23': - resolution: {integrity: sha512-mw58MrBlyHWFisTOYignD0vf/3gdcgAR+9of1s9G/38CbFiUwH1nCDkc0AUM9IrXFgN5Ue8n45j9WCgyM1sbiQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-popper@1.3.7': - resolution: {integrity: sha512-UsJrrd7w4wuKKTdvd/DNERVlwSlUcyXzjhyDwBk+3aPOsCjOY6ZSbxuw8E6lZTjjfP8Cpd0J8VVkrYUWyGYXyg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-portal@1.1.17': - resolution: {integrity: sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-presence@1.1.10': - resolution: {integrity: sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-primitive@2.1.10': - resolution: {integrity: sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-slot@1.3.3': - resolution: {integrity: sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-tooltip@1.2.16': - resolution: {integrity: sha512-6EamKFRRnlpdadndbZ6LMwycfwkwPte1B42hs6QA0gYhjaOKqW4PZ4pjaW9UrlDX5eVt/OjncE7BFTPL5nmZhg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-use-callback-ref@1.1.4': - resolution: {integrity: sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-controllable-state@1.2.6': - resolution: {integrity: sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-effect-event@0.0.5': - resolution: {integrity: sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-layout-effect@1.1.4': - resolution: {integrity: sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-rect@1.1.4': - resolution: {integrity: sha512-cSOCh6JlkmfjLyNcLiu2nB4v+nm+dkZ+Q5KHWk/soo4U7ZLiEQFKHK9/YmtBHjfCEaU43IBKQOc4/uJmCaiCTQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-size@1.1.4': - resolution: {integrity: sha512-D3anSY15EJoxrihpsXI6SMrmmonnQtR2ni7arO+Lfdg3O95b9hNXxONk8jA5C8ANdF/h5HMAxejgs8PWJ6rlhw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-visually-hidden@1.2.11': - resolution: {integrity: sha512-NFS86RYYZb4/exihaESBGOpMJFz8MGLAfu3mOBSGByVnVPC9JPASfYubxd/8KbkQK0sYAv8lVQDEQukDX/qXvQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/rect@1.1.3': - resolution: {integrity: sha512-JtyZR+mqgBibTo8xea3B6ZRmzZiM/YeVBtUkas6zMuXjAlfIFIW2FgqeM9eLyvEaYX66vr6DJMK+4U6LV0KhNw==} - - '@rolldown/binding-android-arm64@1.2.1': - resolution: {integrity: sha512-02hOeOSryYxVrOIphmLAsqnCJWxwlzFk+pEt/N/i6OgT3lShHO7xGCU5cpgchRDHboAEbSjzgGh+O/u1GswQmA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [android] - - '@rolldown/binding-darwin-arm64@1.2.1': - resolution: {integrity: sha512-fMsTOnN0OjFm3CyppWPitKnc8UlliVARUULW6cfU6AIqjdtgmSFWSk9vecHzZduv/yMWIHDlRhM1e8Iff9uAfA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [darwin] - - '@rolldown/binding-darwin-x64@1.2.1': - resolution: {integrity: sha512-1wjKdz/XLGKHaTNHjQveQ/B23TKx4ItAqm1JbyVuvNPc4Ze0Fb48s49TAd/2zcplPl8okE/UbTgmlVfwT7eFeQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [darwin] - - '@rolldown/binding-freebsd-x64@1.2.1': - resolution: {integrity: sha512-Fa0jHR07E7YBN4vOEsbVf2briYNsuOowfLJaXULZM0ldMlaCaj2LJgLMbMe4iacRyZmvR8efFhgR9wKuGclQUg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] - - '@rolldown/binding-linux-arm-gnueabihf@1.2.1': - resolution: {integrity: sha512-pzkgu1SSHGgRRyRZ4fbmSgmajbVt+epaLP99NDjFft69v/ypfTi6swBMiVdh2EkQ0OSnHE1lZDM7DRGkyAzUpA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - - '@rolldown/binding-linux-arm64-gnu@1.2.1': - resolution: {integrity: sha512-QI5SEDY8cbiYWHx0VO4vIc3UlS6a32vXHjU8Qy/17adEmZIPuByJg13UEvo9c/UCiUkdcVWY83C+b+JrwnNyUg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-arm64-musl@1.2.1': - resolution: {integrity: sha512-Sm41FyCeXqmYcERoYOCbGIL5hNfd8w9LQ7Y61Bev48HkcjaJqV/iiVOaiDxjVTRMS+QKrZmD8cfPt4uMVnvM+A==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@rolldown/binding-linux-ppc64-gnu@1.2.1': - resolution: {integrity: sha512-2x+WhXTGl9yJYPbltW/BSEPTVz9OIWQyER4N+gJEDWkkn904eRcBzELqh/Hf7K0w/ubGbKNMv0ZC+94QK/IFEg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-s390x-gnu@1.2.1': - resolution: {integrity: sha512-eEjmQpuRQayHPWWnywaWHkFT3ToPbP3RYy42VVd/B9aBGDA+Ol25EIWHxKQST3IiWJjikCWUF7KtbfqwZrzVwQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [s390x] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-x64-gnu@1.2.1': - resolution: {integrity: sha512-/Orga1fZYkLc/56jBICcHrKchl8Z2UKdDSr3LG9ToWO1lQ6a4Livk9Xz+9WN91zsz5QR3XQz2NNoSDEvP6qadw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-x64-musl@1.2.1': - resolution: {integrity: sha512-xxBJRL+0q0Kce7orznGWLuylHDY65vuARXZRpX+hPdv+DqK2c3NlCsVA98tlWzWNEE7yPqA/1NQ5nnCrj49Y5A==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [musl] - - '@rolldown/binding-openharmony-arm64@1.2.1': - resolution: {integrity: sha512-M6AdXIXw3s+/8XpKMzdGDEXGS1S7kwUsy+rcTIUIOx5Ge4nXKCtAFHFV9YKkXvGcC5WMoTjAteLzlsQROVI0Yw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [openharmony] - - '@rolldown/binding-wasm32-wasi@1.2.1': - resolution: {integrity: sha512-/TX0SoRGojHzSAHpfVBbavRVSazg5U3h3Y3VXfcc0cdugq6kxdqw8LPGFiPr+/7gE/60zRcsOY2Vi9b9eT0jww==} - engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} - - '@rolldown/binding-win32-arm64-msvc@1.2.1': - resolution: {integrity: sha512-EvRrivJieyHG+AO9lleZWgq+g0+S7oV2C51yuqlcyU/R9net+sI4Pj0F+lUoP2bEr6TWX3SqFaaS0SzfLxSzkw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] - - '@rolldown/binding-win32-x64-msvc@1.2.1': - resolution: {integrity: sha512-Z4eCmn5QJ/5+azF9knpLWKfVd9aidn0mAe9TpJgvBLId9Ax3t0+JVxBmT25Bv7NBbVW1TZyKjQjQReouMeH5UQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] - - '@rolldown/plugin-babel@0.2.3': - resolution: {integrity: sha512-+zEk16yGlz1F9STiRr6uG9hmIXb6nprjLczV/htGptYuLoCuxb+itZ03RKCEeOhBpDDd1NU7qF6x1VLMUp62bw==} - engines: {node: '>=22.12.0 || ^24.0.0'} - 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 - peerDependenciesMeta: - '@babel/plugin-transform-runtime': - optional: true - '@babel/runtime': - optional: true - vite: - optional: true - - '@rolldown/pluginutils@1.0.0-beta.27': - resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} - - '@rolldown/pluginutils@1.0.1': - resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} - - '@rollup/rollup-android-arm-eabi@4.62.2': - resolution: {integrity: sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.62.2': - resolution: {integrity: sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.62.2': - resolution: {integrity: sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.62.2': - resolution: {integrity: sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-freebsd-arm64@4.62.2': - resolution: {integrity: sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.62.2': - resolution: {integrity: sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-linux-arm-gnueabihf@4.62.2': - resolution: {integrity: sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==} - cpu: [arm] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-arm-musleabihf@4.62.2': - resolution: {integrity: sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==} - cpu: [arm] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-arm64-gnu@4.62.2': - resolution: {integrity: sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-arm64-musl@4.62.2': - resolution: {integrity: sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-loong64-gnu@4.62.2': - resolution: {integrity: sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==} - cpu: [loong64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-loong64-musl@4.62.2': - resolution: {integrity: sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==} - cpu: [loong64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-ppc64-gnu@4.62.2': - resolution: {integrity: sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-ppc64-musl@4.62.2': - resolution: {integrity: sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==} - cpu: [ppc64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-riscv64-gnu@4.62.2': - resolution: {integrity: sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==} - cpu: [riscv64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-riscv64-musl@4.62.2': - resolution: {integrity: sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==} - cpu: [riscv64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-s390x-gnu@4.62.2': - resolution: {integrity: sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==} - cpu: [s390x] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-x64-gnu@4.62.2': - resolution: {integrity: sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-x64-musl@4.62.2': - resolution: {integrity: sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==} - cpu: [x64] - os: [linux] - libc: [musl] - - '@rollup/rollup-openbsd-x64@4.62.2': - resolution: {integrity: sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==} - cpu: [x64] - os: [openbsd] - - '@rollup/rollup-openharmony-arm64@4.62.2': - resolution: {integrity: sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==} - cpu: [arm64] - os: [openharmony] - - '@rollup/rollup-win32-arm64-msvc@4.62.2': - resolution: {integrity: sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.62.2': - resolution: {integrity: sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-gnu@4.62.2': - resolution: {integrity: sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==} - cpu: [x64] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.62.2': - resolution: {integrity: sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==} - cpu: [x64] - os: [win32] - - '@sindresorhus/is@7.2.0': - resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} - engines: {node: '>=18'} - - '@speed-highlight/core@1.2.17': - resolution: {integrity: sha512-Z92FwKpCtfaW1V0jTU/fh3QzYEZN8wDwrzRIBoADCJfn4mJCNcJN/XegifX7BDrQ8/h9Xh/JnbyMchL0FqXrkg==} - - '@standard-schema/spec@1.1.0': - resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - - '@supermemory/memory-graph@0.2.3': - resolution: {integrity: sha512-tBioyg+GayOmyhUaInu5ngKURWss9O7iQsPWH5ECx1av0Poynz8hVdeT2VdBugynngfmCbG4bhLXTBul2jDeow==} - peerDependencies: - react: '>=18.0.0' - react-dom: '>=18.0.0' - - '@tailwindcss/node@4.3.3': - resolution: {integrity: sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==} - - '@tailwindcss/oxide-android-arm64@4.3.3': - resolution: {integrity: sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [android] - - '@tailwindcss/oxide-darwin-arm64@4.3.3': - resolution: {integrity: sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [darwin] - - '@tailwindcss/oxide-darwin-x64@4.3.3': - resolution: {integrity: sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==} - engines: {node: '>= 20'} - cpu: [x64] - os: [darwin] - - '@tailwindcss/oxide-freebsd-x64@4.3.3': - resolution: {integrity: sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==} - engines: {node: '>= 20'} - cpu: [x64] - os: [freebsd] - - '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': - resolution: {integrity: sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==} - engines: {node: '>= 20'} - cpu: [arm] - os: [linux] - - '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': - resolution: {integrity: sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@tailwindcss/oxide-linux-arm64-musl@4.3.3': - resolution: {integrity: sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@tailwindcss/oxide-linux-x64-gnu@4.3.3': - resolution: {integrity: sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@tailwindcss/oxide-linux-x64-musl@4.3.3': - resolution: {integrity: sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - libc: [musl] - - '@tailwindcss/oxide-wasm32-wasi@4.3.3': - resolution: {integrity: sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - bundledDependencies: - - '@napi-rs/wasm-runtime' - - '@emnapi/core' - - '@emnapi/runtime' - - '@tybys/wasm-util' - - '@emnapi/wasi-threads' - - tslib - - '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': - resolution: {integrity: sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [win32] - - '@tailwindcss/oxide-win32-x64-msvc@4.3.3': - resolution: {integrity: sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==} - engines: {node: '>= 20'} - cpu: [x64] - os: [win32] - - '@tailwindcss/oxide@4.3.3': - resolution: {integrity: sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==} - engines: {node: '>= 20'} - - '@tailwindcss/vite@4.3.3': - resolution: {integrity: sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==} - peerDependencies: - vite: ^5.2.0 || ^6 || ^7 || ^8 - - '@tybys/wasm-util@0.10.3': - resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} - - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - - '@types/babel__generator@7.27.0': - resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} - - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - - '@types/babel__traverse@7.28.0': - resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} - - '@types/chai@5.2.3': - resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} - - '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - - '@types/estree@1.0.9': - resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - - '@types/gensync@1.0.5': - resolution: {integrity: sha512-MbsRCT7mTikHwKZ0X+LVUTLRrZZRLipTuXEO9qOYO+zmjMVk81axyClMROf6uoPD9MRVu46bx8zoR0Ad9q3NAg==} - - '@types/jsesc@2.5.1': - resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} - - '@types/react-dom@19.2.3': - resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} - peerDependencies: - '@types/react': ^19.2.0 - - '@types/react@19.2.17': - resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} - - '@vercel/oidc@3.2.0': - resolution: {integrity: sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==} - engines: {node: '>= 20'} - - '@vitejs/plugin-react@4.7.0': - resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - - '@vitest/expect@3.2.6': - resolution: {integrity: sha512-1+7q9BtaKzEmO+fmNT3kYvoNn5Y71XWAx2Q5HRim4tTVRQVRv4uJFAQ5FbK0OPUeNP/WmVCpxYxoJdvuHVjzBQ==} - - '@vitest/mocker@3.2.6': - resolution: {integrity: sha512-EZOrpDbkKotFAP7wPAQV1UIyoGOk4oX7ynWhBhLB7v+meMHbQhU16oPpIYGTTe4oFlhpryGpgpcZP/sin3hYuw==} - peerDependencies: - msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - - '@vitest/pretty-format@3.2.6': - resolution: {integrity: sha512-lb7XXXzmm2h2ASzFnRvQpDo6onT1NmMJA3tkGTWiBFtRJ9lxGY3d3mm/Apt36gej2bkkOVLL/yTOtufDaFa/jA==} - - '@vitest/runner@3.2.6': - resolution: {integrity: sha512-HYcoSj1w5tcgUnzoF0HcyaAQjpA1gj9ftUJ7iSJSuipc02jW9gKkigwZbjFldAfYHA1fa8UZVRftdMY5msWM9Q==} - - '@vitest/snapshot@3.2.6': - resolution: {integrity: sha512-H+ZjNTWGpObenh0YnlBctAPnJSI20P81PL8BPzWpx54YXLLTm8hEsWawtcYLMrwvpK48hGxLLbCS+1KRXhsKhw==} - - '@vitest/spy@3.2.6': - resolution: {integrity: sha512-oq6BbH68WzcWmwtBrU9nqLeaXTR4XwJF7FSLkKEZo4i6eoXcrxjcwSuTvWBIRUTC6VC72nXYunzqgZA+IKdtxg==} - - '@vitest/utils@3.2.6': - resolution: {integrity: sha512-lI23nIs4bnT3T8NIoh+vFaz5s2/DdP0Jgt2jxwgWljvwn82cLJtyi/If+fjFyoLMGIOz0U/fKvWE0d4jsNQEfg==} - - accepts@2.0.0: - resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} - engines: {node: '>= 0.6'} - - agents@0.20.1: - resolution: {integrity: sha512-HQRYMeZpD3k8djYBH7atRPojZMee3NvmXkzsmMWXfdHZ94vMljmWqSsD1XZd70LovHyQrw6/R81AZZIsRiFM6Q==} - hasBin: true - 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 - peerDependenciesMeta: - '@ai-sdk/react': - optional: true - '@cloudflare/codemode': - optional: true - '@tanstack/ai': - optional: true - '@x402/core': - optional: true - '@x402/evm': - optional: true - ai: - optional: true - chat: - optional: true - just-bash: - optional: true - vite: - optional: true - - ai@6.0.208: - resolution: {integrity: sha512-STz+AaZqJ4ZjH7UkpXkbHx+bjgIDOsE8fIUoZjkZ2whoZcfVmG9K/TqEKouJZ03SuZuD7lagntlU3zBhAEkRpQ==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - ajv-formats@3.0.1: - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv@8.20.0: - resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} - - ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} - engines: {node: '>=12'} - - ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} - - aria-hidden@1.2.6: - resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} - engines: {node: '>=10'} - - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} - - baseline-browser-mapping@2.11.7: - resolution: {integrity: sha512-APw5YuIQAg6L9w4sHDI6j26DGFJI6RpYOhnkMPdC9lWbkKvsyPHzDsve1yd73lk21yz7Y09Kci8B2Pp9FonzWA==} - engines: {node: '>=6.0.0'} - hasBin: true - - blake3-wasm@2.1.5: - resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} - - body-parser@2.3.0: - resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} - engines: {node: '>=18'} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browserslist@4.28.7: - resolution: {integrity: sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - - caniuse-lite@1.0.30001806: - resolution: {integrity: sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==} - - chai@5.3.3: - resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} - engines: {node: '>=18'} - - check-error@2.1.3: - resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} - engines: {node: '>= 16'} - - class-variance-authority@0.7.1: - resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} - - cliui@9.0.1: - resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} - engines: {node: '>=20'} - - clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - - content-disposition@1.1.0: - resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} - engines: {node: '>=18'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - - content-type@2.0.0: - resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==} - engines: {node: '>=18'} - - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - - cookie-signature@1.2.2: - resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} - engines: {node: '>=6.6.0'} - - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} - - cookie@1.1.1: - resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} - engines: {node: '>=18'} - - core-js-pure@3.49.0: - resolution: {integrity: sha512-XM4RFka59xATyJv/cS3O3Kml72hQXUeGRuuTmMYFxwzc9/7C8OYTaIR/Ji+Yt8DXzsFLNhat15cE/JP15HrCgw==} - - cors@2.8.6: - resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} - engines: {node: '>= 0.10'} - - cron-schedule@6.0.0: - resolution: {integrity: sha512-BoZaseYGXOo5j5HUwTaegIog3JJbuH4BbrY9A1ArLjXpy+RWb3mV28F/9Gv1dDA7E2L8kngWva4NWisnLTyfgQ==} - engines: {node: '>=20'} - - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - - csstype@3.2.3: - resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - - d3-dispatch@3.0.1: - resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} - engines: {node: '>=12'} - - d3-force@3.0.0: - resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} - engines: {node: '>=12'} - - d3-quadtree@3.0.1: - resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} - engines: {node: '>=12'} - - d3-timer@3.0.1: - resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} - engines: {node: '>=12'} - - debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - - detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} - - detect-node-es@1.1.0: - resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - - electron-to-chromium@1.5.398: - resolution: {integrity: sha512-AsvhAxopJGh6museTDMIjn6JpDYOfgu4RLlygomt87MUwBUqTfd/1EiPtx10/LZE8xpTvkP2E9Gafq7lkLtodQ==} - - emoji-regex@10.6.0: - resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} - - empathic@2.1.0: - resolution: {integrity: sha512-AnfC1ATldl49/cvZdLPDjBfrRNwbDO05aibiOtzQu3qtlbJtomNLhF30HEtn/7iBz50dlMECqATo3fG0LrdEgw==} - engines: {node: '>=14'} - - encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} - - enhanced-resolve@5.24.4: - resolution: {integrity: sha512-GVoi+ICHocoOIU7qVVM48wOJziRsqrsyqlI0Ce0LdowRn6v3bcH2zUa9kp85ncx0nwIb9/HOCOLS3fdThDG/XQ==} - engines: {node: '>=10.13.0'} - - error-stack-parser-es@1.0.5: - resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - - es-object-atoms@1.1.2: - resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} - engines: {node: '>= 0.4'} - - esbuild@0.25.12: - resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} - engines: {node: '>=18'} - hasBin: true - - esbuild@0.28.1: - resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} - engines: {node: '>=18'} - hasBin: true - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - - event-target-polyfill@0.0.4: - resolution: {integrity: sha512-Gs6RLjzlLRdT8X9ZipJdIZI/Y6/HhRLyq9RdDlCsnpxr/+Nn6bU2EFGuC94GjxqhM+Nmij2Vcq98yoHrU8uNFQ==} - - eventsource-parser@3.1.0: - resolution: {integrity: sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==} - engines: {node: '>=18.0.0'} - - eventsource@3.0.7: - resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} - engines: {node: '>=18.0.0'} - - expect-type@1.3.0: - resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} - engines: {node: '>=12.0.0'} - - express-rate-limit@8.5.2: - resolution: {integrity: sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==} - engines: {node: '>= 16'} - peerDependencies: - express: '>= 4.11' - - express@5.2.1: - resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} - engines: {node: '>= 18'} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-uri@3.1.7: - resolution: {integrity: sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg==} - - fdir@6.5.0: - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - finalhandler@2.1.1: - resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} - engines: {node: '>= 18.0.0'} - - flru@1.0.2: - resolution: {integrity: sha512-kWyh8ADvHBFz6ua5xYOPnUroZTT/bwWfrCeL0Wj1dzG4/YOmOcfJ99W8dOVyyynJN35rZ9aCOtHChqQovV7yog==} - engines: {node: '>=6'} - - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - fresh@2.0.0: - resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} - engines: {node: '>= 0.8'} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-east-asian-width@1.6.0: - resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} - engines: {node: '>=18'} - - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-nonce@1.0.1: - resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} - engines: {node: '>=6'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - hasown@2.0.4: - resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} - engines: {node: '>= 0.4'} - - hono@4.12.26: - resolution: {integrity: sha512-uyZtpnYxM9CmQ7QsQknM4zN8EftNqhON1qYeIKM0Se67CCEe2c44xyGURwB0axX2fBDu1dqHrHAc1hmNT8ITkw==} - engines: {node: '>=16.9.0'} - - http-errors@2.0.1: - resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} - engines: {node: '>= 0.8'} - - iconv-lite@0.7.2: - resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} - engines: {node: '>=0.10.0'} - - import-meta-resolve@4.2.0: - resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - ip-address@10.3.1: - resolution: {integrity: sha512-1e9d3kb97NHJTIJDZW9rKqW2h6+dFa50Dy0fpPSMQp2ADje5gvKsXmdiK6dwY5t76TaTt5+P5N1Y/LoToIxP6g==} - engines: {node: '>= 12'} - - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-promise@4.0.0: - resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - jiti@2.7.0: - resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} - hasBin: true - - jose@6.2.3: - resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} - - js-base64@3.7.8: - resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} - - js-tokens@10.0.0: - resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - json-schema-typed@8.0.2: - resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} - - json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - - lightningcss-android-arm64@1.32.0: - resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [android] - - lightningcss-darwin-arm64@1.32.0: - resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [darwin] - - lightningcss-darwin-x64@1.32.0: - resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [darwin] - - lightningcss-freebsd-x64@1.32.0: - resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [freebsd] - - lightningcss-linux-arm-gnueabihf@1.32.0: - resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} - engines: {node: '>= 12.0.0'} - cpu: [arm] - os: [linux] - - lightningcss-linux-arm64-gnu@1.32.0: - resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - lightningcss-linux-arm64-musl@1.32.0: - resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - libc: [musl] - - lightningcss-linux-x64-gnu@1.32.0: - resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - libc: [glibc] - - lightningcss-linux-x64-musl@1.32.0: - resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - libc: [musl] - - lightningcss-win32-arm64-msvc@1.32.0: - resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [win32] - - lightningcss-win32-x64-msvc@1.32.0: - resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [win32] - - lightningcss@1.32.0: - resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} - engines: {node: '>= 12.0.0'} - - loupe@3.2.1: - resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - - magic-string@0.30.21: - resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - media-typer@1.1.0: - resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} - engines: {node: '>= 0.8'} - - merge-descriptors@2.0.0: - resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} - engines: {node: '>=18'} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-db@1.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mime-types@3.0.2: - resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} - engines: {node: '>=18'} - - mimetext@3.0.28: - resolution: {integrity: sha512-eQXpbNrtxLCjUtiVbR/qR09dbPgZ2o+KR1uA7QKqGhbn8QV7HIL16mXXsobBL4/8TqoYh1us31kfz+dNfCev9g==} - - miniflare@4.20260617.1: - resolution: {integrity: sha512-Go3/gzStm99QHptsSgU+q1S+xDfLoRgwjJNY80kaTVi0ENhTyqKq+sc4xZiWBSbM7uUcJwmzm8+QFKtcYLJ9nw==} - engines: {node: '>=22.0.0'} - hasBin: true - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.18: - resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - nanoid@5.1.16: - resolution: {integrity: sha512-kVrnsrJqMR8+oLJnGEmSWw9BivK5mt7H3FZatVRjrc5wGqFYuBxX1yG7+A7Gi5AefkX6t/oCkizcQgpu0cY1dQ==} - engines: {node: ^18 || >=20} - hasBin: true - - negotiator@1.0.0: - resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} - engines: {node: '>= 0.6'} - - node-releases@2.0.51: - resolution: {integrity: sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==} - engines: {node: '>=18'} - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - - obug@2.1.4: - resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} - engines: {node: '>=12.20.0'} - - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - - partyserver@0.5.9: - resolution: {integrity: sha512-0T1OGQD9Ggllrlp8Bt8XLOglEEktH4bui28Z1dbSGEX/iFmZnEWR148Qmvc1Od3rl64OAOfVtr2sG4XOMI9Y6Q==} - peerDependencies: - '@cloudflare/workers-types': ^4.20260424.1 || ^5.20260703.1 - - partysocket@1.3.0: - resolution: {integrity: sha512-1zToNyolZFK/7nuAw/K2bZrNzFqaZyRoCEkS+9vG6WSC5ikrN6qWRe96q6ImU51uptz2r+dAwSkwhJVdQi4LiA==} - peerDependencies: - react: '>=17' - peerDependenciesMeta: - react: - optional: true - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-to-regexp@6.3.0: - resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - - path-to-regexp@8.4.2: - resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} - - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - - pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} - - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - - picomatch@2.3.2: - resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} - engines: {node: '>=8.6'} - - picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} - engines: {node: '>=12'} - - pkce-challenge@5.0.1: - resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} - engines: {node: '>=16.20.0'} - - postcss@8.5.18: - resolution: {integrity: sha512-xdB1oSLHbz1vRWgCDalrCqEFTWzFlhqFC5tIHLMOSUIjhm3XXQ1qrFy8S/ESr1JYRRXqM3c1QFiMZUJdUTqyMQ==} - engines: {node: ^10 || ^12 || >=14} - - posthog-node@5.38.2: - resolution: {integrity: sha512-eiKpU+vX4hVuHbO/EosvPHsmh2AVIdoVmWss/uUOs1t4b0ViCblw2o8OIFqHxKj3mYRnSOBlX0Dw3wBvcCaYpA==} - engines: {node: ^20.20.0 || >=22.22.0} - peerDependencies: - rxjs: ^7.0.0 - peerDependenciesMeta: - rxjs: - optional: true - - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - - qs@6.15.2: - resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==} - engines: {node: '>=0.6'} - - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - raw-body@3.0.2: - resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} - engines: {node: '>= 0.10'} - - react-dom@19.2.8: - resolution: {integrity: sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==} - peerDependencies: - react: ^19.2.8 - - react-refresh@0.17.0: - resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} - engines: {node: '>=0.10.0'} - - react-remove-scroll-bar@2.3.8: - resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - react-remove-scroll@2.7.2: - resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - react-style-singleton@2.2.3: - resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - react@19.2.8: - resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==} - engines: {node: '>=0.10.0'} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - rolldown@1.2.1: - resolution: {integrity: sha512-4FKJhg8d3OiyQOA6Q1Q0hoFFpW9/OoX+VsHzpECsdsIZoOArrAK90gl59YK/Z+gnDel45bgJZK03ozH/9bCqEw==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - - rollup@4.62.2: - resolution: {integrity: sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - router@2.2.0: - resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} - engines: {node: '>= 18'} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - scheduler@0.27.0: - resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.8.5: - resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} - engines: {node: '>=10'} - hasBin: true - - send@1.2.1: - resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} - engines: {node: '>= 18'} - - serve-static@2.2.1: - resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} - engines: {node: '>= 18'} - - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - - sharp@0.35.4: - resolution: {integrity: sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==} - engines: {node: '>=20.9.0'} - peerDependencies: - '@types/node': '*' - peerDependenciesMeta: - '@types/node': - optional: true - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - side-channel-list@1.0.1: - resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.1: - resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} - engines: {node: '>= 0.4'} - - siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - - stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - - statuses@2.0.2: - resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} - engines: {node: '>= 0.8'} - - std-env@3.10.0: - resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} - - string-width@7.2.0: - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} - engines: {node: '>=18'} - - strip-ansi@7.2.0: - resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} - engines: {node: '>=12'} - - strip-literal@3.1.0: - resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} - - supermemory@4.24.12: - resolution: {integrity: sha512-xAFextuqk4JuoW33jJaFGqT1oMppN2IgfWUrV18Fv3qAAZ6M1SR1tb+7EBq8vrEQIx4iY2MQh5p+qnfL6lI8Yw==} - hasBin: true - - supports-color@10.2.2: - resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} - engines: {node: '>=18'} - - tailwind-merge@3.6.0: - resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==} - - tailwindcss@4.3.3: - resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==} - - tapable@2.3.3: - resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} - engines: {node: '>=6'} - - tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - - tinyglobby@0.2.17: - resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} - engines: {node: '>=12.0.0'} - - tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} - - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} - - tinyspy@4.0.4: - resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} - engines: {node: '>=14.0.0'} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-is@2.1.0: - resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} - engines: {node: '>= 18'} - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - - undici@7.29.1: - resolution: {integrity: sha512-RYONW2MeafgYlkVOKYKkA/Ag7BmXqgIWCa8t1m0JcxrQg9pI9lEqRhAOruOBCbAohOa/gkCF+iPi9hrgvTzu6Q==} - engines: {node: '>=20.18.1'} - - unenv@2.0.0-rc.24: - resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} - - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - - update-browserslist-db@1.2.3: - resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - use-callback-ref@1.3.3: - resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - use-sidecar@1.1.3: - resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - - verkit@0.3.2: - resolution: {integrity: sha512-zj/ob3UsvJGN0whEAKFp53REA5X66hvffVqoCtVQAakJKnKlH+/PcOfMoFwIG/o4rElqLv/ycAFlx8ZlXUorCg==} - engines: {node: '>=18.12.0'} - - vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - - vite-plugin-singlefile@2.3.3: - resolution: {integrity: sha512-XVnGH0QzbOa8fxRSsHdCarVN1BSBXNi7uLMQYlrGRN5apdHkk62XQWRJhVever0lnfuyBkwn+kvVChdm/OoOUg==} - engines: {node: '>18.0.0'} - peerDependencies: - rollup: ^4.59.0 - vite: ^5.4.21 || ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - rollup: - optional: true - - vite@6.4.3: - resolution: {integrity: sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - 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 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - - vitest@3.2.6: - resolution: {integrity: sha512-xejya+bT/j/+R/AGa1XOfRxLmNUlLtlwjRsFUILF+xHfzElmGcmFydy2gqqIrd62ptIEfwVMofd19uNWD9L7Nw==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.6 - '@vitest/ui': 3.2.6 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/debug': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} - hasBin: true - - workerd@1.20260617.1: - resolution: {integrity: sha512-Re5pl6pdowt3ZmWUzGlOuB7jbRIIPetgKalmo4cYmucQnVhpo7/3e4MfpekbhLi2EhZZz5EY9NWRu8zFzuEZew==} - engines: {node: '>=16'} - hasBin: true - - wrangler@4.103.0: - resolution: {integrity: sha512-3Lv1P5t2xcSEkSTKtG+Lz+3JFryuU7YPLkaCUj7gNe+CJsjZJLtUwqsh1x595QBxkIbCE0GAvDx2DCJUU4+oqw==} - engines: {node: '>=22.0.0'} - hasBin: true - peerDependencies: - '@cloudflare/workers-types': ^4.20260617.1 - peerDependenciesMeta: - '@cloudflare/workers-types': - optional: true - - wrap-ansi@9.0.2: - resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} - engines: {node: '>=18'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@8.21.0: - resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - - yaml@2.9.0: - resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} - engines: {node: '>= 14.6'} - hasBin: true - - yargs-parser@22.0.0: - resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=23} - - yargs@18.0.0: - resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=23} - - youch-core@0.3.3: - resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} - - youch@4.1.0-beta.10: - resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} - - zod-to-json-schema@3.25.2: - resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} - peerDependencies: - zod: ^3.25.28 || ^4 - - zod@4.4.3: - resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} - -snapshots: - - '@ai-sdk/gateway@3.0.133(zod@4.4.3)': - dependencies: - '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.30(zod@4.4.3) - '@vercel/oidc': 3.2.0 - zod: 4.4.3 - optional: true - - '@ai-sdk/provider-utils@4.0.30(zod@4.4.3)': - dependencies: - '@ai-sdk/provider': 3.0.10 - '@standard-schema/spec': 1.1.0 - eventsource-parser: 3.1.0 - zod: 4.4.3 - optional: true - - '@ai-sdk/provider@3.0.10': - dependencies: - json-schema: 0.4.0 - optional: true - - '@babel/code-frame@7.29.7': - dependencies: - '@babel/helper-validator-identifier': 7.29.7 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/code-frame@8.0.0': - dependencies: - '@babel/helper-validator-identifier': 8.0.4 - js-tokens: 10.0.0 - - '@babel/code-frame@8.0.6': - dependencies: - '@babel/helper-validator-identifier': 8.0.6 - js-tokens: 10.0.0 - - '@babel/compat-data@7.29.7': {} - - '@babel/compat-data@8.0.5': {} - - '@babel/core@7.29.7(supports-color@10.2.2)': - dependencies: - '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.7 - '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) - '@babel/helpers': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@10.2.2) - '@babel/types': 7.29.7 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.4.3(supports-color@10.2.2) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/core@8.0.6': - dependencies: - '@babel/code-frame': 8.0.6 - '@babel/generator': 8.0.6 - '@babel/helper-compilation-targets': 8.0.6 - '@babel/helpers': 8.0.5 - '@babel/parser': 8.0.6 - '@babel/template': 8.0.0 - '@babel/traverse': 8.0.6 - '@babel/types': 8.0.6 - '@types/gensync': 1.0.5 - convert-source-map: 2.0.0 - empathic: 2.1.0 - gensync: 1.0.0-beta.2 - import-meta-resolve: 4.2.0 - json5: 2.2.3 - obug: 2.1.4 - verkit: 0.3.2 - - '@babel/generator@7.29.7': - dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - - '@babel/generator@8.0.0': - dependencies: - '@babel/parser': 8.0.4 - '@babel/types': 8.0.4 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - '@types/jsesc': 2.5.1 - jsesc: 3.1.0 - - '@babel/generator@8.0.6': - dependencies: - '@babel/parser': 8.0.6 - '@babel/types': 8.0.6 - '@jridgewell/gen-mapping': 0.4.0-beta.0 - '@jridgewell/trace-mapping': 0.3.31 - '@types/jsesc': 2.5.1 - jsesc: 3.1.0 - - '@babel/helper-annotate-as-pure@8.0.0': - dependencies: - '@babel/types': 8.0.4 - - '@babel/helper-compilation-targets@7.29.7': - dependencies: - '@babel/compat-data': 7.29.7 - '@babel/helper-validator-option': 7.29.7 - browserslist: 4.28.7 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-compilation-targets@8.0.6': - dependencies: - '@babel/compat-data': 8.0.5 - '@babel/helper-validator-option': 8.0.0 - browserslist: 4.28.7 - flru: 1.0.2 - verkit: 0.3.2 - - '@babel/helper-create-class-features-plugin@8.0.1(@babel/core@8.0.6)': - dependencies: - '@babel/core': 8.0.6 - '@babel/helper-annotate-as-pure': 8.0.0 - '@babel/helper-member-expression-to-functions': 8.0.0 - '@babel/helper-optimise-call-expression': 8.0.0 - '@babel/helper-replace-supers': 8.0.1(@babel/core@8.0.6) - '@babel/helper-skip-transparent-expression-wrappers': 8.0.0 - '@babel/traverse': 8.0.4 - semver: 7.8.5 - - '@babel/helper-globals@7.29.7': {} - - '@babel/helper-globals@8.0.0': {} - - '@babel/helper-globals@8.0.6': {} - - '@babel/helper-member-expression-to-functions@8.0.0': - dependencies: - '@babel/traverse': 8.0.4 - '@babel/types': 8.0.4 - - '@babel/helper-module-imports@7.29.7(supports-color@10.2.2)': - dependencies: - '@babel/traverse': 7.29.7(supports-color@10.2.2) - '@babel/types': 7.29.7 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': - dependencies: - '@babel/core': 7.29.7(supports-color@10.2.2) - '@babel/helper-module-imports': 7.29.7(supports-color@10.2.2) - '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@10.2.2) - transitivePeerDependencies: - - supports-color - - '@babel/helper-optimise-call-expression@8.0.0': - dependencies: - '@babel/types': 8.0.4 - - '@babel/helper-plugin-utils@7.29.7': {} - - '@babel/helper-plugin-utils@8.0.1(@babel/core@8.0.6)': - dependencies: - '@babel/core': 8.0.6 - - '@babel/helper-replace-supers@8.0.1(@babel/core@8.0.6)': - dependencies: - '@babel/core': 8.0.6 - '@babel/helper-member-expression-to-functions': 8.0.0 - '@babel/helper-optimise-call-expression': 8.0.0 - '@babel/traverse': 8.0.4 - - '@babel/helper-skip-transparent-expression-wrappers@8.0.0': - dependencies: - '@babel/traverse': 8.0.4 - '@babel/types': 8.0.4 - - '@babel/helper-string-parser@7.29.7': {} - - '@babel/helper-string-parser@8.0.0': {} - - '@babel/helper-string-parser@8.0.6': {} - - '@babel/helper-validator-identifier@7.29.7': {} - - '@babel/helper-validator-identifier@8.0.4': {} - - '@babel/helper-validator-identifier@8.0.6': {} - - '@babel/helper-validator-option@7.29.7': {} - - '@babel/helper-validator-option@8.0.0': {} - - '@babel/helpers@7.29.7': - dependencies: - '@babel/template': 7.29.7 - '@babel/types': 7.29.7 - - '@babel/helpers@8.0.5': - dependencies: - '@babel/template': 8.0.0 - '@babel/types': 8.0.6 - - '@babel/parser@7.29.7': - dependencies: - '@babel/types': 7.29.7 - - '@babel/parser@8.0.4': - dependencies: - '@babel/types': 8.0.4 - - '@babel/parser@8.0.6': - dependencies: - '@babel/types': 8.0.6 - - '@babel/plugin-proposal-decorators@8.0.2(@babel/core@8.0.6)': - dependencies: - '@babel/core': 8.0.6 - '@babel/helper-create-class-features-plugin': 8.0.1(@babel/core@8.0.6) - '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.6) - '@babel/plugin-syntax-decorators': 8.0.1(@babel/core@8.0.6) - - '@babel/plugin-syntax-decorators@8.0.1(@babel/core@8.0.6)': - dependencies: - '@babel/core': 8.0.6 - '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.6) - - '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))': - dependencies: - '@babel/core': 7.29.7(supports-color@10.2.2) - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))': - dependencies: - '@babel/core': 7.29.7(supports-color@10.2.2) - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/runtime-corejs3@7.29.7': - dependencies: - core-js-pure: 3.49.0 - - '@babel/runtime@7.29.7': {} - - '@babel/template@7.29.7': - dependencies: - '@babel/code-frame': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 - - '@babel/template@8.0.0': - dependencies: - '@babel/code-frame': 8.0.6 - '@babel/parser': 8.0.6 - '@babel/types': 8.0.6 - - '@babel/traverse@7.29.7(supports-color@10.2.2)': - dependencies: - '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.7 - '@babel/helper-globals': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/template': 7.29.7 - '@babel/types': 7.29.7 - debug: 4.4.3(supports-color@10.2.2) - transitivePeerDependencies: - - supports-color - - '@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.4 - - '@babel/traverse@8.0.6': - dependencies: - '@babel/code-frame': 8.0.6 - '@babel/generator': 8.0.6 - '@babel/helper-globals': 8.0.6 - '@babel/parser': 8.0.6 - '@babel/template': 8.0.0 - '@babel/types': 8.0.6 - obug: 2.1.4 - - '@babel/types@7.29.7': - dependencies: - '@babel/helper-string-parser': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 - - '@babel/types@8.0.4': - dependencies: - '@babel/helper-string-parser': 8.0.0 - '@babel/helper-validator-identifier': 8.0.4 - - '@babel/types@8.0.6': - dependencies: - '@babel/helper-string-parser': 8.0.6 - '@babel/helper-validator-identifier': 8.0.6 - - '@cfworker/json-schema@4.1.1': {} - - '@cloudflare/kv-asset-handler@0.5.0': {} - - '@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260617.1)': - dependencies: - unenv: 2.0.0-rc.24 - optionalDependencies: - workerd: 1.20260617.1 - - '@cloudflare/workerd-darwin-64@1.20260617.1': - optional: true - - '@cloudflare/workerd-darwin-arm64@1.20260617.1': - optional: true - - '@cloudflare/workerd-linux-64@1.20260617.1': - optional: true - - '@cloudflare/workerd-linux-arm64@1.20260617.1': - optional: true - - '@cloudflare/workerd-windows-64@1.20260617.1': - optional: true - - '@cloudflare/workers-oauth-provider@0.2.4': {} - - '@cloudflare/workers-types@4.20260620.1': {} - - '@cspotcode/source-map-support@0.8.1': - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - - '@emnapi/core@2.0.0-alpha.3': - dependencies: - '@emnapi/wasi-threads': 2.0.1 - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.11.3': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@2.0.0-alpha.3': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/wasi-threads@2.0.1': - dependencies: - tslib: 2.8.1 - optional: true - - '@esbuild/aix-ppc64@0.25.12': - optional: true - - '@esbuild/aix-ppc64@0.28.1': - optional: true - - '@esbuild/android-arm64@0.25.12': - optional: true - - '@esbuild/android-arm64@0.28.1': - optional: true - - '@esbuild/android-arm@0.25.12': - optional: true - - '@esbuild/android-arm@0.28.1': - optional: true - - '@esbuild/android-x64@0.25.12': - optional: true - - '@esbuild/android-x64@0.28.1': - optional: true - - '@esbuild/darwin-arm64@0.25.12': - optional: true - - '@esbuild/darwin-arm64@0.28.1': - optional: true - - '@esbuild/darwin-x64@0.25.12': - optional: true - - '@esbuild/darwin-x64@0.28.1': - optional: true - - '@esbuild/freebsd-arm64@0.25.12': - optional: true - - '@esbuild/freebsd-arm64@0.28.1': - optional: true - - '@esbuild/freebsd-x64@0.25.12': - optional: true - - '@esbuild/freebsd-x64@0.28.1': - optional: true - - '@esbuild/linux-arm64@0.25.12': - optional: true - - '@esbuild/linux-arm64@0.28.1': - optional: true - - '@esbuild/linux-arm@0.25.12': - optional: true - - '@esbuild/linux-arm@0.28.1': - optional: true - - '@esbuild/linux-ia32@0.25.12': - optional: true - - '@esbuild/linux-ia32@0.28.1': - optional: true - - '@esbuild/linux-loong64@0.25.12': - optional: true - - '@esbuild/linux-loong64@0.28.1': - optional: true - - '@esbuild/linux-mips64el@0.25.12': - optional: true - - '@esbuild/linux-mips64el@0.28.1': - optional: true - - '@esbuild/linux-ppc64@0.25.12': - optional: true - - '@esbuild/linux-ppc64@0.28.1': - optional: true - - '@esbuild/linux-riscv64@0.25.12': - optional: true - - '@esbuild/linux-riscv64@0.28.1': - optional: true - - '@esbuild/linux-s390x@0.25.12': - optional: true - - '@esbuild/linux-s390x@0.28.1': - optional: true - - '@esbuild/linux-x64@0.25.12': - optional: true - - '@esbuild/linux-x64@0.28.1': - optional: true - - '@esbuild/netbsd-arm64@0.25.12': - optional: true - - '@esbuild/netbsd-arm64@0.28.1': - optional: true - - '@esbuild/netbsd-x64@0.25.12': - optional: true - - '@esbuild/netbsd-x64@0.28.1': - optional: true - - '@esbuild/openbsd-arm64@0.25.12': - optional: true - - '@esbuild/openbsd-arm64@0.28.1': - optional: true - - '@esbuild/openbsd-x64@0.25.12': - optional: true - - '@esbuild/openbsd-x64@0.28.1': - optional: true - - '@esbuild/openharmony-arm64@0.25.12': - optional: true - - '@esbuild/openharmony-arm64@0.28.1': - optional: true - - '@esbuild/sunos-x64@0.25.12': - optional: true - - '@esbuild/sunos-x64@0.28.1': - optional: true - - '@esbuild/win32-arm64@0.25.12': - optional: true - - '@esbuild/win32-arm64@0.28.1': - optional: true - - '@esbuild/win32-ia32@0.25.12': - optional: true - - '@esbuild/win32-ia32@0.28.1': - optional: true - - '@esbuild/win32-x64@0.25.12': - optional: true - - '@esbuild/win32-x64@0.28.1': - optional: true - - '@floating-ui/core@1.8.0': - dependencies: - '@floating-ui/utils': 0.2.12 - - '@floating-ui/dom@1.8.0': - dependencies: - '@floating-ui/core': 1.8.0 - '@floating-ui/utils': 0.2.12 - - '@floating-ui/react-dom@2.1.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@floating-ui/dom': 1.8.0 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@floating-ui/utils@0.2.12': {} - - '@hono/node-server@1.19.14(hono@4.12.26)': - dependencies: - hono: 4.12.26 - - '@img/colour@1.1.0': {} - - '@img/sharp-darwin-arm64@0.35.4': - optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.3.3 - optional: true - - '@img/sharp-darwin-x64@0.35.4': - optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.3.3 - optional: true - - '@img/sharp-freebsd-wasm32@0.35.4': - dependencies: - '@img/sharp-wasm32': 0.35.4 - optional: true - - '@img/sharp-libvips-darwin-arm64@1.3.3': - optional: true - - '@img/sharp-libvips-darwin-x64@1.3.3': - optional: true - - '@img/sharp-libvips-linux-arm64@1.3.3': - optional: true - - '@img/sharp-libvips-linux-arm@1.3.3': - optional: true - - '@img/sharp-libvips-linux-ppc64@1.3.3': - optional: true - - '@img/sharp-libvips-linux-riscv64@1.3.3': - optional: true - - '@img/sharp-libvips-linux-s390x@1.3.3': - optional: true - - '@img/sharp-libvips-linux-x64@1.3.3': - optional: true - - '@img/sharp-libvips-linuxmusl-arm64@1.3.3': - optional: true - - '@img/sharp-libvips-linuxmusl-x64@1.3.3': - optional: true - - '@img/sharp-linux-arm64@0.35.4': - optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.3.3 - optional: true - - '@img/sharp-linux-arm@0.35.4': - optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.3.3 - optional: true - - '@img/sharp-linux-ppc64@0.35.4': - optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.3.3 - optional: true - - '@img/sharp-linux-riscv64@0.35.4': - optionalDependencies: - '@img/sharp-libvips-linux-riscv64': 1.3.3 - optional: true - - '@img/sharp-linux-s390x@0.35.4': - optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.3.3 - optional: true - - '@img/sharp-linux-x64@0.35.4': - optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.3.3 - optional: true - - '@img/sharp-linuxmusl-arm64@0.35.4': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.3.3 - optional: true - - '@img/sharp-linuxmusl-x64@0.35.4': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.3.3 - optional: true - - '@img/sharp-wasm32@0.35.4': - dependencies: - '@emnapi/runtime': 1.11.3 - optional: true - - '@img/sharp-webcontainers-wasm32@0.35.4': - dependencies: - '@img/sharp-wasm32': 0.35.4 - optional: true - - '@img/sharp-win32-arm64@0.35.4': - optional: true - - '@img/sharp-win32-ia32@0.35.4': - optional: true - - '@img/sharp-win32-x64@0.35.4': - optional: true - - '@jridgewell/gen-mapping@0.3.13': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/gen-mapping@0.4.0-beta.0': - dependencies: - '@jridgewell/sourcemap-codec': 1.6.0 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/remapping@2.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/sourcemap-codec@1.5.5': {} - - '@jridgewell/sourcemap-codec@1.6.0': {} - - '@jridgewell/trace-mapping@0.3.31': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.6.0 - - '@jridgewell/trace-mapping@0.3.9': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@modelcontextprotocol/client@2.0.0': - dependencies: - '@modelcontextprotocol/core': 2.0.0 - cross-spawn: 7.0.6 - eventsource: 3.0.7 - eventsource-parser: 3.1.0 - jose: 6.2.3 - pkce-challenge: 5.0.1 - zod: 4.4.3 - - '@modelcontextprotocol/core@2.0.0': - dependencies: - zod: 4.4.3 - - '@modelcontextprotocol/ext-apps@1.7.5(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(supports-color@10.2.2)(zod@4.4.3))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(zod@4.4.3)': - dependencies: - '@modelcontextprotocol/sdk': 1.30.0(@cfworker/json-schema@4.1.1)(supports-color@10.2.2)(zod@4.4.3) - '@standard-schema/spec': 1.1.0 - zod: 4.4.3 - optionalDependencies: - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(supports-color@10.2.2)(zod@4.4.3)': - dependencies: - '@hono/node-server': 1.19.14(hono@4.12.26) - ajv: 8.20.0 - ajv-formats: 3.0.1(ajv@8.20.0) - content-type: 1.0.5 - cors: 2.8.6 - cross-spawn: 7.0.6 - eventsource: 3.0.7 - eventsource-parser: 3.1.0 - express: 5.2.1(supports-color@10.2.2) - express-rate-limit: 8.5.2(express@5.2.1(supports-color@10.2.2)) - hono: 4.12.26 - jose: 6.2.3 - json-schema-typed: 8.0.2 - pkce-challenge: 5.0.1 - raw-body: 3.0.2 - zod: 4.4.3 - zod-to-json-schema: 3.25.2(zod@4.4.3) - optionalDependencies: - '@cfworker/json-schema': 4.1.1 - transitivePeerDependencies: - - supports-color - - '@modelcontextprotocol/server@2.0.0': - dependencies: - '@modelcontextprotocol/core': 2.0.0 - zod: 4.4.3 - - '@napi-rs/wasm-runtime@1.2.1(@emnapi/core@2.0.0-alpha.3)(@emnapi/runtime@2.0.0-alpha.3)': - dependencies: - '@emnapi/core': 2.0.0-alpha.3 - '@emnapi/runtime': 2.0.0-alpha.3 - '@tybys/wasm-util': 0.10.3 - optional: true - - '@opentelemetry/api@1.9.1': - optional: true - - '@oxc-project/types@0.142.0': {} - - '@phosphor-icons/react@2.1.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@poppinss/colors@4.1.6': - dependencies: - kleur: 4.1.5 - - '@poppinss/dumper@0.6.5': - dependencies: - '@poppinss/colors': 4.1.6 - '@sindresorhus/is': 7.2.0 - supports-color: 10.2.2 - - '@poppinss/exception@1.2.3': {} - - '@posthog/core@1.35.3': - dependencies: - '@posthog/types': 1.390.2 - - '@posthog/core@1.55.2': - dependencies: - '@posthog/types': 1.412.4 - - '@posthog/mcp@0.21.0(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(supports-color@10.2.2)(zod@4.4.3))(@modelcontextprotocol/server@2.0.0)(posthog-node@5.38.2)': - dependencies: - '@posthog/core': 1.55.2 - posthog-node: 5.38.2 - optionalDependencies: - '@modelcontextprotocol/sdk': 1.30.0(@cfworker/json-schema@4.1.1)(supports-color@10.2.2)(zod@4.4.3) - '@modelcontextprotocol/server': 2.0.0 - - '@posthog/types@1.390.2': {} - - '@posthog/types@1.412.4': {} - - '@radix-ui/primitive@1.1.7': {} - - '@radix-ui/react-arrow@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) - - '@radix-ui/react-compose-refs@1.1.5(@types/react@19.2.17)(react@19.2.8)': - dependencies: - react: 19.2.8 - optionalDependencies: - '@types/react': 19.2.17 - - '@radix-ui/react-context@1.2.2(@types/react@19.2.17)(react@19.2.8)': - dependencies: - react: 19.2.8 - optionalDependencies: - '@types/react': 19.2.17 - - '@radix-ui/react-dismissable-layer@1.1.19(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.2.17)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) - - '@radix-ui/react-focus-guards@1.1.6(@types/react@19.2.17)(react@19.2.8)': - dependencies: - react: 19.2.8 - optionalDependencies: - '@types/react': 19.2.17 - - '@radix-ui/react-focus-scope@1.1.16(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.17)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) - - '@radix-ui/react-id@1.1.4(@types/react@19.2.17)(react@19.2.8)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.17)(react@19.2.8) - react: 19.2.8 - optionalDependencies: - '@types/react': 19.2.17 - - '@radix-ui/react-popover@1.1.23(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-focus-scope': 1.1.16(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-id': 1.1.4(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-popper': 1.3.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-slot': 1.3.3(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.17)(react@19.2.8) - aria-hidden: 1.2.6 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - react-remove-scroll: 2.7.2(@types/react@19.2.17)(react@19.2.8) - optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) - - '@radix-ui/react-popper@1.3.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@floating-ui/react-dom': 2.1.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-arrow': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-use-rect': 1.1.4(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-use-size': 1.1.4(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/rect': 1.1.3 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) - - '@radix-ui/react-portal@1.1.17(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.17)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) - - '@radix-ui/react-presence@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.17)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) - - '@radix-ui/react-primitive@2.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@radix-ui/react-slot': 1.3.3(@types/react@19.2.17)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) - - '@radix-ui/react-slot@1.3.3(@types/react@19.2.17)(react@19.2.8)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.17)(react@19.2.8) - react: 19.2.8 - optionalDependencies: - '@types/react': 19.2.17 - - '@radix-ui/react-tooltip@1.2.16(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-id': 1.1.4(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-popper': 1.3.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-slot': 1.3.3(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-visually-hidden': 1.2.11(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) - - '@radix-ui/react-use-callback-ref@1.1.4(@types/react@19.2.17)(react@19.2.8)': - dependencies: - react: 19.2.8 - optionalDependencies: - '@types/react': 19.2.17 - - '@radix-ui/react-use-controllable-state@1.2.6(@types/react@19.2.17)(react@19.2.8)': - dependencies: - '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.17)(react@19.2.8) - react: 19.2.8 - optionalDependencies: - '@types/react': 19.2.17 - - '@radix-ui/react-use-effect-event@0.0.5(@types/react@19.2.17)(react@19.2.8)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.17)(react@19.2.8) - react: 19.2.8 - optionalDependencies: - '@types/react': 19.2.17 - - '@radix-ui/react-use-layout-effect@1.1.4(@types/react@19.2.17)(react@19.2.8)': - dependencies: - react: 19.2.8 - optionalDependencies: - '@types/react': 19.2.17 - - '@radix-ui/react-use-rect@1.1.4(@types/react@19.2.17)(react@19.2.8)': - dependencies: - '@radix-ui/rect': 1.1.3 - react: 19.2.8 - optionalDependencies: - '@types/react': 19.2.17 - - '@radix-ui/react-use-size@1.1.4(@types/react@19.2.17)(react@19.2.8)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.17)(react@19.2.8) - react: 19.2.8 - optionalDependencies: - '@types/react': 19.2.17 - - '@radix-ui/react-visually-hidden@1.2.11(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) - - '@radix-ui/rect@1.1.3': {} - - '@rolldown/binding-android-arm64@1.2.1': - optional: true - - '@rolldown/binding-darwin-arm64@1.2.1': - optional: true - - '@rolldown/binding-darwin-x64@1.2.1': - optional: true - - '@rolldown/binding-freebsd-x64@1.2.1': - optional: true - - '@rolldown/binding-linux-arm-gnueabihf@1.2.1': - optional: true - - '@rolldown/binding-linux-arm64-gnu@1.2.1': - optional: true - - '@rolldown/binding-linux-arm64-musl@1.2.1': - optional: true - - '@rolldown/binding-linux-ppc64-gnu@1.2.1': - optional: true - - '@rolldown/binding-linux-s390x-gnu@1.2.1': - optional: true - - '@rolldown/binding-linux-x64-gnu@1.2.1': - optional: true - - '@rolldown/binding-linux-x64-musl@1.2.1': - optional: true - - '@rolldown/binding-openharmony-arm64@1.2.1': - optional: true - - '@rolldown/binding-wasm32-wasi@1.2.1': - dependencies: - '@emnapi/core': 2.0.0-alpha.3 - '@emnapi/runtime': 2.0.0-alpha.3 - '@napi-rs/wasm-runtime': 1.2.1(@emnapi/core@2.0.0-alpha.3)(@emnapi/runtime@2.0.0-alpha.3) - optional: true - - '@rolldown/binding-win32-arm64-msvc@1.2.1': - optional: true - - '@rolldown/binding-win32-x64-msvc@1.2.1': - optional: true - - '@rolldown/plugin-babel@0.2.3(@babel/core@8.0.6)(@babel/runtime@7.29.7)(rolldown@1.2.1)(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))': - dependencies: - '@babel/core': 8.0.6 - picomatch: 4.0.4 - rolldown: 1.2.1 - optionalDependencies: - '@babel/runtime': 7.29.7 - vite: 6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) - - '@rolldown/pluginutils@1.0.0-beta.27': {} - - '@rolldown/pluginutils@1.0.1': {} - - '@rollup/rollup-android-arm-eabi@4.62.2': - optional: true - - '@rollup/rollup-android-arm64@4.62.2': - optional: true - - '@rollup/rollup-darwin-arm64@4.62.2': - optional: true - - '@rollup/rollup-darwin-x64@4.62.2': - optional: true - - '@rollup/rollup-freebsd-arm64@4.62.2': - optional: true - - '@rollup/rollup-freebsd-x64@4.62.2': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.62.2': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.62.2': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.62.2': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.62.2': - optional: true - - '@rollup/rollup-linux-loong64-gnu@4.62.2': - optional: true - - '@rollup/rollup-linux-loong64-musl@4.62.2': - optional: true - - '@rollup/rollup-linux-ppc64-gnu@4.62.2': - optional: true - - '@rollup/rollup-linux-ppc64-musl@4.62.2': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.62.2': - optional: true - - '@rollup/rollup-linux-riscv64-musl@4.62.2': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.62.2': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.62.2': - optional: true - - '@rollup/rollup-linux-x64-musl@4.62.2': - optional: true - - '@rollup/rollup-openbsd-x64@4.62.2': - optional: true - - '@rollup/rollup-openharmony-arm64@4.62.2': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.62.2': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.62.2': - optional: true - - '@rollup/rollup-win32-x64-gnu@4.62.2': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.62.2': - optional: true - - '@sindresorhus/is@7.2.0': {} - - '@speed-highlight/core@1.2.17': {} - - '@standard-schema/spec@1.1.0': {} - - '@supermemory/memory-graph@0.2.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - d3-force: 3.0.0 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@tailwindcss/node@4.3.3': - dependencies: - '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.24.4 - jiti: 2.7.0 - lightningcss: 1.32.0 - magic-string: 0.30.21 - source-map-js: 1.2.1 - tailwindcss: 4.3.3 - - '@tailwindcss/oxide-android-arm64@4.3.3': - optional: true - - '@tailwindcss/oxide-darwin-arm64@4.3.3': - optional: true - - '@tailwindcss/oxide-darwin-x64@4.3.3': - optional: true - - '@tailwindcss/oxide-freebsd-x64@4.3.3': - optional: true - - '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': - optional: true - - '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': - optional: true - - '@tailwindcss/oxide-linux-arm64-musl@4.3.3': - optional: true - - '@tailwindcss/oxide-linux-x64-gnu@4.3.3': - optional: true - - '@tailwindcss/oxide-linux-x64-musl@4.3.3': - optional: true - - '@tailwindcss/oxide-wasm32-wasi@4.3.3': - optional: true - - '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': - optional: true - - '@tailwindcss/oxide-win32-x64-msvc@4.3.3': - optional: true - - '@tailwindcss/oxide@4.3.3': - optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.3.3 - '@tailwindcss/oxide-darwin-arm64': 4.3.3 - '@tailwindcss/oxide-darwin-x64': 4.3.3 - '@tailwindcss/oxide-freebsd-x64': 4.3.3 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.3 - '@tailwindcss/oxide-linux-arm64-gnu': 4.3.3 - '@tailwindcss/oxide-linux-arm64-musl': 4.3.3 - '@tailwindcss/oxide-linux-x64-gnu': 4.3.3 - '@tailwindcss/oxide-linux-x64-musl': 4.3.3 - '@tailwindcss/oxide-wasm32-wasi': 4.3.3 - '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3 - '@tailwindcss/oxide-win32-x64-msvc': 4.3.3 - - '@tailwindcss/vite@4.3.3(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))': - dependencies: - '@tailwindcss/node': 4.3.3 - '@tailwindcss/oxide': 4.3.3 - tailwindcss: 4.3.3 - vite: 6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) - - '@tybys/wasm-util@0.10.3': - dependencies: - tslib: 2.8.1 - optional: true - - '@types/babel__core@7.20.5': - dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 - '@types/babel__generator': 7.27.0 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.28.0 - - '@types/babel__generator@7.27.0': - dependencies: - '@babel/types': 7.29.7 - - '@types/babel__template@7.4.4': - dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 - - '@types/babel__traverse@7.28.0': - dependencies: - '@babel/types': 7.29.7 - - '@types/chai@5.2.3': - dependencies: - '@types/deep-eql': 4.0.2 - assertion-error: 2.0.1 - - '@types/deep-eql@4.0.2': {} - - '@types/estree@1.0.9': {} - - '@types/gensync@1.0.5': {} - - '@types/jsesc@2.5.1': {} - - '@types/react-dom@19.2.3(@types/react@19.2.17)': - dependencies: - '@types/react': 19.2.17 - - '@types/react@19.2.17': - dependencies: - csstype: 3.2.3 - - '@vercel/oidc@3.2.0': - optional: true - - '@vitejs/plugin-react@4.7.0(supports-color@10.2.2)(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))': - dependencies: - '@babel/core': 7.29.7(supports-color@10.2.2) - '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) - '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) - '@rolldown/pluginutils': 1.0.0-beta.27 - '@types/babel__core': 7.20.5 - react-refresh: 0.17.0 - vite: 6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) - transitivePeerDependencies: - - supports-color - - '@vitest/expect@3.2.6': - dependencies: - '@types/chai': 5.2.3 - '@vitest/spy': 3.2.6 - '@vitest/utils': 3.2.6 - chai: 5.3.3 - tinyrainbow: 2.0.0 - - '@vitest/mocker@3.2.6(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))': - dependencies: - '@vitest/spy': 3.2.6 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) - - '@vitest/pretty-format@3.2.6': - dependencies: - tinyrainbow: 2.0.0 - - '@vitest/runner@3.2.6': - dependencies: - '@vitest/utils': 3.2.6 - pathe: 2.0.3 - strip-literal: 3.1.0 - - '@vitest/snapshot@3.2.6': - dependencies: - '@vitest/pretty-format': 3.2.6 - magic-string: 0.30.21 - pathe: 2.0.3 - - '@vitest/spy@3.2.6': - dependencies: - tinyspy: 4.0.4 - - '@vitest/utils@3.2.6': - dependencies: - '@vitest/pretty-format': 3.2.6 - loupe: 3.2.1 - tinyrainbow: 2.0.0 - - accepts@2.0.0: - dependencies: - mime-types: 3.0.2 - negotiator: 1.0.0 - - agents@0.20.1(@babel/core@8.0.6)(@babel/runtime@7.29.7)(@cloudflare/workers-types@4.20260620.1)(@modelcontextprotocol/client@2.0.0)(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(supports-color@10.2.2)(zod@4.4.3))(@modelcontextprotocol/server@2.0.0)(ai@6.0.208(zod@4.4.3))(react@19.2.8)(rolldown@1.2.1)(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))(zod@4.4.3): - dependencies: - '@babel/plugin-proposal-decorators': 8.0.2(@babel/core@8.0.6) - '@cfworker/json-schema': 4.1.1 - '@modelcontextprotocol/client': 2.0.0 - '@modelcontextprotocol/sdk': 1.30.0(@cfworker/json-schema@4.1.1)(supports-color@10.2.2)(zod@4.4.3) - '@modelcontextprotocol/server': 2.0.0 - '@rolldown/plugin-babel': 0.2.3(@babel/core@8.0.6)(@babel/runtime@7.29.7)(rolldown@1.2.1)(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) - cron-schedule: 6.0.0 - esbuild: 0.28.1 - mimetext: 3.0.28 - nanoid: 5.1.16 - partyserver: 0.5.9(@cloudflare/workers-types@4.20260620.1) - partysocket: 1.3.0(react@19.2.8) - react: 19.2.8 - yaml: 2.9.0 - yargs: 18.0.0 - zod: 4.4.3 - optionalDependencies: - ai: 6.0.208(zod@4.4.3) - vite: 6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) - transitivePeerDependencies: - - '@babel/core' - - '@babel/plugin-transform-runtime' - - '@babel/runtime' - - '@cloudflare/workers-types' - - rolldown - - ai@6.0.208(zod@4.4.3): - dependencies: - '@ai-sdk/gateway': 3.0.133(zod@4.4.3) - '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.30(zod@4.4.3) - '@opentelemetry/api': 1.9.1 - zod: 4.4.3 - optional: true - - ajv-formats@3.0.1(ajv@8.20.0): - optionalDependencies: - ajv: 8.20.0 - - ajv@8.20.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.1.7 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - - ansi-regex@6.2.2: {} - - ansi-styles@6.2.3: {} - - aria-hidden@1.2.6: - dependencies: - tslib: 2.8.1 - - assertion-error@2.0.1: {} - - baseline-browser-mapping@2.11.7: {} - - blake3-wasm@2.1.5: {} - - body-parser@2.3.0(supports-color@10.2.2): - dependencies: - bytes: 3.1.2 - content-type: 2.0.0 - debug: 4.4.3(supports-color@10.2.2) - http-errors: 2.0.1 - iconv-lite: 0.7.2 - on-finished: 2.4.1 - qs: 6.15.2 - raw-body: 3.0.2 - type-is: 2.1.0 - transitivePeerDependencies: - - supports-color - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browserslist@4.28.7: - dependencies: - baseline-browser-mapping: 2.11.7 - caniuse-lite: 1.0.30001806 - electron-to-chromium: 1.5.398 - node-releases: 2.0.51 - update-browserslist-db: 1.2.3(browserslist@4.28.7) - - bytes@3.1.2: {} - - cac@6.7.14: {} - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - - caniuse-lite@1.0.30001806: {} - - chai@5.3.3: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.3 - deep-eql: 5.0.2 - loupe: 3.2.1 - pathval: 2.0.1 - - check-error@2.1.3: {} - - class-variance-authority@0.7.1: - dependencies: - clsx: 2.1.1 - - cliui@9.0.1: - dependencies: - string-width: 7.2.0 - strip-ansi: 7.2.0 - wrap-ansi: 9.0.2 - - clsx@2.1.1: {} - - content-disposition@1.1.0: {} - - content-type@1.0.5: {} - - content-type@2.0.0: {} - - convert-source-map@2.0.0: {} - - cookie-signature@1.2.2: {} - - cookie@0.7.2: {} - - cookie@1.1.1: {} - - core-js-pure@3.49.0: {} - - cors@2.8.6: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - - cron-schedule@6.0.0: {} - - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - csstype@3.2.3: {} - - d3-dispatch@3.0.1: {} - - d3-force@3.0.0: - dependencies: - d3-dispatch: 3.0.1 - d3-quadtree: 3.0.1 - d3-timer: 3.0.1 - - d3-quadtree@3.0.1: {} - - d3-timer@3.0.1: {} - - debug@4.4.3(supports-color@10.2.2): - dependencies: - ms: 2.1.3 - optionalDependencies: - supports-color: 10.2.2 - - deep-eql@5.0.2: {} - - depd@2.0.0: {} - - detect-libc@2.1.2: {} - - detect-node-es@1.1.0: {} - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - ee-first@1.1.1: {} - - electron-to-chromium@1.5.398: {} - - emoji-regex@10.6.0: {} - - empathic@2.1.0: {} - - encodeurl@2.0.0: {} - - enhanced-resolve@5.24.4: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.3.3 - - error-stack-parser-es@1.0.5: {} - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-module-lexer@1.7.0: {} - - es-object-atoms@1.1.2: - dependencies: - es-errors: 1.3.0 - - esbuild@0.25.12: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.12 - '@esbuild/android-arm': 0.25.12 - '@esbuild/android-arm64': 0.25.12 - '@esbuild/android-x64': 0.25.12 - '@esbuild/darwin-arm64': 0.25.12 - '@esbuild/darwin-x64': 0.25.12 - '@esbuild/freebsd-arm64': 0.25.12 - '@esbuild/freebsd-x64': 0.25.12 - '@esbuild/linux-arm': 0.25.12 - '@esbuild/linux-arm64': 0.25.12 - '@esbuild/linux-ia32': 0.25.12 - '@esbuild/linux-loong64': 0.25.12 - '@esbuild/linux-mips64el': 0.25.12 - '@esbuild/linux-ppc64': 0.25.12 - '@esbuild/linux-riscv64': 0.25.12 - '@esbuild/linux-s390x': 0.25.12 - '@esbuild/linux-x64': 0.25.12 - '@esbuild/netbsd-arm64': 0.25.12 - '@esbuild/netbsd-x64': 0.25.12 - '@esbuild/openbsd-arm64': 0.25.12 - '@esbuild/openbsd-x64': 0.25.12 - '@esbuild/openharmony-arm64': 0.25.12 - '@esbuild/sunos-x64': 0.25.12 - '@esbuild/win32-arm64': 0.25.12 - '@esbuild/win32-ia32': 0.25.12 - '@esbuild/win32-x64': 0.25.12 - - 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 - - escalade@3.2.0: {} - - escape-html@1.0.3: {} - - estree-walker@3.0.3: - dependencies: - '@types/estree': 1.0.9 - - etag@1.8.1: {} - - event-target-polyfill@0.0.4: {} - - eventsource-parser@3.1.0: {} - - eventsource@3.0.7: - dependencies: - eventsource-parser: 3.1.0 - - expect-type@1.3.0: {} - - express-rate-limit@8.5.2(express@5.2.1(supports-color@10.2.2)): - dependencies: - express: 5.2.1(supports-color@10.2.2) - ip-address: 10.3.1 - - express@5.2.1(supports-color@10.2.2): - dependencies: - accepts: 2.0.0 - body-parser: 2.3.0(supports-color@10.2.2) - content-disposition: 1.1.0 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.2.2 - debug: 4.4.3(supports-color@10.2.2) - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 2.1.1(supports-color@10.2.2) - fresh: 2.0.0 - http-errors: 2.0.1 - merge-descriptors: 2.0.0 - mime-types: 3.0.2 - on-finished: 2.4.1 - once: 1.4.0 - parseurl: 1.3.3 - proxy-addr: 2.0.7 - qs: 6.15.2 - range-parser: 1.2.1 - router: 2.2.0(supports-color@10.2.2) - send: 1.2.1(supports-color@10.2.2) - serve-static: 2.2.1(supports-color@10.2.2) - statuses: 2.0.2 - type-is: 2.1.0 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - fast-deep-equal@3.1.3: {} - - fast-uri@3.1.7: {} - - fdir@6.5.0(picomatch@4.0.4): - optionalDependencies: - picomatch: 4.0.4 - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - finalhandler@2.1.1(supports-color@10.2.2): - dependencies: - debug: 4.4.3(supports-color@10.2.2) - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - - flru@1.0.2: {} - - forwarded@0.2.0: {} - - fresh@2.0.0: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - gensync@1.0.0-beta.2: {} - - get-caller-file@2.0.5: {} - - get-east-asian-width@1.6.0: {} - - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.2 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.4 - math-intrinsics: 1.1.0 - - get-nonce@1.0.1: {} - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.2 - - gopd@1.2.0: {} - - graceful-fs@4.2.11: {} - - has-symbols@1.1.0: {} - - hasown@2.0.4: - dependencies: - function-bind: 1.1.2 - - hono@4.12.26: {} - - 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 - - iconv-lite@0.7.2: - dependencies: - safer-buffer: 2.1.2 - - import-meta-resolve@4.2.0: {} - - inherits@2.0.4: {} - - ip-address@10.3.1: {} - - ipaddr.js@1.9.1: {} - - is-number@7.0.0: {} - - is-promise@4.0.0: {} - - isexe@2.0.0: {} - - jiti@2.7.0: {} - - jose@6.2.3: {} - - js-base64@3.7.8: {} - - js-tokens@10.0.0: {} - - js-tokens@4.0.0: {} - - js-tokens@9.0.1: {} - - jsesc@3.1.0: {} - - json-schema-traverse@1.0.0: {} - - json-schema-typed@8.0.2: {} - - json-schema@0.4.0: - optional: true - - json5@2.2.3: {} - - kleur@4.1.5: {} - - lightningcss-android-arm64@1.32.0: - optional: true - - lightningcss-darwin-arm64@1.32.0: - optional: true - - lightningcss-darwin-x64@1.32.0: - optional: true - - lightningcss-freebsd-x64@1.32.0: - optional: true - - lightningcss-linux-arm-gnueabihf@1.32.0: - optional: true - - lightningcss-linux-arm64-gnu@1.32.0: - optional: true - - lightningcss-linux-arm64-musl@1.32.0: - optional: true - - lightningcss-linux-x64-gnu@1.32.0: - optional: true - - lightningcss-linux-x64-musl@1.32.0: - optional: true - - lightningcss-win32-arm64-msvc@1.32.0: - optional: true - - lightningcss-win32-x64-msvc@1.32.0: - optional: true - - lightningcss@1.32.0: - dependencies: - detect-libc: 2.1.2 - optionalDependencies: - lightningcss-android-arm64: 1.32.0 - lightningcss-darwin-arm64: 1.32.0 - lightningcss-darwin-x64: 1.32.0 - lightningcss-freebsd-x64: 1.32.0 - lightningcss-linux-arm-gnueabihf: 1.32.0 - lightningcss-linux-arm64-gnu: 1.32.0 - lightningcss-linux-arm64-musl: 1.32.0 - lightningcss-linux-x64-gnu: 1.32.0 - lightningcss-linux-x64-musl: 1.32.0 - lightningcss-win32-arm64-msvc: 1.32.0 - lightningcss-win32-x64-msvc: 1.32.0 - - loupe@3.2.1: {} - - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - - magic-string@0.30.21: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - - math-intrinsics@1.1.0: {} - - media-typer@1.1.0: {} - - merge-descriptors@2.0.0: {} - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.2 - - mime-db@1.52.0: {} - - mime-db@1.54.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mime-types@3.0.2: - dependencies: - mime-db: 1.54.0 - - mimetext@3.0.28: - dependencies: - '@babel/runtime': 7.29.7 - '@babel/runtime-corejs3': 7.29.7 - js-base64: 3.7.8 - mime-types: 2.1.35 - - miniflare@4.20260617.1: - dependencies: - '@cspotcode/source-map-support': 0.8.1 - sharp: 0.35.4 - undici: 7.29.1 - workerd: 1.20260617.1 - ws: 8.21.0 - youch: 4.1.0-beta.10 - transitivePeerDependencies: - - '@types/node' - - bufferutil - - utf-8-validate - - ms@2.1.3: {} - - nanoid@3.3.18: {} - - nanoid@5.1.16: {} - - negotiator@1.0.0: {} - - node-releases@2.0.51: {} - - object-assign@4.1.1: {} - - object-inspect@1.13.4: {} - - obug@2.1.4: {} - - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - parseurl@1.3.3: {} - - partyserver@0.5.9(@cloudflare/workers-types@4.20260620.1): - dependencies: - '@cloudflare/workers-types': 4.20260620.1 - nanoid: 5.1.16 - - partysocket@1.3.0(react@19.2.8): - dependencies: - event-target-polyfill: 0.0.4 - optionalDependencies: - react: 19.2.8 - - path-key@3.1.1: {} - - path-to-regexp@6.3.0: {} - - path-to-regexp@8.4.2: {} - - pathe@2.0.3: {} - - pathval@2.0.1: {} - - picocolors@1.1.1: {} - - picomatch@2.3.2: {} - - picomatch@4.0.4: {} - - pkce-challenge@5.0.1: {} - - postcss@8.5.18: - dependencies: - nanoid: 3.3.18 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - posthog-node@5.38.2: - dependencies: - '@posthog/core': 1.35.3 - - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - - qs@6.15.2: - dependencies: - side-channel: 1.1.1 - - range-parser@1.2.1: {} - - raw-body@3.0.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.1 - iconv-lite: 0.7.2 - unpipe: 1.0.0 - - react-dom@19.2.8(react@19.2.8): - dependencies: - react: 19.2.8 - scheduler: 0.27.0 - - react-refresh@0.17.0: {} - - react-remove-scroll-bar@2.3.8(@types/react@19.2.17)(react@19.2.8): - dependencies: - react: 19.2.8 - react-style-singleton: 2.2.3(@types/react@19.2.17)(react@19.2.8) - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.2.17 - - react-remove-scroll@2.7.2(@types/react@19.2.17)(react@19.2.8): - dependencies: - react: 19.2.8 - react-remove-scroll-bar: 2.3.8(@types/react@19.2.17)(react@19.2.8) - react-style-singleton: 2.2.3(@types/react@19.2.17)(react@19.2.8) - tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.2.17)(react@19.2.8) - use-sidecar: 1.1.3(@types/react@19.2.17)(react@19.2.8) - optionalDependencies: - '@types/react': 19.2.17 - - react-style-singleton@2.2.3(@types/react@19.2.17)(react@19.2.8): - dependencies: - get-nonce: 1.0.1 - react: 19.2.8 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.2.17 - - react@19.2.8: {} - - require-from-string@2.0.2: {} - - rolldown@1.2.1: - dependencies: - '@oxc-project/types': 0.142.0 - '@rolldown/pluginutils': 1.0.1 - optionalDependencies: - '@rolldown/binding-android-arm64': 1.2.1 - '@rolldown/binding-darwin-arm64': 1.2.1 - '@rolldown/binding-darwin-x64': 1.2.1 - '@rolldown/binding-freebsd-x64': 1.2.1 - '@rolldown/binding-linux-arm-gnueabihf': 1.2.1 - '@rolldown/binding-linux-arm64-gnu': 1.2.1 - '@rolldown/binding-linux-arm64-musl': 1.2.1 - '@rolldown/binding-linux-ppc64-gnu': 1.2.1 - '@rolldown/binding-linux-s390x-gnu': 1.2.1 - '@rolldown/binding-linux-x64-gnu': 1.2.1 - '@rolldown/binding-linux-x64-musl': 1.2.1 - '@rolldown/binding-openharmony-arm64': 1.2.1 - '@rolldown/binding-wasm32-wasi': 1.2.1 - '@rolldown/binding-win32-arm64-msvc': 1.2.1 - '@rolldown/binding-win32-x64-msvc': 1.2.1 - - rollup@4.62.2: - dependencies: - '@types/estree': 1.0.9 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.62.2 - '@rollup/rollup-android-arm64': 4.62.2 - '@rollup/rollup-darwin-arm64': 4.62.2 - '@rollup/rollup-darwin-x64': 4.62.2 - '@rollup/rollup-freebsd-arm64': 4.62.2 - '@rollup/rollup-freebsd-x64': 4.62.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.62.2 - '@rollup/rollup-linux-arm-musleabihf': 4.62.2 - '@rollup/rollup-linux-arm64-gnu': 4.62.2 - '@rollup/rollup-linux-arm64-musl': 4.62.2 - '@rollup/rollup-linux-loong64-gnu': 4.62.2 - '@rollup/rollup-linux-loong64-musl': 4.62.2 - '@rollup/rollup-linux-ppc64-gnu': 4.62.2 - '@rollup/rollup-linux-ppc64-musl': 4.62.2 - '@rollup/rollup-linux-riscv64-gnu': 4.62.2 - '@rollup/rollup-linux-riscv64-musl': 4.62.2 - '@rollup/rollup-linux-s390x-gnu': 4.62.2 - '@rollup/rollup-linux-x64-gnu': 4.62.2 - '@rollup/rollup-linux-x64-musl': 4.62.2 - '@rollup/rollup-openbsd-x64': 4.62.2 - '@rollup/rollup-openharmony-arm64': 4.62.2 - '@rollup/rollup-win32-arm64-msvc': 4.62.2 - '@rollup/rollup-win32-ia32-msvc': 4.62.2 - '@rollup/rollup-win32-x64-gnu': 4.62.2 - '@rollup/rollup-win32-x64-msvc': 4.62.2 - fsevents: 2.3.3 - - router@2.2.0(supports-color@10.2.2): - dependencies: - debug: 4.4.3(supports-color@10.2.2) - depd: 2.0.0 - is-promise: 4.0.0 - parseurl: 1.3.3 - path-to-regexp: 8.4.2 - transitivePeerDependencies: - - supports-color - - safer-buffer@2.1.2: {} - - scheduler@0.27.0: {} - - semver@6.3.1: {} - - semver@7.8.5: {} - - send@1.2.1(supports-color@10.2.2): - dependencies: - debug: 4.4.3(supports-color@10.2.2) - 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 - transitivePeerDependencies: - - supports-color - - serve-static@2.2.1(supports-color@10.2.2): - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 1.2.1(supports-color@10.2.2) - transitivePeerDependencies: - - supports-color - - setprototypeof@1.2.0: {} - - sharp@0.35.4: - dependencies: - '@img/colour': 1.1.0 - detect-libc: 2.1.2 - semver: 7.8.5 - optionalDependencies: - '@img/sharp-darwin-arm64': 0.35.4 - '@img/sharp-darwin-x64': 0.35.4 - '@img/sharp-freebsd-wasm32': 0.35.4 - '@img/sharp-libvips-darwin-arm64': 1.3.3 - '@img/sharp-libvips-darwin-x64': 1.3.3 - '@img/sharp-libvips-linux-arm': 1.3.3 - '@img/sharp-libvips-linux-arm64': 1.3.3 - '@img/sharp-libvips-linux-ppc64': 1.3.3 - '@img/sharp-libvips-linux-riscv64': 1.3.3 - '@img/sharp-libvips-linux-s390x': 1.3.3 - '@img/sharp-libvips-linux-x64': 1.3.3 - '@img/sharp-libvips-linuxmusl-arm64': 1.3.3 - '@img/sharp-libvips-linuxmusl-x64': 1.3.3 - '@img/sharp-linux-arm': 0.35.4 - '@img/sharp-linux-arm64': 0.35.4 - '@img/sharp-linux-ppc64': 0.35.4 - '@img/sharp-linux-riscv64': 0.35.4 - '@img/sharp-linux-s390x': 0.35.4 - '@img/sharp-linux-x64': 0.35.4 - '@img/sharp-linuxmusl-arm64': 0.35.4 - '@img/sharp-linuxmusl-x64': 0.35.4 - '@img/sharp-webcontainers-wasm32': 0.35.4 - '@img/sharp-win32-arm64': 0.35.4 - '@img/sharp-win32-ia32': 0.35.4 - '@img/sharp-win32-x64': 0.35.4 - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - side-channel-list@1.0.1: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 - - side-channel@1.1.1: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.1 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - - siginfo@2.0.0: {} - - source-map-js@1.2.1: {} - - stackback@0.0.2: {} - - statuses@2.0.2: {} - - std-env@3.10.0: {} - - string-width@7.2.0: - dependencies: - emoji-regex: 10.6.0 - get-east-asian-width: 1.6.0 - strip-ansi: 7.2.0 - - strip-ansi@7.2.0: - dependencies: - ansi-regex: 6.2.2 - - strip-literal@3.1.0: - dependencies: - js-tokens: 9.0.1 - - supermemory@4.24.12: {} - - supports-color@10.2.2: {} - - tailwind-merge@3.6.0: {} - - tailwindcss@4.3.3: {} - - tapable@2.3.3: {} - - tinybench@2.9.0: {} - - tinyexec@0.3.2: {} - - tinyglobby@0.2.17: - dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - - tinypool@1.1.1: {} - - tinyrainbow@2.0.0: {} - - tinyspy@4.0.4: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - toidentifier@1.0.1: {} - - tslib@2.8.1: {} - - type-is@2.1.0: - dependencies: - content-type: 2.0.0 - media-typer: 1.1.0 - mime-types: 3.0.2 - - typescript@5.9.3: {} - - undici@7.29.1: {} - - unenv@2.0.0-rc.24: - dependencies: - pathe: 2.0.3 - - unpipe@1.0.0: {} - - update-browserslist-db@1.2.3(browserslist@4.28.7): - dependencies: - browserslist: 4.28.7 - escalade: 3.2.0 - picocolors: 1.1.1 - - use-callback-ref@1.3.3(@types/react@19.2.17)(react@19.2.8): - dependencies: - react: 19.2.8 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.2.17 - - use-sidecar@1.1.3(@types/react@19.2.17)(react@19.2.8): - dependencies: - detect-node-es: 1.1.0 - react: 19.2.8 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.2.17 - - vary@1.1.2: {} - - verkit@0.3.2: {} - - vite-node@3.2.4(jiti@2.7.0)(lightningcss@1.32.0)(supports-color@10.2.2)(yaml@2.9.0): - dependencies: - cac: 6.7.14 - debug: 4.4.3(supports-color@10.2.2) - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vite-plugin-singlefile@2.3.3(rollup@4.62.2)(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)): - dependencies: - micromatch: 4.0.8 - vite: 6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) - optionalDependencies: - rollup: 4.62.2 - - vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0): - dependencies: - esbuild: 0.25.12 - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - postcss: 8.5.18 - rollup: 4.62.2 - tinyglobby: 0.2.17 - optionalDependencies: - fsevents: 2.3.3 - jiti: 2.7.0 - lightningcss: 1.32.0 - yaml: 2.9.0 - - vitest@3.2.6(jiti@2.7.0)(lightningcss@1.32.0)(supports-color@10.2.2)(yaml@2.9.0): - dependencies: - '@types/chai': 5.2.3 - '@vitest/expect': 3.2.6 - '@vitest/mocker': 3.2.6(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) - '@vitest/pretty-format': 3.2.6 - '@vitest/runner': 3.2.6 - '@vitest/snapshot': 3.2.6 - '@vitest/spy': 3.2.6 - '@vitest/utils': 3.2.6 - chai: 5.3.3 - debug: 4.4.3(supports-color@10.2.2) - expect-type: 1.3.0 - magic-string: 0.30.21 - pathe: 2.0.3 - picomatch: 4.0.4 - std-env: 3.10.0 - tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.17 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) - vite-node: 3.2.4(jiti@2.7.0)(lightningcss@1.32.0)(supports-color@10.2.2)(yaml@2.9.0) - why-is-node-running: 2.3.0 - transitivePeerDependencies: - - jiti - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - why-is-node-running@2.3.0: - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 - - workerd@1.20260617.1: - optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20260617.1 - '@cloudflare/workerd-darwin-arm64': 1.20260617.1 - '@cloudflare/workerd-linux-64': 1.20260617.1 - '@cloudflare/workerd-linux-arm64': 1.20260617.1 - '@cloudflare/workerd-windows-64': 1.20260617.1 - - wrangler@4.103.0(@cloudflare/workers-types@4.20260620.1): - dependencies: - '@cloudflare/kv-asset-handler': 0.5.0 - '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260617.1) - blake3-wasm: 2.1.5 - esbuild: 0.28.1 - miniflare: 4.20260617.1 - path-to-regexp: 6.3.0 - unenv: 2.0.0-rc.24 - workerd: 1.20260617.1 - optionalDependencies: - '@cloudflare/workers-types': 4.20260620.1 - fsevents: 2.3.3 - transitivePeerDependencies: - - '@types/node' - - bufferutil - - utf-8-validate - - wrap-ansi@9.0.2: - dependencies: - ansi-styles: 6.2.3 - string-width: 7.2.0 - strip-ansi: 7.2.0 - - wrappy@1.0.2: {} - - ws@8.21.0: {} - - y18n@5.0.8: {} - - yallist@3.1.1: {} - - yaml@2.9.0: {} - - yargs-parser@22.0.0: {} - - yargs@18.0.0: - dependencies: - cliui: 9.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - string-width: 7.2.0 - y18n: 5.0.8 - yargs-parser: 22.0.0 - - youch-core@0.3.3: - dependencies: - '@poppinss/exception': 1.2.3 - error-stack-parser-es: 1.0.5 - - youch@4.1.0-beta.10: - dependencies: - '@poppinss/colors': 4.1.6 - '@poppinss/dumper': 0.6.5 - '@speed-highlight/core': 1.2.17 - cookie: 1.1.1 - youch-core: 0.3.3 - - zod-to-json-schema@3.25.2(zod@4.4.3): - dependencies: - zod: 4.4.3 - - zod@4.4.3: {} diff --git a/apps/mcp/src/server/auth/rbac.test.ts b/apps/mcp/src/server/auth/rbac.test.ts index b75bfb701..487dbf9b1 100644 --- a/apps/mcp/src/server/auth/rbac.test.ts +++ b/apps/mcp/src/server/auth/rbac.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest" -import type { SessionInfo } from "../../shared/types" -import { effectiveContainerTagAccess } from "./rbac" +import { type SessionInfo, sessionInfoSchema } from "../../shared/types" +import { effectiveNamespaceAccess } from "./rbac" const baseSession: SessionInfo = { user: { id: "user_test" }, @@ -8,11 +8,11 @@ const baseSession: SessionInfo = { scope: { type: "full", permission: "write" }, } -describe("effectiveContainerTagAccess", () => { - it("marks every visible tag writable for full access", () => { - expect(effectiveContainerTagAccess(["one", "two"], baseSession)).toEqual([ - { containerTag: "one", permission: "write" }, - { containerTag: "two", permission: "write" }, +describe("effectiveNamespaceAccess", () => { + it("marks every visible namespace writable for full access", () => { + expect(effectiveNamespaceAccess(["one", "two"], baseSession)).toEqual([ + { namespace: "one", permission: "write" }, + { namespace: "two", permission: "write" }, ]) }) @@ -20,15 +20,15 @@ describe("effectiveContainerTagAccess", () => { const session: SessionInfo = { ...baseSession, accessType: "restricted", - containerTags: [ - { containerTag: "one", permission: "read" }, - { containerTag: "two", permission: "write" }, + namespaces: [ + { namespace: "one", permission: "read" }, + { namespace: "two", permission: "write" }, ], } - expect(effectiveContainerTagAccess(["one", "two"], session)).toEqual([ - { containerTag: "one", permission: "read" }, - { containerTag: "two", permission: "write" }, + expect(effectiveNamespaceAccess(["one", "two"], session)).toEqual([ + { namespace: "one", permission: "read" }, + { namespace: "two", permission: "write" }, ]) }) @@ -42,20 +42,33 @@ describe("effectiveContainerTagAccess", () => { }, } - expect(effectiveContainerTagAccess(["one"], session)).toEqual([ - { containerTag: "one", permission: "read" }, + expect(effectiveNamespaceAccess(["one"], session)).toEqual([ + { namespace: "one", permission: "read" }, ]) }) - it("treats full-scope read-only grants as read on every tag", () => { + it("treats full-scope read-only grants as read on every namespace", () => { const session: SessionInfo = { ...baseSession, scope: { type: "full", permission: "read" }, } - expect(effectiveContainerTagAccess(["one", "two"], session)).toEqual([ - { containerTag: "one", permission: "read" }, - { containerTag: "two", permission: "read" }, + expect(effectiveNamespaceAccess(["one", "two"], session)).toEqual([ + { namespace: "one", permission: "read" }, + { namespace: "two", permission: "read" }, ]) }) + + it("reads restricted access from the legacy session field", () => { + const session = sessionInfoSchema.parse({ + user: { id: "user_test" }, + accessType: "restricted", + containerTags: [{ containerTag: "one", permission: "write" }], + }) + + expect(session.namespaces).toEqual([ + { namespace: "one", permission: "write" }, + ]) + expect(session).not.toHaveProperty("containerTags") + }) }) diff --git a/apps/mcp/src/server/auth/rbac.ts b/apps/mcp/src/server/auth/rbac.ts index bc1198afa..6888b38bf 100644 --- a/apps/mcp/src/server/auth/rbac.ts +++ b/apps/mcp/src/server/auth/rbac.ts @@ -1,36 +1,36 @@ -import type { ContainerTagAccess, SessionInfo } from "../../shared/types" +import type { NamespaceAccess, SessionInfo } from "../../shared/types" -export function effectiveContainerTagAccess( - containerTags: string[], +export function effectiveNamespaceAccess( + namespaces: string[], session: SessionInfo, -): ContainerTagAccess[] { +): NamespaceAccess[] { const memberAccess = new Map( - (session.containerTags ?? []).map((access) => [ - access.containerTag, + (session.namespaces ?? []).map((access) => [ + access.namespace, access.permission, ]), ) - const scopedTags = new Set( + const scopedNamespaces = new Set( session.scope?.tags ?? (session.scope?.tag ? [session.scope.tag] : []), ) - return containerTags.map((containerTag) => { - let permission: ContainerTagAccess["permission"] = "write" + return namespaces.map((namespace) => { + let permission: NamespaceAccess["permission"] = "write" if (session.accessType === "restricted") { - permission = memberAccess.get(containerTag) ?? "read" + permission = memberAccess.get(namespace) ?? "read" } if (session.scope?.permission === "read") { permission = "read" } else if ( session.scope?.type === "scoped" && - scopedTags.size > 0 && - !scopedTags.has(containerTag) + scopedNamespaces.size > 0 && + !scopedNamespaces.has(namespace) ) { permission = "read" } - return { containerTag, permission } + return { namespace, permission } }) } diff --git a/apps/mcp/src/server/client/index.ts b/apps/mcp/src/server/client/index.ts index 1b575e15a..39256cf75 100644 --- a/apps/mcp/src/server/client/index.ts +++ b/apps/mcp/src/server/client/index.ts @@ -1,65 +1,64 @@ import Supermemory from "supermemory" import type { - DocumentGetResponse, - DocumentListResponse as SdkDocumentListResponse, -} from "supermemory/resources/documents" -import { z } from "zod" + GetDocumentsResponse, + ListResponseDocumentsItem, + ListResponseMemoriesItem, + ListResponsePagination, + SearchResponseResultsItem, +} from "supermemory" import { - containerTagSchema, documentsApiResponseSchema, - memoriesListSchema, - type ContainerTag, type DocumentMemoryEntry, type DocumentsApiResponse, type DocumentWithMemories, type MemoriesList, type MemoryEntry, type MemoryEntryHistory, + type NamespaceInfo, } from "../../shared/types" const MAX_CHARS = 200000 -export const DEFAULT_PROJECT_ID = "sm_project_default" +export const DEFAULT_NAMESPACE = "sm_project_default" const FETCH_TIMEOUT_MS = 30_000 const MCP_SOURCE = "supermemory-mcp" +const NAMESPACE_PAGE_LIMIT = 100 +// v4 defaults; v5 lowered the threshold to 0.3. +const SEARCH_THRESHOLD = 0.6 // Analytics matches on this text to tag quota errors, keep them in sync. export const OUT_OF_CREDITS_MESSAGE = "Out of credits. Top up or upgrade at https://console.supermemory.ai/billing" export type { - ContainerTag, DocumentMemoryEntry, DocumentWithMemories, DocumentsApiResponse, + NamespaceInfo, } -export type DocumentSummary = SdkDocumentListResponse["memories"][number] -export type DocumentDetails = DocumentGetResponse +export interface DocumentSummary { + id: string + title: string | null + type: string + status: string + createdAt: string + updatedAt: string + summary: string | null + url: string | null +} + +export type DocumentDetails = GetDocumentsResponse export interface DocumentsListResponse { documents: DocumentSummary[] - pagination: SdkDocumentListResponse["pagination"] + pagination: ListResponsePagination } -// Memory-entry shapes live in shared/types so the client parser and the -// listMemories output schema share one definition and can't drift. export type { MemoryEntry, MemoryEntryHistory } export type MemoryEntriesResponse = MemoriesList export type Memory = - | { - id: string - memory: string - similarity: number - title?: string - content?: string - } - | { - id: string - chunk: string - similarity: number - title?: string - content?: string - } + | { id: string; memory: string; similarity: number } + | { id: string; chunk: string; similarity: number } export interface SearchResult { results: Memory[] @@ -74,7 +73,6 @@ export interface Profile { export interface ProfileResponse { profile: Profile - searchResults?: SearchResult } export function getMemoryText(m: Memory): string { @@ -85,35 +83,50 @@ function limitByChars(text: string, maxChars = MAX_CHARS): string { return text.length > maxChars ? `${text.slice(0, maxChars)}...` : text } -const sdkResultSchema = z.looseObject({ - id: z.string(), - memory: z.string().nullish(), - chunk: z.string().nullish(), - content: z.string().nullish(), - similarity: z.number(), - title: z.string().nullish(), - context: z.string().nullish(), -}) - -function mapSdkResults(value: unknown): Memory[] { - return z - .array(sdkResultSchema) - .parse(value) - .map((result) => { - const text = limitByChars( - result.content || result.memory || result.chunk || result.context || "", - ) - const base = { +function mapSearchResults(results: SearchResponseResultsItem[]): Memory[] { + return results.map((result) => { + if (result.chunk && !result.memory) { + return { id: result.id, similarity: result.similarity, - ...(result.title ? { title: result.title } : {}), - ...(result.content ? { content: result.content } : {}), - } - if (result.chunk && !result.memory) { - return { ...base, chunk: text } + chunk: limitByChars(result.chunk), } - return { ...base, memory: text } - }) + } + return { + id: result.id, + similarity: result.similarity, + memory: limitByChars(result.memory ?? ""), + } + }) +} + +function mapDocumentSummary( + document: ListResponseDocumentsItem, +): DocumentSummary { + return { + id: document.id, + title: document.title, + type: document.type, + status: document.system.status, + createdAt: document.system.createdAt, + updatedAt: document.system.updatedAt, + summary: document.summary, + url: document.url, + } +} + +function mapMemoryEntry(memory: ListResponseMemoriesItem): MemoryEntry { + return { + id: memory.id, + memory: memory.memory, + version: memory.version, + isLatest: memory.isLatest, + isForgotten: memory.isForgotten, + isStatic: memory.isStatic, + isInference: memory.isInference, + createdAt: memory.system.createdAt, + updatedAt: memory.system.updatedAt, + } } function objectProperty(value: unknown, key: string): unknown { @@ -122,218 +135,191 @@ function objectProperty(value: unknown, key: string): unknown { : undefined } -// API error bodies are JSON like {"error": "..."} — unwrap them so users see -// the real reason instead of raw JSON or a generic fallback. +// Unwrap {"error": "..."} bodies so users see the real reason, not raw JSON. function extractApiErrorMessage(raw: unknown): string | undefined { - if (typeof raw !== "string" || !raw) return undefined + if (!raw) return undefined + if (typeof raw === "object") { + const error = objectProperty(raw, "error") + if (typeof error === "string" && error) return error + const message = objectProperty(raw, "message") + if (typeof message === "string" && message) return message + return undefined + } + if (typeof raw !== "string") return undefined try { - const parsed = JSON.parse(raw) as { error?: unknown; message?: unknown } - if (typeof parsed.error === "string" && parsed.error) return parsed.error - if (typeof parsed.message === "string" && parsed.message) - return parsed.message - } catch {} - return raw + return extractApiErrorMessage(JSON.parse(raw)) ?? raw + } catch { + return raw + } +} + +export interface NamespaceSettings { + namespace: string + supportingContext: string | null + createdAt: string + updatedAt: string +} + +const isNotFound = (error: unknown): boolean => { + const e = error as { statusCode?: number; status?: number } + return e?.statusCode === 404 || e?.status === 404 } export class SupermemoryClient { private client: Supermemory - private containerTag: string - private hasExplicitContainerTag: boolean + private namespace: string + private hasExplicitNamespace: boolean private bearerToken: string private apiUrl: string constructor( bearerToken: string, - containerTag?: string, + namespace?: string, apiUrl = "https://api.supermemory.ai", ) { this.bearerToken = bearerToken this.apiUrl = apiUrl this.client = new Supermemory({ apiKey: bearerToken, - baseURL: apiUrl, - timeout: FETCH_TIMEOUT_MS, - defaultHeaders: { "x-sm-source": MCP_SOURCE }, + baseUrl: apiUrl, + timeoutInSeconds: FETCH_TIMEOUT_MS / 1000, + headers: { "x-sm-source": MCP_SOURCE }, }) - this.hasExplicitContainerTag = Boolean(containerTag) - this.containerTag = containerTag || DEFAULT_PROJECT_ID + this.hasExplicitNamespace = Boolean(namespace) + this.namespace = namespace || DEFAULT_NAMESPACE } async createMemory( content: string, - ): Promise<{ id: string; status: string; containerTag: string }> { + ): Promise<{ id: string; status: string; namespace: string }> { try { - const result = await this.client.add({ + const result = await this.client.add(this.namespace, { content, - containerTag: this.containerTag, metadata: { sm_source: MCP_SOURCE }, }) return { id: result.id, - status: "queued", - containerTag: this.containerTag, + status: result.status, + namespace: this.namespace, } } catch (error) { this.handleOperationError("Create memory request", error) } } + // v5 has no exact-content forget: preview semantic matches, then forget the best one by ID. async forgetMemory( content: string, - ): Promise<{ success: boolean; message: string; containerTag: string }> { + ): Promise<{ success: boolean; message: string; namespace: string }> { try { - try { - const result = await this.client.memories.forget({ - content, - containerTag: this.containerTag, - }) - return { - success: true, - message: `Successfully forgot memory (exact match) with ID: ${result.id}`, - containerTag: this.containerTag, - } - } catch (error: unknown) { - const status = objectProperty(error, "status") - if (status !== 404) throw error - } - - const SIMILARITY_THRESHOLD = 0.85 - const searchResult = await this.search( - content, - 5, - SIMILARITY_THRESHOLD, - this.containerTag, + const preview = await this.client.memories.forgetMatching( + this.namespace, + { query: content, dryRun: true }, ) - - if (searchResult.results.length === 0) { + const match = preview.matches[0] + if (!match) { return { success: false, message: "No matching memory found to forget.", - containerTag: this.containerTag, + namespace: this.namespace, } } - const memoryToDelete = searchResult.results.find((r) => "memory" in r) - if (!memoryToDelete) { + const result = await this.client.memories.forget(this.namespace, { + ids: [match.id], + }) + if (result.count === 0) { + const reason = result.errors[0]?.error ?? "unknown error" return { success: false, - message: "No matching memory found (only chunks matched).", - containerTag: this.containerTag, + message: `Could not forget memory ${match.id}: ${reason}`, + namespace: this.namespace, } } - await this.client.memories.forget({ - id: memoryToDelete.id, - containerTag: this.containerTag, - }) - - const memoryText = - getMemoryText(memoryToDelete) || memoryToDelete.content || "" return { success: true, - message: `Forgot similar memory (similarity: ${memoryToDelete.similarity.toFixed(2)}): "${limitByChars(memoryText, 100)}"`, - containerTag: this.containerTag, + message: `Forgot memory (ID: ${match.id}): "${limitByChars(match.memory, 100)}"`, + namespace: this.namespace, } } catch (error) { this.handleOperationError("Forget memory request", error) } } - async search( - query: string, - limit = 10, - threshold?: number, - containerTagOverride?: string, - ): Promise { + async search(query: string, limit = 10): Promise { try { - const containerTag = - containerTagOverride ?? - (this.hasExplicitContainerTag ? this.containerTag : undefined) - const result = await this.client.search.memories({ - q: query, + const result = await this.client.search(this.namespace, { + query, limit, - ...(containerTag ? { containerTag } : {}), searchMode: "hybrid", - threshold, + threshold: SEARCH_THRESHOLD, }) - + const results = mapSearchResults(result.results) return { - results: mapSdkResults(result.results), - total: result.total, - timing: result.timing, + results, + total: results.length, + timing: result.searchTime, } } catch (error) { this.handleOperationError("Search request", error) } } - async getProfile(query?: string): Promise { - if (!this.hasExplicitContainerTag) { - return { - profile: { - static: [], - dynamic: [], - }, - } + async getProfile(): Promise { + if (!this.hasExplicitNamespace) { + return { profile: { static: [], dynamic: [] } } } try { - const result = await this.client.profile({ - containerTag: this.containerTag, - q: query, - }) - - const response: ProfileResponse = { + const result = await this.client.profile(this.namespace) + return { profile: { - static: result.profile?.static || [], - dynamic: result.profile?.dynamic || [], + static: result.profile.static.map((fact) => fact.memory), + dynamic: result.profile.dynamic.map((fact) => fact.memory), }, } - - if (result.searchResults) { - response.searchResults = { - results: mapSdkResults(result.searchResults.results), - total: result.searchResults.total, - timing: result.searchResults.timing, - } - } - - return response } catch (error) { this.handleOperationError("Profile request", error) } } - async listContainerTags(): Promise { + // v5 get returns settings only (no counts); null means missing or no access + async getNamespace(namespace: string): Promise { try { - const signal = AbortSignal.timeout(FETCH_TIMEOUT_MS) - const response = await fetch(`${this.apiUrl}/v3/container-tags/list`, { - method: "GET", - headers: { - Authorization: `Bearer ${this.bearerToken}`, - "Content-Type": "application/json", - "x-sm-source": MCP_SOURCE, - }, - signal, - }) - - if (!response.ok) { - if (response.status === 401) { - throw new Error("Authentication failed. Please re-authenticate.") - } - throw new Error( - `Failed to fetch container tags: ${response.statusText}`, - ) + const entry = await this.client.namespaces.get(namespace) + return { + namespace: entry.namespace, + supportingContext: entry.supportingContext, + createdAt: entry.system.createdAt, + updatedAt: entry.system.updatedAt, } + } catch (error) { + if (isNotFound(error)) return null + this.handleError(error) + } + } - return z.array(containerTagSchema).parse(await response.json()) + // One page is enough for pickers; single-namespace reads use getNamespace + async listNamespaces(limit = NAMESPACE_PAGE_LIMIT): Promise { + try { + const result = await this.client.namespaces.list({ page: 1, limit }) + return result.namespaces.map((entry) => ({ + id: entry.id, + namespace: entry.namespace, + description: entry.description, + documentCount: entry.documentCount, + memoryCount: entry.memoryCount, + createdAt: entry.system.createdAt, + updatedAt: entry.system.updatedAt, + })) } catch (error) { this.handleError(error) } } - async getDocuments( - containerTags?: string[], + // v5 has no graph route; this stays on the legacy endpoint until one ships. + async getGraphDocuments( page = 1, limit = 200, options?: { signal?: AbortSignal }, @@ -352,7 +338,7 @@ export class SupermemoryClient { limit, sort: "createdAt", order: "desc", - containerTags, + containerTags: [this.namespace], }), signal, }) @@ -370,17 +356,14 @@ export class SupermemoryClient { async listDocuments(page = 1, limit = 50): Promise { try { - const result = await this.client.documents.list({ - containerTags: [this.containerTag], + const result = await this.client.list(this.namespace, "documents", { page, limit, sort: "createdAt", order: "desc", - includeContent: false, }) - return { - documents: result.memories ?? [], + documents: result.documents.map(mapDocumentSummary), pagination: result.pagination, } } catch (error) { @@ -390,7 +373,7 @@ export class SupermemoryClient { async getDocument(id: string): Promise { try { - return await this.client.documents.get(id) + return await this.client.documents.get(this.namespace, id) } catch (error) { this.handleError(error) } @@ -401,46 +384,36 @@ export class SupermemoryClient { limit = 50, ): Promise { try { - const response = await fetch(`${this.apiUrl}/v4/memories/list`, { - method: "POST", - headers: { - Authorization: `Bearer ${this.bearerToken}`, - "Content-Type": "application/json", - "x-sm-source": MCP_SOURCE, - }, - body: JSON.stringify({ - containerTags: [this.containerTag], - page, - limit, - sort: "createdAt", - order: "desc", - }), - signal: AbortSignal.timeout(FETCH_TIMEOUT_MS), + const result = await this.client.list(this.namespace, "memories", { + page, + limit, + sort: "createdAt", + order: "desc", }) - - if (!response.ok) { - const message = extractApiErrorMessage(await response.text()) - throw Object.assign(new Error(message ?? ""), { - status: response.status, - }) + return { + memoryEntries: result.memories.map(mapMemoryEntry), + pagination: { + currentPage: result.pagination.currentPage, + limit: result.pagination.limit ?? limit, + totalItems: result.pagination.totalItems, + totalPages: result.pagination.totalPages, + }, } - - return memoriesListSchema.parse(await response.json()) } catch (error) { this.handleError(error) } } private handleError(error: unknown): never { - // Handle request timeout (AbortSignal.timeout or explicit abort) if ( error instanceof Error && - (error.name === "AbortError" || error.name === "TimeoutError") + (error.name === "AbortError" || + error.name === "TimeoutError" || + error.name === "SupermemoryTimeoutError") ) { throw new Error("Request to Supermemory API timed out") } - // Handle network/fetch errors if (error instanceof TypeError) { if ( error.message.includes("fetch") || @@ -450,9 +423,17 @@ export class SupermemoryClient { } } - const status = objectProperty(error, "status") + // SDK errors carry statusCode and body; raw fetch errors carry status and message. + const statusCode = objectProperty(error, "statusCode") + const status = + typeof statusCode === "number" + ? statusCode + : objectProperty(error, "status") if (typeof status === "number") { - const message = extractApiErrorMessage(objectProperty(error, "message")) + const message = + typeof statusCode === "number" + ? extractApiErrorMessage(objectProperty(error, "body")) + : extractApiErrorMessage(objectProperty(error, "message")) switch (status) { case 400: case 422: diff --git a/apps/mcp/src/server/format.ts b/apps/mcp/src/server/format.ts index b4dd07a5d..d177ac680 100644 --- a/apps/mcp/src/server/format.ts +++ b/apps/mcp/src/server/format.ts @@ -132,15 +132,7 @@ export function getDocumentContent(document: DocumentDetails): { content: string | null truncated: boolean } { - let content: string | null = null - if (typeof document.raw === "string" && document.raw.trim()) { - content = document.raw - } else if (document.raw !== null && document.raw !== undefined) { - content = JSON.stringify(document.raw, null, 2) - } else if (document.content?.trim()) { - content = document.content - } - + const content = document.content?.trim() ? document.content : null if (!content) return { content: null, truncated: false } const truncated = content.length > MAX_DOCUMENT_CONTENT_CHARS return { @@ -155,12 +147,11 @@ export function formatDocument(document: DocumentDetails): string { `# ${title}`, `Document ID: ${document.id}`, `Type: ${document.type}`, - `Status: ${document.status}`, - `Created: ${document.createdAt}`, - `Updated: ${document.updatedAt}`, + `Status: ${document.system.status}`, + `Created: ${document.system.createdAt}`, + `Updated: ${document.system.updatedAt}`, ] - if (document.url) parts.push(`URL: ${document.url}`) if (document.summary?.trim()) { parts.push("", "## Summary", compactText(document.summary, 4_000)) } diff --git a/apps/mcp/src/server/index.ts b/apps/mcp/src/server/index.ts index 70505a21f..eef351c21 100644 --- a/apps/mcp/src/server/index.ts +++ b/apps/mcp/src/server/index.ts @@ -273,13 +273,14 @@ app.post("/upload/:uploadId", async (c) => { const uploadState = c.env.SPACE_STATE.getByName(uploadStateName(uploadId)) const session = await uploadState.consumeUploadSession(uploadToken) - if (!session) { + if (!session?.namespace) { return c.json({ error: "Invalid or expired upload session" }, 401) } const apiUrl = (c.env.API_URL || DEFAULT_API_URL).replace(/\/+$/, "") try { - const response = await fetch(`${apiUrl}/v3/documents/file`, { + const namespace = encodeURIComponent(session.namespace) + const response = await fetch(`${apiUrl}/ns/${namespace}/document/file`, { method: "POST", headers: { Authorization: `Bearer ${session.bearerToken}`, diff --git a/apps/mcp/src/server/container-tag.ts b/apps/mcp/src/server/namespace.ts similarity index 63% rename from apps/mcp/src/server/container-tag.ts rename to apps/mcp/src/server/namespace.ts index 0924e7584..3e9b0e3ed 100644 --- a/apps/mcp/src/server/container-tag.ts +++ b/apps/mcp/src/server/namespace.ts @@ -1,12 +1,12 @@ import { z } from "zod" -export const containerTagSchema = z +export const namespaceSchema = z .string() - .min(1, "Container tag is required") - .max(128, "Container tag exceeds maximum length") + .min(1, "Namespace is required") + .max(128, "Namespace exceeds maximum length") .describe("Space key returned by list_spaces") -export const optionalContainerTagSchema = containerTagSchema +export const optionalNamespaceSchema = namespaceSchema .optional() .describe( "Space key to use for this call. If the user names a space, call list_spaces to resolve its key and pass it here. If no space is named, omit this field so the server uses the active space or account default.", diff --git a/apps/mcp/src/server/prompts/context.ts b/apps/mcp/src/server/prompts/context.ts index 900bce5c2..ad3ee9c14 100644 --- a/apps/mcp/src/server/prompts/context.ts +++ b/apps/mcp/src/server/prompts/context.ts @@ -1,11 +1,10 @@ import type { McpServer } from "@modelcontextprotocol/server" -import { DEFAULT_PROJECT_ID, type SupermemoryClient } from "../client" +import { DEFAULT_NAMESPACE, type SupermemoryClient } from "../client" import { compactDescription, formatFactSection, formatSpaceRow, sortSpaces, - spaceDisplayName, spaceMetadata, } from "../space-presentation" @@ -14,8 +13,8 @@ const RECENT_SPACE_LIMIT = 3 export function registerContextPrompt( server: McpServer, - getClient: (tag?: string) => SupermemoryClient, - resolveContainerTag: () => Promise, + getClient: (namespace?: string) => SupermemoryClient, + resolveNamespace: () => Promise, ) { server.registerPrompt( "context", @@ -24,20 +23,19 @@ export function registerContextPrompt( }, async () => { try { - const selectedTag = await resolveContainerTag() - const activeKey = selectedTag ?? DEFAULT_PROJECT_ID + const selectedNamespace = await resolveNamespace() + const activeKey = selectedNamespace ?? DEFAULT_NAMESPACE const [profileResult, spaces] = await Promise.all([ getClient(activeKey).getProfile(), - getClient().listContainerTags(), + getClient().listNamespaces(), ]) const activeSpace = spaces.find( - (space) => space.containerTag === activeKey, + (space) => space.namespace === activeKey, ) - const activeLabel = spaceDisplayName(activeSpace, activeKey) - const fallback = selectedTag ? "" : " (default)" + const fallback = selectedNamespace ? "" : " (default)" const parts: string[] = [ "# Supermemory Context", - `Active space: ${activeLabel} [${activeKey}]${fallback}`, + `Active space: ${activeKey}${fallback}`, ] if (activeSpace) { @@ -69,7 +67,7 @@ export function registerContextPrompt( } const recentSpaces = sortSpaces(spaces, activeKey) - .filter((space) => space.containerTag !== activeKey) + .filter((space) => space.namespace !== activeKey) .slice(0, RECENT_SPACE_LIMIT) if (recentSpaces.length > 0) { parts.push( diff --git a/apps/mcp/src/server/resources/container-tags.ts b/apps/mcp/src/server/resources/container-tags.ts deleted file mode 100644 index 14730d7a2..000000000 --- a/apps/mcp/src/server/resources/container-tags.ts +++ /dev/null @@ -1,46 +0,0 @@ -import type { McpServer } from "@modelcontextprotocol/server" -import { DEFAULT_PROJECT_ID, type SupermemoryClient } from "../client" -import { - formatSpaceRow, - sortSpaces, - spaceDisplayName, -} from "../space-presentation" - -export function registerContainerTagsResource( - server: McpServer, - getClient: () => SupermemoryClient, - resolveContainerTag: () => Promise, -) { - server.registerResource("My Spaces", "supermemory://spaces", {}, async () => { - const client = getClient() - const [containerTags, selectedTag] = await Promise.all([ - client.listContainerTags(), - resolveContainerTag(), - ]) - const activeKey = selectedTag ?? DEFAULT_PROJECT_ID - const activeSpace = containerTags.find( - (space) => space.containerTag === activeKey, - ) - const rows = sortSpaces(containerTags, activeKey).map((space) => - formatSpaceRow(space, activeKey), - ) - const activeLabel = spaceDisplayName(activeSpace, activeKey) - const fallback = selectedTag ? "" : " (default)" - const text = [ - "# My Spaces", - `${containerTags.length} available · Active: ${activeLabel} [${activeKey}]${fallback}`, - "", - ...rows, - ].join("\n") - - return { - contents: [ - { - uri: "supermemory://spaces", - mimeType: "text/plain", - text, - }, - ], - } - }) -} diff --git a/apps/mcp/src/server/resources/namespaces.ts b/apps/mcp/src/server/resources/namespaces.ts new file mode 100644 index 000000000..6b0e187a2 --- /dev/null +++ b/apps/mcp/src/server/resources/namespaces.ts @@ -0,0 +1,38 @@ +import type { McpServer } from "@modelcontextprotocol/server" +import { DEFAULT_NAMESPACE, type SupermemoryClient } from "../client" +import { formatSpaceRow, sortSpaces } from "../space-presentation" + +export function registerNamespacesResource( + server: McpServer, + getClient: () => SupermemoryClient, + resolveNamespace: () => Promise, +) { + server.registerResource("My Spaces", "supermemory://spaces", {}, async () => { + const client = getClient() + const [namespaces, selectedNamespace] = await Promise.all([ + client.listNamespaces(), + resolveNamespace(), + ]) + const activeKey = selectedNamespace ?? DEFAULT_NAMESPACE + const rows = sortSpaces(namespaces, activeKey).map((space) => + formatSpaceRow(space, activeKey), + ) + const fallback = selectedNamespace ? "" : " (default)" + const text = [ + "# My Spaces", + `${namespaces.length} available · Active: ${activeKey}${fallback}`, + "", + ...rows, + ].join("\n") + + return { + contents: [ + { + uri: "supermemory://spaces", + mimeType: "text/plain", + text, + }, + ], + } + }) +} diff --git a/apps/mcp/src/server/resources/profile.ts b/apps/mcp/src/server/resources/profile.ts index b203ae1b0..c5bc63889 100644 --- a/apps/mcp/src/server/resources/profile.ts +++ b/apps/mcp/src/server/resources/profile.ts @@ -1,9 +1,8 @@ import type { McpServer } from "@modelcontextprotocol/server" -import { DEFAULT_PROJECT_ID, type SupermemoryClient } from "../client" +import { DEFAULT_NAMESPACE, type SupermemoryClient } from "../client" import { compactDescription, formatFactSection, - spaceDisplayName, spaceMetadata, } from "../space-presentation" @@ -11,28 +10,25 @@ const PROFILE_FACT_LIMIT = 12 export function registerProfileResource( server: McpServer, - getClient: (containerTag?: string) => SupermemoryClient, - resolveContainerTag: () => Promise, + getClient: (namespace?: string) => SupermemoryClient, + resolveNamespace: () => Promise, ) { server.registerResource( "Active Space Profile", "supermemory://profile", {}, async () => { - const selectedTag = await resolveContainerTag() - const activeKey = selectedTag ?? DEFAULT_PROJECT_ID + const selectedNamespace = await resolveNamespace() + const activeKey = selectedNamespace ?? DEFAULT_NAMESPACE const [profileResult, spaces] = await Promise.all([ getClient(activeKey).getProfile(), - getClient().listContainerTags(), + getClient().listNamespaces(), ]) - const activeSpace = spaces.find( - (space) => space.containerTag === activeKey, - ) - const activeLabel = spaceDisplayName(activeSpace, activeKey) - const fallback = selectedTag ? "" : " (default)" + const activeSpace = spaces.find((space) => space.namespace === activeKey) + const fallback = selectedNamespace ? "" : " (default)" const parts: string[] = [ "# Active Space Profile", - `Space: ${activeLabel} [${activeKey}]${fallback}`, + `Space: ${activeKey}${fallback}`, ] if (activeSpace) { diff --git a/apps/mcp/src/server/server.ts b/apps/mcp/src/server/server.ts index 8c0857ed7..809b9f049 100644 --- a/apps/mcp/src/server/server.ts +++ b/apps/mcp/src/server/server.ts @@ -5,16 +5,16 @@ import { } from "@modelcontextprotocol/server" import { instrumentPosthogMcp, type WaitUntil } from "./analytics" import { fetchSession } from "./auth" -import { DEFAULT_PROJECT_ID, SupermemoryClient } from "./client" +import { DEFAULT_NAMESPACE, SupermemoryClient } from "./client" import { registerContextPrompt } from "./prompts/context" -import { registerContainerTagsResource } from "./resources/container-tags" +import { registerNamespacesResource } from "./resources/namespaces" 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 resolveSpaceContainerTag, + resolveNamespace as resolveSpaceNamespace, spaceStateName, } from "./space" import { uploadStateName } from "./space-state" @@ -59,16 +59,16 @@ export function createSupermemoryServer( const apiUrl = env.API_URL || DEFAULT_API_URL const spaceState = env.SPACE_STATE.getByName(spaceStateName(actor)) - const getClient = (containerTag?: string) => - new SupermemoryClient(actor.bearerToken, containerTag, apiUrl) - const getActiveContainerTag = () => spaceState.getActiveContainerTag() - const setActiveContainerTag = (containerTag: string) => - spaceState.setActiveContainerTag(containerTag) - const resolveSelectedContainerTag = (explicit?: string) => - resolveSpaceContainerTag(explicit, getActiveContainerTag) - const resolveContainerTag = async (explicit?: string) => - (await resolveSelectedContainerTag(explicit)) ?? DEFAULT_PROJECT_ID - const createUploadSession = async () => { + const getClient = (namespace?: string) => + new SupermemoryClient(actor.bearerToken, namespace, apiUrl) + const getActiveNamespace = () => spaceState.getActiveNamespace() + const setActiveNamespace = (namespace: string) => + spaceState.setActiveNamespace(namespace) + const resolveSelectedNamespace = (explicit?: string) => + resolveSpaceNamespace(explicit, getActiveNamespace) + const resolveNamespace = async (explicit?: string) => + (await resolveSelectedNamespace(explicit)) ?? DEFAULT_NAMESPACE + const createUploadSession = async (namespace: string) => { const uploadId = crypto.randomUUID() const uploadToken = [crypto.randomUUID(), crypto.randomUUID()] .join("") @@ -77,6 +77,7 @@ export function createSupermemoryServer( const uploadState = env.SPACE_STATE.getByName(uploadStateName(uploadId)) await uploadState.createUploadSession(uploadToken, { bearerToken: actor.bearerToken, + namespace, expiresAt, }) return { @@ -90,22 +91,29 @@ export function createSupermemoryServer( actor, getClient, getSession: () => fetchSession(actor.bearerToken, apiUrl), - resolveContainerTag, - getActiveContainerTag, - setActiveContainerTag, + resolveNamespace, + getActiveNamespace, + setActiveNamespace, createUploadSession, getClientInfo: clientInfoFromContext, errorResult, }) - registerProfileResource(server, getClient, resolveSelectedContainerTag) - registerContainerTagsResource( + // Clients that cached the pre-v5 tool list refetch it on this notice + server.server.oninitialized = () => { + try { + server.sendToolListChanged() + } catch {} + } + + registerProfileResource(server, getClient, resolveSelectedNamespace) + registerNamespacesResource( server, () => getClient(), - resolveSelectedContainerTag, + resolveSelectedNamespace, ) registerWidgetResource(server, mcpOrigin) - registerContextPrompt(server, getClient, resolveSelectedContainerTag) + registerContextPrompt(server, getClient, resolveSelectedNamespace) return server } diff --git a/apps/mcp/src/server/space-presentation.ts b/apps/mcp/src/server/space-presentation.ts index 2038f6f65..d1881ce1f 100644 --- a/apps/mcp/src/server/space-presentation.ts +++ b/apps/mcp/src/server/space-presentation.ts @@ -1,17 +1,10 @@ -import type { ContainerTag } from "../shared/types" +import type { NamespaceInfo } from "../shared/types" const DEFAULT_DESCRIPTION_LIMIT = 160 const plural = (count: number, singular: string, pluralForm: string) => `${count} ${count === 1 ? singular : pluralForm}` -export function spaceDisplayName( - space: ContainerTag | undefined, - key: string, -): string { - return space?.name || key -} - export function compactDescription( description: string | null | undefined, limit = DEFAULT_DESCRIPTION_LIMIT, @@ -39,12 +32,9 @@ export function formatActivityDate(value: string | null): string | undefined { }).format(date) } -export function spaceMetadata(space: ContainerTag): string { - const lastActivity = formatActivityDate(space.lastActivityAt ?? null) +export function spaceMetadata(space: NamespaceInfo): string { + const lastActivity = formatActivityDate(space.updatedAt) const fields = [ - space.visibility - ? `${space.visibility.charAt(0).toUpperCase()}${space.visibility.slice(1)}` - : undefined, plural(space.documentCount, "document", "documents"), plural(space.memoryCount, "memory", "memories"), lastActivity ? `Last active ${lastActivity}` : undefined, @@ -54,35 +44,28 @@ export function spaceMetadata(space: ContainerTag): string { } export function formatSpaceRow( - space: ContainerTag, + space: NamespaceInfo, activeKey: string, descriptionLimit = DEFAULT_DESCRIPTION_LIMIT, ): string { - const active = space.containerTag === activeKey ? " · Active" : "" + const active = space.namespace === activeKey ? " · Active" : "" const metadata = spaceMetadata(space) const description = compactDescription(space.description, descriptionLimit) - const firstLine = - `- ${spaceDisplayName(space, space.containerTag)} ` + - `[${space.containerTag}]${active}${metadata ? ` · ${metadata}` : ""}` + const firstLine = `- ${space.namespace}${active}${metadata ? ` · ${metadata}` : ""}` return description ? `${firstLine}\n ${description}` : firstLine } export function sortSpaces( - spaces: ContainerTag[], + spaces: NamespaceInfo[], activeKey: string, -): ContainerTag[] { +): NamespaceInfo[] { return [...spaces].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 + if (left.namespace === activeKey) return -1 + if (right.namespace === activeKey) return 1 + return ( + new Date(right.updatedAt).getTime() - new Date(left.updatedAt).getTime() + ) }) } diff --git a/apps/mcp/src/server/space-state.ts b/apps/mcp/src/server/space-state.ts index 6caf52000..480d830ff 100644 --- a/apps/mcp/src/server/space-state.ts +++ b/apps/mcp/src/server/space-state.ts @@ -1,11 +1,13 @@ import { DurableObject } from "cloudflare:workers" -import { containerTagSchema } from "./container-tag" +import { namespaceSchema } from "./namespace" -const ACTIVE_CONTAINER_TAG_KEY = "activeContainerTag" +// Stored key keeps its legacy name so existing users keep their active space. +const ACTIVE_NAMESPACE_KEY = "activeContainerTag" const UPLOAD_SESSION_KEY = "uploadSession" export interface UploadSession { bearerToken: string + namespace: string expiresAt: number } @@ -24,13 +26,15 @@ export function uploadStateName(uploadId: string): string { } export class SpaceState extends DurableObject { - async getActiveContainerTag(): Promise { - return this.ctx.storage.get(ACTIVE_CONTAINER_TAG_KEY) + async getActiveNamespace(): Promise { + return this.ctx.storage.get(ACTIVE_NAMESPACE_KEY) } - async setActiveContainerTag(containerTag: string): Promise { - const validatedTag = containerTagSchema.parse(containerTag) - await this.ctx.storage.put(ACTIVE_CONTAINER_TAG_KEY, validatedTag) + async setActiveNamespace(namespace: string): Promise { + await this.ctx.storage.put( + ACTIVE_NAMESPACE_KEY, + namespaceSchema.parse(namespace), + ) } async createUploadSession( @@ -62,6 +66,7 @@ export class SpaceState extends DurableObject { await transaction.delete(UPLOAD_SESSION_KEY) return { bearerToken: session.bearerToken, + namespace: session.namespace, expiresAt: session.expiresAt, } }) diff --git a/apps/mcp/src/server/space.test.ts b/apps/mcp/src/server/space.test.ts index 0af5dfde5..c035e834e 100644 --- a/apps/mcp/src/server/space.test.ts +++ b/apps/mcp/src/server/space.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it, vi } from "vitest" -import { optionalContainerTagSchema } from "./container-tag" -import { resolveContainerTag, spaceStateName } from "./space" +import { optionalNamespaceSchema } from "./namespace" +import { resolveNamespace, spaceStateName } from "./space" describe("space application state", () => { it("keys active state by organization and user without collisions", () => { @@ -20,7 +20,7 @@ describe("space application state", () => { it("uses an explicit tool argument without reading active state", async () => { const getActive = vi.fn().mockResolvedValue("active") - await expect(resolveContainerTag("explicit", getActive)).resolves.toBe( + await expect(resolveNamespace("explicit", getActive)).resolves.toBe( "explicit", ) expect(getActive).not.toHaveBeenCalled() @@ -28,18 +28,18 @@ describe("space application state", () => { it("falls back to durable active state and then the client default", async () => { await expect( - resolveContainerTag(undefined, vi.fn().mockResolvedValue("active")), + resolveNamespace(undefined, vi.fn().mockResolvedValue("active")), ).resolves.toBe("active") await expect( - resolveContainerTag(undefined, vi.fn().mockResolvedValue(undefined)), + resolveNamespace(undefined, vi.fn().mockResolvedValue(undefined)), ).resolves.toBeUndefined() }) it("tells the model how to route explicit space requests", () => { - expect(optionalContainerTagSchema.description).toContain( + expect(optionalNamespaceSchema.description).toContain( "If the user names a space", ) - expect(optionalContainerTagSchema.description).toContain("list_spaces") - expect(optionalContainerTagSchema.description).toContain("active space") + expect(optionalNamespaceSchema.description).toContain("list_spaces") + expect(optionalNamespaceSchema.description).toContain("active space") }) }) diff --git a/apps/mcp/src/server/space.ts b/apps/mcp/src/server/space.ts index 18f61612c..4812c0145 100644 --- a/apps/mcp/src/server/space.ts +++ b/apps/mcp/src/server/space.ts @@ -6,9 +6,9 @@ export function spaceStateName( return `space:${JSON.stringify([actor.organizationId, actor.userId])}` } -export async function resolveContainerTag( +export async function resolveNamespace( explicit: string | undefined, - getActiveContainerTag: () => Promise, + getActiveNamespace: () => Promise, ): Promise { - return explicit ?? (await getActiveContainerTag()) + return explicit ?? (await getActiveNamespace()) } diff --git a/apps/mcp/src/server/tools/add-memory.ts b/apps/mcp/src/server/tools/add-memory.ts index c708deb50..104dd87bf 100644 --- a/apps/mcp/src/server/tools/add-memory.ts +++ b/apps/mcp/src/server/tools/add-memory.ts @@ -1,5 +1,10 @@ import { z } from "zod" -import { optionalContainerTagSchema } from "../container-tag" +import { optionalNamespaceSchema } from "../namespace" +import { + legacyNamespaceInput, + namespaceArg, + withLegacyNamespace, +} from "./compat" import { MEMORY_TOOL_ANNOTATIONS } from "./annotations" import { addMemoryOutputSchema, type AddMemoryOutput } from "./output-schemas" import { textContent, type ToolDeps } from "./types" @@ -11,31 +16,32 @@ export function register(deps: ToolDeps) { .max(200000, "Content exceeds maximum length") .describe("The memory content to save or forget"), action: z.enum(["save", "forget"]).optional().default("save"), - containerTag: optionalContainerTagSchema, + namespace: optionalNamespaceSchema, + ...legacyNamespaceInput, }) deps.server.registerTool( "add_memory", { description: - "Add (save) or forget a memory in the user's ACTIVE space. Defaults to 'save'. The target space is the one the user selected via select-space; pass containerTag only to override it. Use 'forget' when information is outdated or the user asks to remove it.", + "Add (save) or forget a memory in the user's ACTIVE space. Defaults to 'save'. The target space is the one the user selected via select-space; pass namespace only to override it. Use 'forget' when information is outdated or the user asks to remove it.", inputSchema, outputSchema: addMemoryOutputSchema, annotations: MEMORY_TOOL_ANNOTATIONS, }, async (args) => { try { - const effectiveTag = await deps.resolveContainerTag(args.containerTag) - const client = deps.getClient(effectiveTag) + const namespace = await deps.resolveNamespace(namespaceArg(args)) + const client = deps.getClient(namespace) if (args.action === "forget") { const result = await client.forgetMemory(args.content) - const structuredContent: AddMemoryOutput = { + const structuredContent: AddMemoryOutput = withLegacyNamespace({ action: "forget", success: result.success, - containerTag: result.containerTag, + namespace: result.namespace, message: result.message, - } + }) return { content: [textContent(result.message)], structuredContent, @@ -43,15 +49,15 @@ export function register(deps: ToolDeps) { } const result = await client.createMemory(args.content) - const message = `Memory saved (ID: ${result.id}, space: ${result.containerTag})` - const structuredContent: AddMemoryOutput = { + const message = `Memory saved (ID: ${result.id}, space: ${result.namespace})` + const structuredContent: AddMemoryOutput = withLegacyNamespace({ action: "save", success: true, - containerTag: result.containerTag, + namespace: result.namespace, message, id: result.id, status: result.status, - } + }) return { content: [textContent(message)], structuredContent, diff --git a/apps/mcp/src/server/tools/compat.test.ts b/apps/mcp/src/server/tools/compat.test.ts new file mode 100644 index 000000000..5eba1d1a1 --- /dev/null +++ b/apps/mcp/src/server/tools/compat.test.ts @@ -0,0 +1,178 @@ +import { describe, expect, it, vi } from "vitest" +import { z } from "zod" +import * as addMemory from "./add-memory" +import { namespaceArg, withLegacyView } from "./compat" +import * as listNamespaces from "./list-namespaces" +import * as setActiveTag from "./set-active-tag" +import type { ToolDeps } from "./types" +import { errorResult } from "./types" + +type Registered = { + config: { inputSchema: z.ZodTypeAny; outputSchema: z.ZodTypeAny } + cb: ( + args: Record, + context: unknown, + ) => Promise<{ + structuredContent?: Record + isError?: boolean + }> +} + +function fakeDeps() { + const tools = new Map() + const client = { + createMemory: vi.fn().mockResolvedValue({ + id: "d1", + status: "queued", + namespace: "legacy_ns", + }), + getNamespace: vi.fn().mockImplementation(async (ns: string) => + ns === "legacy_ns" + ? { + namespace: ns, + supportingContext: null, + createdAt: "2026-01-01", + updatedAt: "2026-01-02", + } + : null, + ), + listNamespaces: vi.fn().mockResolvedValue([ + { + id: "1", + namespace: "legacy_ns", + description: null, + documentCount: 2, + memoryCount: 1, + createdAt: "2026-01-01", + updatedAt: "2026-01-02", + }, + ]), + } + const deps = { + server: { + registerTool: (name: string, config: unknown, cb: unknown) => { + tools.set(name, { config, cb } as Registered) + }, + }, + getClient: vi.fn(() => client), + resolveNamespace: vi.fn(async (explicit?: string) => explicit ?? "active"), + setActiveNamespace: vi.fn(async () => {}), + errorResult, + } as unknown as ToolDeps + return { deps, tools, client } +} + +// Shape a client that cached the pre-v5 tool list validates against +const legacyAddMemoryOutput = z.object({ + action: z.enum(["save", "forget"]), + success: z.boolean(), + containerTag: z.string(), + message: z.string(), +}) + +describe("containerTag compatibility", () => { + it("prefers namespace and falls back to the deprecated containerTag", () => { + expect(namespaceArg({ namespace: "a", containerTag: "b" })).toBe("a") + expect(namespaceArg({ containerTag: "b" })).toBe("b") + expect(namespaceArg({})).toBeUndefined() + }) + + it("accepts containerTag input and ignores unknown keys", () => { + const { deps, tools } = fakeDeps() + addMemory.register(deps) + const tool = tools.get("add_memory") + if (!tool) throw new Error("add_memory not registered") + const parsed = tool.config.inputSchema.parse({ + content: "hi", + containerTag: "legacy_ns", + somethingElse: 1, + }) as { namespace?: string; containerTag?: string } + expect(parsed.containerTag).toBe("legacy_ns") + expect(parsed.namespace).toBeUndefined() + }) + + it("routes a containerTag-only call to that namespace and emits both keys", async () => { + const { deps, tools } = fakeDeps() + addMemory.register(deps) + const tool = tools.get("add_memory") + if (!tool) throw new Error("add_memory not registered") + const result = await tool.cb( + { content: "hi", action: "save", containerTag: "legacy_ns" }, + {}, + ) + expect(deps.getClient).toHaveBeenCalledWith("legacy_ns") + expect(result.structuredContent).toMatchObject({ + namespace: "legacy_ns", + containerTag: "legacy_ns", + }) + expect(() => + tool.config.outputSchema.parse(result.structuredContent), + ).not.toThrow() + expect(() => + legacyAddMemoryOutput.parse(result.structuredContent), + ).not.toThrow() + }) + + it("treats containerTag as the required namespace for set-active-tag", async () => { + const { deps, tools } = fakeDeps() + setActiveTag.register(deps) + const tool = tools.get("set-active-tag") + if (!tool) throw new Error("set-active-tag not registered") + const result = await tool.cb({ containerTag: "legacy_ns" }, {}) + expect(deps.setActiveNamespace).toHaveBeenCalledWith("legacy_ns") + expect(result.structuredContent).toMatchObject({ + view: "confirmation", + namespace: "legacy_ns", + containerTag: "legacy_ns", + }) + const missing = await tool.cb({}, {}) + expect(missing.isError).toBe(true) + }) + + it("lists spaces with both keys per item", async () => { + const { deps, tools } = fakeDeps() + listNamespaces.register(deps) + const tool = tools.get("list_spaces") + if (!tool) throw new Error("list_spaces not registered") + const result = await tool.cb({}, {}) + expect(result.structuredContent?.spaces).toEqual([ + expect.objectContaining({ + namespace: "legacy_ns", + containerTag: "legacy_ns", + }), + ]) + expect(() => + tool.config.outputSchema.parse(result.structuredContent), + ).not.toThrow() + }) + + it("mirrors renamed view fields under their old names", () => { + const picker = withLegacyView({ + view: "picker", + namespaces: [ + { + id: "1", + namespace: "ns", + documentCount: 0, + memoryCount: 0, + createdAt: "a", + updatedAt: "b", + }, + ], + activeNamespace: "ns", + assignedNamespaces: [{ namespace: "ns", permission: "write" }], + }) + expect(picker).toMatchObject({ + activeTag: "ns", + containerTags: [{ namespace: "ns", containerTag: "ns" }], + assignedTags: [{ namespace: "ns", containerTag: "ns" }], + }) + expect( + withLegacyView({ + view: "save", + activeNamespace: "ns", + writableNamespaces: ["ns"], + }), + ).toMatchObject({ activeTag: "ns", writableTags: ["ns"] }) + }) +}) diff --git a/apps/mcp/src/server/tools/compat.ts b/apps/mcp/src/server/tools/compat.ts new file mode 100644 index 000000000..37d9e4524 --- /dev/null +++ b/apps/mcp/src/server/tools/compat.ts @@ -0,0 +1,62 @@ +import { z } from "zod" +import type { + NamespaceAccess, + NamespaceInfo, + ViewMessage, +} from "../../shared/types" +import { namespaceSchema } from "../namespace" + +// Clients that cached the pre-v5 tool list still send and expect containerTag; drop once PostHog shows no containerTag args for 2 weeks. +export const legacyNamespaceInput = { + containerTag: namespaceSchema + .optional() + .describe("Deprecated alias of namespace. Prefer namespace."), +} + +export const legacyNamespaceOutput = { containerTag: z.string().optional() } + +export const namespaceArg = (args: { + namespace?: string + containerTag?: string +}) => args.namespace ?? args.containerTag + +export function withLegacyNamespace(value: T) { + return { ...value, containerTag: value.namespace } +} + +export const withLegacyNamespaces = ( + values: T[], +) => values.map(withLegacyNamespace) + +const legacyAccess = (values: NamespaceAccess[] | null | undefined) => + values ? withLegacyNamespaces(values) : values + +const legacyInfos = (values: NamespaceInfo[]) => withLegacyNamespaces(values) + +// Mirrors every renamed view field under its pre-v5 name so cached output schemas still validate. +export function withLegacyView(view: ViewMessage): ViewMessage { + switch (view.view) { + case "picker": + return { + ...view, + namespaces: legacyInfos(view.namespaces), + containerTags: legacyInfos(view.namespaces), + activeTag: view.activeNamespace, + assignedNamespaces: legacyAccess(view.assignedNamespaces), + assignedTags: legacyAccess(view.assignedNamespaces), + } + case "save": + case "upload": + return { + ...view, + activeTag: view.activeNamespace, + writableTags: view.writableNamespaces, + } + case "confirmation": + case "save-success": + case "upload-success": + return { ...view, containerTag: view.namespace } + case "graph": + return { ...view, containerTag: view.namespace } + } +} diff --git a/apps/mcp/src/server/tools/fetch-graph-data.ts b/apps/mcp/src/server/tools/fetch-graph-data.ts index d86fe12e2..cfdc7da64 100644 --- a/apps/mcp/src/server/tools/fetch-graph-data.ts +++ b/apps/mcp/src/server/tools/fetch-graph-data.ts @@ -1,7 +1,8 @@ import { z } from "zod" import { documentsApiResponseSchema } from "../../shared/types" import { appToolMeta } from "../app-metadata" -import { optionalContainerTagSchema } from "../container-tag" +import { optionalNamespaceSchema } from "../namespace" +import { legacyNamespaceInput, namespaceArg } from "./compat" import { READ_ONLY_TOOL_ANNOTATIONS } from "./annotations" import { textContent, type ToolDeps } from "./types" @@ -11,7 +12,8 @@ export function register(deps: ToolDeps) { { description: "Fetch documents with memories for graph display", inputSchema: z.object({ - containerTag: optionalContainerTagSchema, + namespace: optionalNamespaceSchema, + ...legacyNamespaceInput, page: z.number().int().min(1).max(10_000).optional().default(1), limit: z.number().int().min(1).max(1_000).optional().default(200), }), @@ -21,13 +23,9 @@ export function register(deps: ToolDeps) { }, async (args) => { try { - const effectiveTag = await deps.resolveContainerTag(args.containerTag) - const client = deps.getClient(effectiveTag) - const data = await client.getDocuments( - [effectiveTag], - args.page, - args.limit, - ) + const namespace = await deps.resolveNamespace(namespaceArg(args)) + const client = deps.getClient(namespace) + const data = await client.getGraphDocuments(args.page, args.limit) return { content: [ diff --git a/apps/mcp/src/server/tools/get-document.ts b/apps/mcp/src/server/tools/get-document.ts index b6ebed04c..166bd1351 100644 --- a/apps/mcp/src/server/tools/get-document.ts +++ b/apps/mcp/src/server/tools/get-document.ts @@ -1,5 +1,11 @@ import { z } from "zod" import { formatDocument, getDocumentContent } from "../format" +import { optionalNamespaceSchema } from "../namespace" +import { + legacyNamespaceInput, + namespaceArg, + withLegacyNamespace, +} from "./compat" import { READ_ONLY_TOOL_ANNOTATIONS } from "./annotations" import { getDocumentOutputSchema, @@ -14,6 +20,8 @@ export function register(deps: ToolDeps) { .min(1, "Document ID is required") .max(255, "Document ID exceeds maximum length") .describe("Document ID returned by list_documents or a memory result"), + namespace: optionalNamespaceSchema, + ...legacyNamespaceInput, }) deps.server.registerTool( @@ -21,30 +29,31 @@ export function register(deps: ToolDeps) { { title: "Get Document", description: - "Read one stored document by ID from any space you can access, including its summary and available content. Use list_documents to discover document IDs.", + "Read one stored document by ID from one space, including its summary and available content. Use list_documents to discover document IDs. When the document is in a named space, resolve it with list_spaces and pass namespace; otherwise use the active space.", inputSchema, outputSchema: getDocumentOutputSchema, annotations: READ_ONLY_TOOL_ANNOTATIONS, }, async (args) => { try { - const client = deps.getClient() + const namespace = await deps.resolveNamespace(namespaceArg(args)) + const client = deps.getClient(namespace) const document = await client.getDocument(args.documentId) const { content, truncated } = getDocumentContent(document) - const structuredContent: GetDocumentOutput = { + const structuredContent: GetDocumentOutput = withLegacyNamespace({ + namespace, document: { id: document.id, title: document.title, type: document.type, - status: document.status, - createdAt: document.createdAt, - updatedAt: document.updatedAt, - url: document.url ?? null, + status: document.system.status, + createdAt: document.system.createdAt, + updatedAt: document.system.updatedAt, summary: document.summary, content, contentTruncated: truncated, }, - } + }) return { content: [textContent(formatDocument(document))], diff --git a/apps/mcp/src/server/tools/get-profile.ts b/apps/mcp/src/server/tools/get-profile.ts index 70b7b437f..5764642a6 100644 --- a/apps/mcp/src/server/tools/get-profile.ts +++ b/apps/mcp/src/server/tools/get-profile.ts @@ -1,5 +1,10 @@ import { z } from "zod" -import { optionalContainerTagSchema } from "../container-tag" +import { optionalNamespaceSchema } from "../namespace" +import { + legacyNamespaceInput, + namespaceArg, + withLegacyNamespace, +} from "./compat" import { formatFactSection } from "../space-presentation" import { READ_ONLY_TOOL_ANNOTATIONS } from "./annotations" import { getProfileOutputSchema, type GetProfileOutput } from "./output-schemas" @@ -7,7 +12,8 @@ import { textContent, type ToolDeps } from "./types" export function register(deps: ToolDeps) { const inputSchema = z.object({ - containerTag: optionalContainerTagSchema, + namespace: optionalNamespaceSchema, + ...legacyNamespaceInput, }) deps.server.registerTool( @@ -15,15 +21,15 @@ export function register(deps: ToolDeps) { { title: "Get Profile", description: - "Get the stable and recent profile for one space — long-lived facts plus recent context. search_memory does not include this. After searching, call this if matching memories are not enough and you need who-the-user-is, preferences, or recent context. When the user names a space, resolve it with list_spaces and pass containerTag; otherwise use the active space. Use who_am_i for account identity and access, not profile facts.", + "Get the stable and recent profile for one space — long-lived facts plus recent context. search_memory does not include this. After searching, call this if matching memories are not enough and you need who-the-user-is, preferences, or recent context. When the user names a space, resolve it with list_spaces and pass namespace; otherwise use the active space. Use who_am_i for account identity and access, not profile facts.", inputSchema, outputSchema: getProfileOutputSchema, annotations: READ_ONLY_TOOL_ANNOTATIONS, }, async (args) => { try { - const effectiveTag = await deps.resolveContainerTag(args.containerTag) - const profileResult = await deps.getClient(effectiveTag).getProfile() + const namespace = await deps.resolveNamespace(namespaceArg(args)) + const profileResult = await deps.getClient(namespace).getProfile() const profile = { static: profileResult.profile.static, dynamic: profileResult.profile.dynamic, @@ -46,10 +52,10 @@ export function register(deps: ToolDeps) { parts.push("No profile facts are available for this space yet.") } - const structuredContent: GetProfileOutput = { - containerTag: effectiveTag, + const structuredContent: GetProfileOutput = withLegacyNamespace({ + namespace, profile, - } + }) return { content: [textContent(parts.join("\n"))], diff --git a/apps/mcp/src/server/tools/guided-save.ts b/apps/mcp/src/server/tools/guided-save.ts index c3f3c0425..495fb5eae 100644 --- a/apps/mcp/src/server/tools/guided-save.ts +++ b/apps/mcp/src/server/tools/guided-save.ts @@ -1,8 +1,9 @@ import { z } from "zod" import { saveViewSchema, type ViewMessage } from "../../shared/types" import { appResultMeta, appToolMeta } from "../app-metadata" -import { effectiveContainerTagAccess } from "../auth/rbac" +import { effectiveNamespaceAccess } from "../auth/rbac" import { READ_ONLY_TOOL_ANNOTATIONS } from "./annotations" +import { withLegacyView } from "./compat" import { textContent, type ToolDeps } from "./types" export function register(deps: ToolDeps) { @@ -27,25 +28,25 @@ export function register(deps: ToolDeps) { try { const { prefill } = args const viewId = crypto.randomUUID() - const [activeTag, tags, session] = await Promise.all([ - deps.getActiveContainerTag(), - deps.getClient().listContainerTags(), + const [activeNamespace, namespaces, session] = await Promise.all([ + deps.getActiveNamespace(), + deps.getClient().listNamespaces(), deps.getSession(), ]) - const writableTags = effectiveContainerTagAccess( - tags.map((tag) => tag.containerTag), + const writableNamespaces = effectiveNamespaceAccess( + namespaces.map((entry) => entry.namespace), session, ) .filter((access) => access.permission === "write") - .map((access) => access.containerTag) + .map((access) => access.namespace) - const sc: ViewMessage = { + const sc: ViewMessage = withLegacyView({ view: "save", viewId, - activeTag, - writableTags, + activeNamespace, + writableNamespaces, prefill, - } + }) return { content: [textContent("Opening memory save form...")], diff --git a/apps/mcp/src/server/tools/index.ts b/apps/mcp/src/server/tools/index.ts index 558b3fff7..26eb454cf 100644 --- a/apps/mcp/src/server/tools/index.ts +++ b/apps/mcp/src/server/tools/index.ts @@ -3,7 +3,7 @@ import * as fetchGraphData from "./fetch-graph-data" import * as getDocument from "./get-document" import * as getProfile from "./get-profile" import * as guidedSave from "./guided-save" -import * as listContainerTags from "./list-container-tags" +import * as listNamespaces from "./list-namespaces" import * as listDocuments from "./list-documents" import * as listMemories from "./list-memories" import * as memoryGraph from "./memory-graph" @@ -61,7 +61,7 @@ export function registerAllTools(toolDeps: ToolDeps) { listDocuments.register(deps) getDocument.register(deps) listMemories.register(deps) - listContainerTags.register(deps) + listNamespaces.register(deps) whoAmI.register(deps) selectSpace.register(deps) setActiveTag.register(deps) diff --git a/apps/mcp/src/server/tools/list-container-tags.ts b/apps/mcp/src/server/tools/list-container-tags.ts deleted file mode 100644 index 30bf2c892..000000000 --- a/apps/mcp/src/server/tools/list-container-tags.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { z } from "zod" -import { listSpacesOutputSchema } from "../../shared/types" -import { READ_ONLY_TOOL_ANNOTATIONS } from "./annotations" -import { textContent, type ToolDeps } from "./types" - -export function register(deps: ToolDeps) { - deps.server.registerTool( - "list_spaces", - { - description: - "List the spaces available to the user. Returns each space's name, key, emoji, document/memory counts, and last activity. Use this first to resolve a named space before calling a space-aware tool, or when the user asks which space may contain something. The list is auto-filtered to spaces the user can access.", - inputSchema: z.object({}), - outputSchema: listSpacesOutputSchema, - annotations: READ_ONLY_TOOL_ANNOTATIONS, - }, - async () => { - try { - const tags = await deps.getClient().listContainerTags() - const spaces = tags.map((tag) => ({ - name: tag.name, - containerTag: tag.containerTag, - description: tag.description, - visibility: tag.visibility, - emoji: tag.emoji, - documentCount: tag.documentCount, - memoryCount: tag.memoryCount, - lastActivityAt: tag.lastActivityAt, - })) - - if (tags.length === 0) { - return { - content: [textContent("No spaces found.")], - structuredContent: { spaces, count: 0 }, - } - } - - const lines = tags.map((t) => { - const display = t.emoji ? `${t.emoji} ${t.name}` : t.name - const counts = `(${t.documentCount} docs, ${t.memoryCount} memories)` - return `- ${display} [${t.containerTag}] ${counts}` - }) - - return { - content: [textContent(`Available spaces:\n${lines.join("\n")}`)], - structuredContent: { spaces, count: spaces.length }, - } - } catch (error) { - return deps.errorResult(error) - } - }, - ) -} diff --git a/apps/mcp/src/server/tools/list-documents.ts b/apps/mcp/src/server/tools/list-documents.ts index 10285793a..c886f364d 100644 --- a/apps/mcp/src/server/tools/list-documents.ts +++ b/apps/mcp/src/server/tools/list-documents.ts @@ -1,5 +1,6 @@ import { z } from "zod" -import { optionalContainerTagSchema } from "../container-tag" +import { optionalNamespaceSchema } from "../namespace" +import { legacyNamespaceInput, namespaceArg } from "./compat" import { formatDocumentsList } from "../format" import { READ_ONLY_TOOL_ANNOTATIONS } from "./annotations" import { @@ -25,7 +26,8 @@ export function register(deps: ToolDeps) { .optional() .default(10) .describe("Documents per page (default 10, max 50)"), - containerTag: optionalContainerTagSchema, + namespace: optionalNamespaceSchema, + ...legacyNamespaceInput, }) deps.server.registerTool( @@ -33,15 +35,15 @@ export function register(deps: ToolDeps) { { title: "List Documents", description: - "List documents in one space with their IDs, titles, types, processing status, dates, and summaries. This does not return full document content; use get_document with an ID from this result to read one document. When the user names a space, resolve it with list_spaces and pass containerTag; otherwise use the active space.", + "List documents in one space with their IDs, titles, types, processing status, dates, and summaries. This does not return full document content; use get_document with an ID from this result to read one document. When the user names a space, resolve it with list_spaces and pass namespace; otherwise use the active space.", inputSchema, outputSchema: listDocumentsOutputSchema, annotations: READ_ONLY_TOOL_ANNOTATIONS, }, async (args) => { try { - const effectiveTag = await deps.resolveContainerTag(args.containerTag) - const client = deps.getClient(effectiveTag) + const namespace = await deps.resolveNamespace(namespaceArg(args)) + const client = deps.getClient(namespace) const data = await client.listDocuments( args.page ?? 1, args.limit ?? 10, diff --git a/apps/mcp/src/server/tools/list-memories.ts b/apps/mcp/src/server/tools/list-memories.ts index 79ccee160..b2aa017d9 100644 --- a/apps/mcp/src/server/tools/list-memories.ts +++ b/apps/mcp/src/server/tools/list-memories.ts @@ -1,5 +1,6 @@ import { z } from "zod" -import { optionalContainerTagSchema } from "../container-tag" +import { optionalNamespaceSchema } from "../namespace" +import { legacyNamespaceInput, namespaceArg } from "./compat" import { formatMemoryEntriesList } from "../format" import { READ_ONLY_TOOL_ANNOTATIONS } from "./annotations" import { @@ -25,7 +26,8 @@ export function register(deps: ToolDeps) { .optional() .default(10) .describe("Memory entries per page (default 10, max 50)"), - containerTag: optionalContainerTagSchema, + namespace: optionalNamespaceSchema, + ...legacyNamespaceInput, }) deps.server.registerTool( @@ -33,15 +35,15 @@ export function register(deps: ToolDeps) { { title: "List Memories", description: - "List the latest extracted memory entries in one space, including stable memory IDs, version information, and source document IDs. This lists memories directly, not documents. When the user names a space, resolve it with list_spaces and pass containerTag; otherwise use the active space. Use search_memory instead for semantic recall.", + "List the latest extracted memory entries in one space, including stable memory IDs and version information. This lists memories directly, not documents. When the user names a space, resolve it with list_spaces and pass namespace; otherwise use the active space. Use search_memory instead for semantic recall.", inputSchema, outputSchema: listMemoriesOutputSchema, annotations: READ_ONLY_TOOL_ANNOTATIONS, }, async (args) => { try { - const effectiveTag = await deps.resolveContainerTag(args.containerTag) - const client = deps.getClient(effectiveTag) + const namespace = await deps.resolveNamespace(namespaceArg(args)) + const client = deps.getClient(namespace) const data = await client.listMemoryEntries( args.page ?? 1, args.limit ?? 10, diff --git a/apps/mcp/src/server/tools/list-namespaces.ts b/apps/mcp/src/server/tools/list-namespaces.ts new file mode 100644 index 000000000..eeff9b96f --- /dev/null +++ b/apps/mcp/src/server/tools/list-namespaces.ts @@ -0,0 +1,51 @@ +import { z } from "zod" +import { listSpacesOutputSchema } from "../../shared/types" +import { READ_ONLY_TOOL_ANNOTATIONS } from "./annotations" +import { withLegacyNamespaces } from "./compat" +import { textContent, type ToolDeps } from "./types" + +export function register(deps: ToolDeps) { + deps.server.registerTool( + "list_spaces", + { + description: + "List the spaces available to the user. Returns each space's key, description, document/memory counts, and last update. Use this first to resolve a named space before calling a space-aware tool, or when the user asks which space may contain something. The list is auto-filtered to spaces the user can access.", + inputSchema: z.object({}), + outputSchema: listSpacesOutputSchema, + annotations: READ_ONLY_TOOL_ANNOTATIONS, + }, + async () => { + try { + const namespaces = await deps.getClient().listNamespaces() + const spaces = withLegacyNamespaces( + namespaces.map((entry) => ({ + namespace: entry.namespace, + description: entry.description, + documentCount: entry.documentCount, + memoryCount: entry.memoryCount, + updatedAt: entry.updatedAt, + })), + ) + + if (spaces.length === 0) { + return { + content: [textContent("No spaces found.")], + structuredContent: { spaces, count: 0 }, + } + } + + const lines = spaces.map( + (space) => + `- ${space.namespace} (${space.documentCount} docs, ${space.memoryCount} memories)`, + ) + + return { + content: [textContent(`Available spaces:\n${lines.join("\n")}`)], + structuredContent: { spaces, count: spaces.length }, + } + } catch (error) { + return deps.errorResult(error) + } + }, + ) +} diff --git a/apps/mcp/src/server/tools/memory-graph.ts b/apps/mcp/src/server/tools/memory-graph.ts index 3a5385ce1..73cc2b2da 100644 --- a/apps/mcp/src/server/tools/memory-graph.ts +++ b/apps/mcp/src/server/tools/memory-graph.ts @@ -1,13 +1,15 @@ import { z } from "zod" import { graphViewSchema, type ViewMessage } from "../../shared/types" import { appResultMeta, appToolMeta } from "../app-metadata" -import { optionalContainerTagSchema } from "../container-tag" +import { optionalNamespaceSchema } from "../namespace" +import { legacyNamespaceInput, namespaceArg, withLegacyView } from "./compat" import { READ_ONLY_TOOL_ANNOTATIONS } from "./annotations" import { textContent, type ToolDeps } from "./types" export function register(deps: ToolDeps) { const inputSchema = z.object({ - containerTag: optionalContainerTagSchema, + namespace: optionalNamespaceSchema, + ...legacyNamespaceInput, }) deps.server.registerTool( @@ -15,7 +17,7 @@ export function register(deps: ToolDeps) { { title: "Memory Graph", description: - "Render a space's memory graph directly as an interactive MCP App. This tool is the final visualization; do not create another graph, file, or artifact unless the user explicitly asks for one. If the user names a space, call list_spaces to resolve its key and pass it as containerTag. If the user does not name a space, call this tool directly and omit containerTag; the server uses the active space or account default. Do not open the space picker unless the user asks to change their active space.", + "Render a space's memory graph directly as an interactive MCP App. This tool is the final visualization; do not create another graph, file, or artifact unless the user explicitly asks for one. If the user names a space, call list_spaces to resolve its key and pass it as namespace. If the user does not name a space, call this tool directly and omit namespace; the server uses the active space or account default. Do not open the space picker unless the user asks to change their active space.", inputSchema, outputSchema: graphViewSchema, annotations: READ_ONLY_TOOL_ANNOTATIONS, @@ -24,17 +26,17 @@ export function register(deps: ToolDeps) { async (args) => { try { const viewId = crypto.randomUUID() - const effectiveTag = await deps.resolveContainerTag(args.containerTag) - const client = deps.getClient(effectiveTag) - const result = await client.getDocuments([effectiveTag], 1, 200) + const namespace = await deps.resolveNamespace(namespaceArg(args)) + const client = deps.getClient(namespace) + const result = await client.getGraphDocuments(1, 200) const memoryCount = result.documents.reduce( (sum, document) => sum + document.memoryEntries.length, 0, ) - const sc: ViewMessage = { + const sc: ViewMessage = withLegacyView({ view: "graph", viewId, - containerTag: effectiveTag, + namespace, documents: result.documents, totalCount: result.pagination.totalItems, documentCount: result.documents.length, @@ -42,11 +44,11 @@ export function register(deps: ToolDeps) { totalDocumentCount: result.pagination.totalItems, truncated: result.documents.length < result.pagination.totalItems, rendered: true, - } + }) return { content: [ textContent( - `Rendered the interactive Memory Graph MCP App: ${result.documents.length} documents, ${memoryCount} memories. Space: ${effectiveTag}. Do not create a duplicate graph or artifact unless the user explicitly requests one.`, + `Rendered the interactive Memory Graph MCP App: ${result.documents.length} documents, ${memoryCount} memories. Space: ${namespace}. Do not create a duplicate graph or artifact unless the user explicitly requests one.`, ), ], structuredContent: sc, diff --git a/apps/mcp/src/server/tools/output-schemas.ts b/apps/mcp/src/server/tools/output-schemas.ts index 8f10d65a5..72a9065d4 100644 --- a/apps/mcp/src/server/tools/output-schemas.ts +++ b/apps/mcp/src/server/tools/output-schemas.ts @@ -1,43 +1,17 @@ import { z } from "zod" +import { legacyNamespaceOutput } from "./compat" import { - containerTagAccessSchema, + namespaceAccessSchema, memoriesListSchema, paginationSchema, sessionScopeSchema, } from "../../shared/types" -const documentStatusSchema = z.enum([ - "unknown", - "queued", - "extracting", - "chunking", - "embedding", - "indexing", - "done", - "failed", -]) - -const documentTypeSchema = z.enum([ - "text", - "pdf", - "tweet", - "google_doc", - "google_slide", - "google_sheet", - "image", - "video", - "audio", - "notion_doc", - "webpage", - "onedrive", - "github_markdown", -]) - const documentSummarySchema = z.object({ id: z.string(), title: z.string().nullable(), - type: documentTypeSchema, - status: documentStatusSchema, + type: z.string(), + status: z.string(), createdAt: z.string(), updatedAt: z.string(), summary: z.string().nullable(), @@ -46,7 +20,8 @@ const documentSummarySchema = z.object({ export const addMemoryOutputSchema = z.object({ action: z.enum(["save", "forget"]), success: z.boolean(), - containerTag: z.string(), + namespace: z.string(), + ...legacyNamespaceOutput, message: z.string(), id: z.string().optional(), status: z.string().optional(), @@ -55,14 +30,15 @@ export const addMemoryOutputSchema = z.object({ export type AddMemoryOutput = z.infer export const getDocumentOutputSchema = z.object({ + namespace: z.string(), + ...legacyNamespaceOutput, document: z.object({ id: z.string(), title: z.string().nullable(), - type: documentTypeSchema, - status: documentStatusSchema, + type: z.string(), + status: z.string(), createdAt: z.string(), updatedAt: z.string(), - url: z.string().nullable(), summary: z.string().nullable(), content: z.string().nullable(), contentTruncated: z.boolean(), @@ -78,15 +54,14 @@ export const listDocumentsOutputSchema = z.object({ export type ListDocumentsOutput = z.infer -// Reuse the shared schema so the tool's output contract stays identical to what -// the client parses — the two can't drift. export const listMemoriesOutputSchema = memoriesListSchema export type ListMemoriesOutput = z.infer export const searchMemoryOutputSchema = z.object({ query: z.string(), - containerTag: z.string(), + namespace: z.string(), + ...legacyNamespaceOutput, profile: z .object({ static: z.array(z.string()), @@ -108,7 +83,8 @@ export const searchMemoryOutputSchema = z.object({ export type SearchMemoryOutput = z.infer export const getProfileOutputSchema = z.object({ - containerTag: z.string(), + namespace: z.string(), + ...legacyNamespaceOutput, profile: z.object({ static: z.array(z.string()), dynamic: z.array(z.string()), @@ -124,7 +100,7 @@ export const whoAmIOutputSchema = z.object({ role: z.string(), accessType: z.enum(["full", "restricted"]), activeSpace: z.string().nullable(), - assignedSpaces: z.array(containerTagAccessSchema).nullable(), + assignedSpaces: z.array(namespaceAccessSchema).nullable(), scope: sessionScopeSchema.optional(), client: z .object({ diff --git a/apps/mcp/src/server/tools/prepare-file-upload.ts b/apps/mcp/src/server/tools/prepare-file-upload.ts index 835e0cd3c..9b003cc50 100644 --- a/apps/mcp/src/server/tools/prepare-file-upload.ts +++ b/apps/mcp/src/server/tools/prepare-file-upload.ts @@ -1,6 +1,8 @@ import { z } from "zod" import { uploadPreparationSchema } from "../../shared/types" import { appToolMeta } from "../app-metadata" +import { namespaceSchema } from "../namespace" +import { legacyNamespaceInput, namespaceArg } from "./compat" import { ADDITIVE_MEMORY_TOOL_ANNOTATIONS } from "./annotations" import { textContent, type ToolDeps } from "./types" @@ -9,14 +11,18 @@ export function register(deps: ToolDeps) { "prepare-file-upload", { description: "Prepare a direct file upload", - inputSchema: z.object({}), + inputSchema: z.object({ + namespace: namespaceSchema.optional(), + ...legacyNamespaceInput, + }), outputSchema: uploadPreparationSchema, annotations: ADDITIVE_MEMORY_TOOL_ANNOTATIONS, _meta: appToolMeta(["app"]), }, - async () => { + async (args) => { try { - const preparation = await deps.createUploadSession() + const namespace = await deps.resolveNamespace(namespaceArg(args)) + const preparation = await deps.createUploadSession(namespace) return { content: [textContent("Upload session prepared")], diff --git a/apps/mcp/src/server/tools/save-memory.ts b/apps/mcp/src/server/tools/save-memory.ts index 8b53f0326..c844a3b6d 100644 --- a/apps/mcp/src/server/tools/save-memory.ts +++ b/apps/mcp/src/server/tools/save-memory.ts @@ -1,7 +1,8 @@ import { z } from "zod" import { saveSuccessViewSchema, type ViewMessage } from "../../shared/types" import { appResultMeta, appToolMeta } from "../app-metadata" -import { containerTagSchema } from "../container-tag" +import { namespaceSchema } from "../namespace" +import { legacyNamespaceInput, namespaceArg, withLegacyView } from "./compat" import { ADDITIVE_MEMORY_TOOL_ANNOTATIONS } from "./annotations" import { textContent, type ToolDeps } from "./types" @@ -12,7 +13,8 @@ export function register(deps: ToolDeps) { description: "Save content to memory", inputSchema: z.object({ content: z.string().min(1), - containerTag: containerTagSchema, + namespace: namespaceSchema.optional(), + ...legacyNamespaceInput, viewId: z.string().uuid().optional(), }), outputSchema: saveSuccessViewSchema, @@ -21,15 +23,18 @@ export function register(deps: ToolDeps) { }, async (args) => { try { + const namespace = namespaceArg(args) + if (!namespace) + return deps.errorResult(new Error("namespace is required")) const viewId = args.viewId ?? crypto.randomUUID() - const client = deps.getClient(args.containerTag) + const client = deps.getClient(namespace) const result = await client.createMemory(args.content) - const sc: ViewMessage = { + const sc: ViewMessage = withLegacyView({ view: "save-success", viewId, id: result.id, - containerTag: args.containerTag, - } + namespace, + }) return { content: [textContent(`Memory saved: ${result.id}`)], structuredContent: sc, diff --git a/apps/mcp/src/server/tools/search-memory.ts b/apps/mcp/src/server/tools/search-memory.ts index 9818cb204..e4a257a5b 100644 --- a/apps/mcp/src/server/tools/search-memory.ts +++ b/apps/mcp/src/server/tools/search-memory.ts @@ -1,6 +1,11 @@ import { z } from "zod" import { getMemoryText } from "../client" -import { optionalContainerTagSchema } from "../container-tag" +import { optionalNamespaceSchema } from "../namespace" +import { + legacyNamespaceInput, + namespaceArg, + withLegacyNamespace, +} from "./compat" import { READ_ONLY_TOOL_ANNOTATIONS } from "./annotations" import { searchMemoryOutputSchema, @@ -14,29 +19,29 @@ export function register(deps: ToolDeps) { .string() .max(1000, "Query exceeds maximum length") .describe("The search query to find relevant memories"), - containerTag: optionalContainerTagSchema, + namespace: optionalNamespaceSchema, + ...legacyNamespaceInput, }) deps.server.registerTool( "search_memory", { description: - "Search memories in one space with a natural-language query. Returns matching memories only — not the space profile. If you need who-the-user-is, preferences, or recent context after searching, call get_profile. When the user names a space, resolve it with list_spaces and pass containerTag; otherwise use the active space.", + "Search memories in one space with a natural-language query. Returns matching memories only — not the space profile. If you need who-the-user-is, preferences, or recent context after searching, call get_profile. When the user names a space, resolve it with list_spaces and pass namespace; otherwise use the active space.", inputSchema, outputSchema: searchMemoryOutputSchema, annotations: READ_ONLY_TOOL_ANNOTATIONS, }, async (args) => { try { - const effectiveTag = await deps.resolveContainerTag(args.containerTag) - const client = deps.getClient(effectiveTag) + const namespace = await deps.resolveNamespace(namespaceArg(args)) + const client = deps.getClient(namespace) const searchResult = await client.search(args.query) const results = searchResult.results.map((result) => ({ id: result.id, text: getMemoryText(result), similarity: result.similarity, - ...(result.title ? { title: result.title } : {}), })) const parts: string[] = [] @@ -51,13 +56,13 @@ export function register(deps: ToolDeps) { parts.push("No matching memories found.") } - const structuredContent: SearchMemoryOutput = { + const structuredContent: SearchMemoryOutput = withLegacyNamespace({ query: args.query, - containerTag: effectiveTag, + namespace, results, total: searchResult.total, timing: searchResult.timing, - } + }) return { content: [textContent(parts.join("\n"))], diff --git a/apps/mcp/src/server/tools/select-space.ts b/apps/mcp/src/server/tools/select-space.ts index c25f2ce35..905c2ea73 100644 --- a/apps/mcp/src/server/tools/select-space.ts +++ b/apps/mcp/src/server/tools/select-space.ts @@ -1,8 +1,9 @@ import { z } from "zod" import { pickerViewSchema, type ViewMessage } from "../../shared/types" import { appResultMeta, appToolMeta } from "../app-metadata" -import { effectiveContainerTagAccess } from "../auth/rbac" +import { effectiveNamespaceAccess } from "../auth/rbac" import { READ_ONLY_TOOL_ANNOTATIONS } from "./annotations" +import { withLegacyView } from "./compat" import { textContent, type ToolDeps } from "./types" export function register(deps: ToolDeps) { @@ -11,7 +12,7 @@ export function register(deps: ToolDeps) { { title: "Select Space", description: - "Open an interactive picker to choose or change the active Supermemory space used for future actions. Use this only when the user asks to switch, select, or change their active or default space. Do not use it merely because the user names a space for a search, list, graph, save, or upload; resolve that space with list_spaces and pass containerTag to the relevant tool instead.", + "Open an interactive picker to choose or change the active Supermemory space used for future actions. Use this only when the user asks to switch, select, or change their active or default space. Do not use it merely because the user names a space for a search, list, graph, save, or upload; resolve that space with list_spaces and pass namespace to the relevant tool instead.", inputSchema: z.object({}), outputSchema: pickerViewSchema, _meta: appToolMeta(), @@ -21,28 +22,28 @@ export function register(deps: ToolDeps) { try { const viewId = crypto.randomUUID() const client = deps.getClient() - const [tags, session, activeTag] = await Promise.all([ - client.listContainerTags(), + const [namespaces, session, activeNamespace] = await Promise.all([ + client.listNamespaces(), deps.getSession(), - deps.getActiveContainerTag(), + deps.getActiveNamespace(), ]) - const assignedTags = effectiveContainerTagAccess( - tags.map((tag) => tag.containerTag), + const assignedNamespaces = effectiveNamespaceAccess( + namespaces.map((entry) => entry.namespace), session, ) - const sc: ViewMessage = { + const sc: ViewMessage = withLegacyView({ view: "picker", viewId, - containerTags: tags, - activeTag, - assignedTags, - } + namespaces, + activeNamespace, + assignedNamespaces, + }) return { content: [ textContent( - `${tags.length} spaces available. Select one to set your active context.`, + `${namespaces.length} spaces available. Select one to set your active context.`, ), ], structuredContent: sc, diff --git a/apps/mcp/src/server/tools/set-active-tag.ts b/apps/mcp/src/server/tools/set-active-tag.ts index beb3b5f66..b60f8b6a9 100644 --- a/apps/mcp/src/server/tools/set-active-tag.ts +++ b/apps/mcp/src/server/tools/set-active-tag.ts @@ -1,7 +1,8 @@ import { z } from "zod" import { confirmationViewSchema, type ViewMessage } from "../../shared/types" import { appResultMeta, appToolMeta } from "../app-metadata" -import { containerTagSchema } from "../container-tag" +import { namespaceSchema } from "../namespace" +import { legacyNamespaceInput, namespaceArg, withLegacyView } from "./compat" import { SETTINGS_TOOL_ANNOTATIONS } from "./annotations" import { textContent, type ToolDeps } from "./types" @@ -11,7 +12,8 @@ export function register(deps: ToolDeps) { { description: "Set the active Supermemory space for this account", inputSchema: z.object({ - containerTag: containerTagSchema, + namespace: namespaceSchema.optional(), + ...legacyNamespaceInput, viewId: z.string().uuid().optional(), }), outputSchema: confirmationViewSchema, @@ -19,23 +21,24 @@ export function register(deps: ToolDeps) { annotations: SETTINGS_TOOL_ANNOTATIONS, }, async (args) => { - const { containerTag } = args + const namespace = namespaceArg(args) + if (!namespace) + return deps.errorResult(new Error("namespace is required")) try { const viewId = args.viewId ?? crypto.randomUUID() - const tags = await deps.getClient().listContainerTags() - if (!tags.some((tag) => tag.containerTag === containerTag)) { + if (!(await deps.getClient().getNamespace(namespace))) { return deps.errorResult( - new Error(`No access to container tag '${containerTag}'.`), + new Error(`No access to namespace '${namespace}'.`), ) } - await deps.setActiveContainerTag(containerTag) - const sc: ViewMessage = { + await deps.setActiveNamespace(namespace) + const sc: ViewMessage = withLegacyView({ view: "confirmation", viewId, - containerTag, - } + namespace, + }) return { - content: [textContent(`Active space set to ${containerTag}`)], + content: [textContent(`Active space set to ${namespace}`)], structuredContent: sc, _meta: appResultMeta(viewId), } diff --git a/apps/mcp/src/server/tools/types.ts b/apps/mcp/src/server/tools/types.ts index badbdd74e..ffe0f2b10 100644 --- a/apps/mcp/src/server/tools/types.ts +++ b/apps/mcp/src/server/tools/types.ts @@ -14,17 +14,16 @@ export interface PreparedUpload { expiresAt: number } -// Dependencies passed to every tool's register() function. -// Keep this surface small — tools should read this rather than reach into the agent. +// Keep this surface small: tools read deps rather than reach into the agent. export interface ToolDeps { server: Pick actor: ActorContext - getClient: (containerTag?: string) => SupermemoryClient + getClient: (namespace?: string) => SupermemoryClient getSession: () => Promise - resolveContainerTag: (explicit?: string) => Promise - getActiveContainerTag: () => Promise - setActiveContainerTag: (containerTag: string) => Promise - createUploadSession: () => Promise + resolveNamespace: (explicit?: string) => Promise + getActiveNamespace: () => Promise + setActiveNamespace: (namespace: string) => Promise + createUploadSession: (namespace: string) => Promise getClientInfo: ( context: ServerContext, ) => { name: string; version?: string } | null diff --git a/apps/mcp/src/server/tools/upload-file.ts b/apps/mcp/src/server/tools/upload-file.ts index b9c981188..3cf3b7f4b 100644 --- a/apps/mcp/src/server/tools/upload-file.ts +++ b/apps/mcp/src/server/tools/upload-file.ts @@ -1,8 +1,9 @@ import { z } from "zod" import { uploadViewSchema, type ViewMessage } from "../../shared/types" import { appResultMeta, appToolMeta } from "../app-metadata" -import { effectiveContainerTagAccess } from "../auth/rbac" +import { effectiveNamespaceAccess } from "../auth/rbac" import { READ_ONLY_TOOL_ANNOTATIONS } from "./annotations" +import { withLegacyView } from "./compat" import { textContent, type ToolDeps } from "./types" export function register(deps: ToolDeps) { @@ -20,24 +21,24 @@ export function register(deps: ToolDeps) { async () => { try { const viewId = crypto.randomUUID() - const [activeTag, tags, session] = await Promise.all([ - deps.getActiveContainerTag(), - deps.getClient().listContainerTags(), + const [activeNamespace, namespaces, session] = await Promise.all([ + deps.getActiveNamespace(), + deps.getClient().listNamespaces(), deps.getSession(), ]) - const writableTags = effectiveContainerTagAccess( - tags.map((tag) => tag.containerTag), + const writableNamespaces = effectiveNamespaceAccess( + namespaces.map((entry) => entry.namespace), session, ) .filter((access) => access.permission === "write") - .map((access) => access.containerTag) + .map((access) => access.namespace) - const sc: ViewMessage = { + const sc: ViewMessage = withLegacyView({ view: "upload", viewId, - activeTag, - writableTags, - } + activeNamespace, + writableNamespaces, + }) return { content: [textContent("Opening file upload form...")], diff --git a/apps/mcp/src/server/tools/who-am-i.ts b/apps/mcp/src/server/tools/who-am-i.ts index af570b7e7..08fcea8e5 100644 --- a/apps/mcp/src/server/tools/who-am-i.ts +++ b/apps/mcp/src/server/tools/who-am-i.ts @@ -1,5 +1,6 @@ import { z } from "zod" import { READ_ONLY_TOOL_ANNOTATIONS } from "./annotations" +import { withLegacyNamespaces } from "./compat" import { whoAmIOutputSchema, type WhoAmIOutput } from "./output-schemas" import { textContent, type ToolDeps } from "./types" @@ -15,9 +16,9 @@ export function register(deps: ToolDeps) { }, async (_args, context) => { try { - const [session, activeTag] = await Promise.all([ + const [session, activeNamespace] = await Promise.all([ deps.getSession(), - deps.getActiveContainerTag(), + deps.getActiveNamespace(), ]) const client = deps.getClientInfo(context) const structuredContent: WhoAmIOutput = { @@ -26,10 +27,10 @@ export function register(deps: ToolDeps) { ...(session.user.name ? { name: session.user.name } : {}), role: session.role ?? "unknown", accessType: session.accessType ?? "full", - activeSpace: activeTag ?? null, + activeSpace: activeNamespace ?? null, assignedSpaces: - session.accessType === "restricted" - ? (session.containerTags ?? null) + session.accessType === "restricted" && session.namespaces + ? withLegacyNamespaces(session.namespaces) : null, ...(session.scope ? { scope: session.scope } : {}), ...(client ? { client } : {}), diff --git a/apps/mcp/src/shared/types.ts b/apps/mcp/src/shared/types.ts index e7a341602..ad59a02b4 100644 --- a/apps/mcp/src/shared/types.ts +++ b/apps/mcp/src/shared/types.ts @@ -3,12 +3,21 @@ import { z } from "zod" // Shared types — imported by both server tools and widget views. // Single source of truth for the server↔widget contract. -export const containerTagAccessSchema = z.object({ - containerTag: z.string(), +export const namespaceAccessSchema = z.object({ + namespace: z.string(), + containerTag: z.string().optional(), permission: z.enum(["read", "write"]), }) -export type ContainerTagAccess = z.infer +export type NamespaceAccess = z.infer + +// /v3/session has no v5 replacement and still sends container-tag field names. +const sessionNamespaceAccessSchema = z + .object({ containerTag: z.string(), permission: z.enum(["read", "write"]) }) + .transform(({ containerTag, permission }) => ({ + namespace: containerTag, + permission, + })) export const sessionScopeSchema = z.looseObject({ type: z.enum(["full", "scoped"]), @@ -21,48 +30,51 @@ export const sessionScopeSchema = z.looseObject({ export type SessionScope = z.infer -export const sessionInfoSchema = z.looseObject({ - user: z.looseObject({ - id: z.string().min(1), - email: z.string().optional(), - name: z.string().optional(), - }), - org: z.looseObject({ id: z.string().min(1) }).optional(), - role: z.string().optional(), - accessType: z.enum(["full", "restricted"]).optional(), - containerTags: z.array(containerTagAccessSchema).nullable().optional(), - scope: sessionScopeSchema.optional(), -}) - -export type SessionInfo = z.infer - -export const containerTagSchema = z.looseObject({ +export const sessionInfoSchema = z + .looseObject({ + user: z.looseObject({ + id: z.string().min(1), + email: z.string().optional(), + name: z.string().optional(), + }), + org: z.looseObject({ id: z.string().min(1) }).optional(), + role: z.string().optional(), + accessType: z.enum(["full", "restricted"]).optional(), + containerTags: z.array(sessionNamespaceAccessSchema).nullable().optional(), + scope: sessionScopeSchema.optional(), + }) + .transform( + ({ + containerTags, + ...session + }): typeof session & { namespaces?: NamespaceAccess[] | null } => ({ + ...session, + namespaces: containerTags, + }), + ) + +export type SessionInfo = z.output + +export const namespaceInfoSchema = z.object({ id: z.string(), - name: z.string(), - containerTag: z.string(), + namespace: z.string(), + containerTag: z.string().optional(), description: z.string().nullish(), - visibility: z.string().nullish(), - createdAt: z.string(), - updatedAt: z.string(), - isExperimental: z.boolean(), - emoji: z.string().nullish(), - isNova: z.boolean(), documentCount: z.number().int().nonnegative(), memoryCount: z.number().int().nonnegative(), - lastActivityAt: z.string().nullish(), + createdAt: z.string(), + updatedAt: z.string(), }) -export type ContainerTag = z.infer +export type NamespaceInfo = z.infer export const spaceSummarySchema = z.object({ - name: z.string(), - containerTag: z.string(), + namespace: z.string(), + containerTag: z.string().optional(), description: z.string().nullish(), - visibility: z.string().nullish(), - emoji: z.string().nullish(), documentCount: z.number().int().nonnegative(), memoryCount: z.number().int().nonnegative(), - lastActivityAt: z.string().nullish(), + updatedAt: z.string(), }) export const listSpacesOutputSchema = z.object({ @@ -117,11 +129,7 @@ export const documentsApiResponseSchema = z.object({ export type DocumentsApiResponse = z.infer -// Extracted memory entries from /v4/memories/list. Single source of truth for -// both the client parser and the listMemories tool output schema, so the two -// can't drift (a mismatch previously produced Ajv "must NOT have additional -// properties"). z.object strips unknown API fields on parse, keeping parsed data -// matched to the strict MCP output contract while tolerating new API fields. +// Shared by the client and the list_memories output schema so the two can't drift. export const memoryEntryHistorySchema = z.object({ id: z.string(), memory: z.string(), @@ -168,37 +176,46 @@ const viewIdSchema = z.string().uuid().optional() export const pickerViewSchema = z.object({ view: z.literal("picker"), viewId: viewIdSchema, - containerTags: z.array(containerTagSchema), + namespaces: z.array(namespaceInfoSchema), + activeNamespace: z.string().nullish(), + assignedNamespaces: z.array(namespaceAccessSchema).nullable().optional(), + containerTags: z.array(namespaceInfoSchema).optional(), activeTag: z.string().nullish(), - assignedTags: z.array(containerTagAccessSchema).nullable().optional(), + assignedTags: z.array(namespaceAccessSchema).nullable().optional(), }) export const confirmationViewSchema = z.object({ view: z.literal("confirmation"), viewId: viewIdSchema, - containerTag: z.string(), + namespace: z.string(), + containerTag: z.string().optional(), }) export const saveViewSchema = z.object({ view: z.literal("save"), viewId: viewIdSchema, - activeTag: z.string().nullish(), - writableTags: z.array(z.string()), + activeNamespace: z.string().nullish(), + writableNamespaces: z.array(z.string()), prefill: z.string().optional(), + activeTag: z.string().nullish(), + writableTags: z.array(z.string()).optional(), }) export const saveSuccessViewSchema = z.object({ view: z.literal("save-success"), viewId: viewIdSchema, id: z.string(), - containerTag: z.string(), + namespace: z.string(), + containerTag: z.string().optional(), }) export const uploadViewSchema = z.object({ view: z.literal("upload"), viewId: viewIdSchema, + activeNamespace: z.string().nullish(), + writableNamespaces: z.array(z.string()), activeTag: z.string().nullish(), - writableTags: z.array(z.string()), + writableTags: z.array(z.string()).optional(), }) export const uploadSuccessViewSchema = z.object({ @@ -206,7 +223,8 @@ export const uploadSuccessViewSchema = z.object({ viewId: viewIdSchema, id: z.string(), fileName: z.string(), - containerTag: z.string(), + namespace: z.string(), + containerTag: z.string().optional(), }) export const uploadPreparationSchema = z.object({ @@ -223,6 +241,7 @@ export const uploadResponseSchema = z.object({ export const graphViewSchema = z.object({ view: z.literal("graph"), viewId: viewIdSchema, + namespace: z.string().optional(), containerTag: z.string().optional(), documents: z.array(documentWithMemoriesSchema), totalCount: z.number().int().nonnegative(), diff --git a/apps/mcp/src/widget/App.tsx b/apps/mcp/src/widget/App.tsx index 750aec705..07210c212 100644 --- a/apps/mcp/src/widget/App.tsx +++ b/apps/mcp/src/widget/App.tsx @@ -90,9 +90,9 @@ function renderView( case "picker": return ( ) case "upload": return ( ) case "graph": return case "confirmation": - return + return case "save-success": - return + return case "upload-success": return ( ) default: { diff --git a/apps/mcp/src/widget/components/SpaceCard.tsx b/apps/mcp/src/widget/components/SpaceCard.tsx index c5c5a3c04..e733f1ce2 100644 --- a/apps/mcp/src/widget/components/SpaceCard.tsx +++ b/apps/mcp/src/widget/components/SpaceCard.tsx @@ -1,19 +1,19 @@ -import type { ContainerTag, ContainerTagAccess } from "../../shared/types" +import type { NamespaceAccess, NamespaceInfo } from "../../shared/types" import { cn } from "../design/lib/cn" -import { formatTagLabel } from "../lib/formatTag" +import { formatNamespaceLabel } from "../lib/formatNamespace" import { PermissionBadge } from "./PermissionBadge" interface Props { - containerTag: ContainerTag + namespace: NamespaceInfo active: boolean - access?: ContainerTagAccess - onClick: (containerTag: string) => void + access?: NamespaceAccess + onClick: (namespace: string) => void } -export function SpaceCard({ containerTag, active, access, onClick }: Props) { - const name = containerTag.name || formatTagLabel(containerTag.containerTag) - const docs = containerTag.documentCount - const mems = containerTag.memoryCount +export function SpaceCard({ namespace, active, access, onClick }: Props) { + const name = formatNamespaceLabel(namespace.namespace) + const docs = namespace.documentCount + const mems = namespace.memoryCount const meta = docs > 0 || mems > 0 ? `${docs} doc${docs === 1 ? "" : "s"} · ${mems} ${mems === 1 ? "memory" : "memories"}` @@ -23,7 +23,7 @@ export function SpaceCard({ containerTag, active, access, onClick }: Props) {