v0.4.1
Added
- Desire Remote 与桌面 Agent 能力对齐(手机可介入 Agent 的每一个卡点):
快照增补审批 / 反问 / 计划 / 子代理 / 排队 / 目标页 / 全权限 / 可重生成 /
快捷动作 / 暂停 / token / 成本;手机上可审批工具调用(允许一次 / 始终
允许 / 拒绝,按PendingToolApproval.id强校验以防停在旧审批上误批新审批)、
回答 Agent 的反问(选项一键作答)、逐条移除排队消息、快捷动作与重新
生成。此前这两类挂起状态完全没有走远程协议——Agent 在桌面等人工介入,
手机既看不到也回不了,表现为"卡住不动"。 - iOS 新增 Agent 页(取代原「Agent 看板」那个只读数字列表):工具与技能
(按只读 / 改变状态 / 执行代码三档风险分级,与桌面ToolRisk同源)、
用量统计(跨会话 token / 成本 / 每模型明细,与桌面「用量」页同一口径)、
执行轨迹(每回合目标、工具序列与每步耗时、被拒 / 失败、慢工具榜);
模型、FULL ACCESS、本回合控制收进输入条左侧的状态弹窗。 - 扫码登录一次完成两件事:登录二维码在远程控制开启时顺带携带配对信息
(配对码 + 会话密钥 + 设备 id),手机扫一次即完成"登录 Mac"与"远程配对"。
会话密钥仍只在二维码里传,服务器读不到。 - 远程会话控制:新对话(先沉淀记忆摘要)、暂停 / 继续、停止。
Changed
- iOS 信息架构重做:抽屉换成底部 Tab(会话 / Agent / 设置);对话从会话
列表进入并隐藏 TabBar(全屏聊天,导航栏透明、保留系统返回键与左滑手势);
状态、计划、子代理、排队、审批、提问统一到输入区上方的停靠层,模型与
全权限等常驻信息移入弹窗——底部只留需要即时处置的内容。 - Mac 设置与列表视觉:新增表单行排布(固定标签列 + 撑满剩余宽度的控件,
替代"标签左、控件贴最右"造成的半屏空白)、侧栏图标列固定宽度对齐(修正
iphone.radiowaves.left.and.right过宽导致的标题参差)、会话列表重做
(单图标 + 内容预览行 + 时间/条数分列)、外观选择改为带图标的行式选择。 - iOS 三个 Tab 统一为
List(.insetGrouped)+ 同一套分组标题与行样式。
Fixed
- Mac 登出后远程仍显示开启:登出只在内部把连接状态置静默,开关的持久化
真值仍是 true、心跳定时器空转。现在登出即拆链路、清设备列表与配对码、关开关。 - 手机被莫名退出登录:refresh token 在服务端是一次性轮换的,而客户端三条
并发路径(pull 轮询 / push 上行 / WS 重连)会各自刷新,第二个必然被拒并被
当成会话过期 → 清凭证回登录页。改为刷新单飞,且只有服务端明确 401 才结束
会话(网络抖动 / 5xx 不再清凭证)。 - 扫码不识别:
startScanning()只在updateUIViewController里尝试,而
sheet 弹出首帧view.window仍为 nil、之后又无人重试。改为轮询等视图上屏;
同时补didUpdate回调、相机启动失败不再被try?静默吞掉、相机不可用时
按钮不再是"点了没反应"的死按钮。 - 连接区块自相矛盾(上"未连接 Mac"、下"已连接"):Mac 名字只在配对响应
里拿过一次且未持久化。现在随每帧快照下发并本地保存,主标题只放设备名、
连接状态由带状态点的一行表达。 - 状态漂移:漏掉"回合结束"那一帧会让界面停在"工作中";三个 Tab 进页时
强制requestSync()拉一帧权威状态。 - 输入框被消息穿透(停靠区补不透明底板、输入胶囊改实色)。
Added
- 远程控制(Desire Remote,M0+M1,当日重构为可水平扩展传输):手机 App
经 api 中继远程对话本机 Agent——工作仍全部在 Mac 本地执行,手机发指令、
看进度。服务端modules/remote(0008 配对码/留言 + 0009 双信箱迁移);
Mac 设置"远程"区(Features/Remote/);apps/ios/DesireRemote.xcodeproj
(登录 → 扫码配对 → 控制台)。信道端到端加密(AES-256-GCM,密钥只在
二维码中,服务器只路由密文)。传输架构(照 Trove im_ws 模式,两实例 +
nginx 轮询部署下正确):上行一律POST /remote/push(入库持久 + Redis
express 发布,快照 replace 语义);下行 = WS 订阅自己频道(即时)+
GET /remote/pull每秒兜底,按信箱行 id 去重;在线判定基于 DB
desktop_last_seen_at(15s 窗口,跨实例一致);服务端/客户端双向 20s
心跳(解 nginx 空闲回收)。配对认领即时通知桌面收起二维码。
快照走独立 lane(controller_snap):replace 只清同 lane,不再误删
先落地的 sessions 回包;远程"新建会话"修复(Mac 端 create 后补 save
落盘进列表 + 手机端点"+"乐观进空聊天室、按快照 session 字段锁定选中)。
远程开关关闭后不再有任何广播(拆 WS + 停链路循环 + isEnabled 守卫)。
E2E:tools/api-remote-smoke.py10 步全绿 + Mac 桥真机链路验证(prompt
送达 Agent 执行、快照回传手机可解密、newSession 列表/落盘/快照三确认)。
APNs 推送、审批卡片远程应答(M2)、按需截图未做。 - Desire Remote iOS 支持 Markdown 渲染:Agent 气泡接入 MarkdownUI
(上一版手写的无依赖轻量渲染移除),主题参照 IrsClawApp——GitHub 基础
主题 + 气泡内边距收紧、表格横向滚动(手机宽度放不下整表)、代码块/引用/
有序无序列表全覆盖;流式更新不整棵重建(按 message.id 稳定身份)。
修复工具消息不渲染:快照里调用名在 assistant 帧、结果 content 在
tool 帧(toolCalls 为空)——此前 assistant 分支丢弃调用名、tool 分支
无展开钮导致结果永远折叠;现 assistant 帧显示"工具调用名"行(点击展开
参数摘要),tool 帧结果常驻显示(默认 4 行,点击展开全文)。
Agent 看板:聊天页状态胶囊升级(忙时"工作中·用时",闲时"已连接·
模型·上下文 N%"),点击进入看板——状态区(模型/上下文占用%/排队/回合
用时)+ 记忆区(用户画像/事实/对话摘要,滑动删除走桌面同款 tombstone
语义);快照协议相应扩展 model/contextPercent/queueCount/elapsed/
toolArgs,新增 getMemory/deleteMemory/memory 帧。
Added
- Mac 端扫码登录(照 Trove 三步流):设置 → Sync 未登录时新增"扫码
登录"——桌面出票渲染二维码,已登录的 iPhone DesireRemote 扫码并在
手机上确认,桌面轮询领走 token 对,免密码登录。服务端新增
auth_qr_logins(0010 迁移)与四步端点qr/create|status|scan|confirm
(create/status 无鉴权带 IP 限流;scan/confirm 走手机 JWT;refresh
token 绑定桌面设备行,吊销设备即吊销扫码登录)。token 一次性消费
(被领走时原子清空,防同 token 被第二个轮询方领走,Trove 踩过的坑)。
扫码登录不经密码——E2E 主密钥沿用本机 Keychain 已有值,无主密钥的
全新机器仍需密码登录一次完成托管恢复。另修复 iOS 切后台时任务切换
卡片黑底(窗口底色钉为系统背景色)。
Changed
-
DesireRemote 视图层照 IrsClawApp 架构重写:单页聊天为根(无 Tab、
无独立会话列表页);左上 ≡ 弹出 Menu 半屏 sheet(.medium/.large
detents)——Agent 状态卡(模型/上下文%/排队/连接)+ Browse 磁贴网格
(会话/记忆/看板/扫码登录)+ 最近会话前 5;磁贴经 navigationDestination
push 全屏页:会话列表(今天/昨天/本周/更早分组 + 左滑删除 + 左滑重命名)、
记忆页(画像/事实/摘要 + 左滑删除)、看板页;聊天页照 IrsClaw ChatView
(bottom 锚点滚动、safeAreaInset 漂浮输入胶囊、mic/send 圆钮、busy 变
停止、PulsingDot 录音条、断线/排队横幅)。sessions 帧补 date 时间戳。 -
服务器地址改为"覆盖"语义(Mac + iOS):内置生产地址不再出现在
任何界面(登录页删掉服务器区块、设置页占位符不露地址);设置项留空
= 使用内置默认,填了才覆盖(旧版把默认值写进覆盖位的自动迁移清除,
配对/登录二维码自带服务器仍是显式覆盖来源)。Mac 端"Apply"空值 =
回内置默认。 -
远程链路三个双端 bug 修复:① iOS"已断开"永不恢复——
login()从未存
refresh token、WS 用过期 access 直连、断线后无重连逻辑;现 401 自动刷新
重试一次、断线 5s→30s 退避重连、会话彻底过期回登录页。② Mac 配对二维码
认领后不消失——认领是纯 REST、桌面端无从得知;现认领即时推送通知 +
二维码显示期间 2s 设备数轮询兜底。③ iOS 解除配对无效——只清本地不清
服务器;现先 best-effort 调/remote/pairing/revoke再清本地。 -
默认同步服务器切至生产:全新安装(未手动配置过服务器地址)直接使用
https://api.mankong.icu/v9;已手动配置过的设备保留原值不受影响。
服务器地址输入现在会去除尾斜杠(避免拼出//auth/…双斜杠),设置页
占位符同步更新。本地开发用桥POST /sync/server钉回本地实例。
Added
- 浏览历史同步(第八类,opt-in 默认关闭):服务端新建专表
sync_history_items(0007 迁移,与通用引擎同构、按域路由表名)——历史是
高频写入的日志型数据,与关键小域分开治理;服务端 90 天 TTL(history
push 后顺带清理该用户超期行,含 tombstone)。客户端HistoryEntry补
updatedAt盖戳(旧文件缺键以访问时间兜底归一)、墓碑清单(只有用户
显式删除——单删/清空/按域删/按时间删——才推 tombstone;滚动裁剪与合并
溢出不推,靠 TTL 收敛)、replaceForSync合并回写;合并语义
HistorySync(FlatSyncMerge 直配)进纯逻辑单测。设置 → Sync 类目列表
自动出现"浏览历史"开关(默认关);桥/sync/status的 cursors/待删计数
补 history,/command补clearHistory。desire-admin stats 并表统计。 - 会话过期自愈:refresh 令牌被服务端拒绝(吊销/轮换丢失/换 JWT 密钥)
时不再每轮空转报 401——干净登出(清令牌/游标/戳,主密钥保留)并给出
"同步会话已过期,请重新登录"的明确提示(全局与逐域状态一致)。 - 退出前补推:退出时有未上推的本地变更,
applicationShouldTerminate
走.terminateLater做只 push 不 pull 的限时补推(5 秒内必回调,
推不上去的域放回脏集合由下次启动首轮对账兜底);无脏域照常立即退出。 - 产品介绍页(
website/index.html):单文件静态落地页,"墨与朱"编辑风
(宣纸底 + 墨色正文 + 朱砂点睛,「欲」字印章记忆点);字体全用 macOS 内置
Hoefler Text / 宋体 / 楷体,零外部依赖(无 CDN,国内访问无阻碍)。
内容:英雄区 + 六大特性 + 智能体轨迹示例 + 端到端加密三步图解(含七类
同步 chips 与"AI 对话永留本地"的诚实标注)+ 下载四步(含 xattr 命令)。
桌面/移动自适应;动效纯 CSS,支持prefers-reduced-motion与无 JS 降级。
已部署生产 https://desire.mankong.icu/,主 README 顶部与 Download 段
均已指向;更新与发布方式见website/README.md。SEO/GEO 已优化:canonical、
完整 OG/Twitter Card(含 1200×630og.jpg)、JSON-LD(WebSite +
SoftwareApplication + FAQPage,问答与页面可见 FAQ 逐字一致)、新增可见
FAQ 段与导航锚点、robots.txt(显式放行 GPTBot/ClaudeBot/PerplexityBot
等 AI 爬虫)、sitemap.xml、llms.txt。 - 同步改为变更驱动(近实时):源 store(书签/快速拨号/阅读列表/快捷键/设置/
Agent 记忆/Agent 提示词)的变更经objectWillChange标脏对应域,5 秒防抖后只
上推脏域——不再等 5 分钟定时轮;远端合并回写由applyingRemote守卫包住,
拉回来的数据不会把自己标脏。启动/登录首轮仍全量对账;push 失败保留脏标记,
退避重试(5s 翻倍至 5min 封顶,等同旧定时节奏);睡眠唤醒、断网恢复后自动补一轮。 - 每域同步状态:设置 → Sync 的类目列表逐域显示"✓ 相对时间 / ⚠ 错误文案",
单域失败不阻断其他域(错误按域隔离聚合进全局错误文案);自动同步的失败只落
逐域状态、不打扰全局错误(手动同步才刷新全局 lastError);"上次同步"改相对时间。
桥/sync/status新增逐域dirty/status观测面。
Changed
- push 增量化 + 大库分块:脏域才发 push(空集合不发请求);服务端单请求
500 条上限(MAX_PUSH_ITEMS)不再会让大书签库整单被拒——客户端按 400 一块
顺序推;pull 整页(1000 条)时自动翻页拉全,中途失败游标不落盘(下轮幂等重拉)。 - 设置/提示词域只推变化键:快照 diff 收敛单次推送范围,并修掉旧缺陷——本地
改过的设置键以前每轮都被重复上推(collect 盖新戳但快照不落盘,diff 永远不等);
现在"推送成功才落快照",/sync/setting桥写路径同步修正(标脏 + 盖戳,不写快照)。 - i18n:补齐 v0.4.0 同步功能漏翻的 4 条文案(验证码加载失败/密码策略/加密失败/
未设置),新增同步副标题,目录 1301 键三语 100%。
安装
未签名构建(CI 无 Developer ID 证书),仅支持 Apple Silicon(arm64,macOS 26.5+)。
- 解压
Desire-v0.4.1-macos-arm64.zip(双击,或
ditto -x -k Desire-v0.4.1-macos-arm64.zip .)。 - 安装:把解压出来的
Desire.app拖进/Applications。 - 移除一次隔离标记(未签名构建必需),路径写你放 app 的那个:
xattr -cr /Applications/Desire.app
- 打开
Desire.app。首次启动 Gatekeeper 会检查一次;做过第 3 步就能正常打开。
报
xattr: No such file: Desire.app说明当前目录里没有解压好的 app——
命令要写完整路径(如/Applications/Desire.app),或先cd到它所在目录。