HTTP API:会话、启动配置与其他
基于 main@306d253 的文档在 GitHub 上查看编辑此页
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/sessions | 会话列表 SessionInfo[],按 lastActiveAt 倒序 |
| POST | /api/sessions | 创建会话,201 返回 SessionInfo |
| GET | /api/sessions/{id} | 单个会话;不存在 404 |
| DELETE | /api/sessions/{id} | 关闭会话(SIGHUP → SIGKILL),204 |
| DELETE | /api/sessions/{id}?remove=1 | 移除已退出会话,204;仍在运行 409 |
| GET | /api/sessions/{id}/buffer | 下载完整原始缓冲(application/octet-stream) |
| POST | /api/sessions/{id}/upload | 上传文件,见下文 |
| POST | /api/sessions/{id}/artifacts | 确保会话临时文件夹存在,200 {path},见下文 |
创建请求有两种互斥形式:
// 显式自定义命令{ "cwd": "/home/u/proj", "cmd": ["bash", "-lc", "make dev"], "name": "可选" }// 已保存的启动配置{ "cwd": "/home/u/proj", "configId": "k3m9q2x7", "name": "可选" }自定义命令必须包含非空可执行程序,cmd 是完整 argv,不经 shell 展开;不再接收 preset 或单独的预设 args。可附加 workspace: {repositoryId, worktreeId}:省略 cwd 时使用工作树根目录,提供时必须位于该工作树内。
显式命令可附加可选的 env: {"NAME": "value"}:只为该会话在服务环境之上追加或覆盖列出的变量。
- 名称须匹配
[A-Za-z_][A-Za-z0-9_]*,值不含 NUL,WEBMUX_SESSION_ID保留。 - 服务端不自行复制调用方的环境,
env也不出现在SessionInfo中。 - Linux/macOS 的
webmux run会把调用方环境(去掉终端身份等服务端自有变量)放进该字段发送。
configId 形式按已保存配置的完整 argv 与环境变量启动:
cmd须为空数组或省略,env须省略或为{},否则 400。- 空字符串
configId400,未知 ID 404,启动配置存储不可用 503。这些检查都在目录与 Git 操作之前完成。 - 之后修改或删除该配置不影响已启动会话的命令与环境。会话信息保留
configId,首页按该配置当前保存的预览设置渲染,配置删除后回退浏览器全局设置。
启用混合模式(hybrid: true)的配置创建混合会话,可附加 startSide: "tui" | "acp"(缺省 tui):
tui:在 PTY 中运行档案生成的终端命令(OpenCode 注入--standalone)。acp:不启动终端,而是启动 ACP 进程并依次调用initialize与session/new。
混合会话的失败状态码(普通会话不受这些检查影响):
- 对普通配置或自定义命令提供
startSide、或取值无效:400。 - 记录文件
hybrid-sessions.json不可用:503,错误信息含文件路径。 - 记录已达 200 条:409
{error, reason: "limit"}。 - agent 启动或建会话失败:502,错误信息附 agent 标准错误的末尾,仅返回给请求方,不写日志。
上传:multipart/form-data,恰好一个文件字段 file。成功返回 201 {"path": "<服务器绝对路径>"}。
- 文件位于会话临时文件夹的
uploads/中,同名时追加(2)等序号而不覆盖。 - 单文件上限 100 MiB(超限 413),读期限 5 分钟(超时 408)。
- 无效请求 400,会话不存在 404,会话已退出 409,临时文件夹不可用 503。
会话临时文件夹:POST /api/sessions/{id}/artifacts 幂等地创建并返回 $TMPDIR/webmux-artifacts-<uid>-<实例摘要>/<会话ID>(0700)。
- 会话存在(含已退出)时 200,不存在 404。
- 路径已被符号链接、他人目录或可被其他用户访问的目录占用时 503,且不修改该条目。
- 普通会话移除后删除文件夹;混合会话在
DELETE /api/hybrid-sessions/{id}成功后删除;服务启动清扫不属于可恢复混合会话的文件夹。 - 代码视图以
GET /api/sessions/{id}/code/context?root=artifacts浏览它(rootKind: "artifacts",无 Diff)。root缺省或为workspace时是工作区,其他值 400,文件夹尚未创建时 404。
interface SessionInfo { id: string; generation: string; // 本次运行的代际,16 位十六进制;输出 offset 与提交都绑定它。混合会话在聊天端(没有终端运行)时为空字符串 title: string; cwd: string; cmd: string[]; status: "running" | "waiting" | "idle" | "exited"; // waiting 表示提示符、终端读取或 attention;计时休眠不是 waiting exitCode: number | null; preview: string; // 屏幕底部最多 100 条非空行,以 \n 分隔 createdAt: string; // RFC 3339 lastActiveAt: string; cols: number; rows: number; clients: number; // 当前附着的连接数 workspace: { repositoryId: string; worktreeId: string; worktreePath: string; } | null; // 程序主动报告的“需要介入”,存在时 status 为 "waiting";不含任何终端正文。 attention: { kind: "question" | "permission" | "done" | "error" | "notify" | "bell"; source: "agent" | "terminal"; // 结构化事件 / 普通通知或响铃 since: string; // RFC 3339,种类变化时更新 } | null; // 程序通过 OSC 7 报告的目录;null 表示未报告或进程已退出。 // 只作导航线索,不改变 cwd、workspace、读取边界或命令执行环境。 reportedCwd: { path: string; // 已解码的绝对路径 host: string; // 报告中的主机名,可能为空 remote: boolean; // 非本机(例如 SSH 远端);不得用于本机文件定位 since: string; // RFC 3339,路径或主机变化时更新 } | null; // 创建时使用的已保存启动配置;临时命令省略该字段。 configId?: string; // 混合会话(终端 TUI ↔ 聊天视图)的所在端;普通会话省略该字段。 hybrid?: { side: "tui" | "acp" | "switching"; phase?: string; // 切换中的步骤,切换之外省略 dormant: boolean; // 聊天端的 agent 进程已休眠 state: "active" | "closed" | "interrupted"; agent: string; agentSessionId: string | null; // agent 自己的会话 ID,未知时为 null };}| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/health | {ok: true, sessions: n} |
| GET | /api/config | {defaultCwd, defaultShell, hostname, workspace: {gitAvailable, registryAvailable, gitError, registryError}, tunnel},不含 token |
| GET | /api/fs/dirs?prefix= | 匹配前缀的全部子目录(含符号链接目录),普通目录优先,按名称排序 |
| POST | /api/fs/mkdir | {path},204 |
tunnel 是只读的运行时隧道状态:{enabled, state, named, hostname, publicUrl?}。
state:off、starting、ready或failed。enabled:仅在starting/ready时为true,与公网隧道设置的启用期望不同。named与hostname:动态读取当前有效设置(Web 覆盖优先,否则使用配置文件),关闭时也保留模式信息;Named Tunnel 缺少hostname时为空字符串。publicUrl:仅在ready时出现且不含 token。- 响应不包含 Cloudflare 凭据。
defaultShell 为只读的启动文件 shell:"bash"、"zsh",或空字符串表示不自动包装;由服务进程 $SHELL 的 basename 决定,未设置时为 "bash"。
启动配置保存在服务端 <state_dir>/launch-configs.json,在所有已认证设备间共享。只提供用户自定义的启动配置,不再提供内置预设或 /api/presets 路由;新安装首次启动时服务端在该文件写入常见 agent 的普通配置,经同一接口列出、修改和删除。
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/launch-configs | 摘要数组(按创建顺序):{id, name, icon?, cmd, envNames, preview, createdAt, updatedAt} |
| GET | /api/launch-configs/{id} | 完整配置:{id, name, icon?, cmd, env, preview, createdAt, updatedAt} |
| POST | /api/launch-configs | {name, icon?, cmd, env?, preview?},201 返回完整配置 |
| PUT | /api/launch-configs/{id} | {name, icon?, cmd, env?, preview?} 整体替换,省略的 env 与 preview 被清空,200 返回完整配置 |
| DELETE | /api/launch-configs/{id} | 204 |
icon 为可选的本地图标 ID:terminal、claudecode、codex、geminicli、cursor、githubcopilot、
opencode、qwen、kimi、codebuddy 或 pi。
- 省略或空字符串表示自动匹配;更新时同样恢复自动匹配。
- 不接受 URL 或 SVG 内容。
- 旧文件省略此字段仍可读取:浏览器按可识别的直接命令或标准 Bash/Zsh 启动文件包装匹配图标,未匹配时显示通用终端。
terminal可显式覆盖自动匹配。
preview 为 null 或省略时沿用服务端同步的全局预览设置;否则为 {lines, skip},lines 为 1–50 的整数、skip 为 0–50 的整数。会话卡片按创建时记录的 configId 读取该配置的当前预览值,配置被删除或不可用时回退全局设置。
列表只含环境变量名(字典序),值只由单条读取与创建/更新响应返回。限制:
- 名称去首尾空白后 1–64 个字符且唯一(重名 409)。
cmd1–128 项、首项非空、单项不超过 8 KiB。env最多 64 项,名称规则与会话env相同,值不超过 8 KiB。- 最多 100 条。
错误状态码:
- 校验失败 400,未知 ID 404,落盘失败 500(内存回滚)。
- 文件损坏、目录不可读写或状态目录已被另一实例占用:503,错误信息包含原因与文件路径。
launch-configs.json 当前版本为 2,新增 preview 字段。本次升级仅接受版本 2;版本 1 文件保留原样,启动配置 API 返回 503。升级前备份旧配置,通过支持 v1 的旧版本保存为 v2,或备份后移走旧文件并在新版重新创建;详见 部署升级说明。