Human-in-the-loop CLI and SDK stack for AI agents. Agents can ask questions, request approvals, push notifications, and stream output through channels so people can supervise critical steps against a single ailoop server.
Developer architecture, system design, compile, and test instructions are documented in CONTRIBUTING.md.
- Releases: GitHub Releases
- Homebrew (Linux):
brew install goailoop/cli/ailoop - Scoop (Windows):
scoop bucket add goailoop https://github.com/goailoop/scoop
scoop install ailoopVerify:
ailoop --versionailoop serveBy default one process listens on http://127.0.0.1:8080 (REST + WebSocket on the same port). Optional embedded monitor UI:
ailoop serve --webThen open http://127.0.0.1:8080 in a browser (see examples/web-ui/README.md).
Port 8081 is no longer used. Point health checks, firewalls, and clients at 8080 (or whatever you pass to --port).
export AILOOP_SERVER=http://127.0.0.1:8080Override per command with --server (or --url on forward).
ailoop ask --payload '{"decision_id":"deploy","summary":"Deploy now?","options":[{"id":"yes","label":"Yes"},{"id":"no","label":"No"}]}'
ailoop authorize "Deploy version 1.2.3?" --default no
ailoop say "Build finished" --priority normal
ailoop navigate "https://example.com/review"
ailoop forward --channel public --agent-type cursorUse ailoop <command> --help for flags and formats.
| Command | Role |
|---|---|
ask |
Structured decision; waits for human answer (use --payload; --decision-json is accepted as a deprecated alias) |
authorize |
Approval; timeouts and interruptions resolve to deny |
say |
Notification with priority |
navigate |
Confirm opening a URL |
image |
Show image (path or URL) to the human |
serve |
Run the ailoop server |
forward |
Stream agent output to the server (stdin, pipe, or --input) |
config |
Interactive config (--init) |
provider |
Provider status / Telegram test |
task |
Task storage subcommands |
As of v1.0.0, the embedded YAML/bash workflow engine (ailoop workflow) has been removed. Use external orchestrators (Newton, GitHub Actions, shell scripts) instead. See CHANGELOG.md for the full migration guide, including how to clean up ~/.ailoop/workflow_store.json.
npm install ailoop-jsimport { AiloopClient } from "ailoop-js";
const client = new AiloopClient({ baseURL: "http://127.0.0.1:8080" });
await client.say("public", "hello from js", "normal");Details: ailoop-js/README.md.
pip install ailoop-pyimport asyncio
from ailoop import AiloopClient
async def main() -> None:
client = AiloopClient("http://127.0.0.1:8080", channel="public")
await client.say("hello from python")
await client.ask("approve rollout?", timeout=30)
asyncio.run(main())Details: ailoop-py/README.md.
- Create a bot with @BotFather and copy the token.
- Open a chat with your bot and send
/start. export AILOOP_TELEGRAM_BOT_TOKEN=<token>ailoop config --initand enable Telegram with your numeric chat ID (see @userinfobot if needed).ailoop provider telegram test, then runailoop serveso the server can deliver and collect replies.
Isolation key for workloads. Allowed names are 1–64 characters; start with a letter or digit; use lowercase letters, digits, -, and _. Default channel name is public.
- Connection refused: start
ailoop serve(or adjust--server/forward --url). - No live server logs in an IDE terminal: stdout may be fully buffered without a real TTY; run
ailoop servein an external terminal if you need streaming logs.
- Design:
ARCHITECTURE.md - Kubernetes:
k8s/README.md - Docker:
README-Docker.md - Web UI example:
examples/web-ui/README.md
See CONTRIBUTING.md.
Dual-licensed under MIT OR Apache-2.0 (see crate and package metadata). Full Apache 2.0 text: docs/LICENSE.