Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -728,6 +728,7 @@ jobs:
tests/test_grok_bot_runtime_wiring.py \
tests/test_lovable_runtime_wiring.py \
tests/test_muse_code_runtime_wiring.py \
tests/test_openexecutive_runtime_wiring.py \
tests/test_delegated_usage.py \
tests/test_local_query_api.py \
tests/test_rollup_session_runtime_backfill.py \
Expand Down
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
> **Read [`FLYWHEEL.md`](./FLYWHEEL.md) first.** It is how you ship a change end to end in this repo (code → PR → green CI → `[RELEASE]` → PyPI → cloud → verified live) and the non-negotiable "done" bar. Then [`CLAUDE.md`](./CLAUDE.md) for the architecture deep-dive. This file is the short "what to do"; those two carry the detail.

## Quick context
ClawMetry is an open-source, real-time observability and governance layer for **31 AI agent runtimes** (OpenClaw, NemoClaw and Goose free in OSS; Claude Code, Codex, Cursor and 25 more with the Pro plugin). The catalogue is `entitlements.FREE_RUNTIMES | PAID_RUNTIMES`, exported to [`SUPPORTED_RUNTIMES.txt`](./SUPPORTED_RUNTIMES.txt) — the single file every marketing surface and sibling repo reads. Never hardcode the list or the count; regenerate with `python3 scripts/sync_runtime_count.py`. `pip install clawmetry && clawmetry` — zero config, observation by default. It's a Flask app with an embedded, no-build vanilla-JS frontend; a sync daemon ingests filesystem/gateway/OTLP data into a local **DuckDB** store, and the app reads from DuckDB to serve the UI.
ClawMetry is an open-source, real-time observability and governance layer for **32 AI agent runtimes** (OpenClaw, NemoClaw and Goose free in OSS; Claude Code, Codex, Cursor and 25 more with the Pro plugin). The catalogue is `entitlements.FREE_RUNTIMES | PAID_RUNTIMES`, exported to [`SUPPORTED_RUNTIMES.txt`](./SUPPORTED_RUNTIMES.txt) — the single file every marketing surface and sibling repo reads. Never hardcode the list or the count; regenerate with `python3 scripts/sync_runtime_count.py`. `pip install clawmetry && clawmetry` — zero config, observation by default. It's a Flask app with an embedded, no-build vanilla-JS frontend; a sync daemon ingests filesystem/gateway/OTLP data into a local **DuckDB** store, and the app reads from DuckDB to serve the UI.

## Where new code goes (open-core split)

Expand Down
4 changes: 2 additions & 2 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
┌──────────────────────────────────────────────────────────────────────┐
│ Your Machine │
│ │
31 agent runtimes ClawMetry │
32 agent runtimes ClawMetry │
│ ┌──────────────────┐ ┌───────────────────────────────────┐ │
│ │ OpenClaw │ files │ Sync daemon (clawmetry sync) │ │
│ │ Claude Code │───────►│ • reads sessions, logs, hooks │ │
Expand Down Expand Up @@ -96,7 +96,7 @@ C4Context
title C1: ClawMetry (open source) system context

Person(dev, "Developer / Operator", "Runs AI agents; wants to see what they do, what they cost, and to stop one that has gone wrong")
System(clawmetry, "ClawMetry", "Local-first observability and governance for 31 agent runtimes. Reads what your agents already write; acts on them only through the five gated surfaces above.")
System(clawmetry, "ClawMetry", "Local-first observability and governance for 32 agent runtimes. Reads what your agents already write; acts on them only through the five gated surfaces above.")

System_Ext(runtimes, "AI Agent Runtimes", "OpenClaw, NVIDIA NemoClaw and Goose are free in OSS; the other 27 (Claude Code, Codex, Cursor, Copilot, Gemini CLI, Hermes, Aider, opencode, ...) come with the optional Pro plugin")
System_Ext(gateway, "OpenClaw Gateway", "WebSocket control plane (JSON-RPC, :18789) for live data + cron RPC")
Expand Down
2 changes: 1 addition & 1 deletion AUDIT.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
## Audit method (the only valid "pass")
1. Walk the trial path: hosted dashboard as a trial user, switch runtimes, click the tab → zero blank/wrong/error states + clean console.
2. For data/observability features: send a **real** message/turn and watch it travel channel → daemon → DuckDB → handler → rendered tab → (cloud) snapshot.
3. Verify across **all 31 runtimes**, not just OpenClaw (`/api/runtimes`).
3. Verify across **all 32 runtimes**, not just OpenClaw (`/api/runtimes`).
4. For device-facing slices: the 4-repo chain (pro adapter → OSS `_build_device_summary` → cloud wheel/relay → firmware render).

---
Expand Down
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
## Unreleased

### Added: OpenExecutive as the 32nd runtime (2026-09-12)
- **Why:** OpenExecutive (SenteLabsAI/OpenExecutive, Apache-2.0) is an AI executive team that answers in Slack and email, consults specialist agents, and runs a scheduler that sends messages later with no one in the loop. What it is about to send is exactly what an operator needs to see, and all of it is recorded in one SQLite store it already writes.
- **What:** registered in the catalogue, loader, session-prefix sets, probe, memory catalogue, declared records and resume hints; the adapter ships in clawmetry-pro 0.7.26. Sessions include conversations that started in a chat or email channel, specialist consults show as steps with question and answer, failed tools and failed sends are flagged, and pending sends are visible before they go out.
- **Honest limits:** tokens and cost are declared PARTIAL, because specialist agents write no usage row, so a session total is a floor. Pause and stop are not offered: one API server serves every conversation, and the Guard tab now says so in a sentence via `process_control.SHARED_PROCESS_RUNTIMES` instead of the generic "No signal support" string.
- **Also fixed:** `muse_code` was missing from `sync._RUNTIME_PREFIXES` and app.js `_CM_RT_PREFIXES`, so its sessions were bucketed as openclaw there.
- **Verified:** `tests/test_openexecutive_runtime_wiring.py` (13 tests, in CI), and the adapter against a store written by OpenExecutive's own storage code at upstream 8b2a9a7.
- **Carries:** #5921.

### Fixed: a correct emailed code dropped you back on "Sign in to open the dashboard" (2026-09-12)
- **Why:** a paying customer reported it after reinstalling: enter the email, enter the code from the email, and the local dashboard shows the sign-in card again, every time. The login wall accepts only the gateway token. Email sign-in succeeded against the cloud but handed the page no credential: it cleared the signed-out marker and reloaded, relying on zero-click `/api/auth/detected-token`. That endpoint refuses unless every strict loopback check passes (client address, Host header, no proxy headers, loopback bind). Wherever one of them fails, zero-click fails on every load, so a correct code reloaded into the same wall forever.
- **What:** `/api/cloud-cta/verify-otp` returns `dashboard_token` when the request passes that same strict loopback check, or when the account that just verified is the account this machine was already linked to (compared in constant time against the key on disk before pairing). The sign-in card stores it before reloading. With no token it tries zero-click once and otherwise says why the dashboard did not open instead of reloading.
Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
> **Read [`FLYWHEEL.md`](./FLYWHEEL.md) first.** It is how you ship a change end to end here (code → PR → green CI → `[RELEASE]` → PyPI → cloud → verified live) and the non-negotiable "done" bar. This file is the architecture reference; FLYWHEEL.md is the shipping loop.

## What is this?
ClawMetry is an open-source, real-time observability and governance layer for **31 AI agent runtimes** — [OpenClaw](https://github.com/openclaw/openclaw), NVIDIA NemoClaw and Goose free in OSS, the other 28 (Claude Code, Codex, Cursor, Copilot, Gemini CLI, Hermes, Aider, opencode, ...) with the optional Pro plugin. **Never type that number or that list anywhere new: [`SUPPORTED_RUNTIMES.txt`](./SUPPORTED_RUNTIMES.txt) is the generated single source every surface derives from** (`python3 scripts/sync_runtime_count.py`; `--check` fails CI on drift). `pip install clawmetry && clawmetry` — that's it. Zero config, observation by default.
ClawMetry is an open-source, real-time observability and governance layer for **32 AI agent runtimes** — [OpenClaw](https://github.com/openclaw/openclaw), NVIDIA NemoClaw and Goose free in OSS, the other 28 (Claude Code, Codex, Cursor, Copilot, Gemini CLI, Hermes, Aider, opencode, ...) with the optional Pro plugin. **Never type that number or that list anywhere new: [`SUPPORTED_RUNTIMES.txt`](./SUPPORTED_RUNTIMES.txt) is the generated single source every surface derives from** (`python3 scripts/sync_runtime_count.py`; `--check` fails CI on drift). `pip install clawmetry && clawmetry` — that's it. Zero config, observation by default.

**Never hardcode the runtime count or the runtime list anywhere new.** The authoritative sources are `entitlements.FREE_RUNTIMES | entitlements.PAID_RUNTIMES` (the catalogue, and what every quoted number is derived from) and `sync._FAMILY_ADAPTER_SPECS` (what the daemon actually loads — a `clawmetry-pro` adapter is inert until it is named there). `scripts/sync_runtime_count.py` rewrites the number in prose and CI fails on drift; the same script checks the chat-channel count against `entitlements.ALL_CHANNELS`.

Expand Down
6 changes: 3 additions & 3 deletions FLYWHEEL.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ The north star: **don't stop at "code compiles." Stop at "verified working in pr
> - **Before adding any poller/fetch, ask:** does this need to run on *every* tab? every *N* seconds? can it reuse an existing fetch or the snapshot?
> - **Measure before shipping:** open the Network panel / Resource Timing and confirm no endpoint is fetched N× per cycle and no background poller fires off its own screen. "It works" is not enough — "it works without a request storm" is the bar.

> ## Multi-runtime: ClawMetry observes 31 agent runtimes, not just OpenClaw (non-negotiable)
> **ClawMetry is runtime-neutral. It observes 31 AI agent runtimes, not OpenClaw alone.**
> ## Multi-runtime: ClawMetry observes 32 agent runtimes, not just OpenClaw (non-negotiable)
> **ClawMetry is runtime-neutral. It observes 32 AI agent runtimes, not OpenClaw alone.**
> **[`SUPPORTED_RUNTIMES.txt`](./SUPPORTED_RUNTIMES.txt) is the one list — do not type a second one.**
> It is generated from `FREE_RUNTIMES | PAID_RUNTIMES` in `clawmetry/entitlements.py` and carries every
> runtime's id, display label, free/paid tier and clawmetry.com path, plus the derived count and the
Expand All @@ -47,7 +47,7 @@ The north star: **don't stop at "code compiles." Stop at "verified working in pr
> clawmetry-pro's FLYWHEEL said 22, clawmetry-landing's said 21 and clawmetry-cloud's said 14 — four
> hand-maintained lists, four different numbers, none of them visible to the others' CI.
> - **User-facing copy and UI must never imply OpenClaw-only.** Framing like "designed for OpenClaw agents", "your OpenClaw machine", "No OpenClaw detected", or "Looking for OpenClaw activity" is a bug. Use runtime-neutral language ("your AI agent", "the machine your agent runs on") or name the runtimes ("OpenClaw, NVIDIA NemoClaw + 10 more runtimes", matching the homepage install card). Naming runtimes is public; pricing and tier internals stay private.
> - **Verify across all 31 runtimes, end to end.** Never ship a change verified only on OpenClaw. Use a `/workflow` to fan out a per-runtime E2E check: one agent per runtime that installs or configures it, runs a real turn, and asserts it lands correctly (in Brain by agent_type, in the right tab, with cost and tokens). "Works on OpenClaw" is not "works".
> - **Verify across all 32 runtimes, end to end.** Never ship a change verified only on OpenClaw. Use a `/workflow` to fan out a per-runtime E2E check: one agent per runtime that installs or configures it, runs a real turn, and asserts it lands correctly (in Brain by agent_type, in the right tab, with cost and tokens). "Works on OpenClaw" is not "works".
> Burned 2026-06-01: the docs FAQ said "ClawMetry is designed for OpenClaw agents" and the cloud empty-states plus the radar assumed OpenClaw-only. Many surfaces still need this sweep; when you touch a screen, fix its runtime framing.

---
Expand Down
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ reads the session files your coding agents already write, and puts the timeline,
the tool calls and whatever token and cost data the runtime exposes into one
view — so you can tell a long run that is working from one that is stuck.

Works with **31 AI agent runtimes** — Claude Code, OpenAI Codex, Hermes, OpenClaw & 27 more. One dashboard for your whole agent fleet. ([the full list](SUPPORTED_RUNTIMES.txt), generated from the catalogue.)
Works with **32 AI agent runtimes** — Claude Code, OpenAI Codex, Hermes, OpenClaw & 28 more. One dashboard for your whole agent fleet. ([the full list](SUPPORTED_RUNTIMES.txt), generated from the catalogue.)

> 🌐 **Read this in:** [English](README.md) · [简体中文](docs/i18n/zh-CN/README.md) · [日本語](docs/i18n/ja/README.md) · [한국어](docs/i18n/ko/README.md) · [Español](docs/i18n/es/README.md) · [Português (BR)](docs/i18n/pt-BR/README.md) · [Français](docs/i18n/fr/README.md) · [Deutsch](docs/i18n/de/README.md) · [हिन्दी](docs/i18n/hi/README.md) · [العربية](docs/i18n/ar/README.md) · [Русский](docs/i18n/ru/README.md) · [more →](docs/i18n/)

Expand Down Expand Up @@ -44,11 +44,11 @@ says which, per runtime), and observing an action is not the same as being able
to block it ([which controls are real, per runtime](docs/APPROVALS.md)).


## Works with 31 agent runtimes
## Works with 32 agent runtimes

**Free in the open source app:** 🦞 **[OpenClaw](https://clawmetry.com/runtimes/openclaw)** · 🟩 **[NVIDIA NemoClaw](https://clawmetry.com/nemoclaw)** · 🪿 **[Goose](https://clawmetry.com/runtimes/goose)**

**On a paid plan:** ◆ **[Claude Code](https://clawmetry.com/runtimes/claude-code)** · **[Cursor](https://clawmetry.com/runtimes/cursor)** · 🐙 **[GitHub Copilot](https://clawmetry.com/runtimes/copilot)** · ⬡ **[OpenAI Codex](https://clawmetry.com/runtimes/codex)** · ♊ **[Gemini CLI](https://clawmetry.com/runtimes/gemini-cli)** · 💗 **[Lovable](https://clawmetry.com/runtimes/lovable)** · ⠕ **[Replit Agent](https://clawmetry.com/runtimes/replit)** · 🖇 **[Cline](https://clawmetry.com/runtimes/cline)** · 🙌 **[OpenHands](https://clawmetry.com/runtimes/openhands)** · 🧑‍💼 **[OpenWorker](https://clawmetry.com/runtimes/openworker)** · 🎭 **[Muse Code](https://clawmetry.com/runtimes/muse-code)** · **[opencode](https://clawmetry.com/runtimes/opencode)** · **[Aider](https://clawmetry.com/runtimes/aider)** · 🔗 **[n8n](https://clawmetry.com/runtimes/n8n)** · ◈ **[Qwen Code](https://clawmetry.com/runtimes/qwen-code)** · 🅳 **[Devin](https://clawmetry.com/runtimes/devin)** · 🪐 **[Antigravity](https://clawmetry.com/runtimes/antigravity)** · **[Grok Build](https://clawmetry.com/runtimes/grok)** · 🤖 **[Grok Bot](https://clawmetry.com/runtimes/grok-bot)** · ⚡ **[Hermes](https://clawmetry.com/runtimes/hermes)** · **[Pi](https://clawmetry.com/runtimes/pi)** · **[Deep Agents](https://clawmetry.com/runtimes/deep-agents)** · 🌙 **[Kimi CLI](https://clawmetry.com/runtimes/kimi)** · 🐋 **[DeepSeek Harness](https://clawmetry.com/runtimes/deepseek-harness)** · 🦾 **[Exo](https://clawmetry.com/runtimes/exo)** · **[NanoClaw](https://clawmetry.com/runtimes/nanoclaw)** · **[PicoClaw](https://clawmetry.com/runtimes/picoclaw)** · **[QM](https://clawmetry.com/runtimes/qm)**
**On a paid plan:** ◆ **[Claude Code](https://clawmetry.com/runtimes/claude-code)** · **[Cursor](https://clawmetry.com/runtimes/cursor)** · 🐙 **[GitHub Copilot](https://clawmetry.com/runtimes/copilot)** · ⬡ **[OpenAI Codex](https://clawmetry.com/runtimes/codex)** · ♊ **[Gemini CLI](https://clawmetry.com/runtimes/gemini-cli)** · 💗 **[Lovable](https://clawmetry.com/runtimes/lovable)** · ⠕ **[Replit Agent](https://clawmetry.com/runtimes/replit)** · 🖇 **[Cline](https://clawmetry.com/runtimes/cline)** · 🙌 **[OpenHands](https://clawmetry.com/runtimes/openhands)** · 🧑‍💼 **[OpenWorker](https://clawmetry.com/runtimes/openworker)** · 🎭 **[Muse Code](https://clawmetry.com/runtimes/muse-code)** · 🏛️ **[OpenExecutive](https://clawmetry.com/runtimes/openexecutive)** · **[opencode](https://clawmetry.com/runtimes/opencode)** · **[Aider](https://clawmetry.com/runtimes/aider)** · 🔗 **[n8n](https://clawmetry.com/runtimes/n8n)** · ◈ **[Qwen Code](https://clawmetry.com/runtimes/qwen-code)** · 🅳 **[Devin](https://clawmetry.com/runtimes/devin)** · 🪐 **[Antigravity](https://clawmetry.com/runtimes/antigravity)** · **[Grok Build](https://clawmetry.com/runtimes/grok)** · 🤖 **[Grok Bot](https://clawmetry.com/runtimes/grok-bot)** · ⚡ **[Hermes](https://clawmetry.com/runtimes/hermes)** · **[Pi](https://clawmetry.com/runtimes/pi)** · **[Deep Agents](https://clawmetry.com/runtimes/deep-agents)** · 🌙 **[Kimi CLI](https://clawmetry.com/runtimes/kimi)** · 🐋 **[DeepSeek Harness](https://clawmetry.com/runtimes/deepseek-harness)** · 🦾 **[Exo](https://clawmetry.com/runtimes/exo)** · **[NanoClaw](https://clawmetry.com/runtimes/nanoclaw)** · **[PicoClaw](https://clawmetry.com/runtimes/picoclaw)** · **[QM](https://clawmetry.com/runtimes/qm)**

Every runtime gets the same dashboard. Run several at once and the header
switcher re-scopes every tab to one of them.
Expand Down Expand Up @@ -77,7 +77,7 @@ Two questions worth answering before you trust any agent-comparison tool.
A utilization percentage is only as honest as what it divides by. ClawMetry
sizes the window per provider from [a table you can read and
PR](clawmetry/context_windows.py), covering Anthropic, OpenAI, Google, xAI,
DeepSeek, Kimi, Qwen, Mistral, Llama and GLM. It does not measure all 31
DeepSeek, Kimi, Qwen, Mistral, Llama and GLM. It does not measure all 32
runtimes with one vendor's ruler. That matters: a 300K GPT-5 turn scored
against Anthropic's 200K reads ">100%, blown" when it is really at 75% of
GPT-5's 400K. The same ruler hides a genuinely overflowed 130K DeepSeek turn
Expand All @@ -97,7 +97,7 @@ ClawMetry can only see compaction events on some runtimes. So

| Path | Added to your agent | Default? |
|---|---|---|
| Session-file tailing (all 31 runtimes) | **0**. Separate process, no ClawMetry code in your agent | on |
| Session-file tailing (all 32 runtimes) | **0**. Separate process, no ClawMetry code in your agent | on |
| HTTP interceptor (`CLAWMETRY_INTERCEPT=1`) | **+0.44 ms** per LLM call, or 0.009% of a 5s call | off |
| Pre-tool hook gate (warm cache) | **+44 ms** per gated tool call, over a 36 ms interpreter floor | off |
| Enforcement proxy | **+9.7 ms** per LLM call | off |
Expand Down
7 changes: 4 additions & 3 deletions SUPPORTED_RUNTIMES.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,10 @@
# (read by the closed-source clawmetry-pro companion). 'landing_path'
# is relative to https://clawmetry.com.

COUNT = 31
COUNT = 32
FREE_COUNT = 3
PAID_COUNT = 28
BLURB = See your agent think. Zero-config observability & governance for 31 AI agent runtimes: Claude Code, OpenAI Codex, Hermes, OpenClaw & 27 more. Live token costs, sessions, tool calls, crons.
PAID_COUNT = 29
BLURB = See your agent think. Zero-config observability & governance for 32 AI agent runtimes: Claude Code, OpenAI Codex, Hermes, OpenClaw & 28 more. Live token costs, sessions, tool calls, crons.

goose Goose free /runtimes/goose
nemoclaw NemoClaw free /nemoclaw
Expand All @@ -52,6 +52,7 @@ muse_code Muse Code paid /runtimes/muse-code
n8n n8n paid /runtimes/n8n
nanoclaw NanoClaw paid /runtimes/nanoclaw
opencode opencode paid /runtimes/opencode
openexecutive OpenExecutive paid /runtimes/openexecutive
openhands OpenHands paid /runtimes/openhands
openworker OpenWorker paid /runtimes/openworker
pi Pi paid /runtimes/pi
Expand Down
Loading
Loading