Робота в команді та групи
За замовчуванням aipager - це особистий бот: ти і бот в одному особистому чаті, більше нікого. Командний режим відкриває його для інших людей: група Telegram, де сесіями керують кілька програмістів, особисті чати інших людей із ботом або і те, і те. Кожен чат має своїх учасників, і кожен учасник має роль, яка вирішує, що йому там можна: надсилати повідомлення, відповідати на питання і запити на дозвіл Claude, керувати сесіями або лише дивитися.
За замовчуванням aipager - це особистий бот: ти і бот в одному особистому чаті, більше нікого. Командний режим відкриває його для інших людей: група Telegram, де сесіями керують кілька програмістів, особисті чати інших людей із ботом або і те, і те. Кожен чат має своїх учасників, і кожен учасник має роль, яка вирішує, що йому там можна: надсилати повідомлення, відповідати на питання і запити на дозвіл Claude, керувати сесіями або лише дивитися.
Командний режим вмикається за бажанням. Встановлення лише з твоїм особистим чатом працює як раніше.
Вирішуй обережно#
Додати людину з Telegram у чат означає дати їй право виконувати код на комп'ютері, де працює aipager. Залежно від ролі ця людина може:
- надсилати повідомлення, які Claude перетворює на команди shell, правки файлів і мережеві запити;
- відповідати на запити на дозвіл (Дозволити / Відхилити). Твій
~/.claude/settings.jsonі далі вирішує, про які інструменти Claude питає, але натиснути Дозволити може будь-хто, чия роль дозволяє схвалювати; - запускати, зупиняти, завершувати сесії та перемикатися між ними.
Стався до списку учасників так само, як до доступу по SSH до комп'ютера. Журнал аудиту (~/.claude/aipager-audit.jsonl) записує, хто що зробив, але лише після того, як це сталося.
Налаштування#
Усе налаштовується через aipager config. Редагувати файли вручну ніколи не потрібно.
Перший запуск (конфігурації ще немає). Майстер питає в чотири кроки:
- токен бота;
- твій власний особистий чат із ботом (визначається сам або вставляється);
- чи є твій акаунт
owner(за замовчуванням так; якщо відповісти ні, будеadmin, і для тебе лишиться ввімкненим нижній поріг безпеки); - він перевіряє залежності й встановлює hooks Claude Code.
Він записує твій особистий чат як перший чат. Режиму за замовчуванням він не питає: у його підсумку написано "New sessions start in Auto mode; owners and admins can choose Full access in Telegram under /settings → New sessions." (нові сесії запускаються в режимі Авто; власники й адміни можуть вибрати «Повний доступ» у Telegram у /settings → Нові сесії). Потім він питає "Connected. Add a team group or other people now?" з Add a group, Add a person (DM) і I'm done.
Наступні запуски відкривають меню змін. Воно показує твої чати і пропонує:
- Add a group scope: нова група з її учасниками (нижче).
- Add a DM scope: власний особистий чат іншої людини з ботом. В особистому чаті один учасник; ти вибираєш його роль (за замовчуванням
user; вибирайownerлише для встановлення на одну людину, наприклад для власного контейнера друга). Для ролі безcan_manage(на кшталтuser) він потім питає кореневу папку, з уже підставленим значенням за замовчуванням (~/aipager-users/<label>). Для людини, в якої особистий чат уже налаштовано, майстер каже про це й нічого не змінює: щоб змінити роль, використовуй Edit a member. - Edit a scope: для групи Add a member; для будь-якого чату Rename, Edit scope deny_tools, Set the members' root folder (див. Кореневі папки) і Remove this scope (останній чат прибрати не можна). Завершуй сесії чату, перш ніж прибирати його: його сесії, що працюють, і далі туди пишуть, і жоден чат більше не може до них дістатися з Telegram (з комп'ютера
aipager session lsіaipager session kill <name>і далі можуть). - Edit a member: Set role, Edit member deny_tools, Remove member (не в особистому чаті й не останній учасник групи). Для власника або адміна (або твоєї ролі з
bypass_role_denies) Edit member deny_tools лише повідомляє, що заблоковані інструменти до цієї ролі не застосовуються. - Test bot reachability, View policy, Re-install Claude Code hooks і Refresh bot token.
Додавання групи#
- Додай бота в групу, потім вибери Add a group scope (або Add a group під час першого запуску).
- ID групи. Вибери автовизначення і надішли
/startу групі або встав ID (від'ємне число). Майстер надсилає тестове повідомлення і питає, чи воно дійшло. Група, яку вже налаштовано, на цьому зупиняється з "This group is already set up. Use Edit a scope → Add a member.", і нічого не змінюється. - Назва групи (показується в майстрі та в Mini App).
- Спершу ти. Коли ти власник свого особистого чату, майстер пропонує додати тебе першим учасником групи з роллю
owner(за замовчуванням так; можна пропустити). Без власника чи адміна в групі там ніхто не зміг би користуватися «Повним доступом»,/settingsабо/update. - Інші учасники, по одному: як їх знайти (автовизначення або вставити ID чи
@handle), ім'я (показується в чаті як@label) і роль (за замовчуваннямuser). У списку ролей єowner, з попередженням: власник має повний контроль над цим комп'ютером, зокрема конфігурацією aipager, токеном бота й обліковими даними Claude. Давай її лише собі. Давайadminтим, хто має користуватися в групі «Повним доступом»,/settingsі/update. (У власному особистому чаті з ботом будь-хто, хто може надсилати повідомлення і відповідати Claude, може користуватися «Повним доступом» для своїх сесій, хоч яка в нього роль.) - Одне необов'язкове правило: "Block file edits (Write, Edit) for
usermembers in this group? Admins and the owner are not affected." (Заборонити правку файлів учасникамuserу цій групі? Адмінів і власника це не стосується.) За замовчуванням ні:userі так пише лише в папці проєкту сесії. З так кожен Write і Edit у завданні учасника, чия роль не обходить правил ролей (user,read_onlyі ролі, які ти задаєш безbypass_role_denies), відхиляється без запитання, і завдання зупиняється. Тоді цю роботу має надіслати адмін або власник. - Коренева папка учасників, з уже підставленим
~/aipager-users/group-<label>: де учасники групи зuserіread_onlyзапускають сесії та працюють (див. Кореневі папки).
Щоб додати когось у вже налаштовану групу, використовуй Edit a scope → група → Add a member. Усі, хто вже в групі, зберігають своє місце і роль.
Як знайти ID (автовизначення)#
Автовизначення учасника бере найновіше повідомлення від когось, кого ще не додано, і питає "Is this the person to add?" (Це та людина, яку треба додати?), перш ніж його використати (відповідай ні, і воно шукатиме далі). Як ім'я воно пропонує ім'я користувача Telegram цієї людини. У групі людина має звернутися до бота: згадати його або надіслати /start (див. що читає бот). Майстер каже, де він дивиться:
- "Watching through the running daemon" (через aipager, що працює): поки працює
aipager start, aipager отримує кожне повідомлення для бота, тому майстер читає те, що aipager записав у~/.claude/aipager-pending-users.json. aipager записує, хто звертається до бота в групі, яку він ще не обслуговує (ID, назву і тип групи, а також ID, ім'я користувача та ім'я людини), і кожного, хто не є учасником групи, яку він обслуговує. У групі, яку він не обслуговує, він ніколи не відповідає. Особисте повідомлення від того, кого не налаштовано, отримує відповідь і не записується, тому щоб додати особистий чат людини, поки працює aipager, встав її ID (або спершу зупини aipager). - "Watching Telegram directly" (просто в Telegram): коли aipager зупинено, майстер сам питає в Telegram останні повідомлення бота.
Твій власний особистий чат під час першого запуску завжди читається з Telegram. Повідомлення анонімного адміна групи або повідомлення, опубліковане від імені групи чи каналу, не рахується: його ID відправника (1087968824, 136817688 або 777000) однаковий у всіх, хто так публікує, тому майстер його відхиляє, набране чи знайдене. Попроси людину написати від свого акаунта.
Де лежить конфігурація#
Майстер пише ~/.config/aipager/aipager.yaml (права 0600): токен бота, чати, які обслуговує бот, і учасників кожного чату з їхніми ролями. Що може кожна роль, лежить у ~/.config/aipager/policy.yaml, і це твій файл: майстер його ніколи не пише (див. Як працюють правила). Встановлення, налаштовані в старому форматі team.yaml, переносяться автоматично: aipager під час запуску або майстер під час наступного запуску.
Перезавантаження без перезапуску#
Після кожної зміни чатів чи учасників із меню змін (додати або прибрати групу чи особистий чат, додати або прибрати учасника, задати роль, змінити deny_tools, перейменувати чат), а також після групи чи людини, доданих наприкінці першого запуску, або недоробленої групи, яку ти продовжуєш (одне перезавантаження на все додане там), aipager config надсилає aipager, що працює, перезавантаження на льоту (SIGUSR1) і пише "Scopes reloaded live (no daemon restart needed)". Перезавантаження заново читає aipager.yaml і policy.yaml. Якщо конфігурацію на диску було б відхилено, майстер пише "Not applied" з причиною, і aipager тримає попередню конфігурацію, доки ти не виправиш. Якщо майстер не може точно сказати, який процес є aipager, він каже перезапустити його.
Що перезавантаження застосовує одразу:
- хто може користуватися ботом у кожному чаті, з якою роллю і якими правилами;
- нова група чи новий особистий чат починає отримувати повідомлення й отримує своє меню
/; прибраний перестає (його сесії працюють далі, доки ти їх не завершиш); - притримане повідомлення (те, що чекає на відповідь на запит або кінець чужого завдання) від людини, якій більше не можна писати в цьому чаті, викидається: воно отримує 🤷, а бот відповідає «Не надіслано Claude: @bob більше не може писати тут.»;
- завдання, що триває, людини, яку прибрали або яка втратила права, до кінця завдання зберігає лише найсуворіше зі своїх старих правил і нових (для прибраної людини обмежений поріг). Завдання, набране в терміналі, не змінюється, якщо лише до нього не приєдналося повідомлення з Telegram: aipager не записує, від кого, тому таке завдання звужується, коли права втрачає будь-який власник цього чату (або, в особистому чаті, його учасник). Завдання, яке вже тривало, коли aipager перезапустився (ще працює або чекає на питання чи дозвіл), звужується для кожного учасника його чату, який утратив права. Підвищення ніколи не розширює завдання, що триває: нові права діють із наступного завдання цієї людини.
Перезапуску потребує лише новий токен бота (aipager config каже про це після Refresh bot token). Коли aipager не працює, перезавантаження не надсилається: наступний aipager start прочитає нову конфігурацію.
Щоб перезавантажити вручну (наприклад, після правки policy.yaml), надішли сигнал лише процесу aipager. Під фоновою службою:
pid=$(systemctl --user show -p MainPID --value aipager.service)
[ "${pid:-0}" -gt 0 ] && kill -USR1 "$pid"
(Перевірка важлива: коли служба не працює, MainPID дорівнює 0, і kill -USR1 0 надіслав би сигнал процесам твого власного shell.)
Для aipager, запущеного тобою через aipager start, надішли kill -USR1 <pid> цьому процесу. Не надсилай сигналу всьому, що знаходить pgrep -f 'aipager start' (shell або контейнер, у якому працює aipager, теж збіжиться, а SIGUSR1 зупиняє процес, який його не обробляє), і не використовуй systemctl --user kill без --kill-whom=main (сесії служби в її групі теж було б зупинено).
Якщо в момент перезавантаження aipager.yaml чи policy.yaml пошкоджено або aipager.yaml відсутній, aipager пише в лог попередження і тримає попередню конфігурацію в пам'яті. Друкарська помилка чи відсунутий убік файл не можуть ні замкнути тебе ззовні, ні впустити когось: перезавантаження ніколи не повертає aipager із налаштованими чатами в особистий режим (це робить лише перезапуск).
Права адміна в бота і режим приватності#
Зроби бота адміном групи з правом закріплювати повідомлення. Це потрібно йому, щоб закріпити рядок стану групи (див. Що бачать усі). Без цього група працює, але рядка стану в неї немає; якщо дати ботові це право пізніше, перезапусти aipager, щоб рядок з'явився.
Бот, який є адміном групи, отримує кожне повідомлення в групі, хоч який його режим приватності в BotFather. Це безпечно: aipager обробляє лише повідомлення, перелічені в розділі що читає бот, а решту ігнорує, тому розмови в групі ніколи не потрапляють у сесію. Бот, який не є адміном, за замовчуванням у режимі приватності (лиши його ввімкненим), і тоді Telegram передає йому лише деякі повідомлення групи; якщо якесь твоє не дійшло, дай відповідь на одне з повідомлень бота або використай команду. Налаштування приватності нічого не змінює в тому, що обробляє aipager.
Бути адміном групи в Telegram нічого не дає людині в aipager. Що кому можна, визначає лише роль в aipager.yaml.
Коли Telegram оновлює групу#
Telegram перетворює звичайну групу на супергрупу, коли її роблять публічною, вмикають теми, переходять за 200 учасників або змінюють деякі права адмінів, і це оновлення дає групі новий ID чату. aipager іде за ним сам: коли він бачить оновлення (сповіщення Telegram у групі або перше надсилання на старий ID), він переносить запис групи в aipager.yaml на новий ID, переносить із ним сесії, адреси повідомлень і /settings групи та пише в групу один рядок: «Telegram оновив цю групу. aipager переїхав разом із нею, нічого робити не потрібно.» Закріплений рядок стану починається заново в оновленій групі. У лозі aipager є попередження з обома ID.
Назви сесій усередині aipager зберігають старий ID (ти їх ніколи не бачиш), а aipager.yaml зберігає короткий запис chat_migrations про переїзд, щоб сесія, запущена до оновлення, і далі належала оновленій групі, навіть після перезапуску. Внутрішня назва сесії зі старим ID (/name__g<old id>) працює в оновленій групі й більше ніде. Якщо aipager було зупинено під час оновлення, він помітить його під час наступного запуску. Завдання, що триває в момент оновлення, закінчується, і його відповідь доходить до оновленої групи, але його робоча картка до кінця цього завдання більше не показується. Якщо новий ID уже є окремим чатом у конфігурації, нічого не переноситься, і лог про це каже; прибери один із двох через aipager config. «Test bot reachability» в aipager config показує новий ID, коли натрапляє на оновлену групу.
Під час кожного запуску aipager один раз перевіряє кожну групу. Якщо Telegram відповідає, що групу не знайдено або бот не може нею користуватися (групу видалили, бота прибрали або групу оновили, поки aipager був зупинений, а Telegram не сказав, на який ID), у лозі aipager є одне попередження з назвою чату: перевір, що бот усе ще в групі, і якщо її оновили, знову додай групу в aipager config через Add a group scope (вона отримає новий ID; додай її учасників заново), потім прибери стару через Edit a scope → Remove this scope (старий ID більше не працює). aipager нічого не публікує і не пробує знову.
Теми форуму не підтримуються#
Використовуй одну звичайну групу (без тем) на команду. У групі з увімкненими темами aipager однаково працює, але не тримається теми:
- відповідь на команду чи повідомлення (наприклад,
/statusабо відповідь на «Яка сесія?») лишається в тій темі, де його надіслали; - сповіщення, робочі картки, відповіді, запити на дозвіл і закріплений рядок стану публікуються в групу без теми, тому можуть опинитися в General;
- кожна людина має одну поточну сесію на всю групу, а не по одній на тему.
Увімкнення тем ще й перетворює звичайну групу на супергрупу, за чим aipager іде (вище).
Ролі#
Чотири вбудовані ролі (див. aipager/safety.py). Рахується роль людини в тому чаті, де вона діє. Ніхто не може змінювати учасників чи ролі з Telegram або Mini App: це робить лише aipager config на комп'ютері, і так це лишається за власником.
owner | admin | user | read_only | |
|---|---|---|---|---|
Надсилати повідомлення (can_prompt) | ✅ | ✅ | ✅ | ❌ |
Відповідати Claude: Дозволити, Відхилити, питання (can_approve) | ✅ | ✅ | ✅ | ❌ |
Керувати: «Повний доступ», /settings групи, /update, встановлення голосових (can_manage) | ✅ | ✅ | ❌ («Повний доступ»: ✅ у своєму особистому чаті) | ❌ |
| Змінювати учасників і ролі з Telegram або Mini App | ❌ | ❌ | ❌ | ❌ |
Обходить правила заборони ролі (bypass_role_denies) | ✅ | ✅ | ❌ | ❌ |
Обходить нижній поріг безпеки (bypass_safety) | ✅ | ❌ | ❌ | ❌ |
| Bash та інші інструменти, що виконують код | ✅ | ✅ (правила наскільки можливо) | ❌ | ❌ |
| Будь-яка slash-команда | ✅ | ✅ | лише команди клавіатури «Команди», /compact і зміна моделі | як user |
Де запускаються сесії (/new, Продовжити, Перезапустити, зміна режиму) | будь-де | будь-де | лише всередині кореневої папки чату | як user |
| Куди потрапляє запис файлів | будь-куди | куди дозволяє поріг безпеки | папка проєкту сесії (коли вона всередині кореневої папки) та її scratchpad, ніколи не домашня папка | як user |
| Читання у твоїй домашній папці | де дозволяє поріг безпеки | де дозволяє поріг безпеки | лише всередині кореневої папки (інші папки комп'ютера як раніше, кореневі папки інших учасників ніколи) | як user |
Файли облікових даних (~/.ssh, ~/.git-credentials, ...) | читаються | читаються | ніколи (за замовчуванням) | ніколи (за замовчуванням) |
Grep/Glob | будь-де | будь-де, крім захищених папок aipager (не в папці, яка нею є, лежить у ній або містить її) | папка проєкту сесії та її scratchpad | як user |
-
owner: повний контроль, зокрема вбудований поріг безпеки. Власник має бути рівно один: людина, яка керує комп'ютером.
-
admin: усе, що власник може в Telegram і Mini App: переводити сесії в режим «Повний доступ» (і запускати в ньому), продовжувати сесію в «Повному доступі», змінювати
/settingsгрупи, запускати/update, встановлювати підтримку голосових, надсилати будь-яку slash-команду. Адмін ще й обходить правила заборони ролі (deny_toolsчату й учасника до адмінів не застосовуються). Дві речі лишаються за власником:- змінювати учасників і ролі: це робить лише
aipager configна комп'ютері, і ніщо в Telegram чи Mini App цього не може; - обходити поріг безпеки (конфігурація і токен бота aipager, облікові дані Claude Code, керувальні файли aipager).
GrepіGlobадміна можуть шукати будь-де ще, але не в папці, яка є однією з цих, лежить усередині однієї з них або містить одну з них:Grepпо~,/чи/tmp(або без папки із сесії в домашній папці) відхиляється, як іGlob, чий шаблон починається в одній із них (на кшталт/home/you/.config/aipager/*). Шукай натомість усередині папки проєкту. У версіях Claude Code без інструментаGrepClaude шукає через Bash; там теж відхиляється рекурсивний пошук або перелік усієї домашньої папки чи/(grep -rn x ~,rg x $HOME,find / -name x), наскільки можливо (пошуку без папки або з.., запущеного з домашньої папки чи нижче, не видно), а пошук по проєктах - ні, зокрема пошук ЗА домашнім шляхом (grep -rn "$HOME" src) (безпека).
Адмін зберігає Bash, а з shell шаблони команд порогу працюють лише наскільки можливо і не є межею: роби людину адміном, лише якщо їй можна довірити shell на цьому комп'ютері.
- змінювати учасників і ролі: це робить лише
-
user: правила заборони діють. Жодного Bash і жодного іншого інструмента, що виконує код (PowerShell, Monitor, заплановані повідомлення, workflows; список - це
safety.CODE_EXECUTION_TOOLS), жодногоSendMessageіншим сесіям, жодної зміни worktree. Файли пишуться лише в папку сесії та її scratchpad Claude Code і ніколи в.claude/,.git/чи.mcp.jsonцієї папки (кожен із них запускає команди).GrepіGlobшукають лише в цих папках, із простими відносними glob.userзапускає, продовжує, перезапускає і перемикає сесії лише всередині кореневої папки чату і не читає нічого у твоїй домашній папці поза нею. Папка сесії, яка є твоєю домашньою папкою,/або папкою вище, або яка лежить поза кореневою папкою (сесія, запущена до кореневих папок або кимось іншим), не рахується: тамuserможе писати й шукати лише в scratchpad. Читання підпорядковується правилам захищених шляхів, а твої файли облікових даних ніколи не читаються:~/.ssh,~/.gnupg,~/.aws,~/.config/gh,~/.git-credentials,~/.netrc,~/.docker/config.json,~/.kube,~/.config/gcloud,~/.azure,~/.password-store,~/.pgpass,~/.npmrcі~/.pypirc. Slash-команди: лише команди клавіатури «Команди»,/compactі зміна моделі (див. З чиїми правами виконується повідомлення). -
read_only: спостерігачі. Вони бачать усе в групі й можуть користуватися
/status,/diff,/whoami,/help,/startі/app, дивитися/settingsі гортати список/resume, який хтось відкрив. Їхні власні текстові, голосові повідомлення та файли нікуди не надсилаються. Перше, що вони надішлють у чаті, отримує відповідь, що їхня рольread_only; після цього бот для них у цьому чаті мовчить (ні відповіді, ні реакції), доки aipager не перезапуститься. Вони мають ті самі обмеження на інструменти й запис, що йuser, на випадок, якщо якесь їхнє повідомлення все ж дійде до сесії.
Власні ролі#
policy.yaml може змінювати будь-яке поле вбудованої ролі або задавати нові ролі. Поле, яке ти задаєш, замінює вбудоване значення. Поля:
can_prompt,can_approve: надсилати повідомлення; відповідати Claude.can_manage: користуватися «Повним доступом», змінювати/settingsгрупи, запускати/updateі встановлювати підтримку голосових (вбудовані:ownerіadmintrue,userіread_onlyfalse). Воно ніколи не дозволяє змінювати учасників чи ролі й ніколи не обходить порогу безпеки.bypass_role_denies,bypass_safety: див. таблицю.deny_tools,allow_tools,deny_bash_patterns,deny_paths_no_access,deny_paths_no_write: див. Як працюють правила.
Роль, задана з нуля, починає з увімкненими can_prompt і can_approve, вимкненими can_manage та обома винятками, з файлами облікових даних у її deny_paths_no_access і без заборонених інструментів, тобто з Bash, доки ти не задаси deny_tools (aipager doctor один раз попереджає, коли вона є в учасника). Обмеження запису й пошуку діє для кожної ролі без bypass_safety або bypass_role_denies. Коренева папка діє для кожної ролі без can_manage, хоч які в неї винятки: роль, яку ти задаєш із bypass_role_denies або bypass_safety, але без can_manage, пише і шукає будь-де всередині своєї кореневої папки (і свого scratchpad) і більше ніде, а у твоїй домашній папці не читає нічого поза своєю кореневою папкою (з bypass_safety у сесії, яка працює поза її кореневою папкою, вона пише лише у свій scratchpad). Без обмежень лише власники й адміни.
Кореневі папки#
Кожен чат має кореневу папку учасників: папку, де учасники, чия роль там без can_manage (вбудовані user і read_only та ролі, які ти задаєш без нього), запускають і тримають свої сесії. Власників і адмінів вона не тримає. Коренева папка особистого чату належить цій людині; коренева папка групи спільна для обмежених учасників групи. Два чати ніколи не ділять однієї, якщо лише ти навмисно не даси їм ту саму папку (майстер попросить це підтвердити).
- Як задати.
aipager configпитає її, коли ти додаєш групу чи особистий чат для ролі безcan_manage, з уже підставленим значенням за замовчуванням, а Edit a scope → Set the members' root folder її змінює (застосовується одразу, перезавантаженням на льоту). Поточна конфігурація показує кореневу папку кожного чату, з(default), якщо її не задано. - За замовчуванням - це
~/aipager-users/<label>для особистого чату (ім'я людини) і~/aipager-users/group-<label>для групи. Ім'я переводиться в нижній регістр, а все, крім літер, цифр,.,_і-, стає-; якщо два чати отримали б одну папку, до кожної додається ID її чату (sara-123456). Папка (і~/aipager-users, якщо вона нова) створюється з правами 0700, щоб відкрити її міг лише ти, коли учасник уперше відкриває/newабо форму «Нова сесія» в Mini App. Перед запуском сесії в ній aipager позначає її для Claude Code як довірену, щоб питання Claude Code «Do you trust this folder?» не завершило першу сесію учасника. Значення за замовчуванням ніколи не переїжджає: коли зміна вaipager config(коренева папка іншого чату, прибраний чат, нове ім'я) змінила б папку чату за замовчуванням, майстер записує папку, яку він мав, як кореневу папку цього чату. - Що майстер відхиляє: відносний шлях, підстановочні знаки,
/, твою домашню папку або папку вище, папку, яка є однією із захищених папок aipager чи файлів облікових даних, лежить у ній або містить її (~/.claude,~/.config/aipager,~/.config,~/.ssh, ...), і тимчасову папку Claude Code (/tmp/claude-*, де лежить scratchpad кожної сесії). Папка, якої ще немає, підходить. Він просить підтвердити папку, звідки твоя система запускає програми (~/bin,~/.local/bin,~/.config/systemd,~/.config/autostartабо папку всередині них). - Запуск сесій. Сторінка «Папка» в
/newі Mini App показують кореневу папку і папки просто всередині неї (не приховані й не посилання, яке веде назовні), без рядка «Папка за замовчуванням»; нова сесія запускається в кореневій папці, якщо не вибрати однієї з них. «Нова папка» створює папку всередині вибраної. Усе інше отримує «Твоя роль може запускати сесії лише у твоїй папці ~/... або в папці всередині неї.» - Сесії поза нею. Спроба продовжити, перезапустити чи замінити сесію, чия папка поза кореневою папкою, або змінити її режим отримує «Ця сесія працює поза твоєю папкою ~/..., тож твоя роль не може її продовжити, перезапустити чи змінити її режим. Попроси адміна.» Повідомлення в таку сесію, що працює, і далі надсилаються, а hook безпеки тримає завдання: там воно пише лише в scratchpad.
- Чим hook обмежує завдання. Завдання обмеженого учасника пише лише в папку сесії (коли вона всередині кореневої папки) і в її scratchpad, не читає, не робить
GrepіGlobні по чому у твоїй домашній папці поза кореневою папкою (крім свого scratchpad і свого файлу відповіді) і ніколи не торкається кореневої папки іншого чату, хоч де та лежить. Папки поза твоєю домашньою папкою (/usr,/etc, ...) лишаються доступними для читання, захищені папки лишаються під забороною, іBashдляuserлишається забороненим. Коли в завданні змішано двох учасників із різними кореневими папками, перемагає вужча; дві, які не вкладені одна в одну, лишають лише власну папку сесії.
Щоб повернути user Bash (лише для людей, яким можна довірити shell), назви його в allow_tools (який тоді стає ще й списком дозволеного для цієї ролі) або заміни її deny_tools:
roles:
user:
# вбудований список без Bash
deny_tools: [PowerShell, Monitor, REPL, Workflow, CronCreate,
RemoteTrigger, AppifactRepl, self_hosted_runner_spawn_local,
self_hosted_runner_requeue_session, SendMessage,
EnterWorktree, ExitWorktree]
Тоді aipager doctor попереджає: role user has Bash: its safety rules are best-effort, not a boundary. Якщо у твоєму policy.yaml deny_tools для user було задано ще до появи цього значення за замовчуванням, твій список і далі його замінює, тому ця роль має Bash, доки ти не додаси його назад; попередження doctor про це скаже. Про те, чого ці обмеження не покривають, див. безпека → як правила діють у команді.
Спілкування з ботом у групі#
Що бот читає в групі#
У групі aipager обробляє лише повідомлення, яке є:
- командою:
/status,/x1 fix the testsабо те саме з@aipagerbotпісля команди (/x1@aipagerbot), що Telegram додає, коли вибираєш її в меню. Команда для іншого бота (/x1@otherbot) ігнорується; - відповіддю на одне з повідомлень бота;
- повідомленням зі згадкою бота:
@aipagerbot fix the tests; - натисканням на клавіатуру бота в групі. У групі кожна кнопка клавіатури починається з маленького квадрата (
▫️ стоп,▫️ Очистити розмову), і натисканням вважається лише цей позначений текст. Набрати слово просто так - це звичайна розмова: учасник, який набираєстоп,Очистити розмову,Opusабо назву сесії, нічого не змінює. Щоб навмисно використати слово клавіатури без клавіатури, звернися до бота:@aipagerbot стопабостопу відповідь на одне з його повідомлень.
Усе інше (учасники говорять між собою, фото чи голосове, яке не є відповіддю ботові) не отримує ні реакції, ні відповіді, і це не залежить від того, чи бот адмін у групі. Змінені повідомлення ігноруються скрізь: зміни повідомлення, і нічого не станеться; надішли його заново.
Фото, файл або голосове працюють так само: надішли їх відповіддю ботові або згадай бота в підписі. Для альбому став підпис на перший елемент: елементи альбому, які приходять після того, де підпис, згадка чи відповідь, беруться, а ті, що до нього, - ні.
Згадка прибирається. @aipagerbot fix the tests доходить до Claude як fix the tests (Claude Code прочитав би @word як файл). @aipagerbot status і @aipagerbot x2 працюють як набір status чи x2 в особистому чаті, а одне @aipagerbot показує, куди йдуть твої повідомлення. Команда сесії після згадки працює (@aipagerbot /x1 fix it), а одна з власних команд aipager - ні: @aipagerbot /stop отримує «Надішли /stop окремо, без згадки бота.»
Лише учасники. Людина, яка не є учасником групи, отримує одну відповідь («🚫 Тебе немає в списку дозволених у цьому чаті.») зі своїм Telegram ID, щоб передати його тобі, і записується для aipager config; після цього бот її ігнорує, доки aipager не перезапуститься. Учасник із read_only один раз дізнається свою роль (див. Ролі).
Анонімні адміни мають писати від свого акаунта. Адмін групи з увімкненим «Remain anonymous» або повідомлення, опубліковане від імені групи чи каналу, не кажуть, хто його написав: Telegram показує того самого відправника для всіх анонімних адмінів. aipager не може дати такому повідомленню нічиєї ролі, тому відповідає «Пиши від свого акаунта, щоб користуватися ботом.» (один раз на чат, доки aipager не перезапуститься) і більше нічого не робить. Його ніколи не записують як користувача, що чекає, а майстер відхиляє цей спільний ID. Вимкни «Remain anonymous» для себе в налаштуваннях адміна групи або пиши від свого акаунта.
Спілкування із сесією в групі#
Дай відповідь на одне з повідомлень сесії (її відповідь, її картку), і твоє повідомлення піде в цю сесію. Або надішли /x1 твоє повідомлення чи підпис, який починається з /x1.
Кожна людина має свою поточну сесію: ту, на яку вона востаннє перемкнулася (/x1), якій надіслала повідомлення, на яку відповіла або яку запустила. Відповідь сесії іншого учасника її не змінює, як і чужі повідомлення. Згадка, голосове, шаблон або команда клавіатури йдуть у твою власну поточну сесію, а команда клавіатури чи шаблон називають її у відповіді («🧹 /clear надіслано в x1»). Голі /stop, /mode, /kill, /restart, /rename, /delete або /diff діють лише на твою власну поточну сесію (зі звичайним підтвердженням) і лише коли команда для неї має сенс (працює для /stop, завершена для /delete); інакше завжди показують список, навіть коли лишилася одна сесія, бо вона може бути чужою. /clearqueue і /now діють на твою поточну сесію. /kill x1 та інші команди з назвою діють на цю сесію, як раніше.
- Якщо в тебе немає поточної сесії, а працює більше однієї, бот питає «Яка сесія? Дай відповідь на одне з її повідомлень або напиши /x1 і далі своє повідомлення.» з кнопкою на кожну сесію і нічого не надсилає. Якщо працює лише одна, повідомлення йде туди.
- Якщо твоя власна поточна сесія завершилася, повідомлення не йде в єдину сесію, що ще працює (вона може бути чужою): бот відповідає «x1 завершена. Яка сесія?» з кнопкою на кожну сесію, що працює, і, коли x1 можна продовжити, «▶️ Продовжити x1», і нічого не надсилає.
- Натискання на кнопку сесії в будь-якому з цих питань ще й надсилає в цю сесію повідомлення, про яке йшлося (текст, розшифровку голосового чи файл), ніби його було надіслано туди, а питання змінюється на «Надіслано в x2.». Користуватися кнопками може лише той, хто надіслав повідомлення, і лише десять хвилин і до перезапуску aipager: після цього кнопка лише робить сесію твоєю поточною («Це повідомлення надто старе й не надіслане; надішли його ще раз.»). ▶️ Продовжити повертає x1, але нічого не надсилає: надішли своє повідомлення заново.
- У групі в закріпленому рядку немає рядка «Повідомлення йдуть у», бо в кожної людини він свій.
Картки, які чекають на відповідь, належать одній людині. Картка нової сесії каже «Дай відповідь на це повідомлення назвою і, якщо хочеш, тим, з чого почати:», питання про перейменування «… Дай відповідь на це повідомлення новою назвою.». У групі кожна показує, чия вона («🆕 Нова сесія (@alice)»), відповісти на неї може лише ця людина, і дві людини можуть одночасно запускати або перейменовувати сесії. Відповідь іншого учасника на чужу картку нової сесії отримує «Це картка @alice. Надішли /new, щоб отримати свою.» і нікуди не йде. Питання про перейменування перестає чекати через 10 хвилин або щойно його людина зробить щось інше. Картка «x1 готова», відповідь на /x1, /start і /help кажуть дати відповідь на повідомлення сесії або згадати бота («Дай відповідь на повідомлення від x1 (або згадай @aipagerbot), щоб спілкуватися з нею.»), бо звичайне повідомлення до бота не доходить.
Клавіатура в кожного своя. Шаблони, Команди, Модель › і « Назад змінюють клавіатуру лише того, хто їх натиснув: бот відповідає у відповідь на натискання цієї людини, і нічия інша клавіатура не рухається. « Назад піднімається на рівень вище звідти, де ти зараз, хоч би що дивилися інші учасники. Основна клавіатура, яку надсилає /start, спільна для всієї групи й повертає всіх на основну клавіатуру. Коли сесія групи запускається чи завершується, aipager один раз знову надсилає групі цю основну клавіатуру, щоб її кнопки сесій лишалися актуальними. Після оновлення з версії без позначених кнопок натискання кнопки старої клавіатури може ігноруватися: надішли /start один раз, щоб дати групі нову клавіатуру. Клавіатура особистого чату не має позначки й працює як раніше.
Mini App#
/app відкриває Mini App лише в особистому чаті. У групі її немає в меню /; набрана там, вона каже учасникові, у якого налаштовано свій чат із ботом, «📱 Mini App працює лише в особистому чаті: напиши боту особисто й надішли там /app.», а всім іншим «Mini App відкривається з твого особистого чату з ботом. Попроси власника бота додати тебе.»
Mini App показує один чат за раз. Той, хто є в кількох чатах (наприклад, у своєму особистому чаті та в групі), отримує вгорі рядок із назвами чатів, щоб перемикатися між ними; він відкривається на власному особистому чаті людини, інакше на першому чаті, де вона є, і запам'ятовує останній вибір на цьому телефоні. Усе в ній (сесії, їхні кнопки, налаштування та сповіщення, які вона публікує) стосується вибраного чату, з тією роллю, яку людина має в цьому чаті. З одним чатом нічого зайвого не показується.
З чиїми правами виконується повідомлення#
Кожне повідомлення виконується з правами того, хто його надіслав, у тому чаті, звідки його надіслано. Той, хто є user у групі та owner у своєму особистому чаті, надсилає, натискає й запускає команди в групі як user, хоч у якому порядку чати стоять в aipager.yaml.
- Кожне повідомлення з Telegram приносить у сесію особу і правила свого відправника (див. безпека → як правила діють у команді). Claude бачить, хто надіслав кожне повідомлення (
[via Telegram · @bob · role:user]у групі), і ніколи не того, хто керував сесією до цього. Той, хто надсилає повідомлення, стає тим, хто керує сесією, чи набрано його, чи надіслано через/x1, шаблоном або командою клавіатури. - Притримані повідомлення зберігають свого відправника. Поки триває завдання іншої людини (зокрема фоновий агент, якого вона запустила), або поки чуже повідомлення ще чекає, щоб його забрали, або поки відкрито запит на дозвіл чи питання, нове повідомлення притримується (👀) і надсилається, коли це мине, окремим завданням, з правами свого власного відправника. Завдання, набране в терміналі, вважається завданням власника: до нього приєднується лише повідомлення власника (або, в особистому чаті, його власного учасника). Твої власні повідомлення ніколи не чекають на твоє власне завдання. Якщо завдання, на яке вони чекають, зупинять, або воно зупиниться через заблокований інструмент, притримані повідомлення викидаються (🤷): надішли їх заново.
- Перемагає найсуворіше. Якщо повідомлення різних людей усе ж опинилися в одному завданні, завдання йде з найсуворішим поєднанням усіх, хто в ньому бере участь. Повідомлення, яке приєдналося до завдання, що триває, ніколи його не розширює: решта завдання зберігає найсуворіші правила всіх, хто приєднався.
- Slash-команди обмежених ролей. Роль, яка не обходить правил ролей (
user,read_only, ролі, які ти задаєш безbypass_role_denies, і відправник, якого aipager не знає), може надсилати лише slash-команди клавіатури «Команди» (твоєї, якщоkeyboard.jsonїї змінює),/compactі зміну моделі (/model <name>). Усе інше, набране, надіслане через/x1 /deliver ..., підписом до файлу, першим повідомленням/new x1 /review ...або шаблоном, отримує «Ця команда лише для адмінів.» і 🤷, і нічого не доходить до Claude. Власники й адміни надсилають будь-які. - Обмежені ролі тримаються поза домашньою папкою і подалі від файлів облікових даних. Завдання
userчиread_onlyніколи не пише в папку сесії, яка є твоєю домашньою папкою,/або вище (лише у свій scratchpad), і ніколи не читає файлів облікових даних, перелічених у Ролях. - Обмежені ролі лишаються у своїй кореневій папці. Завдання ролі без
can_manageнічого не читає у твоїй домашній папці поза кореневою папкою чату і нічого не пише в папку сесії поза нею. Коренева папка - це папка того чату, звідки прийшло повідомлення учасника, хоч у яку сесію воно йде. - Прибраний учасник утрачає права одразу, але не своє завдання, що триває. Відправник, якого aipager більше не знає (прибраний, поки його повідомлення чекало), іде за обмеженим порогом. Після перезавантаження на льоту його притримані повідомлення викидаються, а його завдання, що ще триває, працює далі, обмежене порогом до кінця; надішли
/stop, щоб закінчити його зараз (див. Перезавантаження без перезапуску). - Повідомлення від іншої сесії Claude несе права свого відправника. Повідомлення, яке одна сесія надсилає іншій (
SendMessageу Claude Code), іде з правами завдання, яке його надіслало, у тому вигляді, у якому їх перевірив aipager, і ніколи з попередніми правами сесії, що отримує. Повідомлення, яке aipager не може перевірити, іде з найсуворішими правилами й без змін файлів і доступу до інтернету (див. безпека → повідомлення між сесіями Claude). - Заблокований інструмент зупиняє завдання. Коли завдання пробує інструмент, який забороняють його правила, завдання одразу зупиняється з «🛑 x1 · Заблоковано правилом безпеки: ... (зупинена)», і кожен наступний виклик інструмента в цьому завданні теж відхиляється.
Хто що може натискати#
Кожна кнопка перевіряє роль того, хто її натискає, у тому чаті, де кнопка, у момент натискання. Роль того, хто надіслав команду, що створила кнопку, не рахується. (Деякі картки ще перевіряють, хто їх запитав: картки підтвердження і картки /new, нижче.)
- Дивитися може будь-який учасник (VIEW). Учасники
read_onlyможуть гортати/resume, відкривати вигляд «Завершені» в/status, меню ⋮ сесії, її режим чи її diff, переглядати/settingsі закривати меню. Діяти вони не можуть: будь-яка інша кнопка відповідає «Твоя роль у цьому чаті цього не дозволяє.» - Щоб відповідати Claude, потрібне
can_approve(APPROVE): Дозволити, Дозволяти завжди, Відхилити, варіанти питання, Надіслати, Продовжити і Відповісти в закріпленому рядку.read_onlyйого не має. - Щоб діяти із сесією, потрібне
can_prompt(PROMPT): Зупинити, Повторити, Стиснути, Надіслати зараз, Завершити, Перезапустити, Перейменувати, Видалити, Продовжити, зміна режиму, ✍️ спілкуватися, Прибрати всі, власні налаштування сесії та картки/new. Кнопці, якої aipager не знає, це теж потрібно. - Перехід у «Повний доступ» потребує адміна (MANAGE:
owner,adminабо роль ізcan_manage, те саме правило, що для/mode full): «Так, змінити» і «Зупинити і змінити» на картці, яка перемикає на «Повний доступ», і продовження в «Повному доступі». Перемикатися між «Питати» та Авто може будь-хто, хто може діяти із сесією. Продовження сесії, яка була в «Повному доступі» (набраний/resume x1, список, Продовжити на картці назви/newабо Mini App), для всіх інших повертає її в режимі Авто, і відповідь це каже: «♻️ x1 знову працює, у режимі Авто: режим „Повний доступ“ лише для адмінів.» - У своєму власному особистому чаті людина може користуватися «Повним доступом», хоч яка роль (зокрема
user; неread_only, який не надсилає повідомлень; власній ролі потрібніcan_promptіcan_approve, бо «Повний доступ» відповідає на всі запити на дозвіл Claude Code). Усі шляхи в «Повний доступ» вище там для неї працюють:/mode full, картка режиму,/new !x1, картки/new,/resumeі Mini App. Її власний чат - це єдине місце, де це діє: у групі та в особистому чаті будь-якої іншої людини «Повний доступ» і далі потребує адміна. Її нові сесії запускаються в режимі Авто, як в усіх, доки вона не вибере «Повний доступ» у/settings→ Нові сесії. Більше нічого з того, що робить адмін, їй не відкривається (/update, кнопка встановлення голосових і/settingsгрупи лишаються лише для адмінів). Роздавати «Повний доступ» так безпечно: він запускає Claude Code з--dangerously-skip-permissions, який пропускає лише власні запити на дозвіл Claude Code. Hook PreToolUse від aipager і далі працює на кожному виклику інструмента й застосовує правила ролі учасника (поріг безпеки, обмеження папкою, правила заборони, файли облікових даних) саме як у режимах «Питати» та Авто. - Встановлення потребує адміна (UPDATE): кнопки встановлення й перезапуску для голосових, як у
/update. - Змінювати
/settingsгрупи може лише адмін. Дивитися може будь-хто. - Картка підтвердження належить тому, хто її запитав. У групі картки підтвердження для Завершити (
/kill, ⋮ Завершити сесію), Перезапустити, Видалити і зміни режиму, списки сесій, які показують/kill,/restart,/delete,/mode,/stop,/renameі/diff, і картка «Як продовжити x1?», яку відкриває натискання Продовжити (її кнопки режимів), відповідають лише тому, хто надіслав команду або натиснув кнопку, яка їх відкрила. Натискання будь-кого іншого, зокрема Скасувати, отримує «Це картка @alice. Надішли /kill x2, щоб отримати свою.» (з командою цієї картки) і нічого не змінює. Сама картка/mode(у якому режимі сесія) спільна: зміна, натиснута на ній, відкриває підтвердження, яке належить тому, хто натиснув. Картки/newвідповідають лише тому, хто надіслав/new. Власник картки запам'ятовується, доки її не використають або не скасують, навіть через перезапуск aipager (останні 4 096 карток). Винятки - це картка назви/newі питання про назву/rename: вони в будь-якому разі спливають через 10 хвилин, тому після перезапуску надішли команду знову. - Кнопка працює лише в чаті своєї сесії. Натиснута деінде, вона відповідає «Ця кнопка з іншого чату.» і нічого не робить, а Продовжити завжди продовжує ту сесію, яку називає кнопка, і ніколи не сесію іншого чату з тією самою назвою.
- Старі кнопки нічого не змінюють. Кнопка, що лишилася від попереднього завдання або з того часу, коли сесія ще не завершилася й не повернулася, не діє на те, що триває зараз; вона про це каже (див. команди → старі кнопки).
Що бачать усі#
Відповіді Claude. Кожне Дозволити, Відхилити і відповідь публікуються в чаті під карткою сесії, з тим, хто це зробив:
✅ x1 · Дозволено · @alice · Bash: ls -la /tmp
🚫 x1 · Відхилено · @bob · WebFetch: https://example.com
✓ x1 · Відповідь · @carol · Which database? → Postgres
Хто змінив сесію. Натискання кнопки бачить лише той, хто натиснув, тому в групі кожен результат, який змінює сесію, називає, хто це зробив:
⚠️ x1 · @bob зупинив(-ла)
⏹ @bob завершив(-ла) x2
🔄 @alice перезапустив(-ла) [x1].
🗑️ @carol видалив(-ла) [x3].
⚙️ @alice перемкнув(-ла) сесію на 🤖 Режим Авто.
@alice змінив(-ла) це. (під /settings)
Картка «x1 готова» називає, хто змінив її режим або модель («@bob змінив(-ла) модель на Opus.»). В особистому чаті ці рядки результату нікого не називають. Зміна, зроблена в Mini App, публікується в чаті як «... через Mini App» (зупинка звідти ще й називає на картці сесії, хто це зробив).
Інструмент, заблокований правилом. Завдання зупиняється з «🛑 x1 · Заблоковано правилом безпеки: Write is in this role's deny_tools (зупинена)». Якщо Claude Code просить дозволу на інструмент, яким не може користуватися людина, чиє повідомлення почало завдання, що триває, бот сам відповідає Відхилити, не показує жодного запиту і публікує ⛔ x1 · Edit заблоковано для @bob (роль user) з коротким описом виклику нижче, називаючи цю людину. Завдання, яке почали повідомлення кількох людей, блокується, коли хоч одна з них не може користуватися інструментом, і називає її. Завдання, набране в терміналі, - твоє і ніколи не блокується правилами учасника, якщо лише до нього не приєдналося повідомлення з Telegram: тоді воно перевіряється за правилами того, хто надіслав останнє повідомлення сесії (власний список групи, якщо це невідомо). Коли aipager не знає, чиє це завдання (воно вже тривало, коли aipager перезапустився), він використовує правила того, хто надіслав останнє повідомлення сесії, а якщо й це невідомо, власний список групи.
Стан повідомлень. 👀 на повідомленні означає, що його надіслано в сесію (або притримано, поки це можливо); 👍 означає, що Claude його забрав; 🤷 означає, що його викинули до того, як Claude забрав. /whoami показує твоє ім'я, роль і правила в цьому чаті.
Закріплений рядок стану. Група має свій закріплений рядок стану (див. команди → закріплений рядок стану), де перелічено лише сесії цієї групи, якщо бот адмін із правом закріплювати. Без цього права рядок для групи пропускається: повідомлення видаляється, а не лишається незакріпленим в історії.
Аудит на диску. ~/.claude/aipager-audit.jsonl записує кожне рішення з user_id, username і чатом, щоб потім можна було відновити, що робила кожна людина. Він завжди пишеться англійською, хоч якою мовою чат.
Мова. Група має одну мову для власних повідомлень, карток і клавіатур aipager, її задає адмін через /language; доки адмін її не вибрав, вона англійська. Вона ніколи не йде за застосунком Telegram будь-кого. Те, що бачить лише одна людина, коротке сповіщення після натискання, приходить її власною мовою: її вибір в особистому чаті з ботом, інакше мова її застосунку Telegram, якщо людина прийшла після цієї версії, інакше мова групи. Змінюються лише тексти aipager; Claude відповідає тією мовою, якою йому пише кожна людина. Див. Мови.
Куди йдуть повідомлення#
- Кожна сесія належить одному чату, і все про неї йде туди: її картки, відповіді, запити на дозвіл, файли та сповіщення. Повідомлення в одному чаті ніколи не йде в сесію іншого чату, а назва сесії працює лише в її власному чаті: якщо набрати назву сесії іншого чату, відповідь буде «Немає сесії з такою назвою». Сесія, запущена, поки aipager працював без налаштованих чатів, отримує свій чат, щойно
aipager configїх додасть; поки сесія не має чату, жоден чат її не показує і не може з нею діяти. - Сесії, запущені в терміналі (
aipager session <name>), належать особистому чату власника: особистому чату, учасник якого має рольowner(роль ізbypass_safety). Якщо особистих чатів кілька і жоден не належить власникові, це перший особистий чат у списку; якщо особистих чатів немає зовсім, перший чат. На встановленні з особистим чатом вони ніколи не йдуть у групу. - Перехід на супергрупу відстежується автоматично (див. Коли Telegram оновлює групу).
Структура aipager.yaml (частини для команди)#
schema_version: 3
bot_token: "…"
scopes:
- kind: dm
chat_id: 12345 # твій власний особистий чат: його ID це твій ID користувача
label: owner DM
members:
- id: 12345
label: alice
role: owner
- kind: group
chat_id: -100123456789
label: team
deny_tools: [Write, Edit] # за бажанням: відповідь на «Block file edits»
root: /home/alice/aipager-users/group-team # коренева папка учасників
members:
- id: 12345 # ID користувача Telegram (НЕ ім'я, НЕ ID чату)
label: alice # як людина показується в чаті (@alice)
role: owner
- id: 67890
label: bob
role: user
deny_tools: [WebFetch] # за бажанням, для учасника
- id: 11111
label: charlie
role: read_only
Особистий чат і групові чати живуть разом: бот обслуговує кожен чат зі списку, а сесії кожного чату тримаються окремо. Цей файл пише aipager config; редагувати його тобі ніколи не потрібно.
Як працюють правила#
~/.config/aipager/policy.yaml задає правила для кожної ролі. Перевіряй його через aipager policy validate. Поля, які приймає кожна роль (крім перелічених у Власних ролях):
deny_tools: назви інструментів, заборонених без запитання (наприклад,Write,Edit,Bash,WebFetch).allow_tools: якщо не порожній, список дозволеного: усе інше для цієї ролі заборонено.deny_bash_patterns: шаблони, які порівнюються з вводомBash.deny_paths_no_access/deny_paths_no_write: правила для шляхів. Дляuser,read_onlyі кожної ролі, яку ти задаєш безbypass_role_denies,deny_paths_no_accessпочинається з файлів облікових даних, перелічених вище в user; якщо його задати, цей список замінюється, тому скопіюй у свій ті, які хочеш зберегти (завдання, що триває, до якого приєднується інше повідомлення, знову дотримується цього списку до свого кінця). Правило без/або~на початку (**/.env) збігається будь-де, тому поки воно є, коженGrep/Globобмеженої ролі відхиляється (будь-який пошук міг би прочитати такий файл), і це зупиняє завдання.
deny_tools чату і deny_tools учасника в aipager.yaml додаються до ролі, а allow_tools учасника додається до списку дозволеного ролі. Усе це діє лише для ролей без bypass_role_denies: власника чи адміна це не стосується.
Файли ~/.config/aipager/policy.d/*.yaml читаються після policy.yaml, за порядком назв, у тому самому форматі: поле ролі, задане в пізнішому файлі, замінює попереднє значення, а список safety: лише додається. aipager policy validate перевіряє їх усі.
Під усіма ролями лежить нижній поріг безпеки (захищені шляхи й шаблони команд), який обходить лише owner: адміни теж його дотримуються. Це вбудований список aipager плюс розділ safety: у policy.yaml, який може лише додавати:
safety:
deny_paths_no_access: [/srv/secrets/**] # ні читати, ні писати, ні шукати
deny_paths_no_write: [~/notes/**] # читати можна, писати не можна
deny_bash_patterns: ['\bcurl\b'] # команди Bash, які блокуються
Кожне завдання кожної ролі, крім owner, отримує його повністю, як і завдання, які aipager не може ні до кого віднести; aipager doctor --safety-check показує, що діє. Після перезавантаження на льоту зміна в ньому застосовується до повідомлень, надісланих після перезавантаження; завдання, що вже триває, чи повідомлення, яке вже чекає в черзі, зберігають старий список (зупини це завдання, щоб застосувати зміну одразу). Шлях у deny_paths_no_access там без / або ~ на початку збігається будь-де, тому поки він є, кожен Grep/Glob кожної ролі, крім owner, відхиляється (aipager doctor про це попереджає). Захищені шляхи застосовуються до файлових інструментів Claude Code (Read, Write, Edit, MultiEdit, NotebookEdit, LSP, Grep, Glob); Grep/Glob обмеженої ролі ще й має лишатися всередині папки сесії (пошук aipager/** у ~/.config відхиляється). WebFetch за шляхом не перевіряється; SendUserFile (файли, які Claude надсилає в чат) перевіряється, як Read, і учасник надсилає лише з кореневої папки чату (безпека). Завдання з Telegram, яке aipager не може віднести до відправника, отримує поріг, не м'якший за user. Повторити йде з роллю того, хто натискає, якщо ця людина надіслала повідомлення, яке повторюється, а інакше за порогом. Шаблони команд важливі лише для ролі з Bash, і там вони - фільтр, а не стіна; див. Модель безпеки → як правила діють у команді.
Питання приватності#
- Бот слухає лише налаштовані чати. Якщо додати бота в іншу групу, він там не ввімкнеться: він там ніколи не відповідає. Він записує, хто до нього там звертається (ID, ім'я користувача та ім'я людини, ID і назву групи), у
~/.claude/aipager-pending-users.json, щобaipager configміг додати цю групу. Читати цей файл можеш лише ти, і він зберігає останніх 200 людей, помічених за 30 днів. - Учасники
read_onlyможуть читати повідомлення, відповіді та ввід інструментів. Діяти вони не можуть, але бачать у групі все. Якщо якусь роботу треба приховати від когось, цій людині не місце в групі. - На встановленні з особистим чатом твої термінальні сесії та сесії твого особистого чату ніколи не з'являються в групі (див. Куди йдуть повідомлення). Термінальна сесія, яку старіший aipager уже переніс у групу, лишається в групі: заверши її, видали її із завершених сесій групи й запусти заново.
aipager.yamlмає права 0600 (лише власник). aipager не задає правpolicy.yaml: тримай його доступним лише власникові (chmod 600 ~/.config/aipager/policy.yaml).- Журнал аудиту (
~/.claude/aipager-audit.jsonl) не має власних прав: він настільки ж особистий, наскільки твоя папка~/.claude.
Як забрати доступ у людини#
- Запусти
aipager config→ Edit a member → чат → людина → Remove member. Щоб забрати право надсилати повідомлення, але лишити можливість читати, використай Set role і вибериread_only. (Щоб потім додати знову: Edit a scope → група → Add a member.) Для особистого чату людини заверши її сесії, потім Edit a scope → її особистий чат → Remove this scope. - Майстер перезавантажує aipager на льоту; він пише "Scopes reloaded live". Одразу її притримані повідомлення викидаються (🤷 і відповідь «Не надіслано Claude»), а її завдання, що ще триває, обмежується порогом до свого кінця. Надішли
/stop, щоб закінчити це завдання зараз. - Прибери її і з групи Telegram. Поки вона там, вона й далі може читати все, що туди публікується: картки, відповіді, ввід інструментів і запити на дозвіл.
Перевір, що каже майстер після кроку 1. Якщо він каже перезапустити aipager, він до нього не достукався: перезапусти його (aipager service stop, потім aipager service start), бо до цього в пам'яті лишається попередній список учасників. Якщо він пише "Not applied", виправ проблему, яку він називає: до цього aipager тримає попередню конфігурацію. Після ручної правки aipager.yaml надішли перезавантаження вручну (див. Перезавантаження без перезапуску).
Пов'язані сторінки#
- Архітектура: як улаштований процес.
- Команди бота: довідник з інтерфейсу.
- Модель безпеки: межа довіри, список загроз.
- Розв'язання проблем: довідка про
aipager doctor.