Skip to content

v2.23.0

Choose a tag to compare

@cheapestinference cheapestinference released this 14 Apr 10:59
· 69 commits to main since this release

Highlights

Session telemetry + control pass focused on the CMO-style workflows that live on tools.

Agent control

  • Activity-based working signal — dashboard no longer loses track of the agent when OpenClaw's compaction retry transparently swaps runs after a context overflow. 15s recent-activity window keeps the Stop button visible across short gaps.
  • Abort fallback via lastKnownRunId — Stop still aborts when activeRunId has been cleared by an intermediate error event.

Latency breakdown

  • Per-run tool count badge, gap-based tool time detection (>1s gaps = tool/wait, not generation), and effective tok/s that excludes those gaps.
  • Aggregate stats split avg latency by w/tools vs plain runs.

Errors panel

  • New reusable JsonTree component with syntax colors, depth-based collapse, long-string previews, and auto-unwrap of nested JSON strings (tool-result content[0].text renders as a sub-tree, not an escaped blob).
  • Copy button produces the flattened form you see on screen, not the wire-format with \n\" escapes.
  • Detects OpenClaw's {content, details} tool-error shape and shows details by default with a toggle for the raw wire format.

Logs

  • Fixes tslog's log.child({subsystem}).info(msg) serialization: parser now correctly extracts the message from 1 instead of rendering the tag stringified in 0 as the body. Unwraps _meta.name when it arrives as a JSON string. Fallback summary when no primary content field is populated.
  • LogDetailPanel hides the Payload section when it's just the Message repeated, and renders string payloads as preformatted blocks so CLI-table alignment survives.

Chat history stripping

  • Replaced the regex-based stripInboundMeta with a line-by-line parser ported from OpenClaw's canonical stripInboundMetadata. Handles all 6 sentinels + trailing untrusted-context suffix + timestamp prefix. Silos-specific addition strips async System (untrusted): [ts] ... lines for cleaner chat.

Task pipeline

  • Dropped the isBackgroundProcess heuristic that substring-matched pid , still running, background in tool results and created false-positive "Subagent" entries in the kanban.
  • Sidebar Tasks badge filters stale runs (status=running + startedAt >1h) so it aligns with what /tasks shows.

Included commits:

  • 18a2b2b feat(session): activity-based agent-working signal + abort fallback
  • dda8309 feat(latency): tool count, gap-based tool time, effective tok/s
  • c02cc3b feat(errors): reusable JsonTree + auto-unwrap + tool-result simplification
  • e040683 fix(logs): tslog tag unwrapping, preformatted payloads, dedup empty sections
  • 3164291 refactor(chat): port stripInboundMeta canonical parser from OpenClaw
  • eb170cd fix(tasks): stale-aware sidebar Tasks badge + drop isBackgroundProcess false-positive