C4 Level 3 -- Book-E Agent Components
Zooms into the Book-E container showing how a Discord message becomes an accounting action.

Components
Discord Gateway
| Component |
File |
Responsibility |
| Discord Client |
discord.js |
WebSocket connection to Discord. Listens on #invoices. Creates threads per document. Handles DMs. |
| Message Router |
index.js |
Filters messages by channel. Allows configured bot IDs. Routes to agent. |
Agent
| Component |
File |
Responsibility |
| Agent Loop |
agent.js |
Builds LLM prompt with personality + context. Sends to Claude with tools. Executes up to 5 tool calls per message. Extracts final text response. |
| Tool Dispatcher |
agent.js |
Maps tool names (from LLM response) back to HTTP endpoints. Calls Accounting API. Returns results to LLM. |
| System Prompt Builder |
agent.js |
Injects character personality, background lore, style rules, and known user facts into the system prompt. |
Configuration
| Component |
File |
Responsibility |
| Character Loader |
character.js |
Loads /config/character.json (mounted as ConfigMap). Validates required fields. Applies defaults. |
Memory
| Component |
File |
Responsibility |
| Memory Store |
memory.js |
Postgres-backed storage for conversations (per thread), facts (per user), and patterns (per merchant). Falls back to in-memory if Postgres unavailable. |
Message Flow
1. User posts in #invoices
2. Discord Client receives messageCreate event
3. Message Router checks channel + bot filter → passes to Agent
4. Agent Loop loads conversation history + user facts from Memory
5. System Prompt Builder assembles prompt (personality + lore + facts)
6. Agent sends to Claude Haiku with tool schemas
7. Claude decides: call get_folio_balance tool
8. Tool Dispatcher maps to GET http://ai-accountant-api/folio/balance
9. API returns account data
10. Claude formats response in Norwegian
11. Agent saves messages to Memory
12. Discord Client posts reply in thread