โ ๏ธ Aegis is in Preview. APIs may change. See ROADMAP.md for the path to stable.
๐ฆ Package:
@onestepat4time/aegison npm. See ACP Migration Guide if upgrading fromaegis-bridge.
Run Claude Code agents from your terminal. Approve from your phone. See everything on one dashboard.
One command. Zero config. Claude Code responds in your terminal.
npx --package=@onestepat4time/aegis ag run "Summarize this folder and suggest improvements" --cwd ./my-project
That's it. Aegis:
When Claude needs permission to run a command or edit a file, you'll see a prompt in your terminal. Approve or deny right there.
$ npx --package=@onestepat4time/aegis ag run "Build a login page" --cwd ./my-project
Aegis v0.7.0
โ Claude Code found
โ Server started โ http://127.0.0.1:9100/dashboard
โ Session created: cc-build-a-login-page
[Claude] I'll build a login page with email and password fields...
[Claude] โโโ Creating src/components/LoginForm.tsx
[Claude] โโโ Creating src/pages/Login.tsx
๐ Permission required: Write to src/components/LoginForm.tsx
Allow? [Y/n] >
npm install -g @onestepat4time/aegis
ag run "Your prompt here" --cwd ./my-project
After your first session, you might want to:
ag setup telegram (one guided setup)claude mcp add --scope user aegis -- ag mcpag run "fix the tests" & ag run "update the README" (parallel agents)Aegis works out of the box. If you want to customize:
ag init # Interactive setup (token, model, Telegram, etc.)
ag init --defaults # Non-interactive โ use all defaults
ag init --force # Overwrite existing config
Configuration file: ~/.aegis/config.yaml. All settings have sensible defaults for local development.
See Getting Started for the full configuration reference.
ag init --list-templates
ag init --from-template code-reviewer
Built-in templates: code-reviewer, ci-runner, pr-reviewer, docs-writer.
Prerequisites: Node.js โฅ 20 and Claude Code CLI (authenticated). That's it.
CLI naming: the primary command is
ag. The legacy nameaegisis preserved as an alias.
npm install -g @onestepat4time/aegis
ag run "Your prompt here" --cwd C:\my-project
For troubleshooting, see Windows Setup.
Learn more: Getting Started ยท MCP Tools ยท BYO LLM ยท Advanced Features ยท Deployment Guide
Aegis bridges Claude Code sessions through the Agent Client Protocol (ACP) and exposes everything through a unified API. No SDK dependency, no browser automation โ just JSON-RPC over stdio.
claude-agent-acp as a child process โ communicates via JSON-RPC on stdiograph LR
OC["OpenClaw"] --> API["Aegis :9100"]
CI["CI/CD"] --> API
TG["Telegram"] --> API
WH["Webhooks"] --> API
MCP["MCP"] --> API
API --> CC["Claude Code
(ACP)"]
API --> SSE["SSE Events"]
API --> WS["WebSocket"]
API --> PG["SessionStore
(Postgres)"]
Connect any MCP-compatible agent to Claude Code โ the fastest way to build multi-agent workflows.
# Start standalone
ag mcp
# Add to Claude Code
claude mcp add --scope user aegis -- ag mcp
Or via .mcp.json:
{
"mcpServers": {
"aegis": {
"command": "ag",
"args": ["mcp"]
}
}
}
Without a global install, use "command": "npx" with ["--package=@onestepat4time/aegis", "ag", "mcp"] instead.
34 tools โ create_session, send_message, get_transcript, approve_permission, acp_send_prompt, acp_respond_approval, batch_create_sessions, create_pipeline, state_set, and more.
3 resources โ aegis://sessions, aegis://sessions/{id}/transcript, aegis://health
3 prompts โ implement_issue, review_pr, debug_session
Aegis works beyond Claude Code anywhere an MCP host can launch a local stdio server.
ag command-line tool (alias: aegis)All endpoints under /v1/.
| Method | Endpoint | Description |
|---|---|---|
GET |
/v1/health |
Server health & uptime |
POST |
/v1/sessions |
Create a session (reuse if workDir matches an idle session) |
GET |
/v1/sessions |
List sessions |
GET |
/v1/sessions/:id |
Session details |
GET |
/v1/sessions/:id/read |
Parsed transcript |
GET |
/v1/sessions/:id/events |
SSE event stream (requires sse_-prefixed token) |
POST |
/v1/sessions/:id/send |
Send a message |
POST |
/v1/sessions/:id/approve |
Approve permission |
POST |
/v1/sessions/:id/reject |
Reject permission |
POST |
/v1/sessions/:id/interrupt |
Ctrl+C |
POST |
/v1/sessions/:id/discover-commands |
Discover available slash commands |
DELETE |
/v1/sessions/:id |
Kill session |
POST |
/v1/sessions/batch |
Batch create |
POST |
/v1/handshake |
Capability negotiation |
POST |
/v1/pipelines |
Create pipeline |
POST |
/v1/memory |
Set memory entry |
GET |
/v1/memory |
List memory entries |
GET |
/v1/memory/:key |
Get memory entry |
DELETE |
/v1/memory/:key |
Delete memory entry |
POST |
/v1/templates |
Create session template |
GET |
/v1/templates |
List templates |
GET |
/v1/templates/:id |
Get template |
PUT |
/v1/templates/:id |
Update template |
DELETE |
/v1/templates/:id |
Delete template |
GET |
/v1/diagnostics |
Server diagnostics |
| Method | Endpoint | Description |
|---|---|---|
GET |
/v1/sessions/:id/health |
Health check with actionable hints |
GET |
/v1/sessions/:id/summary |
Condensed transcript summary |
GET |
/v1/sessions/:id/transcript/cursor |
Cursor-based transcript replay |
POST |
/v1/sessions/:id/screenshot |
Screenshot a URL (Playwright) |
POST |
/v1/sessions/:id/escape |
Send Escape |
GET |
/v1/pipelines |
List all pipelines |
GET |
/v1/pipelines/:id |
Get pipeline status |
| State | Meaning | Action |
|---|---|---|
working |
Actively generating | Wait or poll /read |
idle |
Waiting for input | Send via /send |
permission_prompt |
Awaiting approval | /approve or /reject |
asking |
Claude asked a question | Read /read, respond /send |
pending |
Initial state, connecting to ACP runtime | Wait a moment and re-poll |
error |
Session error | Check diagnostics, recreate |
rate_limit |
Rate limited by provider | Wait and retry |
killed |
Stopped via API (terminal) | Session retained for audit |
completed |
Finished normally (terminal) | Session retained for audit |
crashed |
Terminated unexpectedly (terminal) | Check diagnostics |
unknown |
Failed to determine state | Check diagnostics |
When you POST /v1/sessions (or POST /sessions) with a workDir that already has an idle session, Aegis reuses that session instead of creating a duplicate. The existing session's prompt is delivered and you get the same session object back.
Response differences:
| New Session | Reused Session | |
|---|---|---|
| Status | 201 Created |
200 OK |
reused |
false |
true |
promptDelivery |
{ delivered, attempts } |
{ delivered, attempts } |
# First call โ creates session (201)
curl -s -o /dev/null -w "%{http_code}" -X POST http://localhost:9100/v1/sessions \
-H "Content-Type: application/json" \
-d '{"workDir": "/home/user/project", "prompt": "Fix the tests"}'
# โ 201
# Same workDir while idle โ reuses session (200)
curl -s -o /dev/null -w "%{http_code}" -X POST http://localhost:9100/v1/sessions \
-H "Content-Type: application/json" \
-d '{"workDir": "/home/user/project", "prompt": "Now add error handling"}'
# โ 200, body includes "reused": true
Only idle sessions are reused. Working, stalled, or permission-prompt sessions are ignored โ a new one is created.
Before using advanced integration paths, clients can negotiate capabilities with Aegis via POST /v1/handshake. This prevents version-drift breakage.
curl -X POST http://localhost:9100/v1/handshake \
-H "Content-Type: application/json" \
-d '{"protocolVersion": "1", "clientCapabilities": ["session.create", "session.transcript.cursor"]}'
Response (200 OK when compatible):
{
"protocolVersion": "1",
"serverCapabilities": ["session.create", "session.resume", "session.approve", "session.transcript", "session.transcript.cursor", "session.events.sse", "session.screenshot", "hooks.pre_tool_use", "hooks.post_tool_use", "hooks.notification", "hooks.stop", "swarm", "metrics"],
"negotiatedCapabilities": ["session.create", "session.transcript.cursor"],
"warnings": [],
"compatible": true
}
| Field | Description |
|---|---|
protocolVersion |
Server's protocol version ("1" currently) |
serverCapabilities |
Full list of server-supported capabilities |
negotiatedCapabilities |
Intersection of client + server capabilities |
warnings |
Non-fatal issues (unknown caps, version skew) |
compatible |
true (200) or false (409 Conflict) |
Returns 409 if the client's protocolVersion is below the server minimum.
Stable pagination for long transcripts that doesn't skip or duplicate messages under concurrent appends. Use instead of offset-based /read when you need reliable back-paging.
# Get the newest 50 messages
curl http://localhost:9100/v1/sessions/abc123/transcript/cursor
# Get the next page (pass oldest_id from previous response)
curl "http://localhost:9100/v1/sessions/abc123/transcript/cursor?before_id=16&limit=50"
# Filter by role
curl "http://localhost:9100/v1/sessions/abc123/transcript/cursor?role=user"
Query params:
| Param | Default | Description |
|---|---|---|
before_id |
(none) | Cursor ID to page before. Omit for newest entries. |
limit |
50 |
Entries per page (1โ200). |
role |
(none) | Filter: user, assistant, or system. |
Response:
{
"messages": [...],
"has_more": true,
"oldest_id": 16,
"newest_id": 25
}
Cursor IDs are stable โ they won't shift when new messages are appended. Use oldest_id from one response as before_id in the next to page backwards without gaps or overlaps.
Bidirectional chat with topic-per-session threading. Send prompts from your phone, get completions pushed back.
export AEGIS_TG_TOKEN="your-bot-token"
export AEGIS_TG_GROUP="-100xxxxxxxxx"
Push events to any endpoint with exponential backoff retry.
export AEGIS_WEBHOOKS="https://your-app.com/api/aegis-events"
AI orchestrators delegate coding tasks through Aegis โ monitor progress, send refinements, handle errors, all without a human in the loop.
Works with OpenClaw, custom orchestrators, or any agent that can make HTTP calls.
Aegis ships with a built-in dashboard at http://localhost:9100/dashboard/ โ real-time session monitoring, activity streams, and health overview.
Dashboard features:
?, Ctrl+K, G+O/S/P/A/U)ag # visit http://localhost:9100/dashboard/
Aegis serves three deployment scenarios:
Single developer. Run Claude Code tasks in the background, monitor via dashboard, approve via Telegram.
ag
# Dashboard: http://localhost:9100/dashboard/
# Telegram approvals while AFK
Development teams. Policy-based permission control, batch operations, Slack notifications.
# Blueprint: PR Reviewer
curl -X POST http://localhost:9100/v1/pipelines \
-H "Authorization: Bearer $TOKEN" \
-d '{"name":"pr-reviewer","stages":[...],"permissionMode":"plan"}'
Banks, SaaS, regulated industries. Docker-isolated containers, no network egress, audit-first.
Golden rule: Intelligence stays outside Aegis. Aegis is a stupid-but-powerful middleware โ flows, security, audit. OpenClaw (or any external orchestrator) provides the brains.
Aegis is built with production security as a first-class concern โ not an afterthought.
AEGIS_AUTH_TOKEN protects all endpoints except /v1/healthsse_-prefixed tokens for event streams (regular API keys are rejected on SSE routes)X-Hook-Secret header with header-only enforcement mode127.0.0.1 unless explicitly configured0.0.0.0 in containers, 127.0.0.1 everywhere elseFor the full security questionnaire (pre-filled for vendor assessments), see Security Questionnaire. For deployment hardening, see Enterprise Deployment.
Priority: CLI --config > ./.aegis/config.yaml > ./aegis.config.json > ~/.aegis/config.yaml > ~/.aegis/config.json > defaults
| Variable | Default | Description |
|---|---|---|
AEGIS_BASE_URL |
http://127.0.0.1:9100 |
Preferred API origin for hooks, CLI clients, and dashboard links |
AEGIS_PORT |
9100 | Server port |
AEGIS_HOST |
127.0.0.1 | Server host |
AEGIS_AUTH_TOKEN |
โ | Bearer token for API auth |
AEGIS_DASHBOARD_ENABLED |
true |
Serve the bundled dashboard |
AEGIS_PERMISSION_MODE |
default | default, bypassPermissions, plan, acceptEdits, dontAsk, auto |
AEGIS_ACP_BIN |
โ | Override path to claude-agent-acp binary |
AEGIS_TG_TOKEN |
โ | Telegram bot token |
AEGIS_TG_GROUP |
โ | Telegram group chat ID |
AEGIS_WEBHOOKS |
โ | Webhook URLs (comma-separated) |
AEGIS_HOOK_SECRET_HEADER_ONLY |
false | Enforce X-Hook-Secret header and reject deprecated ?secret= transport |
See CONTRIBUTING.md for the full guide โ issue workflow, labels, commit conventions, and PR requirements.
git clone https://github.com/OneStepAt4time/aegis.git
cd aegis
npm install
npm run dev # build + start
npm test # vitest suite
npx tsc --noEmit # type-check
src/
โโโ cli.ts # CLI entry (`ag`; alias: `aegis`)
โโโ services/acp/ # ACP runtime (child process, JSON-RPC, events)
โโโ server.ts # Fastify HTTP server + routes
โโโ session.ts # Session lifecycle
โโโ monitor.ts # State monitoring + events
โโโ transcript.ts # JSONL parsing
โโโ mcp-server.ts # MCP server (stdio)
โโโ events.ts # SSE streaming
โโโ pipeline.ts # Batch + pipeline orchestration
โโโ channels/
โ โโโ manager.ts # Event fan-out
โ โโโ telegram.ts # Telegram channel
โ โโโ slack.ts # Slack incoming webhook channel
โ โโโ email.ts # SMTP email alert channel
โ โโโ webhook.ts # Webhook channel
โโโ __tests__/ # Vitest tests
Official @onestepat4time/aegis-client package โ generated from the OpenAPI 3.1 specification.
npm install @onestepat4time/aegis-client
import { AegisClient } from '@onestepat4time/aegis-client';
const client = new AegisClient('http://localhost:9100', process.env.AEGIS_AUTH_TOKEN);
// List sessions
const sessions = await client.listSessions();
// Create a session
const { id } = await client.createSession({ workDir: '/path/to/project' });
// Send a message
await client.sendMessage(id, 'Hello, Claude!');
// Approve a permission
await client.approvePermission(id);
What's included:
See packages/client/ for the full SDK source.
Official ag-client package generated from the OpenAPI contract โ 53 methods, Pydantic v2 models, stdlib HTTP.
pip install ag-client
from aegis_python_client import AegisClient
client = AegisClient(base_url="http://localhost:9100", auth_token="your-token")
# List sessions
sessions = client.list_sessions()
# Create a session
session = client.create_session(work_dir="/path/to/project", prompt="Hello!")
# Send a message
client.send_message(session.id, "Fix the tests")
# Approve a permission
client.approve_permission(session.id)
What's included:
http.client โ zero runtime dependenciesSee packages/python-client/ for the full SDK source.
aegis-bridgeMIT โ Emanuele Santonastaso