feat(gui): add capability-driven actions ring - #528
Conversation
Greptile SummaryThe PR adds a capability-driven Actions Ring spanning configuration, device capture, agent-owned IPC sessions, a warm overlay, action execution, packaging, and localization.
Confidence Score: 5/5The PR appears safe to merge. No blocking failure remains; the current command worker retains terminal work during connection failures and stalled RPCs, and newer terminal commands promptly supersede stale-session work.
|
| Filename | Overview |
|---|---|
| crates/openlogi-gui/src/bin/openlogi-overlay.rs | Implements the warm radial overlay and now preserves terminal commands across reconnects while allowing newer session commands to supersede stale work. |
| crates/openlogi-agent-core/src/action_ring.rs | Adds authoritative, expiring ring sessions with snapshotted actions and validated hover, activation, and cancellation. |
| crates/openlogi-agent/src/server.rs | Exposes the ring session RPCs and dispatches validated activations through the shared action path. |
| crates/openlogi-agent/src/overlay.rs | Adds supervision and packaged-binary discovery for the warm overlay helper. |
| crates/openlogi-core/src/binding/action_ring.rs | Defines persisted ring layouts, slots, overrides, and presentation configuration. |
| xtask/src/commands/macos/bundle.rs | Embeds and signs the overlay helper as a nested macOS application. |
Sequence Diagram
sequenceDiagram
participant Input as Device input
participant Agent as OpenLogi agent
participant Session as ActionRingManager
participant Overlay as Overlay helper
participant Dispatch as ActionDispatcher
Input->>Agent: Show Actions Ring
Agent->>Session: Begin snapshotted session
Overlay->>Agent: Long-poll next_action_ring
Agent-->>Overlay: Session ID and presentation slots
Overlay->>Agent: Hover / activate / cancel
Agent->>Session: Validate active session and slot
Session-->>Agent: Snapshotted action
Agent->>Dispatch: Execute selected action
Reviews (3): Last reviewed commit: "fix(gui): interrupt stalled ring request..." | Re-trigger Greptile
|
@jericho0521 Great work so far! 🎉 Can you ensure you update the PR and review comments from greptile-apps? |
8576bef to
e7a9574
Compare
|
@jericho0521 Great work on adding the config for the action ring! Can you add a screen recording of the PR working locally on your computer? Also a noticed some functionality in the following Logi youtube video; https://www.youtube.com/watch?v=sXXIQt9mjDQ Did you cover most of the features of the OG product offering? |
|
Thanks! I’ll add a local screen recording. Covered in this PR:
Not yet covered:
This covers the core local-first workflow, but not full Options+ parity. The remaining features are better handled as follow-up work. |
Screen.Recording.2026-08-11.at.6.26.20.AM.mov |
e8f904d to
2c4d463
Compare
2c4d463 to
4927a6a
Compare
|
Too many files changed for review (112 files, 100 file limit). Bypass the limit by tagging |
4927a6a to
b97b5b5
Compare
## Why Gesture mode was a device-level property: exactly one button could own it, chosen from a dedicated selector row above the mouse model. That lock had no hardware basis — an MX Master can divert its gesture button, its thumb wheel and OS-hook side buttons at once — and it put gestures outside the flow every other binding uses, so assigning them meant leaving the button you were editing. ## What - Gesture mode becomes shape-driven in the config: any button carrying a Gesture-shaped map is in gesture mode, so the owner field and its transition shims are gone (with v3 migration materializing the old HID++ owner's seeded map). - The action picker leads a gesture-capable button with a pinned "Gestures" entry; a gesture-mode button's popover gains a "Turn off gestures" footer. The device-level owner selector row is removed. - Every gesture-mode HID++ source is armed in the capture plan, and every OS-hook gesture button dispatches — first hold wins, with hold takeover, overlap suppression and arm unwind across two sources. - A demoted button's map is stashed so re-enabling restores its swipe arms, and a hold whose button-up was lost is recovered. ## Impact openlogi-core config + migration, openlogi-agent-core gesture planning and dispatch, openlogi-hid capture arming, openlogi-gui picker and state. New "Gestures" / "Turn off gestures" strings in every locale. Not runtime-tested on hardware — the two-source paths (gesture button plus thumb wheel) still need a physical MX Master pass. Merge resolution: reconciled with upstream's capability-driven actions ring (AprilNEA#528) — the haptic panel's default is now Single(ShowActionsRing) (still plain-diverted, not gesture mode), and the multi-source raw-XY arming adopts upstream's original-reporting restore (ArmedCid) so teardown hands every control back exactly as found.
## Why Gesture mode was a device-level property: exactly one button could own it, chosen from a dedicated selector row above the mouse model. That lock had no hardware basis — an MX Master can divert its gesture button, its thumb wheel and OS-hook side buttons at once — and it put gestures outside the flow every other binding uses, so assigning them meant leaving the button you were editing. ## What - Gesture mode becomes shape-driven in the config: any button carrying a Gesture-shaped map is in gesture mode, so the owner field and its transition shims are gone (with v3 migration materializing the old HID++ owner's seeded map). - The action picker leads a gesture-capable button with a pinned "Gestures" entry; a gesture-mode button's popover gains a "Turn off gestures" footer. The device-level owner selector row is removed. - Every gesture-mode HID++ source is armed in the capture plan, and every OS-hook gesture button dispatches — first hold wins, with hold takeover, overlap suppression and arm unwind across two sources. - A demoted button's map is stashed so re-enabling restores its swipe arms, and a hold whose button-up was lost is recovered. ## Impact openlogi-core config + migration, openlogi-agent-core gesture planning and dispatch, openlogi-hid capture arming, openlogi-gui picker and state. New "Gestures" / "Turn off gestures" strings in every locale. Not runtime-tested on hardware — the two-source paths (gesture button plus thumb wheel) still need a physical MX Master pass. Merge resolution: reconciled with upstream's capability-driven actions ring (AprilNEA#528) — the haptic panel's default is now Single(ShowActionsRing) (still plain-diverted, not gesture mode), and the multi-source raw-XY arming adopts upstream's original-reporting restore (ArmedCid) so teardown hands every control back exactly as found.
Summary
Adds a capability-driven Actions Ring vertical slice, including MX Master 4 Haptic Sense Panel capture, agent-owned sessions, haptic feedback, a warm non-activating GPUI overlay, and an editor for radial actions.
Changes
0x19B0haptic feedback and0x19C0force-sensing wrappers; discover and divert Haptic Sense Panel CID0x01A0; preserve prior reporting stateopenlogi-overlayin macOS, Linux, and Windows artifactsThe
0x19B0,0x19C0, and CID0x01A0behavior is documented in code as reverse-engineered rather than treated as an official protocol guarantee.Screenshots
Testing
cargo fmt --all -- --checkcargo clippy --workspace --all-targets -- -D warningscargo test --workspacecargo run -p xtask -- macos bundlecodesign --verify --deep --strict --verbose=2 target/release/bundle/osx/OpenLogi.app0x01A0capture, waveform playback, force thresholds, and press-to-first-frame latency remain to be verifiedRelated to #92 and #313.
Fixes #15