drawgent: Verbind je coding agent met een live Excalidraw-canvas

Functionaliteiten

  • setup <agent>: Controleert de geïnstalleerde CLI en login, bereidt de ACP-bridge voor (adapters die de binary van de gebruiker aansturen), zoekt of installeert een headless Chrome, en schrijft de configuratie naar ~/.config/drawgent/config.toml.
  • up: Start een nieuwe agent-sessie in de huidige workspace. Met up --attach [id] kunnen draaiende sessies worden weergegeven (Claude fork via ACP, live opencode via HTTP API, live Codex via codex queue).
  • Interface: Bevat een chatpanel en een AGENT:-functie voor canvas-notities, inclusief MCP canvas-tools met vision (via een headless Chrome renderer) en een excalidraw.com-room client (AES-GCM, socket.io, Firestore).
  • Ontwikkeling: Voorzien van een Makefile met statische musl-builds, een Nix dev shell (fish) en een optioneel server-only Docker-image.

Snelstart

Voorwaarde: Eén van de volgende tools moet zijn geïnstalleerd en ingelogd: claude, codex of opencode. Voor de Claude- en Codex-bridges is daarnaast Node.js $\ge$ 18 (npm) vereist.

drawgent setup claude        # Eenmalig per agent: claude | codex | opencode
cd ~/my-repo
drawgent up                  # Nieuwe agent-sessie in deze repo + canvas in de browser
drawgent up --attach         # Kies een van de draaiende sessies en verbind het canvas ermee

Gedetailleerde commando's

drawgent setup <agent>

Dit commando voert een eenmalige controle uit, geeft exacte oplossingen bij ontbrekende componenten en schrijft de configuratie naar ~/.config/drawgent/config.toml. De volgende zaken worden gecontroleerd:

  1. Agent CLI: Controleert of claude, codex of opencode op de PATH staat.
  2. Login: Controleert de status via claude auth status, codex login status of opencode auth list.
  3. ACP-bridge:
  • opencode spreekt van zichzelf ACP (opencode acp).
  • Claude Code en Codex maken gebruik van de officiële ACP-adapters. Deze worden eenmalig geïnstalleerd in ~/.cache/drawgent/adapters (~60 MB), zonder de gebundelde agent-binaries, en worden gekoppeld aan de CLI van de gebruiker (CLAUDECODEEXECUTABLE, CODEX_PATH).
  • De setup verifieert vervolgens de ACP-handshake.
  1. Canvas-tools: Alleen voor Codex is een aanpassing nodig: codex mcp add drawgent -- drawgent mcp. Claude en opencode ontvangen de tools tijdens het koppelen (attach).
  2. Headless Chrome: De renderer maakt gebruik van de bestaande Chrome/Chromium installatie. Indien niet aanwezig, stelt de setup het volgende voor:
  • Het downloaden van de Chrome Headless Shell (Chrome for Testing, ~120 MB, geen sudo nodig) naar ~/.cache/drawgent/chrome, inclusief melding van ontbrekende systeembibliotheken.
  • Het installeren van Chromium via een package manager (apt, snap, dnf, pacman, zypper, apk, brew, of nix zonder sudo).
  • Niet-interactief: Gebruik --chrome download | system | /path/to/chrome.

drawgent up weigert te starten totdat de setup voor die agent is geslaagd of als een geconfigureerd onderdeel is verdwenen.

drawgent up

Dit commando wordt uitgevoerd in de huidige directory (de workspace):

  • Start de editor en API op 127.0.0.1:7300 (of de volgende vrije poort).
  • Start een nieuwe sessie van de agent via ACP, werkend in de workspace.
  • Opent de browser. Op een headless machine wordt in plaats daarvan het ssh -L commando geprint.
  • De scène wordt bewaard in .drawgent/scene.json, wat automatisch wordt genegeerd door git.

drawgent up --attach [id]

Verbindt het canvas met een reeds draaiende sessie. Zonder ID wordt een lijst met gevonden sessies getoond (met de huidige directory eerst), waarna een keuze kan worden gemaakt:

AgentDiscovery-methodeVerbindingstype
Claude Codeclaude agents --jsonfork: een nieuwe sessie met het volledige gesprek, aangestuurd door drawgent via ACP. De terminal-sessie blijft ongewijzigd.
opencodeLokale servers: opencode --port 4096 (of opencode serve)live: berichten gaan naar de actieve sessie (zichtbaar in de TUI); drawgent voegt MCP-tools toe aan de server; interacties in de TUI worden gespiegeld in het chatpanel.
CodexSessies in ~/.codex/sessionslive: codex queue --thread <id>; antwoorden worden gespiegeld vanuit het rollout-bestand. De sessie vereist de drawgent MCP (geregistreerd via setup).

Gebruik van het canvas

  • Chatpanel (rechterzijde): Verstuur verzoeken, volg antwoorden en tool-calls in real-time, keur machtigingsverzoeken goed of druk op 'Stop' om een beurt te annuleren.
  • Op het canvas: Schrijf een tekst die begint met AGENT: naast of in een vorm, of trek een pijl van de notitie naar een vorm. Na ongeveer 2,5 seconde stopten met typen wordt het verzoek verzonden, inclusief positie, het doel van de pijl en de nabijgelegen elementen. De agent verwerkt dit en verandert de notitie in een groene DONE: … notitie. Verander dit terug naar AGENT: om het opnieuw te verzenden.

Prompts worden in een wachtrij geplaatst en één voor één uitgevoerd. Een notitie in de wachtrij die al is behandeld, wordt overgeslagen.

excalidraw.com kamers

Gebruik het commando: drawgent up --room 'https://excalidraw.com/#room=<id>,<key>'

drawgent voegt zich bij de kamer als collaborator (🤖 Agent, met een cursor die de bewerkingen volgt). Mensen kunnen op excalidraw.com blijven: hun AGENT:-notities bereiken de agent, en de bewerkingen van de agent verschijnen direct in de kamer.

Het verkeer is end-to-end versleuteld met de kamer-sleutel. Lege kamers worden geladen vanuit en opgeslagen in de Firestore-opslag van Excalidraw. De lokale editor spiegelt de kamer en behoudt het chatpanel.

Overige commando's

  • drawgent mcp: Een stdio MCP-server met de canvas-tools. Agents starten deze server; de server vindt zelf de draaiende drawgent up instantie.
  • drawgent serve: Een low-level server met expliciete agents (--agent claude,codex,opencode zoals geconfigureerd, of name=command voor elke ACP-agent). Geschikt voor scripts en containers.
  • Opties voor up / serve: --port, --room, --token (API bearer + ?token= in de URL), --permissions canvas|ask|all (standaard is canvas: tekentools worden automatisch goedgekeurd, andere zaken via het chatpanel), --data, --settle-ms.

Optioneel: Docker

docker compose up --build start een canvas-server (drawgent + Chromium, zonder agents). Dit kan worden gebruikt om een gedeeld canvas of een room-bridge op een server te hosten. Agents zijn nooit gebundeld; deze draaien altijd via de eigen setup van de gebruiker.

Bouwen vanuit broncode

npm ci && npm run build      # Editor + renderer pagina's -> dist/ (ingebed in de binary)
cargo install --path .       # Of: cargo build --release

Agent tools (MCP)

De volgende tools zijn beschikbaar: getscene, getscreenshot (vision; zoom met elementids), addelements (Excalidraw skeletons; pijlen binden via id en worden edge-to-edge gerouteerd), addmermaid (auto-layout), updateelements (labels volgen vormen, gebonden pijlen worden opnieuw gerouteerd), deleteelements, clearcanvas, listinstructions, resolveinstruction, set_status.

API

  • GET /api/health
  • GET /api/scene
  • GET /api/screenshot?ids=&padding=&max=
  • POST|PATCH|DELETE /api/elements
  • POST /api/mermaid
  • POST /api/clear
  • GET /api/instructions
  • POST /api/instructions/{id}/resolve
  • POST /api/status
  • POST /api/chat {agent?, text}
  • WS /ws (browser synchronisatie + chat events)

Testen

  • cargo test: Test fractionele indexen, room crypto/framing.
  • node scripts/smoke.mjs [url]: Test chat-beurten en AGENT:-notities tegen een draaiende drawgent.
  • node scripts/e2e-browser.mjs [url]: Test via een echte browser: chatpanel + notities getypt op het canvas.
  • node scripts/room-e2e.mjs: Test interactie tussen een verse excalidraw.com kamer en drawgent in beide richtingen.

Projectstructuur

src/ (Rust)

  • main.rs: CLI.
  • setup.rs, config.rs, chrome.rs: Setup, configuratie en installatie van de renderer.
  • attach.rs: Sessie-detectie en selectie.
  • agents.rs + acp.rs: ACP-driver (nieuwe / fork sessies).
  • live.rs: Live opencode / Codex drivers.
  • hub.rs: Routing, notities, chat-log.
  • scene.rs: Opslag en bewerkingsoperaties.
  • renderer.rs: Chrome via CDP.
  • mcp.rs: MCP-server.
  • room.rs: excalidraw.com client.
  • fractional.rs, geometry.rs, el.rs: Helpers.

web/

  • Editor (main.jsx, chat.jsx) en renderer-pagina (render.jsx).

Beperkingen

  • De renderer vereist Chrome (een native renderer is in planning).
  • De Claude "attach" functie is een fork, omdat Claude Code geen publieke manier biedt om in een draaiende terminal-sessie te injecteren.
  • De Codex live-attach is geïmplementeerd, maar nog niet getest tegen een ingelogde Codex-gebruiker.
  • Er is één scène per workspace. Afbeeldingen en bestanden worden niet gesynchroniseerd.