Виправлення втрачених промптів у модах Claude Code через фонові таймери
Прямий виклик надсилання промпту всередині кнопок або хуків команд у Claude Code мовчки губиться. Збереження тексту в чергу змінної з подальшою відправкою через фоновий таймер сесії усуває цю помилку. Такий підхід забезпечує стабільний запуск агентських черг.

Чому це важливо
Запобігає мовчазній втраті запитів і примусовому завершенню фонових процесів під час розробки власних панелей інтерфейсу та слеш-команд для Claude Code.
TL;DR
- 01Не викликайте $.prompt.submit безпосередньо в onPress або командах через мовчазне скидання контексту.
- 02Буферизуйте запити в змінній модуля та надсилайте їх через цикл $.clock.every, створений у session.start.
- 03Зберігайте посилання на таймери та викликайте cancel() перед повторним створенням під час перезавантаження конфігурації через $.config.set.
- 04Уникайте перемальовування кнопок під час кліку, обмежуючи виклики $.ui.invalidate лише реальними змінами стану.
Ключові факти
- Вразливі версії
- Claude Code 2.1.286 - 2.1.288
- Рекомендований інтервал таймера
- 1000 мс
Проблема життєвого циклу в обробниках модів
Під час розробки інтерактивних панелей для Claude Code (протестовано у версіях від 2.1.286 до 2.1.288), виклик $.prompt.submit({ text }) безпосередньо в обробнику onPress або хуку слеш-команди спричиняє періодичні збої. За документацією $.prompt.submit очікує переходу сесії в режим очікування для початку черги. Проте під час виклику всередині події натискання контекст часто очищується раніше, ніж запит надсилається, без генерації винятків.
Рішення через чергу та системний таймер
Для стабільної роботи необхідно відокремити клік від надсилання:
1. Зберігати текст повідомлення у змінній модуля під час onPress. 2. Ініціалізувати таймер через $.clock.every(1_000, ...) всередині хука session.start. 3. Зчитувати та очищати чергу в ітерації таймера перед викликом $.prompt.submit.
let toSend = null;
on('session.start', async ($, e, next) => {
$.clock.every(1_000, () => {
if (toSend) {
const text = toSend;
toSend = null;
$.prompt.submit({ text });
}
});
});Фоно Prozеси та оптимізація рендерингу
Такий самий життєвий цикл впливає на фонові процеси $.process.run (наприклад, відкриття системних файлів чи звукові сигнали) — перенесення їх у таймер захищає від раптового завершення. Крім того, оновлення конфігурації через $.config.set перезавантажує плагін і може дублювати таймери, тому слід викликати timer?.cancel?.(). Також викликайте $.ui.invalidate('ui.render') лише при зміні значень, щоб уникнути перебудови кнопок прямо під час кліку.
Спробуй за 2 хвилини
let toSend = null;
let timer = null;
on('session.start', async ($, e, next) => {
try { timer?.cancel?.(); } catch {}
timer = $.clock.every(1_000, () => {
if (toSend) {
const text = toSend;
toSend = null;
$.prompt.submit({ text });
}
});
});javascript
✓ Коли використовувати
- Під час створення панелей розширень для десктопного Claude Code з кнопками дій.
- При розробці слеш-команд, які запускають запити паралельно з фоновими процесами.
✕ Коли НЕ варто
- Під час роботи у звичайному терміналі без кастомних розширень інтерфейсу.
- Для стандартних інтерактивних CLI-промптів, які не використовують систему модів десктопної версії.
Що зробити сьогодні
- Перевірте плагіни Claude Code на наявність прямих викликів $.prompt.submit в обробниках UI.
- Перенесіть фонову відправку в таймер із інтервалом 1000 мс у хуку session.start.
- Додайте виклик timer.cancel() перед створенням нових таймерів для запобігання дублюванню дій.