Spectre.Operation.Controller behaviour (Spectre v0.3.0)

Copy Markdown View Source

Behaviour shared by Work, Vigil and library-owned operational controllers.

Controller callbacks are deterministic reducers. They run briefly inside the Agent owner; external work must be represented by a registered Spectre.Operation.Request and is executed by a temporary Runner.

A kind: :directive Definition with can_start: [:work] may return start_loops: [{:work, controller, input, opts}] from a successful apply_result/4. Each intent requires a stable :intent_id; the Agent validates and commits the parent Result and every new Work atomically. Work and Vigil controllers cannot acquire this capability.

Summary

Types

context()

@type context() :: map()

Callbacks

apply_result(term, t, t, context)

@callback apply_result(
  term(),
  Spectre.Operation.Request.t(),
  Spectre.Operation.Result.t(),
  context()
) ::
  {:ok, term()} | {:ok, term(), keyword() | map()} | {:error, term()}

apply_update(term, term, t, context)

(optional)
@callback apply_update(term(), term(), Spectre.Operation.Update.t(), context()) ::
  {:ok, term(), term()}
  | {:ok, term(), term(), keyword() | map()}
  | {:error, term()}

budget_exhausted(term, map, context)

(optional)
@callback budget_exhausted(term(), map(), context()) ::
  :terminate | {:terminate, term()} | {:terminate, term(), map() | keyword()}

checkpoint_compatible?(term, term)

(optional)
@callback checkpoint_compatible?(term(), term()) :: boolean()

complete(term, context)

@callback complete(term(), context()) ::
  :continue
  | false
  | {:complete, term()}
  | {:blocked, term()}
  | {:error, term()}

handle_trigger(term, term, context)

(optional)
@callback handle_trigger(term(), term(), context()) ::
  {:ok, term()} | {:ok, term(), keyword() | map()} | {:error, term()}

init(term, context)

@callback init(term(), context()) :: {:ok, term()} | {:error, term()}

next(term, context)

@callback next(term(), context()) ::
  {:run, Spectre.Operation.Request.t()}
  | {:run, atom() | String.t(), term()}
  | {:wait, Spectre.Operation.Wait.t()}
  | {:blocked, term()}
  | {:complete, term()}
  | {:error, term()}