// Copyright (c) Microsoft. All rights reserved.
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Agents.AI.Workflows.InProc;
namespace Microsoft.Agents.AI.Workflows;
///
/// Provides methods to initiate and manage in-process workflow executions, supporting both streaming and
/// non-streaming modes with asynchronous operations.
///
public static class InProcessExecution
{
///
/// The default InProcess execution environment.
///
public static InProcessExecutionEnvironment Default => OffThread;
///
/// An InProcessExecution environment which will run SuperSteps in a background thread, streaming
/// events out as they are raised.
///
public static InProcessExecutionEnvironment OffThread { get; } = new(ExecutionMode.OffThread);
///
/// Gets an execution environment that enables concurrent, off-thread in-process execution.
///
public static InProcessExecutionEnvironment Concurrent { get; } = new(ExecutionMode.OffThread, enableConcurrentRuns: true);
///
/// An InProcesExecution environment which will run SuperSteps in the event watching thread,
/// accumulating events during each SuperStep and streaming them out after each SuperStep is
/// completed.
///
public static InProcessExecutionEnvironment Lockstep { get; } = new(ExecutionMode.Lockstep);
///
/// An InProcessExecution environment which will not run SuperSteps directly, relying instead
/// on the hosting workflow to run them directly, while streaming events out as they are raised.
///
internal static InProcessExecutionEnvironment Subworkflow { get; } = new(ExecutionMode.Subworkflow);
///
public static ValueTask OpenStreamingAsync(Workflow workflow, string? sessionId = null, CancellationToken cancellationToken = default)
=> Default.OpenStreamingAsync(workflow, sessionId, cancellationToken);
///
public static ValueTask RunStreamingAsync(Workflow workflow, TInput input, string? sessionId = null, CancellationToken cancellationToken = default) where TInput : notnull
=> Default.RunStreamingAsync(workflow, input, sessionId, cancellationToken);
///
public static ValueTask OpenStreamingAsync(Workflow workflow, CheckpointManager checkpointManager, string? sessionId = null, CancellationToken cancellationToken = default)
=> Default.WithCheckpointing(checkpointManager).OpenStreamingAsync(workflow, sessionId, cancellationToken);
///
public static ValueTask RunStreamingAsync(Workflow workflow, TInput input, CheckpointManager checkpointManager, string? sessionId = null, CancellationToken cancellationToken = default) where TInput : notnull
=> Default.WithCheckpointing(checkpointManager).RunStreamingAsync(workflow, input, sessionId, cancellationToken);
///
public static ValueTask ResumeStreamingAsync(Workflow workflow, CheckpointInfo fromCheckpoint, CheckpointManager checkpointManager, CancellationToken cancellationToken = default)
=> Default.WithCheckpointing(checkpointManager).ResumeStreamingAsync(workflow, fromCheckpoint, cancellationToken);
///
public static ValueTask RunAsync(Workflow workflow, TInput input, string? sessionId = null, CancellationToken cancellationToken = default) where TInput : notnull
=> Default.RunAsync(workflow, input, sessionId, cancellationToken);
///
public static ValueTask RunAsync(Workflow workflow, TInput input, CheckpointManager checkpointManager, string? sessionId = null, CancellationToken cancellationToken = default) where TInput : notnull
=> Default.WithCheckpointing(checkpointManager).RunAsync(workflow, input, sessionId, cancellationToken);
///
public static ValueTask ResumeAsync(Workflow workflow, CheckpointInfo fromCheckpoint, CheckpointManager checkpointManager, CancellationToken cancellationToken = default)
=> Default.WithCheckpointing(checkpointManager).ResumeAsync(workflow, fromCheckpoint, cancellationToken);
}