Pi (pi-coding-agent) sessions get inbox delivery via global extension (.common/lib/pi-extensions/inbox-monitor.ts → ~/.pi/agent/extensions/). Not cwd-scoped: any .claude-inbox/ message pages the current session with project name in header. Headless = no delivery. SKILL.md v0.2.2→v0.3.0.
3.8 KiB
3.8 KiB
session-inbox-monitor-pi-extension — working context
Status: 🟢 done (shipped 2026-08-10) — pi-native inbox delivery shipped for ALL pi sessions, see STATUS.md block. Owner: vitya (pi interactive session, .admin) Notify: OpeItcLoc03/claude-skills
Pi (pi-coding-agent) не покрывался скилом: Monitor tool — CC-only, хуки CC-only.
Собран pi-native аналог: глобальное расширение, доставляющее сообщения из ЛЮБОГО
.claude-inbox/ в текущую pi-сессию независимо от cwd (требование vitya: «мне
похуй, какой агент в какой папке сидит — система сообщений должна работать»).
Решения
- Глобально, не cwd-scoped. Скан всех инбоксов: прямые дети
~/projects(все 20 инбоксов живут на глубине 1, проверено find). Оверрайд —PI_INBOX_ROOTS(pathsep,;на Windows). - Два пути доставки (контракт как у CC-хуков):
- PUSH: один глобальный poll-интервал 15s (интерактив только).
- PULL:
agent_settledsweep — pi-эквивалент Stop-хука. - Dedup per-process по
inbox|filename; move в.read/— кросс-процессный guard: кто первый swept — тот и забрал (CC hook или pi), второй пропускает.
- Headless (
pi -p,ctx.hasUI === false) — НИКАКОЙ доставки. Ни watcher, ни sweep. Сообщения ждут интерактивную сессию. Зеркалит CC-headless (там внешний Notify/ntfy, не инжект в ран) + не угоняет one-shot прогоны и не съедает сообщения без обработки. - Доставка:
pi.sendUserMessage(body, { deliverAs: "followUp", triggerTurn: true })— заголовок[inbox] <project>/<name>+ тело инлайн, потом move в.read/. Пустые файлы (частичная запись) пропускаются и ретраятся. - Source of truth:
.common/lib/pi-extensions/inbox-monitor.ts(Node built-ins only, без npm deps — авто-дискавери без package.json). Деплой: копия в~/.pi/agent/extensions/inbox-monitor.ts(global → все pi, все директории). Hot-reload/reload. Тест:inbox-monitor.test.mjs(node --experimental-strip-types, Node ≥22.6).
Verified
- Функциональный тест 3 блоков (интерактив-глобал, headless-no-delivery, partial-write-retry) — ALL TESTS PASSED.
- Нет зависания процесса: headless не стартует интервал; интерактив чистит
интервал в
session_shutdown(timeout-прогон EXITED CLEANLY). - Деплой: diff source↔
~/.pi/agent/extensions/= 0 (byte-identical).
Open questions / failure modes
- Кросс-харнессный двойной пикап: CC и pi оба свипят —
.read/move делает first-wins, не double-processing. Два pi-процесса на одной машине гонятся как две CC-сессии (known limitation, см. SKILL.md). - Проверка живого pi-лоада (что авто-дискавери подхватил расширение в
реальном TUI) — за
/reloadпри следующей интерактивной pi-сессии. - Headless-доставка не реализована (сознательно): при необходимости — внешний Notify/ntfy, отдельная задача.