Skip to content

feat(mobile): publish richer remote workspace state - #8112

Closed
austinywang wants to merge 3 commits into
mainfrom
feat-richer-remote-state
Closed

austinywang wants to merge 3 commits into
mainfrom
feat-richer-remote-state

Conversation

@austinywang

@austinywang austinywang commented Jul 15, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Add additive, versioned remote_state v1 data to each mobile workspace row, covering aggregated agent lifecycle, git branch/dirty state, pull-request lifecycle/URL/branch/staleness, CI status, and notification unread state.
  • Add additive, versioned top-level view_presence v1 data, grouping active transports by stable client ID and publishing presence changes through the existing workspace event path.
  • Advertise workspace.remote_state.v1 and view.presence.v1; keep older payloads decodable and map unknown future lifecycle/CI values to .unknown.
  • Reuse existing workspace, sidebar, notification, and connection stores. Git/PR/agent changes feed the shared LatestWinsBatcher; this adds no per-keystroke/per-frame work and no new polling.
  • Report CI honestly as unknown: the sidebar intentionally removed GitHub status polling in Coalesce sidebar PR polling per-repo, drop checks fetch, state-machine the probe queue #2662, and there is no cheap authoritative host-side CI source. This PR does not restore that polling.
  • Leave Packages/macOS/CmuxHive untouched.

Fixes #8082

Testing

  • arch -arm64 swift test in Packages/iOS/CmuxMobileRPC: 81 passed.
  • Focused cmux-unit run for MobileRicherRemoteStateTests, MobileWorkspaceObserverMetricsTests, and InvalidationBatchingBehaviorTests: 11 passed, 0 failed/skipped.
  • ./scripts/reload.sh --tag issue-8082-richer-state: succeeded on pushed HEAD 60196b84ca.
  • Passed scripts/check-pbxproj.sh, scripts/lint-pbxproj-test-wiring.sh (494 files), scripts/check-package-resolved-policy.py, and git diff --check.
  • python3 scripts/swift_file_length_budget.py still reports pre-existing origin/main budget debt; the branch-specific observer crossing was removed (MobileWorkspaceListObserver.swift is 491 lines).
  • Localization audit: no user-facing surfaces or localization catalogs changed; added production literals are wire keys/capability identifiers only.

Manual verification is protocol-only in this PR; the tagged app is available for attached-view payload/presence dogfood.

Demo Video

Not applicable: no UI surface changed.

Checklist

  • I tested the change locally
  • I added or updated tests for behavior changes
  • Docs/changelog are not required for this additive internal protocol change
  • I requested bot reviews after my latest commit
  • All code review bot comments are resolved
  • All human review comments are resolved

View with Codesmith Autofix with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is disabled.


Summary by cubic

Publish richer, versioned remote workspace state and view presence to mobile so the app can show agent, git, PR, CI, and notification details without extra polling. Adds workspace.remote_state.v1 and view.presence.v1 with forward-compatible decoding, capability flags, and hardened presence tracking; addresses #8082.

  • New Features

    • Add workspace.remote_state.v1 per workspace: agents (lifecycle + panels), git (branch/dirty), pull request (lifecycle/URL/branch/staleness), CI (unknown if not authoritative), and notifications (unread count/dot, latest id).
    • Add view.presence.v1: groups transports by stable client_id with connection_count; presence changes emit via workspace.updated. iOS decoders accept optional display_name and kind when supplied.
    • Advertise workspace.remote_state.v1 and view.presence.v1; older clients keep decoding legacy fields; unknown lifecycle/CI values map to unknown.
    • Implement forward-compatible models and tests in Packages/iOS/CmuxMobileRPC; no new polling or per-keystroke work (reuses existing stores and batching).
  • Bug Fixes

    • Harden attached-view presence: ignore unauthenticated status probes, trim/validate client_id (max 128 bytes), de-dupe per connection, and emit updates on subscribe and disconnect for catch-up without polling.

Written for commit 80ceab4. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features
    • Added richer remote workspace state details (agent lifecycle, Git state, pull request lifecycle/CI status, and notification unread info) to the mobile workspace list, including versioned decoding.
    • Added versioned view presence support and connection-aware client identity tracking, with workspace update events when presence changes.
    • Added forward-compatible handling for unknown lifecycle/CI values.
  • Tests
    • Expanded coverage for remote-state decoding, additive/compatibility behavior, view-presence grouping stability, subscription/event behavior, and workspace change detection hashing.

@vercel

vercel Bot commented Jul 15, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cmux Ready Ready Preview, Comment Jul 15, 2026 4:35am
cmux-staging Building Building Preview, Comment Jul 15, 2026 4:35am

@coderabbitai

coderabbitai Bot commented Jul 15, 2026 •

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The mobile RPC layer now supports versioned workspace remote state and attached-view presence. The host derives agent, Git, pull-request, notification, and connection data, emits related workspace updates, includes the data in workspace-list payloads, and adds decoding and integration coverage.

Changes

Richer mobile workspace state

Layer / File(s) Summary
Versioned RPC models and decoding
Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/*, Packages/iOS/CmuxMobileRPC/Tests/CmuxMobileRPCTests/MobileWorkspaceRemoteStateDecodeTests.swift
Adds decodable models for agents, Git, pull requests, notifications, remote state, and attached views, including additive defaults and .unknown fallbacks.
Workspace snapshots and payload projection
Sources/Mobile/MobileWorkspace*Snapshot.swift, Sources/TerminalController+MobileWorkspaceList.swift, cmux.xcodeproj/project.pbxproj
Projects workspace metadata into remote_state, extends mobile workspace hashing, and wires new sources and tests into the Xcode project.
Attached-view presence and request ordering
Sources/Mobile/MobileHostService*.swift, Sources/Mobile/MobileViewPresenceState.swift, Sources/TerminalController+MobileWorkspaceList.swift, cmuxTests/MobileHostAuthorizationTests.swift
Advertises capabilities, aggregates client connection counts, emits presence updates, includes view_presence, and records authorized requests before subscription interception.
Workspace invalidation and validation
Sources/Mobile/MobileWorkspaceListObserver.swift, cmuxTests/MobileRicherRemoteStateTests.swift
Observes agent and sidebar metadata changes, hashes unread counts and remote state, manages task cancellation, and validates payload and subscription behavior.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Workspace
  participant MobileWorkspaceRemoteStateSnapshot
  participant MobileHostService
  participant TerminalController
  participant MobileClient
  Workspace->>MobileWorkspaceRemoteStateSnapshot: capture semantic workspace state
  MobileWorkspaceRemoteStateSnapshot->>TerminalController: provide remote_state payload
  MobileHostService->>TerminalController: provide view_presence payload
  TerminalController->>MobileClient: return workspace list response
Loading

Possibly related PRs

Suggested reviewers: lawrencecchen

🚥 Pre-merge checks | ✅ 24 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 19.35% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (24 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The changes match #8082 by adding versioned remote state and view presence, with backward-compatible decoding and no macOS Hive edits.
Out of Scope Changes check ✅ Passed The added tests, protocol types, and project wiring all support the stated richer remote-state and presence work.
Cmux Swift Actor Isolation ✅ Passed New models are Sendable value types; MobileHostService/MobileWorkspaceListObserver remain @MainActor, and LatestWinsBatcher drains on MainActor, so no isolation regression.
Cmux Swift Blocking Runtime ✅ Passed PASS: PR adds state models and async observation only; added lines show no new waits, sleeps, semaphores, main-sync, or locks.
Cmux Browser Automation Off-Main ✅ Passed PR changes only mobile RPC/state files; no edits to the browser-automation scope files or browser.* routing were introduced.
Cmux Expensive Synchronous Load ✅ Passed No added agent-history/file scan loads; the new paths are in-memory snapshots, async invalidations, and simple dictionary payloads, with no RestorableAgentSessionIndex.load or JSONL parsing.
Cmux Cache Substitution Correctness ✅ Passed The new snapshot paths read live workspace/notification state, and the only cache added is event-driven with startup refresh plus invalidations, so no stale cache substitution appears.
Cmux No Hacky Sleeps ✅ Passed The only non-Swift change is Xcode project wiring; no script/runtime files add sleeps, timers, polling, or waits.
Cmux Algorithmic Complexity ✅ Passed PASS: new presence state only aggregates in one pass then sorts at most 10 active connections; no nested rescans or hot-path re-sorting were introduced.
Cmux Swift Concurrency ✅ Passed The only new production Task is stored in perWorkspaceAgentTasks and canceled on deinit/removal; no new background queues or completion-handler APIs were added.
Cmux Swift @Concurrent ✅ Passed No changed async helper needs @concurrent; new work is sync or main-actor-bound, and existing off-main async paths already hop explicitly.
Cmux Swift File And Package Boundaries ✅ Passed New code is split into small single-purpose files/package DTOs; only tiny additions landed in already-large app glue files, with no new oversized mixed-responsibility Swift file.
Cmux Swiftpm Lockfiles ✅ Passed Changed files were only source and pbxproj wiring; no Package.resolved, Package.swift, or .gitignore changes, and the pbxproj diff has no SwiftPM package-reference edits.
Cmux Swift Logging ✅ Passed PASS: branch diff adds only DEBUG-gated cmuxDebugLog lines; no new print/NSLog/dump or file-scoped Logger constants were introduced, and existing Logger declarations predated the PR.
Cmux User-Facing Error Privacy ✅ Passed The PR only adds protocol models/payload plumbing and capability flags; no new user-facing error/alert/recovery copy or raw upstream messages were introduced.
Cmux Full Internationalization ✅ Passed The diff only adds protocol/config tokens and tests; no new user-facing Swift/web copy or locale assets changed, and existing localized API text was untouched.
Cmux Swiftui State Layout ✅ Passed The diff adds host-side RPC models/services only; no SwiftUI view changes, ObservableObject/@published additions, GeometryReader layout changes, or render-time state writes are present.
Cmux Architecture Rethink ✅ Passed PASS: The diff centralizes presence/remote-state in single state/snapshot owners and reuses existing host/observer paths; no new sleeps, polling, or split lifecycle ownership was introduced.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed No standalone NSWindow/NSPanel/WindowGroup changes or cmux.* close-shortcut routing edits appear in this PR; it only adds mobile RPC models, host state, and tests.
Cmux Source Artifacts ✅ Passed Diff only touches handwritten source, tests, and Xcode project wiring; no logs, caches, temp dirs, build outputs, or other artifact paths appear.
Cmux No Test Or Debug Seam In Production Source ✅ Passed The patch adds production-facing presence/state APIs with production callers; no new DEBUG-only or test-named seam was introduced in Sources/.
Cmux No Ambient Global State ✅ Passed No new ambient-global surface was added; the new presence state is instance-owned by MobileHostService and the new files are plain data types/methods, not global funcs or singletons.
Title check ✅ Passed The title is concise and accurately summarizes the main change: publishing richer mobile remote workspace state.
Description check ✅ Passed The description is detailed and covers summary, testing, demo video, and checklist, but it omits the explicit Review Trigger copy/paste block.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat-richer-remote-state

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@greptile-apps

greptile-apps Bot commented Jul 15, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds richer mobile workspace state and attached-view presence. The main changes are:

  • Versioned remote_state data on each workspace row.
  • Versioned view_presence data for attached mobile views.
  • Host-side snapshots for agent, git, pull request, CI, and unread state.
  • Capability flags for the new mobile protocol fields.
  • Tests for decoding, presence behavior, and richer workspace updates.

Confidence Score: 5/5

This looks safe to merge.

  • No blocking issues found in the changed code.

Important Files Changed

Filename Overview
Sources/Mobile/MobileViewPresenceState.swift Adds the attached-view presence model, payload builder, and status-probe guard.
Sources/Mobile/MobileHostService.swift Routes authorized mobile requests into presence tracking and sends a presence catch-up after new subscriptions.
Sources/TerminalController+MobileWorkspaceList.swift Adds view presence and per-workspace remote state to the mobile workspace-list payload.

Reviews (3): Last reviewed commit: "fix(mobile): harden attached view presen..." | Re-trigger Greptile

Comment thread Sources/Mobile/MobileHostService.swift Outdated
// plumbing. Newer clients identify themselves on their first
// `mobile.events.subscribe`, before terminal input/viewport traffic,
// so presence becomes visible as soon as the view attaches.
await onAuthorizedRequest(request)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 security Unauthenticated Presence Registration

When an unauthenticated mobile.host.status request includes client_id, this new early onAuthorizedRequest call can record that arbitrary ID and recordClientID now emits workspace.updated. Authenticated subscribers can then receive a presence update for a forged attached view until that connection closes, so presence recording should be limited to requests that passed the authenticated path or to the authorized subscribe flow.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 80ceab4: Stack-bearer mobile.host.status is explicitly excluded from presence registration, client IDs are bounded to one per transport and 128 UTF-8 bytes, and focused coverage verifies public status cannot add a view.

— Claude Code

Comment thread Sources/Mobile/MobileHostService.swift Outdated
// plumbing. Newer clients identify themselves on their first
// `mobile.events.subscribe`, before terminal input/viewport traffic,
// so presence becomes visible as soon as the view attaches.
await onAuthorizedRequest(request)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 security Public status records presence

This call still runs for mobile.host.status, which is the one RPC method that skips authorization. When an unauthenticated status request includes client_id, this path records that ID, emits workspace.updated, and lets authenticated subscribers see a forged attached-view row until the connection closes. Please keep presence registration on the authenticated request path only, or explicitly skip the public status method here.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 80ceab4: the shared presence owner rejects Stack-bearer public-status registration before any client ID is stored or event emitted. The current diff also bounds identity storage per transport.

— Claude Code

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileAttachedView.swift`:
- Line 2: Mark the pure value-model structs MobileAttachedView in
Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileAttachedView.swift:2-2
and MobileWorkspaceGitState in
Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileWorkspaceGitState.swift:2-2
as nonisolated, preserving their existing Codable, Sendable, and Equatable
declarations.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 807333de-1636-490e-8b01-eb614e447da8

📥 Commits

Reviewing files that changed from the base of the PR and between 3822f1d and 8aeae2b.

📒 Files selected for processing (21)
  • Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileAttachedView.swift
  • Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileSyncWorkspaceListResponse.swift
  • Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileViewPresence.swift
  • Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileWorkspaceAgentLifecycle.swift
  • Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileWorkspaceAgentStatus.swift
  • Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileWorkspaceCIStatus.swift
  • Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileWorkspaceGitState.swift
  • Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileWorkspaceNotificationState.swift
  • Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileWorkspacePullRequestLifecycle.swift
  • Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileWorkspacePullRequestState.swift
  • Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileWorkspaceRemoteState.swift
  • Packages/iOS/CmuxMobileRPC/Tests/CmuxMobileRPCTests/MobileWorkspaceRemoteStateDecodeTests.swift
  • Sources/Mobile/MobileHostService+Capabilities.swift
  • Sources/Mobile/MobileHostService.swift
  • Sources/Mobile/MobileWorkspaceAgentStatusSnapshot.swift
  • Sources/Mobile/MobileWorkspaceListObserver.swift
  • Sources/Mobile/MobileWorkspaceRemoteStateSnapshot.swift
  • Sources/TerminalController+MobileWorkspaceList.swift
  • cmux.xcodeproj/project.pbxproj
  • cmuxTests/MobileHostAuthorizationTests.swift
  • cmuxTests/MobileRicherRemoteStateTests.swift

@@ -0,0 +1,18 @@
/// One attached view represented in a host's runtime-presence snapshot.
public struct MobileAttachedView: Decodable, Sendable, Equatable {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Mark pure value-model structs as nonisolated.

As per coding guidelines, please mark Codable, Identifiable, Sendable, and pure value-model structs as nonisolated to prevent them from implicitly inheriting @MainActor isolation under Swift 6 strict concurrency defaults.

  • Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileAttachedView.swift#L2-L2: Add the nonisolated modifier to MobileAttachedView.
  • Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileWorkspaceGitState.swift#L2-L2: Add the nonisolated modifier to MobileWorkspaceGitState.
📍 Affects 2 files
  • Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileAttachedView.swift#L2-L2 (this comment)
  • Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileWorkspaceGitState.swift#L2-L2
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileAttachedView.swift` at
line 2, Mark the pure value-model structs MobileAttachedView in
Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileAttachedView.swift:2-2
and MobileWorkspaceGitState in
Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileWorkspaceGitState.swift:2-2
as nonisolated, preserving their existing Codable, Sendable, and Equatable
declarations.

Source: Coding guidelines

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
cmuxTests/MobileRicherRemoteStateTests.swift (1)

112-121: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Resolve conflicting test logic for spoofed-client.

The test calls service.recordClientID("spoofed-client", for: secondConnectionID) immediately after recording "phone-1" for the same connection ID.

If the presence state maps each connectionID to a single clientID (replacing the previous entry), "phone-1" will have a connection count of 1, causing the assertion on line 120 (connection_count == 2) to fail. If the presence state supports multiple clients per connection, the views array will contain "spoofed-client", causing the exact array assertion on line 119 to fail.

Consider removing the "spoofed-client" line if it was accidentally copied from the invalid ID test below, or adjust the assertions to match the intended state.

🐛 Proposed fix (assuming `spoofed-client` is unintentional here)
         service.recordClientID("phone-1", for: firstConnectionID)
         service.recordClientID("phone-1", for: firstConnectionID)
         service.recordClientID("phone-1", for: secondConnectionID)
-        service.recordClientID("spoofed-client", for: secondConnectionID)
         service.recordClientID("mac-2", for: thirdConnectionID)
 
         let payload = service.viewPresencePayload()
         `#expect`(payload["version"] as? Int == 1)
         let views = try `#require`(payload["views"] as? [[String: Any]])
-        `#expect`(views.map { $0["client_id"] as? String } == ["mac-2", "phone-1"])
+        `#expect`(Set(views.compactMap { $0["client_id"] as? String }) == ["mac-2", "phone-1"])
         `#expect`(views.first { $0["client_id"] as? String == "phone-1" }?["connection_count"] as? Int == 2)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@cmuxTests/MobileRicherRemoteStateTests.swift` around lines 112 - 121, Resolve
the conflicting test setup in the presence payload test by removing the
unintended service.recordClientID call for "spoofed-client" on
secondConnectionID. Keep the existing views ordering and connection-count
assertions for "phone-1" and "mac-2" unchanged, leaving spoofed-client coverage
to the appropriate invalid-ID test.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@cmuxTests/MobileRicherRemoteStateTests.swift`:
- Around line 112-121: Resolve the conflicting test setup in the presence
payload test by removing the unintended service.recordClientID call for
"spoofed-client" on secondConnectionID. Keep the existing views ordering and
connection-count assertions for "phone-1" and "mac-2" unchanged, leaving
spoofed-client coverage to the appropriate invalid-ID test.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: b51707d1-62ac-47a7-a659-590812810f19

📥 Commits

Reviewing files that changed from the base of the PR and between 8aeae2b and 80ceab4.

📒 Files selected for processing (4)
  • Sources/Mobile/MobileHostService.swift
  • Sources/Mobile/MobileViewPresenceState.swift
  • cmux.xcodeproj/project.pbxproj
  • cmuxTests/MobileRicherRemoteStateTests.swift

This branch had an error being deployed

1 failed deployment
Preview – cmux — 80ceab46 Deployed Jul 15, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

stale-revisit Closed after 30+ days without activity; preserved for possible revisit or reopening.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

hive: richer remote state — host publishes agent status, git/PR state, and device presence to attached views

3 participants