rpi-extensions
The host side of the plugin system: discovers, loads and drives Rust cdylib
plugins, and bridges their tools and events into the runtime's native async
types.
The ABI contract itself lives in
rpi-plugin-sdk; this crate is the
other half.
Install
[]
= "0.3"
Most users never depend on this directly — the rpi CLI uses it, and the
harness consumes its adapters through injection.
What it does
- Loading.
load_oneloads a single library,load_dirscans a directory, andload_sessionresolves the whole set for a session. Entrypoints are resolved unified → v3 → v2, so older plugins keep working. - Registry.
ExtensionRegistryholds what plugins registered: tools, providers, handlers, renderers and resource-discovery callbacks, with a deterministic snapshot the runtime can read. - Tool bridge.
PluginToolAdapterimplements the agent'sAgentTooltrait on top of a plugin's four-function lifecycle (execute→poll→cancel→destroy). The blockingpollloop runs onspawn_blockinginside the ambient runtime — the adapter does not own a runtime of its own. - Partial results. Tool progress flows back through an unbounded channel and
is forwarded to
on_update, behind acatch_unwindtrampoline so a panicking callback cannot unwind across the FFI boundary. - Lifecycle events. Dispatch wrappers for data, empty and lifecycle events, a veto path that lets a handler refuse startup, and a tee emitter so a plugin can observe events without stealing them from the TUI.
- Providers.
PluggableProviderandExtensionProviderHookslet a plugin serve a model or patch request options.
Crate dependencies
rpi-extensions depends on rpi-plugin-sdk, rpi-ai and rpi-agent only —
never on rpi-harness. The harness receives these adapters as trait objects, so
the dependency graph stays acyclic.
Where plugins are discovered
| Location | Scope |
|---|---|
.rpi/extensions |
Project (preferred) |
.pi/extensions |
Project, Pi compatibility fallback |
~/.rpi/agent/extensions |
Global |
--extensions-dir <path> |
Explicit, added by the CLI |
Installing and developing
Docs
- Crate docs: https://docs.rs/rpi-extensions
- Extension authoring guide
- Plugin ABI contract
- Ready-to-install extensions