Сповіщення
cmux підтримує сповіщення на робочому столі, тож AI-агенти та скрипти можуть повідомляти вас, коли їм потрібна ваша увага.
Життєвий цикл
- Отримано: сповіщення з'являється на панелі, спрацьовує сповіщення на робочому столі (якщо його не придушено)
- Непрочитано: на вкладці робочого простору показується значок
- Прочитано: очищається, коли ви переглядаєте цей робочий простір
- Очищено: прибрано з панелі
Придушення
Сповіщення на робочому столі не показуються, коли:
- Вікно cmux у фокусі
- Робочий простір, що надсилає сповіщення, активний
- Панель сповіщень відкрита
Панель сповіщень
Натисніть ⌘⇧I, щоб відкрити панель сповіщень. Клацніть сповіщення, щоб перейти до відповідного робочого простору. Натисніть ⌘⇧U, щоб перейти безпосередньо до робочого простору з найновішим непрочитаним сповіщенням.
Власна команда
Виконуйте команду оболонки щоразу, коли планується сповіщення. Задайте її в Settings > App > Notification Command. Команда виконується через /bin/sh -c з такими змінними середовища:
| Змінна | Опис |
|---|---|
CMUX_NOTIFICATION_TITLE | Заголовок сповіщення (назва робочого простору або застосунку) |
CMUX_NOTIFICATION_SUBTITLE | Підзаголовок сповіщення |
CMUX_NOTIFICATION_BODY | Текст сповіщення |
# Text-to-speech
say "$CMUX_NOTIFICATION_TITLE"
# Custom sound file
afplay /path/to/sound.aiff
# Log to file
echo "$CMUX_NOTIFICATION_TITLE: $CMUX_NOTIFICATION_BODY" >> ~/notifications.logКоманда виконується незалежно від вибору системного звуку. Установіть для вибору звуку значення "None", щоб використовувати лише власну команду, або залиште обидва варіанти для системного звуку разом із власною дією.
Хуки сповіщень
cmux.json може визначати хуки сповіщень, які отримують кожну політику сповіщення як JSON через stdin. Кожен хук повертає JSON через stdout. За замовчуванням хуки вимкнені; cmux запускає їх лише тоді, коли notifications.hooks містить хоча б один увімкнений хук. cmux застосовує повернений текст і ефекти, тому хуки можуть фільтрувати банери, зберігати або пропускати історію бічної панелі, запускати звуки чи зупиняти наступні хуки.
{
"notifications": {
"hooks": [
{
"id": "quiet-docs",
"command": "sed 's/"desktop":true/"desktop":false/'",
"timeoutSeconds": 20
}
]
}
}{
"version": 1,
"notification": {
"workspaceId": "3B3F0D83-...",
"surfaceId": "7E9C1A02-...",
"title": "Codex",
"subtitle": "Waiting",
"body": "Agent needs input"
},
"context": {
"cwd": "/path/to/project",
"configPath": "/path/to/project/.cmux/cmux.json",
"hookId": "quiet-docs",
"appFocused": false,
"focusedPanel": false
},
"agent": {
"kind": "claude",
"category": "turn-complete",
"pending": false,
"isSubagent": true
},
"effects": {
"record": true,
"markUnread": true,
"reorderWorkspace": true,
"desktop": true,
"sound": true,
"command": true,
"paneFlash": true
}
}Хуки успадковуються з глобального файлу ~/.config/cmux/cmux.json і проєктних файлів .cmux/cmux.json від батьківських каталогів до поточного workspace. Проєктні хуки перед запуском використовують той самий запит довіри, що й інші проєктні команди cmux.json. Банери схвалення Feed також проходять через ці хуки; вимкнення desktop приховує нативний банер, але залишає елемент Feed доступним у cmux. Установіть notifications.hooksMode на replace у конфігурації проєкту, щоб ігнорувати успадковані хуки. Якщо хук завершується помилкою, перевищує час очікування або повертає недійсний JSON, cmux використовує стандартну поведінку сповіщень і показує попередження про помилку хука.
Agent-event context
Notifications that originate from an agent completion signal carry a read-only agent object: kind is the stable lowercase agent slug (claude, codex, grok, …), category is turn-complete, needs-permission, or idle-reminder, pending is true when the turn ended with background work still running, and isSubagent is true for nested subagent sessions. The object is omitted for non-agent notifications, and the same values are exported to the hook process as CMUX_NOTIFICATION_AGENT_KIND, CMUX_NOTIFICATION_AGENT_CATEGORY, CMUX_NOTIFICATION_AGENT_PENDING, and CMUX_NOTIFICATION_AGENT_IS_SUBAGENT. For example, this hook silences the banner, sound, and pane flash for subagent completions while leaving everything else untouched:
{
"notifications": {
"hooks": [
{
"id": "mute-subagent-completions",
"command": "if [ \"${CMUX_NOTIFICATION_AGENT_IS_SUBAGENT-0}\" = \"1\" ] && [ \"$CMUX_NOTIFICATION_AGENT_CATEGORY\" = \"turn-complete\" ]; then printf '{\"effects\":{\"desktop\":false,\"sound\":false,\"paneFlash\":false}}'; fi"
}
]
}
}With no hooks configured, notification behavior is exactly cmux's built-in default — configuring a hook is the explicit opt-in that hands the delivery decision to your script. Note that cmux's built-in subagent suppression (automation.suppressSubagentNotifications, on by default) drops subagent completion events before they reach hooks; turn it off if your hook should see subagent events and make its own decision.
Надсилання сповіщень
CLI
cmux notify --title "Task Complete" --body "Your build finished"
cmux notify --title "Claude Code" --subtitle "Waiting" --body "Agent needs input"OSC 777 (простий)
Протокол RXVT використовує фіксований формат із заголовком і текстом:
printf '\e]777;notify;My Title;Message body here\a'notify_osc777() {
local title="$1"
local body="$2"
printf '\e]777;notify;%s;%s\a' "$title" "$body"
}
notify_osc777 "Build Complete" "All tests passed"OSC 99 (розширений)
Протокол Kitty підтримує підзаголовки та ID сповіщень:
# Format: ESC ] 99 ; <params> ; <payload> ESC \
# Simple notification
printf '\e]99;i=1;e=1;d=0:Hello World\e\\'
# With title, subtitle, and body
printf '\e]99;i=1;e=1;d=0;p=title:Build Complete\e\\'
printf '\e]99;i=1;e=1;d=0;p=subtitle:Project X\e\\'
printf '\e]99;i=1;e=1;d=1;p=body:All tests passed\e\\'| Можливість | OSC 99 | OSC 777 |
|---|---|---|
| Заголовок + текст | Так | Так |
| Підзаголовок | Так | Ні |
| ID сповіщення | Так | Ні |
| Складність | Вища | Нижча |
Хуки Claude Code
cmux інтегрується з Claude Code через хуки, щоб сповіщати вас про завершення завдань.
1. Створіть скрипт хука
#!/bin/bash
# Outside cmux there is no socket to talk to, so do nothing.
[ -S /tmp/cmux.sock ] || exit 0
payload=$(cat)
field() { printf '%s' "$payload" | jq -r "$1 // empty"; }
event=$(field .hook_event_name)
if [ "$event" = "Stop" ]; then
cmux notify --title "Claude Code" --body "Session complete"
elif [ "$event" = "SubagentStop" ]; then
cmux notify --title "Claude Code" --body "Agent finished"
fichmod +x ~/.claude/hooks/cmux-notify.sh2. Налаштуйте Claude Code
{
"hooks": {
"SubagentStop": [
{
"hooks": [{ "type": "command", "command": "~/.claude/hooks/cmux-notify.sh" }]
}
],
"Stop": [
{
"hooks": [{ "type": "command", "command": "~/.claude/hooks/cmux-notify.sh" }]
}
]
}
}Перезапустіть Claude Code, щоб застосувати хуки.
GitHub Copilot CLI
Copilot CLI підтримує хуки, які виконують команди оболонки на етапах життєвого циклу, як-от надсилання запиту, зупинка агента та помилки.
{
"hooks": {
"userPromptSubmitted": [
{
"type": "command",
"bash": "if command -v cmux &>/dev/null; then cmux set-status copilot_cli Running; fi",
"timeoutSec": 3
}
],
"agentStop": [
{
"type": "command",
"bash": "if command -v cmux &>/dev/null; then cmux notify --title 'Copilot CLI' --body 'Done'; cmux set-status copilot_cli Idle; fi",
"timeoutSec": 5
}
],
"errorOccurred": [
{
"type": "command",
"bash": "if command -v cmux &>/dev/null; then cmux notify --title 'Copilot CLI' --subtitle 'Error' --body 'An error occurred'; cmux set-status copilot_cli Error; fi",
"timeoutSec": 5
}
],
"sessionEnd": [
{
"type": "command",
"bash": "if command -v cmux &>/dev/null; then cmux clear-status copilot_cli; fi",
"timeoutSec": 3
}
]
}
}Для хуків на рівні репозиторію створіть файл .github/hooks/notify.json з такою самою структурою:
{
"version": 1,
"hooks": {
"userPromptSubmitted": [ ... ],
"agentStop": [ ... ]
}
}Приклади інтеграції
Сповіщення після тривалої команди
# Add to your shell config
notify-after() {
"$@"
local exit_code=$?
if [ $exit_code -eq 0 ]; then
cmux notify --title "✓ Command Complete" --body "$1"
else
cmux notify --title "✗ Command Failed" --body "$1 (exit $exit_code)"
fi
return $exit_code
}
# Usage: notify-after npm run buildPython
import sys
def notify(title: str, body: str):
"""Send OSC 777 notification."""
sys.stdout.write(f'\x1b]777;notify;{title};{body}\x07')
sys.stdout.flush()
notify("Script Complete", "Processing finished")Node.js
function notify(title, body) {
process.stdout.write(`\x1b]777;notify;${title};${body}\x07`);
}
notify('Build Done', 'webpack finished');Передавання через tmux
Якщо ви використовуєте tmux всередині cmux, увімкніть прохідний режим:
set -g allow-passthrough onprintf '\ePtmux;\e\e]777;notify;Title;Body\a\e\\'