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::LocusNodeStoreFactory;
85    pub use crate::ports::outbound::memory::memory_context_reader::MemoryContextReader;
86    pub use crate::ports::outbound::memory::memory_context_writer::MemoryContextWriter;
87    pub use crate::ports::outbound::memory::memory_models::{
88        MemoryAggregateRequest, MemoryRecallRequest, MemoryRollupRequest, MemoryScope,
89        MemoryStoreRequest, MemoryTransformRequest,
90    };
91    pub use crate::ports::outbound::memory::memory_operations::MemoryOperations;
92}
93
94/// Minimal SDK imports for common external consumers.
95pub mod sdk_prelude {
96    pub use crate::application::dto::{InvokeAgentRequest, RegisterAgentRequest};
97    pub use crate::domain::errors::{Result, StasisError};
98    pub use crate::domain::runtime::job::{BackoffPolicy, NewJob};
99    pub use crate::application::runtime::runtime_factory::{RuntimeBackend, RuntimeFactory, SurrealAuth};
100    pub use crate::infrastructure::llm::mock_gateway::MockLlmGateway;
101    pub use crate::infrastructure::persistence::in_memory_agent_repository::InMemoryAgentRepository;
102    pub use crate::sdk::runtime_sdk::{RuntimeSdk, StasisRuntime};
103    pub use crate::sdk::stasis_sdk::StasisSdk;
104}
105
106/// Extended SDK imports including control-plane and provider-specific integration types.
107pub mod sdk_prelude_ext {
108    pub use crate::application::dto::InvokeAgentResponse;
109    pub use crate::application::runtime::runtime_factory::RuntimeComposition;
110    pub use crate::domain::runtime::job::JobState;
111    pub use crate::domain::runtime::recurring::RecurringDefinition;
112    pub use crate::infrastructure::llm::genai_gateway::GenaiLlmGateway;
113    pub use crate::sdk::control_plane_sdk::ControlPlaneSdk;
114    pub use crate::sdk::runtime_sdk::RuntimeStatsSnapshot;
115}
116
117/// Re-exported minimal public API surface for common Stasis consumers.
118pub mod prelude {
119    pub use crate::memory_prelude::*;
120    pub use crate::runtime_prelude::*;
121    pub use crate::sdk_prelude::*;
122}
123
124/// Environment and secrets configuration helpers.
125pub mod config_prelude {
126    pub use crate::application::config::env::{
127        bootstrap, bootstrap_with, first_non_empty, load_dotenv_from, non_empty, required, truthy,
128        with_default, EnvBootstrapOptions, EnvBootstrapReport, EnvError,
129    };
130    pub use crate::application::config::secrets::{
131        ChainedSecretsSource, FileSecretsSource, OsEnvSource, SecretsSource, default_secrets_dir,
132    };
133}
134
135/// OpenTelemetry contract keys, span names, and runtime telemetry ports.
136pub mod telemetry_prelude {
137    pub use crate::application::telemetry::keys;
138    pub use crate::application::telemetry::operation::OperationTelemetry;
139    pub use crate::application::telemetry::propagation::{
140        generate_w3c_trace_id, is_w3c_trace_id, job_execute_span_attributes, parse_traceparent,
141        parent_trace_context, trace_propagation_mode, TracePropagationMode,
142    };
143    pub use crate::application::telemetry::request_context::{
144        inbound_trace_context, inbound_trace_context_for_propagation, scope_inbound_trace,
145        trace_id_for_enqueue,
146    };
147    pub use crate::application::telemetry::spans;
148    pub use crate::infrastructure::telemetry::{NoopRuntimeTelemetry, NoopRuntimeTracing};
149    pub use crate::ports::outbound::runtime::runtime_metrics::RuntimeMetrics;
150    pub use crate::ports::outbound::runtime::runtime_telemetry::RuntimeTelemetry;
151    pub use crate::ports::outbound::runtime::runtime_tracing::{
152        in_span, OtelAttribute, OtelAttributeValue, RuntimeTracing, SpanGuard, TraceContext,
153    };
154
155    #[cfg(feature = "otel")]
156    pub use crate::infrastructure::telemetry::OpenTelemetryTelemetry;
157}
158
159/// Re-exported extended API surface for advanced integrations.
160pub mod prelude_ext {
161    pub use crate::config_prelude::*;
162    pub use crate::memory_prelude_ext::*;
163    pub use crate::runtime_prelude_ext::*;
164    pub use crate::sdk_prelude_ext::*;
165}
166
167#[cfg(test)]
168mod tests {
169    use crate::application::dto::{InvokeAgentRequest, RegisterAgentRequest};
170    use crate::infrastructure::llm::mock_gateway::MockLlmGateway;
171    use crate::infrastructure::persistence::in_memory_agent_repository::InMemoryAgentRepository;
172    use crate::sdk::stasis_sdk::StasisSdk;
173
174    #[tokio::test]
175    async fn end_to_end_agent_registration_and_invocation_works() {
176        let repository = InMemoryAgentRepository::default();
177        let llm = MockLlmGateway::new("mock completion");
178        let sdk = StasisSdk::new(repository, llm);
179
180        let registration = RegisterAgentRequest {
181            id: "planner".to_string(),
182            name: "Task Planner".to_string(),
183            system_prompt: "Break work down into ordered steps".to_string(),
184        };
185
186        sdk.register_agent(registration)
187            .await
188            .expect("agent should register");
189
190        let response = sdk
191            .invoke_agent(InvokeAgentRequest {
192                agent_id: "planner".to_string(),
193                user_prompt: "Plan a release checklist".to_string(),
194            })
195            .await
196            .expect("agent should invoke");
197
198        assert_eq!(response.completion, "mock completion");
199    }
200}