From 1028f1b67f2f8e250537fcc97afad2b55ecf86f3 Mon Sep 17 00:00:00 2001 From: vivekchand Date: Wed, 9 Sep 2026 11:08:53 +0200 Subject: [PATCH 1/8] Add Muse Code as the 31st runtime (protocol-read, not file-read) Meta ships two products called Muse. The consumer personal agent runs wholly inside Meta's "Muse Secure VM" with no API and no local footprint, so it cannot be observed and is deliberately NOT a runtime here; a guard asserts it never enters the catalogue. Muse Code, Meta's terminal coding agent on Muse Spark, is a local process with a documented protocol, and that is what this adds. It is the first runtime read over a PROTOCOL rather than off disk. Muse publishes no session-log schema, so rather than reverse-engineer one the adapter (clawmetry-pro) spawns `muse serve` and calls the two documented read-only MSP surfaces: session/list ("read-only, never touches leases") and session/read (a point-in-time cold read that never subscribes). MSP also reports each session's own durable log path, so nothing is guessed. The adapter requests no capabilities -- in particular not `userShell`, which would let the connection run commands in the workspace -- and MSP's control half (turn/start, approval/decide) is deliberately not wired: that would be a fifth way to affect an agent and needs the CLAUDE.md locks. OSS side: * catalogue, loader tuple, labels, landing path and every session-prefix set that splits "muse_code:" * pricing: the muse-spark entries were a $1.00/$3.00 placeholder with a comment asking to be updated once Meta published rates. Meta has, so they now carry the published Meta Model API figures. The two 1.3 variants are listed separately because contributor is 12.5x cheaper on input and ~21x on output -- one family rate would misreport whichever tier the user is not on. Before this, every muse-spark model fell through to the (1.0, 3.0) unknown-provider default. * MCP: Muse speaks MCP, so it is registered rather than declared MCP-less, with a `json_muse` writer for its own mcp_servers/transport shape. Creating the settings file seeds `schema_version: 1` -- without it Muse FAILS AT STARTUP, so a bare {"mcp_servers": ...} would leave a user unable to launch Muse at all. Uninstall never seeds. * control: Muse Code runs a real local process tree, but MSP reports no pid anywhere, so a resolver would have to match argv+cwd and that has not been verified against a real `muse`. It is therefore `unknown`, not `unsupported` -- "unsupported" asserts no per-session process exists here ever, which would be false -- and no buttons are offered. A resume hint covers the gap. * runtime_records declares tokens on-disk, cost derived, and names the one honest gap: MSP's counted-once prompt total rides a live view notification a cold read does not serve, so our input figure is the raw provider counter and cached tokens are never added to it. Runtime count 30 -> 31 via scripts/sync_runtime_count.py. No-PRD: adding a vendor runtime adapter to an existing, documented extension seam; no new product surface or user-facing behaviour beyond one more runtime in the existing catalogue. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_019cGLYe3MnE6pfMupvvnTJK --- .github/workflows/ci.yml | 1 + AGENTS.md | 2 +- ARCHITECTURE.md | 4 +- AUDIT.md | 2 +- CLAUDE.md | 2 +- FLYWHEEL.md | 6 +- README.md | 10 +- clawmetry/behaviour_signals.py | 1 + clawmetry/cli.py | 4 +- clawmetry/detector_calibration.py | 2 + clawmetry/entitlements.py | 6 + clawmetry/license.py | 2 +- clawmetry/local_store.py | 4 +- clawmetry/mcp_install.py | 36 ++- clawmetry/process_control.py | 24 ++ clawmetry/providers_pricing.py | 32 ++- clawmetry/resume_hints.py | 6 + clawmetry/runtime_memory.py | 31 ++- clawmetry/runtime_probe.py | 9 + clawmetry/runtime_records.py | 16 +- clawmetry/static/js/app.js | 6 +- clawmetry/static/js/gw-setup.js | 2 +- clawmetry/sync.py | 7 + clawmetry/tool_risk.py | 2 +- dashboard.py | 2 +- desktop/onboarding.py | 2 +- docs/BRING_YOUR_OWN_AGENT.md | 2 +- docs/CONTEXT_BLOWOUT.md | 2 +- docs/OVERHEAD.md | 2 +- docs/RUNTIME_SCREENSHOTS.md | 2 +- docs/blueprints/quality-cloud-parity.md | 2 +- docs/compatibility.md | 3 +- docs/i18n/el/README.md | 8 +- docs/i18n/es-419/README.md | 8 +- docs/i18n/es/README.md | 8 +- docs/i18n/fil/README.md | 4 +- docs/i18n/fr/README.md | 8 +- docs/i18n/nl/README.md | 4 +- docs/i18n/pt-BR/README.md | 8 +- docs/i18n/pt-PT/README.md | 8 +- docs/i18n/th/README.md | 2 +- routes/attention.py | 2 +- routes/device.py | 2 +- routes/harness.py | 1 + routes/usage.py | 3 +- setup.py | 2 +- ...est_advertised_runtimes_match_catalogue.py | 1 + tests/test_entitlements.py | 5 +- tests/test_muse_code_runtime_wiring.py | 263 ++++++++++++++++++ 49 files changed, 497 insertions(+), 74 deletions(-) create mode 100644 tests/test_muse_code_runtime_wiring.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8d6f692fda..5545390cf7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -577,6 +577,7 @@ jobs: tests/test_tab_template_page_wrapper.py \ tests/test_grok_bot_runtime_wiring.py \ tests/test_lovable_runtime_wiring.py \ + tests/test_muse_code_runtime_wiring.py \ tests/test_delegated_usage.py \ tests/test_local_query_api.py \ tests/test_harness_audit_reads_whole_adapter.py \ diff --git a/AGENTS.md b/AGENTS.md index d682408baa..171b770eaf 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -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 **30 AI agent runtimes** (OpenClaw, NemoClaw and Goose free in OSS; Claude Code, Codex, Cursor and 24 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 **31 AI agent runtimes** (OpenClaw, NemoClaw and Goose free in OSS; Claude Code, Codex, Cursor and 24 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) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index dd91f62b31..49aa0c531c 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -14,7 +14,7 @@ ┌──────────────────────────────────────────────────────────────────────┐ │ Your Machine │ │ │ -│ 30 agent runtimes ClawMetry │ +│ 31 agent runtimes ClawMetry │ │ ┌──────────────────┐ ┌───────────────────────────────────┐ │ │ │ OpenClaw │ files │ Sync daemon (clawmetry sync) │ │ │ │ Claude Code │───────►│ • reads sessions, logs, hooks │ │ @@ -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 30 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 31 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") diff --git a/AUDIT.md b/AUDIT.md index 156ecb3833..93514dded9 100644 --- a/AUDIT.md +++ b/AUDIT.md @@ -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 30 runtimes**, not just OpenClaw (`/api/runtimes`). +3. Verify across **all 31 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). --- diff --git a/CLAUDE.md b/CLAUDE.md index a85517a2a4..c3b97941f5 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -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 **30 AI agent runtimes** — [OpenClaw](https://github.com/openclaw/openclaw), NVIDIA NemoClaw and Goose free in OSS, the other 27 (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 **31 AI agent runtimes** — [OpenClaw](https://github.com/openclaw/openclaw), NVIDIA NemoClaw and Goose free in OSS, the other 27 (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`. diff --git a/FLYWHEEL.md b/FLYWHEEL.md index d15de4f971..5e470d4c7c 100644 --- a/FLYWHEEL.md +++ b/FLYWHEEL.md @@ -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 30 agent runtimes, not just OpenClaw (non-negotiable) -> **ClawMetry is runtime-neutral. It observes 30 AI agent runtimes, not OpenClaw alone.** +> ## 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.** > **[`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 @@ -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 30 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 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". > 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. --- diff --git a/README.md b/README.md index cc0c679c4a..33e69fe1f4 100644 --- a/README.md +++ b/README.md @@ -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 **30 AI agent runtimes** — Claude Code, OpenAI Codex, Hermes, OpenClaw & 26 more. One dashboard for your whole agent fleet. ([the full list](SUPPORTED_RUNTIMES.txt), generated from the catalogue.) +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.) > 🌐 **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/) @@ -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 30 agent runtimes +## Works with 31 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)** · **[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)** · **[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. @@ -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 30 +DeepSeek, Kimi, Qwen, Mistral, Llama and GLM. It does not measure all 31 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 @@ -97,7 +97,7 @@ ClawMetry can only see compaction events on some runtimes. So | Path | Added to your agent | Default? | |---|---|---| -| Session-file tailing (all 30 runtimes) | **0**. Separate process, no ClawMetry code in your agent | on | +| Session-file tailing (all 31 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 | diff --git a/clawmetry/behaviour_signals.py b/clawmetry/behaviour_signals.py index 5539a8dd0e..4cc9a48b3e 100644 --- a/clawmetry/behaviour_signals.py +++ b/clawmetry/behaviour_signals.py @@ -881,6 +881,7 @@ def _in_prev(d: int) -> bool: "picoclaw": "PicoClaw", "nanoclaw": "NanoClaw", "antigravity": "Antigravity", "kimi": "Kimi", "n8n": "n8n", "openhands": "OpenHands", "deepagents": "DeepAgents", "lovable": "Lovable", "replit": "Replit", "openworker": "OpenWorker", + "muse_code": "Muse Code", } diff --git a/clawmetry/cli.py b/clawmetry/cli.py index e0c7f406dd..c3f922f395 100644 --- a/clawmetry/cli.py +++ b/clawmetry/cli.py @@ -1334,7 +1334,7 @@ def _input(prompt): from clawmetry.license import auto_provision_pro _pro_installed, _pro_msg = auto_provision_pro(api_key, node_id) if _pro_installed: - print(" Pro adapters installed - all 30 runtimes available.") + print(" Pro adapters installed - all 31 runtimes available.") elif _pro_msg: # Entitled but the wheel could not be installed right now; surface a # quiet hint without alarming the user (connect still succeeded). @@ -4239,7 +4239,7 @@ def _input(prompt): print() print(f" {BOLD('Plans')} {DIM('(same either way; each tier includes the one before):')}") print(f" {DIM('Free $0 watch OpenClaw + NVIDIA NemoClaw, forever')}") - print(f" {DIM('Starter $9/node/mo everything in Free + observability for all 30 runtimes')}") + print(f" {DIM('Starter $9/node/mo everything in Free + observability for all 31 runtimes')}") print(f" {DIM('Pro $19/node/mo everything in Starter + governance (alerts, approvals, evals)')}") print() print(f" {BOLD('How do you want to run ClawMetry?')}") diff --git a/clawmetry/detector_calibration.py b/clawmetry/detector_calibration.py index d39acb733c..e457051696 100644 --- a/clawmetry/detector_calibration.py +++ b/clawmetry/detector_calibration.py @@ -145,6 +145,8 @@ # exclusively through them looks like it made no progress at all. It also # drives a shell (``run_shell``), which the shell-mutation rule covers. "openworker": {"write_tools": ("replace_in_file", "apply_unified_diff")}, + # Muse Code's edit tools, as named in the toolCall items MSP serves. + "muse_code": {"write_tools": ("edit_file", "write_file", "apply_patch")}, # Replit Agent writes through ``write``/``edit`` (both match the module # defaults) and shells through ``bash`` (covered by the shell-mutation # rule) — vocabulary verified against real in-workspace journals (pro diff --git a/clawmetry/entitlements.py b/clawmetry/entitlements.py index 85ed7abe77..cdec8b2ba2 100644 --- a/clawmetry/entitlements.py +++ b/clawmetry/entitlements.py @@ -129,6 +129,10 @@ # transcript journals into the Repl workspace filesystem, where the # daemon reads them (in-Repl install or a local clone). "replit", + # Muse Code (developer.meta.com/ai/products/muse-code) -- Meta's + # terminal coding agent on Muse Spark. NOT the consumer Muse personal + # agent, which runs wholly inside Meta's cloud VM and is unobservable. + "muse_code", } ) @@ -177,6 +181,7 @@ "openworker": "OpenWorker", "lovable": "Lovable", "replit": "Replit Agent", + "muse_code": "Muse Code", } @@ -219,6 +224,7 @@ "openworker": "/runtimes/openworker", "lovable": "/runtimes/lovable", "replit": "/runtimes/replit", + "muse_code": "/runtimes/muse-code", } diff --git a/clawmetry/license.py b/clawmetry/license.py index 5500fdfc53..6732cc8d2a 100644 --- a/clawmetry/license.py +++ b/clawmetry/license.py @@ -964,7 +964,7 @@ def refresh_pro_from_license(node_id: str | None = None) -> tuple[bool, str]: def auto_provision_pro(api_key: str, node_id: str | None = None) -> tuple[bool, str]: """CLOUD ACCOUNT path, called by ``clawmetry connect`` after the cm_ key is saved. Ask the cloud whether this account is ENTITLED to clawmetry-pro and, - if so, download+install the wheel so the node gets all 30 runtimes. + if so, download+install the wheel so the node gets all 31 runtimes. HARD RULES enforced here: * Pro is installed ONLY for an entitled plan (Starter/Pro/Trial/ diff --git a/clawmetry/local_store.py b/clawmetry/local_store.py index 02c5972efc..e44bfee992 100644 --- a/clawmetry/local_store.py +++ b/clawmetry/local_store.py @@ -19252,7 +19252,7 @@ def _parse(s: str): "pi", "deepagents", "n8n", "antigravity", "copilot", "grok", "qm", "deepseek_harness", "exo", "kimi", "devin", "gemini_cli", "cline", "openhands", "openworker", "grok_bot", "lovable", "replit", - + "muse_code", ) # Epoch-ms of the outcome-classifier fix (2026-08-15). Any failure label @@ -19430,7 +19430,7 @@ def _sql_in_clause(values: tuple[str, ...]) -> str: # call sites (and tests) have always reached for it via ``local_store``. # # The old implementation knew exactly two numbers, both Anthropic's, and -# measured all 30 runtimes with that ruler: a 300K GPT-5 turn read as ">100% +# measured all 31 runtimes with that ruler: a 300K GPT-5 turn read as ">100% # blown" (GPT-5 is 400K, so it was at 75%), and a genuinely blown 130K # DeepSeek turn read as a comfortable 65%. See that module's docstring. from clawmetry.context_windows import ( # noqa: E402 (kept near its callers) diff --git a/clawmetry/mcp_install.py b/clawmetry/mcp_install.py index 1494cf5aac..a529f46844 100644 --- a/clawmetry/mcp_install.py +++ b/clawmetry/mcp_install.py @@ -59,6 +59,13 @@ # json_mcpservers {"mcpServers": {name: {command, args[, type]}}} # json_opencode {"mcp": {name: {"type": "local", "command": [..], "enabled": true}}} # toml_mcp_servers [mcp_servers.name] command = ".." args = [".."] +# json_muse {"mcp_servers": {name: {transport, command, args}}} +# +# ``seed``: keys a CREATED file must carry to be valid for that runtime. Only +# applied when we are writing the file from nothing — never merged into a file +# the user already has. Muse Code needs this: its settings file must contain +# ``"schema_version": 1`` or the app fails at startup, so writing a bare +# {"mcp_servers": ...} would leave the user unable to launch Muse at all. # # ``verified``: how the format was checked. Recorded here on purpose so a # future reader can re-check the same source when a vendor moves things. @@ -104,6 +111,18 @@ "guidance_file": "AGENTS.md", "verified": "opencode.ai/docs/mcp-servers + /docs/config (mcp: {type: local, command: [..]})", }, + "muse_code": { + "label": "Muse Code", + "path": "~/.config/muse/settings.json", + "format": "json_muse", + "entry_type": "", + "guidance_file": "AGENTS.md", + "seed": {"schema_version": 1}, + "verified": "dev.meta.ai/docs/muse-code/extending (mcp_servers block in the " + "settings file; each server needs a transport of stdio or " + "streamable_http) + /configuration (settings file lives at " + "~/.config/muse/settings.json and must carry schema_version)", + }, "windsurf": { "label": "Windsurf", "path": "~/.codeium/windsurf/mcp_config.json", @@ -235,6 +254,10 @@ def _write_json_file(path: str, data: dict) -> None: def _json_entry(spec: dict, command: str, args: List[str]) -> dict: if spec["format"] == "json_opencode": return {"type": "local", "command": [command] + list(args), "enabled": True} + if spec["format"] == "json_muse": + # Muse names the stdio/http choice `transport`, not `type`, and treats + # a missing one as invalid rather than defaulting it. + return {"transport": "stdio", "command": command, "args": list(args)} entry: Dict[str, Any] = {} if spec.get("entry_type"): entry["type"] = spec["entry_type"] @@ -244,7 +267,11 @@ def _json_entry(spec: dict, command: str, args: List[str]) -> dict: def _json_container_key(spec: dict) -> str: - return "mcp" if spec["format"] == "json_opencode" else "mcpServers" + if spec["format"] == "json_opencode": + return "mcp" + if spec["format"] == "json_muse": + return "mcp_servers" + return "mcpServers" # ── TOML (Codex) ───────────────────────────────────────────────────────────── @@ -392,6 +419,10 @@ def install(self, runtime: str, dry_run: bool = False) -> dict: data, problem = _read_json_file(path) if data is None: return dict(base, status=UNKNOWN_FORMAT, detail=problem) + if not data and spec.get("seed"): + # Creating the file from nothing: without this the runtime + # rejects its own config on next launch. + data.update(spec["seed"]) key = _json_container_key(spec) container = data.get(key) if container is None: @@ -441,6 +472,9 @@ def uninstall(self, runtime: str) -> dict: data, problem = _read_json_file(path) if data is None: return dict(base, status=UNKNOWN_FORMAT, detail=problem) + # No `seed` here on purpose: uninstall removes, it never + # creates. Seeding an absent file would leave a config behind + # for a runtime the user just detached from. key = _json_container_key(spec) container = data.get(key) if isinstance(container, dict) and _entry_is_ours(container.get(SERVER_NAME)): diff --git a/clawmetry/process_control.py b/clawmetry/process_control.py index deb23153cb..fc6b6c0e51 100644 --- a/clawmetry/process_control.py +++ b/clawmetry/process_control.py @@ -305,6 +305,16 @@ def runtime_control_support(runtime: str, session_id: str = "", "state": "controllable", "reason": "", "platform": plat} + if rt in UNVERIFIED_RUNTIMES: + return {"controllable": False, "runtime": rt, "actions": [], + "state": "unknown", + "reason": ("Muse Code runs a real local process per session, " + "but its protocol reports no pid and ClawMetry has " + "no verified way to match a session to one — so " + "these controls are not offered rather than " + "offered and inert"), + "platform": plat} + return {"controllable": False, "runtime": rt, "actions": [], "state": "unsupported", "reason": f"No signal support for {rt or 'unknown runtime'}", @@ -387,6 +397,20 @@ def runtime_control_support(runtime: str, session_id: str = "", ) UNSUPPORTED_RUNTIMES = frozenset({"cursor"}) +# Runtimes that almost certainly CAN be signalled but have no resolver yet, so +# we do not know which pid belongs to a given session. Kept apart from +# UNSUPPORTED_RUNTIMES because the two are different claims and the Guard tab +# says different things: "unsupported" asserts no per-session process exists +# here, ever, which for these would be false. +# +# muse_code: `muse` runs one local process tree per terminal session, so Stop +# and Kill would work — but MSP carries no pid anywhere (session/list returns +# sessionId, path and workspaceRoot, never a process), so a resolver has to +# match argv+cwd like codex's, and that has not been verified against a real +# `muse` process. Shipping the buttons on an unverified resolver is how you +# get a Kill that silently signals nothing, or worse, the wrong tree. +UNVERIFIED_RUNTIMES = frozenset({"muse_code"}) + # Runtimes whose support is decided PER SESSION, not per runtime, because the # runtime hosts sessions in more than one execution model. These are listed in # UNSUPPORTED_RUNTIMES (the safe default: a session we cannot place is refused) diff --git a/clawmetry/providers_pricing.py b/clawmetry/providers_pricing.py index 9497f8b569..4f13f256b2 100644 --- a/clawmetry/providers_pricing.py +++ b/clawmetry/providers_pricing.py @@ -218,12 +218,32 @@ def _openai_prices(model: str): ("moonshot", "moonshot-v1-128k"): (2.00, 5.00), ("deepseek", "deepseek-v4-flash"): (0.14, 0.28), ("deepseek", "deepseek-v4-pro"): (0.435, 0.87), - # Meta muse-spark (ClawHub/npm standalone distribution), per-token rates not - # yet officially published — $1.00/$3.00 per 1M is a best-effort placeholder. - # Update once Meta publishes official pricing. Encrypted reasoning-replay - # turns are counted as regular output tokens (no separate rate known). - ("meta", "muse-spark-1.1"): (1.00, 3.00), - ("meta", "muse-spark"): (1.00, 3.00), + # Meta muse-spark. These were a $1.00/$3.00 placeholder while Meta published + # no rates; the rates below are the published Meta Model API figures + # (developer.meta.com/ai/models/muse-spark, corroborated by OpenRouter's + # listings), so the placeholder comment's condition is now met. + # + # The two 1.3 variants are NOT close: contributor is 12.5x cheaper on input + # and ~21x on output, bought by letting Meta train on the traffic. Pricing + # both from one family rate would misreport whichever tier the user is not + # on, so the longer, more specific prefix is listed first-class and wins + # under _get_rates' longest-prefix rule. + # + # Cache: Meta publishes a cached-input rate ($0.15/1M standard, + # $0.002/1M contributor) but estimate_event_cost_usd only applies cache + # adjustments for the anthropic and openai conventions, so cached tokens + # are not separately priced here. That is deliberate rather than an + # oversight: MSP reports muse-spark usage with `cachedTokens` only (the + # split `cacheReadTokens`/`cacheWriteTokens` appear "only when the provider + # distinguishes writes/reads", which Meta does not), so there is nothing to + # apply a cache rate TO without first knowing whether cached sits inside or + # beside inputTokens — the ambiguity MSP's counted-once `promptTokens` + # exists to resolve. Wiring a rate on a guessed convention would move real + # dollars on a guess. See clawmetry_pro/adapters/muse_code.py. + ("meta", "muse-spark-1.3-contributor"): (0.10, 0.20), + ("meta", "muse-spark-1.3"): (1.25, 4.25), + ("meta", "muse-spark-1.1"): (1.25, 4.25), + ("meta", "muse-spark"): (1.25, 4.25), } diff --git a/clawmetry/resume_hints.py b/clawmetry/resume_hints.py index 630e0462a3..47478212ff 100644 --- a/clawmetry/resume_hints.py +++ b/clawmetry/resume_hints.py @@ -165,6 +165,12 @@ "(the IDE and CLI flavours share one store under ~/.gemini).", "source": "clawmetry adapter: ~/.gemini/antigravity*/brain/", }, + "muse_code": { + "command": "muse --resume ", + "note": "Muse Code resumes a stored session by id; `muse` with no " + "argument starts a new one in the current workspace.", + "source": "clawmetry adapter: MSP session/resume over `muse serve`", + }, "openworker": { "command": "", "note": "OpenWorker is a desktop app. Reopen the conversation in the " diff --git a/clawmetry/runtime_memory.py b/clawmetry/runtime_memory.py index 4df0a82467..3c860b779c 100644 --- a/clawmetry/runtime_memory.py +++ b/clawmetry/runtime_memory.py @@ -1213,6 +1213,35 @@ def _catalog() -> list: ), )) + # ── Muse Code (developer.meta.com/ai/products/muse-code) ──────── + # Project instructions: Muse searches UP from the workspace root to the + # nearest .git boundary and takes the FIRST of AGENTS.md, CLAUDE.md, + # .agents/AGENTS.md, .claude/CLAUDE.md at each level — so all four are + # real roots here, in that order. Memory is a MEMORY.md index plus topic + # files; the committed half lives at /.agents/memory/ and the + # personal half is off-repo. MCP servers are declared inside settings.json + # (an mcp_servers block), not a file of their own. + muse_home = _env_root("CLAWMETRY_MUSE_HOME", + os.path.expanduser("~/.config/muse")) + catalog.append(RuntimeCatalogEntry( + id="muse_code", label="Muse Code", roots=( + RootSpec("memory", os.path.join(ws, "AGENTS.md"), + label="Project AGENTS.md", scope="project"), + RootSpec("memory", os.path.join(ws, "CLAUDE.md"), + label="Project CLAUDE.md", scope="project"), + RootSpec("memory", os.path.join(ws, ".agents", "AGENTS.md"), + label="Project .agents/AGENTS.md", scope="project"), + RootSpec("memory", os.path.join(ws, ".claude", "CLAUDE.md"), + label="Project .claude/CLAUDE.md", scope="project"), + RootSpec("memory", os.path.join(ws, ".agents", "memory"), + ("MEMORY.md", "*.md"), "Project memory", "project"), + RootSpec("mcp", os.path.join(muse_home, "settings.json"), + label="settings.json (mcp_servers)", scope="global"), + RootSpec("hooks", os.path.join(ws, ".muse", "hooks.json"), + label="hooks.json", scope="project"), + ), + )) + # ── OpenWorker (github.com/andrewyng/openworker) ──────────────── # Instructions are AGENTS.md, and OpenWorker reads BOTH a project one and a # user-global one it keeps in its own state dir (coworker/project.py returns @@ -1674,7 +1703,7 @@ def list_all_files(category: Optional[str] = None, Backs the "All runtimes" scope of the Memory / Skills browser. Only groups that actually exist on disk are returned — the per-runtime view is where we spell out the paths we looked at and came up empty, - because listing every absent root for 30 runtimes would be a wall of + because listing every absent root for 31 runtimes would be a wall of noise rather than an answer. ``allowed``, when given, restricts the sweep to that set of runtime diff --git a/clawmetry/runtime_probe.py b/clawmetry/runtime_probe.py index cbf0cbf44e..b33871fd7f 100644 --- a/clawmetry/runtime_probe.py +++ b/clawmetry/runtime_probe.py @@ -198,6 +198,15 @@ def found(self) -> bool: # files rather than the directory: the dir alone is created by a first # launch that never recorded a session, and ~/.config is shared with # every other tool, so a bare-dir probe is the weakest possible evidence. + # Muse Code keys on the settings FILE, not the directory: ~/.config is + # shared with every other tool, and Muse's own docs make settings.json + # mandatory (it must carry schema_version or the app refuses to start), so + # the file existing is real evidence that Muse was configured here. + RuntimeProbe("muse_code", "Muse Code", + ("~/.config/muse/settings.json", + "~/.config/muse/auth.json", + "~/AppData/Roaming/muse/settings.json"), + env="CLAWMETRY_MUSE_HOME"), RuntimeProbe("openworker", "OpenWorker", ("~/.config/coworker/coworker.db", "~/.config/coworker/conversations", diff --git a/clawmetry/runtime_records.py b/clawmetry/runtime_records.py index 1e910099bc..d9627a289d 100644 --- a/clawmetry/runtime_records.py +++ b/clawmetry/runtime_records.py @@ -53,7 +53,7 @@ # Signals a surface can ask about. Deliberately short: these are the three the # broken-looking panels actually depend on. Adding a fourth means being able to -# answer it for all 30 runtimes, which is the bar that keeps this table true. +# answer it for all 31 runtimes, which is the bar that keeps this table true. SIGNALS = ("tokens", "cost", "model") @@ -229,6 +229,20 @@ def _e(tokens, cost, model, evidence, *, note="", doc_label=None, doc_file="docs "not observable here at all, so no figure is derived and times " "come from file mtimes with the basis declared.", ), + "muse_code": _e( + ON_DISK, DERIVED, ON_DISK, + "Per-model-call token counters ride each transcript item, tagged with " + "the session's model", + note="Muse Code publishes no on-disk record format; the transcript is " + "served over the Muse Session Protocol, and every model call " + "carries a verbatim provider usage block (input/output/cached/" + "reasoning). Muse writes no dollars, so cost is always derived " + "from the pricing table. One honest gap: MSP's counted-once " + "prompt total, which resolves whether cached tokens sit inside " + "or beside the input count, rides a live view notification that " + "a cold read does not serve — so the input figure is the raw " + "provider counter and cached tokens are never added to it.", + ), "openworker": _e( ON_DISK, DERIVED, ON_DISK, "The token split rides a per-message sidecar tagged with the model " diff --git a/clawmetry/static/js/app.js b/clawmetry/static/js/app.js index 090eae3934..ac0aa6aef7 100644 --- a/clawmetry/static/js/app.js +++ b/clawmetry/static/js/app.js @@ -5854,6 +5854,7 @@ var _Q_RUNTIME_NAMES = { kimi: 'Kimi CLI', devin: 'Devin', gemini_cli: 'Gemini CLI', cline: 'Cline', openhands: 'OpenHands', openworker: 'OpenWorker', lovable: 'Lovable', replit: 'Replit Agent', + muse_code: 'Muse Code', }; function _qRuntimeLabel(id) { return _Q_RUNTIME_NAMES[id] || id; @@ -12113,6 +12114,7 @@ var _CM_RT_LABEL = { deepseek_harness: 'DeepSeek Harness', exo: 'Exo', kimi: 'Kimi CLI', devin: 'Devin', gemini_cli: 'Gemini CLI', cline: 'Cline', openhands: 'OpenHands', openworker: 'OpenWorker', lovable: 'Lovable', replit: 'Replit Agent', + muse_code: 'Muse Code', }; // The CLOSED session-prefix runtimes (the only keys that can ride a session_id // prefix). Foreign OTLP / OpenLLMetry apps are NOT in here — they have no @@ -29069,7 +29071,7 @@ function clearSwimlaneLanes() { } // One-click preset: most-recent session per distinct runtime (cap 4). This is -// the headline demo path — the 30 runtimes side by side. Respects the global +// the headline demo path — the 31 runtimes side by side. Respects the global // runtime switcher: when scoped to one runtime, only that runtime is picked. function swimlanePresetPerRuntime() { var rtFilter = (typeof _cmRuntimeFilter === 'function') ? _cmRuntimeFilter() : 'all'; @@ -32464,7 +32466,7 @@ async function renderFirstRunReport(overview) { // How widely we looked, and where to get the detail. // - // This used to render the expanded probe path for all 30 runtimes. Two + // This used to render the expanded probe path for all 31 runtimes. Two // problems with putting that on a screen. It carries the account name // (`/Users//...`) into every screenshot, screen-share and pasted // issue of an empty dashboard, which is the rule the detector surface diff --git a/clawmetry/static/js/gw-setup.js b/clawmetry/static/js/gw-setup.js index 66e6d0d7be..6682a2fb50 100644 --- a/clawmetry/static/js/gw-setup.js +++ b/clawmetry/static/js/gw-setup.js @@ -1,7 +1,7 @@ // Gateway connection — headless only. Every manual gateway-token UI is gone: // the auto-popping "ClawMetry Setup" wizard (v0.1-era UX from when ClawMetry // only watched the OpenClaw gateway) and the opt-in Developer > Gateway form -// that replaced it. The product detects 30+ runtimes automatically and the +// that replaced it. The product detects 31+ runtimes automatically and the // gateway token itself is auto-detected server-side from // ~/.openclaw/openclaw.json, so there is nothing left for a user to fill in. // What remains keeps an already-configured connection alive: a ?token=XXX URL diff --git a/clawmetry/sync.py b/clawmetry/sync.py index f61010d8b0..032226d13a 100644 --- a/clawmetry/sync.py +++ b/clawmetry/sync.py @@ -7931,6 +7931,7 @@ def _build_node_meta() -> dict: "openworker": "OpenWorker", "lovable": "Lovable", "replit": "Replit Agent", + "muse_code": "Muse Code", } @@ -14506,6 +14507,12 @@ def _build_machine_info(): # worker, not a coding CLI: its sessions are SaaS-connector work as # often as file edits. ("clawmetry_pro.adapters.openworker", "OpenWorkerAdapter"), + # Muse Code (developer.meta.com/ai/products/muse-code) -- Meta's terminal + # coding agent. The only runtime here read over a PROTOCOL rather than off + # disk: its transcript format is unpublished, but `muse serve` speaks the + # Muse Session Protocol and session/list + session/read are documented + # read-only surfaces that hand back the log path too. + ("clawmetry_pro.adapters.muse_code", "MuseCodeAdapter"), # Lovable (lovable.dev) -- cloud app builder with NO local process or # store; the adapter reads local git clones of its GitHub-synced repos # (one bot commit per accepted agent edit). Observe-only, no cost. diff --git a/clawmetry/tool_risk.py b/clawmetry/tool_risk.py index e04022d4aa..41cd6bcf6d 100644 --- a/clawmetry/tool_risk.py +++ b/clawmetry/tool_risk.py @@ -6,7 +6,7 @@ Why call-level: definition-level risk (Matimo-style "POST = medium") can't tell ``ls`` from ``rm -rf /`` — both arrive through the same shell tool on -every harness. ClawMetry sees the arguments for all 30+ runtimes at the +every harness. ClawMetry sees the arguments for all 31+ runtimes at the same normalisation point the approvals watcher uses, so the classifier runs on (canonical category, extracted command, raw args) and the SAME verdict applies to a Claude Code ``Bash``, a Codex ``shell``, a Cursor diff --git a/dashboard.py b/dashboard.py index b7732999d1..f52e5beee5 100644 --- a/dashboard.py +++ b/dashboard.py @@ -11992,7 +11992,7 @@ def _start_otlp_compat_listener(host=None, port=None, debug=False): ┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐ │ 🤖 │ READS FILES │ 🦞 │ SHOWS YOU │ 📊 │ │ Your AI agents │ ──────────-> │ │ ──────────-> │ │ - │ Any of 30 runtimes │ │ ClawMetry │ │ Your browser │ + │ Any of 31 runtimes │ │ ClawMetry │ │ Your browser │ │ │ │ Parses logs + │ │ localhost:{port} │ │ Running normally. │ │ sessions. │ │ Live dashboard │ │ Nothing changes. │ │ Serves dashboard. │ │ │ diff --git a/desktop/onboarding.py b/desktop/onboarding.py index 484156eea0..8a250c9e08 100644 --- a/desktop/onboarding.py +++ b/desktop/onboarding.py @@ -586,7 +586,7 @@ def apply_cm_key( "eyebrow": "You just installed ClawMetry.", "title": "Every AI agent on this machine, in one dashboard.", "body": ( - "Watch spend, sessions, and errors across 30+ runtimes in real time. " + "Watch spend, sessions, and errors across 31+ runtimes in real time. " "Cost breakdowns per model, per skill, per session. Loop detection. " "Budget alerts. All read-only, all local, all yours." ), diff --git a/docs/BRING_YOUR_OWN_AGENT.md b/docs/BRING_YOUR_OWN_AGENT.md index 087dd70420..ad831bccea 100644 --- a/docs/BRING_YOUR_OWN_AGENT.md +++ b/docs/BRING_YOUR_OWN_AGENT.md @@ -1,6 +1,6 @@ # Bring your own agent: OpenTelemetry ingestion end to end -ClawMetry ships adapters for 30 agent runtimes with local footprints (Claude Code, Codex, Cursor, OpenClaw and friends). This guide covers everything else: **any agent that speaks OpenTelemetry**, including fleets you do not run on your laptop. +ClawMetry ships adapters for 31 agent runtimes with local footprints (Claude Code, Codex, Cursor, OpenClaw and friends). This guide covers everything else: **any agent that speaks OpenTelemetry**, including fleets you do not run on your laptop. Who this is for: diff --git a/docs/CONTEXT_BLOWOUT.md b/docs/CONTEXT_BLOWOUT.md index c98c3c3e81..05545de1b9 100644 --- a/docs/CONTEXT_BLOWOUT.md +++ b/docs/CONTEXT_BLOWOUT.md @@ -29,7 +29,7 @@ burns money without making progress. A utilization percentage is only as honest as what it divides by. Until recently ClawMetry's resolver knew exactly two numbers, both Anthropic's: -200K, and 1M for the `[1m]` variants. It used them for all 30 runtimes. +200K, and 1M for the `[1m]` variants. It used them for all 31 runtimes. The failures were symmetric, and both looked plausible on screen: - a **300K-token GPT-5 turn** rendered as *">100%, blown"*. GPT-5's window is diff --git a/docs/OVERHEAD.md b/docs/OVERHEAD.md index 38737e34ba..2cf72824ed 100644 --- a/docs/OVERHEAD.md +++ b/docs/OVERHEAD.md @@ -15,7 +15,7 @@ | Path | Added latency to your agent | Default? | |------|-----------------------------|----------| -| Session-file tailing (how ClawMetry observes all 30 runtimes) | **0**. Separate process, no ClawMetry code in the agent | **on** | +| Session-file tailing (how ClawMetry observes all 31 runtimes) | **0**. Separate process, no ClawMetry code in the agent | **on** | | HTTP interceptor (`CLAWMETRY_INTERCEPT=1`) | **+0.44 ms** per LLM call (wall p50), +0.36 ms CPU | off | | Pre-tool hook gate, warm cache | **+44 ms** per gated tool call, over a 36 ms interpreter floor | off | | Pre-tool hook gate, 60s cache refresh | **+189 ms** on the one call that trips it, network-bound | off | diff --git a/docs/RUNTIME_SCREENSHOTS.md b/docs/RUNTIME_SCREENSHOTS.md index 7890e2e195..f88841cfcb 100644 --- a/docs/RUNTIME_SCREENSHOTS.md +++ b/docs/RUNTIME_SCREENSHOTS.md @@ -1,6 +1,6 @@ # ClawMetry × your runtime — screenshot gallery -ClawMetry auto-detects 30 agent runtimes with zero config. This gallery shows the dashboard observing **real sessions** from each supported runtime: the runtime switcher scopes every tab (sessions, transcripts, cost, activity) to the agent you pick. +ClawMetry auto-detects 31 agent runtimes with zero config. This gallery shows the dashboard observing **real sessions** from each supported runtime: the runtime switcher scopes every tab (sessions, transcripts, cost, activity) to the agent you pick. > Every screenshot below is the real dashboard rendering a real ClawMetry instance. The 2026-08 refresh: each runtime's store was populated with a showcase project written in that runtime's **native on-disk session format** (schema-verified against the production adapters — 12 sessions per runtime, each building an app for a social cause: clean water, safer roads, food security, and more), plus live Claude Code and OpenClaw sessions captured on a real machine. Alerts, approvals, and quality data come from the product's own evaluators running against that store. diff --git a/docs/blueprints/quality-cloud-parity.md b/docs/blueprints/quality-cloud-parity.md index ac1dd19e42..0c74e54e3c 100644 --- a/docs/blueprints/quality-cloud-parity.md +++ b/docs/blueprints/quality-cloud-parity.md @@ -185,7 +185,7 @@ touching function signatures. ### ADR-003: Calibration thresholds hoisted to slice root, not per-card Context: the first version of the snapshot slice embedded the full calibration -thresholds in every per-runtime card. At 30 runtimes the thresholds were +thresholds in every per-runtime card. At 31 runtimes the thresholds were repeated 14 times; each copy was byte-identical. The thresholds made up roughly a quarter of the slice by size. diff --git a/docs/compatibility.md b/docs/compatibility.md index 7541b4ed5d..04e67664bb 100644 --- a/docs/compatibility.md +++ b/docs/compatibility.md @@ -1,6 +1,6 @@ # Runtime / Agent Compatibility -ClawMetry observes 30 AI-agent runtimes. Each runtime that +ClawMetry observes 31 AI-agent runtimes. Each runtime that isn't OpenClaw ships a dedicated reader adapter (`clawmetry/adapters/`) that translates its native session format into ClawMetry's unified Session/Event shapes; the daemon then ingests them into the same local DuckDB store and cloud @@ -47,6 +47,7 @@ See [`NUMBAT.md`](NUMBAT.md). | Lovable | Beta adapter | A local git clone of the Lovable-synced GitHub repo — Lovable's agent runs entirely in the vendor cloud, and its GitHub two-way sync writes one bot commit per accepted agent edit, so the clone is a real per-edit activity record (`CLAWMETRY_LOVABLE_DIRS` points at clone roots) | One session per project, one event per accepted edit, with the prompting teammate attributed from the co-author trailer. **No tokens, model or cost:** Lovable bills credits in the vendor cloud and none of it reaches the clone, so no spend is reported rather than a derived guess. Data is only as fresh as the last `git fetch`, which the session states. No liveness claims and no per-session control: nothing runs locally. | | Replit Agent | Beta adapter | One `transcript.jsonl` journal per session under `/.local/state/replit/agent/transcript//` — the agent loop runs on Replit's infrastructure but serializes into the Repl workspace, so the daemon reads it from inside the Repl (`pip install clawmetry` in the workspace shell) or over a clone (`CLAWMETRY_REPLIT_ROOTS`) | Full transcripts with tool calls (write/edit/bash/screenshot vocabulary), typed prompts extracted from the injected wrapper, structural tool errors. **No tokens, model, cost or timestamps in the workspace journal:** Replit bills effort-based checkpoints server-side, so no spend is reported rather than a derived guess, and session times come from file mtimes with the basis declared. No per-session pause/stop/kill: the loop is not a workspace process. | | OpenWorker | Beta adapter | A SQLite index plus one append-only JSONL per session under `~/.config/coworker/` (`$COWORKER_STATE_DIR`, or `%APPDATA%\coworker` on Windows). The same `coworker.db` file holds both the session index and the audit log | Sessions, events, cost and sub-agents. The token split rides a per-message sidecar tagged with the model that produced that turn, so a session that switches models is priced per model. OpenWorker writes no dollars, so cost is always derived and never reported. Team workers carry their lead session, which becomes real sub-agent lineage. The audit log's token columns meter the Auto-Approve reviewer rather than the agent, so they are excluded from session cost. Per-session pause and stop are not offered: one desktop process serves every session. | +| Muse Code | Beta adapter | **No on-disk format to read.** Muse Code publishes no session-log schema; its transcript is served over the Muse Session Protocol (MSP), so the adapter spawns `muse serve` and calls the two documented read-only surfaces — `session/list` ("read-only, never touches leases") and `session/read` (a point-in-time cold read that never subscribes). MSP also reports each session's own durable log path, so nothing is guessed. Override the muse home with `CLAWMETRY_MUSE_HOME` and the binary with `CLAWMETRY_MUSE_BIN` | Sessions, full transcripts (messages, native reasoning, tool calls, user shell, sub-agents, compaction), fork lineage and cost. Per-model-call token counters ride each transcript item, tagged with the session's model, so cost is derived at published Muse Spark rates — Muse writes no dollars. Two honest gaps: MSP's *counted-once* prompt total, which resolves whether cached tokens sit inside or beside the input count, rides a live view notification a cold read does not serve, so the input figure is the raw provider counter and cached tokens are never added to it; and the protocol reports no pid anywhere, so Pause/Stop/Kill are not offered rather than offered and inert. The adapter calls only `initialize`, `session/list` and `session/read`, and requests no capabilities — in particular not `userShell`, which would let the connection run commands in the workspace. | | ZeroClaw / TrustClaw / Nanobot | Not yet | unverified | Open an issue with a real session capture. | OpenClaw, NVIDIA NemoClaw and Goose are free in the OSS package — their diff --git a/docs/i18n/el/README.md b/docs/i18n/el/README.md index 47b2b90215..1c60efd33b 100644 --- a/docs/i18n/el/README.md +++ b/docs/i18n/el/README.md @@ -13,7 +13,7 @@ ClawMetry - #5 Product of the Day on Product Hunt -**Δες τον agent σου να σκέφτεται.** Παρατήρηση σε πραγματικό χρόνο για **30 runtimes AI agent**: [OpenClaw](https://github.com/openclaw/openclaw), [NVIDIA NemoClaw](https://github.com/NVIDIA/NemoClaw), Claude Code, OpenAI Codex & 26 ακόμη. Ένας πίνακας ελέγχου για ολόκληρο τον στόλο σου από agents. +**Δες τον agent σου να σκέφτεται.** Παρατήρηση σε πραγματικό χρόνο για **31 runtimes AI agent**: [OpenClaw](https://github.com/openclaw/openclaw), [NVIDIA NemoClaw](https://github.com/NVIDIA/NemoClaw), Claude Code, OpenAI Codex & 26 ακόμη. Ένας πίνακας ελέγχου για ολόκληρο τον στόλο σου από agents. > 🌐 **Διάβασέ το στα:** [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) · [περισσότερα →](docs/i18n/) @@ -27,7 +27,7 @@ pip install clawmetry && clawmetry ![ClawMetry dashboard: every AI agent runtime on one machine with 24h and lifetime cost per agent](https://raw.githubusercontent.com/vivekchand/clawmetry/main/screenshots/hero.png) -## Λειτουργεί με 30 runtimes agent +## Λειτουργεί με 31 runtimes agent **Δωρεάν στην open source εφαρμογή:** 🦞 **[OpenClaw](https://clawmetry.com/runtimes/openclaw)** · 🟩 **[NVIDIA NemoClaw](https://clawmetry.com/nemoclaw)** · 🪿 **[Goose](https://clawmetry.com/runtimes/goose)** @@ -56,7 +56,7 @@ pip install clawmetry && clawmetry **Πώς χειρίζεται το context-window blowout σε διαφορετικά runtimes;** Ένα ποσοστό αξιοποίησης είναι τόσο ειλικρινές όσο και το μέγεθος με το οποίο διαιρεί. Το ClawMetry προσαρμόζει το μέγεθος του παραθύρου ανά provider από [έναν πίνακα που μπορείς να διαβάσεις και να στείλεις PR](clawmetry/context_windows.py), που καλύπτει Anthropic, OpenAI, Google, xAI, -DeepSeek, Kimi, Qwen, Mistral, Llama και GLM. Δεν μετρά και τα 30 runtimes με τον χάρακα ενός προμηθευτή. Αυτό έχει σημασία: ένας γύρος 300K GPT-5 βαθμολογημένος με βάση τα 200K της Anthropic διαβάζεται ως ">100%, blown" ενώ στην πραγματικότητα βρίσκεται στο 75% των 400K του GPT-5. Ο ίδιος χάρακας κρύβει έναν πραγματικά υπερχειλισμένο γύρο 130K DeepSeek ως ένα άνετο 65%. +DeepSeek, Kimi, Qwen, Mistral, Llama και GLM. Δεν μετρά και τα 31 runtimes με τον χάρακα ενός προμηθευτή. Αυτό έχει σημασία: ένας γύρος 300K GPT-5 βαθμολογημένος με βάση τα 200K της Anthropic διαβάζεται ως ">100%, blown" ενώ στην πραγματικότητα βρίσκεται στο 75% των 400K του GPT-5. Ο ίδιος χάρακας κρύβει έναν πραγματικά υπερχειλισμένο γύρο 130K DeepSeek ως ένα άνετο 65%. Κάθε παράθυρο συνοδεύεται από την προέλευσή του: `model_table`, `explicit_marker`, `observed_floor`, ή ένα ειλικρινές `default` όταν δεν γνωρίζουμε το μοντέλο. Ένα μετρητικό στοιχείο χτισμένο πάνω σε μια εικασία δεν αποδίδεται ποτέ με την ίδια αξιοπιστία όσο ένα χτισμένο πάνω σε αναζήτηση. @@ -68,7 +68,7 @@ DeepSeek, Kimi, Qwen, Mistral, Llama και GLM. Δεν μετρά και τα 3 | Διαδρομή | Προστίθεται στον agent σου | Προεπιλογή; | |---|---|---| -| Session-file tailing (και τα 30 runtimes) | **0**. Ξεχωριστή διεργασία, καθόλου κώδικας ClawMetry μέσα στον agent σου | ναι | +| Session-file tailing (και τα 31 runtimes) | **0**. Ξεχωριστή διεργασία, καθόλου κώδικας ClawMetry μέσα στον agent σου | ναι | | HTTP interceptor (`CLAWMETRY_INTERCEPT=1`) | **+0.44 ms** ανά κλήση LLM, ή 0.009% μιας κλήσης 5s | όχι | | Pre-tool hook gate (θερμή cache) | **+44 ms** ανά ελεγχόμενη κλήση εργαλείου, πάνω από ένα κατώφλι interpreter 36 ms | όχι | | Enforcement proxy | **+9.7 ms** ανά κλήση LLM | όχι | diff --git a/docs/i18n/es-419/README.md b/docs/i18n/es-419/README.md index 3bd1c44b0b..fd383d7359 100644 --- a/docs/i18n/es-419/README.md +++ b/docs/i18n/es-419/README.md @@ -13,7 +13,7 @@ ClawMetry - #5 Product of the Day on Product Hunt -**Mira pensar a tu agente.** Observabilidad en tiempo real para **30 runtimes de agentes de IA**: [OpenClaw](https://github.com/openclaw/openclaw), [NVIDIA NemoClaw](https://github.com/NVIDIA/NemoClaw), Claude Code, OpenAI Codex y 26 más. Un solo dashboard para toda tu flota de agentes. +**Mira pensar a tu agente.** Observabilidad en tiempo real para **31 runtimes de agentes de IA**: [OpenClaw](https://github.com/openclaw/openclaw), [NVIDIA NemoClaw](https://github.com/NVIDIA/NemoClaw), Claude Code, OpenAI Codex y 26 más. Un solo dashboard para toda tu flota de agentes. > 🌐 **Lee esto en:** [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) · [más →](docs/i18n/) @@ -27,7 +27,7 @@ Se abre en **http://localhost:8900**. Cero configuración: encuentra los runtime ![ClawMetry dashboard: every AI agent runtime on one machine with 24h and lifetime cost per agent](https://raw.githubusercontent.com/vivekchand/clawmetry/main/screenshots/hero.png) -## Funciona con 30 runtimes de agentes +## Funciona con 31 runtimes de agentes **Gratis en la app de código abierto:** 🦞 **[OpenClaw](https://clawmetry.com/runtimes/openclaw)** · 🟩 **[NVIDIA NemoClaw](https://clawmetry.com/nemoclaw)** · 🪿 **[Goose](https://clawmetry.com/runtimes/goose)** @@ -55,7 +55,7 @@ Dos preguntas que vale la pena responder antes de confiar en cualquier herramien **¿Cómo maneja la explosión de la ventana de contexto entre runtimes?** -Un porcentaje de uso es tan honesto como lo que lo divide. ClawMetry dimensiona la ventana por proveedor a partir de [una tabla que puedes leer y proponer por PR](clawmetry/context_windows.py), que cubre Anthropic, OpenAI, Google, xAI, DeepSeek, Kimi, Qwen, Mistral, Llama y GLM. No mide los 30 runtimes con la regla de un solo proveedor. Eso importa: un turno de 300K de GPT-5 medido contra los 200K de Anthropic marca ">100%, explotado" cuando en realidad está al 75% de los 400K de GPT-5. La misma regla esconde un turno de DeepSeek de 130K genuinamente desbordado como un cómodo 65%. +Un porcentaje de uso es tan honesto como lo que lo divide. ClawMetry dimensiona la ventana por proveedor a partir de [una tabla que puedes leer y proponer por PR](clawmetry/context_windows.py), que cubre Anthropic, OpenAI, Google, xAI, DeepSeek, Kimi, Qwen, Mistral, Llama y GLM. No mide los 31 runtimes con la regla de un solo proveedor. Eso importa: un turno de 300K de GPT-5 medido contra los 200K de Anthropic marca ">100%, explotado" cuando en realidad está al 75% de los 400K de GPT-5. La misma regla esconde un turno de DeepSeek de 130K genuinamente desbordado como un cómodo 65%. Cada ventana viene con su procedencia: `model_table`, `explicit_marker`, `observed_floor`, o un honesto `default` cuando no conocemos el modelo. Un indicador construido sobre una suposición nunca se muestra con la misma autoridad que uno construido sobre una consulta real. @@ -65,7 +65,7 @@ ClawMetry solo puede ver eventos de compactación en algunos runtimes. Por eso ` | Ruta | Añadido a tu agente | ¿Por defecto? | |---|---|---| -| Seguimiento del archivo de sesión (los 30 runtimes) | **0**. Proceso separado, sin código de ClawMetry en tu agente | activado | +| Seguimiento del archivo de sesión (los 31 runtimes) | **0**. Proceso separado, sin código de ClawMetry en tu agente | activado | | Interceptor HTTP (`CLAWMETRY_INTERCEPT=1`) | **+0.44 ms** por llamada a LLM, o 0.009% de una llamada de 5s | desactivado | | Compuerta de hook pre-herramienta (caché caliente) | **+44 ms** por llamada a herramienta con gate, sobre un piso de intérprete de 36 ms | desactivado | | Proxy de aplicación de políticas | **+9.7 ms** por llamada a LLM | desactivado | diff --git a/docs/i18n/es/README.md b/docs/i18n/es/README.md index e1e9ad0f5b..4618ae904c 100644 --- a/docs/i18n/es/README.md +++ b/docs/i18n/es/README.md @@ -13,7 +13,7 @@ ClawMetry - #5 Product of the Day on Product Hunt -**Observa a tu agente pensar.** Observabilidad en tiempo real para **30 runtimes de agentes de IA**: [OpenClaw](https://github.com/openclaw/openclaw), [NVIDIA NemoClaw](https://github.com/NVIDIA/NemoClaw), Claude Code, OpenAI Codex y 26 más. Un solo panel para toda tu flota de agentes. +**Observa a tu agente pensar.** Observabilidad en tiempo real para **31 runtimes de agentes de IA**: [OpenClaw](https://github.com/openclaw/openclaw), [NVIDIA NemoClaw](https://github.com/NVIDIA/NemoClaw), Claude Code, OpenAI Codex y 26 más. Un solo panel para toda tu flota de agentes. > 🌐 **Lee esto en:** [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) · [más →](docs/i18n/) @@ -28,7 +28,7 @@ agentes que ya tienes, los lee en modo de solo lectura y no cambia nada de cómo ![ClawMetry dashboard: every AI agent runtime on one machine with 24h and lifetime cost per agent](https://raw.githubusercontent.com/vivekchand/clawmetry/main/screenshots/hero.png) -## Funciona con 30 runtimes de agentes +## Funciona con 31 runtimes de agentes **Gratis en la app de código abierto:** 🦞 **[OpenClaw](https://clawmetry.com/runtimes/openclaw)** · 🟩 **[NVIDIA NemoClaw](https://clawmetry.com/nemoclaw)** · 🪿 **[Goose](https://clawmetry.com/runtimes/goose)** @@ -61,7 +61,7 @@ Dos preguntas que vale la pena responder antes de confiar en cualquier herramien Un porcentaje de utilización solo es tan honesto como aquello por lo que se divide. ClawMetry dimensiona la ventana por proveedor a partir de [una tabla que puedes leer y enviar como PR](clawmetry/context_windows.py), que cubre Anthropic, OpenAI, Google, xAI, -DeepSeek, Kimi, Qwen, Mistral, Llama y GLM. No mide los 30 +DeepSeek, Kimi, Qwen, Mistral, Llama y GLM. No mide los 31 runtimes con la regla de un solo proveedor. Eso importa: un turno de GPT-5 de 300K comparado con los 200K de Anthropic se lee como ">100%, desbordado" cuando en realidad está al 75% de los 400K de GPT-5. La misma regla oculta un turno de DeepSeek @@ -81,7 +81,7 @@ ClawMetry solo puede ver eventos de compactación en algunos runtimes. Por eso | Ruta | Añadido a tu agente | ¿Por defecto? | |---|---|---| -| Seguimiento de archivos de sesión (los 30 runtimes) | **0**. Proceso separado, sin código de ClawMetry en tu agente | activado | +| Seguimiento de archivos de sesión (los 31 runtimes) | **0**. Proceso separado, sin código de ClawMetry en tu agente | activado | | Interceptor HTTP (`CLAWMETRY_INTERCEPT=1`) | **+0.44 ms** por llamada al LLM, o 0.009% de una llamada de 5s | desactivado | | Puerta de enganche pre-herramienta (caché caliente) | **+44 ms** por llamada a herramienta con puerta, sobre un piso de intérprete de 36 ms | desactivado | | Proxy de cumplimiento | **+9.7 ms** por llamada al LLM | desactivado | diff --git a/docs/i18n/fil/README.md b/docs/i18n/fil/README.md index 924ca63d23..7bbea2c81d 100644 --- a/docs/i18n/fil/README.md +++ b/docs/i18n/fil/README.md @@ -13,7 +13,7 @@ ClawMetry - #5 Product of the Day on Product Hunt -**Makita mo ang pag-iisip ng iyong agent.** Real-time na observability para sa **30 AI agent runtimes**: [OpenClaw](https://github.com/openclaw/openclaw), [NVIDIA NemoClaw](https://github.com/NVIDIA/NemoClaw), Claude Code, OpenAI Codex at 26 pa. Isang dashboard para sa buong fleet ng iyong mga agent. +**Makita mo ang pag-iisip ng iyong agent.** Real-time na observability para sa **31 AI agent runtimes**: [OpenClaw](https://github.com/openclaw/openclaw), [NVIDIA NemoClaw](https://github.com/NVIDIA/NemoClaw), Claude Code, OpenAI Codex at 26 pa. Isang dashboard para sa buong fleet ng iyong mga agent. > 🌐 **Basahin ito sa:** [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) · [higit pa →](docs/i18n/) @@ -27,7 +27,7 @@ Magbubukas sa **http://localhost:8900**. Zero config: hinahanap nito ang mga age ![ClawMetry dashboard: every AI agent runtime on one machine with 24h and lifetime cost per agent](https://raw.githubusercontent.com/vivekchand/clawmetry/main/screenshots/hero.png) -## Gumagana sa 30 agent runtimes +## Gumagana sa 31 agent runtimes **Libre sa open source app:** 🦞 **[OpenClaw](https://clawmetry.com/runtimes/openclaw)** · 🟩 **[NVIDIA NemoClaw](https://clawmetry.com/nemoclaw)** · 🪿 **[Goose](https://clawmetry.com/runtimes/goose)** diff --git a/docs/i18n/fr/README.md b/docs/i18n/fr/README.md index 45fc66887b..e2d444bc93 100644 --- a/docs/i18n/fr/README.md +++ b/docs/i18n/fr/README.md @@ -13,7 +13,7 @@ ClawMetry - #5 Product of the Day on Product Hunt -**Regardez votre agent réfléchir.** Observabilité en temps réel pour **30 runtimes d'agents IA** : [OpenClaw](https://github.com/openclaw/openclaw), [NVIDIA NemoClaw](https://github.com/NVIDIA/NemoClaw), Claude Code, OpenAI Codex et 26 autres. Un seul tableau de bord pour toute votre flotte d'agents. +**Regardez votre agent réfléchir.** Observabilité en temps réel pour **31 runtimes d'agents IA** : [OpenClaw](https://github.com/openclaw/openclaw), [NVIDIA NemoClaw](https://github.com/NVIDIA/NemoClaw), Claude Code, OpenAI Codex et 26 autres. Un seul tableau de bord pour toute votre flotte d'agents. > 🌐 **Lire ceci en :** [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) · [plus →](docs/i18n/) @@ -28,7 +28,7 @@ d'agents que vous avez déjà, les lit en lecture seule, et ne change rien à le ![ClawMetry dashboard: every AI agent runtime on one machine with 24h and lifetime cost per agent](https://raw.githubusercontent.com/vivekchand/clawmetry/main/screenshots/hero.png) -## Compatible avec 30 runtimes d'agents +## Compatible avec 31 runtimes d'agents **Gratuit dans l'application open source :** 🦞 **[OpenClaw](https://clawmetry.com/runtimes/openclaw)** · 🟩 **[NVIDIA NemoClaw](https://clawmetry.com/nemoclaw)** · 🪿 **[Goose](https://clawmetry.com/runtimes/goose)** @@ -64,7 +64,7 @@ de comparaison d'agents. Un pourcentage d'utilisation n'est honnête que si son dénominateur l'est. ClawMetry dimensionne la fenêtre par fournisseur à partir d'[une table que vous pouvez lire et proposer en PR](clawmetry/context_windows.py), couvrant Anthropic, OpenAI, Google, xAI, -DeepSeek, Kimi, Qwen, Mistral, Llama et GLM. Il ne mesure pas les 30 +DeepSeek, Kimi, Qwen, Mistral, Llama et GLM. Il ne mesure pas les 31 runtimes avec la règle d'un seul fournisseur. C'est important : un tour GPT-5 de 300K comparé aux 200K d'Anthropic affiche ">100%, explosé" alors qu'il n'est en réalité qu'à 75% des 400K de GPT-5. La même règle masque un tour DeepSeek de 130K réellement en dépassement @@ -84,7 +84,7 @@ aveugle le dit clairement. [Détail complet](docs/CONTEXT_BLOWOUT.md) | Chemin | Ajouté à votre agent | Par défaut ? | |---|---|---| -| Suivi des fichiers de session (les 30 runtimes) | **0**. Processus séparé, aucun code ClawMetry dans votre agent | activé | +| Suivi des fichiers de session (les 31 runtimes) | **0**. Processus séparé, aucun code ClawMetry dans votre agent | activé | | Intercepteur HTTP (`CLAWMETRY_INTERCEPT=1`) | **+0,44 ms** par appel LLM, soit 0,009% d'un appel de 5s | désactivé | | Passerelle de hook pré-outil (cache chaud) | **+44 ms** par appel d'outil filtré, au-delà d'un plancher d'interpréteur de 36 ms | désactivé | | Proxy d'application des règles | **+9,7 ms** par appel LLM | désactivé | diff --git a/docs/i18n/nl/README.md b/docs/i18n/nl/README.md index d41034304c..de1f836b1d 100644 --- a/docs/i18n/nl/README.md +++ b/docs/i18n/nl/README.md @@ -63,7 +63,7 @@ Een gebruikspercentage is alleen zo eerlijk als waar het door gedeeld wordt. ClawMetry bepaalt de venstergrootte per provider vanuit [een tabel die je kunt lezen en waar je een PR op kunt indienen](clawmetry/context_windows.py), met dekking voor Anthropic, OpenAI, Google, xAI, DeepSeek, Kimi, Qwen, -Mistral, Llama en GLM. Het meet niet alle 30 runtimes met de liniaal van +Mistral, Llama en GLM. Het meet niet alle 31 runtimes met de liniaal van één leverancier. Dat is belangrijk: een beurt van 300K tokens bij GPT-5, afgezet tegen Anthropics 200K, leest als ">100%, geblazen" terwijl het in werkelijkheid op 75% van GPT-5's 400K zit. Diezelfde liniaal verbergt een @@ -84,7 +84,7 @@ betekent, zegt dat ook. [Volledige details](docs/CONTEXT_BLOWOUT.md) | Pad | Toegevoegd aan je agent | Standaard? | |---|---|---| -| Session-file tailing (alle 30 runtimes) | **0**. Apart proces, geen ClawMetry-code in je agent | aan | +| Session-file tailing (alle 31 runtimes) | **0**. Apart proces, geen ClawMetry-code in je agent | aan | | HTTP-interceptor (`CLAWMETRY_INTERCEPT=1`) | **+0,44 ms** per LLM-aanroep, oftewel 0,009% van een aanroep van 5 s | uit | | Pre-tool hook gate (warme cache) | **+44 ms** per gepoorte tool-aanroep, boven op een interpretervloer van 36 ms | uit | | Enforcement proxy | **+9,7 ms** per LLM-aanroep | uit | diff --git a/docs/i18n/pt-BR/README.md b/docs/i18n/pt-BR/README.md index 1d32bdcc60..3483789acc 100644 --- a/docs/i18n/pt-BR/README.md +++ b/docs/i18n/pt-BR/README.md @@ -13,7 +13,7 @@ ClawMetry - #5 Product of the Day on Product Hunt -**Veja seu agente pensar.** Observabilidade em tempo real para **30 runtimes de agentes de IA**: [OpenClaw](https://github.com/openclaw/openclaw), [NVIDIA NemoClaw](https://github.com/NVIDIA/NemoClaw), Claude Code, OpenAI Codex e mais 26. Um único painel para toda a sua frota de agentes. +**Veja seu agente pensar.** Observabilidade em tempo real para **31 runtimes de agentes de IA**: [OpenClaw](https://github.com/openclaw/openclaw), [NVIDIA NemoClaw](https://github.com/NVIDIA/NemoClaw), Claude Code, OpenAI Codex e mais 26. Um único painel para toda a sua frota de agentes. > 🌐 **Leia isto em:** [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) · [mais →](docs/i18n/) @@ -28,7 +28,7 @@ agentes que você já tem, os lê em modo somente leitura e não muda nada em co ![ClawMetry dashboard: every AI agent runtime on one machine with 24h and lifetime cost per agent](https://raw.githubusercontent.com/vivekchand/clawmetry/main/screenshots/hero.png) -## Funciona com 30 runtimes de agentes +## Funciona com 31 runtimes de agentes **Gratuito no app open source:** 🦞 **[OpenClaw](https://clawmetry.com/runtimes/openclaw)** · 🟩 **[NVIDIA NemoClaw](https://clawmetry.com/nemoclaw)** · 🪿 **[Goose](https://clawmetry.com/runtimes/goose)** @@ -63,7 +63,7 @@ Uma porcentagem de utilização só é honesta quanto ao denominador que usa. O ClawMetry dimensiona a janela por provedor a partir de [uma tabela que você pode ler e enviar um PR](clawmetry/context_windows.py), cobrindo Anthropic, OpenAI, Google, xAI, DeepSeek, Kimi, Qwen, Mistral, Llama e GLM. Ele não mede -os 30 runtimes com a régua de um único fornecedor. Isso importa: um turno de +os 31 runtimes com a régua de um único fornecedor. Isso importa: um turno de 300K do GPT-5 avaliado contra os 200K da Anthropic mostra ">100%, estourado" quando na verdade está em 75% dos 400K do GPT-5. A mesma régua esconde um turno do DeepSeek genuinamente estourado em 130K como um confortável 65%. @@ -82,7 +82,7 @@ isso `GET /api/context-coverage` informa, por runtime, se um **zero significa | Caminho | Adicionado ao seu agente | Padrão? | |---|---|---| -| Leitura contínua do arquivo de sessão (todos os 30 runtimes) | **0**. Processo separado, nenhum código do ClawMetry no seu agente | ligado | +| Leitura contínua do arquivo de sessão (todos os 31 runtimes) | **0**. Processo separado, nenhum código do ClawMetry no seu agente | ligado | | Interceptor HTTP (`CLAWMETRY_INTERCEPT=1`) | **+0,44 ms** por chamada de LLM, ou 0,009% de uma chamada de 5s | desligado | | Gate de hook pré-ferramenta (cache aquecido) | **+44 ms** por chamada de ferramenta com gate, sobre um piso de interpretador de 36 ms | desligado | | Proxy de enforcement | **+9,7 ms** por chamada de LLM | desligado | diff --git a/docs/i18n/pt-PT/README.md b/docs/i18n/pt-PT/README.md index f5bf8b44d9..d24a48c0d6 100644 --- a/docs/i18n/pt-PT/README.md +++ b/docs/i18n/pt-PT/README.md @@ -13,7 +13,7 @@ ClawMetry - #5 Product of the Day on Product Hunt -**Veja o seu agente pensar.** Observabilidade em tempo real para **30 runtimes de agentes de IA**: [OpenClaw](https://github.com/openclaw/openclaw), [NVIDIA NemoClaw](https://github.com/NVIDIA/NemoClaw), Claude Code, OpenAI Codex e mais 26. Um único painel para toda a sua frota de agentes. +**Veja o seu agente pensar.** Observabilidade em tempo real para **31 runtimes de agentes de IA**: [OpenClaw](https://github.com/openclaw/openclaw), [NVIDIA NemoClaw](https://github.com/NVIDIA/NemoClaw), Claude Code, OpenAI Codex e mais 26. Um único painel para toda a sua frota de agentes. > 🌐 **Leia isto em:** [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) · [mais →](docs/i18n/) @@ -27,7 +27,7 @@ Abre em **http://localhost:8900**. Configuração zero: encontra os runtimes de ![ClawMetry dashboard: every AI agent runtime on one machine with 24h and lifetime cost per agent](https://raw.githubusercontent.com/vivekchand/clawmetry/main/screenshots/hero.png) -## Funciona com 30 runtimes de agentes +## Funciona com 31 runtimes de agentes **Grátis na aplicação open source:** 🦞 **[OpenClaw](https://clawmetry.com/runtimes/openclaw)** · 🟩 **[NVIDIA NemoClaw](https://clawmetry.com/nemoclaw)** · 🪿 **[Goose](https://clawmetry.com/runtimes/goose)** @@ -55,7 +55,7 @@ Duas perguntas que vale a pena responder antes de confiar em qualquer ferramenta **Como lida com o estouro da janela de contexto entre runtimes?** -Uma percentagem de utilização só é tão honesta quanto o valor pelo qual é dividida. O ClawMetry dimensiona a janela por fornecedor a partir de [uma tabela que pode ler e submeter via PR](clawmetry/context_windows.py), cobrindo Anthropic, OpenAI, Google, xAI, DeepSeek, Kimi, Qwen, Mistral, Llama e GLM. Não mede os 30 runtimes com a régua de um único fornecedor. Isso importa: um turno de 300K do GPT-5 avaliado com a régua de 200K da Anthropic lê-se como ">100%, estourado" quando na verdade está a 75% dos 400K do GPT-5. A mesma régua esconde um turno de 130K do DeepSeek genuinamente estourado como um confortável 65%. +Uma percentagem de utilização só é tão honesta quanto o valor pelo qual é dividida. O ClawMetry dimensiona a janela por fornecedor a partir de [uma tabela que pode ler e submeter via PR](clawmetry/context_windows.py), cobrindo Anthropic, OpenAI, Google, xAI, DeepSeek, Kimi, Qwen, Mistral, Llama e GLM. Não mede os 31 runtimes com a régua de um único fornecedor. Isso importa: um turno de 300K do GPT-5 avaliado com a régua de 200K da Anthropic lê-se como ">100%, estourado" quando na verdade está a 75% dos 400K do GPT-5. A mesma régua esconde um turno de 130K do DeepSeek genuinamente estourado como um confortável 65%. Cada janela é enviada com a sua proveniência: `model_table`, `explicit_marker`, `observed_floor`, ou um honesto `default` quando não conhecemos o modelo. Um indicador construído sobre uma suposição nunca é apresentado com a mesma autoridade de um construído sobre uma consulta. @@ -65,7 +65,7 @@ O ClawMetry só consegue ver eventos de compactação nalguns runtimes. Por isso | Percurso | Adicionado ao seu agente | Padrão? | |---|---|---| -| Leitura contínua de ficheiros de sessão (todos os 30 runtimes) | **0**. Processo separado, sem código do ClawMetry no seu agente | ligado | +| Leitura contínua de ficheiros de sessão (todos os 31 runtimes) | **0**. Processo separado, sem código do ClawMetry no seu agente | ligado | | Interceptor HTTP (`CLAWMETRY_INTERCEPT=1`) | **+0,44 ms** por chamada LLM, ou 0,009% de uma chamada de 5s | desligado | | Portão de hook pré-ferramenta (cache aquecida) | **+44 ms** por chamada de ferramenta controlada, sobre um piso de 36 ms do interpretador | desligado | | Proxy de aplicação | **+9,7 ms** por chamada LLM | desligado | diff --git a/docs/i18n/th/README.md b/docs/i18n/th/README.md index 5d73779a62..90b7736606 100644 --- a/docs/i18n/th/README.md +++ b/docs/i18n/th/README.md @@ -13,7 +13,7 @@ ClawMetry - #5 Product of the Day on Product Hunt -**ดูความคิดของเอเจนต์คุณแบบเรียลไทม์** ระบบสังเกตการณ์แบบเรียลไทม์สำหรับ **30 AI agent runtimes**: [OpenClaw](https://github.com/openclaw/openclaw), [NVIDIA NemoClaw](https://github.com/NVIDIA/NemoClaw), Claude Code, OpenAI Codex และอีก 26 ตัว แดชบอร์ดเดียวสำหรับกองเอเจนต์ทั้งหมดของคุณ +**ดูความคิดของเอเจนต์คุณแบบเรียลไทม์** ระบบสังเกตการณ์แบบเรียลไทม์สำหรับ **31 AI agent runtimes**: [OpenClaw](https://github.com/openclaw/openclaw), [NVIDIA NemoClaw](https://github.com/NVIDIA/NemoClaw), Claude Code, OpenAI Codex และอีก 26 ตัว แดชบอร์ดเดียวสำหรับกองเอเจนต์ทั้งหมดของคุณ > 🌐 **อ่านภาษานี้ได้ที่:** [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) · [เพิ่มเติม →](docs/i18n/) diff --git a/routes/attention.py b/routes/attention.py index d5e3371867..1664177aa9 100644 --- a/routes/attention.py +++ b/routes/attention.py @@ -275,7 +275,7 @@ def build_attention(runtime: str = "") -> dict: "opencode", "aider", "goose", "hermes", "picoclaw", "nanoclaw", "antigravity", "copilot", "grok", "deepagents", "n8n", "pi", "qm", "deepseek_harness", "exo", "kimi", "devin", "gemini_cli", "cline", "openhands", - "openworker", "grok_bot", "lovable", "replit", + "openworker", "grok_bot", "lovable", "replit", "muse_code", }) diff --git a/routes/device.py b/routes/device.py index 2492e57647..36b842b892 100644 --- a/routes/device.py +++ b/routes/device.py @@ -344,7 +344,7 @@ def device_preview(): -
one device · all 30 runtimes
+
one device · all 31 runtimes