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();
}