1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
#!/bin/bash
# desktop-assistant: restart the voice loop, detached from the terminal.
# Copyright (C) 2026 Danilo M. <danix@danix.xyz>
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 as published
# by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# restart.sh: SIGTERM any running assistant.py (whisper-server and amixer
# die with it through PDEATHSIG), SIGKILL after 10 s, then start a new one
# in its own session, logging where the Hyprland autostart does. The
# quickshell overlay (OVERLAY, default the quickshell repo next to this one)
# is restarted the same way. Run it from the login session: it needs its
# audio, bus, Wayland display and XDG_RUNTIME_DIR.
set -eu
dir=$(cd "$(dirname "$0")" && pwd)
log="${XDG_RUNTIME_DIR:?not in a login session}/desktop-assistant.log"
overlay=$(realpath -m "${OVERLAY:-$dir/../quickshell/assistant}")
pat='^\S*python3 (-u )?\S*assistant\.py'
qpat="^qs -p $overlay\$"
stop() {
pkill -u "$USER" -f "$1" || return 0
for _ in $(seq 50); do
pgrep -u "$USER" -f "$1" >/dev/null || return 0
sleep 0.2
done
pkill -KILL -u "$USER" -f "$1" && sleep 0.5 || true
}
stop "$pat"
stop "$qpat"
cd "$dir"
setsid -f python3 -u "$dir/assistant.py" >>"$log" 2>&1 </dev/null
setsid -f qs -p "$overlay" >/dev/null 2>&1 </dev/null
sleep 0.5
pgrep -u "$USER" -af "$pat" || { echo "assistant not running, see $log" >&2; exit 1; }
pgrep -u "$USER" -af "$qpat" || { echo "overlay not running: qs -p $overlay" >&2; exit 1; }
|