@mcsherrylabs/pi-meerkat
Pi agent extension: announce a channel you control onto the meerkat announcements registry, and search what others have announced. Owns the announcement wire contract; wraps @mcsherrylabs/pi-evolver for the chain and the content cache.
Package details
Install @mcsherrylabs/pi-meerkat from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:@mcsherrylabs/pi-meerkat- Package
@mcsherrylabs/pi-meerkat- Version
0.4.3- Published
- Oct 9, 2026
- Downloads
- 1,338/mo · 52/wk
- Author
- alanmcsherry
- License
- Apache-2.0
- Types
- extension, skill
- Size
- 92.4 KB
- Dependencies
- 3 dependencies · 0 peers
Pi manifest JSON
{
"skills": [
"./skills"
],
"extensions": [
"./extensions"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
@mcsherrylabs/pi-meerkat
Pi agent tools for the meerkat announcements registry: announce a channel you control, and search what others have announced.
pi-meerkat ──▶ @mcsherrylabs/pi-evolver ──▶ @mcsherrylabs/evolver-client
the service's verbs chain + content, generic the wire
Why this is a separate package
pi-evolver forbids a tool from naming a channel, a ledger or a service, and fails its build
for it — a draft of its content tool was rejected for the word "announcement". That rule is what
keeps it chain-generic, and it is also what says where a service's own verbs belong: here, in
the service's own repository, installed by whoever wants them. A new service becomes usable by an
agent with nothing central edited.
Tools
| tool | what it answers |
|---|---|
meerkat_summary |
start here — counts, kinds, keywords, misses, and which channel this registry indexes |
meerkat_services |
search by keyword or free text |
meerkat_service |
one entry in full, with its provenance |
meerkat_detail |
the announced document, digest-verified by the registry |
meerkat_rejections |
why an announcement was refused |
meerkat_announce |
describe a channel you control, optionally with a document |
meerkat_inbox |
what arrived on a channel this node subscribes to and no handler claimed — the event inbox |
Three things that are deliberate
The document is published before the announcement, inside the tool. An announcement names its
document by key and digest. Announce first and the entry refers to bytes that exist nowhere —
permanently unfetchable, indistinguishable from a document that is merely slow, and every
detail document on this estate was in that state until it was found. Two composable tools would
put that ordering in a model's hands. meerkat_announce takes the text.
The document is published OPEN. Anyone who obtains the key may read it. That is right for a public index, and with the announcements channel no longer carrying a DA group there is no group left to grant to. Do not announce anything whose disclosure depends on a key staying private.
The channel is configuration, not a parameter. REGISTRY_CHANNEL — the same variable the
registry reads, so the two cannot disagree. A model with a free-text channel field will
eventually fill it from something it read, and an announcement is charged and permanent.
Configuration
| variable | what |
|---|---|
MEERKAT_URL |
the event processor's read server — the registry's routes and the inbox — e.g. http://registry:8090. REGISTRY_URL, its name before 0.3.0, is refused: every read answers misconfigured until it is renamed |
REGISTRY_CHANNEL |
the channel to announce onto and read (default ce.meerkat.announcements) |
EVOLVER_URL, EVOLVER_IDENTITY, EVOLVER_KEY_PATH |
from pi-evolver — who signs |
EVOLVER_CONTENT_URL |
from pi-evolver — required only to announce a document |
The read tools need no chain at all: an agent with no signing key can still search the index.
The contract lives here
src/contract.ts is the announcement wire format — bounds, types and the body builder. It is in
this package rather than in the app so a client can announce without depending on the whole
registry, and so there is one encoding rather than two. Pure: no chain, no clock, no I/O.
npm run check:contract # the encoding and every bound, with nothing running
npm run check:surface # the tool table's properties
Version 0.4.2 pins pi-evolver 0.9.0 and evolver-client 0.19.0 to share the corrected identity-key lookup. Configure the agent API endpoint to evolver-node v0.24.1+ before using that lookup. The announcement and inbox contracts are unchanged.