Skip to content

Устранение неполадок: уведомления не отображаются, фокус не определяется и другие проблемы

Чему вы научитесь

  • Быстро определить причину отсутствия уведомлений
  • Решить проблемы с разрешениями уведомлений macOS
  • Диагностировать проблемы с определением фокуса
  • Исправить ошибки формата файла конфигурации
  • Понять различия функциональности на разных платформах

Ваша текущая проблема

AI выполнил задачу, но вы не получили уведомление; или после нажатия на уведомление терминал не выводится на передний план. Вы не знаете, в чём проблема, и не знаете, с чего начать диагностику.

Когда использовать этот метод

  • При первом использовании после установки плагина вы не получили никаких уведомлений
  • После обновления плагина или системы уведомления перестали работать
  • Вы хотите отключить определённые поведения уведомлений, но конфигурация, кажется, не применяется
  • При переходе с macOS на Windows/Linux вы обнаружили, что некоторые функции недоступны

Основная идея

Рабочий процесс opencode-notify довольно прост, но включает множество этапов: OpenCode SDK → прослушивание событий → логика фильтрации → системные уведомления. Любая проблема на любом этапе может привести к тому, что уведомления не будут отображаться.

Ключ к диагностике — последовательно проверять каждый этап, начиная с наиболее вероятных причин. 80% проблем можно решить с помощью следующих 5 категорий:

  1. Уведомления не отображаются — самая распространённая проблема
  2. Определение фокуса не работает (только macOS)
  3. Конфигурация не применяется — ошибки формата JSON или неправильный путь
  4. Звук не воспроизводится (только macOS)
  5. Различия платформ — некоторые функции не поддерживаются

Проблема 1: Уведомления не отображаются

Это самая распространённая проблема, возможные причины — 6. Проверьте по порядку:

1.1 Проверьте, правильно ли установлен плагин

Симптомы: OpenCode работает нормально, но вы никогда не получали никаких уведомлений.

Шаги диагностики:

bash
# Проверьте, установлен ли плагин
ls ~/.opencode/plugin/kdco-notify

# Если не существует, переустановите
ocx add kdco/notify

Что вы должны увидеть: Существование каталога ~/.opencode/plugin/kdco-notify, содержащего файлы package.json и src/notify.ts и т. д.

Проверка при ручной установке

Если вы используете ручную установку, убедитесь:

  1. Зависимости установлены: npm install node-notifier detect-terminal
  2. Файлы плагина находятся в правильном месте: ~/.opencode/plugin/
  3. OpenCode перезапущен (изменения плагина требуют перезапуска)

1.2 Проверьте разрешения уведомлений macOS

Симптомы: Только для пользователей macOS, плагин установлен, но вы никогда не получали уведомлений.

Причина: macOS требует явного разрешения для терминальных приложений на отправку уведомлений.

Шаги диагностики:

bash
# 1. Откройте системные настройки
# macOS Ventura и выше: Системные настройки → Уведомления и режим фокуса
# macOS старые версии: Системные настройки → Уведомления

# 2. Найдите ваше терминальное приложение (например, Ghostty, iTerm2, Terminal.app)
# 3. Убедитесь, что "Разрешить уведомления" включено
# 4. Убедитесь, что "На экране блокировки" и "Показывать баннер на экране блокировки" включены

Что вы должны увидеть: Ваше терминальное приложение в настройках уведомлений, и переключатель "Разрешить уведомления" зелёный.

Распространённая ошибка

Сам OpenCode не появится в настройках уведомлений, вам нужно авторизовать терминальное приложение (Ghostty, iTerm2, Terminal.app и т. д.), а не OpenCode.

1.3 Проверьте настройки тихого режима

Симптомы: Нет уведомлений в определённое время, уведомления есть в другое время.

Причина: В файле конфигурации включён тихий режим.

Шаги диагностики:

bash
# Проверьте файл конфигурации
cat ~/.config/opencode/kdco-notify.json

Решение:

json
{
  "quietHours": {
    "enabled": false,  // Измените на false, чтобы отключить тихий режим
    "start": "22:00",
    "end": "08:00"
  }
}

Что вы должны увидеть: quietHours.enabled равно false, или текущее время не находится в тихом режиме.

Тихий режим через полночь

Тихий режим поддерживает переход через полночь (например, 22:00-08:00), это правильное поведение. Если текущее время между 22:00 и 08:00 следующего дня, уведомления будут подавлены.

1.4 Проверьте фокус окна терминала

Симптомы: Когда вы смотрите на терминал, вы не получаете уведомления.

Причина: Это ожидаемое поведение, не ошибка. Механизм определения фокуса подавляет уведомления, когда вы смотрите на терминал, чтобы избежать повторных напоминаний.

Шаги диагностики:

Проверьте, сфокусирован ли терминал:

  1. Переключитесь на другое приложение (например, браузер, VS Code)
  2. Пусть AI выполнит задачу
  3. Дождитесь завершения задачи

Что вы должны увидеть: В других приложениях уведомления отображаются нормально.

Описание определения фокуса

Определение фокуса — встроенное поведение, его нельзя отключить через конфигурацию. По умолчанию плагин подавляет уведомления, когда терминал сфокусирован, чтобы избежать повторных напоминаний. Это ожидаемое поведение дизайна.

1.5 Проверьте фильтрацию дочерних сессий

Симптомы: AI выполнил несколько подзадач, но вы не получили уведомление для каждой подзадачи.

Причина: Это ожидаемое поведение. По умолчанию плагин уведомляет только о родительских сессиях, а не о дочерних, чтобы избежать бомбардировки уведомлениями.

Шаги диагностики:

Понимание родительских и дочерних сессий:

  • Родительская сессия: задача, которую вы напрямую попросили AI выполнить (например, "оптимизировать кодовую базу")
  • Дочерняя сессия: подзадачи, которые AI разбил сам (например, "оптимизировать src/components", "оптимизировать src/utils")

Если вам действительно нужны уведомления о дочерних сессиях:

json
{
  "notifyChildSessions": true
}

Что вы должны увидеть: Вы получаете уведомление при завершении каждой дочерней сессии.

Рекомендуемый подход

Если вы не отслеживаете несколько параллельных задач, сохраните notifyChildSessions: false, получайте только уведомления о родительских сессиях.

1.6 Проверьте, не был ли удалён или переименован файл конфигурации

Симптомы: Ранее были уведомления, внезапно перестали отображаться.

Шаги диагностики:

bash
# Проверьте, существует ли файл конфигурации
ls -la ~/.config/opencode/kdco-notify.json

Решение:

Если файл конфигурации был удалён или путь неверен, плагин будет использовать конфигурацию по умолчанию:

Удалите файл конфигурации, восстановите по умолчанию:

bash
# Удалите файл конфигурации, используйте настройки по умолчанию
rm ~/.config/opencode/kdco-notify.json

Что вы должны увидеть: Плагин снова начинает отправлять уведомления (используя конфигурацию по умолчанию).


Проблема 2: Определение фокуса не работает (только macOS)

Симптомы: Когда вы смотрите на терминал, вы всё равно получаете уведомления, определение фокуса, кажется, не работает.

2.1 Проверьте, правильно ли определяется терминал

Причина: Плагин использует библиотеку detect-terminal для автоматического определения терминала, если определение не удаётся, определение фокуса не работает.

Шаги диагностики:

bash
# Проверьте, нормально ли работает определение терминала
node -e "console.log(require('detect-terminal')())"

Что вы должны увидеть: Вывод названия вашего терминала (например, ghostty, iterm2 и т. д.).

Если вывод пуст, определение терминала не удалось.

2.2 Укажите тип терминала вручную

Если автоматическое определение не удалось, можно указать вручную:

json
{
  "terminal": "ghostty"  // Замените на название вашего терминала
}

Поддерживаемые названия терминалов (в нижнем регистре):

ТерминалНазваниеТерминалНазвание
GhosttyghosttyKittykitty
iTerm2iterm2 или itermWezTermwezterm
AlacrittyalacrittymacOS Terminalterminal или apple_terminal
HyperhyperWarpwarp
Терминал VS CodevscodeVS Code Insidersvscode-insiders

Сопоставление имён процессов

Внутри плагина есть таблица сопоставления имён терминалов с именами процессов macOS. Если вы вручную указали terminal, убедитесь, что используете имя из таблицы сопоставления (строки 71-84).


Проблема 3: Конфигурация не применяется

Симптомы: Вы изменили файл конфигурации, но поведение плагина не изменилось.

3.1 Проверьте правильность формата JSON

Распространённые ошибки:

json
// ❌ Ошибка: отсутствуют кавычки
{
  notifyChildSessions: true
}

// ❌ Ошибка: завершающая запятая
{
  "notifyChildSessions": true,
}

// ❌ Ошибка: комментарии не поддерживаются
{
  "notifyChildSessions": true  // Это приведёт к ошибке разбора JSON
}

Правильный формат:

json
{
  "notifyChildSessions": false,
  "sounds": {
    "idle": "Glass",
    "error": "Basso",
    "permission": "Submarine"
  },
  "quietHours": {
    "enabled": false,
    "start": "22:00",
    "end": "08:00"
  }
}

Проверка формата JSON:

bash
# Используйте jq для проверки формата JSON
cat ~/.config/opencode/kdco-notify.json | jq '.'

# Если выводится форматированный JSON, формат правильный
# Если ошибка, JSON имеет проблемы

3.2 Проверьте путь к файлу конфигурации

Симптомы: Файл конфигурации создан, но плагин, кажется, его не читает.

Правильный путь:

~/.config/opencode/kdco-notify.json

Шаги диагностики:

bash
# Проверьте, существует ли файл конфигурации
ls -la ~/.config/opencode/kdco-notify.json

# Если не существует, создайте каталог и файл
mkdir -p ~/.config/opencode
cat > ~/.config/opencode/kdco-notify.json << 'EOF'
{
  "notifyChildSessions": false
}
EOF

3.3 Перезапустите OpenCode

Причина: Плагин загружает конфигурацию один раз при запуске, после изменения требуется перезапуск.

Шаги диагностики:

bash
# Полностью перезапустите OpenCode
# 1. Выйдите из OpenCode
# 2. Снова запустите OpenCode

Проблема 4: Звук не воспроизводится (только macOS)

Симптомы: Уведомления отображаются нормально, но звук не воспроизводится.

4.1 Проверьте правильность названия звука

Поддерживаемые звуки macOS:

Название звукаОписаниеНазвание звукаОписание
BassoБасBlowЗвук дутья
BottleЗвук бутылкиFrogЗвук лягушки
FunkФанкGlassЗвук стекла (по умолчанию для завершения задачи)
HeroГеройMorseАзбука Морзе
PingЗвук "дзынь"PopЗвук пузырька
PurrМурлыканьеSosumiSosumi
SubmarineПодводная лодка (по умолчанию для запроса разрешения)TinkЗвук "дзынь-дзынь"

Пример конфигурации:

json
{
  "sounds": {
    "idle": "Glass",      // Звук завершения задачи
    "error": "Basso",    // Звук ошибки
    "permission": "Submarine",  // Звук запроса разрешения
    "question": "Ping"   // Звук вопроса (опционально)
  }
}

4.2 Проверьте настройки громкости системы

Шаги диагностики:

bash
# Откройте Системные настройки → Звук → Громкость вывода
# Убедитесь, что звук не отключён, и громкость умеренная

4.3 Другие платформы не поддерживают пользовательские звуки

Симптомы: Пользователи Windows или Linux настроили звуки, но нет звука.

Причина: Пользовательские звуки — уникальная функция macOS, Windows и Linux не поддерживают.

Решение: Пользователи Windows и Linux будут получать уведомления, но звуки контролируются настройками системы по умолчанию, их нельзя настроить через плагин.

Звуки на Windows/Linux

Звуки уведомлений на Windows и Linux контролируются системными настройками:

  • Windows: Параметры → Система → Уведомления → Выберите звук уведомления
  • Linux: Настройки среды рабочего стола → Уведомления → Звуки

Проблема 5: Нажатие на уведомление не фокусирует (только macOS)

Симптомы: После нажатия на уведомление окно терминала не выводится на передний план.

5.1 Проверьте, успешно ли получен Bundle ID

Причина: Функция фокусировки при нажатии на уведомление требует получения Bundle ID терминала (например, com.ghostty.Ghostty), если получение не удаётся, фокусировка невозможна.

Шаги диагностики:

Плагин автоматически определяет терминал и получает Bundle ID при запуске. Если не удаётся, функция фокусировки при нажатии на уведомление недоступна.

Распространённые причины:

  1. Терминал не в таблице сопоставления (например, пользовательский терминал)
  2. Выполнение osascript не удалось (проблема с разрешениями macOS)

Решение: Укажите тип терминала вручную (см. раздел 2.2).

5.2 Проверьте разрешения системной вспомогательной технологии

Причина: macOS требует разрешение "Вспомогательные технологии" для управления окнами других приложений.

Шаги диагностики:

bash
# Откройте Системные настройки → Конфиденциальность и безопасность → Вспомогательные технологии
# Убедитесь, что у терминального приложения есть разрешение вспомогательных технологий

Что вы должны увидеть: Ваше терминальное приложение (Ghostty, iTerm2 и т. д.) в списке вспомогательных технологий, и переключатель включён.


Проблема 6: Различия функциональности платформ

Симптомы: При переходе с macOS на Windows/Linux вы обнаружили, что некоторые функции недоступны.

6.1 Таблица сравнения функций

ФункцияmacOSWindowsLinux
Нативные уведомления
Пользовательские звуки
Определение фокуса
Фокус при нажатии на уведомление
Определение терминала
Тихий режим
Уведомления дочерних сессий

Описание:

  • Windows/Linux: Поддерживаются только базовые функции уведомлений, расширенные функции (определение фокуса, фокус при нажатии, пользовательские звуки) недоступны
  • macOS: Поддерживаются все функции

6.2 Кроссплатформенная совместимость файла конфигурации

Проблема: На macOS настроен sounds, после перехода на Windows звуки не применяются.

Причина: Конфигурация sounds действует только на macOS.

Решение: Файл конфигурации можно использовать на разных платформах, плагин автоматически игнорирует неподдерживаемые элементы конфигурации. Не нужно удалять поле sounds, Windows/Linux будут тихо игнорировать.

Рекомендуемая практика

Используйте один и тот же файл конфигурации при переключении между несколькими платформами, плагин автоматически обработает различия платформ. Не нужно создавать отдельные файлы конфигурации для каждой платформы.


Итоги урока

Диагностику неполадок opencode-notify можно свести к следующим 6 категориям проблем:

  1. Уведомления не отображаются: Проверьте установку плагина, разрешения уведомлений macOS, тихий режим, фокус терминала, фильтрацию дочерних сессий, отключён ли плагин
  2. Определение фокуса не работает (macOS): Проверьте, правильно ли определяется терминал, или укажите тип терминала вручную
  3. Конфигурация не применяется: Проверьте формат JSON, путь к файлу конфигурации, перезапустите OpenCode
  4. Звук не воспроизводится (macOS): Проверьте правильность названия звука, подтвердите, что звуки поддерживаются только на macOS
  5. Нажатие на уведомление не фокусирует (macOS): Проверьте получение Bundle ID и разрешения вспомогательных технологий
  6. Различия функциональности платформ: Windows/Linux поддерживают только базовые уведомления, расширенные функции доступны только на macOS

Быстрый контрольный список:

□ Плагин правильно установлен?
□ Разрешения уведомлений macOS авторизованы?
□ Тихий режим включён?
□ Терминал сфокусирован?
□ Фильтрация дочерних сессий включена?
□ Формат JSON файла конфигурации правильный?
□ Путь к файлу конфигурации правильный?
□ OpenCode перезапущен?
□ Название звука в списке поддерживаемых (только macOS)?
□ Bundle ID получен успешно (только macOS)?
□ Громкость системы нормальная?

Предпросмотр следующего урока

В следующем уроке мы изучим Часто задаваемые вопросы.

Вы узнаете:

  • Увеличивает ли opencode-notify нагрузку на контекст диалога
  • Получите ли вы много уведомлений (бомбардировка)
  • Как временно отключить уведомления
  • Влияние на производительность и вопросы безопасности конфиденциальности

Приложение: Ссылка на исходный код

Нажмите, чтобы раскрыть расположение исходного кода

Время обновления: 2026-01-27

ФункцияПуть к файлуСтроки
Загрузка конфигурации и обработка ошибокsrc/notify.ts90-114
Определение терминалаsrc/notify.ts145-164
Выполнение osascript macOSsrc/notify.ts120-133
Определение фокуса терминалаsrc/notify.ts166-175
Проверка тихого режимаsrc/notify.ts181-199
Определение родительской сессииsrc/notify.ts205-214
Отправка уведомленияsrc/notify.ts227-243
Конфигурация по умолчаниюsrc/notify.ts56-68
Сопоставление имён процессов терминалаsrc/notify.ts71-84
Обработка завершения задачиsrc/notify.ts249-284
Обработка уведомления об ошибкеsrc/notify.ts286-313
Обработка запроса разрешенияsrc/notify.ts315-334
Обработка вопросаsrc/notify.ts336-351

Ключевые константы:

  • DEFAULT_CONFIG: Конфигурация по умолчанию (строки 56-68)

    • notifyChildSessions: false: По умолчанию не уведомлять о дочерних сессиях
    • sounds.idle: "Glass": Звук завершения задачи
    • sounds.error: "Basso": Звук ошибки
    • sounds.permission: "Submarine": Звук запроса разрешения
    • quietHours.start: "22:00", quietHours.end: "08:00": Тихий режим по умолчанию
  • TERMINAL_PROCESS_NAMES: Сопоставление имён терминалов с именами процессов macOS (строки 71-84)

Ключевые функции:

  • loadConfig(): Загружает и объединяет файл конфигурации с конфигурацией по умолчанию, использует значения по умолчанию, если файл конфигурации не существует или недействителен
  • detectTerminalInfo(): Определяет информацию о терминале (имя, Bundle ID, имя процесса)
  • isTerminalFocused(): Проверяет, является ли терминал текущим приложением переднего плана (macOS)
  • isQuietHours(): Проверяет, находится ли текущее время в тихом режиме
  • isParentSession(): Проверяет, является ли сессия родительской
  • sendNotification(): Отправляет нативное уведомление, поддерживает фокус при нажатии на macOS
  • runOsascript(): Выполняет AppleScript (macOS), возвращает null при неудаче
  • getBundleId(): Получает Bundle ID приложения (macOS)

Бизнес-правила:

  • BR-1-1: По умолчанию уведомлять только о родительских сессиях, не о дочерних (notify.ts:256-259)
  • BR-1-2: Подавлять уведомления, когда терминал сфокусирован (notify.ts:265)
  • BR-1-3: Не отправлять уведомления в тихом режиме (notify.ts:262)
  • BR-1-4: Запросы разрешений всегда уведомляются, проверка родительской сессии не требуется (notify.ts:319)
  • BR-1-5: Вопросы не проверяют фокус, поддерживают рабочий процесс tmux (notify.ts:340)
  • BR-1-6: macOS поддерживает фокус терминала при нажатии на уведомление (notify.ts:238-240)

Обработка исключений:

  • loadConfig(): При отсутствии файла конфигурации или ошибке разбора JSON использует конфигурацию по умолчанию (notify.ts:110-113)
  • isParentSession(): При неудаче запроса сессии предполагает, что это родительская сессия (уведомить, а не пропустить) (notify.ts:210-212)
  • runOsascript(): При неудаче выполнения osascript возвращает null (notify.ts:120-132)
  • handleSessionIdle(): При неудаче получения информации о сессии использует заголовок по умолчанию (notify.ts:274-276)