From 0a29eb4f9df3d32c6833aede493955dc8a316535 Mon Sep 17 00:00:00 2001 From: tianma-if Date: Thu, 3 Sep 2026 22:46:10 +0800 Subject: [PATCH] feat(settings): rename agent mode to paw mode and promote to top-level tab --- .../components/CompanionDiscoveryHub.test.mjs | 10 +++---- apps/web/src/components/SettingsPane.tsx | 29 +++++++++++++++++-- bun.lock | 2 +- docs/personality-memory-agent.md | 10 +++---- docs/personality-memory-agent.zh-CN.md | 10 +++---- packages/shared/src/i18n/en-US.ts | 9 +++--- packages/shared/src/i18n/zh-CN.ts | 9 +++--- 7 files changed, 53 insertions(+), 26 deletions(-) diff --git a/apps/web/src/components/CompanionDiscoveryHub.test.mjs b/apps/web/src/components/CompanionDiscoveryHub.test.mjs index 31f23add..0537fb8e 100644 --- a/apps/web/src/components/CompanionDiscoveryHub.test.mjs +++ b/apps/web/src/components/CompanionDiscoveryHub.test.mjs @@ -29,10 +29,10 @@ describe("quiet discovery UI", () => { expect(html).toContain('aria-label="来自 EdgeEver 的发现"'); expect(html).not.toContain('role="dialog"'); expect(html).not.toContain("有新发现"); }); - test("Agent mode briefly explains benefits and confirmation without notebook selection", async () => { + test("Paw mode briefly explains benefits and confirmation without notebook selection", async () => { const html = await render(false, "zh-CN", true); - expect(html).toContain("帮你合并零散点子、补充已有笔记、发现相关旧知识。修改前由你确认。"); - expect(html).toContain("Agent 模式"); + expect(html).toContain("开启后,EdgeEver 会像猫爪轻推纸片一样,帮你归拢零散碎片、将新想法沉淀到已有笔记、挑出过往的相关灵感。只在有价值时轻量提醒,改动完全由你决定。"); + expect(html).toContain("猫爪模式"); expect(html).not.toContain("默认模型服务商"); expect(html).not.toContain("24 小时"); expect(html).toContain('role="switch"'); expect(html).not.toContain('disabled=""'); expect(html).toContain('aria-checked="false"'); @@ -41,9 +41,9 @@ describe("quiet discovery UI", () => { }); test("English settings have matching concise benefits and no raw translation keys", async () => { const html = await render(false, "en-US", true); - expect(html).toContain("Combine scattered ideas, add to existing notes, and rediscover related knowledge. Changes require your confirmation."); + expect(html).toContain("When enabled, EdgeEver quietly helps tuck scattered fragments together, append new ideas to existing notes, and surface relevant past insights like a gentle cat paw. It nudges you only when valuable, and all changes remain entirely up to you."); expect(html).not.toContain("default model provider"); expect(html).not.toContain("one minute"); - expect(html).not.toContain("companion.discovery."); expect(html).toContain("Agent mode"); + expect(html).not.toContain("companion.discovery."); expect(html).toContain("Paw mode"); }); test("checks are event-driven, sync-gated and cancel on cleanup", () => { const source = readFileSync(new URL("./CompanionDiscoveryHub.tsx", import.meta.url), "utf8"); diff --git a/apps/web/src/components/SettingsPane.tsx b/apps/web/src/components/SettingsPane.tsx index fc15a749..b5203628 100644 --- a/apps/web/src/components/SettingsPane.tsx +++ b/apps/web/src/components/SettingsPane.tsx @@ -4,6 +4,7 @@ import { Database, Info, LayoutTemplate, + PawPrint, Shield, SlidersHorizontal, Sparkles, @@ -16,6 +17,7 @@ import { useTranslation } from "react-i18next"; import * as m from "motion/react-m"; import { SystemInfoDialog } from "@/components/SystemInfoDialog"; import { Button } from "@/components/ui/button"; +import { Card, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import type { EditorContentAlignment, ShortcutSettings } from "@/lib/app-helpers"; import { WORKSPACE_PAGE_TITLE_CLASSNAME } from "@/lib/workspace-ui"; import { cn } from "@/lib/utils"; @@ -71,7 +73,7 @@ const SettingsGroup = ({ children }: { children: ReactNode }) => ( ); -type TabKey = "general" | "users" | "data" | "ai" | "advanced" | "account"; +type TabKey = "general" | "paw" | "users" | "data" | "ai" | "advanced" | "account"; interface TabItem { key: TabKey; @@ -152,6 +154,15 @@ export const SettingsPane = ({ }, ] : []), + { + key: "paw", + label: t("settings.tabs.paw"), + icon: PawPrint, + colorClass: "text-emerald-700", + bgColorClass: "bg-emerald-50/80", + hoverColorClass: "hover:bg-emerald-50/40", + iconColorClass: "text-emerald-600", + }, { key: "advanced", label: t("settings.tabs.advanced"), @@ -220,6 +231,21 @@ export const SettingsPane = ({ ); + case "paw": + return ( + + {authRequired && user && !demoMode ? ( + + ) : ( + + + {t("companion.discovery.settingsTitle")} + {t("companion.unavailableHelp")} + + + )} + + ); case "users": return isOwner ? ( @@ -237,7 +263,6 @@ export const SettingsPane = ({ return ( - {authRequired && user && !demoMode ? : null} diff --git a/bun.lock b/bun.lock index 2283aef2..9fe1a348 100644 --- a/bun.lock +++ b/bun.lock @@ -93,7 +93,7 @@ }, "apps/desktop": { "name": "@edgeever/desktop", - "version": "1.53.0", + "version": "1.54.0", "dependencies": { "croner": "^10.0.1", "electron-updater": "^6.6.2", diff --git a/docs/personality-memory-agent.md b/docs/personality-memory-agent.md index 2ab99a20..dd0a2863 100644 --- a/docs/personality-memory-agent.md +++ b/docs/personality-memory-agent.md @@ -1,4 +1,4 @@ -# EdgeEver Agent mode: design and tradeoffs +# EdgeEver Paw mode: design and tradeoffs [简体中文](personality-memory-agent.zh-CN.md) @@ -14,7 +14,7 @@ The main flow is: normal note-taking → the Agent identifies an opportunity at ## 2. Interaction rules -- Entry: Settings → AI integration → Agent mode, off by default. Enabling covers all notes in the current account, including child notebooks and future notes, without notebook selection. This does not mean reading or sending the entire library at once. +- Entry: Settings → Paw mode, off by default. Enabling covers all notes in the current account, including child notebooks and future notes, without notebook selection. This does not mean reading or sending the entire library at once. - Use a small bell and unread dot, without primary navigation, automatic popups, or system notifications. Currently available to signed-in personal accounts on non-demo instances with login enabled; no native Android/iOS entry yet. - Informational notifications offer useful connections, explanations, and source links without requiring a task. Action notifications explain which notes will change, how, and with what consequences; confirmation invokes existing note capabilities. - Suggestions do not enter the normal note list or automatically become “AI suggestion drafts.” Notes are created or modified only after confirmation of the corresponding write. @@ -22,7 +22,7 @@ The main flow is: normal note-taking → the Agent identifies an opportunity at The settings page keeps only a short benefit description: -> Combine scattered ideas, add to existing notes, and rediscover related knowledge. Changes require your confirmation. +> When enabled, EdgeEver quietly helps tuck scattered fragments together, append new ideas to existing notes, and surface relevant past insights like a gentle cat paw. It nudges you only when valuable, and all changes remain entirely up to you. ## 3. Current capabilities and boundaries @@ -33,7 +33,7 @@ The settings page keeps only a short benefit description: | Proactive discovery: append | Add a new fragment to an existing note while preserving the source and original target content | Currently limited to plain-text notes without attachments; no automatic rewriting of rich documents | | Optional conversation: note tools | 28 existing tools: 13 reads and 15 confirmed writes covering creation, import, editing, merging, moving, tags, trash, revision recovery, and notebook organization | Discovery does not propose all these operations; permanent deletion, public sharing, binary uploads, and system administration are not exposed | -“Conversation and personal memory” remains an optional settings entry. Conversation currently has independent note-access and memory controls, with note access off by default; these are not unified with the Agent-mode switch. This is the implementation state, not a requirement to select notebooks, and must not be presented as a single permission switch across the product. +“Conversation and personal memory” remains an optional settings entry. Conversation currently has independent note-access and memory controls, with note access off by default; these are not unified with the Paw-mode switch. This is the implementation state, not a requirement to select notebooks, and must not be presented as a single permission switch across the product. “Note-operation capabilities” means reusing existing APIs and business services, not building another note system or granting unattended write authority to the model. Proactive tagging and other notification-based organization scenarios are not yet connected; the full tool catalog must not be advertised as proactive functionality. @@ -149,7 +149,7 @@ Notes, memories, attachments, and tool results are untrusted data. They cannot c - Build a real-note evaluation set: whether fragments belong to one idea, whether merging/appending is worthwhile, and whether connections are useful. Measure false positives, interruptions, acceptance, and harmful organization—not notification count or chat duration. - Validate structured outputs, tool calling, cancellation, source accuracy, and prompt-injection defenses with real models. Model failures must not disrupt ordinary note operations. - Measure installer size, cold start, CPU, RSS/heap, and model costs with the Agent disabled, idle, on first use, during sustained use, and after cancellation. Separate client and server measurements; use the [desktop performance baseline](desktop-performance-baseline.md). -- Once current scenarios are reliable, evaluate memory-informed suggestions, proactive tagging, and consistent permissions across conversation and Agent mode. These document goals are not completed features. +- Once current scenarios are reliable, evaluate memory-informed suggestions, proactive tagging, and consistent permissions across conversation and Paw mode. These document goals are not completed features. - Complete backup/recovery, deletion propagation, and cross-device experience. Automation, reminders, multiple agents, and heavier retrieval infrastructure are not in the current default scope; reconsider only when actual needs and measurements justify them. Implementation changes must pass relevant tests, the full non-E2E suite, `bun run typecheck`, `bun run typecheck:mobile`, and `bun run build:web`. Passing tests does not establish suggestion quality or acceptable resource usage. diff --git a/docs/personality-memory-agent.zh-CN.md b/docs/personality-memory-agent.zh-CN.md index cf32671d..0bb79363 100644 --- a/docs/personality-memory-agent.zh-CN.md +++ b/docs/personality-memory-agent.zh-CN.md @@ -1,4 +1,4 @@ -# EdgeEver Agent 模式:方案与取舍 +# EdgeEver 猫爪模式:方案与取舍 [English](personality-memory-agent.md) @@ -14,7 +14,7 @@ Agent 是围绕用户知识工作的长期助手,不是一个熟悉笔记的 ## 2. 交互规则 -- 入口为「设置 → AI 集成 → Agent 模式」,默认关闭。开启后,笔记访问范围覆盖当前账户的全部笔记,包括子笔记本和以后新建的笔记,无需选择笔记本;不代表一次读取或发送全库。 +- 入口为「设置 → 猫爪模式」,默认关闭。开启后,笔记访问范围覆盖当前账户的全部笔记,包括子笔记本和以后新建的笔记,无需选择笔记本;不代表一次读取或发送全库。 - 使用轻量铃铛和未读圆点,不占主导航、不自动弹窗、不发系统通知。当前仅向已登录的个人账户开放,要求非 Demo 且启用登录的实例;原生 Android/iOS 尚无入口。 - 普通通知提供有价值的关联、解释和来源链接,无须执行任务。操作通知说明处理哪些笔记、如何处理及其后果,用户确认后调用现有笔记能力执行。 - 建议不混入正常笔记,也不默认生成「AI 建议草稿」。只有确认了相应写入操作,才创建或修改笔记。 @@ -22,7 +22,7 @@ Agent 是围绕用户知识工作的长期助手,不是一个熟悉笔记的 设置页只保留简短用途介绍: -> 帮你合并零散点子、补充已有笔记、发现相关旧知识。修改前由你确认。 +> 开启后,EdgeEver 会像猫爪轻推纸片一样,帮你归拢零散碎片、将新想法沉淀到已有笔记、挑出过往的相关灵感。只在有价值时轻量提醒,改动完全由你决定。 ## 3. 当前能力与边界 @@ -33,7 +33,7 @@ Agent 是围绕用户知识工作的长期助手,不是一个熟悉笔记的 | 主动发现:补入 | 把新片段追加到已有笔记,保留来源和目标原文 | 当前仅支持无附件的纯文字笔记,不自动改写复杂文档 | | 可选对话:笔记工具 | 28 项现有工具:13 项读取、15 项确认写入,覆盖创建、导入、修改、合并、移动、标签、回收站、版本恢复及笔记本整理 | 不等于主动发现会提出所有这些操作;永久删除、公开分享、二进制上传和系统管理未开放 | -「对话与个人记忆」仍是设置中的可选入口。当前对话有独立的笔记访问和记忆开关,笔记访问默认关闭;它与 Agent 模式开关尚未统一。这是实现现状,不是要求用户额外选择笔记本,也不应被描述为全产品只有一个权限开关。 +「对话与个人记忆」仍是设置中的可选入口。当前对话有独立的笔记访问和记忆开关,笔记访问默认关闭;它与猫爪模式开关尚未统一。这是实现现状,不是要求用户额外选择笔记本,也不应被描述为全产品只有一个权限开关。 “具备笔记操作能力”意味着复用既有 API 和业务服务,而不是另写一套笔记系统,也不意味着模型获得无人值守修改权限。主动通知中的打标签等更多整理场景尚未接入,不能按完整工具目录对外承诺。 @@ -149,7 +149,7 @@ Agent 专用表共七张,位于现有实例数据库中,不另建数据库 - 建立真实笔记场景集:判断是否属于同一想法、是否值得合并/补入、关联是否有用;评估误报、打扰、采纳率和错误整理风险,而不是通知数量或聊天时长。 - 验证真实模型的结构化输出、工具调用、取消、来源准确性及 Prompt 注入防护;模型不可用时不得影响正常笔记读写。 - 测量 Agent 关闭、空闲、首次运行、连续运行及取消后的安装包、冷启动、CPU、RSS/堆和模型费用;分别记录客户端与服务端,参照[桌面性能基线](desktop-performance-baseline.md)。 -- 在现有场景质量可靠后,再验证记忆驱动的建议、主动标签整理以及对话与 Agent 模式的权限一致性;不要把这些文档目标当作已经完成的功能。 +- 在现有场景质量可靠后,再验证记忆驱动的建议、主动标签整理以及对话与猫爪模式的权限一致性;不要把这些文档目标当作已经完成的功能。 - 补齐备份恢复、删除传播与跨端体验。自动化、提醒、多 Agent 和更重的检索基础设施不是当前默认范围;只有真实需求与测量证明必要时再评估。 实现变更需通过相关测试、全量非 E2E 回归、`bun run typecheck`、`bun run typecheck:mobile` 和 `bun run build:web`。测试通过不等于建议质量或资源指标已达标。 diff --git a/packages/shared/src/i18n/en-US.ts b/packages/shared/src/i18n/en-US.ts index bc40b319..8363b5a8 100644 --- a/packages/shared/src/i18n/en-US.ts +++ b/packages/shared/src/i18n/en-US.ts @@ -4,10 +4,10 @@ import { memoTemplateSeedTranslations } from "../memo-template-seeds"; export const enUS = { companion: { discovery: { - settingsTitle: "Agent mode", + settingsTitle: "Paw mode", title: "Discoveries from EdgeEver", - description: "Combine scattered ideas, add to existing notes, and rediscover related knowledge. Changes require your confirmation.", - enable: "Enable Agent mode", + description: "When enabled, EdgeEver quietly helps tuck scattered fragments together, append new ideas to existing notes, and surface relevant past insights like a gentle cat paw. It nudges you only when valuable, and all changes remain entirely up to you.", + enable: "Enable Paw mode", settingsFailed: "Settings were not saved. Check your connection or refresh and retry.", openCompanion: "Conversation and personal memory", panelDescription: "No need to process every item. Only approved operations change notes; discoveries disappear after 7 days.", @@ -479,8 +479,9 @@ export const enUS = { themeToggleToLight: "Switch to light mode", tabs: { general: "General", - data: "Import & Export", ai: "AI Integrations", + data: "Import & Export", + paw: "Paw mode", advanced: "Advanced", account: "Login Settings", }, diff --git a/packages/shared/src/i18n/zh-CN.ts b/packages/shared/src/i18n/zh-CN.ts index 1eb5b39d..8bb01616 100644 --- a/packages/shared/src/i18n/zh-CN.ts +++ b/packages/shared/src/i18n/zh-CN.ts @@ -4,10 +4,10 @@ import { memoTemplateSeedTranslations } from "../memo-template-seeds"; export const zhCN = { companion: { discovery: { - settingsTitle: "Agent 模式", + settingsTitle: "猫爪模式", title: "来自 EdgeEver 的发现", - description: "帮你合并零散点子、补充已有笔记、发现相关旧知识。修改前由你确认。", - enable: "启用 Agent 模式", + description: "开启后,EdgeEver 会像猫爪轻推纸片一样,帮你归拢零散碎片、将新想法沉淀到已有笔记、挑出过往的相关灵感。只在有价值时轻量提醒,改动完全由你决定。", + enable: "启用猫爪模式", settingsFailed: "设置未保存。请检查连接或刷新后重试。", openCompanion: "对话与个人记忆", panelDescription: "不需要逐条处理。只有你确认的操作才会改变笔记;发现 7 天后自动隐藏。", @@ -479,8 +479,9 @@ export const zhCN = { themeToggleToLight: "切换到浅色模式", tabs: { general: "常规设置", - data: "导入导出", ai: "AI集成", + data: "导入导出", + paw: "猫爪模式", advanced: "高级设置", account: "登录设置", },