//// Raw bindings to the engine-provided `aion_flow_ffi` runtime module. //// //// This module is the only place in `aion_flow` that declares //// `@external(erlang, "aion_flow_ffi", ...)` functions. The Erlang module //// name is the engine's NIF registry namespace, registered by //// `EngineBuilder::register_nifs` (AE-004) and resolved by beamr when a //// compiled workflow is loaded inside an Aion engine runtime. The query //// pump bindings at the bottom target `aion_flow_query_pump`, the plain //// Erlang module shipped inside this package. //// //// `gleam build` type-checks these signatures with no engine present. The //// author-facing modules wrap this type-erased string boundary with typed //// codecs and domain values; this module intentionally exposes only raw names, //// encoded payload/config strings, handles, and `Result(String, String)` error //// seams. @external(erlang, "aion_flow_ffi", "dispatch_activity") pub fn dispatch_activity( name: String, input: String, config: String, ) -> Result(String, String) @external(erlang, "aion_flow_ffi", "await_activity_result") pub fn await_activity_result(correlation_id: String) -> Result(String, String) @external(erlang, "aion_flow_ffi", "now") pub fn now() -> Result(String, String) @external(erlang, "aion_flow_ffi", "random") pub fn random() -> Result(String, String) @external(erlang, "aion_flow_ffi", "random_int") pub fn random_int(min: String, max: String) -> Result(String, String) @external(erlang, "aion_flow_ffi", "sleep") pub fn sleep(duration: String) -> Result(String, String) @external(erlang, "aion_flow_ffi", "start_timer") pub fn start_timer(timer_id: String, duration: String) -> Result(String, String) @external(erlang, "aion_flow_ffi", "cancel_timer") pub fn cancel_timer(timer_id: String) -> Result(String, String) @external(erlang, "aion_flow_ffi", "with_timeout") pub fn with_timeout( duration: String, operation: fn() -> Result(value, inner_error), ) -> Result(Result(value, inner_error), String) @external(erlang, "aion_flow_ffi", "continue_as_new") pub fn continue_as_new(input: String) -> Result(Nil, String) @external(erlang, "aion_flow_ffi", "receive_signal") pub fn receive_signal(name: String, config: String) -> Result(String, String) @external(erlang, "aion_flow_ffi", "send_signal") pub fn send_signal( workflow_id: String, name: String, payload: String, ) -> Result(String, String) @external(erlang, "aion_flow_ffi", "register_query") pub fn register_query(name: String, config: String) -> Result(String, String) @external(erlang, "aion_flow_ffi", "reply_query") pub fn reply_query(query_id: String, payload: String) -> Result(String, String) @external(erlang, "aion_flow_ffi", "reply_query_error") pub fn reply_query_error( query_id: String, message: String, ) -> Result(String, String) @external(erlang, "aion_flow_ffi", "dispatch_query") pub fn dispatch_query(name: String, config: String) -> Result(String, String) @external(erlang, "aion_flow_ffi", "query_recorded_observations") pub fn query_recorded_observations() -> Result(String, String) @external(erlang, "aion_flow_ffi", "spawn_child") pub fn spawn_child( workflow_name: String, input: String, config: String, ) -> Result(String, String) @external(erlang, "aion_flow_ffi", "await_child") pub fn await_child(child_id: String) -> Result(String, String) @external(erlang, "aion_flow_ffi", "collect_all") pub fn collect_all( collection_id: String, items: List(String), ) -> Result(String, String) @external(erlang, "aion_flow_ffi", "collect_race") pub fn collect_race( collection_id: String, items: List(String), ) -> Result(String, String) @external(erlang, "aion_flow_ffi", "collect_map") pub fn collect_map( collection_id: String, items: List(String), ) -> Result(String, String) @external(erlang, "aion_flow_ffi", "testing_reset") pub fn testing_reset() -> Result(String, String) @external(erlang, "aion_flow_ffi", "testing_advance") pub fn testing_advance(duration: String) -> Result(String, String) @external(erlang, "aion_flow_ffi", "testing_register_activity_mock") pub fn testing_register_activity_mock( name: String, handler: fn(String) -> Result(String, String), ) -> Result(String, String) @external(erlang, "aion_flow_ffi", "testing_register_child_mock") pub fn testing_register_child_mock( name: String, handler: fn(String) -> Result(String, String), ) -> Result(String, String) @external(erlang, "aion_flow_ffi", "testing_clear_observations") pub fn testing_clear_observations() -> Result(String, String) @external(erlang, "aion_flow_ffi", "testing_observations") pub fn testing_observations() -> Result(String, String) /// Store a query handler fun in the workflow process dictionary under the /// engine-contract key `{aion_query_handler, Name}`. The Erlang helper owns /// the raw process-dictionary types; Gleam code never touches them. @external(erlang, "aion_flow_query_pump", "register") pub fn register_query_handler( name: String, handler: fn(String) -> Result(String, String), ) -> Nil /// Service one query sentinel payload (the JSON binary after the /// `aion_query:` prefix): run the registered handler under try/catch and /// reply, converting a raise or a missing handler into a typed /// `reply_query_error`. Never crashes the workflow process. @external(erlang, "aion_flow_query_pump", "service") pub fn service_query(sentinel_payload: String) -> Nil