Replace the flat circular buffer with NodeAwareCache, a smarter eviction
strategy for historical mesh packet data:
- Packets younger than 1 hour are never evicted (recent traffic preserved)
- Under pressure, evict from the lowest-priority type first (neighbor-info
outlasts node-info; chat messages outlast everything)
- Within a priority tier, evict from the most recently active source node —
that node will resend soonest, so its old packet is cheapest to lose
(Bélády approximation; protects flaky/distant node history)
- Node retention window still applies: silent nodes' packets are excluded
from GetAll and pruned proactively before priority eviction runs
Also:
- Add --cache-retention flag (default 3h) and raise --cache-size default to 5000
- Fix decoder error strings (replace verbose Go errors with short codes)
- Add HTTP security headers middleware to server
- Fix broker dispatchLoop deadlock on source channel close
- Fix make gen-proto scanning web/node_modules for .proto files
- Fix tools target always reinstalling protoc-gen-go (handles stale arch binary)
- Move server port from 8080 to 5446; update Dockerfile, docker-compose, moat.yaml
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add support for decoding MAP_REPORT_APP, TRACEROUTE_APP, and NEIGHBORINFO_APP messages
- Create formatters for RouteDiscovery and NeighborInfo messages
- Remove JSON output from all formatters for cleaner display
- Update tests to check for proper formatting
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Simplify design by using DecodeMessage for map format too
- Remove redundant DecodeMapReport function
- Update FormatTopicAndMapData to format decoded packets
- Improve handling of map format packets
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Added DecodeMapReport function to decode protobuf MapReport messages
- Added FormatMapReport function to display MapReport data in human-readable format
- Updated FormatTopicAndMapData to use the proper decoder and formatter
- Improved error handling with fallback to raw display
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Added handling for topics with "map" format (2/map)
- Display map data as readable text rather than hex
- Added new FormatTopicAndMapData function to formatter.go
- Added map format condition in main.go message handler
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Created new formatter.go file with all formatting functions
- Replaced deprecated FormatData with improved FormatDataMessage
- Updated main.go to separate decoding and formatting steps
- Created specialized formatting functions for different message types
- Better separation of concerns for improved maintainability
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Added DecodedPacket struct to simplify message hierarchy
- Implemented separate decoding and formatting functions for each message type
- Decoder extracts all relevant fields into a simplified structure
- Formatters now operate directly on the decoded message types
- Improved error handling during decoding and parsing
- Added type-safety via interfaces for proper packet handling
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Implemented decoders for telemetry, position, node info and waypoint data
- Refactored ServiceEnvelope decoder to use specialized formatters
- Added proper indentation for nested output formatting
- Improved error messages for failed decryption attempts
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>