7fc98f8801
Previously both ReplayPlayer::state() and ::step() returned JsValue::NULL for both the expected "replay exhausted" case and the unexpected "serialisation failed" case. JavaScript callers could not distinguish the two. Now both methods return Result<JsValue, JsValue>: - step() returns Ok(null) when the replay is finished (expected sentinel) - step() and state() Err(string) when serde_wasm_bindgen fails (throws JS exception) Same fix applied to SolitaireGame::state(). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>