@casualjim/pi-headroom
Headroom context compression for pi with a working headroom_retrieve tool
Package details
Install @casualjim/pi-headroom from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:@casualjim/pi-headroom- Package
@casualjim/pi-headroom- Version
0.1.20- Published
- Oct 27, 2026
- Downloads
- 2,156/mo · 880/wk
- Author
- casualjim
- License
- MIT
- Types
- extension
- Size
- 59.8 KB
- Dependencies
- 0 dependencies · 4 peers
Pi manifest JSON
{
"extensions": [
"./extensions/headroom.ts"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
@casualjim/pi-headroom
Headroom context compression for pi and omp (side by side). Compresses
oversized tool results through a local
Headroom proxy and exposes a
headroom_retrieve tool so compressed originals stay recoverable.
Fork lineage: @raquezha/noheadroom → @ryan_nookpi/pi-extension-headroom
(Jonghakseo), MIT.
Install
pi install /path/to/pi-mimir/packages/pi-headroom # pi
omp plugin install /path/to/pi-mimir/packages/pi-headroom # omp
Both hosts read the same source: the manifest declares pi.extensions and
omp.extensions, and omp's legacy-pi compat layer remaps @earendil-works/*
imports (plus typebox) onto its own packages.
Run a Headroom proxy yourself (never spawned by this package):
headroom proxy # default port 8787
headroom proxy --port 8788 # custom port: also set baseUrl in this host's settings
The default baseUrl is http://127.0.0.1:8787 — Headroom's own default. Running a
custom port (this setup uses 8788) means the settings file must set baseUrl, e.g.
~/.pi/agent/headroom/settings.json for pi and ~/.omp/agent/headroom/settings.json
for omp: { "baseUrl": "http://127.0.0.1:8788" } (or export PI_HEADROOM_URL).
Settings
Resolved per host, first match wins:
| Order | Source |
|---|---|
| 1 | PI_HEADROOM_SETTINGS — exact settings file path |
| 2 | PI_CODING_AGENT_DIR → <dir>/headroom/settings.json |
| 3 | host default: ~/.omp/agent/headroom/settings.json (omp) / ~/.pi/agent/headroom/settings.json (pi) |
Keys: baseUrl, enabled, mode, minContextTokens, minMessageChars,
timeoutMs, allowRemote, renameToolCalls. /headroom mode <m> writes back
to the file the host resolved.
Host detection is a capability probe: omp's ExtensionAPI exposes zod, pi's
does not.
Retrieve
Compressed results carry a hash marker, e.g.
[400 items compressed to 10. Retrieve more: hash=abc…] or <<ccr:abc…>>.
Call headroom_retrieve(hash="abc…") to get the full original from the
proxy's CCR store (TTL 1800 s).
/headroom status|on|off|health|stats|mode <normal|quiet|silent>
Behavior
- Only
toolResultcontent is mutated; user/assistant text, tool-call ids and names stay unchanged in the session. - Tool calls are renamed to
pi_tool_resultin the compression payload so Headroom'sDEFAULT_EXCLUDE_TOOLSdoes not skip largeread/grepresults. SetrenameToolCalls: falseto keep Headroom's intended read protection. - Unset or unreachable proxy degrades to a no-op with a one-time warning.
- Loop guards: reentrancy flag, 3 s throttle, input/output/candidate fingerprints, bounded seen-content FIFO.
Host compatibility
headroom_retrievedeclaresloadMode: "essential"andapproval: "read". omp defaults extension tools todiscoverableandexec, which would keep a marker-redeeming tool out of the top-level set and route it through the approval gate; pi ignores both fields.- Default
timeoutMsis 20 s. The compress call runs inside thecontexthandler, and omp kills a handler at its 30 s per-event cap (EXTENSION_HANDLER_TIMEOUT_MS), which would drop the whole context transform. pi has no such cap. - omp's handler context exposes no
AbortSignal; actx.signalabsence simply leaves the internal timeout as the only bound.