add support for other plugins

This commit is contained in:
ved015 2026-05-15 13:13:31 +05:30
parent 0ae8200c4f
commit 6fa2a8c70e
3 changed files with 84 additions and 21 deletions

View file

@ -101,6 +101,17 @@ const PLUGIN_INFO: Record<string, PluginInfo> = {
],
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 {

View file

@ -364,22 +364,66 @@ function getDocumentText(document: DocumentWithMemories): string {
return typeof document.content === "string" ? document.content : ""
}
function toMetadataRecord(value: unknown): Record<string, unknown> | null {
if (!value) return null
if (typeof value === "object" && !Array.isArray(value)) {
return value as Record<string, unknown>
}
if (typeof value !== "string") return null
try {
const parsed = JSON.parse(value)
return parsed && typeof parsed === "object" && !Array.isArray(parsed)
? (parsed as Record<string, unknown>)
: null
} catch {
return null
}
}
function getDocumentMetadataRecords(
document: DocumentWithMemories,
): Record<string, unknown>[] {
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<string, unknown> => !!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"

View file

@ -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).*)",
],
}