Repository F# setup
open System
open System.IO
open System.Threading
open System.Threading.Tasks
open Axial
open Axial.Layers
open Axial.Console
open Axial.FileSystem
open Axial.Hosting
open Axial.Hosting.Browser
open Axial.Hosting.Node
open Axial.HttpClient
open Axial.PlatformService
open Axial.Process
open Axial.State
open Axial.Telemetry
open Axial.Telemetry.JavaScript

Axial.Process represents external work as an immutable ProcessSpec. Building a specification performs no I/O. Process.run asks the IProcess service to interpret it in the current Flow runtime.

open Axial.Process

let version =
    Process.command "dotnet" [ "--version" ]
    |> Process.timeout (TimeSpan.FromSeconds 10)
    |> Process.run

Process.command creates a runnable one-stage specification. Configuration functions return updated values, and Process.pipe connects specifications through real standard streams. Process.run returns Flow<#IHasProcess, ProcessError, ProcessResult>; Process.stream returns output and completion events with backpressure.

The live interpreter receives its operational dependencies explicitly:

let process = Process.live clock fileSystem console

Supply it by implementing IHasProcess on the environment given to the workflow:

type AppEnv =
    { Processes: IProcess }
    interface IHasProcess with member this.Process = this.Processes

Flow owns scheduling, cancellation, timeout racing, and scope cleanup. The live interpreter translates interruption into process-tree termination and cleans up every stage that started, including partial startup.

Guides