# `CliSubprocessCore.Session.Options`
[🔗](https://github.com/nshkrdotcom/cli_subprocess_core/blob/v0.1.0/lib/cli_subprocess_core/session/options.ex#L1)

Validated startup options for the common session engine.

# `subscriber`

```elixir
@type subscriber() :: pid() | {pid(), :legacy | reference()} | nil
```

# `t`

```elixir
@type t() :: %CliSubprocessCore.Session.Options{
  boundary_class: ExternalRuntimeTransport.ExecutionSurface.boundary_class(),
  lease_ref: String.t() | nil,
  metadata: map(),
  observability: map(),
  profile: module() | nil,
  provider: atom(),
  provider_options: keyword(),
  registry: pid() | atom(),
  session_event_tag: atom(),
  starter: {pid(), reference()} | nil,
  subscriber: subscriber(),
  surface_kind: ExternalRuntimeTransport.Transport.surface_kind(),
  surface_ref: String.t() | nil,
  target_id: String.t() | nil,
  transport_options: keyword()
}
```

# `validation_error`

```elixir
@type validation_error() ::
  :missing_provider
  | {:invalid_provider, term()}
  | {:invalid_profile, term()}
  | {:provider_profile_mismatch, atom(), atom()}
  | {:invalid_registry, term()}
  | {:unsupported_option, :transport_selector}
  | {:invalid_subscriber, term()}
  | {:invalid_metadata, term()}
  | {:invalid_session_event_tag, term()}
  | {:invalid_surface_kind, term()}
  | {:invalid_transport_options, term()}
  | {:invalid_target_id, term()}
  | {:invalid_lease_ref, term()}
  | {:invalid_surface_ref, term()}
  | {:invalid_boundary_class, term()}
  | {:invalid_observability, term()}
  | {:invalid_starter, term()}
```

# `execution_surface`

```elixir
@spec execution_surface(t()) :: ExternalRuntimeTransport.ExecutionSurface.t()
```

# `new`

```elixir
@spec new(keyword()) :: {:ok, t()} | {:error, validation_error()}
```

Builds a validated session options struct.

Reserved session keys stay on the struct while all remaining keys are passed
through to the selected provider profile as `provider_options`.

# `new!`

```elixir
@spec new!(keyword()) :: t()
```

Builds a validated session options struct or raises.

# `provider_profile_options`

```elixir
@spec provider_profile_options(t()) :: keyword()
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
