Skip to content

Releases: Xsxdot/handoff

v0.5.0

Choose a tag to compare

@github-actions github-actions released this 12 Oct 01:45

What's Changed

  • feat(B373): OpenCode monitor 插件 + Command Code 一次性 wait by @Xsxdot in #2

New Contributors

  • @Xsxdot made their first contribution in #2

Full Changelog: v0.4.1...v0.5.0

v0.4.1

Choose a tag to compare

@github-actions github-actions released this 04 Sep 02:25

修复

  • 载体 HOME 含 ~ 时子进程在仓库下建出 ./~/ 垃圾目录。 载体登记串是跨机可认的用户可见形态(含 ~);agentd 与 hostapi 进子进程 HOME 前未展开,子进程把 $HOME 系文件相对 cwd 落盘(2026-09-04 实测 2.2G)。现在两处都在注入环境前展开为绝对路径,展开失败保持原行为不阻断派发;.gitignore 加 /~/ 永不入库。
  • 工作项页空白处滚动仍带动整页(B318 没修完)。 B318 的 min-h-0 只钉住了常驻房间栏的高度。/cards 上工作台仍常驻在 main 里,flex 默认 min-width:auto 按终端固有宽把 main 撑到两万像素,房间栏被推到视口外,横滑空白处整页(含左栏)跟着走。main 补 min-w-0 overflow-hidden,壳和常驻栏切断溢出。

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 03 Sep 15:04

新增

  • 协作房间 + 小队编制 + 隔离 HOME。 卡可以绑协调者小队、按载体(机 × CLI × HOME × 模型)排队点火;房间消息、收件箱和协调者 attach 进控制台。检测用隔离 HOME 里一次真实 ping 回合,不再用 --version。
  • agy(Antigravity CLI)可作为执行者。 dispatch --executor agy;任务 HOME 权限闸与 hooks 生命周期随任务起停。
  • 工作台新开的终端默认带 GROK_OSC52_SINK=1。 Grok 在 PTY 里选中文字会发 OSC 52,B300 已经接到本机剪贴板;以前要自己 export 或改 ~/.zshrc。现在目标机 agentd 开 PTY 时写死这颗变量(启动项 env 文件关不掉)。跑终端的那台 agentd 升级后生效。
  • 远端预览:左栏第四种任务行,点开独立 Chromium。 执行机 handoff preview open --path / --port 发布会话;协调者桌面点行会起隔离 Chromium(经本机 SOCKS 打 owner 回环,不再把 localhost 改写成机器 Tailscale IP)。再点已开行在 macOS 上聚焦窗口,不再依赖 xdotool。不自动弹窗,也不进工作台 tab。
  • 工作台终端里 TUI 的复制能落到本机剪贴板了。 grok / opencode 等终端 UI 里选中的文字(它们发 OSC 52 转义序列让终端写剪贴板)现在由工作台前端接住并写入本机系统剪贴板,⌘V 即可粘贴。写入只发生在当前激活的终端标签;刷新 / 重连时历史缓冲里的旧复制不会改写你的剪贴板;远端的「读剪贴板」查询与「清空剪贴板」请求一律不响应;写入被浏览器拒绝时终端下方给出失败提示。
  • 工作台改版:中央与目录脱钩的标签组分屏。 左栏按「项目 → 任务 / 目录」列出进行中任务(目录组内按机器分组,机器行 hover 直接开终端 / 建工作树);中央是一套可分屏的标签组,窗格可以来自不同项目、不同机器,点左栏任务跳到它所在的那一格。关掉内容就拆格拆列,组空了组一起消失;拖任务 / 机器到窗格贴边出现半区落点示意开出新列(终端黑底上用高对比浅蓝遮罩,看得清会怎么分)。顶栏面包屑跟焦点窗格走,不再跟左栏选中。多列时各列均分可用宽度压进窗口,不再顶出横向滚动。
  • 左栏层级重绘:项目行带任务计数,任务组里已打开项排最前、已结束(终态)任务默认收进「已结束」;打开任务后 tab 与左栏都显示任务原名,不再变成「TUI · 1a2b3c4d」。顶部组标签条同步换皮:药丸激活面、按组内容显示类型图标与任务原名。
  • 左栏任务列表顺序固定:按创建时间降序,打开任务不再洗牌。 任务组、「已结束」与「未归属」统一显式按 created_at 降序——跨机聚合响应的行序本就不可信,此前打开一个任务整列都会重排;已打开的任务在任务流原位呈现已打开态,不再置顶。刚跑完的任务留在任务列表 30 分钟再沉「已结束」,tab 还开着就一直留。
  • 派发任务行显示分支名:无名派发拿提示词前 20 字当名字,所有 charter 卡的行名千篇一律认不出谁是谁;现在识别出「名字是计划摘要的回声」时改显分支(cards/Bxxx)。行尾圆点按行类表达状态:任务行 = 任务状态(运行绿 / 等工单与待审琥珀 / 终态灰 / 失败红),终端行 = 连接状态(绿连红断),文件行 = 文件状态(干净绿 / 改动琥珀 / 冲突红 / 已删灰)。已打开行(终端 / 文件 / 任务)悬停时右侧滑出 × 快速关闭 tab——带会话的终端与未保存草稿仍走原确认弹层,与窗格 × 同一条规则。

变更

  • 工作台布局落盘从「每目录一行」改为单一全局行。升级后中央布局从全局标签组重新开始(旧的按目录分组布局不迁移);还活着的终端会话会在恢复时自动收编回来,文件 / TUI tab 需要重新打开。

修复

  • 悬浮窗终端 tab 不再每开一次桌面端就多一个。 根因是一条「误判死亡 → 自动重建 → 跨机收编」的累积回路:会话列表扇出对离线/超时机器静默缺名单,恢复层把缺席的活会话当死会话剥掉引用,悬浮窗一开就静默自建新 shell,旧会话(ptyhost 让它一直活着)下一轮被当孤儿收编进来 tab +1,多台机器互相收编进一步放大。现在恢复按「会话所属机器本次扇出是否应答」门控剪除——缺席不判死,机器回来照常接上;悬浮窗是本机面,不再收编其他机器的 home 终端;历史快照里不属于本机的外来 tab 在升级后首次打开时一次性消失(属预期,不是丢数据)。关闭终端的确认弹层不再误称「agentd 重启会清掉所有会话」——PTY 会话跨 agentd 重启存活。
  • 看板「事件流滞后」不再把已经全部归档的机器当成断链。挂账行不随 archived 删除,镜像心跳过去会停在最后一条事件上,本机(如 mac-02)全归档后 60 秒就误亮灯。健康行现在带 Live:没有非终态挂账就不亮;真有在飞任务却连不上的仍然要点名。
  • 终端提示符上不再弹出 2RR0;276;0c / rgb:0b0b/… 这类乱码。 那是 xterm.js 对 DA / OSC 颜色 / CPR 查询的自动回包。切 tab 会把环形缓冲整段重放,历史里的查询被再答一遍,答包落到 zsh 就变成「凭空打出来的字」;WebSocket 往返也经常慢过 starship 的查询超时,迟到同样泄漏。现在这些回包不再写入 PTY。
  • 新开终端会回答颜色/终端类型询问。 刷新或重连灌入历史时仍会丢弃旧录像产生的设备回包,不会把回答打进提示符。
  • TUI 花屏、拖一下窗口才好: fit 之后强制刷新当前屏,WebGL 接管后再量一次尺寸。
  • 滚轮在 TUI 里不再「滑几像素就卡住」。 工作台面板从 overflow-auto 改成 overflow-hidden,避免父级吃掉凑不满一行的滚轮。开了鼠标追踪时按指针格子发 SGR(跟 iTerm 同一条协议);xterm 每个 DOM 事件只报一格,这里按滑过的像素补成多格,触控板一甩能翻页而不是只走一行。不改成方向键(那是输入历史),也不拿假坐标发报告(会把整屏划走)。
  • 桌面终端按键和滚轮更接近系统终端。 Option 当 Meta(WKWebView 上 Option+B 的 key 是 ∫、keyCode 常为 0,不能靠 xterm 自己的 macOptionIsMeta;随后 keypress / insertText 里的 ∫/ƒ 一并吞掉,避免跳词同时打出符号);⌘←/⌘→ 到行首行尾;焦点在终端时 ⌘K 清屏(不写进 PTY),其它地方仍是左栏搜索。TUI 滚轮按 xterm 自己的鼠标编码连发,含横滑和修饰键;Option(Mac)/ Shift(其它)划词不再被自定义滚轮吃掉。

变更

  • card dispatch --step 现在把环节请求提交给本机 agentd,收到 HTTP 202 后立即返回;本机 agentd 不可用时命令失败,不再在 CLI 进程内回落本地编排。
  • card dispatch --step 的 stdout 不再打印回合 Outcome,改为输出卡号、节点名和 handoff card wait <卡> 进展入口。
  • POST /api/cards/{id}/step(card dispatch --step 走的就是它)现在在受理前校验卡与节点:卡不存在回 404,节点名不在卡钉住的工作流里回 400。此前两者都先回 202,失败只落在 agentd 日志里——调用方拿到「已受理」,卡上却一条事件都没有。
  • card step 的请求体与受理响应都不再接受尾随内容:多出的字节一律判为非法(此前只解析第一个 JSON 值,其余静默丢弃)。对未知字段仍然宽松,版本错配不会因此变成 400。
  • card step 请求体超过 1 MiB 时返回 413(此前无上限);受理响应超过 4096 字节时报错。两处都是整体拒绝而非截断——截断会让一段恰好等于上限的合法 JSON 把后面的尾随内容带过关。
  • card step 受理响应 ok=false 时,错误信息会带上响应体原文。
  • 纪律块正文改为派发时由协调者组装下发(B229):执行机不再读本机 <DataDir>/discipline/ 目录,内置角色块六份 .md 从二进制移除,权威副本入账本 disciplines 聚合(handoff discipline put/get/list 管理)。旧版执行机的本地回退分支已拆除:派发点名但未收到正文时拒派,不再悄悄猜一份。
  • 裸 handoff dispatch 与环节派发现在都注入平台不变量层正文;目标机能力位不支持接收下发正文(或探活失败)时拒发并给升级指引,不静默降级。派发事件快照新增 discipline_version 记录所用版本。
  • 平台不变量恒在层由三条底线减为两条:「每确立一个事实就往台账文件追加一行」一条移出平台层,落台账要求改由角色纪律块承载、且只注入产出型角色(review 不再重复拿到)。
  • 控制台 /api/discipline/file 读/写端点随目录退役改为返回可行动错误(提示改用 handoff discipline put);纪律下拉列表来源从磁盘目录切换为账本。
  • 配置里的 ledger.enabled 键退休:账本恒开。键保留仅为旧配置可解析,值无任何语义,加载到该键时日志 Warn 一条退休提示。

v0.3.9

Choose a tag to compare

@github-actions github-actions released this 21 Aug 14:33

这一版修好桌面端终端的输入丢字,并接通「把文件从访达拖进终端」。
三个症状都只在桌面端出现,根因两类:两个是 xterm 在 WebKit 上的输入缺口,
一个是原生拖放通道压根没接。升级无需改配置。

修复

  • 文本展开工具(espanso 等)不再只进首字符。 macOS 上这类工具把整串文本塞进
    一个键事件(key="git status"),而 xterm 判可打印字符的条件是
    ev.key.length === 1,多字符落到 keypress 分支被 String.fromCharCode 压成
    首字符发出去,随后那个带完整文本的 input 事件又因「keypress 已处理」被丢弃。
    现在认出这个形状不让它压缩,改由 input 事件补发完整文本。

  • 中文输入法下的标点(? ¥ %)不再要敲好几遍。 WebKit 在输入法直接上屏时
    把 input 事件排在 keydown 之前,xterm 的准入条件撞上被 Shift 那一下置真的
    _keyDownSeen,字符被丢;Shift 按住不放时后续几下才侥幸通过——所以症状是
    「按下 Shift 后的第一个标点必丢」,而要按 Shift 的标点恰好是最常用的那几个。

    以上两条在 xterm 6.0.0 里代码一字未改,升级上游解决不了,故修在控制台这层。
    补漏以「xterm 这一轮到底发没发」为判据,上游哪天补上会自动让位,不会变成双发。

新增

  • 可以把文件从访达拖进终端了,落进去的是完整绝对路径,按 POSIX 单引号转义
    (文件名里的空格、$、反引号都不会被 shell 展开)。走的是 Wails 的原生拖放
    通道——WKWebView 的网页层拿得到 File 对象却拿不到路径,这件事只能由原生给。
    拖到终端以外的区域不响应。

v0.3.8

Choose a tag to compare

@github-actions github-actions released this 21 Aug 09:50

这一版修好中继机器的控制台转发。 机器经 relay 接入(没有直连地址)时,
探活是通的、卡片显示「已连接」,但执行纪律 / Env 文件 / 缺省执行者面板、
任务详情页和跨机终端反代全部报「no Host in request URL」。从 v0.3.5 升级
无需改配置。

修复

  • 请求转发基座改走 target 池选路。 REST 转发(?machine=)、按任务 id 的
    透明路由、WS 反代此前都拿 target 的 addr 直连拼 URL——relay 形态的机器
    没有 addr,拼出的是 http:///...。现在三条路复用 targetclient 池的选路
    结果:relay 经隧道、直连行为不变;直连转发顺带补上「agentd 之间永不经
    代理」的纪律(与 v0.3.4 的 WS 拨号同款)。
  • desktop 模块依赖与主模块对齐(v0.3.6 的 release 卡在这道门上,
    版本号已跳过)。
  • 卡片看板测试夹具补上子卡计数字段:CardView 加 children_total /
    children_done 必填字段时漏改了 columns.test.ts 的夹具,tsc -b 在
    release 的前端构建步骤转红(v0.3.7 因此跳过——主分支 CI 不构建前端,
    这类破坏要到 release 才暴露)。

v0.3.5

Choose a tag to compare

@github-actions github-actions released this 20 Aug 14:34

这一版让 agentd 重启不再带走现场。 终端会话搬出 agentd 进程,工作台的 tab、
分栏和悬浮窗会留下来;同时补上 handoff service start/stop/restart,被停掉的
agentd 不会被桌面薄壳悄悄拉回来。从 v0.3.4 升级无需改配置。

新增

  • handoff service start / stop / restart。 改完配置想让 agentd
    生效,此前只能 kill 掉等进程管理器把它拉回来。现在 handoff service restart
    就地重启(发 SIGTERM 走 agentd 自己的优雅关停,不是硬砍),stop 停到你
    显式 start 为止——包括重启机器也不会自己回来,因为三个平台都配了
    「退出就拉起」,只杀进程根本停不住。三个命令都只对已安装的单元生效,
    没装时直接告诉你去 handoff service install,不代为安装。

  • handoff service status 认得「被停住」了。 此前「装了没跑」只有一档,
    处置写的是「看日志找原因,或 install 重装」——被 stop 停住时那是错的
    处置。现在被停用会单独报一档,处置是 handoff service start。

  • 工作台的现场会留下来了。 在一个目录里开的终端 / 文件 / 任务 tab、分栏与栏宽、
    当前激活的是哪一个,以及右下角悬浮窗的 tab、位置与大小,现在都落到 agentd。
    切到别的目录再切回来、刷新页面、退出桌面端再打开,看到的都是同一份现场;
    会话真的没了时(比如你显式 stop 过),布局照样完整回来,终端 tab 会在原来
    那一栏原地起一个新 shell。落盘的是布局形状,不含文件草稿与文件树的展开状态。

  • 工作树的身份加上了机器维度。 此前不同机器上路径相同的两个工作树会被当成
    同一个目录(home 早就是 ~@机器 了,工作树漏了这一维)。现在工作树的 key 是
    路径@机器,两台机器上的同名目录各留各的现场。

  • 终端不再随 agentd 重启而消失。 PTY 会话搬出了 agentd 进程:每个会话由一个
    独立的 handoff _ptyhost 进程托管,agentd 只是它的客户端。agentd 崩溃、被 OOM
    杀、handoff upgrade 换版、handoff service restart、被进程管理器拉回——这些
    情形下终端全都活着,回到控制台还能接着用,滚屏也在。只有 handoff service stop
    会一并结束终端,因为那句命令的意图就是「让这台机器上的 handoff 全停下来」;
    它在停服务之前收口,收不干净也不阻断停止。

  • 协议错配如实说,不假装。 换到一个不认识旧会话协议的版本时,那个会话仍然
    活着,但本版接不进去。控制台会把这样的 tab 显示成不可用并给「重开一个终端」
    的出口,而不是悄悄再建一个 shell 把旧的丢在后台。

修复

  • agentd 重启后终端 tab 关不掉了。 v0.3.4 给判死的终端 tab 补了「重开一个终端」
    的出口,但没补「关掉它」这条路:点 × 后确认关闭会发 DELETE /api/pty/sessions/{id},
    服务端答 404「终端会话 … 不存在」,而前端把任何删除失败都当作「会话可能还活着,
    不能把 tab 从视野里抹掉」,于是弹层每次都只留一行红字,tab 被焊死在界面上。404 其实
    是成功的一种——要杀的东西已经不在了,删除对这一路是幂等的。现在 404 照常关掉
    tab;其余失败(500 等)仍然拒绝关闭并原样显示原因,那条纪律护的是「服务端还留着
    一个 shell」的真实情形。

  • 关闭终端的确认弹层不再对着一个已经没了的会话说狠话。 弹层原文是「关闭会终止
    这个终端会话,里面正在运行的命令会被一并结束」,可 agentd 重启后根本没有东西可
    终止。现在关闭前那次「它忙不忙」的探测顺带认一下会话还在不在:查不到就改说
    「这个终端会话在服务端已经不存在了……关闭只是把这个 tab 收起来」,按钮也从
    「关闭并终止」变成「关闭」。探测本身失败(问不出来)时一律按「可能还活着」说话。
    浮窗里的 home 终端此前不做这次探测,现在与中央 tab 一致。

  • 桌面薄壳不再复活被显式停掉的 agentd。 薄壳启动时会自愈「装了没跑」的
    agentd,而 stop 之后正好长这样,于是你停掉的东西一开薄壳就回来了。

  • 刷新页面后终端里的历史不会再整屏消失。 建连时向服务端重申尺寸这一步,赶上了
    容器还没拿到布局盒子的那一帧——此时量出来的是 2 列 1 行(xterm 的下限),报上去
    PTY 就真被调成 2 列,shell 按 2 列重排,正在回放的历史当场被绞碎,正在跑的 TUI
    同样遭殃。现在容器没成型就不报,这一次重申挂起,等容器拿到盒子后补上。

  • 恢复已有终端会话时会重申一次尺寸。 恢复一个已存在的会话不走建会话那条路,
    整条挂载路径此前从头到尾没向服务端报过尺寸:服务端的 PTY 还是它被创建时的宽度,
    里面的 TUI 按那个宽度画,而窗口早已是另一个宽度——就是「TUI 乱码、拖一下窗口
    就好」。切 tab 走的也是这条路。

其他

  • 终端新增一个默认关闭的取证开关,用于排查偶发的失焦与文本展开丢字符:
    在控制台执行 localStorage.setItem('handoff.debug.terminal', '1') 后重开终端 tab,
    按键、焦点变化与尺寸上报会打到 console。默认全关——终端输入里可能有密码。

v0.3.4

Choose a tag to compare

@github-actions github-actions released this 20 Aug 05:32

这一版全是真机走查揪出来的问题。 更新面在真机上第一次跑起来时暴露了两个缺陷:
升级失败没有任何出口、版本比不出来时谎称「已是最新」;控制台这边则是文件树角标在
归档任务上整片消失、悬浮窗里的文件正文与背景同色、以及 agentd 重启后终端 tab 变成
一屏黑加一句指向错方向的红字。从 v0.3.3 升级无需改配置。

修复

  • 终端 tab 被判死后有了出口,红字也说人话了。 agentd 一重启(重装二进制、
    launchctl kickstart -k 都算),内存里的 PTY 会话全没,而已经开着的控制台里那些
    终端 tab 还记着旧会话 id,切回去就是一屏黑加一行红字。原因其实是服务端在关连接时
    给的(终端会话不存在),但前端只按 close code 查表,把它显示成「会话已失效或
    订阅非法(agentd 吊销了本连接)」——一句指向鉴权的话,把人往完全错的方向带。现在
    服务端给了原因就显示原文,并且这类判死(close 1008)会在红字旁给一个「重开一个
    终端」按钮,在同一基准目录重建会话。仍在退避重连的普通断线不给这个按钮。

  • 执行机升级失败终于有出口了。 升级不出进度流是刻意的,但此前只想清楚了成功
    怎么结束——版本变成最新。失败时版本压根不会变,控制台的「升级中」就永远清不掉,
    而 agentd 其实早已放弃(真机实测:后端记下「下载 checksums.txt 超时」三分钟后,
    界面还在转)。现在 GET /api/machines 的每台机器带 upgrade 段(缺席 / 在跑 /
    终态),控制台据此收尾并原样显示失败原因与处置建议。刷新页面后原因仍在。

  • 版本比不出来时不再谎称「已是最新」。 开发构建的版本戳是提交号,解析失败与
    「确实不需要更新」此前落在同一个分支上,界面把「我不知道」显示成了「你没事」,
    还顺手藏了升级按钮——而后端对这种机器的结论本来就是「需要升级」。现在这种机器
    显示「版本无法比较」,升级入口保留。

  • handoff upgrade 的结论状态在日志里是 ok / skip / fail,不再是 0 / 1 / 2。

  • 文件树的新增/修改角标在归档任务上不再整片消失。 handoff done 会回收托管
    worktree,而任务 diff 一直在那个已经不存在的目录里跑 git,于是每一个归档任务都
    返回 500,右侧文件树的颜色全没了(handoff diff 同样中招)。现在 worktree 没了
    就回退到主仓库 + 任务分支——用分支而不是 HEAD,否则会把主线相对基线的全部历史
    当成这个任务的改动(实测一个任务从 1002 个文件回到正确的 15 个)。分支也已删除
    时返回 404 并说清原委,而不是把 git 的 exit status 128 抛给用户。前端此前把这个
    500 静默吞成空集合,现在会先记一条 warn 再降级。

  • 悬浮窗里的文件正文不再与背景同色。 悬浮窗是浅色控制台里的一块深色表面,而
    放进去的文件/终端 tab 用主题令牌上色;控制台从不加 .dark,令牌一直解析成浅色
    主题下的近黑色,落在深色底上等于隐形——新建临时文件后正文看不见,选中才显形。

变更

  • 机器详情里的「重启 agent」「打开终端」两个占位按钮删掉了。 它们从落地起就
    只是形态占位——可点、点了展开一句「尚未实现」。当时的理由是「不置灰」(置灰
    承诺以后能用),但可点的占位是更强的承诺:它看起来就是个能用的按钮。两件事都
    还没有后端接口,真做的时候形态多半也不是这两个按钮。

v0.3.3

Choose a tag to compare

@github-actions github-actions released this 20 Aug 01:28

这一版把「有新版了」这件事从菜单栏挪进控制台。 此前提示只挂在托盘菜单的一行
文字上,装了 v0.3.0 的用户会问「怎么没显示更新」,点开也只是跳到发布页;现在它是
控制台右下角的提示框,从提示到下载完成都在同一个界面里。从 v0.3.2 升级无需改配置。

新增

  • 控制台右下角的更新提示框。 有新版、下载中、已下载、同步失败四种状态各有自己
    的样子,点主按钮就开始下载。只有在桌面薄壳里打开控制台时才出现——用浏览器直接
    访问控制台的用户看不到它,因为那种情况下没有可更新的桌面端。
  • 设置页新增「更新」分区(/settings?section=update):桌面应用、同步状态、
    执行机三块,一屏说清哪台在什么版本。
  • 执行机一键升级。 更新页上每台执行机一个按钮,点了就把那台的 agentd 升到最新,
    与 handoff upgrade 走的是同一套结论判据(忙碌可 --force 跨过、非托管永不跨过)。
    新增 POST /api/machines/{name}/upgrade。
  • agentd 负责下载桌面端安装包:下载、按 checksums.txt 校验 sha256、完成后唤起
    文件管理器打开它,最后一下(拖进 Applications / 跑安装程序)留给用户。新增
    POST /api/update/download。
  • 薄壳每 10 秒向本机 agentd 单向上报一次自身状态(版本、平台),agentd 中转给控制台,
    带 30 秒 TTL。方向是单向的:控制台是薄壳里的一个外部 URL,两边没有互相调用的
    通道,也不需要有。

变更

  • 托盘菜单瘦身到两项(打开控制台、退出),图标换成 handoff 标志的单色模板图,
    在浅色与深色菜单栏下自动适配。原先挂在托盘上的「有新版可下载」「升级执行机…」
    连同那个升级面板一起删掉了——它们的位置在控制台里。

修复

  • desktop 嵌套 module 的依赖与主模块对齐,并把这道门加进 CI。v0.3.2 的发布流水线
    三个桌面端构建 job 全部卡在「确认工作区干净」上,根因是主模块的云 relay 引入了
    noise / yamux / x/crypto,而 desktop/go.mod 没跟上;这种漂移此前只在推完
    tag 之后
    才暴露,那时版本号已经用掉了。现在 PR 阶段就会拦下。

v0.3.1

Choose a tag to compare

@github-actions github-actions released this 19 Aug 13:08

修复

  • 换版不再重建 Windows 计划任务。 桌面端每次把本机 agentd 换版后都会催进程
    管理器把它拉起来,而这条路径此前只能走「安装」——Windows 上的安装是
    schtasks /Delete /F 再重建,于是升级一次,用户对 handoff-agentd 任务定义
    做过的任何修改(触发器、运行身份、条件)连同任务历史一起被抹回默认
    。
    服务管理器新增「只启动、不改定义」的能力,已装的单元现在只触发不重建。

    单元真的坏了(指向已被删除的二进制、定义被改残)时仍会回落到重装——
    「少重写一次」不该凌驾于「agentd 起不来」之上。

    macOS 与 Linux 同样受益(不再无谓 bootout/bootstrap 与 daemon-reload),
    但那两边的重装本来就不破坏用户数据,Windows 才是这条修复的动机。

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 19 Aug 12:40

0.3.0 正式版。 这一版的主线是桌面端:Windows 与 macOS 各有一份原生薄壳,
把控制台、首次配置、以及本机 agentd/CLI 的版本同步收进一个双击就能用的入口。
从 v0.2.3 升级无需改配置。

新增

  • 桌面端(Windows .exe / macOS .dmg)。 托盘常驻,双击进控制台,首次运行
    带三步配置向导。macOS 版已签名并公证。
  • 桌面端启动时会把本机的 agentd/CLI 同步到与自己同版。 此前只有第一次运行会
    释出内嵌的 CLI,之后换一份新的桌面端不会带动它——纯桌面端用户的 agentd 会一直
    停在旧版且收不到任何信号。本机有活跃任务时自动跳过本次同步,不打断在跑的活。
  • 托盘「有新版 vX.Y.Z 可下载」,点击打开 release 页面;与 CLI 侧共用同一份
    24 小时缓存。
  • 托盘「升级执行机…」:打开一个面板跑 handoff upgrade --now,逐行显示巡检表。
  • proxy 配置项:给 handoff 自身出网配代理,支持 http / https / socks5 /
    socks5h。作用于更新链路与 agentd 的 git clone/fetch;不作用于协调者↔agentd
    链路与 executor(后者仍走 env 段)。空值时行为不变(沿用 HTTPS_PROXY 等环境变量)。
  • handoff upgrade --push:强制由本机下载并推送二进制。

变更

  • handoff upgrade --now 默认改为让执行机自己下载:协调者只下发 tag 与 sha256。
    一次多机升级的跨机流量从每台 20MB 降到几十字节。对端 agentd 过旧时自动降级为
    推送,无需干预。
  • /api/update 新增 mode 查询参数(pull / push)。省略时行为与此前一字不变。
  • /api/status 的 update 段新增 pull(能力位)与 pull_state(自拉进度与失败原文)。
  • macOS 薄壳的资产从 .zip 换成 .dmg。

修复

  • macOS 桌面端打开控制台停在「需要登录」。 会话 cookie 是 SameSite=Strict,
    而薄壳加载控制台走的是程序发起的顶层导航、没有同站发起方,WebKit 会把这类
    cookie 扣下不发——症状是 ticket 兑换成功、紧跟的跳转却报「无凭据」。已降为 Lax:
    只对顶层 GET 导航放行,写操作走 POST/DELETE,跨站一样带不上。Chromium
    (Chrome / Windows 的 WebView2)不受影响,所以这个问题只在 macOS 出现。
  • 版本比较认预发布号了(v0.3.0-rc8 < v0.3.0-rc11 < v0.3.0)。此前本仓库发的
    每一个 rc 对比较器都是不可比的,后果是 rc 构建上的同步与更新提示一律失效。
  • .app 的版本号不再写死成 0.1.0,改为随 tag 注入。
  • go install 装出来的二进制不再自称 unknown,改为回落到模块版本。此前
    upgrade --check 会陷入「劝你升级 → 升完仍是 unknown → 继续劝」的死循环。
  • Windows:双击薄壳进程在约 1 秒后无声消失;service status 长期误报「已安装但
    未运行」;spawn 子进程时闪控制台窗口。
  • macOS:.app 图标发灰、字形偏小、带投影。

已知限制

  • agentd 的版本被你手上这份安装包钉住。 桌面端只把本机同步到与自己同版,要升到
    更新的版本得换安装包——托盘的「有新版可下载」就是这个提醒。
  • 已装 CLI 的版本号不是 vX.Y.Z 形态时同步不触发(例如自行 go build 的开发
    构建)。这是刻意的保守行为:判不出新旧就不覆盖你手上的东西。