Supported harnesses
| Harness | Typical usage | telos init auto-connect | Status |
|---|---|---|---|
| Claude Code | Anthropic-native coding agent workflow | ✅ | 🟢 First-class |
| OpenClaw | Open-source agent runtime with TELOS parser integration | ✅ | 🟢 First-class |
| Hermes | Multi-agent orchestration with independent sub-IR handling | ✅ | 🟢 First-class |
| Codex | OpenAI-style coding workflow via local gateway injection | ✅ | 🟢 Supported |
How each connects
- Claude Code
- Codex
- OpenClaw / Hermes
- Generic
telos init --harness claude-code writes ANTHROPIC_BASE_URL into the env field of
~/.claude/settings.json (atomic, backed up to .telos.bak, marked with __telos_installed).
Survives npm update, never touches PATH or the npm package.How a harness is parsed
Each harness plugin is a statelessparse(raw) → TelosIR. They differ in wire shape and identity:
| OpenClaw | Hermes | Telos | |
|---|---|---|---|
| Wire shape | Anthropic /v1/messages | Anthropic /v1/messages | OpenAI ChatCompletions |
| Tool classification | _classify_anthropic_tool (type prefix + server field + metadata) | reuses _classify_anthropic_tool | _classify_openai_tool (metadata only) |
<file> into ref-pool | no (whole oversized system item → slug system-doc-{i}) | yes (<file path=…>, dotted slug) | yes (dash slug) |
thinking block | not handled | FOLD kind=thinking | n/a |
tool_result source | embedded in the user message | embedded in the user message | standalone role=tool → wrapped into a user message |
| system extraction | the system field | the system field | leading consecutive role=system in messages[] |
source_tag prefix | openclaw/* | hermes/* | telos/* |
source (builtin / mcp / user) into TelosBlock.extra, feeding the
bridge’s _tool_sort_key to protect PIN prefix stability across multi-MCP startup races.
Harness detection (_detect_harness)
For Anthropic-shaped traffic, TELOS picks between hermes and openclaw. Detection runs in order and
returns on the first hit:
HTTP header fingerprint
User-Agent containing claude-cli, or x-app: cli → hermes. Only the proxy path sees request
headers. This reliably catches Claude Code’s tool-less Haiku auxiliary requests (title generation /
topic detection), which steps 1–3 below all miss.Envelope markers
Paired open/close regexes (
system-reminder / command-message / command-name) in the system
text and in every user text block → hermes. Paired matching avoids misclassifying a user who
is merely discussing tags in prose.Tool fingerprint
The intersection of tool names with
{Bash, Edit, Read, Write, Grep, Glob, TodoWrite, Task, WebFetch, WebSearch, NotebookEdit} ≥ 3 → hermes. Catches the first-turn request before the
reminder is injected.Detection is sticky. The proxy remembers the confident signal per client
(
ProxyApp._client_harness); the SDK transport writes it into BridgeSessionState.sticky_harness.
This avoids re-probing per call, which would flip the harness and destabilize the prefix.Support Matrix
The full harness, model, and inference-framework support tables.