提供商限制
提供方约束¶
编排层记录意图和状态,而无需知道哪个提供方运行线程。提供方协议、账户所有权、权限和能力属于 适配器边界。应在此处进行规范化,而不是在编排层和客户端中散落提供方检查。
驱动类型标识一种集成;实例标识一份配置和账户生命周期。按实例路由工作,因此使用同一驱动类型的两个账户不会共享可变的 会话或目录状态。对于新的驱动,请从添加提供方开始。
进程与账户隔离¶
opencode 驱动会探测已安装版本,并运行 1.x 或 2.x 运行时。OpenCode 的 MCP
注册以目录为作用域,而 T3 的 MCP 连接以线程为作用域,因此同一目录中的线程不得共享同一个 T3 MCP 条目。
- 1.x 为每个线程使用一个由 T3 管理的聊天服务器,因此线程之间无法替换彼此的连接。 目录与文本生成工作可以共享 实例持有的辅助程序,该辅助程序在空闲一段时间后关闭。请参阅 1.x 适配器。
- 2.x 为每个实例提供一个服务器,由该服务器服务所有目录。每个线程
注册自己的
t3-code-<thread>MCP 条目,会话权限规则会拒绝所有其他线程的条目。请参阅 2.x 适配器。
外部 OpenCode 服务器仍然归外部所有,可能需要外部重启才能获取配置更改。OpenCode 将“always”批准授权存储在整个项目中。自动
全访问回复使用 once,因此它们不能扩大共享服务器上受监督线程的权限。
在 2.x 上,会话级授权同样回复 once,并成为 T3 在该会话上的自身规则。
Pi 以 RPC 模式运行用户自己的 pi 安装,并负责原生扩展、包与项目信任发现。
T3 仅注入其命名空间化的 MCP 桥接,因此 Pi 会话的行为与在 Pi TUI 中一致。Pi 会话文件支持原生恢复、回滚以及同实例线程分叉。
分叉在目标目录中使用 Pi 的 CLI,因为 RPC 会话切换会保留源会话的 cwd。提供方切换仍然使用可移植的交接摘要。
请参阅适配器。
Antigravity 在跨环境共享已安装可执行文件的同时,按实例隔离账户配置文件。它强制采用基于文件的凭据存储,因为否则原生 macOS 钥匙串条目会
跨实例共享。启动环境会移除环境中的 Google 凭据,因此实例无法静默使用另一个账户或计费项目。代理还会
在该配置文件下解析其用户级技能目录,从而配置文件会将这两个目录链接回用户真实的 ~/.gemini;其中的 MCP 服务器、钩子和规则不会进入配置文件。
请参阅配置文件隔离。
Antigravity 安装程序的生命周期超过 客户端连接和提供方实例重建。发布版本不可变,并有一个原子指针为新进程选择版本。运行中的进程持有其版本的租约。更新 和移除必须尊重这些租约,而不能在运行中的代理下替换可执行文件。
设置不得作为健康检查的副作用发生¶
打开提供方会话可能会启动 MCP 服务器、运行钩子或打开登录浏览器。 因此,Grok 探针会避免身份验证和 会话创建。Antigravity 同样只为显式设置或模型刷新保留经过身份验证的目录会话;后台检查仅使用初始化。
Antigravity 登录隶属于发起操作的 T3 认证会话。客户端将返回 URL 带回环境,因为提供方的回环监听器可能位于另一台机器上。仅转发归属待处理流程的回调; 一次成功的回调 HTTP 请求并不能证明提供方身份验证已完成。原生进程负责令牌交换和存储。
远程环境的托管 ChatGPT 登录可以在本地主设备上完成。 主设备交接使用临时凭据存储,以及目标环境的 ID。在转移已颁发的客户端注册信息和令牌之前,它会先交换并验证代码。 只有目标端持久化并刷新该会话;保留主设备的刷新会话会与刷新令牌轮换产生竞争。如果没有本地 主设备,客户端将使用远程回调完成流程。
Antigravity 登出会在清除账户元数据之前,关闭新进程的准入并停止现有进程。 否则,辅助程序或恢复的会话可能会保留旧账户。缓存的模型列表不能确立当前访问权限,权威的空目录必须清除旧列表。
Antigravity 文本生成辅助程序会拒绝工具请求,但原生钩子和 MCP 配置可以在提示之前运行。 它们会在启动前拒绝带有此类配置的配置文件。提示指令和工具拒绝并不会创建原生沙箱。 请参阅辅助程序约束。
提供方更新仅通过其所属安装器运行¶
只有在解析后的可执行文件路径能够证明包管理器拥有该安装时,包管理器才会运行。Homebrew 和 npm 通过真实路径(跟随符号链接)来证明:即 brew --prefix 下的带版本 keg 或 cask,或 <prefix>/lib/node_modules/<pkg>/(Windows:node_modules 旁边的 shim)。原生安装器布局以及 pnpm、Bun、Yarn 和 Vite+ 的全局目录可能匹配解析后的路径或其真实目标,因为这些安装器会在那里放置真实文件或它们自己的符号链接。Volta 通过其 volta-shim 链接以及包的 image 目录来证明。当没有任何证据时,提供方自己的更新程序(claude update、codex update、opencode upgrade、pi update --self、grok update)就会被调用,因为每个更新程序都能自行检测其安装器;运行器的版本检查会捕获那些退出码为 0 但未执行更新的更新程序。Mise 会首先被检查,因为 mise x 包装器可能位于原生安装器的路径上,并且 MISE_DATA_DIR 可以将安装放在任何位置,所以只要 mise 在 PATH 上,就会询问 mise which。每个驱动程序指定其固定的 mise 工具;mise 必须解析该二进制文件,并将其列在请求为 latest 的该工具的活动安装中,然后执行 mise upgrade <tool>。T3 Code 会持续启动配置的路径,因此该路径必须是 shim,或位于工具的 latest 链接下,而升级会将该链接重新指向新的版本:版本目录(包括 mise activate 添加到 PATH 的目录)会一直运行旧二进制,直到 mise 将其清除。mise 涉及的所有其他内容(固定版本路径、固定工具、包装器、OpenCode 1.x,其 mise 工具跨入 2.x)仍仅限手动处理,因此 T3 Code 永远不会编辑 mise 配置。版本由 mise latest 提供,因为 minimum_release_age 等设置可能使 mise 落后于 npm。如果 Grok cask 的 Homebrew prefix 无法验证,则同样仅限手动更新:grok update 会安装第二份副本。npm 更新会固定 --prefix,因为 PATH 上的 npm 可能属于与拥有提供方的 Node 不同的另一个 Node。Homebrew 会与 brew info 进行比较,因为 cask 比 npm 落后数小时;原生安装与 npm 处于同一版本轨道,因此 registry 对它们仍然具有权威性。通过 Chocolatey 安装的 Claude 仍仅限手动更新:其包目录仅管理员可写,而通过 shim 执行 claude update 会在其他位置安装原生副本。最新版本来自 choco search,卡片上会显示 choco upgrade claude-code 但不会运行它。
参见 resolver。
所有权按实例缓存,并在更新运行前立即重新读取。runner 会在 advisory 之后锁键发生变化时拒绝执行,并且仅当刷新后的提供方仍然安装且版本可读、为最新时,才报告成功。
协议陷阱¶
Codex 异步问题以通知形式到达,并通过新的用户消息来回答。并没有需要发送的挂起 RPC 响应。适配器 将它们持久化为 user_input_request turn 项以及带有 responseCapability: { type: "message" } 的运行时请求。它们的执行节点不会阻塞运行。Web、桌面端和移动端使用它们正常的提问面板,请求在轮次结束、提供方退出或服务器重启后仍保持挂起状态。
runtime-request.respond 会读取持久化的请求和问题项,验证必需的答案,并在一个事务中提交解析结果和一条用户消息。重复执行同一命令会返回其回执,而不会重复发布答案。常规消息路径会启动或恢复运行,在活动工作后面排队,或在适配器支持时进行转向。阻塞式问题会保留提供方的实时响应路径。不要仅仅因为请求不在最近历史窗口内,就推断它已经消失。
原生 /goal 状态归提供方所有,并在提供方线程上进行镜像。Codex 会在上一轮完成后的几毫秒内自行启动下一轮 goal 轮次,因此适配器会保持运行打开,并将该轮次添加进去。因此,一次运行可以拥有多个原生轮次。未启动 Codex 轮次的 /goal 命令会落定在一个没有原生引用的提供方轮次上,原生回滚不得将其计入。Claude 的 SDK 模式不会发出 goal 事件;其适配器会从合成命令输出和 transcript 中的 Stop hook 反馈中读取 goal 状态。
能力必须描述提供方实际能做什么。Antigravity 可以捕获工作区检查点,但无法回滚其对话。因此,检查点边界会在触及文件之前拒绝回滚。原生权限和问题选项 ID 也必须能够在规范化后保持不变;显示标签不一定就是有效的回复。
附件与存储历史¶
附件存放在项目工作区之外。附件边界 会为线程验证并认领上传文件;适配器会为这些环境本地文件选择原生输入格式。prompt 中的路径并不授予文件系统访问权限。应保持提供方的沙箱和审批规则有效;将上传文件复制到项目中以绕过这些规则,会改变这一边界。
文件附件引入了重放兼容性限制。仅支持图像内容的客户端无法解码包含文件的消息,而仅支持图像内容的服务器在重放此类事件时,可能导致整个环境的启动失败。滚动发布和降级必须同时考虑持久化历史以及当前客户端的支持能力。
提供方诊断¶
原生事件日志保留生命周期事件、响应和失败信息。在适配器复制或脱敏载荷之前,会先过滤 Token 增量和重复的原始帧。该过滤器同时接受旧版原生事件和 v2 协议信封;解码失败仍可通过诊断帧保持可见。
日志载荷的编码预算为 64 KiB。大型或深度嵌套的载荷会变为结构摘要,保留路由标识符、方法、状态和错误字段。遍历在脱敏和序列化之前受到限制,因此记录大型响应不需要多份完整副本。这些限制适用于诊断;提供方事件处理保持不变。
Codex 在需要线程的身份和更新时间时,仅通过元数据读取即可恢复。其初始化能力选择退出 turn/diff/updated:T3 从检查点派生差异。当较旧的提供方仍发送这些通知时,日志记录器会在遍历之前将其过滤。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 t3/t3code