菌丝( M)@fungi.computer/mycelium(中文(简体) )
Mycelium 通过一个输入的代理操作 execute 工具,并且能够
在MCP上提供同样的目录. 它验证业务,获得一个连贯的
能力快照,并在运行结束时发布. 您也可以执行
已知没有模型的操作.
npm install @fungi.computer/mycelium zod effect
将下面的快速启动复制到一个 HES TypeScript 文件, 用节点 24 运行 : 它注册了一个Zod操作,并调用它没有模型提供者。 菌类 不评估代码本身。 你的宿主提供沙盒,所以.. 快速启动使用一个不孤立的仅测试适配器.
设置
包船只实行无害环境管理。 运行时间依赖性包括Zod, Effect, acorn, (中文(简体) ),
Cloudflare代码模式,MCP服务器SDK, 凯恩, (中文(简体) ),
饲料, (中文(简体) ), 木浆 财务报告和审定财务报表
纸球,所有自动安装。 词根
入口是承诺主机的外观. @fungi.computer/mycelium/effect
提供范围效应 API。 两者都生产出一种效应-内生木耳工具. 这个
./sandbox-guest, (中文(简体) ), ./sandbox-wire, (中文(简体) ), ./sandbox-failure, (中文(简体) ), ./sandbox-boundary, (中文(简体) ),
财务报告和审定财务报表 ./semaphore-transition 子路径支持主机的沙盒适配器 。 一个主机
提供沙盒 真正评估代码和强制隔离,
外部访问和取消.
快速启动没有模型
此示例注册 demo.ping,执行已知绑定和打印
{"value":"pong"}。直接回调会故意忽略提交的代码。 这个
实值 不隔离: 它具有主机权限和检查注册,
论证与清理.
import { Mycelium } from "@fungi.computer/mycelium";
import { directSandbox } from "@fungi.computer/mycelium/testing";
import * as Effect from "effect/Effect";
import * as Stream from "effect/Stream";
import { z } from "zod";
const runtime = await Mycelium.make({
modules: [
Mycelium.module({
id: "example-demo",
name: "demo",
operations: {
ping: Mycelium.operation({
input: z.object({}),
output: z.object({ value: z.string() }),
execute: async () => ({ value: "pong" }),
}),
},
}),
],
sandbox: directSandbox((bindings, signal) => {
signal.throwIfAborted();
const ping = bindings.demo?.ping;
if (ping === undefined) throw new Error("Missing demo.ping binding");
return ping({});
}),
});
const lease = await runtime.acquire();
try {
const prepared = await Effect.runPromise(
lease.executeTool.prepare({
type: "toolCall",
id: "example-execute",
name: "execute",
arguments: { code: "return demo.ping({})" },
}),
);
const parts = await Effect.runPromise(Stream.runCollect(prepared.execute()));
const text = parts[0]?.result.content[0];
if (text?.type !== "text" || text.text !== '{"value":"pong"}') {
throw new Error("Unexpected execute result");
}
console.log(text.text);
} finally {
await lease.release();
await runtime.close();
}
这个 公共进口固定装置 使用同样的 已知约束模式。 真正的评估者必须执行公共沙盒 合同。 它的请求带有代码,执行身份,限制和被接受 装订。 在主办方的特权程序中不要以评价取而代之.
作业和发现
宣告输入和输出带有效果方案或任何标准Schema的输入和输出
执行标准JSON Schema,例如Zod 4. Mycelium 解码输入
手术前的计策 效果输出计划编码结果( 因此)
诸如 Schema.NumberFromString 返回时 "1"a 标准输出
计划验证了它。 效果计划交换为它的 Cononical JSON 编码
(单位:千美元)Schema.toCodecJson因此,描述,解码器和编码器都同意. A 类
丢弃过滤器或变换是主机错误, 从未向模型报告
作为无效的输入。 稳定模块ID识别权威. 名称变为
模型化名。 输入命令不选择两个身份 。 饲料
为所捕获的图表编写有限度的发现目录.
穆尔收到这个运行时间 一个顶级 execute 工具。 内部操作,
包括 forage.search 财务报告和审定财务报表 forage.describe留在那个工具后面 这个
操作回调只接收其已声明的输入和执行上下文 .
进入检查和授权门在行动前运行。 产品
成员、资源所有权和最后外部访问检查仍然是东道方
责任.
每个 execute 调用在新沙盒中运行, 而不是 REPL: 无变量, 函数
或全球生存在呼叫之间。 在每一次召唤中,你应当重新定义援助者
状态到文件并读回.
执行中的操作身份
每一次注册行动电话都会被冻结 InvocationContext 带有
零基数 operationOrdinal一个计数器覆盖所有登记方法和
模块。 绑定时同步分配
在同步录用或操作工作之前
同时开始的电话有不同的立场。 饲料的内在发现
帮助者不使用注册操作位置.
每次执行尝试的计数器重置 。 重放相同的调用
序列给出相同的正文,即使 executionId 是新鲜的。 一个东道主
将存储的会话和命令身份结合起来
与 toolCallId 财务报告和审定财务报表 operationOrdinal; 单靠普通话不是全球性的
独一无二的身份 不同调用顺序没有承诺相同的位置,
效应所有者仍必须比较预期操作和有效载荷
重弹. 此元数据既不授权也不允许重放不安全
工作时.
直接 invokeModuleOperation 呼叫者提供自己的上下文
执行中没有附加调用序列, 因此 operationOrdinal 也许
缺席,就像 toolCallId 可能缺席。 需要执行身份的主机
必须拒绝缺少身份的写作,而不是发明倒置.
访问标签和赠款
每个操作的作者都标出它所做的: access: "read" 观察到,
access: "write" 改变一些东西, 一个没有标签的操作是 write。一个
作者可以添加 confirm: true 每次打电话前都要问一个人 标签是
操作的固定事实; 主机从不编辑它们.
主办方将其决定作为数据传送至 access。 。 。 . grants 映射模块
编号为 "write" (每次行动), "read" (仅限 read 操作)或
"none"。一个主机名称不全称的模块,所以主机是
不允许写权限代码 . sessionGrants 读取当前
每次通话都存储着会话赠款;它们会覆盖 grants 键按键,所以
取消的补助金适用于下一个电话。 键入 required 失败已关闭 :
当两个名字都没有的时候,就是 "none"标签在定义中解析为
ToolPolicySchema: 任何不确切的东西 "read"编号 :"write" 和布尔
confirm 是一个定义错误. confirm 是宿主如何问一个人;
没有它,一个 confirm 操作被拒绝, 并且从未被询问.
const runtime = await Mycelium.make({
modules: [notes],
sandbox,
access: {
grants: { notes: "read" },
confirm: (request) => askPerson(request),
},
});
在手术输入之前
解码器运行。 拒绝的呼叫返回 a AccessRefusal (单位:千美元)module, (中文(简体) ), operation, (中文(简体) ),
reason 和平原 message作为其通常的结果. onRefused 观察
每一次拒绝日志或计量,绝不改变决定.
Mycelium.grantAs 似乎一个模块的赠款 由更广泛的所有者的关键,例如
它的扩展。 贴有标签的直接工具 tools 坐后边
同样的支票,回来的租借 tools。 。 。 .
准入测试 包括每个规则.
嵌入式命名空间
构建模块 operations 以显示任何命名空间深度。 所附内容
模块标识仍然是权威身份; 儿童注册标识不创建
新的权威 例如,一个名为 bazaar 与 namespace: ["apps"]
财务报告和审定财务报表 operations: { windows: windowModule } 揭发孩子的 open 操作
作为 env.apps.bazaar.windows.open(...)儿童本身 namespace 添加部分
在其注册密钥之后。 奥米 namespace 用于普通深度-1形式
env.demo.ping(...); 现有 demo.ping(...) 形式也起作用.
操作密钥也可能是点缀的相对路径:
operations: { "repos.list": op }称为env.<module>.repos.list(...)就像一个儿童单元repos与 操作list。安装时拒绝既是操作又是操作的密钥 命名空间前缀( n)files与files.read) (中文(简体) ).
每片叶子都保留其申报的输入/输出类型. 附加模块上的门
查看相对路径, 如 windows.open搜索、列出和描述用途
完整的逻辑路径, 并声明相同的嵌入, 可调用
env。名称在逻辑命名空间中分配,所以 App 和 a
计算机也可以在不重命名的情况下共享名称. 运输别名和平面
操作表仍然是只限东道方执行的细节。 使用沙盒适配器
/sandbox-guest解析命名空间元数据 sandboxGuestProgram 改为
选项; 提供者适配器也使用
sandboxProviderOperationName 以避免代码的点名相撞.
不断变化的能力和寿命
使用 sources 当主机必须获取当前计算机、连接或其他
能力预测。 消息源返回其限制的快照和等待的快照
释放函数。 内容 invalidate() 那张快照被打倒了 这个
下一个租约将建立一个新的连贯的图表。 现有租约保留了它
示意图.
解除每次租借并关闭运行时间. 已取消部分获取 以倒序顺序获取源 。 Mycelium拥有它的范围资源 获取,而东道主拥有持久的关系、证书和当前 政策。 抓获的快照不能作为最后权威检查缺失的理由.
取消和错误
执行有期限、取消承认的宽限期和限制
JSON结果。 取消中止引用信号并等待支持
沙盒结算。 如果沙盒忽略它,结果报告
acknowledged: false。不要报告停止的工作.
输入失败频道包括语法错误、 来宾例外、 丢失
运输、不良反应、能力失效、最后期限/取消和无效
或结果过大。 外国投球就变成 Unknown。模型收到
范围 sandboxFailureMessage 投影与参考。 主机收到
操作员通过的证据 onSandboxFailure 和现有报告路径.
在不向客人发送主机诊断的情况下,保护证据.
沙盒录取
仅限主机 execution 选项接受 sandboxCapacity (正保险箱)
整数)和 admissionWaitMs (从1到90万毫秒的整数). 以
默认, 录取等待引用 timeoutMs 预算(180 000美元)
略出后为毫秒),而不是5秒后失败. 明确
主机等待仍受原始引用期限的限制。 还是客人
仅提交 code。省略的能力来自可用的核心,被夹住
2.32;没有便携式核心观测设备的主机使用 2. 节点捕捉其
亲和感核心计数,每次运行一次
node:os.availableParallelism(),位于外部平台条件模块后
工人输入图表。 明显有效的能力超过绕行观察
并且没有被夹住,包括超过32的数值.
normalizeSandboxAdmissionPolicy(options, availableCores?) 验证和
解决这些主机事实,不提供等待时使用180 000毫秒.
它不保留一个槽或启动一个沙盒。 两个公共运行时间外观
运行时间打开时验证并捕获策略 .
录取属于现有的全运行时间辅助工作跟踪器,而不是每个
租赁、组合或修订。 一个完整的池子等待一个槽打开或更早
截止时间和截止时间 原始援引期限。 。 。 .
入园等待期满产量 SandboxBusy,稳定代码 sandbox-busy,与
保险 capacity 财务报告和审定财务报表 waitedMs 事实; 提交的程序尚未运行 .
电话-死线过期 DeadlineExceeded,包括两者
最后期限相同。 取消电话 Cancelled。排队不会
重新启动执行超时 。 不授权自动重放 .
运行时间使用一个维持的Effect semaphore跨源修改和 中断的最后期限 API 。 排队工作在等待前注册. 取消会删除已队列的工作; 过期/ 取消的服务员不会在稍后开始 。 A 类 在实际支持解决之前,包括在 未承认的中止 。 等待不能维持所需的生命周期/修正门 释放或关闭.
SandboxBusy (a) 由现有的自有-误差解码器、安全运输系统接收,
主线和运算符语法;这是争论,而不是 Unknown 卫生
警报 执行工具保留其安全输入原因和可操作编码
消息不更改穆尔的错误合同。 与外国无关的失败依然存在
Unknown:不将诊断道具、无包装任意原因链分类,或
错误标记任意适配器 AbortError 作为呼叫者授权的取消.
带有承诺沙盒的效果主机 fromTypedSandbox,等待着
承诺在中断时和解。 混凝土沙盒和经纪人决定
如何停止支持工作。 主机提供工人装入器装订和
证明人监护权。 仅限工人 @fungi.computer/mycelium/workers 条目
出口 createCodemodeSandbox(loader, adapter?, options?),编码器适配器
可以在工人和手机上运行。 它禁用来宾网络访问,只绑定
提供操作, 保存输入失败并等待支持执行
在无法确认取消时。 仅在工人中导入此条目
主机; root 和其他节点条目不加载.
适配器转发请求已存在 timeoutMs 作为工人的预算
装入器 cpuMs 限制,保留任何更严格的装载器限制。 云层和单元格
执行本地 CPU 限制 。 当地工人的发展没有;仍在执行
运行。 当地主办方声明
{ localDevUnenforcedLimits: ["cpu"] } 作为第三个论点。 菌体指纹
CPU limits are not enforced in local dev 每跑一次,穿过沙盒
实例。 主机也可以宣布不强制 memory, (中文(简体) ), output 财务报告和审定财务报表 cancel
控件;每个都得到自己的一次性诊断。 备选办法报告事实;
它没有增加执行或客座政策。 取消仍在等待支持
和解,而且墙壁超时不能证明孤立终止.
这个
工人加载器自定义限制合同
和被钉住的单元格引用类型曝光 cpuMs 财务报告和审定财务报表 subRequests。他们会
不显示每次调用的内存或输出封顶, 或执行取消
操作。 适配器在没有发明的情况下保留所支持的加载器限制
字段。 全主机内存限制仍为主机配置;
他们不是一个客座宽放的沙盒设置。 犬科菌丝
申请权所有者检查其JSON结果预算 Sandbox
界面不运行所有者的结果验证.
发送前中止 。 执行时中止
支持解析后的权威: 适配器承诺拒绝键入
Cancelled { by: "caller" } 而不是解决一个迟到的成功。 保留主机
援引监护权,直到承诺解决;中止不能解除监护权
早点 Codemode没有立即取消API. 本地资格
通过真正的工人加载器检查此行为以及信任的
, CPU 转发和一次性本地通知。 这些是沙盒支票;
无法证明 Workflow 主机的取消路径 .
API 和实例
使用 生成 API 引用 财务报告和审定财务报表
出口根与根 /effect 暴露生命周期构造。 这个
沙盒子路径暴露了铁丝网、客人、故障和边界合同
适应器.
能力生命周期测试 覆盖源更新 并释放. 大门测试 运动拒绝. 沙盒边界测试 练习失败 预测。 这些软件包的证明不具有特定沙盒的隔离性 或部署.
贡献和许可证
在最近的容量,闸口或沙盒测试中加入回归. 从根出:
pnpm --dir packages/mycelium run test
pnpm --dir packages/mycelium run docs
麻省理工学院. 见 自由主义 财务报告和审定财务报表 第三层( P)。 。 。 .
MCP 磁共振
@fungi.computer/mycelium/mcp 出口 createMcp({ catalog, authenticate }), (中文(简体) ),
返回时 { handleRequest, close }挂载 handleRequest 在主机的MCP
路线。 每个 HTTP 请求,包括通知和
断开,在每次操作之前。 也回来
{ kind: "admitted", principal } 或者说 { kind: "refused", status: 401 | 403 }。 。 。 .
校长是主持人的"犬科演员":具有其角色的成员
(单位:千美元){ actor: { kind: "member", memberId }, role }),或代理或团队密钥
(单位:千美元){ actor: { kind: "agent", agentId } }, (中文(简体) ),
{ actor: { kind: "team-key", keyId } }) (中文(简体) ). 它的ID识别证书的
演员,从不记名.
对于安装的 App 主机, createMcpCatalog({ load, sandbox }) 适应普通
菌体能力来源. load(principal) 返回当前
{ instructions, sources, grants } 授权的本金。 又开始运行了
执行前和批准后。 每次援引必须重新开始
权威已读; 返回较旧的缓存快照无法建立当前
赠款。 赠款是明确的:一个省略的模块被拒绝。 供应的沙盒
仍然是主机的孤立执行器; 本条目不提供主机比对
倒计时。 此目录在进程内存中最多保存了8个打开的连接
,并在请求完成后释放每个获得的工具运行时间.
执行持久代理主机 McpCatalogProvider 相对于现有会话
拥有者. open 在解剖学上保留了连接线, resume
返回只打开主会话,并且 refresh 发送电流
赠款。 MCP服务器独立检查被存储的主机. 会议
call 必须携带 McpExecutionContext.access 进入其普通的Mycelium
执行,包括直接工具,而不持续要求回调.
MCP不强制确认每封信。 东道主的持久认可
由所有者决定是否申请、等待批准或被拒绝
目录中的赠款仍然是授权上限,而不是批准决定。 明确
操作级别确认标签仍然使用表征并刷新
接受后的权力。 缺少或拒绝明确确认
执行。 服务器支持 MCP 2025-11-25 可流式的HTTP 这样的批准
可以在未重放已完成的情况下暂停执行
操作。 核准申请中包含模块、操作和访问标签,
不属于证书数据或操作参数. close() 关闭运输流;
保留会话和连接的持续时间仍然与目录所有者有关.
运输过程损失后,恢复连接没有记录客户端
诱导能力与拒绝写作。 删除连接并初始化
一个新的谈判形式 再次引来.