Repository navigation
Releases: Xsxdot/handoff
Release list
v0.5.0
v0.4.1
修复
- 载体 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
新增
- 协作房间 + 小队编制 + 隔离 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
这一版修好桌面端终端的输入丢字,并接通「把文件从访达拖进终端」。
三个症状都只在桌面端出现,根因两类:两个是 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
这一版修好中继机器的控制台转发。 机器经 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
这一版让 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
这一版全是真机走查揪出来的问题。 更新面在真机上第一次跑起来时暴露了两个缺陷:
升级失败没有任何出口、版本比不出来时谎称「已是最新」;控制台这边则是文件树角标在
归档任务上整片消失、悬浮窗里的文件正文与背景同色、以及 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
这一版把「有新版了」这件事从菜单栏挪进控制台。 此前提示只挂在托盘菜单的一行
文字上,装了 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
修复
-
换版不再重建 Windows 计划任务。 桌面端每次把本机 agentd 换版后都会催进程
管理器把它拉起来,而这条路径此前只能走「安装」——Windows 上的安装是
schtasks /Delete /F再重建,于是升级一次,用户对handoff-agentd任务定义
做过的任何修改(触发器、运行身份、条件)连同任务历史一起被抹回默认。
服务管理器新增「只启动、不改定义」的能力,已装的单元现在只触发不重建。单元真的坏了(指向已被删除的二进制、定义被改残)时仍会回落到重装——
「少重写一次」不该凌驾于「agentd 起不来」之上。macOS 与 Linux 同样受益(不再无谓
bootout/bootstrap与daemon-reload),
但那两边的重装本来就不破坏用户数据,Windows 才是这条修复的动机。
v0.3.0
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的开发
构建)。这是刻意的保守行为:判不出新旧就不覆盖你手上的东西。