Pi
Pi resolves models against your own credentials, so Saggar asks it what it can reach rather than shipping a list. Its integration is a Saggar-owned extension file that Pi discovers on its own.
| Command | pi |
| Install | curl -fsSL https://pi.dev/install.sh | sh |
| Hook configuration | ~/.pi/agent/extensions/saggar-presence.ts |
| Skill location | ~/.pi/agent/skills/saggar-cli/SKILL.md |
| Resume | pi --session <id>, or pi --continue without an id |
Launching
The default row launches pi with whatever model Pi is configured to use. The
provider card runs pi --list-models and lets you pick which of the reported
models get their own row. A pick is remembered per provider, so the same model
picked under Pi and under OpenCode stays two separate rows. Pi takes no
reasoning-effort flag.
Hooks
Installing hooks writes one TypeScript extension into Pi's extensions directory. Pi loads it automatically, so no configuration file of yours is edited, and removal deletes only that file. With it installed Saggar:
- captures the native session id;
- names the session from its first prompt;
- follows turns and clean exits from Pi's lifecycle;
- shows the active model in the terminal's chat info;
- restores each session to its exact conversation.
Saggar replaces an older copy of its extension each time it starts. If the file on disk still doesn't match this build's copy, for example because it was edited, the provider card asks you to install again. Nothing is version gated.
Prompts and automatic approval
Pi doesn't expose a blocking permission event, so a waiting prompt is noticed from the screen and turns the session Needs you. Saggar has no dialog vocabulary for Pi, so automatic approval never types into a Pi session.
Resume
With a recorded id, restore runs pi --session <id>. Without one it runs
pi --continue.
Further reading
- Pi's terminal setup, tmux, and keybindings pages cover its keys and themes. Set up your terminal for agents says which of those Saggar already handles.