--- name: notify_desktop kind: function lang: go domain: infra version: "1.0.0" purity: impure signature: "func NotifyDesktop(title, body string) error" description: "Lanza una notificacion de escritorio en Linux via el binario notify-send (libnotify). Degradacion limpia: si notify-send no esta en el PATH devuelve nil sin error (no es fallo que la maquina no tenga servidor de notificaciones). Cuando existe ejecuta: notify-send --app-name=fleetview --urgency=normal -- <body>, usando -- para que un texto que empiece por - no se interprete como flag. title vacio cae a un default; body puede ir vacio." tags: [orchestration, notify, infra, desktop, libnotify] uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: ["fmt", "os/exec"] params: - name: title desc: "titulo de la notificacion; si es cadena vacia usa el default 'Notificación'" - name: body desc: "cuerpo de la notificacion; puede ir vacio (notify-send lo acepta)" output: "error: nil si la notificacion se mostro o si notify-send no esta instalado (degradacion silenciosa); error envuelto con contexto solo si la ejecucion real de notify-send falla" tested: false tests: [] test_file_path: "" file_path: "functions/infra/notify_desktop.go" --- ## Ejemplo ```go // Avisar al usuario en el escritorio de que un agente termino. err := infra.NotifyDesktop("✅ Agente terminó", "EDA dataset X — revísalo") if err != nil { // notify-send existe pero fallo al ejecutarse log.Printf("no se pudo notificar: %v", err) } // En una maquina sin notify-send, err es nil y la notificacion se omite. ``` ## Cuando usarla Usala para avisar al usuario en el escritorio cuando un proceso largo o un agente termina su trabajo (fin de un EDA, build, deploy, o tarea desatendida del orquestador). Es el toque final tras una operacion que el humano no esta mirando en directo: dispara la notificacion y sigue, sin preocuparte de si la maquina destino tiene servidor de notificaciones. ## Gotchas - **Solo Linux con servidor de notificaciones (libnotify).** Depende del binario `notify-send`; en otros SO no aplica. - **Headless / sin DBUS no muestra nada pero NO falla.** Si `notify-send` no esta en el PATH, devuelve `nil` (degradacion silenciosa): el caller no se rompe por carecer de notificaciones. - **Requiere sesion grafica activa.** Aunque `notify-send` exista, sin una sesion grafica con DBUS la notificacion puede no aparecer; en ese caso `Run()` puede devolver error real, que se devuelve envuelto. - **`--` antes de los argumentos posicionales** evita que un `title`/`body` que empiece por `-` se interprete como flag. No lo quites.