Skip to content

OneStepAt4time/aegis

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

666 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Aegis

npm CI license node

Orchestrate Claude Code sessions via REST API, MCP, CLI, webhooks, or Telegram.

Message Claude. Ship Code. β€” Aegis x Claude Code


Quick Start

# Install and start
npx aegis-bridge

# Create a session
curl -X POST http://localhost:9100/v1/sessions \
  -H "Content-Type: application/json" \
  -d '{"name": "feature-auth", "workDir": "/home/user/my-project", "prompt": "Build a login page with email/password fields."}'

# Send a follow-up
curl -X POST http://localhost:9100/v1/sessions/abc123/send \
  -H "Content-Type: application/json" \
  -d '{"text": "Add form validation: email must contain @, password min 8 chars."}'

Prerequisites: tmux and Claude Code CLI.

Need a full walkthrough from install to first session? See Getting Started.


How It Works

Aegis wraps Claude Code in tmux sessions and exposes everything through a unified API. No SDK dependency, no browser automation β€” just tmux + JSONL transcript parsing.

  1. Creates a tmux window β†’ launches Claude Code inside it
  2. Sends messages via tmux send-keys with delivery verification (up to 3 retries)
  3. Parses output from both terminal capture and JSONL transcripts
  4. Detects state changes: working, idle, permission prompts, stalls
  5. Fans out events to Telegram, webhooks, and SSE streams
graph LR
    OC["OpenClaw"] --> API["Aegis :9100"]
    CI["CI/CD"]     --> API
    TG["Telegram"]  --> API
    WH["Webhooks"]  --> API
    MCP["MCP"]      --> API
    API --> CC["Claude Code<br/>(tmux)"]
    API --> SSE["SSE Events"]
Loading

MCP Server

Connect any MCP-compatible agent to Claude Code β€” the fastest way to build multi-agent workflows.

# Start standalone
aegis-bridge mcp

# Add to Claude Code
claude mcp add --scope user aegis -- npx aegis-bridge mcp

Or via .mcp.json:

{
  "mcpServers": {
    "aegis": {
      "command": "npx",
      "args": ["aegis-bridge", "mcp"]
    }
  }
}

21 tools β€” create_session, send_message, get_transcript, approve_permission, batch_create_sessions, create_pipeline, and more.

4 resources β€” aegis://sessions, aegis://sessions/{id}/transcript, aegis://sessions/{id}/pane, aegis://health

3 prompts β€” implement_issue, review_pr, debug_session


REST API

All endpoints under /v1/.

Method Endpoint Description
GET /v1/health Server health & uptime
POST /v1/sessions Create (or reuse) a 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
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
DELETE /v1/sessions/:id Kill session
POST /v1/sessions/batch Batch create
POST /v1/handshake Capability negotiation
POST /v1/pipelines Create pipeline
Full API Reference
Method Endpoint Description
GET /v1/sessions/:id/pane Raw terminal capture
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
Session States
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
stalled No output for >5 min Nudge /send or DELETE
Session Reuse

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.

Capability Handshake

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.

Cursor-Based Transcript Replay

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.


Telegram

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"

Webhooks

Push events to any endpoint with exponential backoff retry.

export AEGIS_WEBHOOKS="https://your-app.com/api/aegis-events"

Multi-Agent Orchestration

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.


Configuration

Priority: CLI --config > ./aegis.config.json > ~/.aegis/config.json > defaults

Variable Default Description
AEGIS_PORT 9100 Server port
AEGIS_HOST 127.0.0.1 Server host
AEGIS_AUTH_TOKEN β€” Bearer token for API auth
AEGIS_TMUX_SESSION aegis tmux session name
AEGIS_TG_TOKEN β€” Telegram bot token
AEGIS_TG_GROUP β€” Telegram group chat ID
AEGIS_WEBHOOKS β€” Webhook URLs (comma-separated)

Contributing

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
Project Structure
src/
β”œβ”€β”€ cli.ts                # CLI entry (npx aegis-bridge)
β”œβ”€β”€ server.ts             # Fastify HTTP server + routes
β”œβ”€β”€ session.ts            # Session lifecycle
β”œβ”€β”€ tmux.ts               # tmux operations
β”œβ”€β”€ monitor.ts            # State monitoring + events
β”œβ”€β”€ terminal-parser.ts    # Terminal state detection
β”œβ”€β”€ 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
β”‚   └── webhook.ts        # Webhook channel
└── __tests__/            # Vitest tests

Support the Project

GitHub Sponsors Ko-fi


License

MIT β€” Emanuele Santonastaso

About

πŸ›‘οΈ Orchestrate Claude Code sessions via API. Create, brief, monitor, refine, ship. The bridge between your orchestrator and your coding agent.

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Sponsor this project

  •  

Packages

 
 
 

Contributors

Languages