跳转至

离线 WebAssembly 构件

inspect_wasm_artifact / inspect-wasm-artifact 使用调用方提供的 WABT 1.0.42 检查显式选定的本地 WASM 字节。不需要活跃的二进制目标。REA 不安装工具、不获取构件,也不执行 WASM。

open_binary 不是 WASM 检查路径。识别出的 WASM v1 头返回 target_unavailable,类别为 unsupported_target,约束为 wasm_requires_static_inspection;请在有效的 inspect_wasm_artifact 调用中包含所选路径。请使用该无目标工具,或配合下方工具链使用 rea inspect-wasm-artifact <path> --format json。请检查 binary_session 以了解已配置的功能可用性。识别出的头并非对整个模块的验证;缺少 WABT 会作为功能不可用单独报告,而非报告为缺少原生引擎支持。

识别出的 WASM 头会在根据 .hop 文件名进行自动数据库路由之前接受检查。因此,将模块重命名为 .hop 会保留静态检查诊断。显式数据库选择或原始/COM 格式选择会保留调用方请求的解释;普通的 .hop 数据库路由保持不变。

将 REA_WABT_BIN_DIRECTORY 设置为包含可执行文件 wasm-validate、wasm-objdump 和 wasm2wat 的绝对目录(在 Windows 上带 .exe)。缺少可执行文件、不支持的版本横幅和无法访问的工具会产生可操作的不可用诊断。功能发现报告已配置的可用性;执行时会验证工具文件和版本横幅。主机进程所有权机制和私有工作区控制也必须可用。真实工具配置已在 macOS arm64 上得到验证;其他主机需要自行验证。

配置失败不能证明所选 WASM 字节的任何情况。对于被拒绝的版本探测,details.diagnostics 会标识可执行文件、工具、预期版本和配置键;details.captured_output 保留其实际的 stdout 和 stderr,包括空横幅或警告。请修复报告中的目录、可执行文件访问权限或版本,而不是更改模块或重复未更改的调用。所有三个工具都必须在 stdout 上报告 1.0.42,且 stderr 为空。对于 CLI 调用,请在下次调用前设置环境变量。对于 MCP,请更改服务器的启动环境并重启/重新连接该服务器;在不同 shell 中导出变量不会更新正在运行的服务器。REA 从不安装工具或放宽版本准入来恢复。

REA_WABT_BIN_DIRECTORY=/absolute/wabt/bin rea inspect-wasm-artifact \
  /artifacts/module.wasm --glue_paths /artifacts/glue.js \
  --candidate_paths /artifacts/other/module.wasm --format json

等效的 MCP 输入:

{
  "name": "inspect_wasm_artifact",
  "arguments": {
    "path": "/artifacts/module.wasm",
    "glue_paths": ["/artifacts/glue.js"],
    "candidate_paths": ["/artifacts/other/module.wasm"]
  }
}

每个选定的常规文件都通过现有的稳定构件读取器读取;符号链接、正在变化的文件和超过 8 MiB 的文件一律按失败关闭处理。过大的输入返回 resource_constraint,资源为 file-size,其固定字节额度在 reported_limits.maximum_input_bytes 中;重试未更改的文件不会提高该额度。WASM 字节被复制到私有工作区中,作为只读的 module.wasm;其摘要会在每个工具运行前后重新检查。WABT 通过 wasm-validate --enable-all --ignore-custom-section-errors 进行验证,通过 wasm-objdump -h -x 报告段信息,并通过 wasm2wat --enable-all --ignore-custom-section-errors 进行解码。结果保留所选字节的 SHA-256 和大小、段负载范围、完整的头/详细信息输出(包括模块名前言)、精确的导入/导出 WAT 形式、解码后的 WAT 及其 UTF-8 SHA-256。生产者格式漂移以及无效或截断的模块均视为失败,验证诊断和部分 Evidence 会保留所选字节身份和工具来源。

当可选的自定义段无法解释时,核心验证仍然是权威依据。WABT 警告输出保留在 custom_section_warnings 中;debug_name_metadata 报告可选的名称段是不存在、已完全解释、无法解释还是未知。段归属未知的 WABT 自定义段警告会阻止完整的调试名称声明,即使已解码模块名称。它们并不证明名称段格式错误。精确的警告会保留其产生工具和文本。较旧的可移植报告保留其原始严格命令配置;缺失的元数据覆盖为 unknown,缺失的警告历史为 null。原始自定义段保留在解码后的 WAT 中。无法解释的名称段会使完整的调试名称覆盖情况保持未知。在后续元数据失败之前解码的模块名称仍可用于精确的 objdump 输出框架,包括包含换行符或 NUL 的名称;这些部分观察结果不构成完整的可选元数据。

工具配置文件保留上游发布/源身份、解析后的可执行文件路径、可执行文件摘要、精确横幅和参数。每个命令后都会重新检查可执行文件摘要。调用方提供的工具是受信任的程序;版本和摘要记录不是发布者认证,也不是操作系统沙箱。每个 WABT 版本/分析命令默认截止时间为 30,000 ms。设置可选的 MCP command_timeout_ms,或 CLI --command-timeout-ms <milliseconds>,为该调用选择一个不超过 2,147,483,647 ms(运行时定时器范围)的正整数。所选截止时间保留在 tool_profile.timeout_ms 中,并在提供时包含在 Evidence 参数中。它分别应用于每个命令,而非整个检查、文件准入或清理。MCP 客户端必须为所有命令、文件检查、清理和交付留出时间。提供方超时会报告实际选择的截止时间和这些恢复控制;仅增加客户端截止时间不会改变提供方预算。更改此每次调用设置无需重启服务器。在再次尝试之前,请先解决不完整的清理问题。

例如,rea inspect-wasm-artifact /artifacts/module.wasm --command-timeout-ms 60000 --format json 使用 60 秒的每命令截止时间;等效的 MCP 输入是 {"path":"/artifacts/module.wasm", "command_timeout_ms":60000,"detail":"summary"}。摘要交付会保留完整的 Evidence,但不会减少 WABT 分析工作量。

8 MiB 的输入配额和 32 MiB 的组合命令输出预算保持固定;增大 command_timeout_ms、宿主机内存或客户端截止时间都不会提高它们。不要为了适配而截断所需模块字节。仅在能回答问题的前提下选择另一个合适的完整工件,否则请报告该限制。

超出预算的检查输出将以 resource_constraint 失败;过大的 --version 探测仍会报告 unreadable_output。两个流共享同一预算,因此在一个流已填满预算之后才开始的流不会保留任何内容。捕获的输出最多保留每个流所保留的前 4,096 字节、每个流保留的字节数,以及退出码和信号。当预算截断了多字节字符时,保留文本可能以 U+FFFD 结尾。

这些摘录限定了返回的诊断文本的范围。 PR #2117 报告了预热(warm)Linux x64 WABT 1.0.42 CLI 工作流的已用时间、CPU 时间和峰值进程族内存(含 WABT 子进程);这些开销除测量噪声外没有变化。Agent token 用量和真正冷启动(cold)的工作流仍未测量。底层错误原因仍保留完整的捕获子进程快照,因此摘录并不能确定更低的内存保留或更快的分析。

所有命令都使用现有的自有进程取消与清理机制。工作区清理失败仍是以资源路径形式给出的显式错误。

WAT 是一种解码后的表示形式,既不是原始源代码,也不是运行时行为的证明。自定义注解可以保留载荷,但 WAT 无法确定原始二进制布局或往返字节同一性。原始字节同一性和 objdump 输出保留这种区别。导入/导出形式保留精确转义的 WAT 名称。未转义的 objdump 显示名称不会被解析为无歧义标识符。

可选的 JavaScript 胶水代码使用现有的 Babel 解析器和 AST 遍历。它会保留带源代码坐标的 .wasm 字符串字面量和字面量模板、所选胶水代码的字节同一性以及解析器状态。相对文件系统匹配会变成本地路径候选。URL、查询/片段变体和未匹配路径会保留基名候选(包括多个匹配),或保持未解析。这些是字面量关联,并非已证明的数据流、运行时加载或 URL 到文件的同一性。计算得到的字符串、别名和动态导入需要进一步证据。候选是调用者选择的文件;它们的同一性并不意味着验证通过。

CLI 和 MCP 都使用相同的类型化端口和应用服务。MCP 发布 SDK 兼容模式,并记录供 get_evidence_bundle 回读的 Evidence。有关真实工具验证,请参见 WABT 溯源 和 测试。

比较核心模块接口

检查会在保留精确 WAT 导入/导出形式的同时,添加生产者拥有的类型化 interface 事实。函数/标签签名解析类型索引;表/内存限制、内存页大小和全局值类型/可变性保持显式。未被接纳的类型(包括 GC 引用签名)保留 null 签名和问题。精确解码的名称保留转义、空名称、BOM 和标点。内部 WAT 标签是显示标识符:在类型或函数/表/内存/全局/标签索引空间中重复的标签是有歧义的。对它的命名引用保留 null 签名或索引,并带显式问题;数值引用和唯一命名的定义保留各自的同一性。比较将未解析的签名视为未知,包括在自身比较中。清单完整性描述观察到的导入/导出条目,独立于类型解析。在未检查类型接口的历史 Evidence 中,此方面不存在。

compare_wasm_interfaces 接受两条完整的 inspect_wasm_artifact Evidence 记录,或当前 MCP 会话中精确的保留引用,并要求 scope: "imports" | "exports" | "both"。它不读取任何文件,也无需活动的 WABT 工具链。CLI 在一个 JSON 文档中使用可移植的内联 Evidence:

rea compare-wasm-interfaces comparison-input.json --json
{
  "left": { "kind": "retained-evidence", "evidence_id": "ev_<left-digest>" },
  "right": { "kind": "retained-evidence", "evidence_id": "ev_<right-digest>" },
  "scope": "both"
}

上述引用仅限 MCP;请在 CLI 输入中放入完整的 Evidence 对象。比较前,将摘要交付解析为其保留的完整父记录。结果会保留两个输入 Evidence ID、工件路径/摘要/长度以及每个选中的出现项。唯一名称被添加、移除、更改或保持不变;重复名称和不支持的签名视为未知。不完整或历史的清单永远不能确定不存在。导入按模块/名称分组,导出按名称分组,因此种类变化可见。输出排序是确定性的。

静态类型相等并不确定运行时兼容性、ABI 兼容性或链接成功。比较覆盖核心模块;WebAssembly 组件和规范 ABI 关系属于它们各自的独立检查工作流。

构建后,运行 REA_WABT_BIN_DIRECTORY=/absolute/wabt/bin node scripts/verify-wasm-interface-comparison.mjs 以通过编译后的 CLI 和 stdio MCP 进行原始模块比较。它使用自有固定样本和 WABT 1.0.42;不会实例化或执行任何 WASM 模块。

胶水代码解析接受 Node 支持的 WASM 源阶段(source-phase)导入,包括 import source module from "./module.wasm" 和 await import.source("./module.wasm")。它们的字符串字面量保留与普通导入字面量相同的坐标和本地候选关联;这些是静态源代码观察,不涉及模块实例化或执行。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 rea2/rea