Compare commits

...
Author SHA1 Message Date
kristinheandCursor c13950a4c1 fix(memhub): clarify Lite raw conversation labels
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-11-05 11:29:31 +08:00
15 changed files with 58 additions and 8 deletions

No files matched your search

+2 -2
View File
@@ -1235,11 +1235,11 @@ export function MemoryMap(props: Props) {
<h2>
{props.simplified
? raw
? t("memory:原始对话")
? text("来源归属")
: text("记忆关联")
: label}
</h2>
{props.simplified && (
{props.simplified && (!raw || !projection.nodes.length) && (
<p className="selected-graph-subtitle">
{projection.nodes.length
? text("来源归属")
@@ -289,6 +289,11 @@ it("shows raw conversations instead of advanced memory in lite", async () => {
render(<MemorySpace simplified />);
expect(await screen.findAllByText("原始对话内容")).toHaveLength(2);
expect(screen.getByText("1 条原始对话")).toBeTruthy();
expect(screen.queryByText("找到 1 条")).toBeNull();
expect(
screen.getByRole("heading", { level: 2, name: "来源归属" }),
).toBeTruthy();
expect(
document.querySelector(".core-memory-map")?.hasAttribute("hidden"),
).toBe(false);
@@ -625,6 +630,7 @@ it("opens a search hit with the complete role transcript", async () => {
await user.click(screen.getByRole("button", { name: "搜索" }));
expect(await screen.findByText("完整问题")).toBeTruthy();
expect(screen.getByText("找到 1 条")).toBeTruthy();
expect(screen.getByText("完整回答")).toBeTruthy();
expect(
document.querySelector(".map-dialogue-reading")?.textContent,
+3 -4
View File
@@ -964,10 +964,9 @@ export function MemorySpace({
? sdkPage
? sdkPage.total_exact === false
? t("memory:原始对话")
: `${t("memory:原始对话")} · ${tn(
"sdk.raw.found",
sdkPage.total,
)}`
: sdkLibrary.settledQuery.trim()
? tn("sdk.raw.found", sdkPage.total)
: tn("sdk.raw.total", sdkPage.total)
: sdkLibrary.failed
? null
: t("memory:正在读取…")
@@ -29,6 +29,8 @@ it("shows every role and preserves a long original message in the detail pane",
messages: [
{ role: "user", content: long },
{ role: "assistant", content: "已收到" },
{ role: "tool", content: "3 tests passed" },
{ role: "unknown", content: "来源角色缺失" },
],
}}
sources={[]}
@@ -38,6 +40,10 @@ it("shows every role and preserves a long original message in the detail pane",
expect(screen.getByText("你")).toBeTruthy();
expect(screen.getByText("助手")).toBeTruthy();
expect(screen.getByText("工具")).toBeTruthy();
expect(screen.getByText("作者待核对")).toBeTruthy();
expect(screen.getByText(long)).toHaveProperty("textContent", long);
expect(screen.getByText("已收到")).toBeTruthy();
expect(screen.queryByText("原始对话")).toBeNull();
expect(screen.getByRole("article", { name: "原始对话" })).toBeTruthy();
});
+2 -2
View File
@@ -14,6 +14,7 @@ function authorLabel(role: string, t: ReturnType<typeof useGuiLanguage>["t"]) {
if (role === "user") return t("selectedMemory.author.user");
if (role === "assistant" || role === "agent")
return t("selectedMemory.author.agent");
if (role === "tool") return t("selectedMemory.author.tool");
return t("selectedMemory.author.unknown");
}
@@ -46,8 +47,7 @@ export function SelectedRawDetail({
record.source || t("selectedMemory.sourceUnknown"),
);
return (
<article className="map-dialogue-reading">
<p className="selected-memory-status">{t("memory:原始对话")}</p>
<article className="map-dialogue-reading" aria-label={t("memory:原始对话")}>
<ul className="map-transcript">
{messages.map((message) => (
<li key={`${rawRecordId(record)}:${message.role}:${message.content}`}>
@@ -229,6 +229,12 @@ describe("English catalog", () => {
});
it("uses CLDR English singular and plural forms", () => {
expect(translateCount("en", "sdk.raw.total", 1, { count: 1 })).toBe(
"1 original conversation",
);
expect(translateCount("en", "sdk.raw.total", 2, { count: 2 })).toBe(
"2 original conversations",
);
expect(
translateCount("en", "calls.headline.found", 1, {
host: "Cursor",
@@ -73,6 +73,8 @@ export const currentChineseMessages = {
"sdk.raw.searchFailed": "原始对话搜索失败,请重试。",
"sdk.raw.recent": "最近原始对话",
"sdk.raw.empty": "还没有原始对话。连接来源后,对话会显示在这里。",
"sdk.raw.total": "{count} 条原始对话",
"sdk.raw.total.one": "{count} 条原始对话",
"sdk.raw.found": "找到 {count} 条",
"sdk.raw.found.one": "找到 {count} 条",
@@ -134,6 +136,7 @@ export const currentChineseMessages = {
"selectedMemory.save": "保存修改",
"selectedMemory.author.user": "你",
"selectedMemory.author.agent": "助手",
"selectedMemory.author.tool": "工具",
"selectedMemory.sourceUnavailable": "来源权限已变化或原文不可用。",
"selectedMemory.related": "对应记忆",
"selectedMemory.viewMemory": "查看记忆",
@@ -222,6 +225,8 @@ export const currentEnglishMessages: Record<
"sdk.raw.recent": "Recent original conversations",
"sdk.raw.empty":
"No original conversations yet. Connect a source to see conversations here.",
"sdk.raw.total": "{count} original conversations",
"sdk.raw.total.one": "{count} original conversation",
"sdk.raw.found": "{count} results",
"sdk.raw.found.one": "{count} result",
@@ -289,6 +294,7 @@ export const currentEnglishMessages: Record<
"selectedMemory.save": "Save changes",
"selectedMemory.author.user": "You",
"selectedMemory.author.agent": "Assistant",
"selectedMemory.author.tool": "Tool",
"selectedMemory.sourceUnavailable":
"Source permissions changed or the original text is unavailable.",
"selectedMemory.related": "Related memory",
@@ -384,6 +390,8 @@ export const currentSpanishMessages: Record<
"sdk.raw.recent": "Conversaciones originales recientes",
"sdk.raw.empty":
"Todavía no hay conversaciones originales. Conecta una fuente para verlas aquí.",
"sdk.raw.total": "{count} conversaciones originales",
"sdk.raw.total.one": "{count} conversación original",
"sdk.raw.found": "{count} resultados",
"sdk.raw.found.one": "{count} resultado",
@@ -452,6 +460,7 @@ export const currentSpanishMessages: Record<
"selectedMemory.save": "Guardar cambios",
"selectedMemory.author.user": "Tú",
"selectedMemory.author.agent": "Asistente",
"selectedMemory.author.tool": "Herramienta",
"selectedMemory.sourceUnavailable":
"Los permisos del origen cambiaron o el texto no está disponible.",
"selectedMemory.related": "Memoria correspondiente",
@@ -86,6 +86,8 @@ export const germanMessages: Record<MessageKey, string> = {
"sdk.raw.recent": "Letzte Originalunterhaltungen",
"sdk.raw.empty":
"Noch keine Originalunterhaltungen. Verbinde eine Quelle, damit sie hier erscheinen.",
"sdk.raw.total": "{count} Originalunterhaltungen",
"sdk.raw.total.one": "{count} Originalunterhaltung",
"memory:当前使用基础记忆。新对话会保存为原始记录,不会生成高级记忆;以前生成的高级记忆仍会保留,但当前不会显示或参与记忆召回。":
"Der Basisspeicher ist aktiv. Neue Unterhaltungen werden als Originale gespeichert und erzeugen keine erweiterten Erinnerungen. Vorhandene erweiterte Erinnerungen bleiben gespeichert, werden aber nicht angezeigt oder abgerufen.",
"memory:当前使用智能记忆。新对话会由模型整理为高级记忆。":
@@ -158,6 +160,7 @@ export const germanMessages: Record<MessageKey, string> = {
"selectedMemory.save": "Speichern",
"selectedMemory.author.user": "Sie",
"selectedMemory.author.agent": "Assistent",
"selectedMemory.author.tool": "Tool",
"selectedMemory.sourceUnavailable":
"Quellberechtigungen haben sich geändert oder der Originaltext ist nicht verfügbar.",
"selectedMemory.related": "Zugehörige Erinnerung",
@@ -87,6 +87,8 @@ export const frenchMessages: Record<MessageKey, string> = {
"sdk.raw.recent": "Conversations originales récentes",
"sdk.raw.empty":
"Aucune conversation originale pour le moment. Connectez une source pour les afficher ici.",
"sdk.raw.total": "{count} conversations originales",
"sdk.raw.total.one": "{count} conversation originale",
"memory:当前使用基础记忆。新对话会保存为原始记录,不会生成高级记忆;以前生成的高级记忆仍会保留,但当前不会显示或参与记忆召回。":
"La mémoire de base est active. Les nouvelles conversations sont conservées telles quelles et ne créent pas de mémoires avancées. Les mémoires avancées existantes restent enregistrées, mais ne sont ni affichées ni rappelées.",
"memory:当前使用智能记忆。新对话会由模型整理为高级记忆。":
@@ -162,6 +164,7 @@ export const frenchMessages: Record<MessageKey, string> = {
"selectedMemory.save": "Enregistrer",
"selectedMemory.author.user": "Vous",
"selectedMemory.author.agent": "Assistant",
"selectedMemory.author.tool": "Outil",
"selectedMemory.sourceUnavailable":
"Les autorisations de la source ont changé ou le texte original est indisponible.",
"selectedMemory.related": "Mémoire associée",
@@ -81,6 +81,8 @@ export const indonesianMessages: Record<MessageKey, string> = {
"sdk.raw.recent": "Percakapan asli terbaru",
"sdk.raw.empty":
"Belum ada percakapan asli. Hubungkan sumber agar percakapan tampil di sini.",
"sdk.raw.total": "{count} percakapan asli",
"sdk.raw.total.one": "{count} percakapan asli",
"memory:当前使用基础记忆。新对话会保存为原始记录,不会生成高级记忆;以前生成的高级记忆仍会保留,但当前不会显示或参与记忆召回。":
"Memori dasar aktif. Percakapan baru disimpan sebagai catatan asli dan tidak membuat memori lanjutan. Memori lanjutan yang ada tetap tersimpan, tetapi tidak ditampilkan atau digunakan untuk recall.",
"memory:当前使用智能记忆。新对话会由模型整理为高级记忆。":
@@ -151,6 +153,7 @@ export const indonesianMessages: Record<MessageKey, string> = {
"selectedMemory.save": "Simpan perubahan",
"selectedMemory.author.user": "Anda",
"selectedMemory.author.agent": "Asisten",
"selectedMemory.author.tool": "Alat",
"selectedMemory.sourceUnavailable":
"Izin sumber berubah atau teks asli tidak tersedia.",
"selectedMemory.related": "Memori terkait",
@@ -83,6 +83,8 @@ export const japaneseMessages: Record<MessageKey, string> = {
"sdk.raw.recent": "最近の元の会話",
"sdk.raw.empty":
"元の会話はまだありません。ソースを接続すると、ここに表示されます。",
"sdk.raw.total": "元の会話 {count} 件",
"sdk.raw.total.one": "元の会話 {count} 件",
"memory:当前使用基础记忆。新对话会保存为原始记录,不会生成高级记忆;以前生成的高级记忆仍会保留,但当前不会显示或参与记忆召回。":
"基本メモリを使用中です。新しい会話は原文として保存され、高度なメモリは生成されません。既存の高度なメモリは保持されますが、現在は表示も呼び出しもされません。",
"memory:当前使用智能记忆。新对话会由模型整理为高级记忆。":
@@ -152,6 +154,7 @@ export const japaneseMessages: Record<MessageKey, string> = {
"selectedMemory.save": "変更を保存",
"selectedMemory.author.user": "あなた",
"selectedMemory.author.agent": "アシスタント",
"selectedMemory.author.tool": "ツール",
"selectedMemory.sourceUnavailable":
"ソースの権限が変更されたか、原文を利用できません。",
"selectedMemory.related": "関連する記憶",
@@ -80,6 +80,8 @@ export const koreanMessages: Record<MessageKey, string> = {
"sdk.raw.recent": "최근 원본 대화",
"sdk.raw.empty":
"아직 원본 대화가 없습니다. 소스를 연결하면 여기에 표시됩니다.",
"sdk.raw.total": "원본 대화 {count}개",
"sdk.raw.total.one": "원본 대화 {count}개",
"memory:当前使用基础记忆。新对话会保存为原始记录,不会生成高级记忆;以前生成的高级记忆仍会保留,但当前不会显示或参与记忆召回。":
"기본 메모리를 사용 중입니다. 새 대화는 원본 기록으로 저장되며 고급 메모리를 만들지 않습니다. 기존 고급 메모리는 보존되지만 현재 표시되거나 회상에 사용되지 않습니다.",
"memory:当前使用智能记忆。新对话会由模型整理为高级记忆。":
@@ -149,6 +151,7 @@ export const koreanMessages: Record<MessageKey, string> = {
"selectedMemory.save": "변경 사항 저장",
"selectedMemory.author.user": "나",
"selectedMemory.author.agent": "어시스턴트",
"selectedMemory.author.tool": "도구",
"selectedMemory.sourceUnavailable":
"출처 권한이 변경되었거나 원문을 사용할 수 없습니다.",
"selectedMemory.related": "관련 기억",
@@ -86,6 +86,8 @@ export const portugueseMessages: Record<MessageKey, string> = {
"sdk.raw.recent": "Conversas originais recentes",
"sdk.raw.empty":
"Ainda não há conversas originais. Ligue uma origem para as ver aqui.",
"sdk.raw.total": "{count} conversas originais",
"sdk.raw.total.one": "{count} conversa original",
"memory:当前使用基础记忆。新对话会保存为原始记录,不会生成高级记忆;以前生成的高级记忆仍会保留,但当前不会显示或参与记忆召回。":
"A memória básica está ativa. As novas conversas são guardadas como registos originais e não criam memórias avançadas. As memórias avançadas existentes continuam guardadas, mas não são mostradas nem usadas na recuperação.",
"memory:当前使用智能记忆。新对话会由模型整理为高级记忆。":
@@ -159,6 +161,7 @@ export const portugueseMessages: Record<MessageKey, string> = {
"selectedMemory.save": "Salvar alterações",
"selectedMemory.author.user": "Você",
"selectedMemory.author.agent": "Assistente",
"selectedMemory.author.tool": "Ferramenta",
"selectedMemory.sourceUnavailable":
"As permissões da fonte mudaram ou o texto original não está disponível.",
"selectedMemory.related": "Memória relacionada",
@@ -83,6 +83,8 @@ export const russianMessages: Record<MessageKey, string> = {
"sdk.raw.recent": "Недавние исходные диалоги",
"sdk.raw.empty":
"Исходных диалогов пока нет. Подключите источник, и они появятся здесь.",
"sdk.raw.total": "Исходных диалогов: {count}",
"sdk.raw.total.one": "{count} исходный диалог",
"memory:当前使用基础记忆。新对话会保存为原始记录,不会生成高级记忆;以前生成的高级记忆仍会保留,但当前不会显示或参与记忆召回。":
"Включена базовая память. Новые диалоги сохраняются в исходном виде и не создают расширенные воспоминания. Существующие расширенные воспоминания сохраняются, но не показываются и не используются при поиске.",
"memory:当前使用智能记忆。新对话会由模型整理为高级记忆。":
@@ -155,6 +157,7 @@ export const russianMessages: Record<MessageKey, string> = {
"selectedMemory.save": "Сохранить изменения",
"selectedMemory.author.user": "Вы",
"selectedMemory.author.agent": "Ассистент",
"selectedMemory.author.tool": "Инструмент",
"selectedMemory.sourceUnavailable":
"Разрешения источника изменились, или исходный текст недоступен.",
"selectedMemory.related": "Связанная запись памяти",
@@ -74,6 +74,8 @@ export const traditionalChineseMessages: Record<MessageKey, string> = {
"sdk.raw.searchFailed": "原始對話搜尋失敗,請重試。",
"sdk.raw.recent": "最近原始對話",
"sdk.raw.empty": "還沒有原始對話。連接來源後,對話會顯示在這裡。",
"sdk.raw.total": "{count} 則原始對話",
"sdk.raw.total.one": "{count} 則原始對話",
"memory:当前使用基础记忆。新对话会保存为原始记录,不会生成高级记忆;以前生成的高级记忆仍会保留,但当前不会显示或参与记忆召回。":
"目前使用基礎記憶。新對話會保留為原始記錄,不會產生進階記憶;過去的進階記憶仍會保留,但目前不會顯示或參與記憶召回。",
"memory:当前使用智能记忆。新对话会由模型整理为高级记忆。":
@@ -139,6 +141,7 @@ export const traditionalChineseMessages: Record<MessageKey, string> = {
"selectedMemory.save": "儲存修改",
"selectedMemory.author.user": "你",
"selectedMemory.author.agent": "助理",
"selectedMemory.author.tool": "工具",
"selectedMemory.sourceUnavailable": "來源權限已變化或原文不可用。",
"selectedMemory.related": "對應記憶",
"selectedMemory.viewMemory": "檢視記憶",