1pub 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
22pub 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
36pub 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
70pub 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
79pub 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
96pub 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
108pub 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
119pub mod prelude {
121 pub use crate::memory_prelude::*;
122 pub use crate::runtime_prelude::*;
123 pub use crate::sdk_prelude::*;
124}
125
126pub 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
137pub 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
161pub 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}