using System; using System.Threading; using System.Threading.Tasks; namespace OpenNest.Mcp; /// Serializes tool operations sharing a mutable nesting session. public sealed class SessionToolGate : IDisposable { private readonly SemaphoreSlim gate = new(1, 1); public async ValueTask RunAsync(Func> action, CancellationToken token) { await gate.WaitAsync(token).ConfigureAwait(false); try { return await action(token).ConfigureAwait(false); } finally { gate.Release(); } } public void Dispose() => gate.Dispose(); }