知识与记忆界面:三端第二阶段设计稿(待所有者审)

跟踪:#147。依据:所有者 2026-11-03 决定 137 第 1–3 条(协议中立、三端界面一并设计、先出设计稿)。本页只定第二阶段(中立化与披露)的界面改动,不加功能;团队流和通用存储的界面放在之后的设计页。

三端:

  • 控制台:circle-hub 的网页。
  • 桌面:Circle 工作台。
  • 终端:Circle TUI。

文字规则沿用共享设计系统 docs/design/circle-design-system/README.md 的“文字”一节。终端照 Circle 的 docs/development/tui-contract.md:英文、小写、短句。示例里的人名、文件名和时间都是虚构的。

1. 三端共用的说法

在设计系统的“用词对照”表后面加下面这些。两个仓库照 sha256 清单逐字节同步。

概念 控制台、桌面 终端 不用
对端 同步服务器;有名字时显示连接名,例如“团队服务器” sync server,有名字时显示连接名 Hub(Circle 里)
模式 同步到服务器 / 仅保存在本机 synced / local only 同步到 Hub
范围 我的 / 团队 / 与我共享 mine / team / shared 个人、共享给我的
状态 已验证 / 待验证 / 有冲突 / 已停用 / 已撤回 / 已被取代 verified / unverified / conflict / disabled / withdrawn / superseded 已核验、失效
谁改的 张三 · Cursor · 11-03 14:20 更新;客户端没报名字时写“客户端” zhang · cursor · 11-03 14:20 提交人 usr_…、会话号
会话载入 本会话已加载 / 部分加载 / 未加载 loaded / partly loaded / not loaded —
被拒 服务器拒绝了:{服务器给的说明}。{修正办法} refused: {detail} 写死的“到 Hub 控制台…”
部分结果 显示 100 / 共 342 100 of 342 只显示前 100、不说明

规则:

  • Circle 里不出现 Hub 字样。控制台是 Hub 自己的界面,可以写 circle-hub。连上来的程序照实写它报的名字;没报名字的写“客户端”。不能默认写成 Circle。
  • 客户端名字的来源:
    • MCP 握手 initialize 里的 clientInfo(名称、版本);
    • OAuth 动态注册时的 client_name;
    • 管理员签发令牌时写的标签。
    • 三者都是声明:Hub 只能核实“是哪一个令牌、哪一个已登记的客户端”,核实不了程序到底是谁。界面上不加标注,名字的来源写在技术详情里。
    • Hub 现在只记 OAuth 的 client_name(hub/server/oauth.ts:415)。第二阶段补记 clientInfo:按会话记进调用日志和条目的版本记录,作为声明保存。
  • 屏幕上不出现哈希、引用编号和内部账号号。这些放进“技术详情”,可以复制。
  • 服务器给的说明(同步接口的 detail、MCP 回答里的修正)原样显示,不改写,也不另编一套。

2. 控制台(网页)

地方 现在 改成
授权页(console/authorize.ts) “允许 Circle 连接 Hub” “允许 {客户端报的名字} 连接”;没报名字时写“允许客户端连接”
团队页、设置页(team.ts、settings.ts) “签发 Circle 访问令牌…”“我的 Circle” “签发客户端访问令牌…”“我的客户端”
连接页、概览(connections.ts、pages.ts) 以 Circle 为唯一客户端 列出已连接的客户端:报的名字和版本、对应的令牌或登记、最近一次连接
令牌默认名(manage.ts) Circle 客户端(管理员签发时可以改成别的名字)
条目说明(spaces.ts) “条目由 Circle 起草” “条目由客户端起草”
条目详情 作者只在技术详情里 版本记录每行写“张三 · 桌面 · 11-03 14:20 更新了来源”;被取代的条目链到取代它的那一条
空状态(html.ts) 只有标题 一句话说明这里会出现什么,加一个主要动作,例如“还没有分享到团队的内容 · 打开我的知识”
成功提示(index.ts) “操作已完成” 写明做了什么,例如“已分享到团队 · 2 条”

不动:页面结构、导航,以及 #136 定下的视觉。

3. 桌面(Circle 工作台)

地方 现在 改成
侧栏底部同步行、同步设置 “未连接 Hub”“同步到 Hub…” “未连接同步服务器”;已连接时写“已连接 · 团队服务器”;按钮“同步到服务器…”“仅保存在本机…”
设计系统 WorkbenchShell 示例 “已连接到 Hub” “已连接 · {连接名}”
分享被拒 只有 SHARE_UPLOAD_UNSIGNED 一种转述,其余是“无法打开内容” 一律显示服务器的说明和修正;没有说明时写“服务器拒绝了这次分享,没有给出原因”
对话里的知识工具卡片 原始工具名加 JSON 标题用 tool-info.ts 的名字,例如“写入记忆”;摘要写路径或标题;JSON 收进“技术详情”
写入确认卡 原始参数,带 expected_head 哈希 写成可读的改动预览:“新建 · 我的 / 部署 / 同步注意事项.md · 12 行”;按钮写“确认写入”
模型写入记忆后 没有任何提示 提示“已写入我的记忆 · 打开”,点开跳到记忆页这一条
会话概览 只列指令文件 加一节“本会话的记忆”:团队 3 篇、我的 2 篇(已加载 / 部分加载),点开看具体是哪几篇
待验证的颜色 用了警告色 照设计系统改成灰色空心点
确认按钮 “确认更改” 按动作写:“确认分享到团队”“确认删除”“确认替换”
成功后 没有提示 提示写明结果,例如“已分享到团队”
#397 — 合入(侧栏不再显示 GitHub 状态,并告诉模型 GitHub 在哪里设置)

4. 终端(Circle TUI)

照 TUI 契约:一种卡片、一种列表、三种消息(notice / flash / fail)。

knowledge · synced · team server · last synced 11-03 14:20
  12 items · 1 conflict · /knowledge conflicts
knowledge · paused · login required
  run /knowledge login to sign in again
showing 100 of 342 · narrow with /knowledge search <words>

确认卡(现在知识类命令一律显示成 knowledge_write):

╭ write memory ────────────────────────────────╮
│ new · mine / deploy / sync notes.md · 12 lines│
│ allow once   reject and explain               │
╰───────────────────────────────────────────────╯

还要改的几处:

  • /knowledge mode 的参数改成 synced|local。协议里的值仍是 hub,只在终端显示时换掉。
  • 对话里知识工具那一行显示标题或路径,不显示哈希。
  • 分享失败写成 refused: {detail}。
  • 接上运行时的 knowledge_sync 事件:出冲突、要重新登录、同步暂停时出一条 notice。
  • 指示灯颜色照契约第 41 行:只有在做事时才黄色闪;“等待你”用蓝色,“待同步”不用蓝色。
  • /memory 的补全说明从“只有 MEMORY.md”改成三种记忆都写上。

5. 各种状态

每处都要覆盖:

  • 空;
  • 加载中;
  • 部分结果;
  • 被拒(有说明 / 没有说明);
  • 冲突;
  • 没连同步服务器;
  • 窄屏:桌面 700px、控制台 390px、终端 60 列;
  • 中文宽度。

6. 验收

  • 控制台:hub/server/console-*.test.ts,文案守卫(console/testing-wording.ts)加上“Circle 不得作为客户端名”的检查,再做两种主题 × 1440 / 1024 / 390 的合成截图。
  • 桌面:apps/desktop/test/knowledge-native.mjs(语言 × 主题 × 宽度、键盘、减少动效、未连服务器),i18n 测试检查用词表。
  • 终端:渲染快照测试。用脚本化模型在临时家目录里跑一次真实终端并抓屏,覆盖 60 列和中文宽度。
  • 三端一致:一个脚本比对三端文案和第 1 节的说法表。