@bloodf/oh-my-agent
v1.7.0
Published
OMP plugin for autonomous long-lived multi-agent collaboration
Maintainers
Readme
An oh-my-pi (OMP) plugin that runs autonomous, long-lived agents as a local daemon. Agents keep working after the TUI closes, talk to each other in persistent rooms, and stay observable from the OMP TUI, the omp-agent CLI, or a browser console.
Why it exists
OMP task agents live inside the interactive session. Close the TUI, they die. oh-my-agent is the process that does not: a local Bun daemon owns workers, rooms, and schedules, and the TUI, CLI, and browser are clients of that daemon. There is no cloud component and no multi-tenant user model. One operator, one daemon, on your machine.
Features
Quick start
Needs Bun ≥ 1.3.14 and OMP (@oh-my-pi/pi-coding-agent ≥ 18.1.0).
omp install @bloodf/oh-my-agent
ompRun /setup inside omp for a ✓/✗ checklist of what a working install needs, with the fix on every ✗ line; ask the OMP assistant for help and it loads the shipped oh-my-agent-setup skill. The TUI starts the daemon on session start. Widget shows running/parked counts in your OMP theme. /manage opens the manager; every surface is a slash command, and the plugin binds no keys. /cli status runs the shell verb with no PATH. /console opens a menu: Open web UI, Copy URL, or Show URL. /cli console prints the loopback URL explicitly.
Choose Open web UI to open the browser console. Show URL deliberately reveals its operator token; Copy URL copies it without printing it.
Shell CLI is optional. Full path, no export:
~/.omp/plugins/node_modules/.bin/omp-agent statusThis install path is the one CI runs against a packed tarball in tests/consumer-install.test.ts.
A default crew ships with the package and starts on the daemon's first boot: mate, the first mate you talk to, plus staff-pm, staff-backend, staff-frontend, and staff-qa, each in its own room and a shared #team. They run on whatever model you have picked as OMP's default (/model), so nothing needs configuring first. Talk to the mate:
/rooms post #bridge @mate add dark mode and fix the flaky login testIt picks the shape (ship a change, or scout and report), briefs the owner, waits on the rooms, checks the evidence, and reports in #bridge. Ten more roles ship as presets that are never seeded: researcher, reviewer, security-reviewer, tech-writer, sre, debugger, test-engineer, designer, release-manager, data-analyst. /preset copies one under your own name; so do omp-agent agent create <name> --preset <preset> and the console's create dialog. The mate hires from the same library when a request needs a role the staff do not cover.
Pick a different model per peer with /edit <name> → Model, which lists every model your credentials can reach, or with the console's agent form. omp-agent models prints the same list. Delete a default peer's file from ~/.omp/agent/oh-my-agent/agents/ and it stays gone; edit it and your edit is kept.
To write your own, follow the hosted getting-started guide, then:
/cli agent create researcher researcher.md
/spawn researcherDefinitions use markdown with YAML frontmatter, the same shape as OMP task agents. model is optional: a fully qualified provider/id when set, the OMP default otherwise.
How it works
The TUI and CLI speak JSON-RPC over a per-profile unix socket. The browser speaks token-gated loopback HTTP and WebSocket. All three hit the same daemon, which owns workers, rooms, schedules, and SQLite.
The daemon binds loopback only, in every mode. Going beyond loopback is a proxy in front plus an explicit remote mode. Read remote exposure before exposing anything.
Website and demo
website/ holds the project site and a console demo: the real console from web/, running against a daemon mocked inside the browser, so it needs no install and no daemon. Run it locally:
bun install --cwd web --frozen-lockfile
bun install --cwd website --frozen-lockfile
bun run --cwd website dev # http://localhost:3300, demo at /consoleDetails, including the mock and its smoke check, are in website/README.md.
Documentation
| Audience | Start here | |---|---| | Newcomers | Getting started | | Operators | CLI, web console | | Developers | Developer guide, CONTRIBUTING.md | | Architecture | ARCHITECTURE.md | | Decisions | ADRs | | Security | SECURITY.md, remote exposure |
Community files: SUPPORT.md, GOVERNANCE.md, CODE_OF_CONDUCT.md. Brand assets: assets.
Newcomers
Who this is for. People already using OMP who want agents that outlive a TUI session. Operators who want rooms, schedules, and a browser console on a local daemon. Contributors who will treat claims as things that need tests.
What you need. Bun ≥ 1.3.14, OMP with @oh-my-pi/pi-coding-agent ≥ 18.1.0, and a provider account the daemon can meter. This is a single-operator local plugin. It is not a hosted service and it is not multi-tenant.
First win. Install the plugin, open omp, confirm the widget, paste the researcher definition from the getting-started guide, create it, spawn it, and post in #research. If that loop works, the rest of the operator surface is the same daemon.
Want to help develop it
- Setup. Clone,
bun install --frozen-lockfile,bun install --cwd web --frozen-lockfile,bun run typecheck. - Tests.
bun testfor the full suite.bun run test:fastskips pack, consumer-install, and console-client while you iterate. - Read. ARCHITECTURE.md, then CONTRIBUTING.md.
- Pick work. Nothing is Ready. Remaining work is Blocked: T-1202, T-1205, T-1403, T-1503. File a bug, or add a task in
scripts/gen-delivery-docs.py.
Two rules up front:
docs/delivery/is generated. Author inscripts/gen-delivery-docs.pyand runbun run docs. Do not hand-edit the tree.- Every new test needs a non-vacuity proof. Revert the production line it covers, watch that test fail, restore it. A test that cannot fail is not evidence.
Status
Runtime, TUI, CLI, and browser console ship in the npm package @bloodf/oh-my-agent. See CHANGELOG.md for the current release and its fixes.
Known limitations:
- Public ACME issuance in remote exposure is UNVERIFIED. All three proxy recipes were run end to end, but the Caddy and SSH-tunnel runs used an internal CA, so public ACME issuance and renewal remain unproven.
Security
The daemon binds 127.0.0.1 only. Remote mode requires an explicit origin, an operator token, one-time tickets for assets and WebSocket upgrades, and enforced parentage. One operator per daemon: the operator token is not a per-user credential.
Do not open a public issue for a vulnerability. Use GitHub's private reporting: Report a vulnerability. Details in SECURITY.md.
