1use chrono::{DateTime, Utc};
4
5use oris_kernel::event::KernelError;
6use oris_kernel::identity::{RunId, Seq};
7
8use super::models::{
9 AttemptDispatchRecord, BountyRecord, DisputeRecord, LeaseRecord, OrganismRecord, RecipeRecord,
10 SessionMessageRecord, SessionRecord, SwarmTaskRecord, WorkerRecord,
11};
12
13pub trait RuntimeRepository: Send + Sync {
24 fn list_dispatchable_attempts(
26 &self,
27 now: DateTime<Utc>,
28 limit: usize,
29 ) -> Result<Vec<AttemptDispatchRecord>, KernelError>;
30
31 fn upsert_lease(
33 &self,
34 attempt_id: &str,
35 worker_id: &str,
36 lease_expires_at: DateTime<Utc>,
37 ) -> Result<LeaseRecord, KernelError>;
38
39 fn heartbeat_lease(
41 &self,
42 lease_id: &str,
43 heartbeat_at: DateTime<Utc>,
44 lease_expires_at: DateTime<Utc>,
45 ) -> Result<(), KernelError>;
46
47 fn expire_leases_and_requeue(&self, stale_before: DateTime<Utc>) -> Result<u64, KernelError>;
49
50 fn transition_timed_out_attempts(&self, _now: DateTime<Utc>) -> Result<u64, KernelError> {
52 Ok(0)
53 }
54
55 fn latest_seq_for_run(&self, run_id: &RunId) -> Result<Seq, KernelError>;
57
58 fn upsert_bounty(&self, bounty: &BountyRecord) -> Result<(), KernelError>;
62
63 fn get_bounty(&self, bounty_id: &str) -> Result<Option<BountyRecord>, KernelError>;
65
66 fn list_bounties(
68 &self,
69 status: Option<&str>,
70 limit: usize,
71 ) -> Result<Vec<BountyRecord>, KernelError>;
72
73 fn accept_bounty(&self, bounty_id: &str, accepted_by: &str) -> Result<(), KernelError>;
75
76 fn close_bounty(&self, bounty_id: &str) -> Result<(), KernelError>;
78
79 fn upsert_swarm_decomposition(&self, task: &SwarmTaskRecord) -> Result<(), KernelError>;
83
84 fn get_swarm_decomposition(
86 &self,
87 parent_task_id: &str,
88 ) -> Result<Option<SwarmTaskRecord>, KernelError>;
89
90 fn register_worker(&self, worker: &WorkerRecord) -> Result<(), KernelError>;
94
95 fn get_worker(&self, worker_id: &str) -> Result<Option<WorkerRecord>, KernelError>;
97
98 fn list_workers(
100 &self,
101 domain: Option<&str>,
102 status: Option<&str>,
103 limit: usize,
104 ) -> Result<Vec<WorkerRecord>, KernelError>;
105
106 fn heartbeat_worker(&self, worker_id: &str, heartbeat_at_ms: i64) -> Result<(), KernelError>;
108
109 fn create_recipe(&self, recipe: &RecipeRecord) -> Result<(), KernelError>;
113
114 fn get_recipe(&self, recipe_id: &str) -> Result<Option<RecipeRecord>, KernelError>;
116
117 fn fork_recipe(
119 &self,
120 original_id: &str,
121 new_id: &str,
122 new_author: &str,
123 ) -> Result<Option<RecipeRecord>, KernelError>;
124
125 fn list_recipes(
127 &self,
128 author_id: Option<&str>,
129 limit: usize,
130 ) -> Result<Vec<RecipeRecord>, KernelError>;
131
132 fn express_organism(&self, organism: &OrganismRecord) -> Result<(), KernelError>;
136
137 fn get_organism(&self, organism_id: &str) -> Result<Option<OrganismRecord>, KernelError>;
139
140 fn update_organism(
142 &self,
143 organism_id: &str,
144 current_step: i32,
145 status: &str,
146 ) -> Result<(), KernelError>;
147
148 fn create_session(&self, session: &SessionRecord) -> Result<(), KernelError>;
152
153 fn get_session(&self, session_id: &str) -> Result<Option<SessionRecord>, KernelError>;
155
156 fn add_session_message(&self, message: &SessionMessageRecord) -> Result<(), KernelError>;
158
159 fn get_session_history(
161 &self,
162 session_id: &str,
163 limit: usize,
164 ) -> Result<Vec<SessionMessageRecord>, KernelError>;
165
166 fn open_dispute(&self, dispute: &DisputeRecord) -> Result<(), KernelError>;
170
171 fn get_dispute(&self, dispute_id: &str) -> Result<Option<DisputeRecord>, KernelError>;
173
174 fn get_disputes_for_bounty(&self, bounty_id: &str) -> Result<Vec<DisputeRecord>, KernelError>;
176
177 fn resolve_dispute(
179 &self,
180 dispute_id: &str,
181 resolution: &str,
182 resolved_by: &str,
183 ) -> Result<(), KernelError>;
184}