2026-08-19 整理。背景:connectedGraph/pi(fork 自最上游 earendil-works/pi)把 Model Shell Protocol 内核嵌入开源 coding agent Pi,构建自包含 pi-shell。

核心概念

Model Shell Protocol(MSP) = "一切皆命令"的模型操作系统语义层:把应用数据/领域对象投影成工作区文件、把操作注册成命令、权限归策略引擎、执行留审计。不是 /bin/sh 的包装,而是把 Unix 的"一切皆文件"推广到 AI 原生软件——模型面对一个统一 bash 工具,而不是一堆工具 schema。

一句话:普通沙箱把"不可信的东西"关起来;MSP 把"可信的东西"造出来。 普通沙箱靠 OS 边界防御(命名空间/seccomp/VM),MSP 靠语义级构造:应用没投影的路径对模型"根本不存在",谈不上越权。

pi-shell 架构

  • MSP(Swift)裁掉 MSPGit/Cgit2 后 vendored 进 pi 仓库 packages/msp-kernel/,加 C ABI shim(msp_run_json/msp_free_json),编译成 libMSPKernel.so。
  • Pi 侧 msp-runtime.ts 用 Bun FFI dlopen 进程内加载(无外部 msp-shell 进程),bash 工具改走 mspRunJson(workspace, command)。
  • 回喂协议:{"stdout","stderr","exit_code"} + cwd,JSON 只是 FFI 信封,字段是 MSP 原生结果。

沙箱的"虚拟表面"(模型看到的真相)

实测(直接用内核跑):干净工作区虚拟根只有 tmp/ + 你创建的文件,无 /usr、/bin、/etc。命令走注册表(type python3 → /usr/bin/python3 是注册路径,不映射到虚拟树文件);文件系统走虚拟树。两套独立命名空间,所以"which python3 给出 /usr/bin/python3、ls /usr/bin 却不存在"不矛盾。

  • 工作区外路径 = No such file or directory(不是 permission denied)→ 模型常误读成"容器/权限拒绝"叙事,会浪费轮次"调查环境"。
  • 导出环境 PATH=/usr/bin:/bin,但 shell 自身 $PATH 变量可能为空(割裂是 MSP shell 细节)。

命令事务模型(最重要的使用边界)

MSP 无持久进程/无持久会话。 每条命令跑完即焚。因此:

  • 起不了常驻服务:python 里 bind/listen 挂的端口,命令一结束就没了(实测:运行期间可连,结束后 Connection refused)。
  • 跨命令无状态:全局变量、线程、sys.modules、打开的文件/socket 都不保留。
  • 想跑长驻服务需新机制(如引擎内保留长命子解释器的"后台会话"),当前不支持。

网络

全放——不建虚拟网段、不拦流量,python 的 socket/urllib 走宿主网络栈,DNS/公网 HTTPS 实测通。但 shell 命令层没有 curl/wget/ping(fake POSIX 未注册),模型联网只能走 python。

安全洞教训(已修)

早期实现曾用宿主 existsSync 解析 cd <目标> 并把沙箱根重定到任意真实宿主目录——cd /etc && cat passwd 越狱。修复:沙箱根固定为会话工作区,cd 全交给 MSP 虚拟 FS。 沙箱根绝不能由宿主 FS 决定;要支持多目录用会话/配置级 allowlist。

相关


本文归档于个人知识库 · 领域:CS & AI · 模块:04 Project_CS_AI/AI apps