@dougbots/avenor-pi

Pi extension that registers avenor agent runs as tools in your Pi session. When you need a sub-agent to handle a well-defined task — write code, run tests, search a codebase — avenor operates in the background while you keep your session focused.

Packages

Package details

extension

Install @dougbots/avenor-pi from npm and Pi will load the resources declared by the package manifest.

$ pi install npm:@dougbots/avenor-pi
Package
@dougbots/avenor-pi
Version
0.1.0
Published
Jun 20, 2026
Downloads
not available
Author
sdougbrown
License
unknown
Types
extension
Size
26.1 KB
Dependencies
1 dependency · 2 peers
Pi manifest JSON
{
  "extensions": [
    "./dist/index.js"
  ]
}

Security note

Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.

README

@dougbots/avenor-pi

Pi extension that registers avenor agent runs as tools in your Pi session. When you need a sub-agent to handle a well-defined task — write code, run tests, search a codebase — avenor operates in the background while you keep your session focused.

Prerequisites

You need the avenor binary available. It is installed to ~/.botfiles/bin/avenor by default.

# Check it's on PATH
which avenor

# Or set explicitly
export AVENOR_BIN=~/.botfiles/bin/avenor

Installation

From npm (once published)

pi install npm:@dougbots/avenor-pi

This writes to your global settings (~/.pi/agent/settings.json). Use -l for project-local installation (.pi/settings.json).

From a git repo

pi install git:github.com/sdougbrown/avenor@v0.1.0

Pi will clone the repo and load the extension from packages/pi.

Local development

Quick test — run pi with the extension directly:

cd packages/pi
pi -e ./src/index.ts

Symlink for auto-discovery — link into your global extensions directory:

mkdir -p ~/.pi/agent/extensions/avenor
ln -sf $(pwd)/packages/pi/src/index.ts ~/.pi/agent/extensions/avenor/index.ts

Pi auto-discovers ~/.pi/agent/extensions/*/index.ts. Changes are hot-reloadable with /reload.

Local path in settings — add the built dist directly:

# Build first
cd packages/pi && bun run build

# Add to settings
pi install /path/to/avenor/packages/pi

Manual settings.json

If you prefer to edit settings directly:

// ~/.pi/agent/settings.json
{
  "packages": ["npm:@dougbots/avenor-pi"]
}

Or for a local path:

{
  "packages": ["/path/to/avenor/packages/pi"]
}

Package Structure

packages/pi/
├── package.json
├── tsdown.config.ts
├── src/
│   ├── index.ts          # main extension (tools, commands, hooks, rendering)
│   ├── types.ts          # shared types, status emoji mapping
│   └── watch.ts          # EventFeedOverlay TUI component
└── dist/
    └── index.js          # built output (loaded by pi)

The pi key in package.json declares the extension entry point:

{
  "pi": {
    "extensions": ["./dist/index.js"]
  }
}

Features

Tools

Six tools for the LLM to dispatch and manage sub-agents:

Tool Description
avenor_spawn Dispatch an agent run (blocking or fire-and-forget)
avenor_status Get status of a run or all runs
avenor_answer_permission Answer a pending permission request
avenor_follow_up Resume a completed run with a follow-up message
avenor_events Read events from a run
avenor_shutdown Shut down the avenor supervisor

Pi-specific features

Beyond the tools, the extension integrates with Pi's TUI and event system:

  • Status widget — persistent widget showing all active runs with status, phase, and permission state
  • Footer status — active runs shown in the Pi footer bar
  • Live progress — blocking avenor_spawn calls stream progress updates via onUpdate
  • Context enrichment — active sub-agents are automatically surfaced in the system prompt via before_agent_start
  • Custom rendering — tool calls and results are rendered with status emojis and color-coded output
  • Commands — interactive commands for run management:
    • /avenor-status — show status of all runs
    • /avenor-watch <run_id> — open a live event feed overlay
    • /avenor-cancel <run_id> — cancel a running sub-agent

Typical workflows

Blocking (default):

1. avenor_spawn            →  tool call shows live progress, blocks until done
2. tool call returns       →  structured result with status + session_id
3. avenor_events           →  inspect detailed output
4. avenor_follow_up        →  optionally iterate
5. avenor_shutdown         →  clean up when finished

Parallel / fire-and-forget (wait=false):

1. avenor_spawn × N        →  each returns run_id immediately
2. (status widget updates) →  persistent widget shows all active runs
3. /avenor-watch <id>      →  open live event feed for a specific run
4. avenor_events           →  inspect output when done

Dependencies

  • Peer: @earendil-works/pi-coding-agent (Pi runtime, provided by pi)
  • Peer: @earendil-works/pi-tui (TUI components, provided by pi)
  • Dependency: @dougbots/avenor-core (supervisor, client, tool primitives)
  • Binary: avenor must be available on PATH or at AVENOR_BIN