Просмотр исходного кода

发布 v0.4.15:完善虚拟机空闲停止与本机环境选项

Samien 1 месяц назад
Родитель
Сommit
d4c98d4961
8 измененных файлов с 65 добавлено и 21 удалено
  1. 6 6
      README.md
  2. 1 1
      docker.env.example
  3. 7 7
      docs/docker-install.md
  4. 44 0
      docs/releases/v0.4.15.md
  5. 2 2
      package-lock.json
  6. 1 1
      package.json
  7. 3 3
      release.json
  8. 1 1
      tests/fixtures/workspace-server.ts

+ 6 - 6
README.md

@@ -1,6 +1,6 @@
 # 夭夭 AI
 
-当前 Web 与 macOS 桌面发布版本:**v0.4.14**。桌面版提供 Apple Silicon(arm64)DMG,详见 [发布说明](docs/releases/v0.4.14.md)。
+当前 Web 与 macOS 桌面发布版本:**v0.4.15**。桌面版提供 Apple Silicon(arm64)DMG,详见 [发布说明](docs/releases/v0.4.15.md)。
 
 夭夭 AI 为网页、iOS 和安卓提供统一的 Agent、群聊、文件库及语音配置服务。Hermes 通过标准 9119 HTTP/WebSocket 接口执行任务。
 
@@ -38,7 +38,7 @@ Web 数据默认保存在 `~/.yaoyao`,可用 `YAOYAO_HOME` 指定(兼容 `HE
 
 ## macOS 桌面版
 
-在 [v0.4.14 发布页](https://github.com/Lsamien/yaoyao/releases/tag/v0.4.14) 下载 `Yaoyao-0.4.14-arm64.dmg`,将“夭夭”拖到应用程序后打开。首次启动会核对并同步配套本机 Web 服务;普通退出保留后台运行,“停止后台服务并退出”可完整停止本应用管理的后台。详细说明见 [macOS App](docs/macos-app.md)。
+在 [v0.4.15 发布页](https://github.com/Lsamien/yaoyao/releases/tag/v0.4.15) 下载 `Yaoyao-0.4.15-arm64.dmg`,将“夭夭”拖到应用程序后打开。首次启动会核对并同步配套本机 Web 服务;普通退出保留后台运行,“停止后台服务并退出”可完整停止本应用管理的后台。详细说明见 [macOS App](docs/macos-app.md)。
 
 此 DMG 使用 Apple Development 开发签名,未做 Apple 公证。
 
@@ -48,11 +48,11 @@ Web 数据默认保存在 `~/.yaoyao`,可用 `YAOYAO_HOME` 指定(兼容 `HE
 
 | 镜像 | 架构 |
 | --- | --- |
-| `samienluo/yaoyao:v0.4.14-amd` | AMD64 |
-| `samienluo/yaoyao:v0.4.14` | 自动匹配 AMD64 / ARM64 |
-| `samienluo/yaoyao:latest` | 最新稳定版通用镜像,当前与 `v0.4.14` 相同 |
+| `samienluo/yaoyao:v0.4.15-amd` | AMD64 |
+| `samienluo/yaoyao:v0.4.15` | 自动匹配 AMD64 / ARM64 |
+| `samienluo/yaoyao:latest` | 最新稳定版通用镜像,当前与 `v0.4.15` 相同 |
 
-准备好 Docker Engine/Compose 和容器可访问的 Hermes 9119 服务,在仓库目录将 `docker.env.example` 复制为 `docker.env`。配置上游地址,并设置 `HERMES_YAOYAO_IMAGE=samienluo/yaoyao:v0.4.14`(或 `samienluo/yaoyao:latest`),即可使用远程镜像:
+准备好 Docker Engine/Compose 和容器可访问的 Hermes 9119 服务,在仓库目录将 `docker.env.example` 复制为 `docker.env`。配置上游地址,并设置 `HERMES_YAOYAO_IMAGE=samienluo/yaoyao:v0.4.15`(或 `samienluo/yaoyao:latest`),即可使用远程镜像:
 
 ```sh
 docker compose --env-file docker.env pull web

+ 1 - 1
docker.env.example

@@ -3,7 +3,7 @@ HERMES_YAOYAO_BIND_ADDRESS=127.0.0.1
 HERMES_YAOYAO_PUBLISHED_PORT=15300
 # 远程通用镜像支持 AMD64 / ARM64;每次发布更新 latest 并保留旧版本标签。
 # HERMES_YAOYAO_IMAGE=samienluo/yaoyao:latest
-# 固定版本:samienluo/yaoyao:v0.4.14;仅 AMD64:samienluo/yaoyao:v0.4.14-amd。
+# 固定版本:samienluo/yaoyao:v0.4.15;仅 AMD64:samienluo/yaoyao:v0.4.15-amd。
 # 留空时使用本地构建名称 yaoyao:local。
 # YAOYAO_DESKTOP_IMAGE=hermes-yaoyao-desktop:0.4.0
 # Cursor Universal 兼容桌面的本地构建名称;基础镜像在 deploy/computer/Dockerfile.cursor 中固定。

+ 7 - 7
docs/docker-install.md

@@ -12,14 +12,14 @@
 
 | 标签 | 架构 |
 | --- | --- |
-| `v0.4.14-amd` | `linux/amd64` |
-| `v0.4.14` | `linux/amd64`、`linux/arm64`,拉取时自动匹配 |
-| `latest` | 最新稳定通用镜像,当前指向与 `v0.4.14` 相同的镜像 |
+| `v0.4.15-amd` | `linux/amd64` |
+| `v0.4.15` | `linux/amd64`、`linux/arm64`,拉取时自动匹配 |
+| `latest` | 最新稳定通用镜像,当前指向与 `v0.4.15` 相同的镜像 |
 
 ```sh
-docker pull samienluo/yaoyao:v0.4.14
+docker pull samienluo/yaoyao:v0.4.15
 # 需要固定 AMD64 时:
-docker pull samienluo/yaoyao:v0.4.14-amd
+docker pull samienluo/yaoyao:v0.4.15-amd
 ```
 
 每次新版本发布都会更新 `latest`,旧版本标签继续保留。需要固定部署版本时使用具体版本标签。
@@ -34,7 +34,7 @@ cp docker.env.example docker.env
 
 | 配置 | 用途 |
 | --- | --- |
-| `HERMES_YAOYAO_IMAGE` | 远程镜像可设为 `samienluo/yaoyao:v0.4.14` 或 `samienluo/yaoyao:latest`;未设置时使用本地构建名称 |
+| `HERMES_YAOYAO_IMAGE` | 远程镜像可设为 `samienluo/yaoyao:v0.4.15` 或 `samienluo/yaoyao:latest`;未设置时使用本地构建名称 |
 | `HERMES_YAOYAO_UPSTREAM` | Hermes 上游地址,默认 `http://host.docker.internal:9119` |
 | `HERMES_YAOYAO_BIND_ADDRESS` | Web 的宿主机发布地址,默认 `127.0.0.1`;局域网访问可设为 `0.0.0.0` |
 | `HERMES_YAOYAO_PUBLISHED_PORT` | 宿主机 Web 端口,默认 `15300` |
@@ -152,7 +152,7 @@ curl --fail http://127.0.0.1:15300/healthz
 使用 Docker Hub 发布镜像时,在 `docker.env` 设置:
 
 ```dotenv
-HERMES_YAOYAO_IMAGE=samienluo/yaoyao:v0.4.14
+HERMES_YAOYAO_IMAGE=samienluo/yaoyao:v0.4.15
 YAOYAO_CURSOR_DESKTOP_IMAGE=samienluo/yaoyao-desktop:v0.4.12-cursor-amd
 ```
 

+ 44 - 0
docs/releases/v0.4.15.md

@@ -0,0 +1,44 @@
+# 夭夭 AI v0.4.15
+
+本次发布 Web、macOS Apple Silicon 桌面版及 Docker Web 双架构镜像,附带正式签名的 Android 1.3(167)安装包。Android 本次无新增代码,沿用上一版已验证的安装包。
+
+## 更新内容
+
+- 本地虚拟机支持配置空闲自动停止时间,可选 1、5、10、15、30、60、120 分钟或“永不”,默认 5 分钟。设置保存在执行节点,适用于该节点管理的动态虚拟机。
+- 任务执行或接管时取消空闲计时,归还后重新计时。选择“永不”仅关闭空闲自动停止,主动停止、取消、授权撤销、租约到期及执行节点退出仍会停止实例。
+- Bot 的“使用本机”改为虚拟机下独立的可选开关,选择本地虚拟机或 Grok Bot 后才显示。切换到其他电脑环境会清除勾选,再切回虚拟机需要重新开启。
+- 开启后,Bot 可在使用虚拟机的同时使用执行节点本机的已授权命令和文件工具,并通过 `computer_copy_file` 显式复制文件。单次文件上限 25 MiB,同名目标会覆盖。这里的本机是 Hermes 所在节点,不一定是打开网页的电脑。
+- 虚拟机与本机之间保持明确的文件访问边界;任务或接管进行期间不能切换环境。新建 Bot 成员和临时助手不会自动继承本机访问权限。
+- 旧版混合环境配置迁移为“本地虚拟机 + 使用本机”。已连接且获授权的 macOS 节点还可使用本机桌面工具;没有屏幕授权时仍可使用已授权的命令和文件工具。
+
+## 升级说明
+
+- 使用独立 Runner 的部署需要同步更新执行节点,才能使用空闲停止设置及本机工具能力(`host-computer-tools-v1`)。
+- 固定 Compose 桌面的数量与启停仍由 Compose 管理,空闲自动停止设置不接管其生命周期。
+- 数据目录继续使用 `.yaoyao`,沿用已有数据卷与密钥。升级前备份数据。
+- 产品名称为“夭夭 AI”,主项目采用 Apache-2.0,第三方组件保留各自许可与署名。
+
+## 下载
+
+- `Yaoyao-0.4.15-arm64.dmg`:macOS Apple Silicon,Apple Development 开发签名,未公证。
+- `Yaoyao-1.3-167-android.apk`:Android 12 及以上,正式签名。源码提交 `bcbceaa`,与 v0.4.14 安装包一致。
+- `Yaoyao-0.4.15-source.tar.gz`:Web/桌面源码及部署配置。
+- `SHA256SUMS.txt`:以上附件的 SHA-256 校验值。
+
+## Docker Hub
+
+| 镜像 | 架构 |
+| --- | --- |
+| `samienluo/yaoyao:v0.4.15-amd` | `linux/amd64` |
+| `samienluo/yaoyao:v0.4.15` | `linux/amd64`、`linux/arm64` |
+| `samienluo/yaoyao:latest` | 版本镜像验证后指向同一通用镜像 |
+
+```sh
+docker pull samienluo/yaoyao:v0.4.15
+docker compose --env-file docker.env pull web
+docker compose --env-file docker.env up -d --no-build web
+```
+
+Compose 中设置 `HERMES_YAOYAO_IMAGE=samienluo/yaoyao:v0.4.15`。独立电脑镜像沿用现有版本,Cursor 继续使用 `samienluo/yaoyao-desktop:v0.4.12-cursor-amd`。保留旧版本标签与附件。Docker 镜像发布到 Docker Hub,GitHub 不上传镜像归档。
+
+最终附件摘要、Docker manifest 摘要和运行验证记录发布在 [GitHub 发布页](https://github.com/Lsamien/yaoyao/releases/tag/v0.4.15)。

+ 2 - 2
package-lock.json

@@ -1,12 +1,12 @@
 {
   "name": "yaoyao",
-  "version": "0.4.14",
+  "version": "0.4.15",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "yaoyao",
-      "version": "0.4.14",
+      "version": "0.4.15",
       "license": "Apache-2.0",
       "dependencies": {
         "@koa/bodyparser": "^5.0.0",

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "yaoyao",
-  "version": "0.4.14",
+  "version": "0.4.15",
   "private": true,
   "license": "Apache-2.0",
   "description": "夭夭 AI:聊天、多 Agent 团队、文件库与电脑工作空间",

+ 3 - 3
release.json

@@ -1,6 +1,6 @@
 {
   "schemaVersion": 1,
-  "releaseVersion": "0.4.14",
-  "webVersion": "0.4.14",
-  "gitTag": "v0.4.14"
+  "releaseVersion": "0.4.15",
+  "webVersion": "0.4.15",
+  "gitTag": "v0.4.15"
 }

+ 1 - 1
tests/fixtures/workspace-server.ts

@@ -444,7 +444,7 @@ runtime.runners.localVm=async(owner,id,p)=>{
  if(p.op==='idle-policy')vmFixture.idleStopMinutes=Number(p.idleStopMinutes)
  return {...vmFixture}
 }
-runtime.app.use((ctx,next)=>{if(ctx.path!=='/__test/local-vm')return next();const owner=auth.requireAdmin(ctx).id;vmFixture.image=ctx.query.ready==='1';vmFixture.mode='per-bot';vmFixture.maxInstances=2;if(!vmRunnerId){for(const record of runtime.runners.records())if(record.sourceNodeId==='local'&&record.enabled)runtime.runners.remove(record.id);vmRunnerId=runtime.runners.enroll(owner,{name:'本机虚拟机',allowedProfiles:['default']}).runner.id;}ctx.body={runnerId:vmRunnerId}})
+runtime.app.use((ctx,next)=>{if(ctx.path!=='/__test/local-vm')return next();const owner=auth.requireAdmin(ctx).id;vmFixture.image=ctx.query.ready==='1';vmFixture.mode='per-bot';vmFixture.maxInstances=2;vmFixture.idleStopMinutes=5;vmFixture.job=undefined;(runtime.runners as any).online.delete(vmRunnerId);if(!vmRunnerId){for(const record of runtime.runners.records())if(record.sourceNodeId==='local'&&record.enabled)runtime.runners.remove(record.id);vmRunnerId=runtime.runners.enroll(owner,{name:'本机虚拟机',allowedProfiles:['default']}).runner.id;}ctx.body={runnerId:vmRunnerId}})
 runtime.app.use((ctx,next)=>{if(ctx.path!=='/__test/hybrid-runner')return next();auth.requireAdmin(ctx);(runtime.runners as any).online.set(vmRunnerId,{instance:randomUUID(),epoch:'fixture',seen:Date.now(),features:['computer-worker-v1','computer-control-v1','local-vm-v1','image-ready-v1','host-computer-tools-v1','idle-stop-policy-v1']});ctx.body={ok:true}})
 runtime.app.use((ctx,next)=>{
  if(ctx.path!=='/__test/cloud-host-option')return next();const owner=auth.requireAdmin(ctx).id,cloud=runtime.workspaceRuntime.cloud!