record listens where the plugin is pointed (/mm ws url) and writes every
frame to a JSON-lines file; compare reports, per frame type, whether two
recordings have the same fields in the same order with the same JSON types.
A live headless run against the local server recorded register, telemetry,
vitals, chat, combat_stats, character_stats and the share_* frames, and the
unsubscribe at logout. The same tool records the DECAL plugin (point its
endpoint here) so the two can be compared.
Also ships Newtonsoft.Json beside the plugin (a class library does not copy
its package dependencies by default; the plugin failed to load without it).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The socket connects with the shared-secret header, registers first, reassembles
incoming frames of any size (the original dropped anything over 4 KiB) and
reconnects two seconds after a failure. Incoming share_* frames go to the
vital-sharing handlers; any other frame is a chat-box command for this
character, run one per tick through the chat bar as if typed. Frames are
written with Newtonsoft.Json defaults, the original's serializer, so the
backend sees the same bytes. The secret lives in the character's settings.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>