You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
flowchart TD
A[Session 带 vault_ids] --> B{部署 MITM 已开?}
B -->|否且存在活跃 env 凭证| F[启动失败]
B -->|是或无 env 凭证| C[按 vault_ids 加载活跃 env 凭证]
C --> D{跨 vault secret_name 冲突?}
D -->|是| E[先到先得]
D -->|否| G[合并 secret_name 到 placeholder]
E --> G
G --> H{撞平台保留名?}
H -->|创建阶段已拦; 合并时平台键保留| I[写入 startup_context.environment_variables]
H -->|否| I
I --> J[Sandbox 进程 getenv 只见占位符]
Loading
出站替换
sequenceDiagram
participant Sandbox
participant Relay as CCR CONNECT relay
participant MITM as OMA MITM egress
participant Upstream
Sandbox->>Relay: HTTPS via HTTPS_PROXY
Relay->>MITM: CONNECT + 解密 HTTP
MITM->>MITM: Environment networking 放行?
MITM->>MITM: 查 vault_ids 活跃 env 凭证
alt host 在 Credential Networking 内且 location 允许
MITM->>MITM: Open 信封,替换 header/body 中的占位符
alt Open 失败
MITM-->>Sandbox: 拒绝请求
else 成功
MITM->>Upstream: 带真密钥转发
end
else 未覆盖或 location 关闭
MITM->>Upstream: 占位符原文透传
end
Loading
替换范围与 CMA 一致:
只动 header 值 / body 中出现的占位符字符串(按 injection_location)。
目标
实现Vault 的
environment_variable能力:沙箱里只出现不透明占位符,真密钥只在出站 时瞬态替换;Agent / CLI / 日志看不到明文。参考:CMA Vaults(Environment variable / Rotate a credential / Credential lifecycle)。
相关现状:
docs/design/be/vault-runtime.md已完成信封加密与 MCP 路径的static_bearer/mcp_oauth注入;env 占位符与 credential中的networking、header/body 替换 未做。和 MCP 凭证不是一条路
static_bearer/mcp_oauth)environment_variable)mcp_server_urlsecret_name(环境变量名)secret_name→ Opaque PlaceholderAuthorization用途:CLI / SDK / 普通 HTTPS 调用把密钥原样放进请求头或请求体的场景(如
NOTION_API_KEY)。当前缺口
environment_variable(secret_name、secret_value信封、networking),没有injection_location,也没有持久化的 Opaque Placeholder。已确认决策
upstream_proxy_mitm时,挂了活跃 env 凭证的 Session/Code Session 启动失败(明确错误)injection_location**:header 与 body 都支持替换secret_value不改占位符;真值仍走既有信封加解密secret_name → placeholder写入startup_context.environment_variables(写入的是密文)secret_name:按vault_ids取第一个匹配的vault内的值secret_name不能跟平台保留name相同 → 否则创建失败,错误码400;合并 env 时平台键不会被 vault 覆盖networking/injection_location对后续出站热生效,沙箱无需重启allowed_hosts管能不能替换 与 Environment networking 管能不能连行为说明
创建environment_variables凭据(要点)
{ "display_name": "Notion API key", "auth": { "type": "environment_variable", "secret_name": "NOTION_API_KEY", "secret_value": "ntn_…", "networking": { "type": "limited", "allowed_hosts": ["api.notion.com"] }, "injection_location": { "header": true } } }secret_valuewrite-only;读 API 不返回。injection_location),永不返回明文密钥。injection_location更新按字段 merge;不能两个 location 都关;显式null拒绝(对齐 CMA:omit instead)。secret_name/ 类型创建后不可改;要改则 archive 再建。启动
flowchart TD A[Session 带 vault_ids] --> B{部署 MITM 已开?} B -->|否且存在活跃 env 凭证| F[启动失败] B -->|是或无 env 凭证| C[按 vault_ids 加载活跃 env 凭证] C --> D{跨 vault secret_name 冲突?} D -->|是| E[先到先得] D -->|否| G[合并 secret_name 到 placeholder] E --> G G --> H{撞平台保留名?} H -->|创建阶段已拦; 合并时平台键保留| I[写入 startup_context.environment_variables] H -->|否| I I --> J[Sandbox 进程 getenv 只见占位符]出站替换
sequenceDiagram participant Sandbox participant Relay as CCR CONNECT relay participant MITM as OMA MITM egress participant Upstream Sandbox->>Relay: HTTPS via HTTPS_PROXY Relay->>MITM: CONNECT + 解密 HTTP MITM->>MITM: Environment networking 放行? MITM->>MITM: 查 vault_ids 活跃 env 凭证 alt host 在 Credential Networking 内且 location 允许 MITM->>MITM: Open 信封,替换 header/body 中的占位符 alt Open 失败 MITM-->>Sandbox: 拒绝请求 else 成功 MITM->>Upstream: 带真密钥转发 end else 未覆盖或 location 关闭 MITM->>Upstream: 占位符原文透传 end替换范围与 CMA 一致:
injection_location)。networking不放宽 Environment 出网策略;两边都要允许,替换后的请求才能到达目标。与 MCP Open 失败语义的差别
MCP 注入:Open/refresh 失败可跳过该条、walk 下一条。
Env 替换:某请求已命中需替换的占位符且应对该凭证 Open 时,Open 失败 直接拒请求,不降级成「带着占位符当密钥用还返回 200」。
前端(Console)
对齐 CMA「Add credential → Environment variable」:
迁移与破坏性
environment_variable若缺少 placeholder /injection_location,不能再用于新 Session;需 archive 重建。非目标(本 issue)
mcp_oauth_validate、refresh_failed webhook 等既有「切片外」项建议实施顺序
docs/design/be/vault-runtime.md(及保留名列表);CONTEXT.md术语已起稿,实现时再校对。injection_location、placeholder 持久化、保留名校验、创建默认值、旧凭证挂载失败。startup_context灌占位符。验收
失败优先:
vault_ids含活跃 env 凭证 → Session/Code Session 启动失败,错误可理解secret_name为平台保留名 → 创建 400networking→ 400;两个 injection location 都关 → 400成功:
getenv(secret_name)为占位符,不是secret_valuesecret_value后,不重启沙箱,后续出站用新密钥;占位符字符串不变vault_ids顺序先到先得vault-runtime.md/CONTEXT.md与实现一致;仓库规定的 Go/前端质量门禁通过参考