reasoninglayer 0.1.2

Rust client SDK for the Reasoning Layer API
Documentation
//! Rust client SDK for the [Reasoning Layer](https://github.com/kortexya/reasoninglayer) API.
//!
//! The SDK is a direct port of the TypeScript SDK (`@kortexya/reasoninglayer`) — it speaks the
//! same HTTP contract, sends the same auth headers, follows the same retry / backoff rules, and
//! exposes the same resource surface. Method naming follows Rust conventions (`snake_case`), with
//! [`ReasoningLayerClient`] as the single entry point.
//!
//! # Quick start
//!
//! ```no_run
//! # async fn run() -> Result<(), reasoninglayer::Error> {
//! use reasoninglayer::{psi, var, guard, constrained, GuardOp,
//!     ClientConfig, ReasoningLayerClient, CreateSortRequest,
//!     AddRuleRequest, BackwardChainRequest};
//!
//! let client = ReasoningLayerClient::new(
//!     ClientConfig::new("http://localhost:8083", "00000000-0000-0000-0000-000000000001"),
//! )?;
//!
//! let person = client.sorts().create_sort(CreateSortRequest::with_name("person"), None).await?;
//! client.inference().add_rule(
//!     AddRuleRequest {
//!         term: psi("well_paid", [("person", var("?X"))]),
//!         antecedents: vec![psi("employee", [
//!             ("name", var("?X")),
//!             ("salary", constrained("?S", guard(GuardOp::Gt, 80_000_i64))),
//!         ])],
//!         certainty: None,
//!     },
//!     None,
//! ).await?;
//! # let _ = person; Ok(()) }
//! ```
//!
//! # Resources
//!
//! Every resource client is accessible via an accessor on [`ReasoningLayerClient`]:
//!
//! - **Core knowledge base:** [`sorts()`](ReasoningLayerClient::sorts) / [`types()`](ReasoningLayerClient::types),
//!   [`terms()`](ReasoningLayerClient::terms) / [`records()`](ReasoningLayerClient::records),
//!   [`inference()`](ReasoningLayerClient::inference) / [`rules()`](ReasoningLayerClient::rules),
//!   [`query()`](ReasoningLayerClient::query)
//! - **AI / ML:** [`cognitive()`](ReasoningLayerClient::cognitive) / [`agents()`](ReasoningLayerClient::agents),
//!   [`oversight()`](ReasoningLayerClient::oversight), [`neuro_symbolic()`](ReasoningLayerClient::neuro_symbolic),
//!   [`rag()`](ReasoningLayerClient::rag), [`generation()`](ReasoningLayerClient::generation),
//!   [`synthetic()`](ReasoningLayerClient::synthetic), [`proof_engine()`](ReasoningLayerClient::proof_engine),
//!   [`context()`](ReasoningLayerClient::context), [`rl_training()`](ReasoningLayerClient::rl_training)
//! - **Reasoning:** [`optimize()`](ReasoningLayerClient::optimize), [`ilp()`](ReasoningLayerClient::ilp),
//!   [`cdl()`](ReasoningLayerClient::cdl), [`execution()`](ReasoningLayerClient::execution),
//!   [`reasoning()`](ReasoningLayerClient::reasoning), [`preferences()`](ReasoningLayerClient::preferences),
//!   [`discovery()`](ReasoningLayerClient::discovery)
//! - **Analysis:** [`causal()`](ReasoningLayerClient::causal), [`statistical()`](ReasoningLayerClient::statistical),
//!   [`fuzzy()`](ReasoningLayerClient::fuzzy), [`scenarios()`](ReasoningLayerClient::scenarios),
//!   [`communities()`](ReasoningLayerClient::communities), [`visualization()`](ReasoningLayerClient::visualization),
//!   [`analysis()`](ReasoningLayerClient::analysis)
//! - **Data:** [`ingestion()`](ReasoningLayerClient::ingestion), [`extract()`](ReasoningLayerClient::extract),
//!   [`sources()`](ReasoningLayerClient::sources), [`collections()`](ReasoningLayerClient::collections),
//!   [`image_extraction()`](ReasoningLayerClient::image_extraction), [`row()`](ReasoningLayerClient::row)
//! - **Workflow:** [`control()`](ReasoningLayerClient::control), [`reviews()`](ReasoningLayerClient::reviews),
//!   [`action_reviews()`](ReasoningLayerClient::action_reviews), [`webhook_actions()`](ReasoningLayerClient::webhook_actions)
//! - **System:** [`health()`](ReasoningLayerClient::health), [`admin()`](ReasoningLayerClient::admin),
//!   [`spaces()`](ReasoningLayerClient::spaces), [`namespaces()`](ReasoningLayerClient::namespaces),
//!   [`utilities()`](ReasoningLayerClient::utilities), [`ontology()`](ReasoningLayerClient::ontology),
//!   [`osfql()`](ReasoningLayerClient::osfql), [`ui()`](ReasoningLayerClient::ui),
//!   [`conversation()`](ReasoningLayerClient::conversation), [`research()`](ReasoningLayerClient::research),
//!   [`functions()`](ReasoningLayerClient::functions)
//!
//! # Coverage phases
//!
//! - **Phase 1 (this crate, stable):** sorts, terms, inference, query with fully typed DTOs, builders,
//!   retry / timeout / auth / error mapping.
//! - **Phase 2 (this crate, typed where obvious, [`serde_json::Value`] otherwise):** every other
//!   resource has an HTTP client exposed at the right path with the right verb. The wire contract is
//!   identical to the TypeScript SDK. Typed DTOs for the Phase 2 resources are landing in patch
//!   releases — subscribe to the repo for the upgrade path. Users can always deserialize the
//!   returned `Value` into their own types.
//! - **WebSocket + SSE:** exposed via [`ws::WebSocketConnection`] and [`sse::stream`].

#![cfg_attr(docsrs, feature(doc_cfg))]

mod client;
mod config;
mod error;
mod http;
mod resources;
mod resources_phase2;

pub mod builders;
pub mod sse;
pub mod types;
pub mod ws;

// ─── Main entry points ────────────────────────────────────────────────────────
pub use client::ReasoningLayerClient;
pub use config::{ClientConfig, SDK_LANGUAGE, SDK_VERSION};
pub use error::{ApiError, ApiErrorKind, ConstraintViolationDetails, Error, RateLimitDetails};

// ─── Resource clients ─────────────────────────────────────────────────────────
pub use resources::{
    AdminClient, AnalysisClient, ContextClient, DiscoveryClient, ExtractClient, FunctionsClient,
    GenerationClient, HealthClient, ImageExtractionClient, InferenceClient, OntologyClient,
    OptimizeClient, OsfqlClient, PreferencesClient, QueryClient, RagClient, RlTrainingClient,
    RowClient, ScenariosClient, SortsClient, SourcesClient, SpacesClient, TermsClient, UiClient,
};
pub use resources_phase2::{
    ActionReviewsClient, CausalClient, CdlClient, CognitiveClient, CollectionsClient,
    CommunitiesClient, ConstraintsClient, ControlClient, ConversationClient, ExecutionClient,
    FuzzyClient, IlpClient, IngestionClient, NamespacesClient, NeuroSymbolicClient,
    OversightClient, ProofEngineClient, ReasoningClient, ResearchClient, ReviewsClient,
    StatisticalClient, SyntheticClient, UtilitiesClient, VisualizationClient, WebhookActionsClient,
};

// ─── Common types ─────────────────────────────────────────────────────────────
pub use types::common::{ApiResponse, RateLimitInfo, RequestOptions};

// ─── Builders ────────────────────────────────────────────────────────────────
pub use builders::{
    constrained, guard, psi, psi_by_id, term_ref, var, FuzzyShape, GuardRhs, Value,
};

// ─── Commonly-used DTOs ──────────────────────────────────────────────────────
pub use types::homoiconic::{FeatureInputValueDto, FeatureValueDto, PsiTermDto, TermInputDto};
pub use types::inference::{
    AddFactRequest, AddFactResponse, AddRuleRequest, AddRuleResponse, BackwardChainRequest,
    BackwardChainResponse, BayesianEffectDto, BayesianPredictRequest, BayesianPredictResponse,
    BulkAddFactsRequest, BulkAddFactsResponse, BulkAddRulesRequest, BulkAddRulesResponse,
    ClearFactsResponse, CreateGoalRequest, CreateGoalResponse, DeleteGoalResponse,
    ForwardChainRequest, ForwardChainResponse, FuzzyProveRequest, FuzzyProveResponse,
    GetFactsResponse, GuardOp, ListGoalsResponse, MetaSortsResponse, NafProveRequest,
    NafProveResponse, SolutionDto,
};
pub use types::query::{
    FindBySortRequest, NlQueryMode, NlQueryRequest, NlQueryResponse, OsfSearchRequest,
    OsfSearchResponse, TermListResponse, TermPatternDto, UnifiableQueryRequest,
    ValidateTermRequest, ValidatedUnifyRequest,
};
pub use types::sorts::{
    BulkCreateSortsRequest, BulkCreateSortsResponse, CreateSortRequest, DecodeGlbResponse,
    FeatureDescriptorDto, GlbRequest, GlbResponse, LubRequest, LubResponse, SortDto, SortInfoDto,
    SortListResponse, UpdateReviewStatusRequest,
};
pub use types::terms::{
    BulkAddTermsRequest, BulkAddTermsResponse, ClearTermsResponse, CreateTermRequest, TermDto,
    TermResponse, TermState, UpdateTermRequest, ValidatedTermResponse, ValidatedUnifyResponse,
};
pub use types::values::{FuzzyShapeDto, ValueDto};