From 64d0a377dc913104792b9ea92a6ac74f10805bfa Mon Sep 17 00:00:00 2001 From: JOJO <1498581755@qq.com> Date: Thu, 3 Sep 2026 07:47:39 +0800 Subject: [PATCH] =?UTF-8?q?feat:=2004=E7=89=88=E6=9C=AC=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E5=8A=A8=E7=94=BB=20+=20=E6=BC=94=E7=A4=BA=E5=8C=BA5=E6=9D=A1?= =?UTF-8?q?=E7=9C=9F=E5=AE=9E=E5=AF=B9=E8=AF=9Dmock=20+=20=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E5=90=8C=E6=AD=A5=E6=B2=99=E7=AE=B1=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 主页第4行特色动画(版本控制)及 01/02/03 动画迭代 - 演示区对话 mock 全部换为真实对话转换:日常使用(汽车对比新/整理周会速记)、 StarRaid(弹幕调研/像素飞机设计)、开发实战(猫咪咖啡店多智能体) - 子智能体 activity、消息截图媒体、文件卡片资源(docx/pdf/html)随站点发布 - sw.js: file/content 二进制 MIME、/api/conversations/media 路由、 模型列表扩为 K3/V4-Flash/MiniMax-M3/GLM-5.2、CACHE v5 - content/ 同步 8-31 沙箱重构文档更新 --- content/01-quick-start.md | 2 +- content/02-core-concepts.md | 14 +- content/05-execution-security.md | 28 +- demo/anim2-demo.html | 4 +- demo/anim3-demo.html | 58 +- demo/anim4-demo.html | 22 + demo/index.html | 10 +- .../activity-sub_1_1788364427_985302.json | 1 + .../activity-sub_2_1788364429_91688a.json | 1 + .../activity-sub_3_1788364431_74db3e.json | 1 + .../activity-sub_4_1788364765_5d6208.json | 1 + .../bootstrap-conv_20260823_133304_218.json | 1 - .../bootstrap-conv_20260825_210916_394.json | 1 + .../bootstrap-conv_20260825_222209_771.json | 1 + .../bootstrap-conv_20260902_235153_495.json | 1 + .../bootstrap-conv_20260903_003950_896.json | 1 + demo/mock/conversations-ma.json | 25 +- demo/mock/conversations-normal.json | 64 +- demo/mock/file-11.12周会速记-待整理_1.txt | 54 + demo/mock/files/11.12周会会议纪要.docx | Bin 0 -> 12321 bytes demo/mock/files/11.12周会会议纪要.pdf | Bin 0 -> 233183 bytes demo/mock/files/index.html | 1349 +++++++++++++++++ ...8f24009e2adb2f2895ad4b06bbc404e102f6d9.png | Bin 0 -> 271587 bytes ...4fd422403592632c90acf25ace14dbb3298f7f.png | Bin 0 -> 44574 bytes ...2de1f42b5837cf073dd5636bb6cf2bf2a85c50.png | Bin 0 -> 60974 bytes ...88fe1805c4666eece63dfbae00041755afdc4a.png | Bin 0 -> 271624 bytes ...b2929f87fee5a82776754e32bc4314797d0bf7.png | Bin 0 -> 42907 bytes ...7c52a57c14de08f2f8dd7297cbb65245ca03f2.png | Bin 0 -> 39643 bytes ...dc73e99908570e18f9f7d267f212ba4850fc85.png | Bin 0 -> 34520 bytes ...51aab7ccc97eee61a324a3cdc472e1b45df539.png | Bin 0 -> 165197 bytes ...bf63cb0b968fd353a8a93d177bc3e6dfb7d186.png | Bin 0 -> 16653 bytes ...466de4114a7b680c20a89d711718f6ad5ee5e6.png | Bin 0 -> 53429 bytes ...837ec488be99819192aaa5127ff9fa7e04422b.png | Bin 0 -> 10938 bytes .../sub-agents-conv_20260902_235153_495.json | 33 + demo/site-assets/anim-modes.js | 29 +- demo/site-assets/anim-records.css | 301 ++++ demo/site-assets/anim-records.js | 899 +++++++++++ demo/site-assets/anim-sandbox.css | 66 +- demo/site-assets/anim-sandbox.js | 171 ++- demo/site-assets/anim-version.css | 269 ++++ demo/site-assets/anim-version.js | 1140 ++++++++++++++ demo/site-assets/anim3-demo.css | 253 +--- demo/site-assets/anim3-demo.js | 552 ------- demo/site-assets/anim4-demo.css | 36 + demo/site-assets/astrion-avatar.js | 121 +- demo/site-assets/site.css | 5 +- demo/site-assets/site.js | 12 + demo/sw.js | 51 +- 48 files changed, 4529 insertions(+), 1048 deletions(-) create mode 100644 demo/anim4-demo.html create mode 100644 demo/mock/activity-sub_1_1788364427_985302.json create mode 100644 demo/mock/activity-sub_2_1788364429_91688a.json create mode 100644 demo/mock/activity-sub_3_1788364431_74db3e.json create mode 100644 demo/mock/activity-sub_4_1788364765_5d6208.json delete mode 100644 demo/mock/bootstrap-conv_20260823_133304_218.json create mode 100644 demo/mock/bootstrap-conv_20260825_210916_394.json create mode 100644 demo/mock/bootstrap-conv_20260825_222209_771.json create mode 100644 demo/mock/bootstrap-conv_20260902_235153_495.json create mode 100644 demo/mock/bootstrap-conv_20260903_003950_896.json create mode 100644 demo/mock/file-11.12周会速记-待整理_1.txt create mode 100644 demo/mock/files/11.12周会会议纪要.docx create mode 100644 demo/mock/files/11.12周会会议纪要.pdf create mode 100644 demo/mock/files/index.html create mode 100644 demo/mock/media/045f0f5fd70b95811b656509be8f24009e2adb2f2895ad4b06bbc404e102f6d9.png create mode 100644 demo/mock/media/177e3c06517b9d03478d6130bb4fd422403592632c90acf25ace14dbb3298f7f.png create mode 100644 demo/mock/media/2d5a45df28fa8ba85e9c7b36322de1f42b5837cf073dd5636bb6cf2bf2a85c50.png create mode 100644 demo/mock/media/3cb1a4242c66c7fe883836053c88fe1805c4666eece63dfbae00041755afdc4a.png create mode 100644 demo/mock/media/6118725ec03e8d3c446cf203feb2929f87fee5a82776754e32bc4314797d0bf7.png create mode 100644 demo/mock/media/699d3eed0b6ee659ff923246ec7c52a57c14de08f2f8dd7297cbb65245ca03f2.png create mode 100644 demo/mock/media/a39fd689779286d2157e51039edc73e99908570e18f9f7d267f212ba4850fc85.png create mode 100644 demo/mock/media/b7b16261a5a513b8b1d73695ca51aab7ccc97eee61a324a3cdc472e1b45df539.png create mode 100644 demo/mock/media/c898612190f5925fa359b0ba3dbf63cb0b968fd353a8a93d177bc3e6dfb7d186.png create mode 100644 demo/mock/media/ddccba962367f285f3133d0077466de4114a7b680c20a89d711718f6ad5ee5e6.png create mode 100644 demo/mock/media/f588a5f40d8b3b94d43adbc2c7837ec488be99819192aaa5127ff9fa7e04422b.png create mode 100644 demo/mock/sub-agents-conv_20260902_235153_495.json create mode 100644 demo/site-assets/anim-records.css create mode 100644 demo/site-assets/anim-records.js create mode 100644 demo/site-assets/anim-version.css create mode 100644 demo/site-assets/anim-version.js delete mode 100644 demo/site-assets/anim3-demo.js create mode 100644 demo/site-assets/anim4-demo.css diff --git a/content/01-quick-start.md b/content/01-quick-start.md index 52ff1ff..5b73edf 100644 --- a/content/01-quick-start.md +++ b/content/01-quick-start.md @@ -215,7 +215,7 @@ Astrion 的运行态数据(对话记录、用户、日志、部署级配置) | | **host 模式** | **web/docker 模式** | |---|---|---| | 定位 | 本地个人使用 | 服务器多用户部署 | -| 命令执行 | 宿主机 OS 沙箱(macOS sandbox-exec / Linux bwrap / Windows WSL2) | 每个用户独立 Docker 容器 | +| 命令执行 | 宿主机 OS 沙箱(macOS sandbox-exec / Linux bwrap / Windows WSL2) | 每个用户独立 Docker 容器,受限档权限下以非特权 uid 执行 | | 数据目录 | `~/.astrion/astrion/host/` | `~/.astrion/astrion/web/` | | 前置准备 | 无需镜像;Windows 需先装 WSL2 | 必须先构建镜像:`docker build -f docker/terminal.Dockerfile -t my-agent-shell:latest .`(构建上下文必须是仓库根) | | 镜像名 | — | 由 `TERMINAL_SANDBOX_IMAGE` 指定,建议 `my-agent-shell:latest` | diff --git a/content/02-core-concepts.md b/content/02-core-concepts.md index 226291f..15711fe 100644 --- a/content/02-core-concepts.md +++ b/content/02-core-concepts.md @@ -20,7 +20,7 @@ Astrion 有四组**相互正交**的概念,理解它们是理解整个系统 两者的数据目录完全分开(`~/.astrion/astrion/host/` 与 `web/`),但 host 模式会**合并读取** web 模式的用户与工作区列表——同一台机器上两种模式的历史数据都能看到。 -> 注意:docker 模式目前**没有**与宿主机同等的 OS 级只读沙箱机制。容器本身就是隔离边界,但「只读沙箱→审批→单次可写重试」这套两段式流程是 host 模式专属。 +> 注意:docker 模式同样有只读强制——受限档权限(readonly/approval/auto_approval)下,命令以非特权用户(uid 10001)在容器内执行,写入由内核文件权限直接拒绝,「只读→审批→单次可写重试」两段式流程与 host 模式一致(详见《执行与安全》)。 ## 2. 权限模式:AI 能做什么 @@ -55,17 +55,17 @@ Astrion 有四组**相互正交**的概念,理解它们是理解整个系统 执行环境是**系统层**开关(仅 host 模式可切换),决定命令最终是否经过 OS 沙箱: - **sandbox(默认)**:命令在 OS 沙箱中执行,读写边界由「路径授权」限定。沙箱不可用时关键执行路径会**拒绝执行**,不会静默回退到裸宿主机。 -- **direct(高风险)**:命令直接在宿主机执行,无任何沙箱限制。仅建议明确需要系统级权限时**短时**开启,用完立即切回。切换后一直生效,没有自动回退机制。 +- **direct(高风险)**:命令直接在宿主机执行,无任何沙箱限制。仅 `unrestricted` 权限可选——受限档(readonly/approval/auto_approval)与 direct 硬互斥,在受限档下切 direct 会被拒绝,从 direct 切入受限档会被自动压回 sandbox。仅建议明确需要系统级权限时**短时**开启,用完立即切回。切换后一直生效,没有自动回退机制。 ### 各平台沙箱实现与安全水位(请务必阅读) | 平台 | 实现 | 安全水位 | |------|------|----------| | **Windows** | WSL2 | **可以做到完全的数据隔离**——命令跑在独立的 WSL2 文件系统中。前提是**先自行安装 WSL2**,未安装时沙箱不可用 | -| **macOS** | sandbox-exec | **能限制写入,但无法保证数据不泄露**——macOS 沙箱策略下文件系统对进程全局可读,AI 执行的命令仍可能读到你的私人文件。涉及敏感数据时请谨慎 | -| **Linux** | bubblewrap (bwrap) + seccomp | **尚未经过实际测试**,不建议在生产环境依赖其隔离性 | +| **macOS** | sandbox-exec | **白名单读模型,读写都可限制**——进程默认只能读系统目录、工作区与已授权路径,越界读取会被直接拒绝。固有代价:授权路径的祖先目录顶层文件名可被列出(文件内容仍不可读) | +| **Linux** | bubblewrap (bwrap) + seccomp | 写入可限制(只读档全局只读),但**读侧仍是全局可读**、尚未对齐白名单;且尚未经过实际测试,不建议在生产环境依赖其隔离性 | -这是官方对当前安全能力的如实说明:把沙箱当作「防误操作」的手段是可靠的;把它当作「防恶意窃取数据」的手段,目前只有 Windows(WSL2)路径可以信赖。 +这是官方对当前安全能力的如实说明:把沙箱当作「防误操作」的手段,三个平台都是可靠的;把它当作「防恶意窃取数据」的手段,macOS(白名单)与 Windows(WSL2)可以信赖,Linux 暂时不行。 ### 路径授权 @@ -76,7 +76,7 @@ host 模式下,沙箱的文件访问边界由路径授权决定,分两类: 关系:`可读集合 = 可读可写 + 仅可读`;`可写集合 = 可读可写`。在输入栏 `+` 菜单 →「路径授权」中维护。推荐保持最小授权:工作区 + 临时目录。 -> 终端会话(terminal 系列工具)在启动时绑定当时的执行环境与沙箱策略;**切换执行环境(sandbox ⇄ direct)、切换工作区或容器时,现有终端会话会被直接关闭**,随后在重新拉起的会话中按新策略执行。 +> 终端会话(terminal 系列工具)的读写身份在启动时按当时的权限档、执行环境与沙箱策略**钉死**:受限档下终端以只读身份运行,`unrestricted` 下才是可写身份。**切换执行环境(sandbox ⇄ direct)、权限档在受限档与无限制之间互切、切换工作区或容器时,现有终端会话会被直接关闭**,随后在重新拉起的会话中按新策略执行。 ### 网络权限 @@ -105,7 +105,7 @@ host 模式下,沙箱的文件访问边界由路径授权决定,分两类: ## 5. 四组概念的联动规则速查 1. plan 模式 → 权限强制 readonly、执行环境强制 sandbox(网络权限仍可调); -2. readonly 权限 → 执行环境自动锁定为 sandbox(direct 无意义); +2. 受限档权限(readonly/approval/auto_approval)→ 执行环境自动锁定为 sandbox,direct 仅 unrestricted 可用; 3. 批准 plan 计划 → 自动切 execute 并恢复进入 plan 前的权限与执行环境; 4. docker 模式下没有 sandbox/direct 之分,容器即边界; 5. 权限模式、执行环境、运行模式都是**对话级**状态:新对话继承当前输入栏的取值,个人空间里的「默认权限模式 / 默认运行模式」只影响首次构造。 diff --git a/content/05-execution-security.md b/content/05-execution-security.md index 1369ce2..64ec270 100644 --- a/content/05-execution-security.md +++ b/content/05-execution-security.md @@ -6,23 +6,23 @@ --- -## 1. 命令是怎么被执行的(host 模式) +## 1. 命令是怎么被执行的 ### run_command:两段式执行 以默认推荐的 `approval` 模式为例,一条 AI 发起的 shell 命令的实际旅程是: -1. **先在只读沙箱执行**——能读不能写; +1. **先在只读身份下执行**——能读不能写(host 模式靠 OS 沙箱,docker 模式靠容器内的非特权用户); 2. 如果命令没碰写操作,直接返回结果,全程无感; 3. 如果触发权限拒绝(要写文件、要改系统),**自动转为向你发起审批**; -4. 你批准后,**仅这一条命令**以可写沙箱重试;你拒绝或超时未处理,则本次不执行; +4. 你批准后,**仅这一条命令**以可写身份重试;你拒绝或超时未处理,则本次不执行; 5. AI 拿到的是最终结果,中间过程不干扰它的思路。 -`auto_approval` 模式把第 3 步的审批者换成自动审批智能体;`unrestricted` 模式跳过审批直接执行;`readonly` 模式下写入类请求直接拒绝。 +`auto_approval` 模式把第 3 步的审批者换成自动审批智能体;`unrestricted` 模式跳过审批直接执行;`readonly` 模式下写入类请求直接拒绝。注意审批**只放大这一次写入、不放大读取范围**——想读工作区之外的文件,唯一途径是路径授权(见第 2 节)。 -### 终端会话:切换即关闭 +### 终端会话:身份钉死,切换即关闭 -持久终端会话(terminal 系列工具)在启动时绑定当时的执行环境与沙箱策略。当你**切换执行环境(sandbox ⇄ direct)、切换工作区或容器**时,现有终端会话会被**直接关闭**——不会带着旧策略继续运行,后续操作在重新拉起的会话中按新策略执行。这也意味着:跑长任务时不要切换这些开关,任务会随会话一起终止。 +持久终端会话(terminal 系列工具)的读写身份在启动时按当时的权限档、执行环境与沙箱策略**钉死**:受限档(readonly/approval/auto_approval)下终端以只读身份运行,终端里的写入由系统直接拒绝(EPERM);`unrestricted` 下才是可写身份。当你**切换执行环境(sandbox ⇄ direct)、权限档在受限档与无限制之间互切、切换工作区或容器**时,现有终端会话会被**直接关闭**——不会带着旧身份继续运行,后续操作在重新拉起的会话中按新策略执行。这也意味着:跑长任务时不要切换这些开关,任务会随会话一起终止。 ### 子智能体与后台命令 @@ -60,17 +60,19 @@ ## 6. 关于 direct 模式的忠告 -`direct` = 命令直接在宿主机执行,**没有任何沙箱**。合理使用场景只有一个:某条命令在沙箱里确实跑不了(需要系统级权限),且没有替代方案。此时: +`direct` = 命令直接在宿主机执行,**没有任何沙箱**。它与受限档权限(readonly/approval/auto_approval)硬互斥——只有 `unrestricted` 才能选 direct,从 direct 切入受限档时会被自动压回 sandbox。合理使用场景只有一个:某条命令在沙箱里确实跑不了(需要系统级权限),且没有替代方案。此时: -1. 临时切到 direct; -2. 跑完立即切回 sandbox; +1. 先把权限档切到 `unrestricted`,再临时切到 direct; +2. 跑完立即切回 sandbox(和原来的权限档); 3. 注意 direct 切换后**永久生效、不会自动回退**——忘记切回等于长期裸奔。 ## 7. docker 模式的安全现状 -docker 模式下,隔离边界是容器本身:每个用户的终端在独立容器中,互相不可见。但要注意: +docker 模式下,用户之间的隔离边界是容器本身:每个用户的终端在独立容器中,互相不可见。容器**内部**的权限约束同样是真强制: -- 目前**没有**与 host 模式同等的 OS 级只读沙箱,「只读→审批→可写重试」两段式在容器内不适用,容器内的权限约束主要靠提示词层面的规范; +- 受限档(readonly/approval/auto_approval)下,run_command、后台命令与持久终端都以**非特权用户(uid 10001)**在容器内执行——工作区属主是 root,写入由内核文件权限直接拒绝,不依赖对命令文本的识别;审批通过后,仅该条命令以 root 身份重试; +- 生效前提:工作区属主为 root、没有全局可写的文件、容器未挂载 docker.sock(按官方部署文档操作即满足); +- 该强制仅在 **Linux 宿主机**上成立——macOS 本机的 Docker Desktop 不执行 uid 文件权限,本机开发时不要把容器内部权限当安全边界; - 多用户部署时应配合容器资源限制、镜像最小化等常规容器安全实践。 ## 8. 各平台安全水位 @@ -78,7 +80,7 @@ docker 模式下,隔离边界是容器本身:每个用户的终端在独立 再次强调《核心概念》中的结论,因为它直接影响你该信任沙箱到什么程度: - **Windows(WSL2)**:可做到完全数据隔离,需先安装 WSL2; -- **macOS(sandbox-exec)**:能限制写入,但文件系统全局可读,**不能防止数据泄露**,请勿在可读范围内放置敏感数据; -- **Linux(bwrap+seccomp)**:**尚未实测**,不要依赖其隔离性。 +- **macOS(sandbox-exec)**:白名单读模型,写入和读取都可限制——进程默认只能读系统目录、工作区与已授权路径;代价是授权路径的祖先目录顶层文件名可被列出(文件内容仍不可读); +- **Linux(bwrap+seccomp)**:写入可限制,但读侧仍是全局可读、尚未对齐白名单,且**尚未实测**,不要依赖其隔离性。 无论哪个平台,沙箱的首要价值是**防误操作**;涉及真正的敏感数据,请叠加路径授权最小化、网络受限、readonly 权限等手段综合防护。 diff --git a/demo/anim2-demo.html b/demo/anim2-demo.html index d742c16..0d2acde 100644 --- a/demo/anim2-demo.html +++ b/demo/anim2-demo.html @@ -32,13 +32,13 @@ } .stage { display: flex; flex-direction: column; align-items: center; gap: 18px; } .hint { font-size: 13px; color: var(--text-3); } - #anim2Window { width: 540px; height: 320px; } + #anim2Window { width: 540px; height: 388px; }
点击顶部标签切换情节;再次点击当前标签重播。
+自动无限循环播放:每轮随机 20 条(15 短 + 5 长),弹道随机。
自动播放;点击场景重播。
- -自动播放;收盒后自动轮播,按下卡片暂停 5 秒。
+