Repository navigation
Releases
v0.2.26
v0.2.26
旧 WebView 远控壳(RemoteControlApp)完成 Zcode 设计令牌迁移——至此全 App UI 零 MaterialTheme 直接引用,视觉语言完全统一。
远控入口页
- 标题/描述/输入框/按钮全部走 Zcode 字阶与语义色,硬编码间距清除
- 地址输入框与连接页同形状:胶囊圆角 + 输入层底色 + 透明描边
- 主按钮「打开」与次按钮「扫码」改 48dp 果冻按压(中性反色填充 / 卡底)
- 历史链接列表从 OutlinedButton 改为卡底果冻行,标题/副标题字阶分层
扫码层
- 与会话配对扫码页同语言:黑色半透明浮条压底,错误提示改语义红
- 删除 Material surface 色板与 tonalElevation 残留
WebView 容器
- 顶栏标题/地址/操作按钮字阶与颜色走令牌,加载进度条改语义色
- 错误覆盖层对齐 uiLg/uiMd 字阶 + 主按钮果冻按压
🤖 Generated with Claude Code
v0.2.25
v0.2.25
渲染层与「看电脑」页完成 Zcode 设计令牌迁移——至此全 App 不再残留 MaterialTheme 默认样式。
Markdown 渲染(MdBlockView / MdMath)
每条 AI 回复都要路过的渲染面,此前标题/代码块/表格仍是 Material 字阶与紫色强调:
- 正文统一 14sp uiMd,标题按层级映射 uiXl/uiLg/uiMd,列表符号与序号改中性灰
- 代码块改输入层底色 + 内圆角,语言标签弱化,行内代码背景随主题
- 表格改面板底色 + uiSm 字阶;引用块用内圆角面板;分隔线用边框色
- 链接色改语义色,删除硬编码紫色;块级公式回退文本对齐 mono + 次级文字色
看电脑页(UU 远程)
- 标题/状态文案走 Zcode 字阶与语义色,硬编码间距改设计间距
- 主按钮改 48dp 果冻按压中性反色填充,绑定中显示内联进度指示;失败态次级「刷新状态」按钮同款触感
其他
- 清理未使用 import(Alignment、RoundedCornerShape)
🤖 Generated with Claude Code
v0.2.24
v0.2.24 — 扫码页对齐设计系统
UI / 交互
- 扫码配对页迁移到 Zcode 令牌:顶栏/提示文案走 ZcodeType 字阶,取景框与提示条圆角走 ZcodeShape。
- 提示条去 errorContainer 大红块:改黑色半透明浮层,相机/权限错误文字用语义红——红卡压在取景画面上会干扰扫码视觉,且与 Zai 体系不符。
- message 与错误条此前会画两个叠层,现合并渲染。
🤖 Generated with Claude Code
v0.2.23
v0.2.23 — 连接页对齐设计系统
UI / 交互
- 连接页全面迁移到 Zcode 设计令牌:作为打开 App 的第一个页面,此前仍停留在 MaterialTheme 默认样式(headlineMedium 字阶、errorContainer 红卡、硬编码间距),与列表/会话页被读成"两个应用"。本版对齐 core/design:ZcodeType 字阶、ZcodeSpacing 4dp 栅格、胶囊输入框(与会话页 ZcodeComposer 同一形状语义)、语义色。
- 主按钮与扫码入口改为 48dp 触控目标 + 果冻按压,全 App 触感一致;错误卡去大面积红底,改中性底色 + 语义红文字;接入 imePadding,弹键盘不再顶住表单。
自检修复
SessionsOrdering.groupByRecency收窄签名:startOfDayMs回调参数实现从未使用,调用点只能传恒等 lambda。- 补 ConnectScreen 重构后缺失的
Row导入。
🤖 Generated with Claude Code
v0.2.22
输入栏统一:ZcodeComposer
修复
- 抽出
ZcodeComposer,会话页与新建会话页共用:草稿页发出第一条消息后原地进入会话页,两处输入框此前各自手写、圆角与按钮位置不同,这一瞬间会被读成「跳到了另一个应用」。共用一份组件才能让转场连续。
交互
- 20dp 胶囊圆角取代 Material 4dp 描边方框:2026 年主流 AI 客户端的输入区是一个明示「这里可以打字」的容器,描边方框是表单语言的残留。
- 去掉描边:
input底色已把边界说清楚,再描一道边是重复表达,浅色主题下还会显脏。 - 48dp 触控目标:发送是全 App 最高频交互。
- 停止与发送互斥占同一位置:两个按钮来回换会让输入框宽度跟着抖。运行中且草稿为空时给停止,一旦开始打字就切回发送——用户意图已经变成「再说一句」。
完整更新日志:v0.2.21...v0.2.22
🤖 Generated with Claude Code
v0.2.21
会话页顶栏:知道自己在看哪个会话
修复
- 顶栏显示会话标题:从列表点进来之后,屏幕上此前没有任何东西指明正在看哪个会话——一次点错要滑到底部靠内容辨认。标题取
state.meta.title(桌面生成或用户改名),取不到时退回首条用户消息;两者都没有时显示占位,绝不编造「新会话」。 - 顶栏感知连接态:会话页此前完全不看连接状态,断线时唯一的线索是「内容不再增长」,会被读成模型卡住。现在断线显示状态行,运行中显示呼吸点 + 运行中,已连接且空闲则什么都不显示——常态安静、异常才出声,顶栏不会变成永远占两行的横幅。
重构
stateLabel从feature:connect下沉到core:network:它描述的是连接机状态,不是连接页的私产;连接页、任务列表、会话页共用同一份文案(同一件事在不同页面换叫法会被读成两个问题)。顺带移除sessions→feature:connect依赖,CameraX/MLKit 不再进任务列表的依赖图。
性能
- 标题走单独一条
StateFlow(distinctUntilChanged):ChatUi每帧都是新对象,不加区分地订阅会让顶栏跟着每一行 token 一起重组。
完整更新日志:v0.2.20...v0.2.21
🤖 Generated with Claude Code
v0.2.20
会话页不再转圈:在等、读不出来、真的空,三件事分开说
第 4 版迭代。上一版修好了列表——这一版修会话页的同一个病:一个 UI 状态被三种不同的事实共用了。
永挂的「加载会话…」
零行内容时会话页只有一句「加载会话…」。而零行至少是三种东西:还在读、这台电脑的这个工作区没运行所以读不出来、这个会话真的还没有消息。前两种长得一模一样,而且没有任何出口:订阅失败后客户端既不重试也不置态。手机先开、电脑后开是最自然的顺序,这个顺序下会话页就永远停在转圈——用户既不知道该等,也不知道该去电脑上做什么。
现在:Loading 给三张骨架条(内容形状先落地,首帧到达不跳变)、runtime 未启动提示「这个会话还没读出来」并给「立即重试」、真没有消息说「还没有消息」。
订阅失败会自己恢复
失败按 2 / 5 / 15 / 30 / 60 秒退避重试,退到 60 秒仍在重试——用户在电脑上打开工作区,页面自己会长出内容。重试期间不清空已读出的内容:旧快照除实时状态外依然准确,清空等于把「读不出来」谎报成「空会话」。
另外补了一类此前没有出口的故障:订阅被服务端接受了(ACK 成功)但快照帧一直不来。现在 ACK 后 8 秒无帧即视为失败重订阅。
发的是 debug 签名预览包,暂无 keystore 配置。
🤖 Generated with Claude Code
v0.2.19
会话真的能建出来,历史会话真的在列表里
继 v0.2.18(手机端审批放行)后的第 3 版迭代。两个「明明做了却看不到」的问题,根因都在同一处:什么东西算数,由服务端落盘决定,不由客户端以为决定。
创建会话:先说话,会话才诞生
原先点「+」立刻发一条 createSession,不带头消息。服务端只建了一条 draft 记录——纯内存、不落盘、不进任务索引。于是「创建成功」和「列表里永远看不到」同时为真,用户只能判定创建失败。
改成:点「+」进入草稿页,会话此刻还不存在;写下第一条指令后才真正创建,那条消息随会话一起发出。会话在第二句话之前就已经落在磁盘上了。
看不到已有会话:列表改读落盘索引
原先列表以运行时的会话流为唯一数据源,桌面没起 runtime 时它一份数据都没有——手机上看到的是「历史会话全没了」,实际是「这台电脑的这个工作区还没运行」。
改成:列表以落盘的任务索引(zcode-task)为权威来源,运行时的会话信息只用来补充实时状态。这一版同时把列表本身的加载态说清楚:Loading 给骨架卡、runtime 未启动说「在电脑上打开该工作区」并给重试、读取失败给重试——用户永远知道是该等还是该做什么。
发的是 debug 签名预览包,暂无 keystore 配置。
🤖 Generated with Claude Code
v0.2.18
手机端审批放行(ApprovalDock)
远程操控的典型姿势是人不在电脑前。命令卡在审批上就永远不动了——这一版让手机能直接放行,把产品从能看变成能用。
新增
- 审批 Dock:会话页输入栏上方呈现当前待决项(授权 / 需要你输入 / 需要确认),纵向排列服务端下发的选项,敏感输入走密码框且不落草稿
resolveInteraction命令:只提交服务端给的optionId,不硬编码 allow/deny;服务端返回alreadyResolved(别人在桌面先处理了)按成功对待,卡片撤掉而不是弹错- 多待决逐个步进,一次只呈现一个,不做全部放行——一次误触不该交出整轮权限
- 设计令牌新增
onAttention:attention 填充态上的前景色,深浅两侧分别配对,不靠猜
修复
ChatRepository缺JsonObjectBuilder.put导入导致的编译失败(run 62)ApprovalDock去掉SizeTransform.using(Compose BOM 2026.02 已非稳定 API),改显式contentKey按 interactionId 判定换卡sendText/stop/resolveInteraction统一补传workspaceIdentity
🤖 Generated with Claude Code
v0.2.17
会话列表加载态 + 创建会话失败原因透出
修了什么
看不到工作区下已有的会话
sessions-index 订阅用的是 runtimePolicy:"existing-only":桌面没有为该工作区运行 CLI 时,服务端直接抛 ZCODE_AGENT_RUNTIME_UNAVAILABLE。原实现 catch 后只打一行 warn 就把列表置空,UI 显示「暂无任务」——用户看到的是"我的历史会话没了",实际是"电脑端 runtime 没起来"。
现在:
- 列表加载态拆成四态(Loading / Ready / RuntimeUnavailable / Error),UI 分别表达
- 订阅失败按 2s → 5s → 15s → 30s → 60s 退避重试,runtime 起来后自动恢复
- runtime 不在时保留上一份快照并降饱和,不再清空
- 「手机先开、电脑后开」这个最常见的顺序不再永远空列表
- 每个非成功态都有「重试」入口;骨架屏替代一行「加载中…」
创建会话还是不行
原先五条失败路径全部塌成一个 null,UI 只能说"请确认电脑端在线后重试"。现在按原因分流,把服务端真实 reasonCode / message 显示出来:未连接 / 没有工作区 / 电脑端拒绝 / 没返回 sessionId / 其他错误。
交互
- 思考行折叠箭头 180° 旋转,按压缩放但不叠 ripple(次要信息不抢注意力)
- 会话流 contentType 按行类型声明,快速滑动不再错配回收池
🤖 Generated with Claude Code