From 6fa2a8c70e5ee5e00530d0f1813431908f7cca41 Mon Sep 17 00:00:00 2001 From: ved015 Date: Fri, 15 May 2026 13:13:31 +0530 Subject: [PATCH] add support for other plugins --- apps/web/app/auth/connect/page.tsx | 11 ++++ apps/web/components/dashboard-view.tsx | 83 ++++++++++++++++++++------ apps/web/middleware.ts | 11 +++- 3 files changed, 84 insertions(+), 21 deletions(-) diff --git a/apps/web/app/auth/connect/page.tsx b/apps/web/app/auth/connect/page.tsx index 37f61d3d..e8d0bac8 100644 --- a/apps/web/app/auth/connect/page.tsx +++ b/apps/web/app/auth/connect/page.tsx @@ -101,6 +101,17 @@ const PLUGIN_INFO: Record = { ], icon: "/images/plugins/codex.svg", }, + codex: { + name: "OpenAI Codex", + description: + "Memory layer for Codex. Keeps coding context, preferences, and decisions available across sessions.", + features: [ + "Auto-recalls relevant context before prompts", + "Captures useful coding decisions from sessions", + "Supports project and custom memory containers", + ], + icon: "/images/plugins/opencode.svg", + }, } function getPluginName(client: string): string { diff --git a/apps/web/components/dashboard-view.tsx b/apps/web/components/dashboard-view.tsx index a6216e3d..ab8b037d 100644 --- a/apps/web/components/dashboard-view.tsx +++ b/apps/web/components/dashboard-view.tsx @@ -364,22 +364,66 @@ function getDocumentText(document: DocumentWithMemories): string { return typeof document.content === "string" ? document.content : "" } +function toMetadataRecord(value: unknown): Record | null { + if (!value) return null + if (typeof value === "object" && !Array.isArray(value)) { + return value as Record + } + if (typeof value !== "string") return null + + try { + const parsed = JSON.parse(value) + return parsed && typeof parsed === "object" && !Array.isArray(parsed) + ? (parsed as Record) + : null + } catch { + return null + } +} + +function getDocumentMetadataRecords( + document: DocumentWithMemories, +): Record[] { + const records = [toMetadataRecord(document.metadata)] + + for (const entry of document.memoryEntries ?? []) { + records.push( + toMetadataRecord(entry.metadata), + toMetadataRecord(entry.sourceMetadata), + ) + } + + return records.filter((record): record is Record => !!record) +} + +function hasClaudeCodeContainer(document: DocumentWithMemories): boolean { + const containerTags = + (document as { containerTags?: string[] }).containerTags ?? [] + if (containerTags.some((tag) => tag.startsWith("claudecode_"))) return true + + return (document.memoryEntries ?? []).some((entry) => + entry.spaceContainerTag?.startsWith("claudecode_"), + ) +} + function getPluginClientFromDocument( document: DocumentWithMemories, ): string | null { - const metadata = - document.metadata && typeof document.metadata === "object" - ? document.metadata - : {} - const metadataClient = - typeof metadata.sm_client === "string" - ? metadata.sm_client - : typeof metadata.sm_internal_plugin_client === "string" - ? metadata.sm_internal_plugin_client - : typeof metadata.sm_internal_mcp_client_name === "string" - ? metadata.sm_internal_mcp_client_name - : null - if (metadataClient) return metadataClient.toLowerCase() + for (const metadata of getDocumentMetadataRecords(document)) { + const metadataClient = + typeof metadata.sm_client === "string" + ? metadata.sm_client + : typeof metadata.sm_internal_plugin_client === "string" + ? metadata.sm_internal_plugin_client + : typeof metadata.sm_internal_mcp_client_name === "string" + ? metadata.sm_internal_mcp_client_name + : null + if (metadataClient) return metadataClient.toLowerCase() + + if (metadata.sm_source === "claude-code-plugin") return "claude_code" + } + + if (hasClaudeCodeContainer(document)) return "claude_code" const content = getDocumentText(document) const title = document.title ?? "" @@ -526,16 +570,17 @@ function parseToolUsage( } for (const doc of recentMcpDocuments) { - const metadata = - doc.metadata && typeof doc.metadata === "object" ? doc.metadata : {} + const metadataRecords = getDocumentMetadataRecords(doc) const clientName = - typeof metadata.sm_internal_mcp_client_name === "string" - ? metadata.sm_internal_mcp_client_name - : null + metadataRecords + .map((record) => record.sm_internal_mcp_client_name) + .find((value): value is string => typeof value === "string") ?? null const pluginClient = getPluginClientFromDocument(doc) const isMcpDocument = doc.source === "mcp" || - metadata.sm_internal_event_from === "mcp" || + metadataRecords.some( + (record) => record.sm_internal_event_from === "mcp", + ) || !!clientName const isPluginDocument = !!pluginClient && pluginClient !== "mcp" diff --git a/apps/web/middleware.ts b/apps/web/middleware.ts index 885144ac..9d42e1bb 100644 --- a/apps/web/middleware.ts +++ b/apps/web/middleware.ts @@ -8,7 +8,14 @@ export default async function proxy(request: Request) { console.debug("[PROXY] Path:", url.pathname) console.debug("[PROXY] Method:", request.method) - const sessionCookie = getSessionCookie(request) + const isDevHost = + url.hostname === "localhost" || + url.hostname.includes(".localhost") || + url.hostname.includes(".dev.supermemory.ai") + + const sessionCookie = isDevHost + ? getSessionCookie(request, { cookiePrefix: "better-auth-dev" }) + : getSessionCookie(request) console.debug("[PROXY] Session cookie exists:", !!sessionCookie) // Always allow access to login and waitlist pages @@ -71,6 +78,6 @@ export default async function proxy(request: Request) { export const config = { matcher: [ - "/((?!_next/static|_next/image|images|icon.png|monitoring|opengraph-image.png|bg-rectangle.png|onboarding|ingest|login|api/emails|mcp-supported-tools|mcp-icon.svg).*)", + "/((?!_next/static|_next/image|images|icon.png|manifest.webmanifest|monitoring|opengraph-image.png|bg-rectangle.png|onboarding|ingest|login|api/emails|mcp-supported-tools|mcp-icon.svg).*)", ], }