资讯动态

CodeWhale Workflow 沙箱:QuickJS 虚拟机能力边界完全解析

发布时间:2026/9/15 19:02:52 来源:尧图企业网站定制
CodeWhale Workflow 沙箱QuickJS 虚拟机能力边界完全解析【免费下载链接】CodewhaleOpen-source coding agent for your terminal, built in Rust and on a journey of continuous community improvement. Issues and PRs welcome.项目地址: https://gitcode.com/GitHub_Trending/de/CodewhaleCodeWhale 是一个用 Rust 编写的开源终端编码代理coding agent其 Workflow 引擎通过一个沙箱化的 QuickJS 虚拟机执行模型编写的 JS 脚本再由此调度子代理subagent完成多步骤自动化任务。本文带你完整解析这个 Workflow 沙箱的 QuickJS 虚拟机到底“能做什么、不能做什么”全局能力清单、内存/栈/并发资源限额、确定性禁用规则、取消级联与错误分类以及task()调用的全部边界约束——帮你彻底理解它的能力边界。一、Workflow 沙箱是什么每个脚本一台独立 QuickJS 虚拟机CodeWhale 的动态 Workflow 运行时位于 crates/workflow-js/ 目录基于 rquickjsQuickJS 的 Rust 绑定构建。它的核心设计只有一句话每次运行run都启动一台全新的 QuickJS 解释器跑在专属 OS 线程上脚本之间共享任何状态——全局变量、堆、字符串池——都没有。这意味着卡死的脚本永远无法拖垮其他运行而“卡死”本身也由内存限额、取消级联和生命周期上限三道保险兜住见 vm.rs。二、沙箱内全局能力清单脚本只有这 7 个“超能力”每个脚本都被包进一个 async 函数执行支持顶层await和return能看到的全局对象只有以下这些定义见 vm.rs 预lude 部分全局能力类型作用args值本次调用的输入参数原样注入await task(opts)异步函数派发一个子代理返回完整结果文本或经responseSchema校验后的对象parallel(thunks, opts)异步函数扇出并发单次最多1000项pipeline(items, ...stages)异步函数逐项流水线阶段间无屏障同样限 1000 项log(msg)/phase(title)同步函数向 UI 上报进度事件budget冻结对象budget.total/budget.spent()/budget.remaining()实时读取 token 池export default async function (args)语法糖模块风格写法VM 自动转成脚本形态执行脚本的return值会被 JSON 编码undefined变null交还给宿主。内部宿主绑定__workflow_task等在执行前会被从globalThis上删除脚本只能看到上面这张“白名单”。三、硬性边界这些操作会直接抛错沙箱的“负面清单”同样写死在预lude 里vm.rs#L1255-L1267没有模块加载器——不能import/require任何第三方库没有 fs / net / process——读不了文件、发不了请求、碰不到环境变量Date.now()、new Date()、Date.parse/UTC、Math.random()一律抛错。为什么连随机数和时钟都封掉因为 CodeWhale 的 Workflow 支持录制/回放record/replay脚本必须完全确定录下的运行轨迹才能被原样重放。这是“能力受限”换取“可复现”的刻意取舍。另外两个容易忽略的语法边界export default只在行首且是真实语法时才会被改写字符串、注释里的同名字样会被正确跳过识别逻辑见 desugar_export_default脚本结果必须是JSON 可编码的值——返回函数或循环对象会触发ResultEncoding错误见 error.rs。四、资源限额一览表内存、栈与并发都是可调的默认值与可调区间全部由环境变量控制且都有硬性上下限vm.rs#L35-L45限额默认值下限上限环境变量JS 堆内存32 MiB4 MiB512 MiBCODEWHALE_WORKFLOW_JS_MEMORY_LIMIT_MB解释器栈1 MiB128 KiB8 MiBCODEWHALE_WORKFLOW_JS_STACK_KBVM 线程栈2 MiB512 KiB16 MiBCODEWHALE_WORKFLOW_JS_THREAD_STACK_KB并发 VM 数41256CODEWHALE_WORKFLOW_JS_MAX_CONCURRENT除此之外还有三个运行级硬性上限lib.rs生命周期上限单次运行最多 1000 次task()派发尝试WORKFLOW_LIFETIME_CAP防止“循环到干”的失控脚本并发上限同一时刻最多 16 个活着的子代理WORKFLOW_MAX_CONCURRENT超出的派发会排队等槽位扇出上限单次parallel()/pipeline()最多 1000 项。 值得注意的设计没有墙钟超时。官方把“取消cancellation”当作唯一的期限机制——删除运行 future 或驱动层取消级联触发后正在执行的 JS 会被中断处理器中止所有挂起的task()都会解析为错误vm.rs#L52-L56。五、task()的边界派发子代理前的层层守门task()是沙箱与外界唯一的“工作出口”。派发前选项会经过一轮严格校验parse_task_options任何一项不合规都直接抛错、不消耗任何 token未知字段拒绝字段名写错如responseschema会显式报错而不是静默丢弃写入权限 fail-closed声明workspace_write/worktree_write却没给writeRoots/exactFiles/coordinationContracts中任何一个直接拒绝角色矛盾检查role与subagentType声明的权限冲突如“reviewer”却要求写权限会被拦截路径逃逸检查../穿越、绝对路径、盘符路径全部拒绝只允许有界的仓库相对路径Schema 预编译responseSchema在派发前就编译坏 schema 快速失败不浪费一次子代理。回复校验失败时还有有界修复默认重试 1 次最多 3 次上限见 schema.rs修复子任务会携带原任务、schema 和失败原因重新提问。修复同样要走准入、预算和用量核算不是“免费重试”。六、错误分类失败永远是“数据”而不是“文案”沙箱里每次task()失败都带一个稳定机器类型TaskErrorKinderror.rskind含义admission派发从未发生选项非法、schema 无效、生命周期上限或准入拒绝budget共享 token 池耗尽cancelled运行/子任务被取消任何模式下都致命绝不会被吸收为槽位值agent子代理已运行但失败schema回复不满足responseSchema且修复次数用尽driver宿主侧通道断裂script脚本自身抛出的错误parallel()的三种模式对失败的吸收策略各不相同预lude 实现见 vm.rs#L1322-L1445默认settled把非致命失败降级为null槽位fail-fast遇到第一个错误立即拒绝整个扇出partial则把每个失败保留为可检查的{ __taskError: { index, kind, message } }结构。所有结果数组还会挂一个不可枚举的errors属性失败不再被静默擦除。七、想动手试试从这三处入口开始官方自动 Workflow 文档docs/AUTOMATIC_WORKFLOWS.mdWorkflow 编写指南docs/WORKFLOW_AUTHORING.md内置配方示例最佳 N 搜索workflows/operate_best_of_n.workflow.js配套端到端测试见 vm_tests.rs宿主侧契约WorkflowDriver、预算快照、进度事件在 driver.rs总结边界即设计CodeWhale Workflow 沙箱的能力边界可以浓缩成三句话能做的很少——只有 7 个全局能力其余一切文件、网络、模块都进不来做不了的很确定——时钟和随机数被禁用换来回放能力每一步都有上限——32 MiB 默认堆、1000 次派发、16 并发、有界 schema 修复。这种“白名单 硬限额 确定性”的组合正是模型生成的脚本敢在真实终端里安全运行的底气所在。【免费下载链接】CodewhaleOpen-source coding agent for your terminal, built in Rust and on a journey of continuous community improvement. Issues and PRs welcome.项目地址: https://gitcode.com/GitHub_Trending/de/Codewhale创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价