v0.11.0 — 门户自己发一份 skill,一次授权最长可以给到一天
-
网页 AI 装一次就知道你这台实例在哪,不用每开一个新对话就重贴一遍连接说明。 门户在
/webfetch/skill上直接给出一份填好的 Agent Skill(markdown 原文),里面的 relay 地址和门户地址就是你这一台实例的地址,不是模板占位符。能装 skill 的宿主——Claude 项目、自定义 GPT、Kimi、Qwen——装一次以后,每次对话它自己就知道该去哪里找你的设备、按什么协议走。连接页上有「装成 skill」的入口,帮助页和发现文档(skill_url)也都指过去。同一轮还把发现文档里给 AI 的那段 instructions 改成和wanctl help --instructions用同一份目录渲染,两边从此不会各说各的;委托会话和 MCP 宿主规则不同的三条(exec 只能一次性、edit_text一次改一处、输出过长保留开头并取消命令)就写在对应的那几行旁边。 -
批准一次访问,最长可以给到 24 小时。 有效期原来卡在 60 分钟,批准页现在给四个预设——15 分钟、1 小时、4 小时、24 小时——外加一个自己填的分钟数,范围 1 到 1440,默认仍然是 15 分钟;点预设和手填走的是同一个输入框,服务端只会收到一个数。配套地,
exec的timeout_seconds上限从 1800 秒提到 14400 秒,一次授权允许的任务条数也不再是固定 64 条,而是按你批准的时长算,每小时 64 条。这么改是因为一次编译、一次渲染、一次安装可能要跑上几个小时,人过一阵回到同一个对话里读结果——以前授权先过期了,结果链接就打不开。代价写在批准页的小字里:授权开多久,AI 手里那条会话链接就在多久之内一直有效,要提前收回去「设置 → 访问令牌」。决定记在 ADR 0010。 -
安卓上两个开关都打开之后,提权命令不再被第三道关卡挡住。 以前在开着「自动放行所有命令」又开着「提权通道」的手机上,
wanctl exec --elevate每一条照样被拒,而且没有任何办法补上这个许可,提权在最需要它的无人值守设备上等于不能用。现在这种设备上的提权命令直接执行并记进日志。这是甲方 09-18 的决定:两个开关默认都关着,打开哪一个都得人动手,两个都打开本身就是许可。普通模式的设备一点没放松,只是修好了:提权请求现在会正常出现在门户的审批卡片上,并且带着要执行的命令文本——以前那张卡片只有一个没翻译的标签和一道破折号,根本没有可判断的东西。另外wanctl rules add --kind exec-elevated现在能建这一类规则;用--script发的命令记成规则时存的是脚本摘要(script:<解释器>:<完整 sha256>),卡片上会缩写的也只有真正的脚本,别的文本一律原样整条显示。还有一处:在安卓上用app、prop、screenshot而忘了加--elevate,现在直接告诉你要加这个参数,不再以「命令不存在」的样子回来。 -
中断一条持久会话里的命令,现在真的能把它停掉。 Ctrl-C,或者控制端的连接断了,设备端会把那个 shell 连同还留在它进程组(Windows 上是作业)里的东西一起 kill,整条会话销毁,下一次 exec 拿到的是一个全新的 shell。代价说在前面:那条会话的工作目录和环境变量没了,需要保留上下文就用
--oneshot,--oneshot的行为这次没有变。仍然跑得掉的是主动离开容器的进程:Unix 上setsid()、双 fork、以及更常见的setpgid()(作业控制set -m起的后台任务就是这种);Windows 上受控 shell 自己创建的进程一个也跑不掉,但它请系统里别的服务代为创建的进程不在这个作业里。决定记在 ADR 0011。 -
wanctl update在只做控制端的机器上不会再顺手起一个 agent。 那台机器装了 wanctl、登录了、只用来控制别人,更新完之后它还是只做控制端,配置目录一个字节都不会多出来。另一头也补上了:一个正在运行、但没把 pid 记在文件里的受控 agent,以前在更新时会被静默跳过重启,旧版本继续在跑还看不出来;现在这种情况会照常重启。 -
macOS 上截图失败,现在直接告诉你要去开哪个权限。 以前只回一句
screencapture failed: could not create image from display,看不出这其实是系统没给屏幕录制权限。现在报错里写清楚了:打开系统设置 → 隐私与安全性 → 屏幕录制,把 wanctl 或者启动 agent 的那个程序加进去并打开,然后重启 agent。 -
17 条工具说明重写成操作指南。 这些文字是 AI 读的,是它的操作手册,可这 17 条一直只是把参数表复述一遍。现在每条都回答三个问题:什么时候该用它而不是旁边那个(要字节用
push、要看文件用read而不是pull、长短不定的活先用exec_async)、拿到的结果是什么意思(控制端上rules和trust clients是空的很正常,轮询没有新输出不等于卡住)、报错之后该做什么,包括哪些错的正确反应是停下来问人。给 AI 的 instructions 里 REFUSALS 那行标题也改了:原来写「这些都不用重试」,底下四条却有两条明写着「然后重试」;现在说的是「都不能原样重试」——在批准、固定指纹、人做决定或者补上凭据之前,把同一次调用再发一遍没有意义。 -
慢速链路上 push 大文件,不再跑了几分钟之后以
tls: bad record MAC失败。 根子在 relay 的下行长轮询:字节一出队就写进响应,响应半路断了那段字节就永远没了,端到端的 TLS 流里出一个洞,两头看到的就是这条错。现在 relay 给每个下行分片编号,读的一方在下一次轮询里确认收到了哪一片,没确认的分片原样重发;单次响应最多 2 MiB,慢链路上一次也下得完;正常关闭的会话会留到两个方向都读空再收掉。新旧版本混用是安全的:任意一边是旧版,就退回原来的做法。
本次 relay、门户和受控端都建议升级:这一版改动了设备端的行为(提权判定、会话中断、传输确认)。传输层的确认在任意一边是旧版时会退回原来的做法,版本混着用是安全的。无数据库迁移,没有新增环境变量。安卓 APK 这次只改了文案字符串。