From 062f9842621836dfe8d55051d49dc429eb898a5e Mon Sep 17 00:00:00 2001
From: fengxiangdebaozi <10845145+fengxiangdebaozi@user.noreply.gitee.com>
Date: Thu, 4 Jun 2026 10:40:16 +0800
Subject: [PATCH 1/2] =?UTF-8?q?ai=E5=86=99=E4=BD=9C=E4=BD=8D=E7=BD=AE?=
=?UTF-8?q?=E8=B0=83=E6=95=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/open-canvas/pages/AIWritingPage.tsx | 124 ++++++++++++------
1 file changed, 87 insertions(+), 37 deletions(-)
diff --git a/frontend-web/src/open-canvas/pages/AIWritingPage.tsx b/frontend-web/src/open-canvas/pages/AIWritingPage.tsx
index cd96dc1a..d4ab02b9 100644
--- a/frontend-web/src/open-canvas/pages/AIWritingPage.tsx
+++ b/frontend-web/src/open-canvas/pages/AIWritingPage.tsx
@@ -102,17 +102,99 @@ import {
// Panel IDs used as keys in the v4 Layout map
const WRITING_ID = 'aw-writing';
const DRAFT_ID = 'aw-draft';
+// 初始问答阶段(idle)专用的两栏 ID:左=问答助手,右=写作配置表单
+const SETUP_CHAT_ID = 'aw-setup-chat';
+const SETUP_FORM_ID = 'aw-setup-form';
// Match the original canvas page proportions (chat=35, artifact=65)
const DEFAULT_LAYOUT = { [WRITING_ID]: 35, [DRAFT_ID]: 65 };
+// idle 阶段镜像原比例:问答框在左占大头(65),配置表单在右占小头(35)
+const SETUP_LAYOUT = { [SETUP_CHAT_ID]: 65, [SETUP_FORM_ID]: 35 };
/**
- * 右侧面板:未开始写作(idle)时显示「写作助手 Q&A」,帮用户聊清并回填左侧表单;
- * 一旦开始写作(status !== idle)就切回草稿预览。
+ * 写作配置表单面板(写作助手回填的目标),抽出复用:idle 时在右栏,开始写作后在左栏。
*/
-function AIWritingRightPanel() {
+function WritingFormPanel({ hideAdvancedFields }: { hideAdvancedFields: boolean }) {
+ return (
+ // 与原布局保持相同的 flex-1 min-h-0 包裹,确保内部 h-full 正确解析
+
+ );
+}
+
+/**
+ * 根据写作状态切换两套左右布局:
+ * - idle(初始问答阶段):左=「写作助手 Q&A」,右=「写作配置选项」表单;
+ * - 开始写作后:回到原布局——左=写作配置/时间线面板,右=草稿预览。
+ */
+function AIWritingLayout({ hideAdvancedFields }: { hideAdvancedFields: boolean }) {
+ const layoutRef = useRef(null);
const { state } = useAIWriting();
- return state.status === 'idle' ? : ;
+
+ if (state.status === 'idle') {
+ return (
+
+ {/* 左侧:写作助手 Q&A */}
+
+
+
+
+
+
+ {/* 右侧:写作配置选项表单 */}
+
+
+
+
+ );
+ }
+
+ return (
+
+ {/* 左侧:AI 写作面板,与原画布页左侧等宽 */}
+
+
+
+
+
+
+ {/* 右侧:草稿预览面板 */}
+
+
+
+
+ );
}
export default function AIWritingPage({
@@ -120,8 +202,6 @@ export default function AIWritingPage({
}: {
hideAdvancedFields?: boolean;
} = {}) {
- const layoutRef = useRef(null);
-
return (
@@ -131,37 +211,7 @@ export default function AIWritingPage({
-
- {/* 左侧:AI 写作面板,与原画布页左侧等宽 */}
-
- {/* 与原布局保持相同的 flex-1 min-h-0 包裹,确保内部 h-full 正确解析 */}
-
-
-
-
-
- {/* 右侧:草稿预览面板 */}
-
-
-
-
+
From 5b686824c51e7f0f9a8e811e279e34654c68d6ab Mon Sep 17 00:00:00 2001
From: fengxiangdebaozi <10845145+fengxiangdebaozi@user.noreply.gitee.com>
Date: Thu, 4 Jun 2026 11:08:42 +0800
Subject: [PATCH 2/2] =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../settings/memory-settings-page.tsx | 127 +++++++++++++-----
1 file changed, 92 insertions(+), 35 deletions(-)
diff --git a/frontend-web/src/components/workspace/settings/memory-settings-page.tsx b/frontend-web/src/components/workspace/settings/memory-settings-page.tsx
index 6a2f82f6..477f039e 100644
--- a/frontend-web/src/components/workspace/settings/memory-settings-page.tsx
+++ b/frontend-web/src/components/workspace/settings/memory-settings-page.tsx
@@ -1,6 +1,6 @@
"use client";
-import { PenLineIcon, PlusIcon, SearchIcon, Trash2Icon } from "lucide-react";
+import { PenLineIcon, PlusIcon, SearchIcon, Trash2Icon, Heart, BookOpen, Map, Zap, Target, ShieldAlert } from "lucide-react";
import { useMemo, useState } from "react";
import { toast } from "sonner";
@@ -464,13 +464,41 @@ const HISTORY_LABELS: Record = {
longTermBackground: "长期背景",
};
+const CATEGORY_LABELS: Record> = {
+ zh: {
+ preference: "偏好",
+ knowledge: "知识",
+ context: "背景",
+ behavior: "行为",
+ goal: "目标",
+ correction: "纠偏",
+ },
+ en: {
+ preference: "Preference",
+ knowledge: "Knowledge",
+ context: "Context",
+ behavior: "Behavior",
+ goal: "Goal",
+ correction: "Correction",
+ },
+};
+
const CATEGORY_COLORS: Record = {
- preference: "bg-blue-100 text-blue-700",
- knowledge: "bg-green-100 text-green-700",
- context: "bg-yellow-100 text-yellow-700",
- behavior: "bg-purple-100 text-purple-700",
- goal: "bg-orange-100 text-orange-700",
- correction: "bg-red-100 text-red-700",
+ preference: "bg-blue-50 text-blue-700 border border-blue-200/50 dark:bg-blue-950/30 dark:text-blue-400 dark:border-blue-900/30",
+ knowledge: "bg-green-50 text-green-700 border border-green-200/50 dark:bg-green-950/30 dark:text-green-400 dark:border-green-900/30",
+ context: "bg-amber-50 text-amber-700 border border-amber-200/50 dark:bg-amber-950/30 dark:text-amber-400 dark:border-amber-900/30",
+ behavior: "bg-purple-50 text-purple-700 border border-purple-200/50 dark:bg-purple-950/30 dark:text-purple-400 dark:border-purple-900/30",
+ goal: "bg-orange-50 text-orange-700 border border-orange-200/50 dark:bg-orange-950/30 dark:text-orange-400 dark:border-orange-900/30",
+ correction: "bg-red-50 text-red-700 border border-red-200/50 dark:bg-red-950/30 dark:text-red-400 dark:border-red-900/30",
+};
+
+const CATEGORY_ICONS: Record = {
+ preference: Heart,
+ knowledge: BookOpen,
+ context: Map,
+ behavior: Zap,
+ goal: Target,
+ correction: ShieldAlert,
};
/** V1 记忆只读视图:展示 memory.json 的全部字段,Tab 布局。 */
@@ -484,6 +512,9 @@ function MemoryV1View({
memory_usage: string;
};
}) {
+ const { locale } = useI18n();
+ const isZh = locale.startsWith("zh");
+ const labelMap = isZh ? CATEGORY_LABELS.zh : CATEGORY_LABELS.en;
const ctxEntries = Object.entries(memory.user_context ?? {}).filter(([, v]) => v);
const historyEntries = Object.entries(memory.history ?? {}).filter(([, v]) => v);
@@ -519,37 +550,63 @@ function MemoryV1View({
暂无事实记录,对话后系统会自动提取。
) : (
-
- {memory.facts.map((fact) => (
-
-
-
- {fact.category}
-
-
-
+
+ {memory.facts.map((fact) => {
+ const categoryLabel = labelMap[fact.category] ?? fact.category;
+ const Icon = CATEGORY_ICONS[fact.category] ?? PlusIcon;
+ return (
+
+ {/* Subtle top highlight */}
+
+
+
+
+
+
+ {categoryLabel}
+
+
+
+ {Math.round(fact.confidence * 100)}%
+
+ {/* Confidence Progress Bar */}
+
+
+
+
+
+ {desensitize(fact.content)}
+
-
- {Math.round(fact.confidence * 100)}%
-
+
+ {fact.sourceError && (
+
+
+
+
+ 避免
+
+
{desensitize(fact.sourceError)}
+
+
+ )}
-
{desensitize(fact.content)}
- {fact.sourceError && (
-
- 避免:{desensitize(fact.sourceError)}
-
- )}
-
- ))}
+ );
+ })}
- )}
+ )}