// Copyright (c) Microsoft. All rights reserved. using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Microsoft.Agents.AI.Workflows.Checkpointing; using Microsoft.Shared.Diagnostics; namespace Microsoft.Agents.AI.Workflows; /// /// Represents a workflow run that supports checkpointing. /// /// The type of the underlying workflow run handle. /// /// public sealed class Checkpointed : IAsyncDisposable { private readonly ICheckpointingHandle _runner; internal Checkpointed(TRun run, ICheckpointingHandle runner) { this.Run = Throw.IfNull(run); this._runner = Throw.IfNull(runner); } /// /// Gets the workflow run associated with this instance. /// /// /// public TRun Run { get; } /// public IReadOnlyList Checkpoints => this._runner.Checkpoints; /// /// Gets the most recent checkpoint information. /// public CheckpointInfo? LastCheckpoint { get { var checkpoints = this.Checkpoints; return checkpoints.Count > 0 ? checkpoints[checkpoints.Count - 1] : null; } } /// public async ValueTask DisposeAsync() { if (this.Run is IAsyncDisposable asyncDisposable) { await asyncDisposable.DisposeAsync().ConfigureAwait(false); } else if (this.Run is IDisposable disposable) { disposable.Dispose(); } } /// public ValueTask RestoreCheckpointAsync(CheckpointInfo checkpointInfo, CancellationToken cancellationToken = default) => this._runner.RestoreCheckpointAsync(checkpointInfo, cancellationToken); }