Skip to main content

lean_ctx_ocla/
traits.rs

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