Eyejoker 7928f2968c fix: always edit progress message for intermediate text
Previously, intermediate text was sent as separate messages when
subagents were active, causing message floods. Now always edit
the progress message regardless of subagent state.
2026-03-25 07:37:49 +09:00
2026-02-03 17:14:17 +02:00
2026-03-19 03:31:41 +09:00
2026-03-25 03:57:52 +09:00

EJClaw

Claude Agent SDK Codex SDK Node Discord

Dual-agent AI assistant (Claude Code + Codex) over Discord.

Originally derived from qwibitai/nanoclaw, now maintained as EJClaw for personal production use.

Overview

Two AI agents running as parallel systemd services on a single host:

  • Claude Code (@claude) — Anthropic Agent SDK, adaptive thinking, Opus/Sonnet
  • Codex (@codex) — OpenAI Codex app-server (JSON-RPC), GPT-5.4, xhigh reasoning

Both share the same codebase (dist/index.js), differentiated by environment variables. No containers — direct host processes for zero overhead.

Features

  • Dual-agent architecture — Claude Code + Codex as parallel services, shared SQLite (WAL mode)
  • Browser automationgstack browse skill, headless Chromium daemon, ~100ms/command
  • Voice transcription — Groq Whisper (primary) / OpenAI Whisper (fallback), shared file cache with dedup
  • Bidirectional images — receive Discord attachments as multimodal input, send screenshots back
  • MCP integration — Memento (persistent cross-session memory)
  • Skill sync — single source of truth, auto-synced to all agent sessions
  • Priority queue — per-group serialization, global concurrency limit
  • Session persistence — resume conversations across restarts
  • Scheduled tasks — cron/interval/once via MCP tool
  • Mid-turn steering — inject follow-up messages while agent is working (both agents)

Architecture

Discord ──► SQLite (WAL) ──► GroupQueue ──┬──► Claude Code (Agent SDK, MessageStream)
                                          └──► Codex (App-Server, JSON-RPC)
                                          │
                                     IPC polling ◄── follow-up messages (mid-turn steering)
                                          │
                                     Router ──► Discord (text, images, files)

Each agent has access to:
  ├── MCP tools (send_message, schedule_task, watch_ci, ...)
  ├── Bash skills (agent-browser → gstack browse, persistent Chromium)
  └── Per-group memory (CLAUDE.md / AGENTS.md)

Setup

Prerequisites

  • Linux (Ubuntu 22.04+) or macOS
  • Node.js 24+ (fnm recommended)
  • Claude Code CLI
  • Codex CLI (npm install -g @openai/codex)
  • Bun 1.0+ (for browser automation)
  • Discord bot token

Install

git clone https://github.com/phj1081/EJClaw.git
cd EJClaw
npm install
npm run build:runners
npm run build

Environment

# .env
DISCORD_BOT_TOKEN=           # Discord bot token
ASSISTANT_NAME=claude        # Bot trigger name (@claude)
CLAUDE_CODE_OAUTH_TOKEN=     # Claude Code OAuth token
OPENAI_API_KEY=              # For Codex
GROQ_API_KEY=                # Voice transcription (Groq Whisper)

Systemd Services (Linux)

systemctl --user enable ejclaw ejclaw-codex
systemctl --user start ejclaw ejclaw-codex

# Logs
journalctl --user -u ejclaw -f
journalctl --user -u ejclaw-codex -f

Development

npm run build                # Build main project
npm run build:runners        # Install + build both runners
npm run dev                  # Dev mode with hot reload
npm test                     # Run tests

License

MIT — Originally derived from qwibitai/nanoclaw

Description
EJClaw — GitHub main base + local owner modifications (claude-bot)
Readme MIT 16 MiB
Languages
TypeScript 96.8%
CSS 2.5%
Kotlin 0.4%
JavaScript 0.1%
Shell 0.1%