Architecture

Process extensions

Roder can host extensions written in any language. A process extension is a child process that speaks newline-delimited JSON-RPC over stdio, echoes a manifest, and registers ordinary services such as inference engines, event sinks, subagent dispatchers, and task executors.

Configuration

[[process_extensions]]
id = "python-chat-completions"
enabled = true
manifest = "examples/non-rust-extensions/python-chat-completions/roder-extension.toml"
command = "python3"
args = ["-m", "roder_python_chat_provider"]
cwd = "examples/non-rust-extensions/python-chat-completions"
env = { PYTHONUNBUFFERED = "1", PYTHONPATH = "src" }
startup_timeout_ms = 10000

The environment is explicit and redacted. The host clears the child environment, forwards only configured variables plus PATH, and never prints secrets in manifests, diagnostics, or events.

Protocol shape

  • extension/initialize validates protocol version, services, capabilities, and manifest checksum.
  • inference/streamTurn lets a child stream canonical inference events.
  • subagents/dispatch and tasks/execute bridge remote agents and background executors.
  • events/handle forwards filtered canonical runtime events to child sinks.

Current examples

The source tree includes a Python chat-completions provider proof and a TypeScript Cursor SDK agent extension. App-server clients see these services through the same registry metadata as native Rust extensions.