feat: native Codex Micro ownership and macOS identity (v0.3.8) - #90
Conversation
|
Warning Review limit reachedYou’ve reached a temporary PR review limit under our Fair Usage Limits Policy. Next review available in: 40 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (3)
📒 Files selected for processing (33)
Comment |
There was a problem hiding this comment.
Pull request overview
Updates Microbridge to v0.3.8 and aligns macOS behavior around “truthful” Codex Micro ownership, native Login Items identity, and an app-owned daemon lifecycle (with Homebrew brew services retained as an explicit headless mode).
Changes:
- Adds contextual claim/release/retry hardware controls in the popover and tray right‑click menu, and adjusts daemon behavior to treat “enable while disconnected” as a retry.
- Switches macOS Launch at Login from a LaunchAgent/executable-based approach to
SMAppService, including legacy migration logic. - Introduces a Homebrew
microbridge-apphelper to manage the signed.appbundle outside the Cellar, and updates install/uninstall/smoke/release docs + scripts accordingly.
Reviewed changes
Copilot reviewed 33 out of 36 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
| scripts/uninstall.sh | Uninstalls launchd agents and removes marker-owned app bundles safely. |
| scripts/smoke-formula.sh | Updates formula smoke to validate app-owned daemon lifecycle + headless service separately. |
| scripts/install.sh | Makes launchd install conditional on headless mode; installs marker-owned app for source installs. |
| scripts/install-from-release.sh | Installs release app bundle via staging + codesign verification; shifts daemon ownership to app. |
| README.md | Updates Homebrew quickstart to use microbridge-app install and explains headless brew services. |
| INSTALL.md | Rewrites macOS Homebrew guidance to reflect app-owned daemon + explicit headless service. |
| Formula/microbridge.rb | Adds microbridge-app installer/uninstaller helper; makes brew services run standalone daemon. |
| docs/releases/v0.3.8.md | New release notes for 0.3.8 feature set and upgrade guidance. |
| docs/governance.md | Updates governance doc install/upgrade steps to match new Homebrew flow. |
| docs/device-hid.md | Updates HID ownership/claim guidance to new UI surfaces. |
| docs/design/README.md | Documents the new contextual hardware card behavior in the popover. |
| docs/architecture.md | Updates daemon “runs as” description for app-owned vs headless service on macOS. |
| crates/microbridged/src/state.rs | Implements “retry reopen” behavior for hardware control and adds unit test coverage. |
| crates/microbridged/src/main.rs | Adds --exit-with-parent mode for app-owned daemon shutdown when the parent exits. |
| Cargo.toml | Bumps workspace version to 0.3.8. |
| Cargo.lock | Updates crate versions to 0.3.8. |
| apps/microbridge-ui/src/surfaces/surfaces.test.tsx | Adds UI snapshot tests for claim/release/retry popover actions. |
| apps/microbridge-ui/src/surfaces/Settings.tsx | Updates Login Items UI to new status model + adds error display and “Open Login Items…” action. |
| apps/microbridge-ui/src/surfaces/Popover.tsx | Adds contextual hardware control card and routes actions via onHardwareControl. |
| apps/microbridge-ui/src/surfaces/Disconnected.tsx | Removes channel-specific “start daemon” instructions; guides relaunch for bundled daemon. |
| apps/microbridge-ui/src/lib/updater.ts | Updates Homebrew update message to include microbridge-app install. |
| apps/microbridge-ui/src/lib/hardwareControl.ts | New helper to derive hardware-control availability/connected/failed state. |
| apps/microbridge-ui/src/lib/hardwareControl.test.ts | Unit tests for hardwareControlState. |
| apps/microbridge-ui/src/lib/autostart.ts | Replaces old “can/enable” API with status-based SMAppService-backed API. |
| apps/microbridge-ui/src/App.tsx | Wires popover hardware control action to config updates. |
| apps/microbridge-ui/src-tauri/tauri.conf.json | Bumps Tauri app version to 0.3.8. |
| apps/microbridge-ui/src-tauri/src/lib.rs | Implements SMAppService login item handling, legacy migrations, tray hardware menu action, and app-owned daemon spawning. |
| apps/microbridge-ui/src-tauri/Cargo.toml | Adds plist + macOS objc2-service-management deps; removes autostart plugin. |
| apps/microbridge-ui/src-tauri/Cargo.lock | Lockfile updates for new deps and version bump. |
| apps/microbridge-ui/README.md | Documents right-click hardware menu and SMAppService behavior. |
| apps/microbridge-ui/package.json | Bumps UI package version to 0.3.8. |
| apps/microbridge-ui/package-lock.json | Lockfile version bump to 0.3.8. |
| adapters/sdk/package.json | Bumps adapter SDK version to 0.3.8. |
| adapters/claude/hooks/microbridge-permission.mjs | Bumps adapter version metadata to 0.3.8. |
| .github/workflows/release.yml | Updates release workflow instructions for the new Homebrew install/upgrade flow. |
| .github/workflows/finalize-release.yml | Updates finalize smoke to validate app-owned daemon lifecycle + uninstall behavior. |
Files not reviewed (1)
- apps/microbridge-ui/package-lock.json: Generated file
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| <input | ||
| type="checkbox" | ||
| className="mt-0.5" | ||
| checked={atLogin === "enabled"} | ||
| disabled={atLogin === null || atLogin === "unavailable"} | ||
| onChange={(e) => void toggleAtLogin(e.target.checked)} | ||
| /> |
| while read -r pid; do | ||
| kill "$pid" 2>/dev/null || true | ||
| done < <(/usr/bin/pgrep -f "^${APP_DEST}/Contents/MacOS/microbridge-ui$" 2>/dev/null || true) | ||
| rm -rf "$APP_DEST" |
| while read -r pid; do | ||
| kill "$pid" 2>/dev/null || true | ||
| done < <(/usr/bin/pgrep -f "^${DEST}/Contents/MacOS/microbridge-ui$" 2>/dev/null || true) | ||
| fi |
| APP_EXECUTABLE="$APP/Contents/MacOS/microbridge-ui" | ||
| APP_PID="" | ||
| for _ in {1..30}; do | ||
| APP_PID="$(pgrep -f "^${APP_EXECUTABLE}$" | head -n1 || true)" | ||
| [[ -n "$APP_PID" ]] && break | ||
| sleep 1 | ||
| done |
| stop_managed_app() { | ||
| executable="${dest}/Contents/MacOS/microbridge-ui" | ||
| /usr/bin/pgrep -f "^${executable}$" 2>/dev/null | while read -r pid; do | ||
| /bin/kill "${pid}" 2>/dev/null || true | ||
| done | ||
| for _ in 1 2 3 4 5 6 7 8 9 10; do | ||
| /usr/bin/pgrep -f "^${executable}$" >/dev/null 2>&1 || return 0 | ||
| /bin/sleep 0.1 | ||
| done | ||
| } |
| for _ in {1..30}; do | ||
| APP_PID="$(pgrep -f "^${APP_EXECUTABLE}$" | head -n1 || true)" | ||
| [[ -n "$APP_PID" ]] && break | ||
| sleep 1 | ||
| done |
What
Adds truthful Codex Micro hardware ownership controls to the home popover and native right-click menu, replaces executable-backed autostart with the signed main app through
SMAppService, and makes the standard GUI own its bundled daemon. Aligns source, release, and Homebrew installation paths and bumps the product to v0.3.8.Why
Claim/release was buried in Device settings and could imply ownership from configured intent instead of a confirmed HID connection. macOS Login Items also exposed raw executables instead of one branded Microbridge app, while GUI installs required a separately managed daemon.
How was this tested?
cargo test --workspace --all-targets— 83 passedcargo clippy --workspace --all-targets -- -D warningscargo test --manifest-path apps/microbridge-ui/src-tauri/Cargo.toml— 11 passedcargo clippy --manifest-path apps/microbridge-ui/src-tauri/Cargo.toml --all-targets -- -D warningsnpm test -- --run— 34 passednpm run buildgit diff --checkicon.icnsRelease / migration notes
brew servicesremains an explicit headless option.Checklist
cargo fmt/clippy -D warnings/cargo testpass locallySetConfig