fox-desktop/docs/hud-bridge-integration.md

2.8 KiB

Fox HUD — Electron Bridge Integration

Änderungen in ~/fox (Laravel App). Alle Punkte sind optional — ohne window.foxBridge (normaler Browser) läuft das HUD unverändert weiter.

1. ESC → HUD schließen

In fox-hud.blade.php oder dem HUD-JavaScript:

document.addEventListener('keydown', (e) => {
  if (e.key === 'Escape') window.foxBridge?.hideHud();
});

2. Mac-Aktionen in onAction()

Im bestehenden onAction() Handler am Anfang ergänzen:

if (payload.action === 'spotify_play')  { await window.foxBridge?.macCommand('spotify_play'); return; }
if (payload.action === 'spotify_pause') { await window.foxBridge?.macCommand('spotify_pause'); return; }
if (payload.action === 'spotify_next')  { await window.foxBridge?.macCommand('spotify_next'); return; }
if (payload.action === 'spotify_prev')  { await window.foxBridge?.macCommand('spotify_prev'); return; }
if (payload.action === 'mail_open')     { await window.foxBridge?.macCommand('mail_open'); return; }
if (payload.action === 'calendar_open') { await window.foxBridge?.macCommand('calendar_open'); return; }
if (payload.action === 'notes_open')    { await window.foxBridge?.macCommand('notes_open'); return; }
if (payload.action === 'volume_up')     { await window.foxBridge?.macCommand('volume_up'); return; }
if (payload.action === 'volume_down')   { await window.foxBridge?.macCommand('volume_down'); return; }
if (payload.action === 'screenshot')    { await window.foxBridge?.macCommand('screenshot'); return; }

if (payload.action === 'open_url' && payload.url) {
  await window.foxBridge?.macCommand('open:' + payload.url);
  return;
}
if (payload.action === 'open_app' && payload.app) {
  await window.foxBridge?.macCommand('app:' + payload.app);
  return;
}
if (payload.action === 'save_desktop' && payload.filename) {
  await window.foxBridge?.macCommand('save:' + JSON.stringify({
    filename: payload.filename,
    content: payload.content || '',
  }));
  return;
}

3. Nachrichten senden (optional)

Wenn Nachrichten direkt über Electron statt Livewire gesendet werden sollen:

window.foxBridge?.sendMessage(text);

4. Laravel Route für /fox/message

In routes/api.php oder routes/web.php:

Route::post('/fox/message', function (\Illuminate\Http\Request $request) {
    $text = $request->input('text', '');
    if (empty(trim($text))) {
        return response()->json(['error' => 'Kein Text'], 400);
    }
    $userMessage = app(\App\Services\FoxAgent::class)
        ->recordUserMessage($text, ['source' => 'electron']);
    dispatch(fn() => app(\App\Services\FoxAgent::class)
        ->processUserMessage($userMessage));
    return response()->json(['status' => 'ok']);
})->middleware('api');

5. Electron erkennen

const isElectron = typeof window.foxBridge !== 'undefined';