Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions internal/portal/changelog/v0.11.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# 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 这次只改了文案字符串。
Loading