Architecture

Extension inventory

Roder's /extensions page is backed by the app-server extensions/list method. It reports the extensions installed in the active runtime registry, not every crate that happens to exist in the repository.

Runtime truth. Configuration decides the final list. API keys, web-search settings, subagent definitions, notification settings, and custom distributions can all add or suppress entries.

Discovery contract

Clients call extensions/list and receive manifests plus capability statuses:

{
  "method": "extensions/list",
  "params": null
}

Each manifest contains:

  • id, name, version, and api_version.
  • description for UI display.
  • provides, the typed services installed into the registry.
  • required_capabilities, the sensitive access requested by the extension.

Service types

Extensions can contribute these services:

  • InferenceEngine
  • ContextProvider
  • ContextPlanner
  • SessionStore
  • CheckpointStore
  • MemoryStore
  • EmbeddingProvider
  • ToolProvider
  • SubagentDispatcher
  • PolicyContributor
  • EventSink
  • TaskExecutor
  • NotificationSink
  • InteractiveRegionHandler
  • RemoteRunnerProvider
  • StatusSegment
  • PaletteSource

Built-in host extensions

Runtime idProvidesPurposeCapabilities
roder-ext-mock-provider InferenceEngine(mock) Deterministic local provider for tests and offline development. none
roder-ext-codex-oauth-provider InferenceEngine(codex) Codex provider backed by ChatGPT OAuth credentials. none declared
roder-ext-builtin-echo-tools ToolProvider(builtin-echo) Offline echo tool provider. none
roder-ext-builtin-coding-tools ToolProvider(builtin-coding-tools) Workspace file, search, patch, edit, workflow, media, shell, and command tools. fs.read.workspace, fs.write.workspace, process.spawn.shell
roder-ext-zerolang ToolProvider(zerolang) Zero compiler diagnostics, graph inspection, and checked ProgramGraph edit tools. fs.read.workspace, fs.write.workspace, process.spawn.shell
roder-ext-default-tui StatusSegment(...), PaletteSource(...) Built-in TUI status line and command-palette surfaces. none

The default TUI extension installs status segments for mode, model, session, branch, usage, mcp, and runner. It also installs palette sources for commands, sessions, agents, models, modes, workflow-imports, and media.

Inference providers

Runtime idProvidesWhen installedCapabilities
roder-ext-openai-responses-openai InferenceEngine(openai) When OpenAI credentials are configured. Runtime id is roder-ext-openai-responses-{provider_id}. network.api.openai.com, secret.read.OPENAI_API_KEY
roder-ext-openai-chat-completions InferenceEngine(openai-chat-completions) Implemented, but not installed by the default host path. network.api.openai.com, secret.read.OPENAI_API_KEY
roder-ext-anthropic InferenceEngine(anthropic) When Anthropic credentials are configured. network.api.anthropic.com, secret.read.ANTHROPIC_API_KEY
roder-ext-gemini InferenceEngine(gemini) When Gemini credentials are configured. network.api.googleai, secret.read.GEMINI_API_KEY
roder-ext-cursor InferenceEngine(cursor) Installed by default; live turns require a Cursor User API Key. network.agentn.global.api5.cursor.sh, network.api2.cursor.sh
roder-ext-openrouter-provider InferenceEngine(openrouter) Installed by default; live turns require an OpenRouter API key. Includes the built-in x-ai/grok-build-0.1 Grok Build route. network.openrouter.ai, optionally secret.read.OPENROUTER_API_KEY
roder-ext-xai InferenceEngine(supergrok); also InferenceEngine(xai) with an API key. Installed by default. Direct xAI API-key surface is conditional. network.api.x.ai; optionally secret.read.XAI_API_KEY
roder-ext-opencode-provider InferenceEngine(opencode), InferenceEngine(opencode-go) Installed by default. network.opencode.ai
roder-ext-poolside-provider InferenceEngine(poolside) Installed by default. network.inference.poolside.ai

Storage, memory, and embeddings

Runtime idProvidesPurposeCapabilities
roder-ext-jsonl-session SessionStore(jsonl) Append-only JSONL session persistence under Roder home. fs.readwrite.roder-home
roder-ext-memory MemoryStore(sqlite-memory), ContextProvider(memory-context), ToolProvider(memory-tools) SQLite-backed project/global memory, memory context, and memory tools. fs.readwrite.roder-home
roder-ext-openai-embeddings EmbeddingProvider(openai) OpenAI embedding provider for memories. network.openai, secrets.openai-api-key

Policy, tasks, subagents, and notifications

Runtime idProvidesWhen installedCapabilities
roder-ext-plan-mode PolicyContributor(plan-mode) Installed by default. none
roder-ext-task-process TaskExecutor(process) Installed by default. process.spawn.shell
roder-ext-task-subagent Currently none declared in the manifest. Implemented, but not installed by the default host path. process.spawn.roder
roder-ext-subagents SubagentDispatcher(in-process-subagents) and a task tool provider. Only when subagents are enabled and valid agent definitions are loaded. process.spawn.roder
roder-ext-notify-terminal NotificationSink(terminal-bell) When notifications and terminal notifications are enabled. terminal.write
roder-ext-notify-desktop NotificationSink(desktop) When notifications and desktop notifications are enabled. desktop.notification

The default notification kinds are NeedsInput, TurnIdle, TaskCompleted, and TaskFailed.

Web search

Web search has a canonical router plus optional provider-specific tools. The router exposes the unified local web_search tool when external web-search mode is configured.

Runtime idProvidesPurposeCapabilities
roder-ext-web-search ToolProvider(web-search) Canonical web_search router backed by Firecrawl, Perplexity, Tavily, or Parallel. network.web
roder-ext-firecrawl-search ToolProvider(firecrawl-search) Firecrawl-backed search and retrieval tools. network.api.firecrawl.dev, secret.read.FIRECRAWL_API_KEY
roder-ext-perplexity-search ToolProvider(perplexity-search) Perplexity raw Search API tools. network.api.perplexity.ai, secret.read.PERPLEXITY_API_KEY
roder-ext-tavily-search ToolProvider(tavily-search) Tavily-backed web search tools. network.api.tavily.com, secret.read.TAVILY_API_KEY
roder-ext-parallel-search ToolProvider(parallel-search) Parallel.ai objective-oriented search tools. network.web

Remote runners

Remote runner extensions install providers behind a common protocol for files, commands, ports, snapshots, mounts, artifacts, and provider state.

Runtime idProvidesPurposeCapabilities
roder-ext-runner-unix-localRemoteRunnerProvider(unix-local)Local Unix workspace runner.fs.readwrite.workspace, process.spawn.shell
roder-ext-runner-dockerRemoteRunnerProvider(docker)Local Docker container runner.fs.readwrite.workspace, process.spawn.docker
roder-ext-runner-blaxelRemoteRunnerProvider(blaxel)Hosted Blaxel runner.network.http, secret.read.BLAXEL_API_KEY
roder-ext-runner-cloudflareRemoteRunnerProvider(cloudflare)Hosted Cloudflare runner.network.http, secret.read.CLOUDFLARE_API_TOKEN
roder-ext-runner-daytonaRemoteRunnerProvider(daytona)Hosted Daytona runner.network.http, secret.read.DAYTONA_API_KEY
roder-ext-runner-e2bRemoteRunnerProvider(e2b)Hosted E2B runner.network.http, secret.read.E2B_API_KEY
roder-ext-runner-modalRemoteRunnerProvider(modal)Hosted Modal runner.network.http, secret.read.MODAL_TOKEN_SECRET
roder-ext-runner-runloopRemoteRunnerProvider(runloop)Hosted Runloop runner.network.http, secret.read.RUNLOOP_API_KEY
roder-ext-runner-vercelRemoteRunnerProvider(vercel)Hosted Vercel runner.network.http, secret.read.VERCEL_TOKEN

Catalog and support crates

roder-configure uses distribution catalog ids from crate metadata. Those ids are for profile generation and do not always match runtime manifest ids.

  • openai-responses can become roder-ext-openai-responses-openai.
  • xai becomes roder-ext-xai.
  • jsonl-session becomes roder-ext-jsonl-session.

Two workspace crates are worth calling out: roder-ext-runner-hosted-common is shared hosted-runner support, not a user-facing manifest; roder-ext-disk-context has catalog metadata and helper code, but no runtime RoderExtension implementation was present in the inspected workspace.

Why the list can differ

  • Missing API keys suppress OpenAI, Anthropic, Gemini, OpenRouter live requests, or direct xAI API-key surfaces.
  • Notification settings can suppress terminal or desktop notification sinks.
  • External web search appears only when enabled and configured.
  • Subagents appear only with valid loaded definitions.
  • Custom distributions can install a different extension set.