Repository navigation
Cloud: Codex and opencode chats run on your own Cloud machine - #28613
Conversation
…only (red) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-515e927c20142b82a32c
On a Cloud VM with no team evidence and the caller's vm_kind owner (the Cloud API's answer on the link), agent-session-start skips the refused-family check and the asking-mode settle, so Codex and opencode start in their default mode with policy ask (agent-session-start-owner-cloud-v1). The app's remote wire names ownerCloud in initialize while the link's owner answer holds, and the composer lets those chats send. A Mac, an SSH host, a team VM, a remote browser and paired devices keep D10's refusal; acpmux's Web rules are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-515e927c20142b82a32c
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-515e927c20142b82a32c
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-515e927c20142b82a32c
|
Found 1 test failure on Blacksmith runners: Failure
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-515e927c20142b82a32c
…codex-owner-vm # Conflicts: # Packages/macOS/CmuxNext/Sources/CmuxNextDaemon/Connection/DaemonEndpoint.swift
…gentPane, not the App Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-515e927c20142b82a32c
…kSession Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-515e927c20142b82a32c
… still refuses Codex there After #29107 a team VM passes host_gate on vm_kind owner, so a Codex or opencode start there is refused by the family check (not_asking), not team_vm_blocked. Without the word it is still team_vm_blocked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-515e927c20142b82a32c
|
Review (codex gpt-6.1-sol xhigh via router-review): SHIP at 9a033c2 router-review over feat-cmux-next merge-base..9a033c2. Follow-ups: refresh Since the review at d89674f (BLOCK, P1): the team VM test now expects |
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
|
Review (codex gpt-6.1-sol xhigh via router-review, carried): SHIP at ed6a560 Carried from the SHIP at 9a033c2. ed6a560 is cmux-bot's clean base merge of feat-cmux-next (6b2795d) into 9a033c2: the PR's own diff (merge-base..head) is line-for-line identical. Follow-up stays manaflow-ai/cmuxterm-hq#5643. Checks at ed6a560: none of the PR's own are red (Guard status wraps workflow-guard-tests / release-notary, red the same way on base). |
…codex-owner-vm # Conflicts: # Packages/macOS/CmuxNext/Sources/CmuxNextApp/AgentTabRemoteHost.swift # Packages/macOS/CmuxNext/Sources/CmuxNextApp/AgentTabs+Wiring.swift # Packages/macOS/CmuxNext/Tests/CmuxNextAppTests/CloudAppLinkOwnerAnswerTests.swift
Base's #29365 moved the owner-answer helper out of CmuxNextApp itself (CloudMachineLinks), which took away this PR's own offset. What's left is AgentTabRemoteHost.ownerCloud and the one wiring line that builds it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-515e927c20142b82a32c
|
Review (codex gpt-6-astra high via router-review): SHIP at f6e277f router-review over feat-cmux-next merge-base..f6e277f: no findings, no follow-ups. The open follow-up from the earlier review stays manaflow-ai/cmuxterm-hq#5643. Visual verdict: no images in a range review. No webview file changed since the gallery advisory after images the landing lane viewed (run 41159050556): codex-cloud-own shows the normal composer with Send; codex-cloud-team shows the "Not available from here" note with no Send. Since 9a033c2: a base merge. Base's #29365 added |
|
Review (codex gpt-6-astra high via router-review, carried): SHIP at 7bfef8a Carried from the SHIP at f6e277f. 7bfef8a is a clean merge of feat-cmux-next (ef001ab) into f6e277f, with no conflicts: the PR's own diff (merge-base..head) is line-for-line identical. Follow-up stays manaflow-ai/cmuxterm-hq#5643. This head also refreshes the checks that ran at f6e277f against GitHub's stale PR base sha (43b8e85, 540 files): risk evidence, defaults guard and generated drift. The PR changes 17 files and no defaults or generated outputs. |
|
Review (codex gpt-6-astra high via router-review, carried): SHIP at d6a0b93 Carried from the SHIP at f6e277f. d6a0b93 is a clean merge of feat-cmux-next into 7bfef8a, picking up the base-red fix #29486 (the CmuxNextAppTests compile). The PR's own diff (merge-base..head) is line-for-line identical. Follow-up stays manaflow-ai/cmuxterm-hq#5643. |
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
Leo, 2026-10-30, after showing ChatGPT's "Where should this chat run? On your computer / In the cloud" popover: "we should just have it" / "we have the roadmap in place to have it go more like chatgpt work right where you just pick the cloud button or whatever and then it just works?"
What
Today a Codex or opencode chat on a Cloud machine shows "Not available from here: this agent has no mode that asks before each change" and has no Send, so no Codex chat runs in Cloud. After this PR, on a Cloud machine the signed-in person owns, Codex and opencode chats start and send like Claude does. Nothing changes anywhere else.
agent-session-start. Two conditions must both hold: the machine is a Cloud VM with no team evidence (OwnerCloud/UnknownCloud), and the caller sentvm_kind: "owner", the Cloud API's answer for this link, which the app already sends since Cloud link: the attested vmKind decides the VM boundary and app-started chats (owner only) #26323 (never the guest's own record). When they do, the start skips the refused-family check and the asking-mode settle. The agent starts in its own default mode, still with policyask, so a permission question the agent asks still reaches the person. The new capability isagent-session-start-owner-cloud-v1. The daemon advertises it only where its own host read is a Cloud VM with no team evidence, so a Mac, an SSH host or a VM with team evidence never lets the app send to a Codex or opencode session there, whatever the Cloud API says.RemoteAcpmuxWire).initializesetsownerCloud: trueonly when two things are true at that moment: the daemon serves the capability, and the link's owner answer holds (AgentTabRemoteHost.ownerLink).originstays"remote".CloudLinkSession.ownerAnswer(appLink:link:). The link owner-answer closure moved here from the App'sAgentTabRemoteHost.ownerLink(appLink:link:), unchanged. That way this PR adds no CmuxNextApp lines (arch ratchetapp_lines-4).RemoteAcpmuxWire.ownerCloud(_:served:)builds the wire's closure from it.remoteEditing.ts).remoteComposerlets a Codex or opencode chat send onorigin: "remote"only whenownerCloudis true.plans/cmux-next/acp-remote-guard.mdgets an update section that records this decision next to D10.Why it's safe, and what still refuses
A Cloud VM the person owns is a disposable sandbox of their own: its agents already have sudo there, and Claude already runs unsandboxed at the VM boundary (#26276/#26309/#26323). The refusal stays for:
owner. A Mac is not a disposable sandbox.team_vm_blocked, as before.host_unverified, as before.REFUSED_FAMILIESin acpmuxweb_modes.rsis unchanged.Prior art read first:
vmKindand the VM boundary. This PR reuses their owner word and doesn't widen what it accepts.acp-remote-guard.md: why the families are refused.Takes back #27071: not a take-back. #27071 added
AGENT_SESSION_START_MODEL_CAPABILITYto thepub use agent_session_start::{...}list inagent_session_attach.rs; this PR keeps it and addsAGENT_SESSION_START_OWNER_CLOUD_CAPABILITY, so rustfmt rewraps those lines.Takes back #26825: not a take-back. #26825 added
start_link_share_bridgeto thepub use agent_session_attach::{...}list inserver.rs; this PR keeps it and addsAGENT_SESSION_START_OWNER_CLOUD_CAPABILITY, so rustfmt rewraps those lines.No capture: the Swift changes are wire and link logic (
RemoteAcpmuxWire,CloudLinkSession) with no native UI of their own; the visible change is the webview composer, captured by the gallery advisory run under Tests.Risk
risk:high (socket and relay policy). The relaxation applies only on a Cloud VM, only with the caller's exact owner word, and is read again at each start. An older daemon doesn't serve the capability, so the app never sets
ownerCloudfor it and the composer stays as it is today.Tests
Gallery: agent-pane.composer/codex-cloud-team, agent-pane.composer/codex-cloud-own
Before/after: the composer for a Codex chat on a Cloud machine. Before (and still, on a team machine):
codex-cloud-team, with the "Not available from here" note and no Send. That state renders exactly what base shows on every Cloud machine, the person's own included. After, on the person's own machine:codex-cloud-own, the normal composer with Send. The gallery advisory run captured both states, light and dark, 2x, synthetic data: https://github.com/manaflow-ai/cmux/actions/runs/41159050556 at be6e244 (artifactgallery-advisory-28613-<sha>; the head commit after it changes no webview file). I viewed the after images:codex-cloud-ownshows the normal composer with Send, andcodex-cloud-teamshows the "Not available from here" note and no Send, in both themes.Viewed after image: yes
Visual verdict: The composer is unchanged from the ordinary chat composer on the own machine and keeps today's note on a team machine, so it sits fine next to ChatGPT or Claude.
cmux-tui/tests/cli/agent_session_start.rsagent_session_start_starts_codex_on_the_callers_own_cloud_vm_only:vm_kind: "owner".not_asking), and so does a team VM (team_vm_blocked).agent-session-start-owner-cloud-v1.agent_session_start.rsunit testonly_the_callers_own_cloud_vm_starts_any_agent: the host-kind × owner-word table.RemoteAcpmuxOwnerCloudTests(Swift):initializenamesownerCloudonly when the owner answer holds, for an attached chat and for a new chat's wire alike.CloudVmKindTestschecks the capability's raw value.remoteEditing.test.ts: send is off on a remote Codex or opencode chat and on whenownerCloudis set. Anunknownorigin still refuses even with the flag.RED/GREEN: see the comments below for the runs at the red commit (tests only) and at the head.
Observed / Not run
See the runs linked below. Not run: a live Codex chat on a real staging Cloud VM.
Changelog
Agent session: agent session
🤖 Generated with Claude Code