Skip to main content

lean_ctx/core/ocla/
traits.rs

1use crate::core::a2a::message::{MessagePriority, PrivacyLevel};
2
3use super::types::{
4    AgentEnvelope, CompressionRequest, CompressionResult, ConfigProposal, ConfigTuningRequest,
5    ConnectorJob, EfficiencyAnalysis, EfficiencySample, ExperimentRequest, ExperimentResult,
6    IntentDecision, IntentRequest, MetricPoint, ModelRouteRequest, Observation, OclaCapability,
7    OclaResult, Outcome, ResponseOptimizationRequest, ResponseOptimizationResult, RoutingDecision,
8    SavingsEvidence, ScheduledJob, UsageRecord,
9};
10
11/// Common, versioned discovery surface for every OCLA capability.
12pub trait OclaService: Send + Sync {
13    fn capability(&self) -> OclaCapability;
14}
15
16pub trait ObservationHook: OclaService {
17    fn observe(&self, observation: Observation) -> OclaResult<()>;
18}
19
20pub trait UsageSink: OclaService {
21    fn record_usage(&self, usage: UsageRecord) -> OclaResult<()>;
22}
23
24pub trait MetricsExporter: OclaService {
25    fn export_metrics(&self, metrics: Vec<MetricPoint>) -> OclaResult<()>;
26}
27
28pub trait SavingsLedger: OclaService {
29    fn record_savings(&self, evidence: SavingsEvidence) -> OclaResult<String>;
30}
31
32pub trait IntentClassifier: OclaService {
33    fn classify_intent(&self, request: IntentRequest) -> OclaResult<IntentDecision>;
34}
35
36pub trait OutcomeTracker: OclaService {
37    fn record_outcome(&self, outcome: Outcome) -> OclaResult<()>;
38}
39
40pub trait CompressionProvider: OclaService {
41    fn compress(&self, request: CompressionRequest) -> OclaResult<CompressionResult>;
42}
43
44pub trait ResponseOptimizer: OclaService {
45    fn optimize_response(
46        &self,
47        request: ResponseOptimizationRequest,
48    ) -> OclaResult<ResponseOptimizationResult>;
49}
50
51pub trait ModelRouter: OclaService {
52    fn route_model(&self, request: ModelRouteRequest) -> OclaResult<RoutingDecision>;
53}
54
55pub trait EfficiencyAnalyzer: OclaService {
56    fn analyze_efficiency(&self, sample: EfficiencySample) -> OclaResult<EfficiencyAnalysis>;
57}
58
59pub trait ConfigTuner: OclaService {
60    fn propose_tuning(&self, request: ConfigTuningRequest) -> OclaResult<ConfigProposal>;
61}
62
63pub trait ExperimentRunner: OclaService {
64    fn run_experiment(&self, request: ExperimentRequest) -> OclaResult<ExperimentResult>;
65}
66
67pub trait ConnectorScheduler: OclaService {
68    fn schedule_connector(&self, job: ConnectorJob) -> OclaResult<ScheduledJob>;
69}
70
71pub trait AgentGateway: OclaService {
72    fn relay_agent(&self, envelope: AgentEnvelope) -> OclaResult<AgentEnvelope>;
73    fn route_message(
74        &self,
75        from: &str,
76        to: Option<&str>,
77        category: &str,
78        message: &str,
79        privacy: PrivacyLevel,
80        priority: MessagePriority,
81        ttl_hours: Option<u64>,
82    ) -> OclaResult<String>;
83}
84
85#[cfg(test)]
86mod tests {
87    use super::*;
88
89    #[test]
90    fn every_public_trait_is_object_safe() {
91        fn assert_object_safe<T: ?Sized>() {}
92        assert_object_safe::<dyn ObservationHook>();
93        assert_object_safe::<dyn UsageSink>();
94        assert_object_safe::<dyn MetricsExporter>();
95        assert_object_safe::<dyn SavingsLedger>();
96        assert_object_safe::<dyn IntentClassifier>();
97        assert_object_safe::<dyn OutcomeTracker>();
98        assert_object_safe::<dyn CompressionProvider>();
99        assert_object_safe::<dyn ResponseOptimizer>();
100        assert_object_safe::<dyn ModelRouter>();
101        assert_object_safe::<dyn EfficiencyAnalyzer>();
102        assert_object_safe::<dyn ConfigTuner>();
103        assert_object_safe::<dyn ExperimentRunner>();
104        assert_object_safe::<dyn ConnectorScheduler>();
105        assert_object_safe::<dyn AgentGateway>();
106    }
107}