Skip to content

v0.4.1

Choose a tag to compare

@siwilizhao siwilizhao released this 26 Sep 13:27
· 36 commits to main since this release

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.py 10 步全绿 + 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×630 og.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+)。

  1. 解压 Desire-v0.4.1-macos-arm64.zip(双击,或
    ditto -x -k Desire-v0.4.1-macos-arm64.zip .)。
  2. 安装:把解压出来的 Desire.app 拖进 /Applications。
  3. 移除一次隔离标记(未签名构建必需),路径写你放 app 的那个:
xattr -cr /Applications/Desire.app
  1. 打开 Desire.app。首次启动 Gatekeeper 会检查一次;做过第 3 步就能正常打开。

报 xattr: No such file: Desire.app 说明当前目录里没有解压好的 app——
命令要写完整路径(如 /Applications/Desire.app),或先 cd 到它所在目录。