O Hyprland crashou ou você reiniciou ele, tudo parece normal, ai você reataca num pane do tmux, roda hyprctl monitors e toma um erro de socket. O caminho do socket no erro tem a assinatura da instância antiga, não a nova.

Couldn't connect to /run/user/1000/hypr/0002f148c9a4fe421a9d33c0faa5528cdc411e62_1772832671_1697803855/.socket.sock. (4)

O motivo é que o Hyprland se identifica com HYPRLAND_INSTANCE_SIGNATURE, uma variavel de ambiente definida na inicializacao. Quando ele crasha e reinicia, gera uma nova. Seus panes do tmux foram criados antes do crash, entao ainda tem o valor antigo no ambiente deles.

Voce pode conhecer o update-environment do tmux. Adicionar HYPRLAND_INSTANCE_SIGNATURE la atualiza a tabela interna de ambiente do tmux quando voce reconecta, mas nao empurra o valor pras shells que ja estao rodando. Esses processos tem a propria copia, definida no momento em que foram criados, e o tmux nao consegue entrar e mudar isso.

A solucao e nao depender da variavel de ambiente dentro da shell. Em vez disso, resolver dinamicamente toda vez que hyprctl for chamado, olhando o que o Hyprland escreveu no disco.

No fish, voce envolve o hyprctl com uma funcao. O fish carrega funcoes de ~/.config/fish/functions/ automaticamente, entao um arquivo chamado hyprctl.fish la vai sobrescrever o binario real:

function hyprctl
    set -lx HYPRLAND_INSTANCE_SIGNATURE (command ls -t $XDG_RUNTIME_DIR/hypr/ 2>/dev/null | head -1)
    command hyprctl $argv
end

ls -t ordena por data de modificacao, entao o diretorio mais recentemente tocado, que e a instancia rodando, vem primeiro. command hyprctl chama o binario real, ignorando o wrapper pra nao entrar em loop.

No bash a mesma ideia, como funcao no seu .bashrc:

hyprctl() {
    HYPRLAND_INSTANCE_SIGNATURE=$(command ls -t "$XDG_RUNTIME_DIR/hypr/" 2>/dev/null | head -1) \
        command hyprctl "$@"
}

Uma coisa que vale mencionar pras duas shells: ls pode estar com alias pra algo como eza ou lsd. Essas ferramentas nem sempre se comportam igual com -t e voce vai receber resultado errado. command ls ignora qualquer alias ou funcao e chama o binario real diretamente, entao use isso.