Skip to main content

stasis/
lib.rs

1//! Stasis is a durable AI orchestration framework with runtime jobs, control-plane
2//! primitives, and memory integration adapters.
3//! Use the [prelude] module for a batteries-included public API surface.
4
5pub mod application;
6pub mod dashboard;
7pub mod domain;
8pub mod infrastructure;
9pub mod ports;
10pub mod sdk;
11
12pub use stasis_macros::stasis_tool;
13
14#[doc(hidden)]
15pub mod macro_support {
16    pub use async_trait;
17    pub use schemars;
18    pub use serde;
19    pub use serde_json;
20}
21
22/// Minimal runtime imports for consumers integrating job handlers and runtime wiring.
23pub mod runtime_prelude {
24    pub use crate::application::runtime::in_memory_runtime::{
25        InMemoryRuntime, JobExecutionOutcome, JobHandler,
26    };
27    pub use crate::application::runtime::runtime_factory::{
28        RuntimeBackend, RuntimeComposition, RuntimeFactory, SurrealAuth,
29    };
30    pub use crate::application::runtime::stasis_runtime_builder::StasisRuntimeBuilder;
31    pub use crate::domain::errors::{Result, StasisError};
32    pub use crate::domain::runtime::job::{BackoffPolicy, JobState, NewJob};
33    pub use crate::domain::runtime::recurring::RecurringDefinition;
34}
35
36/// Extended runtime imports including orchestration payloads, endpoint routing, and store adapters.
37pub mod runtime_prelude_ext {
38    pub use crate::application::dto::{
39        HeartbeatClusterNodeRequest, RegisterClusterNodeRequest,
40        RegisterDeliveryEndpointRequest,
41    };
42    pub use crate::application::orchestration::runtime_job_payloads::{
43        AgentSessionJobPayload, AgentTurnJobPayload, ConcurrentPatternJobPayload,
44        HandoffPatternJobPayload, OrchestratorPatternJobPayload, PromptJobPayload,
45        SequentialPatternJobPayload, ToolLoopJobPayload,
46    };
47    pub use crate::application::orchestration::runtime_workflow_job_builder::RuntimeWorkflowJobBuilder;
48    pub use crate::application::runtime::in_memory_runtime::{
49        InMemoryRuntime, JobExecutionOutcome, JobHandler,
50    };
51    pub use crate::application::runtime::stasis_runtime_builder::StasisRuntimeBuilder;
52    pub use crate::domain::runtime::cluster_node::ClusterNodeRole;
53    pub use crate::domain::runtime::delivery_endpoint::{
54        DeliveryEndpoint, DeliveryProtocol, NewDeliveryEndpoint,
55    };
56    pub use crate::domain::runtime::outbox::OutboxEvent;
57    pub use crate::infrastructure::runtime::composite_control_plane_store::CompositeControlPlaneStore;
58    pub use crate::infrastructure::runtime::endpoint_routing_event_publisher::EndpointRoutingEventPublisher;
59    pub use crate::infrastructure::runtime::in_memory_cluster_node_store::InMemoryClusterNodeStore;
60    pub use crate::infrastructure::runtime::in_memory_delivery_endpoint_store::InMemoryDeliveryEndpointStore;
61    pub use crate::infrastructure::runtime::in_memory_endpoint_delivery_status_store::InMemoryEndpointDeliveryStatusStore;
62    pub use crate::infrastructure::runtime::surreal_cluster_node_store::SurrealClusterNodeStore;
63    pub use crate::infrastructure::runtime::surreal_delivery_endpoint_store::SurrealDeliveryEndpointStore;
64    pub use crate::infrastructure::runtime::surreal_endpoint_delivery_status_store::SurrealEndpointDeliveryStatusStore;
65    pub use crate::ports::outbound::runtime::delivery_endpoint_store::DeliveryEndpointStore;
66    pub use crate::ports::outbound::runtime::endpoint_delivery_status_store::EndpointDeliveryStatusStore;
67    pub use crate::ports::outbound::runtime::endpoint_transport_publisher::EndpointTransportPublisher;
68}
69
70/// Minimal memory imports for consumers using context store/recall/transform APIs.
71pub mod memory_prelude {
72    pub use crate::ports::outbound::memory::memory_models::{
73        MemoryAggregateRequest, MemoryRecallRequest, MemoryRollupRequest, MemoryScope,
74        MemoryStoreRequest, MemoryTransformRequest,
75    };
76    pub use crate::ports::outbound::memory::memory_operations::MemoryOperations;
77}
78
79/// Extended memory imports including concrete Locus adapters and context reader/writer traits.
80pub mod memory_prelude_ext {
81    pub use crate::infrastructure::memory::locus_context_reader::LocusContextReader;
82    pub use crate::infrastructure::memory::locus_context_writer::LocusContextWriter;
83    pub use crate::infrastructure::memory::locus_memory_operations::LocusMemoryOperations;
84    pub use crate::infrastructure::memory::locus_node_store_factory::{
85        LocusMemoryStore, LocusNodeStoreFactory,
86    };
87    pub use crate::ports::outbound::memory::memory_context_reader::MemoryContextReader;
88    pub use crate::ports::outbound::memory::memory_context_writer::MemoryContextWriter;
89    pub use crate::ports::outbound::memory::memory_models::{
90        MemoryAggregateRequest, MemoryRecallRequest, MemoryRollupRequest, MemoryScope,
91        MemoryStoreRequest, MemoryTransformRequest,
92    };
93    pub use crate::ports::outbound::memory::memory_operations::MemoryOperations;
94}
95
96/// Minimal SDK imports for common external consumers.
97pub mod sdk_prelude {
98    pub use crate::application::dto::{InvokeAgentRequest, RegisterAgentRequest};
99    pub use crate::domain::errors::{Result, StasisError};
100    pub use crate::domain::runtime::job::{BackoffPolicy, NewJob};
101    pub use crate::application::runtime::runtime_factory::{RuntimeBackend, RuntimeFactory, SurrealAuth};
102    pub use crate::infrastructure::llm::mock_gateway::MockLlmGateway;
103    pub use crate::infrastructure::persistence::in_memory_agent_repository::InMemoryAgentRepository;
104    pub use crate::sdk::runtime_sdk::{RuntimeSdk, StasisRuntime};
105    pub use crate::sdk::stasis_sdk::StasisSdk;
106}
107
108/// Extended SDK imports including control-plane and provider-specific integration types.
109pub mod sdk_prelude_ext {
110    pub use crate::application::dto::InvokeAgentResponse;
111    pub use crate::application::runtime::runtime_factory::RuntimeComposition;
112    pub use crate::domain::runtime::job::JobState;
113    pub use crate::domain::runtime::recurring::RecurringDefinition;
114    pub use crate::infrastructure::llm::genai_gateway::GenaiLlmGateway;
115    pub use crate::sdk::control_plane_sdk::ControlPlaneSdk;
116    pub use crate::sdk::runtime_sdk::RuntimeStatsSnapshot;
117}
118
119/// Re-exported minimal public API surface for common Stasis consumers.
120pub mod prelude {
121    pub use crate::memory_prelude::*;
122    pub use crate::runtime_prelude::*;
123    pub use crate::sdk_prelude::*;
124}
125
126/// Environment and secrets configuration helpers.
127pub mod config_prelude {
128    pub use crate::application::config::env::{
129        bootstrap, bootstrap_with, first_non_empty, load_dotenv_from, non_empty, required, truthy,
130        with_default, EnvBootstrapOptions, EnvBootstrapReport, EnvError,
131    };
132    pub use crate::application::config::secrets::{
133        ChainedSecretsSource, FileSecretsSource, OsEnvSource, SecretsSource, default_secrets_dir,
134    };
135}
136
137/// OpenTelemetry contract keys, span names, and runtime telemetry ports.
138pub mod telemetry_prelude {
139    pub use crate::application::telemetry::keys;
140    pub use crate::application::telemetry::operation::OperationTelemetry;
141    pub use crate::application::telemetry::propagation::{
142        generate_w3c_trace_id, is_w3c_trace_id, job_execute_span_attributes, parse_traceparent,
143        parent_trace_context, trace_propagation_mode, TracePropagationMode,
144    };
145    pub use crate::application::telemetry::request_context::{
146        inbound_trace_context, inbound_trace_context_for_propagation, scope_inbound_trace,
147        trace_id_for_enqueue,
148    };
149    pub use crate::application::telemetry::spans;
150    pub use crate::infrastructure::telemetry::{NoopRuntimeTelemetry, NoopRuntimeTracing};
151    pub use crate::ports::outbound::runtime::runtime_metrics::RuntimeMetrics;
152    pub use crate::ports::outbound::runtime::runtime_telemetry::RuntimeTelemetry;
153    pub use crate::ports::outbound::runtime::runtime_tracing::{
154        in_span, OtelAttribute, OtelAttributeValue, RuntimeTracing, SpanGuard, TraceContext,
155    };
156
157    #[cfg(feature = "otel")]
158    pub use crate::infrastructure::telemetry::OpenTelemetryTelemetry;
159}
160
161/// Re-exported extended API surface for advanced integrations.
162pub mod prelude_ext {
163    pub use crate::config_prelude::*;
164    pub use crate::memory_prelude_ext::*;
165    pub use crate::runtime_prelude_ext::*;
166    pub use crate::sdk_prelude_ext::*;
167}
168
169#[cfg(test)]
170mod tests {
171    use crate::application::dto::{InvokeAgentRequest, RegisterAgentRequest};
172    use crate::infrastructure::llm::mock_gateway::MockLlmGateway;
173    use crate::infrastructure::persistence::in_memory_agent_repository::InMemoryAgentRepository;
174    use crate::sdk::stasis_sdk::StasisSdk;
175
176    #[tokio::test]
177    async fn end_to_end_agent_registration_and_invocation_works() {
178        let repository = InMemoryAgentRepository::default();
179        let llm = MockLlmGateway::new("mock completion");
180        let sdk = StasisSdk::new(repository, llm);
181
182        let registration = RegisterAgentRequest {
183            id: "planner".to_string(),
184            name: "Task Planner".to_string(),
185            system_prompt: "Break work down into ordered steps".to_string(),
186        };
187
188        sdk.register_agent(registration)
189            .await
190            .expect("agent should register");
191
192        let response = sdk
193            .invoke_agent(InvokeAgentRequest {
194                agent_id: "planner".to_string(),
195                user_prompt: "Plan a release checklist".to_string(),
196            })
197            .await
198            .expect("agent should invoke");
199
200        assert_eq!(response.completion, "mock completion");
201    }
202}