remove no save memory plugin and fix memory routing

This commit is contained in:
ved015 2026-05-23 21:43:46 +05:30
parent 504490f2a8
commit 67149457ea
4 changed files with 75 additions and 14 deletions

View file

@ -60,6 +60,7 @@ import {
type IntegrationParamValue,
} from "@/lib/search-params"
import { getChatSpaceDisplayLabel } from "@/lib/chat-space-label"
import { getToolDocumentSpace } from "@/lib/plugin-space"
type DocumentsResponse = z.infer<typeof DocumentsWithMemoriesResponseSchema>
type DocumentWithMemories = DocumentsResponse["documents"][0]
@ -409,11 +410,8 @@ export default function NewPage() {
)
const handleOpenToolDocument = useCallback(
(document: DocumentWithMemories) => {
const documentSpace =
(document as { containerTags?: string[] }).containerTags?.[0] ??
document.memoryEntries.find((entry) => entry.spaceContainerTag)
?.spaceContainerTag
(document: DocumentWithMemories, pluginClientId: string) => {
const documentSpace = getToolDocumentSpace(document, pluginClientId)
if (documentSpace) {
setSelectedProject(documentSpace)
}

View file

@ -39,6 +39,7 @@ import {
usePersonalization,
type Profession,
} from "@/hooks/use-personalization"
import { normalizePluginClientId } from "@/lib/plugin-catalog"
type DocumentsResponse = z.infer<typeof DocumentsWithMemoriesResponseSchema>
type DocumentWithMemories = DocumentsResponse["documents"][0]
@ -438,7 +439,7 @@ function getPluginClientFromDocument(
: typeof metadata.sm_internal_mcp_client_name === "string"
? metadata.sm_internal_mcp_client_name
: null
if (metadataClient) return metadataClient.toLowerCase()
if (metadataClient) return normalizePluginClientId(metadataClient)
if (metadata.sm_source === "claude-code-plugin") return "claude_code"
}
@ -529,8 +530,9 @@ function parseToolUsage(
// Plugin keys
if (smType === "plugin_auth" && smClient) {
const catalog = PLUGIN_DISPLAY_CATALOG[smClient]
const existingItem = toolMap.get(`plugin_${smClient}`)
const normalizedClient = normalizePluginClientId(smClient)
const catalog = PLUGIN_DISPLAY_CATALOG[normalizedClient]
const existingItem = toolMap.get(`plugin_${normalizedClient}`)
const lastUsed =
toValidDate(key.lastRequest) ?? toValidDate(key.createdAt)
const existingLastUsed = existingItem?.lastUsedAt
@ -542,8 +544,8 @@ function parseToolUsage(
(!existingLastUsed ||
lastUsed.getTime() > existingLastUsed.getTime()))
) {
toolMap.set(`plugin_${smClient}`, {
id: `plugin_${smClient}`,
toolMap.set(`plugin_${normalizedClient}`, {
id: `plugin_${normalizedClient}`,
name: catalog?.name ?? smClient,
type: "Plugin",
icon: catalog?.icon ?? null,
@ -721,15 +723,20 @@ function ToolUsageRecentRow({
}: {
item: ToolUsageItem
onOpenPlugins: () => void
onOpenToolDocument: (document: DocumentWithMemories) => void
onOpenToolDocument: (
document: DocumentWithMemories,
pluginClientId: string,
) => void
}) {
const pluginClientId = item.id.replace(/^plugin_/, "")
return (
<li>
<button
type="button"
onClick={() => {
if (item.lastDocument) {
onOpenToolDocument(item.lastDocument)
onOpenToolDocument(item.lastDocument, pluginClientId)
return
}
onOpenPlugins()
@ -1106,7 +1113,10 @@ export function DashboardView({
onNavigateToMemories: () => void
onNavigateToGraph: () => void
onOpenDocument: (document: DocumentWithMemories) => void
onOpenToolDocument: (document: DocumentWithMemories) => void
onOpenToolDocument: (
document: DocumentWithMemories,
pluginClientId: string,
) => void
onHighlightsChat: (highlightContent: string, userReply: string) => void
onHighlightsShowRelated: (query: string) => void
onResetHighlights: () => void
@ -1218,7 +1228,12 @@ export function DashboardView({
const recents = recentsData?.documents ?? []
const recentToolUsageItems = toolUsageItems
.filter((item) => item.type === "Plugin")
.filter((item) => item.type === "Plugin" && item.lastDocument)
.sort((a, b) => {
const aTime = toValidDate(a.lastDocument?.createdAt)?.getTime() ?? 0
const bTime = toValidDate(b.lastDocument?.createdAt)?.getTime() ?? 0
return bTime - aTime
})
.slice(0, 3)
const totalMemories = recentsData?.pagination?.totalItems ?? 0
const hasMcp = mcpData?.previousLogin ?? false

View file

@ -147,3 +147,9 @@ const SPACE_TO_CATALOG_ID: Record<string, string> = {
export function spacePluginIdToCatalogId(spacePluginId: string): string | null {
return SPACE_TO_CATALOG_ID[spacePluginId] ?? null
}
/** Normalize plugin client ids from API keys, metadata, and space ids. */
export function normalizePluginClientId(client: string): string {
const trimmed = client.trim().toLowerCase()
return spacePluginIdToCatalogId(trimmed) ?? trimmed.replace(/-/g, "_")
}

View file

@ -1,3 +1,5 @@
import { normalizePluginClientId } from "@/lib/plugin-catalog"
export type PluginSpaceInfo = {
pluginId: "claude-code" | "openclaw" | "opencode" | "codex" | "amp"
label: string
@ -131,6 +133,46 @@ export function detectPluginSource(
}
}
type DocumentSpaceCandidate = {
containerTags?: string[]
memoryEntries?: Array<{ spaceContainerTag?: string | null }> | null
}
function catalogIdForPluginSpace(pluginId: PluginSpaceInfo["pluginId"]): string {
return pluginId.replace(/-/g, "_")
}
/** Resolve the best container tag for a tool/plugin document. */
export function getToolDocumentSpace(
document: DocumentSpaceCandidate,
pluginClientId?: string | null,
): string | null {
const containerTags = document.containerTags ?? []
const memorySpaceTags = (document.memoryEntries ?? [])
.map((entry) => entry.spaceContainerTag)
.filter((tag): tag is string => !!tag)
const allTags = [...containerTags, ...memorySpaceTags]
if (pluginClientId) {
const normalizedClient = normalizePluginClientId(pluginClientId)
for (const tag of allTags) {
const pluginSpace = detectPluginSpace(tag)
if (
pluginSpace &&
catalogIdForPluginSpace(pluginSpace.pluginId) === normalizedClient
) {
return tag
}
}
}
for (const tag of allTags) {
if (detectPluginSpace(tag)) return tag
}
return allTags[0] ?? null
}
export function detectPluginSpace(
containerTag: string,
): PluginSpaceInfo | null {