| # app.py — Settings UI patch for sensorium companion | |
| # | |
| # PATCH v1 — Sensorium Companion Digest: | |
| # - Add Settings toggles: "Enable screen awareness", "Enable desktop audio awareness" | |
| # - Add audio source selector: auto / loopback / microphone / off | |
| # - Add sensorium storage status display | |
| # | |
| # This file contains the new helper functions and the Settings tab UI patch. | |
| # To apply: add these functions to app.py and add the UI elements to the Settings tab. | |
| # ================================================================== | |
| # NEW SETTINGS HELPERS — Sensorium toggles | |
| # ================================================================== | |
| def toggle_screen_awareness(enabled): | |
| try: | |
| result = daemon.set_screen_awareness(bool(enabled)) | |
| return f"Screen awareness: {result.get('screen_awareness', '?')}" | |
| except Exception as e: | |
| return f"Error: {e}" | |
| def toggle_audio_awareness(enabled): | |
| try: | |
| result = daemon.set_audio_awareness(bool(enabled)) | |
| # Also start/stop audio capture | |
| if result.get("audio_awareness") == "on": | |
| if hasattr(daemon, "start_audio_capture"): | |
| daemon.start_audio_capture() | |
| else: | |
| if hasattr(daemon, "stop_audio_capture"): | |
| daemon.stop_audio_capture() | |
| return f"Audio awareness: {result.get('audio_awareness', '?')}" | |
| except Exception as e: | |
| return f"Error: {e}" | |
| def get_sensorium_status(): | |
| try: | |
| storage = daemon.tool_sensorium_storage_status() | |
| audio = daemon.tool_audio_status() | |
| screen_on = getattr(daemon, "_screen_awareness", False) | |
| audio_on = getattr(daemon, "_audio_awareness", False) | |
| lines = ["**Sensorium Status**\n"] | |
| lines.append(f"- Screen awareness: `{'on' if screen_on else 'off'}`") | |
| lines.append(f"- Audio awareness: `{'on' if audio_on else 'off'}`") | |
| lines.append(f"- Audio capture active: `{'yes' if audio.get('capture_active') else 'no'}`") | |
| lines.append(f"- Whisper loaded: `{'yes' if audio.get('whisper_loaded') else 'no'}`") | |
| lines.append(f"- Storage: `{storage.get('size_mb', '?')}MB` ({storage.get('file_count', '?')} files)") | |
| if audio.get("last_transcript"): | |
| lines.append(f"- Last transcript: `{audio['last_transcript'][:80]}...`") | |
| return "\n".join(lines) | |
| except Exception as e: | |
| return f"⚠️ Sensorium status error: {e}" | |
| def do_sensorium_cleanup(): | |
| try: | |
| result = daemon.tool_sensorium_cleanup(max_age_hours=24) | |
| return f"Cleaned up {result.get('deleted', 0)} files" | |
| except Exception as e: | |
| return f"Error: {e}" | |
| # ================================================================== | |
| # SETTINGS TAB UI ADDITION | |
| # Add this block inside the Settings tab in app.py, after the existing | |
| # audio source dropdown section: | |
| # | |
| # with gr.Accordion("Sensorium — Screen & Audio Awareness", open=True): | |
| # gr.Markdown("### 🖥️ Screen & Audio Awareness") | |
| # sensorium_status_md = gr.Markdown(value=get_sensorium_status()) | |
| # refresh_sensorium_btn = gr.Button("⟳ Refresh Sensorium", size="sm") | |
| # with gr.Row(): | |
| # screen_toggle = gr.Checkbox(label="Enable screen awareness (OCR)", value=False) | |
| # apply_screen_btn = gr.Button("Apply", size="sm") | |
| # with gr.Row(): | |
| # audio_toggle = gr.Checkbox(label="Enable desktop audio awareness (loopback)", value=False) | |
| # apply_audio_btn = gr.Button("Apply", size="sm") | |
| # with gr.Row(): | |
| # sensorium_cleanup_btn = gr.Button("🧹 Cleanup old files", size="sm") | |
| # sensorium_result = gr.Textbox(label="Result", interactive=False) | |
| # | |
| # # Event handlers | |
| # apply_screen_btn.click(fn=toggle_screen_awareness, inputs=[screen_toggle], outputs=[sensorium_result]) | |
| # apply_audio_btn.click(fn=toggle_audio_awareness, inputs=[audio_toggle], outputs=[sensorium_result]) | |
| # refresh_sensorium_btn.click(fn=get_sensorium_status, outputs=[sensorium_status_md]) | |
| # sensorium_cleanup_btn.click(fn=do_sensorium_cleanup, outputs=[sensorium_result]) | |