知识与记忆界面:三端第二阶段设计稿(待所有者审)
跟踪:#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:按会话记进调用日志和条目的版本记录,作为声明保存。
- MCP 握手
- 屏幕上不出现哈希、引用编号和内部账号号。这些放进“技术详情”,可以复制。
- 服务器给的说明(同步接口的
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 节的说法表。