#!/usr/bin/env bash set -euo pipefail fail() { printf 'focus-session expiry: %s\n' "$1" >&2 exit 1 } cleanup() { qs ipc call focus end >/dev/null 2>&1 || true } trap cleanup EXIT qs ipc call focus end >/dev/null 2>&1 || true qs ipc call focus start >/dev/null state_file=$(find "${XDG_STATE_HOME:-$HOME/.local/state}/quickshell/by-shell" -name focus-session.json -print -quit) [[ -n "$state_file" ]] || fail 'persistent state file was not created' expired=$(mktemp "${state_file}.expired.XXXXXX") jq '.paused = false | .deadlineMs = 1' "$state_file" >"$expired" chmod --reference="$state_file" "$expired" mv "$expired" "$state_file" qs kill >/dev/null for _ in $(seq 1 50); do qs list 2>&1 | rg -q '^Instance ' || break sleep 0.1 done if qs list 2>&1 | rg -q '^Instance '; then fail 'shell did not stop before restart' fi quickshell --daemonize >/dev/null status="" for _ in $(seq 1 60); do status=$(qs ipc call focus status 2>/dev/null || true) if jq -e '.active == false' <<<"$status" >/dev/null 2>&1; then break fi sleep 0.2 done jq -e '.active == false and .caffeine == false and .doNotDisturb == false' <<<"$status" >/dev/null || fail 'expired session was not completed and released' trap - EXIT printf 'focus-session expiry: PASS\n'