Execd 用户数据 HTTP 契约
机器可读定义为 data-plane.yaml。用户通过 Ingress
访问 POST /direct/{environmentId}/invoke,请求为 action、args 和可选 requestId。
environmentId 按 URL 路径段编码,Ingress 只解码一次;例如名称中的 + 可编码为 %2B。
后续业务路径保持原始编码,解码后的 Environment ID 不允许控制字符或路径分隔符。
Ingress 校验 API Key 与归属,Relay 核对运行时绑定,再转发给 Execd 的 /invoke。
运行时协作与 Unix checkpoint 使用独立的 控制契约。
每种 action 在 OpenAPI 中有独立请求变体;x-adx-result-schema 指向对应响应。
响应正文不重复 action,因此 HTTP 200 的 InvokeResult 使用 anyOf,客户端按
已发送 action 解码。运行时业务响应不使用 Environment 生命周期 envelope。
表中列出主要名称;OpenAPI 同时列出实际支持的 process.run、file.info、
shell.init 等公共别名。旧 cmd_*、fs_*、bash_* 名称不作为公开契约。
| Action | args | 结果 |
|---|---|---|
process.exec |
cmd 或 command,可选 cwd、envs、timeout |
同步 stdout、stderr、exit_code、可选 exit_signal |
process.start |
command_id、command,可选 cwd、envs、want_stdin、timeout |
command identity、PID、状态;启动失败可返回失败记录 |
process.get |
command_id 或兼容 pid |
当前命令记录、输出与终止原因 |
process.poll |
命令身份、可选 wait_timeout |
等待期间退出或到期后的当前记录 |
process.wait |
命令身份、可选 timeout |
最终记录,或进程仍运行的 WAIT_TIMEOUT |
process.kill |
命令身份 | status、killed;不存在或已退出为 killed=false |
process.list |
{} |
processes 命令记录数组 |
process.capabilities |
{} |
protocol_version、capabilities |
process.send_stdin |
命令身份、文本 data、可选 eof |
error、error_code;需要启动时开启 stdin |
entrypoint.poll |
可选 wait_timeout |
继承入口的运行/退出/错误状态 |
file.read |
path、可选 binary |
data、error;二进制为十六进制字符串 |
file.write |
path、data、可选 binary |
文件名称、路径、类型、大小、error |
file.write_chunk |
path、十六进制 data、可选 offset |
bytes_written、offset、error;offset=0 创建或截断 |
file.read_chunk |
path、可选 offset、limit |
十六进制 data、bytes_read、eof、error |
file.list |
path、可选 depth |
entries、error;EntryInfo 含权限、大小、修改时间 |
file.search |
path,可选 pattern、exclude_patterns、depth、max_results、max_entries、timeout_ms |
按路径排序的 entries、scanned_entries、error;失败无部分结果 |
file.exists |
path |
exists |
file.remove |
path |
error;目录递归删除 |
file.rename |
old_path、new_path |
新路径的 EntryInfo 与 error |
file.make_dir |
path |
created、error;创建缺失的父目录,已存在时 created=false |
file.stat |
path |
EntryInfo 与 error |
shell.create |
session_id、可选 shell |
error;创建持久 PTY shell,默认 /bin/bash |
shell.run |
session_id、command、兼容 timeout |
提交结果 error;之后 poll 读取执行结果 |
shell.poll |
session_id、兼容 wait_timeout |
running/done/error;完成时有输出与 exit_code |
shell.close |
session_id |
error;关闭 shell,重复关闭成功 |
命令、cwd 与超时
构造器 cwd 的初始化发生在 Execd Ready 前,见 创建契约。 单次命令的 cwd 覆盖要求目录已存在,不会自动创建。
SDK commands.run 的默认/长等待路径和后台命令使用 process.start。
缺失 cwd 在这条路径产生 status=FAILED、error_code=SPAWN_FAILED、
exit_code=null 及 error_message;错误不会终止 Execd。短超时同步执行走
process.exec,其启动失败用 exit_code=-1 和 stderr 表示。两种原语的响应不能混用。
process.exec.timeout 是执行预算,省略无限等待,零立即到期。
process.start.timeout 省略或零不设置执行截止;正值到期终止进程组。
process.wait.timeout 只约束本次等待,不杀进程;到期仍返回 HTTP 200:
{"status":"running","error_code":"WAIT_TIMEOUT","error_message":"command wait timed out","error":null}
shell.run.timeout 是 SDK 发送的兼容参数,后端不执行该截止;SDK 约束自己的
poll 等待。shell.poll.wait_timeout 当前不使后端阻塞。cwd 和环境变量由 SDK
编码到 shell 命令中,持久 shell 会保留其状态;PTY 输出可能含回显与协议标记。
X-ADX-Processing-Timeout-Ms 是 Ingress 的整条 HTTP 处理截止,和命令执行/等待
预算分开;流式响应已开始时截止会结束流,不可能再返回新的 JSON 错误正文。
身份、重试与错误
file.search 在运行时匹配文件名或完整路径,区分大小写,支持 *、? 和字符类;
* 也匹配路径分隔符。排除模式只过滤结果,不剪枝目录遍历;不会跟随子目录符号链接。
根路径不存在或不是目录时返回空结果。路径最多 4096 UTF-8 字节;模式最多 1024 UTF-8
字节,排除模式最多 64 个。默认 depth=64、max_results=1000、max_entries=100000、
timeout_ms=10000;上限依次为 64、10000、1000000、30000,均须为正整数。
超出数量或响应大小限制返回 HTTP 429 RESOURCE_EXHAUSTED,搜索超时返回
HTTP 408 DEADLINE_EXCEEDED;错误响应的 entries 为空,不返回部分匹配结果。
请求身份优先级为 X-ADX-Request-ID、X-Request-Id、正文 requestId。写操作重试
应保留同一身份和完全相同的参数;不得将一个身份用于不同操作。有限的内存重放缓存
不提供跨 Execd 重启的持久幂等保证。需要恢复命令结果时使用稳定 command_id;
PID 可以在运行时被复用,不能作为长期恢复身份。
| 结果 | HTTP/业务表现 |
|---|---|
| 正常结果、命令非零退出、等待超时 | HTTP 200;读取 action 对应的状态及错误字段 |
| 操作参数或文件/shell 操作错误 | HTTP 400,错误正文保留 action 字段 |
| 稳定命令不存在 | HTTP 404、COMMAND_NOT_FOUND |
| 稳定命令结果过期 | HTTP 410、COMMAND_EXPIRED |
| 同 command_id 不同启动参数 | HTTP 409、COMMAND_CONFLICT |
| 命令注册表资源耗尽 | HTTP 429、RESOURCE_EXHAUSTED |
| 缺失能力 | HTTP 501、UNSUPPORTED_FEATURE |
| Ingress 恢复仍在等待 | HTTP 503、ENV_RESUMING;仅符合网关标记与 requestForwarded=false 才可安全重试 |
信号 9 或退出码 137 单独不能证明 OOM。Execd 不采集 OOM 计数;Runtime 的 OOM 原因由 sandboxd 传至 Environment failure,SDK 按 系统错误契约 分类。HTTP 502/503 也不能直接推断 Runtime OOM。
文件 invoke 的二进制编码是十六进制;/upload、/download 的流式正文是原始字节。
大文件优先使用流式传输。PTY 与命令 watch 是 WebSocket 协议,其连接与帧定义见 OpenAPI
扩展;它们不使用 invoke 的普通 JSON 请求/响应模型。