Команди та інтерфейс бота
Як керувати aipager із Telegram. Чотири способи вводу: slash-команди, кнопки клавіатури, панель Mini App і вільні повідомлення (текст, файли, голосові).
Бот приймає ввід лише з налаштованих чатів; про межу довіри див. Модель безпеки.
Slash-команди#
Вони реєструються в aipager/bot/lifecycle.py. Меню команд Telegram їх показує й оновлюється під час запуску aipager і під час кожної зміни сесій.
| Команда | Аргументи | Що робить |
|---|---|---|
/start | - | Головний екран: сесії цього чату, куди йде звичайне повідомлення (✍️ Повідомлення йдуть у x1.), і 🆕 Нова сесія, ⚙️ Налаштування і, коли в цьому чаті є завершена сесія, яку можна повернути, ↩️ Продовжити. Ще показує постійну клавіатуру. |
/help | - | Короткий посібник за завданнями (почати, спілкуватися, керувати, сесії, налаштування і, для адмінів, /update) з порадою, що натискання на команду одразу її надсилає: утримуй її (телефон) або натисни Tab (комп'ютер), щоб спершу дописати текст. Для власника встановлення (людини з власного особистого чату встановлення з ботом) у ньому ще є кнопка 🐞 Повідомити про проблему: вона відкриває в цьому особистому чаті попередній перегляд точного звіту про проблему з кнопками Надіслати, Додати примітку і Скасувати. Нічого не надсилається, доки не натиснеш Надіслати (що містить звіт). |
/app | - | Відкриває панель Mini App (сесії, перегляд diff, налаштування). |
/status | - | Сесії цього чату списком, з яким можна працювати. Кожна каже свій стан словами (⚙️ працює 3:12 · Bash: run tests, ⏳ чекає на тебе · Bash: make deploy, 💤 готова), з ✍️ на тій, куди йдуть звичайні повідомлення, і другим рядком із моделлю, контекстом, вартістю, тим, що стоїть у черзі (черга 3 (1 у черзі, 2 примітки)), і агентами та фоновими командами, що працюють. Кожна має ряд кнопок: ✍️ x1 спрямовує туди твої наступні повідомлення, ⏹ Зупинити, поки вона працює, Відповісти, поки вона чекає на тебе, і ⋮ для решти. Нижче: 🆕 Нова і ⚫ Завершені (n) для сесій, які завершилися (продовжити, видалити або прибрати їх усі зі списку; вони лишаються в /resume). |
/stop [label] | за бажанням | Перериває поточне завдання сесії. Без назви зупиняє єдину сесію цього чату, яка працює (навіть якщо твої повідомлення йдуть в іншу; сесія, у якій ще працює фоновий агент або фонова команда, вважається такою, що працює), питає списком, яку, якщо їх кілька, і пише Зараз нічого не працює., якщо жодної. /stop x1 (або /x1 stop) зупиняє x1 (або відповідає x1 зараз нічого не робить., коли вона не працює). Ще й викидає повідомлення з черги й каже, скільки викинуто. |
/now | - | Одразу надсилає повідомлення, які Claude тримає в черзі активної сесії, а не після поточного кроку (власні клавіші «надіслати зараз» у Claude Code, Ctrl+X Ctrl+S). Працює будь-коли, зокрема коли надсилання в чат вимкнено або чат у мінімальному режимі; відповідає У черзі нічого не чекає, коли Claude нічого не тримає. Див. Надіслати повідомлення з черги зараз. |
/new [name] [first message] | усе за бажанням | Запускає сесію. /new x1 одразу її запускає, а /new x1 fix the tests ще й надсилає «fix the tests» першим повідомленням. Надіслана сама собою (наприклад, натиснута в меню), /new питає назву, і наступне надіслане повідомлення використовується саме як аргумент, тож /new, а потім x1 fix the tests дають той самий результат. У групі дай відповідь на картку назвою (або згадай бота: @aipagerbot x1), бо звичайне повідомлення там до бота не доходить. Лише це наступне повідомлення: якщо спершу зробити щось інше (фото, інша команда, відповідь на інше повідомлення, шаблон клавіатури, інша кнопка), це обробляється як звичайно, і картка закривається; /status, /settings і меню клавіатури лишають її відкритою. Картка, яка питає, ще показує режим, модель і папку, які отримає сесія, з кнопками, щоб спершу їх змінити. Усі шляхи закінчуються тією самою карткою «x1 готова»: що отримала сесія, що твоє наступне повідомлення піде в неї, і кнопки в одне натискання, щоб перейти в інший режим або змінити модель. Нові сесії в усіх запускаються в режимі Авто; що використовує /new, змінюється в /settings → Нові сесії. ! перед назвою запускає сесію в режимі «Повний доступ», для адміна (ролі owner і admin) або людини в її власному особистому чаті з ботом, чия роль може надсилати повідомлення і відповідати Claude (user, не read_only); для всіх інших вона запускається в режимі Авто, і картка каже чому. Зайнята назва пропонує ↩️ Перейти до неї (коли ця сесія працює) або ♻️ Продовжити (коли вона завершена), 🆕 Замінити на нову і ↩️ Скасувати, лише тому, хто надіслав /new. Картка, яка просить назву, застаріває через 10 хвилин без використання (⏱ Картка нової сесії застаріла. Надішли /new знову.). Учасник, чия роль без can_manage (user, read_only), запускає сесії лише всередині кореневої папки чату: папка картки - це коренева папка, сторінка «Папка» показує її і папки просто всередині неї (без рядка «Папка за замовчуванням»), «Нова папка» створює папку всередині вибраної, а «Перейти до неї», «Продовжити» і «Замінити» для сесії, яка працює поза кореневою папкою, відхиляються («Ця сесія працює поза твоєю папкою ~/..., тож твоя роль не може її продовжити, перезапустити чи змінити її режим. Попроси адміна.»). |
/resume [label] | за бажанням | Продовжує за назвою вже завершену сесію або відкриває список. Сесія повертається в тому режимі, у якому була. Сесія, яка була в режимі «Повний доступ», повертається в «Повному доступі» лише для адміна або людини в її власному особистому чаті; для всіх інших вона повертається в режимі Авто, і відповідь це каже (♻️ x1 знову працює, у режимі Авто: режим «Повний доступ» лише для адмінів.). Сесія, яку старіший aipager зберіг у своєму старому Auto (який працював без перевірок), повертається в режимі «Повний доступ», а збережена в Ask повертається в режимі «Питати». Завершена сесія лишається в списку GONE_SESSION_MAX_AGE_DAYS днів (за замовчуванням 14), а потім іде зі списку сесій; збережену розмову Claude не зачіпають. Учасник, чия роль без can_manage, не може продовжити сесію, чия папка поза кореневою папкою чату (власники й адміни можуть); те саме для Перезапустити і будь-якої зміни режиму, зокрема зміни без перезапуску між «Питати» та Авто. |
/kill [label] | за бажанням | Завершує сесію, завжди після підтвердження: ⏹ Завершити x1? Claude зупиниться, і сесія закінчиться. з [⏹ Завершити] [Скасувати]. Без назви йде до підтвердження, коли в цьому чаті одна сесія, що працює, інакше до списку сесій цього чату, що працюють. Є і в /status → ⋮ → ⏹ Завершити сесію. |
/restart [label] | за бажанням | Перезапускає сесію після підтвердження: Claude зупиняється і запускається знову, зберігаючи розмову, у тому режимі, у якому aipager востаннє її запустив або на який перемкнув. Сесія, запущена в терміналі через aipager session, повертається в режимі «Питати», якщо її режим відтоді не змінювали з Telegram (aipager не знає, у якому режимі її запустив термінал, і ніколи не вгадує вільнішого); те саме під час її продовження з Telegram. |
/rename [label] [new] | за бажанням | Дає сесії нову назву (і завершеній теж). /rename x1 newname перейменовує одразу. З меншою кількістю слів питає: одразу нову назву, коли команда може означати лише одну сесію, інакше список (одне слово після /rename не вибирає сесію, бо це може бути і стара назва, і нова). У групі дай відповідь на питання назвою. |
/delete [label] | за бажанням | Прибирає завершену сесію зі списку, після підтвердження. |
/diff [label] | за бажанням | Показує git diff робочої папки сесії. Без назви показує сесію, куди йдуть твої повідомлення. |
/clearqueue | - | Викидає всі повідомлення, які активна сесія ще не забрала (і ті, що притримує aipager, і ті, що вже в черзі всередині Claude), не перериваючи завдання, що триває. Відповідає, скільки викинуто. |
/mode [label] [ask|auto|full] | за бажанням | Показує режим дозволів сесії з кнопкою для переходу в кожен інший режим: ✍️ x1: 🤖 Режим Авто. [💬 Увімкнути режим «Питати»] [🔓 Увімкнути режим «Повний доступ»]. Режимів три. 💬 Режим «Питати»: Claude питає перед кожною дією. 🤖 Режим Авто (за замовчуванням): власна перевірка безпеки Claude Code виконує безпечні дії і зупиняє ризиковані, щоб рішення було за тобою. 🔓 Режим «Повний доступ»: усе виконується без жодних перевірок (--dangerously-skip-permissions); вибрати його може лише адмін або людина у своєму власному особистому чаті з ботом, чия роль може надсилати повідомлення і відповідати Claude (user, не read_only). Авто і «Повний доступ» змінюють лише власні запити на дозвіл Claude Code: hook aipager і далі застосовує правила ролі учасника. /mode ask, /mode auto, /mode full або /mode x1 ask перемикають одразу; слово самого режиму мовою чату теж працює, без слова «режим» (/mode x1 Питати для 💬 Режим «Питати», /mode x1 Повний для 🔓 Режим «Повний доступ»). Коли сесія, що працює в цьому чаті, має саме таку назву (скажімо, сесія demander), слово називає сесію: /mode demander показує режим цієї сесії, а /mode x1 demander і далі перемикає x1. ask, auto і full завжди означають режим, у будь-якому порядку (/mode x1 ask або /mode ask x1); лише коли обидва слова - це слова режиму і лише одне з них є назвою сесії, що працює, воно називає сесію, тому із сесією на ім'я full і /mode full ask, і /mode ask full перемикають її в режим «Питати», а /mode full саме собою лишається режимом. Перемикання між «Питати» та Авто йде без перезапуску і будь-коли (навіть поки Claude працює): aipager натискає в сесії Shift+Tab, як це роблять у терміналі, а картка пише ⚙️ x1 переходить на 🤖 Режим Авто без перезапуску., поки Claude Code не повідомить новий режим на наступному кроці, а потім показує результат. Якщо режим Авто для сесії недоступний (через її модель чи тариф), картка це каже, і сесія лишається в режимі «Питати». Не тоді, коли сесія показує питання чи запит на дозвіл: спершу дай на нього відповідь. Перехід у «Повний доступ» потребує адміна (або людини в її власному особистому чаті) і підтвердження та перезапускає сесію (розмова зберігається); вихід із «Повного доступу» теж її перезапускає, одразу. Сесія, запущена в «Повному доступі», перезапускається під час кожної зміни, навіть після того як її в терміналі перемкнули на «Питати» або Авто, і так само сесія, яка від моменту запуску повідомляла про «Повний доступ» (термінальна сесія, запущена з --dangerously-skip-permissions): Shift+Tab там міг би прокрутити її назад у «Повний доступ». Для сесії, що працює, перезапуск пропонує 🛑 Зупинити і змінити / ⏳ Не зараз. Учасник, чия роль без can_manage, не може змінити режим сесії, чия папка поза кореневою папкою чату, ні без перезапуску, ні з ним. Натискання на зміну змінює саму картку, а не надсилає другого повідомлення. /perms - це стара назва, і вона працює так само. |
/settings | - | Як виглядають і відповідають сесії цього чату: мова aipager, вигляд повідомлень, попередній перегляд змін, оновлення картки в довгих завданнях, оформлення, довжина відповіді, рівень словника; з чим /new запускає сесію; налаштування кожної сесії; і, в особистому чаті власника, пропозиції звітів про проблеми. Див. Налаштування. У групі дивитися може будь-хто, а змінювати налаштування може лише адмін. |
/language | - | Мова, якою aipager пише свої повідомлення і кнопки в цьому чаті (той самий список, що в першому рядку /settings). Кожна мова показана своєю власною назвою: English, потім Español, Русский, Português (Brasil), 简体中文 (китайська спрощена), Français, Deutsch (німецька), 한국어 (корейська), العربية (арабська), Bahasa Indonesia, Українська, Italiano, Türkçe (турецька), فارسی (перська) і Tiếng Việt (в'єтнамська). Особистий чат, який починається після цієї версії, іде за мовою твого застосунку Telegram; чат, який існував раніше, лишається англійським, доки ти не вибереш (див. Мови). Іспанською, португальською, французькою, італійською та індонезійською слова нижньої клавіатури лишаються status, stop, new і kill, як і їхні команди. Німецька й турецька використовують Status, Stop, Neu… і Beenden…, а також Özet, Stop, Oluştur і Sonlandır; англійські слова й далі працюють, якщо їх набрати. Перською та арабською тексти aipager читаються справа наліво, з перськими або арабськими цифрами; назви сесій, команди, назви моделей і код лишаються як є. Список каже, що він змінює: лише тексти aipager, тут і в Mini App; твої сесії Claude не змінюються, і Claude відповідає тією мовою, якою ти йому пишеш. У групі дивитися може будь-хто, а змінювати може лише адмін. language - це зарезервована назва сесії. |
/whoami | - | Показує, хто ти тут: у командному режимі твоє ім'я, твою роль у цьому чаті та правила, які вона тобі дає. |
/update | - | Лише для адмінів (ролі owner і admin або роль із can_manage). Перевіряє, чи є нові версії aipager і Claude Code, а потім однією кнопкою оновлює те, що їх має. Див. Оновлення. |
Меню / спершу показує твої сесії (/x1 · Спілкуватися з x1), потім часті команди: new, status, stop, now, resume, mode, settings, language, help (і app, коли Mini App увімкнена, лише в особистому чаті). kill, restart, rename, delete, diff, clearqueue, perms, whoami і update у меню немає, але вони працюють, якщо їх набрати; дії із сесіями є і в /status → ⋮.
Команди, які діють на сесію (/stop, /mode, /kill, /restart, /rename, /delete, /diff), підпорядковуються одному правилу:
- З назвою (
/restart x1) вони діють на цю сесію цього чату (для/renameпотрібні стара і нова назви, див. вище). - Без назви вони діють на ту єдину сесію, яку може означати команда (єдину, що працює, для
/stop, єдину запущену для/killі/restart, єдину завершену для/delete), через звичайне підтвердження, якщо воно є. - Інакше вони показують список лише тих сесій цього чату, для яких команда має сенс: спершу та, куди йдуть твої повідомлення, з позначкою
✍️, потім інші за назвою, і✖️ Скасувати. Вибір однієї веде до тієї самої картки, що й набір її назви. - У групі без назви вони діють лише на твою власну поточну сесію, коли команда для неї має сенс; інакше завжди показують список, навіть з однією сесією, бо вона може належати іншому учасникові (див. робота в команді).
/mode і /diff спершу дивляться на сесію, куди йдуть твої повідомлення.
Налаштування#
/settings (і вкладка «Налаштування» в Mini App, де ті самі варіанти) задає, як виглядають і відповідають сесії цього чату. Кожен чат має свої; у групі дивитися може будь-хто, а змінювати налаштування може лише адмін. У своєму власному особистому чаті їх змінюєш ти, хоч яка в тебе роль, у Telegram і в Mini App. Рядок із ✅ стоїть не на значенні за замовчуванням («Вигляд повідомлень» завжди показує свій вибір).
| Налаштування | Варіанти (за замовчуванням перший) | Що робить |
|---|---|---|
| 🌐 Мова | Автоматично (мова твого Telegram), в особистому чаті; English | Мова власних повідомлень і кнопок aipager у цьому чаті та в Mini App, показана своєю власною назвою (той самий список, що в /language). Вона не змінює твоїх сесій Claude: Claude відповідає тією мовою, якою ти йому пишеш. Пропонуються English, Español, Русский, Português (Brasil), 简体中文 (китайська спрощена), Français, Deutsch (німецька), 한국어 (корейська), العربية (арабська), Bahasa Indonesia, Українська, Italiano, Türkçe (турецька), فارسی (перська) і Tiếng Việt (в'єтнамська); «Автоматично» йде за мовою твого застосунку Telegram (див. Мови). |
| 🖼 Вигляд повідомлень | Картка + відповідь окремо; Відповідь усередині картки; Лише відповідь (без картки) | Як виглядає завершене завдання. «Картка + відповідь окремо» лишає картку над відповіддю як запис того, як до неї прийшли; «Відповідь усередині картки» вміщує відповідь у картку; «Лише відповідь» прибирає картку й лишає відповідь саму. За замовчуванням «Картка + відповідь окремо» (KEEP_FINISHED_CARD=0 робить «Лише відповідь» для чатів, які ніколи не вибирали). Див. відповіді. |
| 📝 Попередній перегляд змін | Вимк; Увімк | «Увімк» публікує кожен Write/Edit окремим повідомленням із diff під робочою карткою. «Вимк» лишає одну картку й одну відповідь; картка й далі перелічує кожну правку, а в Mini App є перегляд diff. |
| ⏱ Оновлення картки в довгих завданнях | Увімк; Вимк | «Увімк»: робоча картка оновлюється кожні 10 с після 2 хвилин завдання і кожні 30 с після 10 (ніколи не повільніше, хоч скільки триває завдання), а її годинник тоді йде кроками по 30 с; «Вимк» тримає темп перших хвилин на все завдання (див. розв'язання проблем). |
| ✏️ Просте оформлення | Вимк; Увімк | «Увімк» просить Claude писати лише простим текстом і списками з дефісами: без таблиць, блоків коду, заголовків і жирного. |
| 📏 Довжина відповіді | Без правил; Дуже коротка; Коротка; Середня; Довга | Просить Claude відповідати такої довжини. |
| 🎓 Рівень словника | Без правил; Прості слова; Звичайний; Просунутий | Просить Claude такий словник. |
| 🎨 Оформлення | Кнопка «Зупинити», Кнопки «Дозволити» і «Відхилити», Кнопка App, Меню налаштувань | Як виглядають кнопки aipager у цьому чаті; спершу все стоїть на «Звичайний» (власний вигляд Telegram). Telegram дозволяє боту фарбувати кнопку лише в синій, зелений чи червоний, тому: кнопка «Зупинити» (на робочій картці та під питанням чи запитом дозволу): Звичайний, Синій, Зелений чи Червоний; «Дозволити» і «Відхилити»: Звичайний або кольорові (зелені «Дозволити» і «Дозволяти завжди», червона «Відхилити»); кнопка App (у закріпленому повідомленні та під /app): Звичайний, Синій, Зелений чи Червоний (кнопку меню поруч із полем повідомлення пофарбувати не можна); меню налаштувань: Звичайний (✅ позначає поточний вибір) або ще й поточний вибір синім. Для всього чату, не для окремої сесії; у групі це змінює лише адмін. Застосунки Telegram без підтримки кольорів показують усі кнопки звичайними. На вкладці «Налаштування» в Mini App ті самі варіанти є в окремому розділі «Оформлення» після «Налаштування чату», у кожного кольорова крапка. |
| 🆕 Нові сесії | Дозволи (режим), Модель, Папка | З чим /new запускає сесію, коли ти не вибираєш: режим «Питати», Авто (за замовчуванням) або «Повний доступ», модель зі списку моделей або модель Claude Code за замовчуванням, і папка. Вибрати тут «Повний доступ» може лише адмін або людина у своєму власному особистому чаті з ботом (екран особистого чату більше нікому його не показує), і він ніколи не застосовується до того, кому ним не можна користуватися: такі сесії запускаються в режимі Авто. |
| 👤 Налаштування кожної сесії | сесія, потім будь-яке налаштування вище, крім «Нові сесії» | Значення для однієї сесії (є і в /status → ⋮ → 👤 Налаштування); ⭐ позначає налаштування, яке вона перевизначає, а «Як у чаті (за замовчуванням)» прибирає перевизначення. Сторінка сесії в Mini App задає ті самі значення. |
| 🐞 Звіти про проблеми | Питати мене; Вимк | Лише в особистому чаті власника встановлення. «Питати мене» дає aipager час від часу пропонувати надіслати звіт про внутрішню помилку, яка траплялася більше одного разу (не частіше разу на 3 дні); «Вимк» ніколи не пропонує (кнопка «Повідомити про проблему» в /help і далі працює). Дві відмови поспіль вимикають пропозиції, і цей рядок тоді про це каже, з кнопкою, щоб знову їх увімкнути. Див. звіти про проблеми. |
Довжина відповіді, рівень словника і просте оформлення доходять до Claude короткою інструкцією, доданою до кожного повідомлення з Telegram (через hook, див. hooks), із власними значеннями сесії, якщо вона їх має.
За будь-якого вигляду кожна робоча картка закінчується рядком стану своєї сесії (⏳/✅ назва · …), а кожна відповідь починається своїм рядком результату (💬 назва, плюс · Завершено (…), коли не лишилося завершеної картки, яка показала б цифри); вигляд «Відповідь усередині картки» ставить їх одну над одною, кожен рядок у своєму розділі. Над рядком стану робочої картки стоїть розділова лінія (дрібним шрифтом), а у вигляді «Відповідь усередині картки» друга така лінія відділяє завершену картку від відповіді. У вигляді з карткою відповідь навмисно йде за завершеною карткою з невеликим відставанням, щоб було видно, як картка каже «Завершено», перш ніж відповідь з'явиться під нею; налаштуй або вимкни цю фору через FINISH_CARD_GRACE_SECONDS (секунди, за замовчуванням 0,8; 0 надсилає обидві одразу). У вигляді з карткою завдання, яке не викликало жодного інструмента, картки не лишає: картка прибирається, перш ніж скаже «Готово», а перший рядок відповіді показує цифри, як у вигляді «Лише відповідь (без картки)».
Власні команди кожної сесії#
Одна команда на кожну сесію, що працює, реєструється за її назвою:
| Форма | Що робить |
|---|---|
/<label> | Робить <label> сесією, куди йдуть твої повідомлення. Відповідь каже про це з її станом і режимом (✍️ Тепер ти спілкуєшся з x1 · 💤 готова · 🤖 Режим Авто, потім «Напиши повідомлення, і воно піде в x1.»), пропонує Відповісти, коли вона на тебе чекає, і ⋮ Ще для її меню. Повні цифри є в /status. У групі він натомість каже «Дай відповідь на повідомлення від x1 (або згадай @aipagerbot), щоб спілкуватися з нею.», бо звичайне повідомлення там до бота не доходить (див. робота в команді). /x1@aipagerbot, який Telegram надсилає, коли вибираєш /x1 у меню групи, працює так само. |
/<label> <prompt> | Надсилає <prompt> просто в цю сесію. Вона ще й стає сесією, куди йдуть твої наступні звичайні повідомлення. |
/<label> stop | Перериває поточне завдання цієї сесії. |
Результати /status беруться з тих самих даних, що показує aipager status у командному рядку; для самого списку сесій звертатися до Telegram не потрібно.
На комп'ютері aipager status і aipager session ls дають кожній сесії один стан: IDLE, BUSY, WAITING (на тебе чекає дозвіл чи питання, із зазначенням, що саме, коли це відомо, наприклад permission: Bash: make deploy) або GONE. З --json кожна сесія ще має waiting_kind (permission або question) і waiting_summary, обидва null, якщо вона не чекає.
Мови#
aipager говорить English, Español, Русский, Português (Brasil), 简体中文, Français, Deutsch, 한국어, العربية, Bahasa Indonesia, Українська, Italiano, Türkçe, فارسی і Tiếng Việt, кожна показана своєю власною назвою.
- Змінюються лише тексти aipager. Мова стосується повідомлень, кнопок, карток і Mini App в aipager. Твої сесії Claude не змінюються, і Claude відповідає тією мовою, якою ти йому пишеш. Назви сесій, команди, назви моделей і код лишаються як є.
/language(або перший рядок/settings) вибирає мову того чату, де ти є. В особистому чаті це ще й твоя власна мова: її використовують короткі сповіщення, які ти бачиш у групі, і твоя Mini App.- Автоматично (лише в особистих чатах) іде за мовою твого застосунку Telegram і знову йде за нею, якщо ти її змінюєш. Мова, якої aipager не має, показується англійською.
- Нові та старі чати. Особистий чат, який починається після цієї версії, іде за мовою твого застосунку Telegram, доки ти не вибереш мову, а за його першим повідомленням неанглійською мовою йде один короткий рядок, який каже про це і про те, як змінити. Чат, який існував раніше, лишається англійським. Якщо твій застосунок Telegram працює мовою, якою говорить aipager, ти отримаєш одну картку з пропозицією цієї мови й кнопкою «Залишити англійську»; вона приходить один раз, хоч якою буде відповідь.
- Групи мають одну мову, її задає адмін у
/language; до цього вони англійські. Коротке сповіщення після натискання приходить власною мовою того, хто натиснув: його вибір в особистому чаті з ботом, інакше мова його застосунку Telegram, якщо людина прийшла після цієї версії, інакше мова групи. Див. робота в команді. - Справа наліво. Перською та арабською тексти aipager читаються справа наліво, з перськими або арабськими цифрами. Робоча картка йде за мовою чату, хоч би якою мовою писав Claude: в англійському чаті вона читається зліва направо, у перському чи арабському справа наліво, а речення Claude на ній, написане в інший бік, усе одно читається у своєму напрямку. Відповідь іде за текстом Claude: коли Claude відповідає перською чи арабською в чаті, мова якого пишеться зліва направо, уся відповідь стає повідомленням справа наліво, і власні рядки aipager у ній (агенти під відповіддю, а у вигляді «Відповідь усередині картки» - завершена картка над нею) стоять праворуч, як і решта, але все одно читаються зліва направо.
- Слова режимів.
/modeприймає слово режиму твоєю мовою (/mode Питати), аask,autoіfullпрацюють завжди. Якщо сесія, що працює, має саме таку назву, слово натомість називає сесію (див./modeвище). - Опис бота. Під час запуску aipager записує опис бота (текст на екрані порожнього чату) і короткий опис кожною з цих мов, для людей, у яких Telegram цією мовою. Telegram показує такий текст замість того, що написано в BotFather, тому aipager нічого не ставить, поки в тебе є свій (опис і короткий опис перевіряються окремо). Він ніколи не перезаписує твого тексту й ніколи не змінює англійського тексту чи тексту за замовчуванням. Коли його поточний текст уже стоїть усіма мовами, запуск нічого не питає в Telegram. Інакше він спершу читає твій текст у BotFather (одне читання для опису й одне для короткого опису): якщо він є, aipager на цьому зупиняється, тож зі своїм текстом кожен запуск коштує цих читань і не більше. Якщо твого тексту немає, він читає кожну мову, де ще немає його поточного тексту, тому мова, де в BotFather є твій власний текст, читається заново під час кожного запуску. Якщо написати опис у BotFather після того, як aipager поставив свій, читачі цими мовами й далі бачать опис aipager (див. розв'язання проблем).
Mini App#
/app (і кнопка меню Telegram) відкриває панель, яку віддає сам aipager. Вона ввімкнена за замовчуванням; керуй нею через aipager miniapp enable|disable|status. Кожен запит перевіряється за підписом initData від Telegram (див. безпека → тунель Mini App). Сторінка нічого не вантажить ззовні: ні шрифтів, ні зображень, ні скриптів з інших сайтів.
- Чати. Застосунок показує один чат за раз. Якщо ти є в кількох чатах (скажімо, у своєму особистому та в групі), рядок із назвами чатів угорі перемикає між ними; застосунок відкривається на твоєму власному особистому чаті й запам'ятовує твій останній вибір на цьому телефоні. Усе нижче стосується вибраного чату, з твоєю роллю в ньому. З одним чатом рядок не показується. Див. робота в команді.
- Сесії. Одна фраза підсумовує чат, наприклад «1 чекає на тебе, 2 працюють, 3 готові», а під нею витрачена сума. Кожна запущена сесія - це плитка з кільцем контексту, її папкою, моделлю і вартістю; ті, що зараз працюють, світяться кольором акценту. Завершені сесії лежать на полиці Завершені, яку можна згорнути. Кнопка + запускає нову сесію.
- Чекають на тебе. Сесія, яка чекає на запит на дозвіл або питання, стоїть у бурштиновій смузі вгорі й показує, про що вона питає. Відповісти в чаті знову надсилає цей запит із його кнопками в кінець чату, так само як кнопка Відповісти в закріпленому рядку, і ти відповідаєш там. Якщо це була єдина сесія, що чекає, застосунок закривається, щоб запит був просто перед тобою; інакше він лишається відкритим і пише «Надіслано в чат». Для цього потрібне право надсилати повідомлення сесії, а копія, натиснута після того, як на запит відповіли або його замінили, пише «уже є відповідь».
- Сторінка сесії. Шапка показує кільце контексту, стан («Працює (3:12)», «Чекає на тебе (дозвіл)», «Готова, остання активність 5 хв тому», «Завершена») і Зупинити в одне натискання (поки вона працює чи чекає) або Продовжити (коли вона закінчилася). Нижче: запит, що чекає, з Відповісти в чаті, останні виклики інструментів смужкою (натисни, щоб побачити повну хронологію), остання відповідь, відомості, перемикач моделі, власні налаштування сесії, змінені файли та хронологія. Меню ⋮ містить усі дії, з тими самими підтвердженнями, що й раніше.
- Нова сесія. Покрокова картка: назва, потім Де (з підказками Нещодавні для папок, які використовують твої сесії, спершу нові), потім модель (з підказками Радимо), потім Ще параметри для режиму дозволів і стилю відповідей. Власна кнопка Telegram унизу називається Запустити сесію. Для учасника, чия роль без
can_manage, крок «Де» пропонує лише кореневу папку чату і папки просто всередині неї (коренева папка за замовчуванням, а «Нова папка» створює всередині вибраної); папка поза нею відхиляється з причиною, а «Продовжити», «Перезапустити» і зміна режиму сесії, яка працює поза нею, відповідають «Ця сесія працює поза твоєю папкою ~/..., тож твоя роль не може її продовжити, перезапустити чи змінити її режим. Попроси адміна.» - Налаштування. Спершу Мова застосунку: твоя власна мова для текстів aipager у застосунку і в твоєму особистому чаті (англійська, іспанська, російська, португальська (Бразилія), китайська (спрощена), французька, німецька, корейська, арабська, індонезійська, українська, італійська, турецька, перська або в'єтнамська; «Автоматично» йде за мовою твого застосунку Telegram, див. Мови). Кожен може змінювати свою, вона ніколи не публікується в чаті й не змінює твоїх сесій Claude. Потім налаштування чату (у групі змінювати їх може лише адмін; у своєму власному особистому чаті можеш ти, хоч яка роль, так само як
/settingsтам) і, для адміна, Оновлення, які повторюють/update. Для власника в його особистому чаті Повідомити про проблему відкриває свою сторінку: напиши примітку, перевір звіт, надішли його і подивися його номер, не виходячи із застосунку (див. звіти про проблеми).
Застосунок іде за світлою чи темною темою Telegram, коли ти її перемикаєш, і зупиняє свої м'які анімації, коли телефон просить менше руху. Усе, що є в Mini App, доступне й із чату: меню ⋮ на панелі сесії містить ті самі дії.
Зміна моделі в сесії, що працює#
На сторінці сесії, що працює, є перемикач Модель, який показує модель, про яку повідомляє сесія (з рядка стану Claude Code), і той самий список, що пропонують вибір під час запуску і клавіатура моделей у чаті. Вибір однієї вводить у цю сесію саме /model <name>, той самий ввід, що використовує клавіатура моделей у чаті, з тим самим правилом про те, кому це можна (будь-кому, хто може надсилати повідомлення сесії). Перемикач показує змінюю…, поки рядок стану не повідомить іншу модель, а потім показує її; якщо за 15 секунд нічого не змінилося, він показує не підтверджено (перевір сесію).
- Лише поки сесія готова, а не поки Claude працює чи відкрито запит. Claude Code виконує
/modelодразу, навіть посеред завдання, а не після нього, тому зміна відхиляється, доки завдання не закінчиться. Клавіатура в чаті відмовляє в тих самих станах тими самими словами. - Питання «Switch model?» від Claude Code. Перед зміною Claude Code зазвичай ставить це питання, бо наступна відповідь має перечитати всю розмову. З Claude Code 2.1.251 або новішим hook
PreModelSwitchвід aipager схвалює зміну, яку aipager щойно ввів, тому питання не ставиться (див. hooks). Будь-яка інша зміна й далі питає. Зі старим Claude Code або під час зміни наopusplanчи з нього питання все ще може з'явитися. Тоді зміна показується як не підтверджено, а питання чекає в терміналі. Дай відповідь там, перш ніж надсилати сесії щось іще, інакше твоє наступне повідомлення було б введено в це питання. З тієї самої причини aipager відмовляє в ще одній зміні цієї сесії протягом хвилини після непідтвердженої або поки сесія не повідомить нову модель.
Закріплений рядок стану#
У кожному чаті, де говорить aipager (твій особистий чат і кожна група), є одне закріплене повідомлення: рядок стану. Смуга Telegram угорі чату показує повідомлення з його першого рядка, склеюючи рядки поспіль, тому цей рядок каже про те, що найбільше на тебе чекає:
| Перший рядок | Коли |
|---|---|
⏳ jim чекає на тебе - Bash: make deploy | сесія чекає на запит на дозвіл, питання або інтерактивний запит; (+ще 2 сесії), коли чекають і інші |
⚙️ jim (працює) / 💤 jim (готова) | у чаті одна сесія, що працює, і вона працює / готова (🔄 jim (запускається), поки запускається): цей рядок і є весь рядок стану, крім рядка про ліміти |
⚙️ 2 працюють · 1 готова | кілька сесій, жодна не чекає: скільки в кожному стані (працює, готова, запускається); 🔄, коли жодна не працює, а одна запускається, 💤, коли всі готові |
💤 усі готові | немає сесій, що працюють |
Нижче, лише поки це актуально, рядок про ліміти (🐢 надсилає повільніше після попередження Telegram (шість годин після 429) або ⏸ картки поки не оновлюються (годинний ліміт Telegram) / (ліміт Telegram) (мінімальний режим, див. розв'язання проблем)), а потім, коли в чаті більше однієї сесії, що працює, ✍️ Повідомлення йдуть у jim (сесія, куди йде звичайне повідомлення в цьому чаті, див. нижче; не в групі, де в кожного своя) і по рядку на сесію з її станом: працює, чекає на тебе, готова або запускається. Рядок стану називає кожну сесію один раз: сесія, що чекає, яку називає перший рядок, свого рядка не отримує, а перший рядок ніколи не перелічує назв, які повторюють рядки нижче. Сесія, у якої у фоні ще працюють агенти, каже, скільки їх, у своєму рядку (або в єдиному рядку, якщо сесія одна): 💤 jim (готова, 1 агент працює). Команди, які Claude виконує у фоні, рахуються так само: (готова, 1 фонова команда працює) або (готова, 2 агенти і 1 фонова команда у роботі), якщо є і те, і те. Це завжди число, а не їхні назви, тому рядок змінюється, лише коли змінюється число. Натисни на рядок, щоб перейти до повідомлення.
Куди йде звичайне повідомлення. Повідомлення, яке не є відповіддю, іде в сесію, з якою цей чат спілкувався останньою: на яку чат востаннє перемикали через /<label>, якій тут востаннє писали, яку тут запустили або яка остання відповіла тобі тут. Голі /mode, /clearqueue, /diff чи /now діють на цю саму сесію (/stop зупиняє ту, що працює). Кожен чат має свою: повідомлення в одному чаті ніколи не йде в сесію, яка належить іншому чату. У групі рахуються лише відповідь ботові, повідомлення з його згадкою, команда або натискання на клавіатуру групи (див. робота в команді), і кожна людина має свою адресу, яку відповідь сесії не зсуває (див. робота в команді).
Кнопки закріпленого повідомлення:
- Відповісти <label> (по одній на кожну сесію, що чекає, не більше трьох) знову надсилає запит цієї сесії з його кнопками відповіді в кінець чату, щоб на нього можна було відповісти без прокручування. Якщо на нього тим часом відповіли, натомість прийде коротке сповіщення «уже є відповідь», а копія (або початковий запит), натиснута після того, як на запит відповіли деінде, відхиляється так само: вона ніколи не відповідає на пізніший запит. Після перезапуску aipager запит, який чекав, і далі працює з робочої картки або зі свого повідомлення, але aipager уже не знає, який запит показувала старіша копія, тому натискання на копію, яку рядок надіслав до перезапуску, відхиляється з «цей запит уже закрито». Користуватися нею може будь-хто, хто може відповісти на запит; більше ніхто.
- 📱 App відкриває Mini App, у твоєму особистому чаті, поки Mini App увімкнена.
У рядку немає годинника, вартості, % контексту й моделі, тому він змінюється, лише коли змінюється стан сесії. aipager править його (тихо, без сповіщення) лише коли змінилося те, що він показує, не частіше разу на 30 с на чат (PINNED_MIN_EDIT_GAP); зміна всередині цього проміжку показується, коли проміжок закінчиться, і ніколи не губиться. Він ніколи не правиться, поки надсилання в чат вимкнено через блокування, і надолужує, коли блокування знімають.
У групі ботові потрібні права адміна, щоб закріплювати. Якщо закріпити не дали, aipager видаляє щойно надіслане повідомлення стану (щоб воно ніколи не висіло незакріпленим в історії групи) і не показує рядка в цій групі до перезапуску aipager; те саме для чату, який узагалі відмовляє ботові (вигнав, заблокував). Якщо видалити закріплене повідомлення, aipager надішле й закріпить нове, не частіше разу на годину на чат.
Постійна клавіатура#
Під полем вводу чату є постійна клавіатура. Ряди згори вниз:
| Ряд | Кнопки | Примітки |
|---|---|---|
| Сесії | по кнопці на назву кожної сесії, що працює | збирається сам за списком сесій |
| Дії | статус, стоп, нова | швидкі текстові кнопки (завершити і далі працює, якщо його набрати; завершення сесії є в /status → ⋮) |
| Навігація | Шаблони, Команди | Mini App відкривається кнопкою меню поруч із полем вводу або командою /app, а не з цієї клавіатури |
Модель › лежить усередині підменю «Команди». Натискання на пункт підменю надсилає готове повідомлення або slash-команду:
- Шаблони: повідомлення, які ловиш себе на тому, що набираєш знову і знову, наприклад «Напиши тести», «Поясни план», «Онови пам'ять».
- Команди: slash-команди, які розуміє сам Claude Code (
/compact,/clearтощо), вводяться одразу. Команда чи шаблон називає сесію, куди їх надіслано (🧹 /clear надіслано в x1). Очищення розмови відхиляється, поки сесія працює (⚠️ Не можна очистити розмову, поки сесія працює). - Моделі: швидка зміна моделі для активної сесії. Є родинні аліаси (
sonnet,opus,haiku,fable,opusplan), які завжди означають найновішу модель своєї родини, і закріплені моделі (claude-opus-5-5,claude-opus-5-5[1m]з вікном контексту 1M,claude-sonnet-5-5,claude-fable-5-1,claude-haiku-5-5). Вибір під час запуску і на сторінці сесії в Mini App використовує той самий список. Зміна відхиляється, поки сесія працює або відкрито запит. Відповідь🔄потім змінюється і показує модель, про яку повідомляє сесія, або каже, що зміну не підтверджено (див. Зміна моделі в сесії, що працює).
Щоб змінити розкладку за замовчуванням, напиши ~/.config/aipager/keyboard.json:
{
"templates": [{"label": "Deploy", "prompt": "Deploy to staging"}],
"commands": [{"label": "Compact", "send": "/compact"}],
"models": [{"label": "Sonnet", "send": "/model sonnet"}]
}
Кожен розділ незалежний: відсутні розділи беруться з вбудованих значень, тож можна змінити один, не вказуючи решти. Пошкоджений JSON ігнорується з попередженням у лозі. Зміни потребують перезапуску aipager.
Кнопки під кожним повідомленням#
Більшість відповідей бота мають кнопки під ситуацію:
Запити на дозвіл#
Коли Claude хоче запустити інструмент, який потребує схвалення, робоча картка стає запитом на дозвіл:
🔐 Bash: List the temp directory
ls -la /tmp
[✅ Дозволити] [❌ Відхилити]
[🟢 Дозволяти завжди] [⏹ Зупинити]
Картка показує справжню команду (або шлях до файлу), яку Claude хоче запустити, під його власним описом: схвалюй те, що можеш прочитати. Символ, який змінив би порядок, у якому малюється текст (керувальний символ напрямку Unicode на кшталт U+202E, через який одна команда може виглядати як інша), показується міткою виду ⟨U+202E⟩, і тоді картка додає ⚠️ Тут є приховані символи, що змінюють напрямок тексту (показані як ⟨U+...⟩). Виконатися може не те, що ти бачиш.
- Дозволити: схвалює цей один виклик.
- Відхилити: відхиляє його; Claude не запускає інструмента.
- Дозволяти завжди: схвалює і додає постійне правило, яке пропонує Claude («більше не питати для …»). Кнопка з'являється лише коли Claude пропонує таке правило; для команди, з якої він не може вивести правила (більшість складених команд), на картці натомість Дозволити / Відхилити / Зупинити, як і для доступу до файлу лише на читання (
Read,Grep,Glob) поза робочою папкою сесії. Claude Code 2.1.259 і новіші ставлять на це місце у власному діалозі Bash рядок «перейти в режим авто», у діалозі читання поза папкою рядок «надалі блокувати читання поза робочими папками», а для Write/Edit, з якого він не може вивести правила для файлу, зміну режиму дозволів на кшталт автоматичного прийняття всіх правок файлів (acceptEdits); aipager ніколи не вибирає жодної з них; змінюй режими свідомо через/mode. - Зупинити: перериває завдання замість відповіді.
Відповідь іде в Claude Code через hook дозволів aipager, який чекає на неї до 20 секунд. На запит, що прийшов раніше за робочу картку (тоді він надсилається окремим повідомленням, лише з Дозволити і Відхилити), відповідають так само. Коли це очікування закінчилося, кнопки натомість вводять відповідь у власний діалог Claude Code; Відхилити тоді вибирає останній рядок діалогу («No, and tell Claude what to do differently»), який закінчує завдання Claude, як Зупинити, і картка пише 🚫 jim · Відхилено.
Кожне натискання записується в ~/.claude/aipager-audit.jsonl і повторюється однорядковою відповіддю під робочою карткою: ✅ jim · Дозволено · @alice · Bash: List the temp directory (опис виклику або його команда, якщо опису немає; з чатом, налаштованим через aipager config; в особистому режимі просто Дозволено).
Поки на тебе чекає запит (або AskUserQuestion), сесія показується такою, що чекає, а не готовою. Якщо Claude Code під час цього очікування нагадує, що ввід простоює, чат отримує ⬆️ jim · досі чекає на твою відповідь вище відповіддю на запит, один раз за очікування.
Діалоги AskUserQuestion показуються так само, з кнопкою на кожен варіант (перші чотири), а для питання, де можна вибрати кілька відповідей, із прапорцями ⬜/☑ і кнопкою ✅ Надіслати. Питання й опис кожного варіанта показуються повністю, як у терміналі. Скорочується лише форма, задовга для одного повідомлення Telegram: робоча картка спершу показує менше рядків інструментів, а потім найдовші з питання й описів обрізаються по слову з ….
Більше ніж один запит. Claude Code може чекати на два запити одночасно: фоновий агент просить дозволу, поки Claude ставить тобі питання, або навпаки. aipager показує кожен із них: перший на робочій картці (або окремим повідомленням), кожен наступний окремим повідомленням під карткою, зі своїми кнопками. Сесія показана такою, що чекає, доки не буде відповіді на останній, а повідомлення, надіслане за цей час, затримується доти. Відповідай у будь-якому порядку. Дозволити і Відхилити йдуть через hook дозволів, поки він чекає, і він доходить саме до цього запиту, де б той не був. Натискання, якому треба вводити клавіші (варіант питання або Дозволити і Відхилити, коли hook уже не чекає), вводить їх лише в той запит, який Claude Code показує першим: Claude Code показує один діалог за раз, і клавіші потрапляють у верхній. Інакше натискання нічого не вводить, лишає свої кнопки і каже Claude Code зараз спершу показує інший запит: спершу дай відповідь на нього, потім на цей. або, коли aipager не знає порядку (наприклад, в агента, чий запуск він не бачив), aipager не може зрозуміти, який запит Claude Code показує першим, тож дай відповідь на цей у терміналі. Якщо на запит картки відповіли першим, картка показує, що чекає, лише з кнопкою Зупинити, а інші запити зберігають свої кнопки. Якщо Claude закінчує завдання, поки запит агента ще відкритий, відповідь приходить як звичайно, і сесія далі чекає на цей запит, який знову приходить окремим повідомленням. Перезапуск, коли відкрито два чи більше запитів, не повертає жодного: їхні кнопки відповідають уже є відповідь і нічого не вводять, а на запити й далі можна відповісти в терміналі. Один відкритий запит повертається, як раніше.
На 80 % контексту чат отримує ⚠️ name · Контекст заповнено на 82% - скоро стиснеться автоматично з 📦 Стиснути зараз, яка надсилає /compact цій сесії. Попередження приходить один раз за розмову: стискання його не повертає, а нова розмова (наприклад, після /clear) отримує його знову.
Старі кнопки#
Кнопки, які діють на завдання, що триває (Зупинити, Завершити, Перезапустити, зміна /mode і її «Зупинити і змінити», «Замінити» в /new), прив'язані до завдання, для якого їх показали. Кнопка, що лишилася від попереднього завдання, нічого не змінює й не діє на те, що йде зараз, і так само кнопка, показана до того, як сесія завершилася і її продовжили чи перезапустили. Завершити, Перезапустити, зміна /mode і Зупинити в /status або в списку /stop відповідають x1 почала нове завдання: … з тим, що натиснути чи надіслати знову (або Ця сесія завершена.); Зупинити на робочій картці відповідає Це завдання вже закінчилося: …, а «Зупинити і змінити» в /mode перетворює свою картку назад на картку /mode під ⚠️ x1 почала нове завдання, тому нічого не змінилося. «Замінити» в /new пише x1 тим часом почала роботу. Надішли /new знову, щоб замінити її., коли сесія почала завдання після того, як було показано її картку.
Кнопки запиту прив'язані до цього запиту. Коли на нього відповіли, у Telegram чи в терміналі, вони відповідають уже є відповідь і нічого не вводять, навіть поки інший запит сесії ще відкритий.
Кнопка ⚡ Надіслати зараз діє лише на те повідомлення, під яким стоїть: якщо Claude це повідомлення вже забрав, натискання відповідає Claude уже забрав його, нічого не надсилає і прибирає рядки черги.
Відповіді#
Коли завдання закінчується, відповідь приходить так, як каже твій вигляд повідомлень (див. нижче і Налаштування). Якщо відповідь Claude довша, ніж уміщається в одне повідомлення (близько 32 КБ), повідомлення показує стільки, скільки вміщається, під позначкою 📎 Повна відповідь у файлі нижче ↓, а все завдання (його кроки й повна відповідь) приходить файлом <name>_full_log.md, який Telegram показує без іншого застосунку. Той самий файл додається, коли робочій картці довелося викинути рядки.
Завдання, яке закінчується помилкою API Anthropic (кредити, перевантаження, ліміт запитів, мережа), показує ⚠️ name · <what went wrong> замість відповіді, з 🔄 Повторити, яка знову надсилає останнє повідомлення в ту саму сесію. Поки надсилання в чат вимкнено через блокування, натискання взагалі нічого не робить (повідомлення не надсилається знову, кнопка лишається), тож натисни її ще раз, коли блокування знімуть.
У вигляді з карткою («Картка + відповідь окремо») завершена картка лишається над відповіддю як запис того, як до неї прийшли: її рядки інструментів, рядки агентів і те, що Claude казав між ними. Відповідь приходить окремим повідомленням (зі сповіщенням). Від завдання, яке не викликало жодного інструмента (ні інструмента, ні агента, ні фонової команди, ні запитання чи запиту на дозвіл), лишилося б тільки ✅ name · Готово · Ns, тому його картка прибирається, поки на ній ще «Працює», і ніколи не стає «Готово», а перший рядок відповіді натомість показує час (💬 name · Завершено (…)). Надсилання тобі файлу тут не вважається викликом інструмента: файли приходять після відповіді. Завдання без відповіді, яку можна показати, або завдання, що закінчилося помилкою API, зберігає свою картку. Щоб було одне повідомлення на завдання, вибери «Відповідь усередині картки» (відповідь потрапляє в картку) або «Лише відповідь (без картки)» (картка прибирається, і відповідь стоїть сама).
Кожне завдання має рівно одну робочу картку. Повідомлення, яке ти надсилаєш, поки триває завдання, ніколи не додає цьому завданню другої картки, а картка, чиє завдання закінчилося, більше не тримає кнопки Зупинити: якщо її ніщо не закрило (загублений hook Stop, перезапуск), aipager закриває її через 30 секунд так, як каже твій вигляд. Після перезапуску aipager картка, чиє завдання ще триває, зберігається й одразу продовжує цокати, відраховуючи час від початку завдання, а сесія показується такою, що працює, до кінця завдання; будь-яка інша картка, що лишилася з часу до перезапуску, закривається («aipager перезапущено», без Зупинити). Сесія, яка чекала на запит на дозвіл або одне питання від Claude, повертається такою, що чекає, а не працює: її картка і закріплений рядок кажуть, що вона чекає на тебе, а кнопки запиту й далі на нього відповідають, якщо лише історія розмови не показує, що на нього тим часом відповіли в терміналі. Питання з кількох частин або з кількома варіантами і запити від субагента лишаються терміналу. Коли відомо, що запит закінчено (на нього відповіли натисканням чи в терміналі, його завдання закінчилося, або перезапуск його не повернув, бо на нього тим часом відповіли чи його не вдалося зберегти й прочитати назад), його старі кнопки відповіді відповідають «уже є відповідь» і нічого не вводять, навіть після перезапуску. Запит, на який ніхто не відповідає, лишається відкритим, поки Claude на нього чекає. aipager перестає на нього чекати, лише якщо від Claude 5 хвилин немає новин і збережена розмова показує, що запит уже позаду (звістка про відповідь загубилася); такий запит не вважається закінченим, тому його кнопки й далі відповідають у діалозі. Зважають лише на новини від самого Claude і від агента, який запитав: фоновий агент, що працює сам по собі, не рахується, а збережена розмова нічого не каже про запит агента: такий запит чекає на новини від самого цього агента.
Завдання, яке Claude починає сам (фоновий агент звітує через <task-notification>, коли жодна робота не відкрита), отримує робочу картку лише коли щось робить: під час першого виклику інструмента або через 15 с, що раніше. Більшість таких пробуджень - це кілька секунд «нічого нового»; вони тепер показують лише відповідь. Індикатор «друкує…» і далі видно, поки воно триває, а сама відповідь завжди доставляється: нічого не відфільтровується як неважливе. Завдання, які починаєш ти, з Telegram чи з термінала, і далі одразу отримують картку.
Поки сесія працює, кожен фоновий агент, якого запускає Claude (через інструмент Agent у Claude Code, Task у старих версіях), отримує свій рядок на робочій картці: 🤖 <type> · <activity> · <elapsed>, з типом агента і тим, що він зараз робить, і він оновлюється в міру його власних викликів інструментів. Коли цей агент зробив три виклики інструментів чи більше, вони згортаються у свою кнопку ▸ використано N інструментів просто під його рядком; вони ніколи не з'являються в хронології основного завдання і в її підрахунках Bash ×N. Коли агент закінчує, його рядок застигає в ✅ 🤖 <type> · N інструментів · <elapsed> і зберігає ту саму кнопку. Агент, якого запустив інший агент (помічник), перед своїм типом називає агента на вершині свого ланцюжка, 🤖 pipeline-runner › ship-tester, якщо в момент запуску aipager знає, хто його запустив; рядки лишаються в тому порядку, у якому запускалися агенти. Файл .md вище отримує розділ «Агенти» з кожним агентом, який працював у завданні, його часом, кількістю інструментів та інструментами, які він використав.
Поки фонові агенти ще працюють після кінця свого завдання, картка лишається станом роботи. Коли Claude тим часом забирає нове повідомлення, жива картка - це та, що під цим повідомленням, і вона й далі показує агентів, що працюють. Повідомлення, яке ти надсилаєш у готову сесію, починає нове завдання: картка попереднього завдання застигає там, де стоїть, зі збереженими кроками, а нове завдання отримує свою картку. Повідомлення, яке стояло в черзі й було забране, продовжує завдання роботи: його картка надсилається заново під цим повідомленням, а стара копія видаляється. Виклики інструментів усередині агента ніколи не показуються власними рядками основного завдання і ніколи не змушують aipager думати, що почалося нове завдання.
Команда, яку Claude виконує у фоні (run_in_background, Ctrl+B або та, яку Claude Code переносить туди, коли вона йде задовго), отримує свій рядок, поки працює: ⏳ фонова команда: <description> (3:12), названий за описом виклику або інакше за першим рядком команди. Коли вона закінчується, рядок застигає в ✅ фонова команда: <description> - завершена (6:12), ❌ ... - завершена з помилкою (код виходу 1) або ⏹ ... - зупинена (6:12) (Claude зупинив її через TaskStop або Claude Code зупинив її через брак пам'яті); рядки з помилкою і зупинені зберігають цю позначку на завершеній картці. Завдання, яке закінчується, поки така команда ще працює, не закінчене: картка чекає як стан роботи (🔄 name · 1 фонова команда ще в роботі · 4:10 або 1 агент (ship-reviewer) і 1 фонова команда ще в роботі, якщо є й агент), а коли команда закінчується, продовження Claude іде на тій самій картці. Команди, запущені всередині агента, належать цьому агентові й не показуються. Команда, кінця якої aipager так і не бачить (перезапуск, загублена подія), перестає рахуватися через дві години (AIPAGER_BG_SHELL_MAX_TRACK, у секундах): її рядок пише ⏹ ... - кінця не помічено, а робота, яка чекала лише на неї, закривається з ⚠️ name · Завершено (2:00:04, від фонової команди немає новин).
Коли хронологія завдання стає довгою, кожен раніший відрізок викликів інструментів (три чи більше поспіль, і не той, що йде зараз) згортається у свою кнопку ▸ використано N інструментів просто там, де він був, замість того щоб накопичуватися повністю чи обрізатися власним лімітом довжини повідомлення Telegram; натисни будь-яку, щоб прочитати на місці. Коментарі ніколи не згортаються; найсвіжіша активність і рядок стану завжди видно без натискань. Власний рядок фонового агента, який ще працює (або щойно застиг), ніколи не згортається сам, лише його виклики інструментів, і ніколи, поки він - єдине, що стоїть між хронологією і лімітом. Лише якщо хронологія настільки велика, що не вміщується навіть з усім згорнутим, вміст справді прибирається з картки; тоді повний запис є у файлі .md вище.
Агенти, які ще працюють, коли йде відповідь#
Claude Code може запускати агентів у фоні, а завдання, яке їх запустило, може закінчитися, поки вони працюють. Тоді відповідь закінчується розділовою лінією і коротким станом цієї фонової роботи, у стилі власної панелі агентів Claude Code, і він оновлюється, поки робота триває. Усе під лінією написано дрібним шрифтом (підвалом Telegram), щоб сама відповідь виділялася:
⏳ У роботі: 5 агентів · 🖥 У роботі: 1 фонова команда (shell)
○ 🤖 pipeline-runner · Writing final.md for the pipeline
- 🤖 ship-tester · Write and run criteria tests
- 🤖 ship-developer · Editing state.py
- 🤖 ship-developer › ship-reviewer · Collect line numbers
‖ 🤖 r2-runner · чекає на своїх агентів
Коли агенти закінчать, результат прийде саме сюди.
- Перший рядок рахує. Агентів, які працюють (або закінчили), і фонові команди цієї роботи, які тривають, закінчилися або зупинені. Фонова команда - це завжди лише число, ніколи не її команда.
- По рядку на агента, 🤖 і його тип жирним, потім те, що він робить зараз: його власний останній рядок тексту (слова Claude, як їх написано, ніколи не перекладені), інакше його останній інструмент короткою фразою, яка називає, над чим він працює (
Reading state.py,Writing final.md,Searching for …або власний опис команди), інакше завдання, яке Claude дав агентові під час запуску, інакше просто його останній інструмент (Running a command,Using TodoWrite), інакше просто тип. Так два агенти одного типу, що виконують команди без опису, однаково показують кожен своє завдання. Агент, який зупинився, щоб дочекатися агентів, яких запустив сам, натомість пише‖ … чекає на своїх агентів. - Агенти деревом. Агенти, яких запустила сесія, - це перший рівень. Кожен агент, якого запустив один із них, на будь-якій глибині, стоїть просто під ним, кожен одразу після агента, який його запустив; агент, якого запустив агент другого рівня, спершу називає цього агента (
ship-developer › ship-reviewer). Робоча картка натомість називає того самого агента після агента на вершині (pipeline-runner › ship-reviewer). Рівнів ніколи не більше двох. В агента другого рівня, що працює, немає свого ○: там Telegram малює маркер списку. Агент, про якого aipager ще не знає, хто його запустив, показується на першому рівні, ніколи не під здогадом, і переїжджає під того, хто його запустив, щойно це стає відомо. - Не більше шести рядків, спершу агенти, які ще працюють, потім
і ще N агентівдля агентів без рядка. Агент ніколи не показується без агентів над ним. - Обіцянка «Коли агенти закінчать, результат прийде саме сюди.» лишається, лише поки якийсь агент ще працює. У фонових команд її ніколи немає: сервер розробки може не закінчитися ніколи.
Рядок кожного агента сам застигає, коли цей агент зупиняється, у ✓ 🤖 Explore · готово (0:42) (скільки працював цей агент), а перший рядок зменшує лік. Агент, якого агент зі списку запускає вже після того, як відповідь пішла, потрапляє в стан під ним під час наступного оновлення; агент, якого пізніше запускає сама сесія, показується під однією з наступних відповідей. Коли всі агенти закінчили, рядки поступаються місцем одному рядку з часом від відповіді до кінця останнього агента:
✅ Готово: 2 агенти (6:12) · 🖥 У роботі: 1 фонова команда (shell)
а коли ця команда закінчується, ✅ Готово: 2 агенти (6:12) · Завершено: 1 фонова команда (shell) (2:13:05) (скільки тривала команда; Зупинено, коли її вбили або зупинив Claude, Завершено, коли вона закінчилася сама, з помилкою чи без; її рядок на картці каже, як). Відповідь, робота якої має лише фонову команду, показує 🖥 У роботі: 1 фонова команда (shell), яка застигає в Завершено: 1 фонова команда (shell) (…) або Зупинено: 1 фонова команда (shell) (…).
Рахуються лише фонові команди власної роботи відповіді: сервер розробки, який лишило працювати попереднє завдання, не повторюється під кожною відповіддю (закріплений рядок і далі рахує всі команди). /stop закінчує роботу, але Escape не закінчує фонової команди: та, що ще йде, лишається в закріпленому рядку до свого кінця і більше не рахується під наступними відповідями; її пізніше продовження тоді починає своє завдання.
Ця відповідь іде в момент, коли завдання закінчується, звичайним повідомленням (зі сповіщенням) у відповідь на твоє повідомлення: той самий текст, що показує термінал. Робоча картка лишається над нею як живий стан роботи, за будь-якого вигляду: 🔄 name · 1 агент (general-purpose) ще в роботі · 1:18, зі своєю кнопкою Зупинити. Коли агенти звітують, відповідь Claude на це приходить окремим повідомленням; попередня відповідь ніколи не надсилається знову, навіть після перезапуску aipager. Робота, чиї агенти звітують більше одного разу, дає по відповіді на кожен звіт, кожна надсилається в міру написання.
Агент, який зупинився, поки його власна фонова робота ще йде, вважається таким, що працює, бо він продовжить пізніше. Агента, який запустив власного агента, а потім зупинився, щоб його почекати, впізнають за цим запуском (за його власним викликом, що запустив іншого агента): він лишається в стані як такий, що працює, і тримає роботу відкритою, доки не зупиниться, коли жоден із його власних агентів уже не йде. Якщо він не продовжив через дві хвилини після того, як закінчився останній із них, він більше не вважається таким, що працює, а стан лишається таким, яким його показали востаннє. <task-notification> від Claude для агента каже те саме в примітці; aipager читає її, коли це сповіщення починає завдання, а також коли Claude забирає його посеред завдання, що триває, поки робоча картка на місці. Рядок чекає кілька секунд, перш ніж показатися закінченим, щоб ця примітка встигла його повернути. Стан додається за будь-якого вигляду, мовою чату.
Як він оновлюється. aipager править відповідь тихо, лише коли змінилося те, що показує стан, і не частіше разу на 30 секунд на відповідь (сама відповідь вважається першою). Кожна відповідь зі станом оновлюється так (до п'яти, що чекають, на сесію). Правки мають низький пріоритет: та, яку відхиляє бюджет надсилання або яка припала б на час, коли надсилання в чат вимкнено, не робиться, і стан чекає на наступну зміну. Останню правку, коли все закінчилося, пробують ще раз після зняття вимкнення або відмови бюджету, а потім кидають. Жодних правок у видаленій відповіді, для сесії, яка завершилася чи яку завершили примусово, або коли правка зробила б відповідь задовгою для Telegram (коли довга відповідь обрізається, місце для стану лишається).
Стан лишається таким, яким його було показано востаннє, і ніколи не перетворюється на «готово», коли aipager не може знати, що робота закінчилася:
- агент, про якого aipager нічого не чує 30 хвилин (
AIPAGER_SUBAGENT_SILENCE), більше не вважається таким, що працює, але мовчання - це не завершення; - фонова команда, яка йде довше двох годин (
AIPAGER_BG_SHELL_MAX_TRACK), а її кінця не помічено, більше не рахується; - перезапуск aipager забуває, які відповіді чекають.
Перезапуск aipager зберігає агентів, які ще працюють, зокрема тих, що чекають на власних агентів: відповідь, надіслана після перезапуску, їх перелічує, робоча картка, яку перезапуск підхоплює, знову їх показує, а їхнє подальше закінчення розпізнається як зазвичай. Агенти, збережені більш ніж за 30 хвилин до перезапуску, не повертаються.
Відповідь, притримана через вимкнення надсилання, або доставлена простим текстом після того, як надсилання з оформленням не вдалося, іде без стану, як і завдання, яке закінчується без тексту відповіді (лише заголовок).
Підтвердження завершення#
/kill, його список і ⋮ → ⏹ Завершити сесію завжди питають підтвердження:
⏹ Завершити jim? Claude зупиниться, і сесія закінчиться.
[⏹ Завершити] [Скасувати]
Після ⏹ Завершити повідомлення пише ⏹ jim завершено над рештою сесій цього чату. Підтвердження, натиснуте після того, як сесія почала нове завдання, відхиляється (jim почала нове завдання: …), як і підтвердження для сесії з тією самою назвою, запущеної відтоді.
Встановлення голосових (коли пакета немає)#
Коли ти надсилаєш голосове, а aipager[voice] не встановлено:
⚠️ Для голосових потрібен додатковий пакет
(близько 200 МБ на встановлення і близько 74 МБ на модель під час першого використання).
[📦 Установити голосові] [Скасувати]
Натискання Установити запускає правильну команду встановлення для твого інсталятора (uv tool install --reinstall aipager[voice], pipx install --force або, на крайній випадок, pip install faster-whisper) із правкою повідомлення кожні 5 с, а в разі успіху пропонує кнопку [🔄 Перезапустити aipager].
Перезапуск#
🔄 Перезапустити aipager:
- aipager, який працює як користувацька служба systemd, планує від'єднаний
systemctl --user restart aipager.serviceчерез 5 с (з таймером точністю 1 с), у тимчасовій службі поза групою процесів самого aipager, щоб він пережив вихід aipager. Він відмовляється перезапускати, якщо служба завершила б твої сесії (KillModeнеprocessі неnone), і каже спершу запуститиaipager service install. - macOS, коли агент launchd встановлено (
~/Library/LaunchAgents/com.aipager.daemon.plist):launchctl kickstart -k gui/<uid>/com.aipager.daemon, навіть для aipager, запущеного тобою вручну. - Інакше aipager, запущений тобою вручну (
aipager start), на Linux навіть коли службу теж встановлено: він запускає від'єднану заміну, яка чекає, поки помре батьківський процес, а потім виконує ту саму команду, якою був запущений aipager (її вивід іде в лог самоперезапуску). Поточний aipager акуратно зупиняється, щойно заміна жива.
SSH не потрібен. Щоб завершити оновлення aipager, кнопка 🔄 Перезапустити зараз на картці оновлення натомість перезапускає aipager на місці, у тому самому терміналі (див. Оновлення).
Оновлення#
/update (лише для адмінів; в особистому режимі лише для того, хто встановив aipager) відповідає однією кнопкою, 🔄 Перевірити оновлення. Перевірка йде, лише коли її натискають. Натискання перетворює це повідомлення на рядок на кожен продукт:
aipager 1.0.1 → 1.1.0, коли є новіша версія (найновіша на PyPI);aipager 1.0.1 (остання версія), коли немає;Claude Code 2.1.282 (не вдалося перевірити), коли перевірка не вдалася (немає мережі, ліміт у 5 с абоclaudeне знайдено).
Claude Code порівнюється з найновішою версією його власного каналу оновлень (autoUpdatesChannel: latest, stable або rc). Під рядками дрібно написано, як встановлено aipager (наприклад, pipx, from PyPI або pipx, from local path …; групові чати ніколи не показують шляхів).
Якщо щось новіше, є ОДНА кнопка, яка оновлює лише ті продукти, що мають оновлення: Оновити aipager, Оновити Claude Code або Оновити обидва, плюс Скасувати. Коли пропонується aipager, повідомлення каже і про те, як пройде перезапуск: Перезапуск: автоматично, коли не триває жодне завдання., Перезапуск: після встановлення натисни «Перезапустити зараз». (aipager без служби, див. нижче) або Перезапуск: вручну (причина).
Якщо новіший aipager уже встановлено, але працює все ще старий (оновлення, яке закінчилося без перезапуску, або pip install -U вручну), рядок пише aipager 1.1.0 встановлено, він чекає на перезапуск (зараз працює 1.0.1)., а повідомлення пропонує 🔄 Перезапустити зараз замість оновлення: «Оновити aipager» ніколи не пропонується для версії, якій потрібен лише перезапуск. Встановлена версія перевіряється запуском інтерпретатора, у який перезапустився б aipager, тому версія, яку встановлено, але яка не завантажується, так і каже (aipager 1.1.0 встановлено, але він не завантажується. Перевстанови його командою …) і нічого не пропонує. Випуск, новіший за встановлений, і далі пропонується як оновлення. Новіший aipager на встановленні, яке звідси не оновити (editable, Nix, Snap, системний пакет, контейнер або встановлення іншого користувача), показується з причиною і не пропонується. Так само й новіший Claude Code, встановлений через npm у папку, куди твій користувач не може писати (наприклад, sudo npm install -g в /usr/lib/node_modules), де claude update може лише впасти: рядок пише звідси не оновити: installed with npm into a folder your user can't write to; run "claude install" once to switch to Claude Code's own installer, then restart aipager. Коли оновлювати нічого, повідомлення каже «Усе актуальне.», каже, що одна з перевірок не вдалася, або, коли є щось новіше, чого звідси не встановити, «Є оновлення, але звідси його не встановити.», із кнопкою Перевірити знову і без кнопки оновлення.
Кнопка оновлення запускає лише те, що запропонувала перевірка. Якщо перевірці понад 10 хвилин, відтоді пройшло інше оновлення або версії більше не збігаються з кнопкою, вона натомість просить перевірити ще раз. Кнопки зі старішого меню /update (окремі Оновити Claude Code / Оновити aipager / Обидва) відповідають «Це меню застаріло: надішли /update ще раз» і нічого не роблять. Кожне натискання заново перевіряє правило про адмінів.
Оновлення Claude Code запускає claude update (за абсолютним шляхом, ліміт 5 хв) і повідомляє Claude Code A → B, «уже остання версія» або помилку з кінцем його виводу. Сесії, що працюють, лишаються на старій версії, доки їх не перезапустити (/restart); відповідь їх перелічує. Жодну сесію не перезапускають за тебе. Нові сесії використовують нову версію.
Оновлення aipager (Оновити aipager або друга половина Оновити обидва, яке спершу оновлює Claude Code):
- На встановленні з PyPI, яке вже має останню версію, каже про це й зупиняється.
- Якщо aipager може перезапустити себе сам, спершу чекає, поки нічого не триває: жодної сесії, яка виконує завдання, чекає на відповідь на питання, тримає фонового агента, що працює, показує живу робочу картку, виконує інструмент чи тримає відкритий запит на дозвіл, і жодної притриманої відповіді, що чекає на кінець ліміту. Повідомлення перелічує, на що воно чекає, з Перезапустити зараз (не чекати) і Скасувати. Через 10 хвилин питає знову: Зачекати ще 10 хв, Перезапустити зараз, Скасувати. Година без відповіді, і воно скасовується саме.
- Оновлює через інсталятор, якому належить aipager, що працює (
pipx upgrade aipager,uv tool upgrade aipager,brew upgrade aipagerабо<venv>/bin/python -m pip install --upgrade aipager), за абсолютним шляхом і з лімітом у 10 хв. Поки інсталятор працює, скасувати не можна. - Перевіряє, що нова версія завантажується у свіжому інтерпретаторі. Оновлення, яке не вдалося, тривало задовго або не завантажується, нічого не перезапускає. Оновлення, яке перевищило ліміт, було зупинене посередині, тому повідомлення попереджає, що встановлення може бути неповним, і дає команду перевстановлення, яку треба виконати до наступного перезапуску. Вивід інсталятора показується лише в особистому чаті; група отримує «(вивід у лозі aipager)».
- Якщо під час оновлення почалося завдання, чекає знову.
- Планує від'єднаний
systemctl --user restart aipager.serviceчерез 5 с (з таймером точністю 1 с), і повідомлення про стан пише⏳ aipager A → B встановлено, перезапуск…. Поки чекає крок 5, воно пише⏳ aipager A → B встановлено; перезапуск, коли закінчиться поточне завдання. Після перезапуску новий aipager перетворює це саме повідомлення на✅ aipager оновлено A → B; знову підключено N сесій(і⚠️ Не повернулися: …для кожної сесії, яка не повернулася). Якщо повідомлення видалили або його більше не можна правити, він надсилає результат новим повідомленням у чат, який питав.
У Mini App Налаштування → Оновлення показують «Перезапускаю aipager…» з ліхтариком, що обертається, поки новий aipager не відповість, потім «Оновлено до B; знову підключено N сесій.». Зворотного відліку немає ніколи. Приблизно через 2 хвилини без відповіді (ніколи раніше, ніж старий aipager зміг би повідомити про перезапуск, якого не було) вона пише «Ще перезапускається, відкрий застосунок трохи згодом.». З керованим тунелем aipager перезапуск після оновлення зберігає адресу застосунку (новий aipager підхоплює тунель), тож відкрита сторінка переживає перезапуск і показує «Оновлено до B». Якщо тунель усе ж не вдалося зберегти, приблизно через 2 хвилини сторінка пише «Ще перезапускається, відкрий застосунок трохи згодом.». Оновлення, запущене з aipager без цієї можливості (або з MINIAPP_KEEP_TUNNEL=0), і далі змінює адресу: щойно старий aipager перестає відповідати, відкрита сторінка пише «aipager перезапустився. Відкрий застосунок знову, коли чат повідомить про оновлення»; закрий її й відкрий знову через кнопку меню чату або /app. Вхід у застосунок діє 5 хвилин, тому сторінка, відкрита довше, натомість пише «Відкрий застосунок знову, щоб побачити результат оновлення.».
Після оновлення aipager перезапускає себе сам, лише коли працює як користувацька служба systemd і ця служба має KillMode=process (або none). З небезпечним KillMode aipager однаково оновлюється, а повідомлення пише Потрібен перезапуск: …: спершу виконай aipager service install (він перелічує сесії, які завершив би перезапуск).
Перезапустити зараз, без служби. aipager, якого не перезапускає жоден менеджер служб (aipager start у терміналі чи tmux, Docker або агент launchd на macOS), встановлює оновлення й потім показує Натисни «Перезапустити зараз», щоб запустити її (aipager зачекає, поки не залишиться завдань, що тривають). з кнопкою 🔄 Перезапустити зараз. Натискання (лише для адмінів, як і будь-яка кнопка оновлення):
- перевіряє, що встановлений aipager завантажується (
⏳ Перевіряю встановлений aipager…); зламане встановлення нічого не перезапускає, а якщо версія та сама, повідомлення каже, що перезапускати нічого; - чекає, як і перезапуск через systemd, поки нічого не залишиться в роботі, з кнопками Перезапустити зараз (не чекати) і Скасувати;
- ще раз перевіряє встановлення, потім пише
⏳ aipager A → B встановлено, перезапуск…і акуратно зупиняє aipager (як це робить Ctrl+C); - запускає новий aipager на місці: той самий процес, та сама команда, те саме оточення й та сама папка, у тому самому вікні термінала чи tmux (а в Docker той самий процес контейнера). Сесії далі працюють. Новий aipager змінює повідомлення на
✅ aipager оновлено A → B; знову підключено N сесій.
Натискання за ті кілька секунд, що триває перезапуск, губляться, як і під час будь-якого перезапуску. Ctrl+C або docker stop під час перезапуску перемагає: aipager зупиняється і більше не запускається. Якщо новий aipager не вдається запустити на місці, окрема копія запускає його, коли старий уже завершився (її вивід іде в лог самоперезапуску, aipager.log у папці екземпляра або /tmp/aipager.log, а лог aipager називає команду, яку треба виконати, якщо ця копія не повернеться); якщо не виходить і це, або зник сам інтерпретатор, aipager завершується з кодом 1, а лог aipager пише restart.failed: з командою, яку треба виконати.
Коли aipager узагалі не може перезапустити себе сам, повідомлення замість кнопки дає точні кроки для твого встановлення:
- термінал чи tmux:
У вікні термінала або tmux, де працює aipager, натисни Ctrl+C, а потім виконай aipager start. - macOS:
На Mac виконай launchctl kickstart -k gui/<uid>/com.aipager.daemon. - Docker:
На комп'ютері, де працює Docker, виконай docker restart <container>.(короткий ID контейнера, якщо його ім'я хоста і є таким ID) з нагадуванням, що створений заново з образу контейнер повертає версію aipager з цього образу.
Перезапустити зараз з'являється й у результаті Перевірити оновлення, коли новіший aipager встановлено і він чекає, і в одноразовому сповіщенні: коли hooks Claude Code (які запускаються заново на кожну подію, зі встановленого aipager) уже працюють на новішому aipager, ніж запущений, власник отримує одне тихе повідомлення на кожну новішу версію і кожен запуск aipager, ⚠️ Оновлення aipager зроблено лише наполовину: …, з цією кнопкою. Воно чекає дві хвилини від моменту, коли hooks уперше запустили новішу версію (перезапуск одразу після встановлення його ніколи не показує), а потім чекає, поки в особистому чаті власника не залишиться завдань, що тривають. Після перезапуску в цю версію сповіщення змінюється на ✅ Оновлення aipager завершено: aipager тепер працює на B., без кнопки. У Mini App Налаштування → Оновлення показують той самий стан рядком над карткою, з Перезапустити зараз (спершу питає).
У Mini App Оновлення - це перша картка на вкладці «Налаштування»: її назва, версія, що працює, і маленька Перевірити оновлення в кінці рядка. Відкриття вкладки «Налаштування» саме запускає перевірку (не частіше ніж раз на десять хвилин і ніколи під час оновлення чи перезапуску aipager; невдала перевірка там нічого не пише), а натискання перевіряє завжди. Картка лишається одним спокійним рядком, доки немає що робити: новіша версія приносить свої рядки й одну кнопку оновлення, «Усе актуальне.» - це один рядок без кнопки, а оновлення, що триває, перезапуск чи Перезапустити зараз зберігають свої кнопки.
Одночасно йде лише одне оновлення, через /update, картку Налаштування → Оновлення в Mini App (та сама перевірка, та сама одна кнопка оновлення, та сама робота) і aipager update у командному рядку. Це охоплює й секунди між «встановлено, перезапуск…» і самим перезапуском: /update відповідає, що aipager зараз перезапуститься, Mini App не пропонує кнопок, а Перезапустити aipager у голосових відмовляє, поки оновлення йде або чекає на перезапуск. Якщо через дві хвилини після того, як aipager запланував свій перезапуск, він усе ще живий, він зупиняє запланований таймер перезапуску, знімає блокування оновлення й каже тобі перезапустити його самостійно.
Якщо aipager вимикається, поки працює інсталятор, інсталяторові дають 3 с на завершення, а потім зупиняють (інакше він і далі писав би у встановлення, поки запускається наступний aipager). Повідомлення про стан і після перезапуску нове повідомлення кажуть, що встановлення може бути неповним, і як його полагодити.
Коли вимкнення почалося, нічого не перезапускається і нічого нового не починається: кнопки /update відповідають, що aipager вимикається, Mini App відповідає 503, і не запускається ні інсталятор, ні перевірка версій. Інсталятор, який устигає закінчити за свої 3 с, однаково рахується. Повідомлення про стан каже, що нову версію встановлено і нічого не перезапущено, а наступний запуск повідомляє aipager оновлено A → B. aipager, зупинений через aipager service stop, лишається зупиненим. Частка оновлення у вимкненні займає загалом не більше 8 с.
Звичайні повідомлення#
Текст#
Вважається наступним повідомленням для активної сесії: адреси цього чату, сесії, на яку чат востаннє перемикали, якій тут востаннє писали, яку тут запустили або яка остання відповіла тобі тут (див. закріплений рядок стану). У групі кожна людина має свою адресу, яку відповідь сесії не зсуває (див. робота в команді). Повідомлення доходять до Claude одразу, навіть поки триває твоє власне завдання, так само як ввід у терміналі (у групі повідомлення іншої людини чекає, поки це завдання закінчиться; див. нижче). Надішли кілька, і вони стануть у чергу в самому Claude, який забирає кожне на природній межі:
Реакція на твоєму повідомленні йде за ним, як у Claude Code повідомлення, що чекає, стає із сірого білим:
- 👀: передано сесії (або притримано, див. нижче), але Claude його ще не забрав. Повідомлення, надіслане під час завдання, що триває, лишається 👀, поки чекає в черзі Claude.
- 👍: Claude його забрав: почав із ним завдання, прийняв у завдання, що триває, або передав фоновому агентові, що працює.
- 🤷: його ніколи не заберуть: притримане повідомлення, яке викинули
/stop,/clearqueueчи/killабо яке не вдалося надіслати, коли його відпустили; повідомлення чи команда, які ще чекали, коли їх викинули/stop,/clearqueue,/killабо кінець сесії (не/clearі не/resume); або повідомлення, яке Claude Code відкинув (див. нижче). Повідомлення, які Claude уже поставив у чергу, позначаються, лише поки aipager бачить цю чергу (живе читання історії розмови працює, і не чекає жодна фонова робота); інакше вони лишаються 👀. Escape у терміналі повертає чергу Claude в його поле вводу, звідки її можна надіслати знову, тому повідомлення, викинуте так, теж лишається 👀. - 👌: команда Claude Code, яка виконалася (див. нижче), або aipager, що підтверджує
/stop.
Реакція завжди йде лише вперед, тому повідомлення має не більше трьох, кожну один раз. Реакція, яка потрапляє на блокування через ліміт Telegram, пропускається, а не ставиться пізніше, а очищення позначає не більше десяти найновіших повідомлень, які воно викидає.
Кнопки команд (Стиснути, /model …): натиснута, поки сесія готова, команда одразу отримує 👌; Claude Code виконує її за Enter, а локальна команда на кшталт /model не викликає hook, який міг би сказати про це пізніше. Натиснута під час завдання, що триває (не /model: її відхиляють до кінця завдання, див. Зміна моделі в сесії, що працює), вона лишається 👀, поки це завдання не закінчиться (звичайно, як проміжна зупинка фонової роботи або через помилку API), а потім 👌; викинута до цього через /stop, /clearqueue, /kill або кінець сесії, вона так і не виконалася: 🤷. Якщо Claude Code натомість ставить її в чергу як повідомлення, вона йде шляхом 👀 → 👍. Голосове отримує ті самі реакції, що й текст, щойно його текст надіслано.
Робоча картка і потім відповідь ідуть за повідомленням, яке Claude справді забрав для завдання (тим, з якого він почав, якщо сесія була готова, або тим, яке він прийняв у завдання, що триває), а не просто за останнім надісланим повідомленням. Ще одне повідомлення посеред завдання не «перетягує відповідь» до себе: якщо Claude включає його у відповідь, яку зараз пише, картка переходить до нього в цей момент; якщо Claude спершу закінчує, а потім забирає його, перша відповідь лишається під першим повідомленням, а наступне отримує своє завдання, зі своєю карткою і відповіддю під ним.
Якщо Claude Code відкидає повідомлення одразу (невідома slash-команда або вбудована, яка в терміналі лише відкриває діалог), жоден hook не спрацьовує, тому ніщо не закінчило б завдання, яке aipager щойно оголосив. Через 8 с без жодного hook (PROMPT_HOOK_GRACE_SECONDS) робоча картка стає ⚠️ name · Claude Code не прийняв повідомлення з поясненням в один рядок, і сесія знову готова; причину видно в терміналі, а повідомлення отримує 🤷 (slash-команда натомість отримує 👌: вбудована команда, яка відкриває діалог, теж не викликає hook). Так оцінюється лише повідомлення, яке почало завдання; повідомлення, яке чекає за завданням, що триває, лишається 👀, поки Claude його не забере або його не викинуть.
Три випадки притримуються замість надсилання і доставляються самі, коли розв'яжуться:
- Відкрито запит на дозвіл або питання, і так увесь час, поки він відкритий (обмеження часу немає): інакше твій текст прочитали б як відповідь на цей діалог. Тоді на твоє перше повідомлення приходить одна відповідь під запитом: Claude досі чекає на твою відповідь (наступні отримують лише 👀). Щойно ти відповіси, у Telegram або в терміналі, затримані повідомлення йдуть до Claude в тому порядку, у якому ти їх надсилаєш, а ця відповідь видаляється. Якщо сесія завершиться, поки запит відкритий, їх буде відкинуто з 🤷.
- (Командний режим) Повідомлення іншої людини ще чекає, коли його заберуть.
- (Командний режим) Триває завдання іншої людини, зокрема фоновий агент, якого вона запустила. Завдання, набране в терміналі, вважається завданням власника, тому до нього приєднується лише повідомлення власника (або, в особистому чаті, його власного учасника).
Останні два тримають повідомлення різних людей поза спільним завданням, щоб кожне виконувалося з правами свого відправника. Якщо якесь усе ж приєднується (наприклад, від відправника, якого aipager не знає і який ніколи не притримується), завдання виконується за найсуворішими правилами з усіх учасників (див. робота в команді). Якщо завдання, на яке чекає повідомлення, зупиняють або його перериває заблокований інструмент, притримані повідомлення викидаються з 🤷.
Притриманих повідомлень не більше 50 на сесію, і вони спливають через 24 год; /clearqueue викидає їх разом з усім, що тримає Claude.
Надіслати повідомлення з черги зараз#
Повідомлення, яке ти надсилаєш, поки Claude працює над твоїм власним завданням, одразу йде в Claude (aipager його не притримує) і чекає в черзі Claude, поки не закінчиться поточний крок. Щойно черга Claude його показує, aipager відповідає під ним:
⏳ У черзі: Claude прочитає його після поточного кроку
[⚡ Надіслати зараз]
Кожне повідомлення, що чекає, має свій рядок, і кожен рядок зникає зі своїм 👍 у момент, коли Claude забирає це повідомлення. Повідомлення, яке Claude забирає до того, як помічено його запис у черзі, рядка не отримує, лише 👀, а потім 👍.
Натискання на ⚡ Надіслати зараз (або надсилання /now) натискає в цій сесії власні клавіші «надіслати зараз» Claude Code (Ctrl+X, потім Ctrl+S). Тоді Claude читає все, що має в черзі, разом, а не лише повідомлення, під яким натиснули. Що відбувається з роботою, що триває, вирішує Claude Code: команда чи агент, що працює, і далі працює у фоні; якщо Claude пише відповідь, вона переривається і починається заново з твоїм повідомленням. Будь-який інший вид кроку (наприклад, інший інструмент) теж може бути перервано після короткої відстрочки. У деяких випадках (наприклад, коли фонові задачі Claude Code вимкнено) «надіслати зараз» стає простим перериванням поточного кроку. Усе це - власна поведінка «надіслати зараз» у Claude Code, а не рішення aipager.
Натискання відповідає Одразу надіслано Claude, і всі рядки зникають разом, бо «надіслати зараз» віддає Claude усе, що він тримає; /now прибирає їх так само, і для повідомлень, які надіслало «Надіслати зараз», рядка не буде (повідомлення, надіслане після цього, матиме свій). Якщо Claude перериває поточний крок, а не відводить його у фон, він одразу забирає лише найстаріше повідомлення, що чекає, а решту читає на наступному кроці; відповідь приходить під повідомленням, яке він забрав, і це повідомлення не виконується двічі. Якщо клавішам потрібно більше миті, щоб дійти до Claude (завантажений комп'ютер), натискання натомість відповідає Одразу надсилаю Claude; рядок тоді зникає, коли вони дійшли, або, якщо їх не вдалося доставити, лишається і пише ⏳ У черзі: немає зв'язку з Claude, натисни «Надіслати зараз», щоб спробувати знову, зі своєю кнопкою, щоб можна було натиснути знову. Клавіші натискаються, лише коли історія розмови Claude показує, що він ще тримає повідомлення; інакше натискання відповідає Claude уже забрав його і прибирає рядок. Відмова без натискання клавіш буває, поки відкрито запит на дозвіл чи питання (Спершу дай відповідь на відкрите питання), поки Claude, можливо, щойно відкрив таке, якого aipager ще не показав (події нового завдання притримуються, поки доставляється відповідь попереднього завдання: Зайнято, спробуй трохи згодом), і поки aipager вводить у сесію інше повідомлення (aipager зараз вводить повідомлення, спробуй трохи згодом). Кнопкою і /now може користуватися будь-хто, хто може писати сесії; учасник із read_only не може.
Рядок зникає сам, коли його повідомлення залишає чергу Claude: Claude його забирає (приймає в завдання, що триває, передає фоновому агентові або починає з ним наступне завдання), Escape у терміналі повертає чергу в поле вводу, або його викидають /stop, /clearqueue, /kill, /restart, зупинка з міркувань безпеки або кінець сесії. Перезапуск aipager прибирає всі рядки, які ще видно.
Рядки ніколи не чекають на керування лімітами: вони йдуть і прибираються одразу, навіть у завантаженому чи повільному чаті та в мінімальному режимі. Лише поки сам Telegram заглушив чат, рядки не надсилаються (/now тоді й далі працює), а якщо Telegram щойно попросив aipager пригальмувати, рядок чекає ті кілька секунд, про які він попросив. Кожне повідомлення, що чекає, коштує одного виклику в чат за свій рядок; рядки, які йдуть разом, прибираються одним викликом.
Файли#
Надіслані файли завантажуються в приватну папку того чату, з якого вони прийшли, /tmp/aipager-files/<chat>/ (з назвою <time>_<file name>; <chat> - це назва, утворена з ID чату й токена бота, яка не видає ID чату). Ці папки може читати лише користувач, від якого працює aipager (0700, файли 0600), а завдання учасника в одному чаті не може читати, шукати чи записувати завантаження іншого чату (див. безпека → як правила діють у команді). Файли, завантажені до цієї зміни, лишаються там, де були, просто в /tmp/aipager-files/; нічого не переноситься й не видаляється, а під час запуску aipager звужує права папки до 0700, тож дістатися до них може лише цей користувач. З новим токеном бота кожен чат отримує нову папку; завантаження, зроблені до нього, лишаються в старих, і завдання учасника більше не може їх читати. Папка для завантажень, яка є символьним посиланням або належить іншому користувачеві, відхиляється, і завантаження не вдається. Шлях пропонується Claude: із підписом повідомлення - це підпис, за яким іде шлях (або шляхи); без нього - це просто check this: <path> (або check these: <paths> для альбому), тож Claude вказують на файл, не кажучи, що з ним робити. Підпис, який починається з /<label>, вибирає сесію, так само як /<label> <prompt> у текстовому повідомленні, а назва з повідомлення прибирається: /api сам собою надсилає check this: <path> в api, а /api compare these надсилає туди compare these <paths>. Адресу вибирає лише /<label> на самому початку; скісна риска далі в підписі - це просто текст. Назва, на яку не відгукується жодна сесія, відхиляється з ⚠️ Немає сесії з такою назвою, і нічого не надсилається. Ліміт Telegram у 20 МБ на завантаження ботами застосовується заздалегідь; задовгі файли отримують зрозумілу відмову до спроби завантажити. Завантаження, яке натрапляє на тимчасову помилку мережі, пробується загалом до трьох разів (з паузою 1 с, потім 2 с), перш ніж ти побачиш помилку, і ця помилка називає файл. Альбом (кілька фото чи документів, надісланих одним повідомленням) передається Claude одним повідомленням (підпис, потім шлях кожного файлу по черзі), щойно прийшов його останній елемент; якщо один елемент не вдається завантажити, решта однаково йде з позначкою, яка називає відсутній.
Файли, які надсилає Claude#
Claude може надіслати тобі файли зі своєї сесії: попроси своїми словами («надішли скриншот», «надішли зображення ~/proj/chart.png»), або він надішле файл сам, коли вирішить, що він тобі потрібен. Для цього він використовує інструмент SendUserFile із Claude Code (Claude Code 2.1.301 або новіший), який отримує кожна сесія, запущена aipager: aipager запускає її з CLAUDE_CODE_ATTACHMENTS_BY_PATH=1 і повідомляє Claude, що інструмент є. Сесія, запущена до того, як твій aipager навчився цього, отримає інструмент лише після перезапуску: /restart, зміна режиму з перезапуском або Відновлення.
- Файли приходять після відповіді завдання, відповіддю на неї (на твоє повідомлення, якщо в завдання немає відповіді), без звуку сповіщення і лише в чат самої сесії. Поки завдання триває, робоча картка показує
📎 Надсилання: 2 файли. - Кожен файл іде за своїм вмістом, а не за назвою: зображення як фото, якщо воно вкладається в ліміти Telegram для фото (не більше 10 МБ, ширина плюс висота не більше 10 000, довга сторона не більше ніж у 20 разів довша за коротку), інакше як файл; GIF як анімація; MP4 як відео; MP3 або M4A як аудіо; усе інше як файл. Коли Claude просить звичайне вкладення, усе йде як файл.
- Від 2 до 10 фото й відео йдуть одним альбомом; файли йдуть з файлами, аудіо з аудіо; анімація йде окремо. Якщо їх більше, вони діляться порівну (11 ідуть як 6 і 5), і жоден альбом не більший за 50 МБ.
- Підпис:
💬 <session>, а підпис самого Claude йде наступним рядком першого повідомлення, не довше 1024 символів. - Кожен файл спершу перевіряється, для всіх, зокрема для owner (безпека): налаштування aipager, облікові дані Claude, ключі та файли, схожі на секрети, ніколи не надсилаються; файл має бути звичайним файлом, не порожнім і не більшим за 50 МБ; учасник надсилає лише файли з кореневої папки чату. Якщо один файл запиту відхилено, з цього запиту не надсилається нічого: Claude дізнається причину й каже тобі, а завдання триває далі.
- aipager надсилає особисту копію, зроблену тієї миті, коли Claude Code прочитав файл; вона зберігається в
~/.local/state/aipager/outbox/і видаляється одразу після надсилання або через добу. - У aipager немає власного ліміту на кількість: надсилання йде в темпі лімітів Telegram, альбом рахується по одному на файл. Поки чат заглушено, файли чекають і приходять після відповіді.
- Файл, який не вдалося надіслати, отримує один рядок у чаті, наприклад
⚠️ Не вдалося надіслати report.pdf: Telegram не прийняв файл.Файл, запиту на який aipager не знаходить у власній історії розмови Claude, рядка не отримує (безпека). Файл, запит на який там є, але який aipager не може пов'язати із завданням, що триває, отримує⚠️ Не вдалося надіслати report.pdf: aipager не зміг підтвердити, що Claude надіслав цей файл у межах поточного завдання.Файли надходять і з повідомлення, яке ви надіслали, поки Claude працює, і яке він бере наступним, і із завдання, яке продовжує Stop-хук (/goal). Кожен надісланий, відхилений чи ненадісланий файл має власний запис у журналі аудиту.
Голосові#
Голосові проходять через faster-whisper (пакет aipager[voice]). Звук перетворюється на текст на цьому комп'ютері, повертається як 🎙️ Почуто: … і вводиться, ніби його надрукували, зокрема як назва для /new або для перейменування, що чекає. Голосове, більше за ліміт Telegram у 20 МБ на завантаження ботами, відхиляється. Що відбувається далі, див. у Hooks → UserPromptSubmit.
Командний рядок: усі команди#
Виконай aipager <command> --help, щоб побачити цей самий список на своєму комп'ютері.
| Команда | Що робить |
|---|---|
aipager config | Інтерактивний майстер налаштування: токен бота, чати, учасники й ролі, hooks Claude Code. Запусти знову, щоб щось змінити (див. робота в команді). |
aipager setup | Те саме перше налаштування без запитань, для скриптів і агентів для програмування (див. нижче). |
aipager start | Запускає aipager на передньому плані. Відмовляється запускатися, поки працює інший aipager. |
aipager service install [--yes] | Встановлює aipager як фонову службу (користувацька служба systemd на Linux, агент launchd на macOS) і запускає його. --yes пропускає питання, коли встановлена служба відрізняється. |
aipager service start|stop|status|logs|uninstall | Запускає, зупиняє або показує службу, стежить за її логом або видаляє її. |
aipager status [--json] | aipager і кожна сесія одним поглядом: стан, модель, контекст, вартість і стан лімітів Telegram. |
aipager logs [-f] [-n LINES] | Лог aipager (journald на Linux, лог launchd на macOS): останні 100 рядків або -n рядків; -f стежить за ним. |
aipager doctor [--fix] [--safety-check] [--json] | Перевірки стану (див. розв'язання проблем). --fix пропонує полагодити вхід у Claude і неоднозначне встановлення claude, питаючи перед цим; --safety-check виводить чинні правила безпеки; --json для скриптів (див. нижче). |
aipager session <name> [claude args] | Запускає сесію Claude Code з назвою <name> під dtach у поточній папці або під'єднується до неї, якщо вона працює. Аргументи після назви (або після --) ідуть у claude як є, наприклад --resume. Потребує aipager, що працює. |
aipager session ls [-a] [--json] | Перелічує сесії; -a включає завершені. Також aipager session list. |
aipager session kill <name> [-y] | Завершує сесію після запитання, якщо не вказано -y. |
aipager resume [name] | Повертає завершену сесію з її розмовою; без назви дає вибрати. |
aipager miniapp enable [--port PORT] [--url URL] | Вмикає Mini App, на 127.0.0.1:PORT (за замовчуванням 8765), за керованим тунелем або за твоєю власною https://-адресою. Діє з наступного перезапуску aipager. |
aipager miniapp disable|status | Вимикає її (з наступного перезапуску) або показує її налаштування й адресу. |
aipager policy validate | Перевіряє policy.yaml (і policy.d); у разі проблеми завершується з ненульовим кодом. |
aipager update | Оновлює aipager через інсталятор, якому він належить (uv, pipx, Homebrew, pip). Ніколи не перезапускає aipager; перезапусти його вручну або використай /update у Telegram, який це вміє (див. Оновлення). |
aipager report [--note TEXT] | Показує звіт про проблему й надсилає його, якщо відповісти «так» (див. нижче). |
aipager uninstall [-y] | Зупиняє і видаляє aipager та його налаштування, зберігаючи його дані (див. нижче). |
aipager version, aipager --version | Виводить версію. |
aipager help [command] | Довідка про aipager або про команду. |
Командний рядок: aipager setup (для агентів для програмування)#
Розділи вище описують бота Telegram. Цей описує команду, яку ти запускаєш у терміналі або яку за тебе запускає скрипт чи твій агент для програмування: aipager setup налаштовує aipager без запитань і дає те саме, що перший запуск aipager config.
# 1. дізнатися Telegram id людини (вона відкриває бота й натискає Start)
aipager setup detect-chat --token-file ~/bot-token.txt --json
# 2. коли людина підтвердила, що це вона, налаштувати aipager
aipager setup --token-file ~/bot-token.txt --chat-id 123456789 --service --json
# 3. перевірити встановлення
aipager doctor --json
Що вона робить, по черзі: читає токен бота, перевіряє його в Telegram (getMe), перевіряє все на цьому комп'ютері, нічого не записуючи (наявні налаштування, залежності, ~/.claude/settings.json, чи працює aipager), надсилає людині тестове повідомлення ("aipager is set up for you. ...") і лише потім записує. Записані файли, саме такі, які пише майстер:
~/.config/aipager/aipager.yaml(права 0600):bot_tokenі особистий чат, де єдиний учасник - ця людина (label: owner, роль owner або admin).~/.claude/settings.json: hooks aipager і statusLine (наявний файл зберігається якsettings.json.bak.<time>, коли він змінюється).- Журнал аудиту отримує запис
grant-owner, коли хтось стає власником. - З
--service- фонова служба (те саме, щоaipager service install --yes). - Лише на старому встановленні з
config.env(ще безaipager.yaml) - перенесення, яке робить майстер: копіяconfig.env.bak.<time>(іteam.yaml.bak.<time>, якщо єteam.yaml) і шаблон~/.config/aipager/policy.yaml, якщо його немає. Самconfig.envлишається як є.
Якщо якась перевірка не проходить, нічого не надсилається і нічого не записується. Якщо aipager уже працює, зміна чату чи ролі перезавантажується на льоту; новий токен бота потребує перезапуску (aipager service stop, потім aipager service start), якого setup ніколи не робить сама, а --service пропускається. Якщо setup не може визначити, чи працює aipager, вона поводиться так, ніби працює (попередження daemon_unknown): тоді вона ніколи не встановлює служби, тому ніколи не може перезапустити aipager, що працює, не надсилає перезавантаження після зміни і натомість повідомляє restart_needed: true.
Параметри aipager setup#
| Параметр | Значення |
|---|---|
--token-file PATH | Читає токен бота з цього файлу (не більше 4096 байт; текст навколо токена допустимий). Файл, який можуть читати інші користувачі, працює, але дає попередження token_file_shared: зроби йому chmod 600 або видали його, коли setup пройшла. |
--token-stdin | Читає токен бота зі stdin (pipe або перенаправлений файл, ніколи термінал). Pipe має закритися: setup чекає на кінець stdin не більше 30 секунд, а потім завершується з 2 і token_stdin_timeout. printf '%s\n' "$TOKEN" | aipager setup --token-stdin ... і < token.txt обидва його закривають. |
--chat-id N | Обов'язковий. Числовий Telegram id користувача цієї людини, він же id її особистого чату. Групи додаються через aipager config. |
--role owner|admin | Роль цієї людини (за замовчуванням owner). |
--service | Також встановлює й запускає фонову службу (пропускається, поки працює aipager). |
--force | Дозволяє замінити токен бота, особистий чат власника або роль у наявного встановлення. Групові чати та інші особисті чати зберігаються. |
--dry-run | Виконує всі перевірки, нічого не надсилає, нічого не записує й повідомляє, що змінилося б. |
--json | Виводить рівно один об'єкт JSON у stdout; усе інше йде в stderr. |
Вкажи рівно один із --token-file і --token-stdin. Токен ніколи не приймається значенням параметра: --token і --bot-token відхиляються (token_on_command_line), а значення не показується. Скорочені параметри (--token-f, --dry) не приймаються. setup ніколи не ставить запитань, ніколи не потребує термінала й ніколи не читає токена зі змінної оточення.
Повторний запуск із тим самим токеном, чатом і роллю нічого не змінює і каже про це (unchanged, без тестового повідомлення). Запуск з іншим токеном, чатом або роллю на наявному встановленні завершується з 6, доки не додати --force. Старе встановлення з config.env спершу переноситься, як це робить майстер (воно отримує роль admin, тому --role owner поверх нього потребує --force).
aipager setup detect-chat#
aipager setup detect-chat (--token-file PATH | --token-stdin) [--timeout SECONDS] [--json]
Чекає на найновіше особисте повідомлення ботові (натискання Start його надсилає) і виводить його відправника: id, ім'я та ім'я користувача. Нічого не зберігає, тому спершу покажи знайдену людину і запускай aipager setup --chat-id, лише коли її підтверджено. Рахуються лише повідомлення, надіслані не раніше ніж за 10 хвилин до запуску команди. --timeout від 0 до 3600 секунд (за замовчуванням 300; 0 означає подивитися один раз). Вона читає Telegram, не підтверджуючи жодного повідомлення, тому /start лишається доступним для майстра і для aipager.
Якщо працює aipager для того самого бота, повідомлення бота отримує aipager, і він не записує особистих повідомлень від людей, яких ще не налаштовано. Тоді detect-chat завершується з 9 (source: "daemon"): зупини aipager (aipager service stop) і запусти команду знову або спитай у людини її числовий id. З aipager для іншого бота вона читає Telegram напряму (source: "telegram").
Обмеження: оскільки detect-chat ніколи не підтверджує повідомлень, Telegram показує їй лише 100 найстаріших непрочитаних оновлень за останні 24 години. Якщо в бота стільки чекає, нового /start не видно: detect-chat тоді завершується за лімітом часу (вихід 8) з попередженням updates_backlog, і повторне натискання Start не допоможе. Натомість спитай у людини її числовий Telegram id (або запусти aipager один раз, він прочитає ці оновлення й очистить їх).
Коди виходу#
| Код | error | Значення |
|---|---|---|
| 0 | Успіх (installed, updated, unchanged, dry_run або detect-chat found). | |
| 1 | config_malformed, ambiguous_install, settings_invalid, test_send_failed, write_failed, service_failed, internal_error | Невдача. ambiguous_install: більше одного особистого чату може бути чатом власника; виправ це в aipager config. |
| 2 | usage, missing_token_source, token_source_conflict, token_file_unreadable, token_stdin_is_tty, token_stdin_timeout, token_malformed, token_on_command_line, bad_chat_id, bad_role, bad_timeout | Неправильний або відсутній ввід; fix називає параметр. Невідомий параметр або неправильне слово після setup повідомляє розбирач аргументів (простий текст, не JSON), теж із 2. |
| 3 | deps_missing | Немає dtach, claude, aipager-hook чи aipager-statusline; fix містить команди. Нічого не записано. |
| 4 | token_rejected | Telegram відхилив токен. |
| 5 | chat_not_started, bot_blocked | Людина не натиснула Start у боті ("Open t.me/<bot> and press Start, then run this again.") або заблокувала його. Нічого не записано. |
| 6 | existing_install | Уже налаштовано інший токен, чат або роль; додай --force. |
| 7 | telegram_unreachable | Помилка мережі, або Telegram відповів 429 чи 5xx. |
| 8 | detect_timeout | detect-chat не побачила особистого повідомлення до --timeout (з попередженням updates_backlog, коли 100 старих непрочитаних оновлень закривають новіші). |
| 9 | daemon_running | detect-chat: повідомлення бота отримує aipager, що працює. |
| 10 | updates_conflict | detect-chat: повідомлення цього бота читає інша програма. |
| 130 | interrupted | Ctrl-C. |
Якщо кілька перевірок не проходять одночасно, код іде за таким порядком: config_malformed, ambiguous_install, existing_install, settings_invalid, deps_missing. --dry-run завершується з кодом, який мав би справжній запуск за цими перевірками.
JSON: aipager setup --json#
Кожен ключ є завжди; ще невідоме значення - це null.
{
"command": "setup",
"status": "installed",
"ok": true,
"exit_code": 0,
"error": null,
"message": "aipager is set up for @example_bot (chat 123456789, role owner). ...",
"fix": null,
"dry_run": false,
"bot_username": "example_bot",
"chat_id": 123456789,
"role": "owner",
"changed": ["bot_token", "owner_dm", "settings_json"],
"test_message": "sent",
"deps": {"ok": true, "items": [{"name": "dtach", "found": true, "path": "/usr/bin/dtach", "fix": null}]},
"settings_json": {"path": "/home/you/.claude/settings.json", "status": "created", "backup": null, "repointed": 0},
"daemon": {"running": false, "reload": "not_needed", "restart_needed": false},
"service": {"requested": false, "result": "not_requested"},
"warnings": [],
"next_step": "Start aipager with `aipager service install` ..."
}
status:installed,updated,unchanged,dry_runабоerror.changed: що змінилося (або змінилося б під час пробного запуску), у такому порядку:migrated_v1,bot_token,owner_dm,role,settings_json,service.test_message:sent,not_needed,skipped_dry_run,failedабоnot_attempted.settings_json.status:created,patched,unchanged,would_changeабоnot_checked.daemon.reload:reloaded,refused,not_reloadedабоnot_needed.restart_neededдорівнює true після нового токена, поки працює aipager, і після будь-якої зміни, коли aipager не вдалося перезавантажити або setup не змогла визначити, чи він працює.service.result:not_requested,installed,already_installed,skipped_daemon_running,would_install,failedабоnull, коли setup зупинилася раніше.warnings: об'єкти зcode(token_file_shared,reload_refused,daemon_unknown,audit_write_failed) іmessage.audit_write_failed: роль власника записано, але її записgrant-ownerне вдалося додати в журнал аудиту; цей запис робиться наскільки можливо, тому код виходу лишається 0.next_stepпісля зміни, поки працює aipager, якого не вдалося перезавантажити, каже його перезапустити (aipager service stop, потімaipager service start); токен бота він згадує, лише якщо токен змінився.- З попередженням
daemon_unknownnext_stepніколи не каже, що aipager працює. Він каже, що setup не змогла це визначити, відсилає доaipager doctor --jsonі каже запустити aipager черезaipager service installабоaipager start, якщо він не працює. Якщо потрібен був би перезапуск, він просить про нього, лише якщо aipager працює, а інакше каже запустити його так само. - У разі помилки
statusдорівнюєerror, аerror,messageіfixкажуть, що пішло не так і що робити;next_stepповторюєfix. Якщо помилка сталася після запису,changedперелічує, що було записано, а звичайний вивід додає рядок у stderr:Already written: aipager.yaml, ... (changed: ...).
JSON: aipager setup detect-chat --json#
{
"command": "detect-chat",
"status": "found",
"ok": true,
"exit_code": 0,
"error": null,
"message": "Found Ada L (@ada), Telegram id 123456789.",
"fix": null,
"bot_username": "example_bot",
"source": "telegram",
"candidate": {"id": 123456789, "first_name": "Ada", "last_name": "L", "username": "ada", "date": 1700000000},
"other_candidates": 0,
"warnings": [],
"next_step": "Show this person to the user; once they confirm, run: aipager setup --token-file <path> --chat-id 123456789"
}
candidate дорівнює null, якщо status не found. warnings містить об'єкти з code (token_file_shared, updates_backlog) і message. other_candidates рахує інших людей, які писали ботові в ті самі 10 хвилин: якщо це не 0, переконайся, що вибрано потрібну людину. next_step повторює параметр токена, який було використано, але ніколи не сам токен.
aipager doctor --json#
Перевірки aipager doctor одним об'єктом JSON у stdout. Як і звичайний aipager doctor, він лише читає і не надсилає повідомлень у Telegram. Вихід 1, якщо якась перевірка не пройшла, інакше 0. Його не можна поєднувати з --fix або --safety-check (вихід 2 з об'єктом помилки).
{
"command": "doctor",
"version": "1.0.1",
"ok": true,
"summary": {"ok": 14, "warn": 1, "fail": 0},
"checks": [{"key": "token_valid", "status": "ok", "title": "Telegram bot token", "detail": ["@example_bot"], "fix": null}]
}
checks ідуть у такому порядку, з такими ключами: config_parses, config, token_valid, chat_reachable, team, role_shell_access, peer_messages, claude, claude_auth, dtach, hook_scripts, settings_json, daemon, service_installed, service_unit_path, miniapp. Перевірка, яка падає, зберігає свій ключ зі статусом warn. Тексти прості (без розмітки), а все, що схоже на токен бота, замінюється на <redacted>.
Командний рядок: aipager uninstall#
aipager uninstall зупиняє aipager і видаляє його службу, видаляє папку налаштувань (~/.config/aipager: токен бота, чати й налаштування) і список сесій (~/.claude/aipager-sessions.json), прибирає файли aipager у /tmp і видаляє сам aipager. Перед цим питає (-y пропускає питання).
Він зберігає дані aipager, щоб нове встановлення продовжило з того самого місця: ~/.local/share/aipager (папки сесій, завантажені допоміжні програми, файли блокувань і позначок), ~/.local/state/aipager (записи для звітів про проблеми та стан мов), ~/.claude/aipager-audit.jsonl (журнал відповідей на дозволи), ~/.claude/aipager-flood-state.json (історія лімітів Telegram), ~/.claude/aipager-pending-users.json (люди, які пробували бота без доступу) і ~/aipager-users (кореневі папки учасників, з їхньою роботою). Перед питанням він перелічує, які з них є на твоєму комп'ютері, а наприкінці виводить команду rm -rf, яка видаляє і їх.
Ще він прибирає власні записи aipager з ~/.claude/settings.json Claude Code: hooks, які запускають aipager-hook, і рядок стану, який запускає aipager-statusline (твій власний рядок стану лишається). Усе інше в цьому файлі лишається як було, а файл у попередньому вигляді зберігається поруч як settings.json.bak.<time>. Якщо файл - це посилання на інший файл, не читається, не є коректним JSON або не тієї форми, яку читає Claude Code, він лишається саме як є, а uninstall каже, які записи прибрати вручну. Твій власний hook, який ще згадує aipager-hook або aipager-statusline (наприклад, обгортка aipager-hook-capped.sh), теж лишається, і uninstall його називає. Уже відкриті сесії Claude Code і далі запускають завантажені ними hooks, доки їх не перезапустити. aipager config додає записи знову після нового встановлення. Твій бот Telegram і старіші копії settings.json.bak.* не зачіпаються, як і skipDangerousModePermissionPrompt (налаштування, яке пропускає попередження Claude Code перед роботою без перевірок дозволів): його ставить aipager, але воно могло бути задане й тобою.
Командний рядок: aipager report#
aipager report складає звіт про проблему того самого виду, що й кнопка «Повідомити про проблему» в боті, з того, що aipager записав на цьому комп'ютері (з меншою кількістю фактів про aipager, що працює: режим, чати, функції, час роботи, сесії та відомості про Claude Code лишаються невідомими або порожніми), виводить його повністю і питає Send this report? [y/N]. Надсилає лише y або yes; усе інше або відсутність термінала (скрипт, pipe, shell сесії Claude Code) нічого не надсилає. --note "text" додає примітку не довшу за 500 символів, яку видно у виведеному звіті. Завершується з 0, коли звіт надіслано, не надіслано на твій вибір або лише виведено, і з 1, коли підтверджене надсилання не пішло. Що містить звіт і куди він іде, див. у Звітах про проблеми.
Налаштування з оточення#
Кілька налаштувань читаються з оточення aipager, а не з aipager.yaml. Для служби systemd додай їх через systemctl --user edit aipager у [Service] (Environment=STALE_BUSY_TIMEOUT=900), потім aipager service stop і aipager service start; для служби launchd на macOS додай їх у EnvironmentVariables у plist (~/Library/LaunchAgents/com.aipager.daemon.plist; aipager service install переписує цей файл, тож потім додай їх знову); для aipager, який запускаєш вручну, задай їх перед aipager start. Жодне з них не потрібне для звичайної роботи.
| Налаштування | За замовчуванням | Що змінює |
|---|---|---|
AIPAGER_WHISPER_MODEL | base | Модель розпізнавання для голосових (tiny, base, small, medium, ...): більша - точніша й повільніша. |
MINIAPP_PORT | 8765 | Порт Mini App на 127.0.0.1 (aipager miniapp enable --port натомість його зберігає). |
MINIAPP_ENABLED | з aipager.yaml | 0 вимикає Mini App, а 1 вмикає, хоч би що казав aipager.yaml (aipager miniapp enable|disable натомість зберігає вибір). |
MINIAPP_PUBLIC_URL | немає | Відкриває Mini App за твоєю власною https://-адресою замість керованого тунелю (модель безпеки). |
KEEP_FINISHED_CARD | 1 | 0 робить «Лише відповідь (без картки)» виглядом для чатів, які ніколи не вибирали вигляду в /settings. |
STALE_BUSY_TIMEOUT | 7200 (2 години) | Скільки секунд сесія, що працює, може бути без новин, перш ніж чат отримає примітку «ще працює (120 хвилин без новин)». |
PROMPT_HOOK_GRACE_SECONDS | 8 | Секунди, після яких повідомлення, яке Claude Code так і не прийняв, позначається як «Claude Code не прийняв повідомлення» (звичайні повідомлення). |
FINISH_CARD_GRACE_SECONDS | 0.8 | Наскільки завершена картка випереджає відповідь у вигляді з карткою; 0 надсилає їх одночасно. |
GONE_SESSION_MAX_AGE_DAYS | 14 | Скільки днів завершена сесія лишається в /resume; 0 зберігає її завжди. |
STREAM_EDIT_INTERVAL, BUSY_EDIT_INTERVAL | 1.2, 3.0 | Оновлення робочої картки, поки текст іде потоком і поки вона спокійна, у секундах; ліміт Telegram на чат і далі важливіший (розв'язання проблем). |
TYPING_INDICATOR_INTERVAL | 4.5 | Секунди між бульбашками «друкує…»; 0 їх вимикає. |
TELEGRAM_MAX_RETRY_AFTER | 90 | Очікування Telegram у секундах, починаючи з якого aipager вважає ліміт блокуванням (не зменшуй; див. розв'язання проблем). |
CLAUDE_RICH_SUMMARIES | 1 | 0 вимикає багате оформлення відповідей із блоками коду (обхідний шлях зі старих версій). |
AIPAGER_INTERACTIVE_TIMEOUT | 300 | Скільки секунд запит на дозвіл або питання може чекати без новин від Claude Code, перш ніж aipager перевірить збережену розмову; сесія знову вважається такою, що працює, лише якщо розмова показує, що запит закінчено (розв'язання проблем). |
AIPAGER_SUBAGENT_SILENCE | 1800 | Секунди тиші, після яких субагент без поміченої зупинки прибирається (hooks). |
AIPAGER_BG_SHELL_MAX_TRACK | 7200 | Секунди, після яких фонова команда без поміченого кінця більше не рахується. |
AIPAGER_REPORT_PROMPTS | увімкнено | 0 вимикає автоматичні пропозиції надіслати звіт про проблему (звіти про проблеми). |
AIPAGER_CLAUDE_BIN | немає | Який claude запускати, коли встановлено кілька (claude_path в aipager.yaml важливіший). |
AIPAGER_SOCKET_PATH | $XDG_RUNTIME_DIR/aipager.sock | Керувальний сокет aipager. Сесії, які запускає aipager, передають його своїм hooks. |
AIPAGER_DEBUG | вимкнено | 1 в оточенні сесії змушує aipager-hook і aipager-statusline виводити свою діагностику в stderr. |
AIPAGER_INSTANCE_DIR, AIPAGER_TELEGRAM_API_BASE | немає | Другий, ізольований aipager для тестів (архітектура). |
Див. також#
- Архітектура: де лежить бот.
- Події hooks: що aipager чує у відповідь від claude.
- Розв'язання проблем: коли команди поводяться дивно.