Files
skills/.tasks/session-inbox-monitor-pi-extension.md
vitya a0491e00fd feat(session-inbox-monitor): pi support — global extension section, v0.3.0
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.
2026-08-10 22:43:18 +03:00

52 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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: «мне
похуй, какой агент в какой папке сидит — система сообщений должна работать»).
## Решения
1. **Глобально, не cwd-scoped.** Скан всех инбоксов: прямые дети `~/projects`
(все 20 инбоксов живут на глубине 1, проверено find). Оверрайд —
`PI_INBOX_ROOTS` (pathsep, `;` на Windows).
2. **Два пути доставки** (контракт как у CC-хуков):
- PUSH: один глобальный poll-интервал 15s (интерактив только).
- PULL: `agent_settled` sweep — pi-эквивалент Stop-хука.
- Dedup per-process по `inbox|filename`; move в `.read/` — кросс-процессный
guard: кто первый swept — тот и забрал (CC hook или pi), второй пропускает.
3. **Headless (`pi -p`, `ctx.hasUI === false`) — НИКАКОЙ доставки.** Ни watcher,
ни sweep. Сообщения ждут интерактивную сессию. Зеркалит CC-headless (там
внешний Notify/ntfy, не инжект в ран) + не угоняет one-shot прогоны и не
съедает сообщения без обработки.
4. **Доставка:** `pi.sendUserMessage(body, { deliverAs: "followUp", triggerTurn:
true })` — заголовок `[inbox] <project>/<name>` + тело инлайн, потом move в
`.read/`. Пустые файлы (частичная запись) пропускаются и ретраятся.
5. **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, отдельная задача.