frame-conv 0.2.0

Conversation patterns — request-response, subscription, pub/sub, and workflow over liminal
Documentation
//! F-3b R2 — one workflow as one durable conversation.
//!
//! A typed facade over exactly one aion workflow/run lineage: frame-conv
//! owns the participant-facing conversation vocabulary while aion owns
//! durable history, committed state, replay, reopening, and resumption
//! (design constraint 1 — wrap, never reimplement). This module persists
//! NOTHING durable of its own: no workflow state, step log, replay
//! cursor, outcome cache, dedup ledger, or shadow checkpoint. Every
//! durable question routes to aion's committed event history through the
//! pinned client surface (`aion-client`/`aion-core` `=0.10.0`).
//!
//! Concurrency shape (A1): this crate is a blocking surface; the module
//! owns one internal tokio runtime per [`WorkflowClient`] and crosses the
//! aion boundary with a parked `block_on`. Observation is event-driven
//! end to end (Ruling B): [`WorkflowObservation::next`] parks until the
//! substrate stream yields — no timer, no clock read, no re-armed wait
//! exists anywhere in this module, which therefore sits entirely OUTSIDE
//! the no-poll tripwire's clock-sanctioned seam list by construction.
//!
//! Open idempotency (the honest weaker contract, gate-filled): aion
//! 0.10.0 start has no wire-level idempotency — the explicit caller key
//! is enforced at the SDK boundary per client INSTANCE. Open is NOT
//! idempotent across process, client, or restart boundaries; a
//! double-open mints two distinct workflows, observable as two distinct
//! [`WorkflowIdentity`] values. Strengthening that is a named upstream
//! ask to aion, never a frame-conv dedup ledger.

mod client;
mod conversation;
mod error;
mod id;
mod observe;
mod outcome;

pub use client::{WorkflowAttachment, WorkflowClient};
pub use conversation::WorkflowConversation;
pub use error::{WorkflowCallError, WorkflowConnectError, WorkflowObserveError};
pub use id::{WorkflowConversationId, WorkflowIdentity, WorkflowRunId, WorkflowStepId};
pub use observe::WorkflowObservation;
pub use outcome::{
    ReopenedRun, ScheduleNote, WorkflowFailure, WorkflowInspection, WorkflowItem, WorkflowPayload,
    WorkflowPhase, WorkflowProgress, WorkflowProgressKind, WorkflowStepFailure, WorkflowTerminal,
};