feat: v0.6.0 — generic telemetry events, default filters, per-frame TUI updates#15
Merged
Oceanswave merged 3 commits intomainfrom Feb 5, 2026
Merged
Conversation
…UI updates All 230+ telemetry fields now produce OpenClaw events via a generic fallback emitter (PascalCase → snake_case event types). Unconfigured fields pass through DualGateFilter with sensible defaults instead of being silently dropped. Added telemetry.get read handler and MCP tool for arbitrary field reads. TUI panels now update per-frame instead of polling on a 1-second timer. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Trigger notifications are delivered exclusively via push callbacks over the OpenClaw WebSocket. Removed the polling endpoint, MCP trigger_poll tool, pending notification queue, drain_pending(), and queue_notification() from TriggerManager. Tests updated to use fire callbacks instead of drain_pending() assertions. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Port-in-use crash: pre-check with _resolve_port(), auto-select free
port when default is occupied, clear UsageError for explicit --port
- SystemExit from uvicorn caught and converted to OSError; clean
shutdown (code 0) logged at debug level and passed through
- Environment-sourced --port treated as explicit (not auto-select)
- Notification serialization guards narrowed from except Exception to
(AttributeError, TypeError, ValueError) in push callback and flush
- Pending push queue overflow logs dropped notification before eviction
- flush_pending_push guarded after reconnect so one bad notification
cannot break recovery
- system.run unknown method bumped to warning with resolved name
- contextlib.suppress replaced with explicit try/except + debug log
- p.pop("field") mutation fixed with p.get() + filtered dict copy
- _matches() renamed to matches() as public API
- Shared _internal/units.py replaces 3 duplicate temp conversions
- telemetry_get distinguishes store-unavailable from pending
- Empty exception message shows "Unexpected {Type}" + --verbose hint
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
6108d86 to
2decf37
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Features
PackVoltage→pack_voltage) withfieldandvaluepayloadDualGateFilterapplies sensible defaults (any-change, 5s throttle, 2min staleness) to unconfigured fields instead of silently dropping themtelemetry.gethandler + MCP tool — agents can read the latest value of any telemetry field from the in-memory storeNodeCapabilitiesadvertisestelemetry.get,trigger.list,trigger.create,trigger.deletetrigger.poll— trigger notifications are delivered exclusively via push callbacks over the OpenClaw WebSocket; the polling endpoint, MCP tool, and pending queue have been removedBugfixes & hardening
_resolve_port()pre-checks availability, auto-selects a free port when the default is occupied, raises clearUsageErrorfor explicit--port; environment-sourced ports treated as explicitsys.exit(1)caught by_safe_uvicorn_serve()and converted toOSError; clean shutdown (code 0) logged at debugexcept Exceptionto(AttributeError, TypeError, ValueError); per-notification isolation in both push callback and flush loopflush_pending_pushguarded after reconnectsystem.rununknown method — bumped towarningwith both raw and resolved method namescontextlib.suppresshiding bugs — replaced with explicittry/except+ debug-level loggingp.pop("field")mutating MCP params — fixed withp.get()+ filtered dict copy_matches()→matches()— renamed to public API for cross-module consumers_internal/units.py— replaces 3 duplicate temperature conversion implementationstelemetry_getstore-unavailable — returns{"error": "telemetry_store_unavailable"}instead of misleading{"pending": true}"Unexpected {Type}"+--verbosehintexc_info=Truefor traceabilityTest plan
pytest --timeout=30)ruff check src/ tests/)tests/cli/test_serve_port.py— port resolution, conflict handling, SystemExit wrapping (8 tests)tescmd serveand confirm TUI panels populate immediately on first telemetry frametescmd servewhen port 8080 is occupied — verify auto-select and log message🤖 Generated with Claude Code