#pragma once
#include <chrono>
#include <condition_variable>
#include <cstdint>
#include <mutex>
#include "protocol.hpp"
namespace nethack_mcp
{
/// Own and publish complete snapshots without exposing engine memory.
class ObservationStore
{
public:
/// Construct an idle store with a stable initial snapshot.
ObservationStore();
/// Return the latest complete snapshot.
Json snapshot() const;
/// Publish a replacement snapshot and return its new revision.
std::uint64_t publish(Json snapshot);
/// Wait for a revision newer than `revision`, or return the latest state.
Json waitForRevision(
std::uint64_t revision,
std::chrono::milliseconds timeout) const;
private:
mutable std::mutex mutex_;
mutable std::condition_variable condition_;
Json snapshot_;
std::uint64_t revision_ = 0;
};
} // namespace nethack_mcp