Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
7269f43
feat(voice): auto-send dictation transcript + allowlist app-launch co…
M3gA-Mind Jun 1, 2026
ec8f5be
fix(shell): clarify tool description to include system/app-launch act…
M3gA-Mind Jun 1, 2026
802fbca
feat(tools): add launch_app tool for opening desktop applications
M3gA-Mind Jun 1, 2026
cdd3bb4
fix(launch_app): add extensive logs + system prompt capability hint
M3gA-Mind Jun 1, 2026
7d04fc4
fix(orchestrator): add launch_app to named tool list
M3gA-Mind Jun 1, 2026
c0bc07f
docs: add voice system actions feature tracker
M3gA-Mind Jun 1, 2026
454ce81
style(builder): format visible_names_list for improved readability
M3gA-Mind Jun 1, 2026
50ca434
feat(computer-control): enable mouse + keyboard tools for app interac…
M3gA-Mind Jun 1, 2026
4363b39
docs: update tracker with computer control (change 1.8)
M3gA-Mind Jun 1, 2026
725e71c
fix(orchestrator): add screenshot to named tools for see-then-click w…
M3gA-Mind Jun 1, 2026
8e65231
revert: remove mouse/keyboard/screenshot from orchestrator — unreliable
M3gA-Mind Jun 1, 2026
4f9ca1c
feat(ax_interact): add AXUIElement-based app UI interaction tool
M3gA-Mind Jun 1, 2026
2c32b59
fix(ax_interact): prefer exact label match over contains (Play vs Pla…
M3gA-Mind Jun 1, 2026
1ce7966
test(ax_interact): add integration tests for Music AX flow
M3gA-Mind Jun 1, 2026
87709de
fix(ax_interact): update SOUL.md workflow + fix test import path
M3gA-Mind Jun 1, 2026
0fbdd3e
docs+test: record ax_interact changes (1.8–1.10), fix test module path
M3gA-Mind Jun 1, 2026
b7b5448
fix(ax_interact): Apple Music play needs navigate-then-play (2 presses)
M3gA-Mind Jun 1, 2026
a95057f
fix(ax_interact): move Apple Music play guidance into tool description
M3gA-Mind Jun 1, 2026
f663f6d
feat(play_music): one-shot Apple Music play tool (native Rust flow)
M3gA-Mind Jun 1, 2026
12b1a1e
docs: record play_music root-cause fix (change 1.12)
M3gA-Mind Jun 1, 2026
c0dfc36
refactor(ax_interact): generic any-app tool + filtered list; remove p…
M3gA-Mind Jun 1, 2026
b0dfcde
docs: record generic ax_interact refactor (change 1.13)
M3gA-Mind Jun 1, 2026
aca28fd
test(ax_interact): assert tool-level success, log playback as best-ef…
M3gA-Mind Jun 2, 2026
8ba04a9
docs: add Windows port design notes for app interaction (UIA)
M3gA-Mind Jun 2, 2026
d0a5fe3
docs(windows): add cross-platform compat audit + mandatory E2E test m…
M3gA-Mind Jun 2, 2026
62b6020
feat(windows): port voice→system-action app interaction to Windows (UIA)
M3gA-Mind Jun 2, 2026
f2bc9a1
docs(windows): make ax_interact docs OS-neutral; record agent-in-the-…
M3gA-Mind Jun 2, 2026
0a18298
fix(ax_interact): address CodeRabbit review — gate mutating actions, …
M3gA-Mind Jun 2, 2026
ae03178
test(voice): cover dictation auto-send path for diff-cover gate
M3gA-Mind Jun 2, 2026
8c24320
fix(security): gate launch_app, deny-list + opt-in ax_interact mutations
M3gA-Mind Jun 2, 2026
89bb213
fix(security): close terminal-emulator denylist gap + correct stale docs
M3gA-Mind Jun 2, 2026
cb409f4
feat(automate): Rust-driven multi-step UI automation (M1-M5)
M3gA-Mind Jun 3, 2026
32e615e
feat(notch): show live voice and agent activity in macOS notch
M3gA-Mind Jun 1, 2026
ba322fa
style(notch): apply cargo fmt
M3gA-Mind Jun 1, 2026
d2fe0c6
feat(automate): M4 — stream live step progress to the notch indicator
M3gA-Mind Jun 3, 2026
d351d0d
docs: mark M4 (notch live progress) complete
M3gA-Mind Jun 3, 2026
146943d
fix(notch): authenticate the notch socket so live progress renders
M3gA-Mind Jun 3, 2026
49343d4
feat(voice): Phase 2 — continuous always-on capture loop
M3gA-Mind Jun 3, 2026
41465d5
feat(voice): Phase 2 — Settings toggle, i18n, screen-lock privacy pause
M3gA-Mind Jun 3, 2026
9f188a6
docs: mark Phase 2 (always-on listening) implemented
M3gA-Mind Jun 3, 2026
1719cf7
fix(voice): surface always-on toggle in the reachable Voice panel
M3gA-Mind Jun 3, 2026
28849c8
fix(voice): make always-on toggle work — schema param + live apply
M3gA-Mind Jun 3, 2026
faf4d04
fix(voice): always-on uses the configured STT provider (cloud), not l…
M3gA-Mind Jun 3, 2026
7c79ae1
feat(voice): "Hey Tiny" wake word for always-on commands
M3gA-Mind Jun 3, 2026
b52b8ba
docs: record Hey Tiny wake word + always-on live-fixes
M3gA-Mind Jun 3, 2026
3fe07e2
feat(agent): give orchestrator mouse/keyboard/screenshot for full aut…
M3gA-Mind Jun 3, 2026
726408e
feat(agent): teach orchestrator to fall back to screenshot+mouse+keyb…
M3gA-Mind Jun 3, 2026
3dfe58d
fix(autonomy): foreground-first + keyboard-first control + viewable s…
M3gA-Mind Jun 3, 2026
f412f9d
test: exhaustive coverage for voice-actions + autonomy; fix gaps caught
M3gA-Mind Jun 3, 2026
7f606b7
docs: record CEF keyboard-injection crash (Change 1.15) + exhaustive …
M3gA-Mind Jun 3, 2026
0cc6918
fix(computer): run keyboard/mouse enigo on the app main thread (no CE…
M3gA-Mind Jun 3, 2026
0d05ebd
docs: Change 1.15 keyboard/mouse CEF crash fixed via main-thread disp…
M3gA-Mind Jun 3, 2026
92efb08
feat(notch): always-visible status pill (Ready/Listening/Processing)
M3gA-Mind Jun 3, 2026
191bb4b
fix(voice): force English STT + fuzzy wake-word match (Hey Tiny now t…
M3gA-Mind Jun 3, 2026
c53031f
docs: fine-tuning backlog from live testing (listening window, mouse,…
M3gA-Mind Jun 3, 2026
39a1b91
chore: apply pre-push format/lint auto-fixes
M3gA-Mind Jun 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 75 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 8 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -205,16 +205,23 @@ tokio-tungstenite = { version = "0.24", default-features = false, features = ["c
# AppContainer / process-jail backend in `openhuman::cwd_jail`.
# Feature list mirrors the Win32 surface used by cwd_jail/windows.rs:
# AppContainer profile APIs, ACL editing, STARTUPINFOEXW process spawn,
# and the GENERIC_* file access masks.
# and the GENERIC_* file access masks. `Win32_System_Com` is used by the
# UIA accessibility backend (`accessibility::uia_interact`) to initialise COM
# on the worker thread before creating the UI Automation client.
windows-sys = { version = "0.61", features = [
"Win32_Foundation",
"Win32_Security",
"Win32_Security_Authorization",
"Win32_Security_Isolation",
"Win32_Storage_FileSystem",
"Win32_System_Com",
"Win32_System_Memory",
"Win32_System_Threading",
] }
# Microsoft UI Automation (UIA) bindings — the Windows backend for the
# `ax_interact` tool (`accessibility::uia_interact`). Safe Rust wrappers over
# the UIA COM API; the Windows analogue of the macOS AXUIElement Swift helper.
uiautomation = "0.25"

[target.'cfg(not(windows))'.dependencies]
# macOS / Linux: keep rustls + Mozilla webpki-roots — the historical
Expand Down
83 changes: 79 additions & 4 deletions app/src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

72 changes: 72 additions & 0 deletions app/src-tauri/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ mod meet_call;
mod meet_scanner;
mod meet_video;
mod native_notifications;
#[cfg(target_os = "macos")]
mod notch_window;
mod notification_settings;
mod process_kill;
mod process_recovery;
Expand Down Expand Up @@ -915,6 +917,33 @@ fn mascot_native_window_is_open() -> bool {
false
}

/// Show the notch activity indicator. macOS only — transparent NSPanel + WKWebView
/// anchored to the top-centre of the primary screen. Displays live voice and
/// agent status (listening, thinking, executing) in a pill that emerges from
/// the physical notch on supported MacBook Pros.
#[tauri::command]
fn notch_window_show(app: AppHandle<AppRuntime>) -> Result<(), String> {
log::info!("[notch-window] show requested");
#[cfg(target_os = "macos")]
{
return notch_window::show(&app);
}
#[cfg(not(target_os = "macos"))]
{
let _ = app;
Ok(()) // No-op on non-macOS
}
}

/// Hide the notch activity indicator.
#[tauri::command]
fn notch_window_hide(_app: AppHandle<AppRuntime>) -> Result<(), String> {
log::info!("[notch-window] hide requested");
#[cfg(target_os = "macos")]
notch_window::hide();
Ok(())
}

/// Hide or show the OS top-level main-window frame on Windows by enumerating
/// this process's top-level windows and matching the visible
/// `Chrome_WidgetWin_1` host. `WebviewWindow::hwnd()` from the vendored CEF
Expand Down Expand Up @@ -2761,6 +2790,47 @@ pub fn run() {
// let _ = window.show();
// }

// Notch activity indicator: transparent pill at the top-centre of
// the primary screen. Shows live voice / agent state. macOS only
// (physical notch or menu-bar HUD on older hardware).
#[cfg(target_os = "macos")]
if let Err(err) = notch_window::show(&app.handle()) {
log::warn!("[notch-window] auto-show on startup failed: {err}");
}

// Synthetic-input main-thread executor. enigo's macOS keyboard-layout
// lookup (TSMGetInputSourceProperty) MUST run on the app main thread
// or it traps (`_dispatch_assert_queue_fail`/EXC_BREAKPOINT) and
// crashes the CEF host (Change 1.15, confirmed via crash report). The
// keyboard/mouse tools run on tokio workers, so they dispatch their
// enigo ops here via the native registry; we run each on the real
// main thread through `run_on_main_thread`.
{
use openhuman_core::core::event_bus::register_native_global;
use openhuman_core::openhuman::tools::{
MainThreadInputOp, INPUT_ON_MAIN_THREAD_METHOD,
};
let input_app = app.handle().clone();
register_native_global::<MainThreadInputOp, Result<String, String>, _, _>(
INPUT_ON_MAIN_THREAD_METHOD,
move |req| {
let input_app = input_app.clone();
async move {
let (tx, rx) = tokio::sync::oneshot::channel();
let run = req.run;
input_app
.run_on_main_thread(move || {
let _ = tx.send((run)());
})
.map_err(|e| format!("run_on_main_thread dispatch failed: {e}"))?;
rx.await
.map_err(|_| "main-thread input op was cancelled".to_string())
}
},
);
log::info!("[computer] registered main-thread synthetic-input executor");
}

// Tray icon setup moved to RunEvent::Ready (see below) — GTK is only
// initialized after the event loop starts, so we must delay tray creation
// until the Ready event fires. Creating the tray here would panic on
Expand Down Expand Up @@ -3108,6 +3178,8 @@ pub fn run() {
native_notifications::show_native_notification,
mascot_window_show,
mascot_window_hide,
notch_window_show,
notch_window_hide,
file_logging::reveal_logs_folder,
file_logging::logs_folder_path,
workspace_paths::open_workspace_path,
Expand Down
Loading