Частые вопросы: производительность, конфиденциальность и совместимость
Что вы сможете после изучения
- Понять влияние плагина на производительность и использование ресурсов
- Уточнить гарантии конфиденциальности и безопасности
- Освоить стратегии уведомлений и методы настройки
- Понять различия между платформами и совместимость
Производительность
Увеличивает ли плагин контекст AI?
Нет. Плагин использует событийную модель и не добавляет никаких инструментов или подсказок в диалог AI.
С точки зрения реализации исходного кода:
| Компонент | Тип | Реализация | Влияние на контекст |
|---|---|---|---|
| Слушатель событий | Событие | Прослушивает события session.idle, session.error, permission.updated | ✅ Без влияния |
| Хук инструмента | Хук | Прослушивает инструмент question через tool.execute.before | ✅ Без влияния |
| Содержание диалога | - | Не читает, не изменяет и не внедряет никакого содержания диалога | ✅ Без влияния |
В исходном коде плагин отвечает только за прослушивание и уведомления, контекст диалога AI полностью не затрагивается.
Сколько системных ресурсов будет занято?
Минимально. Плагин использует дизайн "кэширование при запуске + триггер событий":
- Загрузка конфигурации: при запуске плагин считывает файл конфигурации один раз (
~/.config/opencode/kdco-notify.json), затем больше не считывает - Определение терминала: при запуске определяется тип терминала и кэшируется информация (название, Bundle ID, имя процесса), для последующих событий используется кэш
- Событийная модель: уведомление выполняется только тогда, когда AI вызывает определённое событие
Характеристики использования ресурсов:
| Тип ресурса | Использование | Описание |
|---|---|---|
| CPU | Почти 0 | Работает кратковременно только при срабатывании событий |
| Память | < 5 МБ | После запуска переходит в режим ожидания |
| Диск | < 100 КБ | Файл конфигурации и сам код |
| Сеть | 0 | Не выполняет никаких сетевых запросов |
Конфиденциальность и безопасность
Загружаются ли данные на сервер?
Нет. Плагин работает полностью локально и не выполняет никакой отправки данных.
Гарантии конфиденциальности:
| Тип данных | Обработка | Загружается ли |
|---|---|---|
| Содержание диалога AI | Не читается, не сохраняется | ❌ Нет |
| Информация о сессии (заголовок) | Используется только для текста уведомления | ❌ Нет |
| Информация об ошибке | Используется только для текста уведомления (максимум 100 символов) | ❌ Нет |
| Информация о терминале | Определяется и кэшируется локально | ❌ Нет |
| Информация о конфигурации | Локальный файл (~/.config/opencode/) | ❌ Нет |
| Содержание уведомления | Отправляется через системный API нативных уведомлений | ❌ Нет |
Техническая реализация:
Плагин использует системные нативные уведомления:
- macOS: через
node-notifierвызываетNSUserNotificationCenter - Windows: через
node-notifierвызываетSnoreToast - Linux: через
node-notifierвызываетnotify-send
Все уведомления вызываются локально и не проходят через облачную службу OpenCode.
Будет ли плагин красть содержание моих сессий?
Нет. Плагин считывает только необходимые метаданные:
| Считываемые данные | Использование | Ограничения |
|---|---|---|
| Заголовок сессии (title) | Текст уведомления | Берётся только первые 50 символов |
| Информация об ошибке (error) | Текст уведомления | Берётся только первые 100 символов |
| Информация о терминале | Определение фокуса и клик для фокусировки | Не читает содержание терминала |
| Файл конфигурации | Настройки пользователя | Локальный файл |
В исходном коде нет никакой логики для чтения сообщений диалога (messages) или пользовательского ввода (user input).
Стратегия уведомлений
Будет ли мне "бомбить" уведомлениями?
Нет. Плагин имеет встроенный механизм многократной интеллектуальной фильтрации для избежания "бомбардировки" уведомлениями.
Стратегия уведомлений по умолчанию:
| Тип | Событие/инструмент | Уведомлять | Причина |
|---|---|---|---|
| Событие | Завершение родительской сессии (session.idle) | ✅ Да | Завершение основной задачи |
| Событие | Завершение дочерней сессии (session.idle) | ❌ Нет | Родительская сессия уведомляет едино |
| Событие | Ошибка сессии (session.error) | ✅ Да | Требует немедленного реагирования |
| Событие | Запрос разрешения (permission.updated) | ✅ Да | AI ожидает блокировки |
| Хук инструмента | Вопрос (tool.execute.before - question) | ✅ Да | AI требует ввод |
Механизм интеллектуальной фильтрации:
Уведомлять только родительские сессии
- Исходный код:
notify.ts:256-259 - Конфигурация по умолчанию:
notifyChildSessions: false - Избегает уведомлений для каждой подзадачи при разложении AI задачи
- Исходный код:
Подавление при фокусе терминала (macOS)
- Исходный код:
notify.ts:265 - Логика: когда терминал является окном переднего плана, уведомление не отправляется (встроенное поведение, настройка не требуется)
- Избегает повторных напоминаний "ещё уведомить, когда смотришь на терминал"
- Примечание: эта функция доступна только на macOS (требуется информация о терминале для определения)
- Исходный код:
Тихие часы
- Исходный код:
notify.ts:262,notify.ts:181-199 - Конфигурация по умолчанию:
quietHours: { enabled: false, start: "22:00", end: "08:00" } - Настраивается, избегает ночных помех
- Исходный код:
Запрос разрешения всегда уведомляется
- Исходный код:
notify.ts:319 - Причина: AI ожидает блокировки авторизации пользователя, необходимо своевременно уведомить
- Не проверяет родительскую сессию
- Исходный код:
Можно ли получать только определённые типы уведомлений?
Да. Хотя у плагина нет отдельных переключателей уведомлений, но можно реализовать через тихие часы и определение фокуса терминала:
- Только экстренные уведомления: определение фокуса терминала является встроенным поведением, когда вы в терминале, уведомления не приходят (macOS)
- Только ночные уведомления: включите тихие часы (например, 09:00-18:00), используйте в обратном порядке
Если требуется более детальное управление, можно подать Feature Request.
Совместимость плагина
Конфликтует ли с другими плагинами OpenCode?
Нет. Плагин интегрируется через стандартный OpenCode Plugin API, не изменяет поведение AI и не мешает другим плагинам.
Метод интеграции:
| Компонент | Метод интеграции | Риск конфликта |
|---|---|---|
| Слушатель событий | Хук event OpenCode SDK | ❌ Без конфликта |
| Хук инструмента | Хук tool.execute.before OpenCode Plugin API | ❌ Без конфликта (прослушивает только инструмент question) |
| Запрос сессии | client.session.get() OpenCode SDK | ❌ Без конфликта (только чтение без записи) |
| Отправка уведомлений | node-notifier отдельный процесс | ❌ Без конфликта |
Другие плагины, которые могут сосуществовать:
- Официальные плагины OpenCode (например,
opencode-coder) - Сторонние плагины (например,
opencode-db,opencode-browser) - Пользовательские плагины
Все плагины работают параллельно через стандартный Plugin API, не мешая друг другу.
Какие платформы поддерживаются? Есть ли различия в функционале?
Поддерживаются три платформы: macOS, Windows, Linux, но есть различия в функционале.
| Функция | macOS | Windows | Linux |
|---|---|---|---|
| Нативные уведомления | ✅ Поддерживается | ✅ Поддерживается | ✅ Поддерживается |
| Пользовательские звуки | ✅ Поддерживается | ❌ Не поддерживается | ❌ Не поддерживается |
| Определение фокуса терминала | ✅ Поддерживается | ❌ Не поддерживается | ❌ Не поддерживается |
| Клик по уведомлению для фокусировки | ✅ Поддерживается | ❌ Не поддерживается | ❌ Не поддерживается |
| Автоопределение терминала | ✅ Поддерживается | ✅ Поддерживается | ✅ Поддерживается |
| Тихие часы | ✅ Поддерживается | ✅ Поддерживается | ✅ Поддерживается |
Причины различий платформ:
| Платформа | Описание различий |
|---|---|
| macOS | Система предоставляет богатый API уведомлений и интерфейс управления приложениями (например, osascript), поддерживает звуки, определение фокуса, клик по уведомлению для фокусировки |
| Windows | API системных уведомлений имеет ограниченный функционал, не поддерживает определение переднего плана приложения и пользовательские звуки |
| Linux | Зависит от стандарта notify-send, функционал аналогичен Windows |
Кроссплатформенные основные функции:
Независимо от платформы, следующие основные функции доступны:
- Уведомления о завершении задачи (session.idle)
- Уведомления об ошибках (session.error)
- Уведомления о запросе разрешения (permission.updated)
- Уведомления о вопросах (tool.execute.before)
- Настройка тихих часов
Терминал и система
Какие терминалы поддерживаются? Как происходит определение?
Поддерживается 37+ эмуляторов терминалов.
Плагин использует библиотеку detect-terminal для автоматического распознавания терминала, поддерживаемые терминалы включают:
Терминалы macOS:
- Ghostty, Kitty, iTerm2, WezTerm, Alacritty
- macOS Terminal, Hyper, Warp
- Интегрированный терминал VS Code (Code / Code - Insiders)
Терминалы Windows:
- Windows Terminal, Git Bash, ConEmu, Cmder
- PowerShell, CMD (через определение по умолчанию)
Терминалы Linux:
- gnome-terminal, konsole, xterm, lxterminal
- terminator, tilix, alacritty, kitty
Механизм определения:
- Автоопределение: при запуске плагина вызывается библиотека
detectTerminal() - Ручное переопределение: пользователь может указать поле
terminalв файле конфигурации для переопределения автоопределения - Отображение macOS: название терминала отображается на имя процесса (например,
ghostty→Ghostty), используется для определения фокуса
Пример конфигурации:
{
"terminal": "ghostty"
}Что будет, если определение терминала не удастся?
Плагин будет нормально работать, только функция определения фокуса будет недоступна.
Логика обработки ошибок:
| Сценарий ошибки | Проявление | Влияние |
|---|---|---|
detectTerminal() возвращает null | Информация о терминале: { name: null, bundleId: null, processName: null } | Нет определения фокуса, но уведомления отправляются нормально |
Ошибка выполнения osascript на macOS | Не удалось получить Bundle ID | Функция клика по уведомлению для фокусировки на macOS недоступна, но уведомления работают нормально |
Недопустимое значение terminal в файле конфигурации | Используются результаты автоопределения | Если автоопределение также не удаётся, то нет определения фокуса |
Соответствующая логика в исходном коде (notify.ts:149-150):
if (!terminalName) {
return { name: null, bundleId: null, processName: null }
}Метод решения:
Если определение терминала не удаётся, можно вручную указать тип терминала:
{
"terminal": "iterm2"
}Конфигурация и устранение неполадок
Где находится файл конфигурации? Как изменить?
Путь к файлу конфигурации: ~/.config/opencode/kdco-notify.json
Полный пример конфигурации:
{
"notifyChildSessions": false,
"sounds": {
"idle": "Glass",
"error": "Basso",
"permission": "Submarine",
"question": "Submarine"
},
"quietHours": {
"enabled": true,
"start": "22:00",
"end": "08:00"
},
"terminal": "ghostty"
}Шаги изменения конфигурации:
Откройте терминал и отредактируйте файл конфигурации:
bash# macOS/Linux nano ~/.config/opencode/kdco-notify.json # Windows notepad %USERPROFILE%\.config\opencode\kdco-notify.jsonИзмените параметры конфигурации (см. пример выше)
Сохраните файл, конфигурация автоматически вступит в силу (перезапуск не требуется)
Что будет, если файл конфигурации повреждён?
Плагин использует конфигурацию по умолчанию и молча обрабатывает ошибку.
Логика обработки ошибок (notify.ts:110-113):
} catch {
// Config doesn't exist or is invalid, use defaults
return DEFAULT_CONFIG
}Метод решения:
Если файл конфигурации повреждён (ошибка формата JSON), плагин вернётся к конфигурации по умолчанию. Шаги исправления:
Удалите повреждённый файл конфигурации:
bashrm ~/.config/opencode/kdco-notify.jsonПлагин продолжит работу с конфигурацией по умолчанию
Если требуется пользовательская конфигурация, пересоздайте файл конфигурации
Итоги урока
В этом уроке мы ответили на наиболее часто задаваемые вопросы:
- Влияние на производительность: плагин не увеличивает контекст AI, использование ресурсов минимально (CPU почти 0, память < 5 МБ)
- Конфиденциальность и безопасность: полностью локальная работа, не отправляет никаких данных, считывает только необходимые метаданные
- Стратегия уведомлений: механизм интеллектуальной фильтрации (уведомлять только родительские сессии, подавление при фокусе терминала на macOS, тихие часы)
- Совместимость плагина: не конфликтует с другими плагинами, поддерживает три платформы, но есть различия в функционале
- Поддержка терминалов: поддерживает 37+ терминалов, при неудачном автоопределении продолжает нормально работать
Предварительный обзор следующего урока
В следующем уроке мы изучим Типы событий.
Вы узнаете:
- Четыре типа событий OpenCode, которые прослушивает плагин
- Время срабатывания и содержание уведомлений для каждого события
- Правила фильтрации событий (проверка родительской сессии, тихие часы, фокус терминала)
- Различия в обработке событий на разных платформах
Приложение: ссылки на исходный код
Нажмите, чтобы раскрыть расположение исходного кода
Время обновления: 2026-01-27
| Функция | Путь к файлу | Номер строки |
|---|---|---|
| Запуск плагина и загрузка конфигурации | src/notify.ts | 357-364 |
| Логика прослушивания событий | src/notify.ts | 372-400 |
| Проверка родительской сессии | src/notify.ts | 256-259 |
| Проверка тихих часов | src/notify.ts | 262 |
| Определение фокуса терминала | src/notify.ts | 265 |
| Загрузка файла конфигурации | src/notify.ts | 90-114 |
| Определение информации о терминале | src/notify.ts | 145-176 |
| Определение конфигурации по умолчанию | src/notify.ts | 56-68 |
Ключевые константы:
DEFAULT_CONFIG: конфигурация по умолчанию (уведомлять только родительские сессии, звуки Glass/Basso/Submarine, тихие часы по умолчанию отключены)
Ключевые функции:
loadConfig(): загружает пользовательскую конфигурацию и объединяет со значениями по умолчаниюdetectTerminalInfo(): определяет информацию о терминале и кэшируетisQuietHours(): проверяет, находится ли текущее время в тихих часахisTerminalFocused(): проверяет, является ли терминал окном переднего плана (macOS)isParentSession(): проверяет, является ли сессия родительской