The agent is a client. This is the server.
A Python core that owns the workspace. A TUI, a web client, a REPL — every client speaks the same newline-delimited protocol over one socket.
$ python app.py . listening on .engine/engine.sock $ python dummy_client.py . engine> fix the flaky auth test
[*] Ships with 32 tools and 6 subagent personas — not a ceiling. Every one is a single file. Add your own the same way.
[*] Now judged by TypeSafe (jev-latest) — a ~100ms calibrated classifier at the write funnel and the shell gate. The LLM generates, TypeSafe judges, code still decides.
How it fits together.
Clients only render. Everything else happens in one process, and every write goes through the funnel.
tap a box
engine session
FAQ
What is CodeLoom Engine?+−
A Python process that owns a workspace and speaks NDJSON over a Unix socket. It runs the model loop, the tools, and the write funnel. Clients — a TUI, a web app, anything — just render what it says.
Is it open source?+−
Source-available. Free to clone, read, and run for development and evaluation. Production use needs a commercial license — see the Business Source License in the repo.
What can it actually do today?+−
32 tools across ten families, a syntax-gated write funnel with full undo, an orchestrator that spawns six subagent personas into isolated git worktrees, tree-sitter and real language servers for four languages, a TypeSafe judge layer at existing choke points, SQLite sessions, and an OpenRouter loop. None of that is the ceiling — see the next question.
What is the TypeSafe judge?+−
A calibrated classifier (model jev-latest), not an agent — one state blob plus N typed questions in, a probability and a confidence per question back, ~100ms. The LLM generates, TypeSafe judges, code decides: judgments can only add restriction or information, never relax a deterministic guard, and the engine fully functions with it absent.
Is 32 tools and 6 agents all I get?+−
No — that's just what ships. There's no registry to edit and no client to rebuild: drop a file, decorate it, restart the session. Every surface — tools, commands, subagents, transport, model — extends the same way. See extend.
@tool(description="Count lines in a file.")
def count_lines(ctx, path: str) -> str:
return str(len(read(path).splitlines()))What's still limited?+−
Deep tooling — tree-sitter, LSP, the syntax gate — covers Python, Go, JavaScript, and TypeScript. Fourteen more languages are detected but not syntax-gated. Browser tools need Playwright installed.