rpi: печать для Поли только после кнопки владельца — код готов (astra-bot 83aed7a), не установлен

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-13 18:25:28 +03:00
co-authored by Claude Opus 5.5
parent e7499cab3e
commit 3bdda1068d
2 changed files with 6 additions and 0 deletions
+1
View File
@@ -76,6 +76,7 @@ OneDrive на внешний HDD; с того же дня ещё и медиац
- Код настройки и команда — `stacks/rpi-print/`; `home-print` установлен в `/usr/local/bin/` (root, 755). `home-print status` — состояние/очередь; `home-print [--duplex] <PDF/PNG/JPEG>` — одна копия, A4 с подгонкой. Печать только по прямой просьбе пользователя; приём задания в очередь не означает, что бумага уже вышла.
- **Навык `home-print` упрощён для ребёнка 2026-10-11**; источник — [astra-bot `11d0a85`](https://git.ruzzy.dev/ruzzy/astra-bot/commit/11d0a85), `codex/skills/home-print/`, установлен в `~astra/.codex/skills/home-print/`. Вместо PNG каждой страницы и повторного подтверждения отправляет **один PDF**, затем по прямой просьбе «распечатай» печатает одну копию A4 с одной стороны без дополнительных вопросов. Текст извлекается из скриншотов, картинки сохраняются в оттенках серого, все страницы проверяются локально. Если PDF не доставлен, печать не запускается; повторная отправка задания при ошибке не автоматическая. Для этого сценария установлены узкие постоянные разрешения `~astra/.codex/rules/home-print.rules` (источник `codex/rules/` в astra-bot): только `/usr/local/bin/home-print` и PDF-режим штатного отправщика. Общая политика подтверждений сохранена. Проверка: 31 тест, валидация скилла и правил; произвольный Python правилами не разрешается. Инструкции установлены в `~/.codex/AGENTS.md`; новые разговоры получают их автоматически.
- **Кнопки и промежуточные ответы печати убраны в самом боте 2026-10-11**, [astra-bot `6b1317d`](https://git.ruzzy.dev/ruzzy/astra-bot/commit/6b1317d). Ранее постоянных правил скилла было недостаточно: запросы approval и все agentMessage уходили в Telegram. Бот теперь автоматически отвечает accept только на штатную PDF-отправку разрешённому чату и home-print для print.pdf в каталогах /tmp/astra-print-*; shell-операторы и произвольные команды исключены. В задачах печати сохраняет последний ответ и отправляет его после завершения, PDF доставляется отдельным вложением. Проверено 34 тестами, установлен bot.py; прежний код — /opt/astra-bot/bot.py.bak-20261011-child-print. Перезапуск через restart-check.py после завершения текущего ответа.
- **Печать для Поли — только после кнопки владельца (решение владельца 2026-10-13; код готов, ⚠️ ещё НЕ установлен)**, [astra-bot `83aed7a`](https://git.ruzzy.dev/ruzzy/astra-bot/commit/83aed7a). Причина: владелец хочет видеть и подтверждать всё, что печатает ребёнок; прежний сценарий «Поля пишет “Печатай”» отменяется. Поля просит распечатать → агент собирает PDF и сразу (без её «Печатай») вызывает `/usr/local/bin/home-print-request CHAT /tmp/astra-print-<id>/…/print.pdf` → бот забирает копию в `~astra/.local/share/astra-bot/print-requests/<id>/` (каталог 700, PDF 600, sha256, число страниц) и шлёт владельцу (`607015`) этот PDF с кнопками «Подтвердить» / «Отменить» → после «Подтвердить» бот сам запускает `home-print` на сохранённой копии. Поле — только простые сообщения («отправила папе», «папа разрешил» / «пока не разрешил»). Почему одной правки бота было мало: `home-print` был разрешён правилом `allow` в `~astra/.codex/rules/home-print.rules` и выполнялся мимо бота для всех чатов; теперь правило `prompt` — прямая печать приходит боту, взрослым (владелец, Оля) он одобряет её сам без кнопки (взрослый сценарий PDF → «Печатай» сохранён), в детском чате отклоняет `home-print`/`lp`/`lpr`. В песочнице Codex CUPS недоступен (проверено `codex sandbox`: `lpstat` → scheduler is not running, `sudo` не работает), поэтому мимо бота печать не проходит. Защиты: кнопку принимает только владелец в своём личном чате и только от сообщения с этим PDF; заявка выходит из `pending` один раз, статус `printing` пишется на диск до запуска принтера — повторное нажатие, сбой `lp` и перезапуск бота второй копии не дают (после сбоя нужен новый запрос); изменённая копия PDF не печатается; путь только `/tmp/astra-print-*/…/print.pdf` без ссылок, ≤ 20 МБ, 1–50 стр.; не больше 5 ожидающих запросов, срок 24 ч, закрытые заявки хранятся 7 дней. Заодно: запросы подтверждения команд из чата Поли теперь уходят владельцу («👧 Запрос из чата Поли»), а не ей — раньше она могла нажать «Разрешить» под любой командой, включая `sudo`. Проверено 90 тестами (не-владелец, повтор, отмена, подмена PDF, сбой принтера, взрослый сценарий), правила — `codex execpolicy check`; реальной печати и сообщений в Telegram не было. Установка (делает Astra): `bot.py` и новый `print_requests.py` → `/opt/astra-bot/`, `home-print-request` → `/usr/local/bin/` (root, 755), `home-print.rules`, `skills/home-print/SKILL.md`, `AGENTS.md` → `~astra/.codex/`, перезапуск `astra-bot` (правила читаются при старте `codex app-server`). ⚠️ Ограничения: подтверждает только владелец (Оля — нет); «напечатано» = принято в очередь CUPS, бумагу бот не видит; пока владелец не ответил на системный запрос из чата Поли, её задача ждёт; защита рассчитана на послушного агента и просьбы ребёнка, а не на агента, намеренно ищущего выход из песочницы (у `astra` sudo NOPASSWD, `base.rules` выполняют `git` вне песочницы).
- ⚠️ DOCX напрямую не печатается — сначала преобразовать в PDF. Hostname выбран вместо DHCP-IP, чтобы пережить смену адреса; требуется mDNS и включённый принтер. `printer-error-policy=abort-job` исключает неожиданную автоматическую печать старых заданий после ошибки; ошибочный прогон нужно отправить заново.
- Проверено: запрос атрибутов IPP (`ipptool`) PASS, принтер idle/enabled, A4/Gray/duplex доступны. Портрет успешно преобразован фильтрами CUPS PNG → PDF → PWG Raster (A4, 300 dpi), без ошибок. Тестовая страница A4 отправлена 2026-10-11 в 15:20 MSK: `home-brother-1`, CUPS сообщил `job-completed-successfully`, принтер вернулся в idle, очередь пуста; качество на бумаге проверяет пользователь.
+5
View File
@@ -21,3 +21,8 @@ Word DOCX перед печатью нужно преобразовать в PDF
Отправлять на бумагу только по прямой просьбе пользователя. Сообщение о принятии
задания означает приём в очередь; итог следует проверить через `lpstat`.
Печать по просьбе ребёнка (2026-10-13): только после кнопки владельца в Telegram — команда
`home-print-request` и логика заявок живут в `ruzzy/astra-bot` (`print_requests.py`,
`codex/skills/home-print/`), бот запускает этот же `home-print` на сохранённой копии PDF.
Подробности и ограничения — `servers/rpi.md`, «Домашняя печать».