Skip to content

feat: native Codex Micro ownership and macOS identity (v0.3.8) - #90

Merged
DevVig merged 1 commit into
mainfrom
t3code/improve-mac-control-settings
Jul 23, 2026
Merged

feat: native Codex Micro ownership and macOS identity (v0.3.8)#90
DevVig merged 1 commit into
mainfrom
t3code/improve-mac-control-settings

Conversation

@DevVig

@DevVig DevVig commented Jul 23, 2026

Copy link
Copy Markdown
Owner

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 passed
  • cargo clippy --workspace --all-targets -- -D warnings
  • cargo test --manifest-path apps/microbridge-ui/src-tauri/Cargo.toml — 11 passed
  • cargo clippy --manifest-path apps/microbridge-ui/src-tauri/Cargo.toml --all-targets -- -D warnings
  • npm test -- --run — 34 passed
  • npm run build
  • Rust formatting, shell syntax, Formula syntax, and git diff --check
  • Ad-hoc signed isolated app lifecycle: private home/socket, bundled daemon reachable, daemon exited with the exact app PID
  • Bundle validation confirmed the existing icon.icns

Release / migration notes

  • Version aligned to v0.3.8 across Rust, Tauri, npm, SDK, hooks, and locks.
  • No wire-protocol or persisted-config schema change.
  • Known legacy UI/daemon LaunchAgents migrate only after the replacement is working; failures preserve or restore the original service.
  • Standard GUI installs use the app-owned daemon. brew services remains an explicit headless option.
  • Tagging occurs only after this PR merges and required checks are green; the tag workflow separately signs/notarizes both DMGs, publishes updater assets, opens the Homebrew formula PR, and runs public ARM/Intel install checks.

Checklist

  • cargo fmt / clippy -D warnings / cargo test pass locally
  • No wire protocol change; retry reuses SetConfig
  • Adapter version metadata is aligned; no adapter protocol behavior changed
  • No polling or network added to idle operation; app-owned mode uses one blocking parent-lifetime pipe watcher

Copilot AI review requested due to automatic review settings July 23, 2026 00:00
@coderabbitai

coderabbitai Bot commented Jul 23, 2026

Copy link
Copy Markdown

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in: 40 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

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 configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: dd691fcd-6dba-4567-8c1b-d160ec0487d0

📥 Commits

Reviewing files that changed from the base of the PR and between 750b405 and 9f21788.

⛔ Files ignored due to path filters (3)
  • Cargo.lock is excluded by !**/*.lock
  • apps/microbridge-ui/package-lock.json is excluded by !**/package-lock.json
  • apps/microbridge-ui/src-tauri/Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (33)
  • .github/workflows/finalize-release.yml
  • .github/workflows/release.yml
  • Cargo.toml
  • Formula/microbridge.rb
  • INSTALL.md
  • README.md
  • adapters/claude/hooks/microbridge-permission.mjs
  • adapters/sdk/package.json
  • apps/microbridge-ui/README.md
  • apps/microbridge-ui/package.json
  • apps/microbridge-ui/src-tauri/Cargo.toml
  • apps/microbridge-ui/src-tauri/src/lib.rs
  • apps/microbridge-ui/src-tauri/tauri.conf.json
  • apps/microbridge-ui/src/App.tsx
  • apps/microbridge-ui/src/lib/autostart.ts
  • apps/microbridge-ui/src/lib/hardwareControl.test.ts
  • apps/microbridge-ui/src/lib/hardwareControl.ts
  • apps/microbridge-ui/src/lib/updater.ts
  • apps/microbridge-ui/src/surfaces/Disconnected.tsx
  • apps/microbridge-ui/src/surfaces/Popover.tsx
  • apps/microbridge-ui/src/surfaces/Settings.tsx
  • apps/microbridge-ui/src/surfaces/surfaces.test.tsx
  • crates/microbridged/src/main.rs
  • crates/microbridged/src/state.rs
  • docs/architecture.md
  • docs/design/README.md
  • docs/device-hid.md
  • docs/governance.md
  • docs/releases/v0.3.8.md
  • scripts/install-from-release.sh
  • scripts/install.sh
  • scripts/smoke-formula.sh
  • scripts/uninstall.sh

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

@DevVig
DevVig merged commit e72902f into main Jul 23, 2026
8 checks passed
@DevVig
DevVig deleted the t3code/improve-mac-control-settings branch July 23, 2026 00:02

Copilot AI 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.

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-app helper to manage the signed .app bundle 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.

Comment on lines +268 to +274
<input
type="checkbox"
className="mt-0.5"
checked={atLogin === "enabled"}
disabled={atLogin === null || atLogin === "unavailable"}
onChange={(e) => void toggleAtLogin(e.target.checked)}
/>
Comment thread scripts/install.sh
Comment on lines +151 to +154
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"
Comment on lines +87 to +90
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
Comment thread scripts/smoke-formula.sh
Comment on lines +85 to +91
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
Comment thread Formula/microbridge.rb
Comment on lines +72 to +81
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
}
Comment on lines +78 to +82
for _ in {1..30}; do
APP_PID="$(pgrep -f "^${APP_EXECUTABLE}$" | head -n1 || true)"
[[ -n "$APP_PID" ]] && break
sleep 1
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants