@earendil-works/pi-env (英语)
远程执行环境 持久性:一个代理工具运行在另一台机器上,通常运行在SSH之上, 而耐用工人,其储存和证书则留在当地.
pi-env(单位:千美元)daemon/:一个在远程机器上运行的小Rust程序. 它讲的是关于Stdin和 静态( t)文档/protocol.md),并在那里执行文件操作和命令.RemoteExecutionEnv: 持久ExecutionEnv{\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}他通过一个Connection。结果匹配NodeExecutionEnv在远程机器上运行; 只有错误消息可能不同 (单位:千美元)文件/语义.md) (中文(简体) ).
import { acceptHostKey, connectSsh, RemoteExecutionEnv, scanHostKey, sshConnection } from "@earendil-works/pi-env";
const target = { host: "gpu-box", knownHostsFile: "/data/ssh/known_hosts", hostKeyAlias: "pi-env-gpu" };
// Once: show the host's key fingerprint to the owner, who compares it out of band and accepts it.
const { lines, fingerprints } = await scanHostKey(target);
await acceptHostKey(target, lines);
// Detects the remote system, deploys the daemon if missing (named by its SHA-256 and verified before every start),
// and returns a connection that starts it over ssh.
const { connection } = await connectSsh(target);
const env = new RemoteExecutionEnv({ connection, id: "pi-env:gpu", cwd: "/home/me/project" });
// Or lazily: nothing happens until the first operation, which detects, deploys and connects. A failure (no network,
// untrusted host key) is that operation's error, and the next operation tries again.
const lazy = sshConnection(target);
const lazyEnv = new RemoteExecutionEnv({ connection: lazy.connection, id: "pi-env:gpu", cwd: "/home/me/project" });
软件包为每个支持的远程系统发送守护进程 bin/。 。 。 . ssh 运行与 BatchMode,严格的主机键
以固定的化名检查应用程序自己的已知主机文件, 没有任何形式的转发, 没有共享
连接或配置命令,而不转发本地语言。 在Windows上,检测和部署开始
通过PowerShell,守护进程从服务器的默认 shell(cmd.exe 或 PowerShell)开始.
env.listFiles(path, options, context) 列出守护进程目录下方的树, 如 fd --hidden --exclude .git
在不遵循符号链接的情况下进行:文件、目录和链接作为相对 / 路径, 跳过 git 忽略的内容
以工作树为界 maxEntries, (中文(简体) ), maxBytes 财务报告和审定财务报表 timeoutMs 带有 truncated 旗下,然后终止
内容。 这是可选的 ExecutionEnv.listFiles一个守护进程在报告前发布 not_supported
(单位:千美元)hello.features 缺少 listFiles),召唤者倒回自己的行走. 地方会议,
LocalExecutionEnv 实值 NodeExecutionEnv 加号 listFiles 通过同一机器上的守护进程:
const local = new Connection({ command: [localDaemon()] }); // owned by the caller; close() it at shutdown
const env = new LocalExecutionEnv({ cwd: "/home/me/project", connection: local });
const listing = await env.listFiles(".", { exclude: ["node_modules"] }, context);
// { ok: true, value: { entries: [{ path: "src", kind: "directory" }, { path: "src/a.ts", kind: "file" }], truncated } }
nodePlatform(await connection.info()) 给以节点名称中的远程系统( Q)win32, (中文(简体) ), darwin, (中文(简体) ), x64, (中文(简体) ), arm64, (中文(简体) ),
作为 process.platform 财务报告和审定财务报表 process.arch 拼出来.
openTerminal(connection, options) 运行一个程序,默认为用户的登录 shell, 默认为默认值, 默认为默认值
守护进程:用于交互式终端的原始输出,输入,再大小及其退出代码. localDaemon() 是此守护进程
机器,用于没有SSH的终端(new Connection({ command: [localDaemon()] })) (中文(简体) ). 不支持终端
视窗还没有.
openProcess(connection, options) 运行一个带有平通管线的程序,用于说 stdin 协议的程序和
stdout, 例如 MCP 服务器 : write() 财务报告和审定财务报表 closeStdin() 用于输入,原始 stdout 和 stderr 字节通过
onStdout 财务报告和审定财务报表 onStderr, (中文(简体) ), close() 杀死它的流程组,以及 exited 为它退出代码。 当程序退出时,
它开始于它的流程组 也被杀死,所以一个包装器,如 npx 留下什么也没有运行。 没什么
与终端不同,它能反射、翻译或合并;它在每一个支持的系统上工作。 一个守护进程在失败前释放
打开 not_supported。 。 。 . argv 运行为 exec argv 命令确实: 在 Windows 上, 批量文件, 如 npx.cmd 为:
被拒绝,因为节点拒绝 他们没有壳, 所以呼叫者开始他们通过 cmd.exe。 。 。 .
const server = await openProcess(connection, {
cwd: "/home/me/project",
argv: ["npx", "-y", "@modelcontextprotocol/server-filesystem", "."],
onStdout: (bytes) => parser.push(bytes),
});
server.write(`${JSON.stringify(initialize)}\n`);
所支持的远程系统:Linux,macOS,Android (Termux)和Windows,在x86-64和arm64上. 在 Windows 上,字符串命令
运行在 Git Bash 作为 NodeExecutionEnv 运行它们在那里; argv 命令直接运行 .
发展
npm run build:daemon 以货物构建守护进程; 测试交谈到 daemon/target/debug/pi-env 过一管,或去
二进制名称 PI_ENV_DAEMON (CI测试释放 建立这种方式)。 他们经营耐用套房
反对 RemoteExecutionEnv 比较随机操作序列和持久工具 NodeExecutionEnv 打开
同样的机器. test/ssh-external.test.ts 在 SSH 服务器上运行套件 PI_ENV_SSH_HOST 已经设定.