这是浏览器控制层和 WebContainer 执行层之间的协议。正常接入请使用 @succinix/engine 的执行器和终端服务,不要手写这些文件;只有替换宿主或传输层时才需要本文。
协议保证请求不会互相覆盖,并让命令、终端输入、输出和实例身份都落在同一个 WebContainer 执行世界中。浏览器不保存第二份 Shell、文件或编辑器状态。
浏览器写 /cmd.json
host 接收后写 /ack-<id>.json
host 执行后写 /result-<id>.json
浏览器读取并删除 ack 与 result
/cmd.json 是单槽投递口,一次只接收一条尚未确认的请求。结果文件按请求 id 独立命名,不能改回共享结果文件。
每个请求必须带 RPC 版本、请求 id、boot nonce、命令名和实例 id;客户端只接受这些身份字段全部匹配的确认与结果。公开命令包括执行、后台启动、进程列表、终止、前台中断、读取或设置工作目录、存活检查和退出握手。具体字段和类型以 src/engine/client.ts 与包导出类型为准。
node、npm、npx使用真实 WebContainer Node 子进程。python、python3、pip、pip3使用内置 Pyodide 运行时。- 其余命令交给同一实例的 Lifo 用户态。
它们共享文件和会话工作目录。通用 Node/Python 子进程交互 stdin 仍不支持,不要把 Lifo 交互终端宣传为通用 PTY。
交互终端有独立的实例/会话邮箱,用来传递输入、输出、尺寸和生命周期帧。它连接 Lifo 的公开终端接口;浏览器只转发设备事件。第三方应通过 ctx.terminals 或宿主的终端服务创建会话,不应直接读写邮箱文件。
- 结果、确认和终端帧都必须校验实例和 boot nonce,旧页面或旧 host 的消息不能结算新请求。
- 进程和端口视图按实例组织,但不是权限系统。
- 端口仅供浏览器预览;没有真实入站网络。
- host 会清理超时未领取的结果文件;调用方仍必须设置自己的超时和重试策略。
协议或公开行为变更时,先更新 Cordis 契约 的外部示例,再运行 node scripts/cordis-app-e2e.mjs。日常接入看接入说明。