进阶 omnigent.ai 2026-10-14 06:47:13 · 25 阅读

第9章 Omnigent 第9章:结对编程

结对编程

Omnigent 支持多用户协作。当你的服务器对团队可达时(参见 Shared Server),你可以通过链接分享一个实时会话,让队友共同驾驶你的 Omnigent,或者 fork 一个对话让别人独立继续。同一个会话可以同时在终端、Web UI 和手机上使用。

Co-drive(共同驾驶)

队友可以附着到你正在运行的会话上,他们发送的消息会在你的机器上执行。非常适合结对编程,或者在调查过程中把"键盘"交给某个领域专家。

在 Web UI 中,点击 Share,把链接发给队友。

Share 提供两种权限级别:Read(只读,队友只能观看会话流)或 Edit(队友可以共同驾驶、发送消息)。更改会话的 agent——包括它的 MCP server 或 agent bundle 本身——始终只有 owner 才能操作,参见 Only the owner can change the agent。

在终端运行:

omni attach

队友可以实时看到一切:消息、工具调用和文件变更都会流式推送到每个连接的查看者。

管理员可以在服务器层面限制或禁用分享(只读或完全关闭)、关闭公开的"任何有链接的人可访问",或让新会话默认公开只读。如果 Share 按钮不见了、被限制为只读,或者新会话默认就是公开的,那就是服务器的分享策略——参见 Session sharing。

只读分享不会暴露工作区文件

Read(仅查看)分享只让队友看到对话内容——消息、工具调用和流式更新——但看不到会话的工作区文件。默认情况下,仅查看的观众看不到 Files、Changes 和 GitHub diff 界面,因为工作区里通常有 .env 文件和密钥之类的敏感信息。Edit 协作者始终拥有工作区访问权。

如果想让仅查看的观众也能浏览文件,打开 Share 对话框,开启 Workspace files("让有查看权限的人浏览此会话的文件")。这个开关只对磁盘上存在工作区的会话出现,且只有会话 owner 才能更改。默认关闭;再次关闭会恢复为仅对话访问。

即使开启这个选项,也绝不会扩大主机文件系统上绝对路径的浏览范围——无论该设置如何,这始终只有 owner 可以做。

共同驾驶等于授予主机上的代码执行权限

只把 Edit 权限分享给你信任其能在你的机器上运行任意代码的人。会话在其所在的主机上以非沙箱进程运行命令,所以拥有 Edit 权限的队友可以驱动 agent,并获得与你相同的文件系统、凭证和网络访问权。

想要更安全地协作,可以只分享只读权限,或者把会话托管在 cloud sandbox host 上,让 agent 在隔离的远程容器中运行,而不是在你的个人机器上。即使主机可信,如果想限制 agent 能触碰的范围,可以应用 OS sandbox policy。

各权限级别能做什么

Edit 协作者所做的一切都通过 agent 进行——发消息、对工作区相对路径的文件编辑、回答会话的待处理 prompt——因此会经过和 owner 自己操作相同的策略和审批关卡。只有少数几个操作完全绕过 agent,仅会话 owner 可以执行:

操作 Read Edit Owner 观看会话流 ✓ ✓ ✓ 发送消息并驱动 agent ✓ ✓ 浏览和编辑工作区内的文件* ✓ ✓ 查看并回答待处理 prompt(审批、提问) ✓ ✓ 浏览主机文件系统的绝对路径 ✓ 在会话环境中运行原始 shell 命令 ✓

* 默认关闭;owner 可以用上文提到的 Workspace files 开关开启。

"待处理 prompt"涵盖 agent 暂停等待的所有情况:策略审批关卡、harness 权限确认、agent 向你提出的问题、计划审查,以及 MCP 表单。

环境 shell(POST /v1/sessions/{session_id}/resources/environments/{environment_id}/shell)仅限 owner 使用(服务器管理员也可以)。由于命令没有路径可供检查,不存在可以安全开放给协作者的"工作区内"形式——任何命令都会直接到达 owner 的机器,且不经过任何策略或审批关卡。它的门槛与浏览绝对路径相同。拥有 Edit 权限的协作者调用该端点会收到 403;他们仍然可以让 agent 运行命令,而这些命令会受会话策略约束。

只要能驱动 agent(即 Edit 权限),任何人都可以回答待处理 prompt,无论是通过 Web UI 的审批栏还是 REST elicitation 端点。Read 分享既看不到也无法回答它们。

只有 owner 可以更改 agent

共同驾驶允许队友发送消息,但不允许他们重新配置会话运行的 agent。添加、编辑、删除会话的 MCP server,以及替换会话的 agent bundle(PUT /v1/sessions/{session_id}/agent),都需要会话的 owner 权限——Edit 不够。除了会话所有权之外,调用者还必须拥有绑定到该会话的 agent(或者是工作区管理员)。这两项检查都由服务器强制执行,因此对 API 客户端和 UI 同样适用。

在 Web UI 中,打开会话的操作菜单并选择 Agent info,可以查看绑定的 agent 的工具和策略。所有能访问该会话的人都能看到其中列出的 MCP server 名称;只有 owner 才能看到 Manage MCP servers 控件以及针对每个 server 的编辑和删除操作。子会话继承父会话的访问权限,所以 owner 在子 agent 会话中同样保有这些控件,而 Edit 协作者只能看到只读列表。

内置模板 agent 和原生 coding-agent harness(*-native)在此处永远不会暴露 MCP 编辑功能,无论查看者是谁。

当认证被禁用或服务器以本地单用户模式运行时,没有所有权模型,MCP 控件对所有可编辑 agent 始终可用。

谁说了什么

当会话中有多个已认证的人参与时,Omnigent 会为每条对模型可见的用户消息标注作者账号,前缀为 [account]:(例如 [alice@example.com]: ...),让 agent 能在对话中区分不同的协作者。只有当有两个或以上不同的作者发言时才会显示标签;单人会话不加标签。

这个标签仅用于信息展示。它不会改变存储的消息作者、UI 头像、会话所有权,也不影响谁可以批准或执行特权操作——授权完全不受影响。

如果不想让模型看到这些标签,启动服务器前设置环境变量:

OMNIGENT_SHARED_MESSAGE_ATTRIBUTION_ENABLED=0 omni server start

该开关默认开启;设为 0、false、no 或 off 任意一个都会禁用。禁用它只会移除 prompt 中的标签——模型看到的内部作者元数据仍会被剥离,持久化的作者信息也不变。

Fork(派生)

克隆一个对话并从派生点独立继续,原始会话不受影响。

在 Web UI 中,点击 Clone Session。

在终端:

omni run --fork

Fork 会复制派生点之前的完整对话历史,之后每个会话独立分叉发展。

Fork 到云沙箱

默认情况下,fork 创建后是未绑定的:它以空闲状态启动,没有 runner,你之后可以像恢复会话那样附加算力。如果你的服务器配置了 cloud sandbox provider,也可以让 fork 直接落在服务器新配置的沙箱主机上。

在 Web UI 的 Clone Session 对话框中,选择 New Sandbox 作为目标,而不是现有的主机。服务器会配置沙箱、启动 runner,并自动回连——这和新沙箱会话使用的后台启动流程一样,所以克隆出来的会话在沙箱尚未就绪时就已经出现了。沙箱会注册给你(执行 fork 的用户),因此会解析你的凭证,而不是源会话 owner 的。

沙箱的工作目录默认跟随源会话:不设置 workspace 就会继承源会话记录的 git 仓库,所以克隆沙箱会话会让 fork 落在同一个 checkout 上。你也可以把 fork 指向另一个仓库(https://github.com/org/repo#branch),或者选择一个空沙箱。

host_type、sandbox_provider 和 workspace 请求字段参见 REST API 参考中的 fork 端点。

评论 (0)