# pi-foldable-tools

Make [pi](https://pi.dev) tool blocks foldable and hideable.

pi's built-in tool blocks (the green/red "Tool execution box") are always
rendered with a full colored shell. The only built-in control, `ctrl+o`
(`app.tools.expand`), toggles output *verbosity* — invisible for short outputs
and it never collapses the block itself. This extension adds the missing fold /
hide capability.

## What it does

Re-registers the built-in tools (`read`, `bash`, `edit`, `write`, `grep`,
`find`, `ls`) with `renderShell: "self"` so the always-on colored box is gone,
and adds a 3-state view for **completed** blocks (running blocks always stream
live so you can still see activity):

| Mode | Completed block shows |
|------|----------------------|
| **folded** (default) | Compact 2-line card: the call header (`$ ls -la` / `read foo.py`) + a one-line status (`✓ 3 lines`, `✗ exit 127 · 3 lines`, `+2 -1` for edits) |
| **expanded** | Full output — syntax-highlighted reads & diffs (delegated to the originals) / full text for bash·edit·write |
| **hidden** | Removed from the transcript entirely (0 lines) |

Execution behavior is unchanged: every tool delegates `execute` to the original
built-in tool definition, so reads/edits/bash/grep behave identically. Only the
rendering changes.

## Controls

- **`ctrl+q`** — cycle `folded → expanded → hidden → folded`
- **`/tools [folded|expanded|hidden]`** — set directly, or cycle with no arg
  (use this if your terminal eats `ctrl+q`)
- **`ctrl+o`** (built-in) — still expands output within folded/expanded modes
- **`PI_TOOL_FOLD_MODE`** env var — default mode on startup (`folded` (default),
  `expanded`, or `hidden`)

A footer status line (`tools: folded`) shows the current mode.

## Install

```bash
pi install npm:pi-foldable-tools
```

Or from git:

```bash
pi install git:github.com/<user>/pi-foldable-tools
```

Then restart pi (or run `/reload`).

## Notes

- `ctrl+q` is a single byte (`0x11`) that tmux passes through (only `ctrl+b`
  is tmux's prefix), so it works inside tmux. If your terminal intercepts
  `ctrl+q` (some map it to XON flow control), use the `/tools` command instead.
- Rendering for `read`/`grep`/`find`/`ls` is delegated to the originals (they
  use a `Text`-based renderer), preserving syntax highlighting and truncation
  notes. `bash`/`edit`/`write` use a `Container`+state renderer that is not
  safe to delegate, so they are rendered locally as `Text`.
- Reading an image file in `hidden` mode still renders the image (image
  rendering is owned by the tool component, not the result renderer); the text
  part is hidden as expected. Rare edge case.

## License

MIT
