Real-time index of opencode sessions
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Refactor SessionIndex.build into build_session and build_message methods

rektide db417d89 651e2022

+86 -54
+86 -54
src/index.rs
··· 132 132 133 133 for project_id in paths.project_dirs()? { 134 134 let session_ids = reader.list_sessions(&project_id)?; 135 + let mut built_session_ids = Vec::with_capacity(session_ids.len()); 135 136 136 137 for session_id in &session_ids { 137 - if let Ok(session) = reader.read_session(&project_id, session_id) { 138 - let message_ids = reader.list_messages(session_id).unwrap_or_default(); 139 - let message_count = message_ids.len(); 138 + if index.build_session(&reader, paths, &project_id, session_id)? { 139 + built_session_ids.push(session_id.clone()); 140 + } 141 + } 140 142 141 - index.sessions.insert( 142 - session_id.clone(), 143 - SessionMeta { 144 - id: session_id.clone(), 145 - title: session.title, 146 - created: session.time.created, 147 - updated: session.time.updated, 148 - project_id: project_id.clone(), 149 - message_count, 150 - }, 151 - ); 143 + index.by_project.insert(project_id, built_session_ids); 144 + } 152 145 153 - index 154 - .by_session 155 - .insert(session_id.clone(), message_ids.clone()); 146 + Ok(index) 147 + } 156 148 157 - for msg_id in &message_ids { 158 - if let Ok(msg) = reader.read_message(session_id, msg_id) { 159 - let role = match &msg { 160 - crate::types::Message::User(_) => MessageRole::User, 161 - crate::types::Message::Assistant(_) => MessageRole::Assistant, 162 - }; 149 + fn build_session( 150 + &mut self, 151 + reader: &FileReader, 152 + paths: &StoragePaths, 153 + project_id: &str, 154 + session_id: &SessionId, 155 + ) -> Result<bool> { 156 + let session = match reader.read_session(project_id, session_id) { 157 + Ok(s) => s, 158 + Err(_) => return Ok(false), 159 + }; 163 160 164 - let part_ids = reader.list_parts(msg_id).unwrap_or_default(); 165 - let part_count = part_ids.len(); 161 + let message_ids = reader.list_messages(session_id).unwrap_or_default(); 162 + let message_count = message_ids.len(); 166 163 167 - index.messages.insert( 168 - msg_id.clone(), 169 - MessageMeta { 170 - id: msg_id.clone(), 171 - session_id: session_id.clone(), 172 - role, 173 - part_count, 174 - }, 175 - ); 164 + self.sessions.insert( 165 + session_id.clone(), 166 + SessionMeta { 167 + id: session_id.clone(), 168 + title: session.title, 169 + created: session.time.created, 170 + updated: session.time.updated, 171 + project_id: project_id.to_string(), 172 + message_count, 173 + }, 174 + ); 176 175 177 - index.by_message.insert(msg_id.clone(), part_ids.clone()); 176 + self.by_session 177 + .insert(session_id.clone(), message_ids.clone()); 178 178 179 - for part_id in &part_ids { 180 - let path = paths.part_file(msg_id, part_id); 181 - index.parts.insert( 182 - part_id.clone(), 183 - PartRef::new( 184 - part_id.clone(), 185 - msg_id.clone(), 186 - session_id.clone(), 187 - PartType::Text, 188 - path, 189 - ), 190 - ); 191 - } 192 - } 193 - } 194 - } 195 - } 179 + for msg_id in &message_ids { 180 + self.build_message(reader, paths, session_id, msg_id)?; 181 + } 182 + 183 + Ok(true) 184 + } 196 185 197 - index.by_project.insert(project_id.clone(), session_ids); 186 + fn build_message( 187 + &mut self, 188 + reader: &FileReader, 189 + paths: &StoragePaths, 190 + session_id: &SessionId, 191 + msg_id: &MessageId, 192 + ) -> Result<()> { 193 + let msg = match reader.read_message(session_id, msg_id) { 194 + Ok(m) => m, 195 + Err(_) => return Ok(()), 196 + }; 197 + 198 + let role = match &msg { 199 + crate::types::Message::User(_) => MessageRole::User, 200 + crate::types::Message::Assistant(_) => MessageRole::Assistant, 201 + }; 202 + 203 + let part_ids = reader.list_parts(msg_id).unwrap_or_default(); 204 + let part_count = part_ids.len(); 205 + 206 + self.messages.insert( 207 + msg_id.clone(), 208 + MessageMeta { 209 + id: msg_id.clone(), 210 + session_id: session_id.clone(), 211 + role, 212 + part_count, 213 + }, 214 + ); 215 + 216 + self.by_message.insert(msg_id.clone(), part_ids.clone()); 217 + 218 + for part_id in &part_ids { 219 + let path = paths.part_file(msg_id, part_id); 220 + self.parts.insert( 221 + part_id.clone(), 222 + PartRef::new( 223 + part_id.clone(), 224 + msg_id.clone(), 225 + session_id.clone(), 226 + PartType::Text, 227 + path, 228 + ), 229 + ); 198 230 } 199 231 200 - Ok(index) 232 + Ok(()) 201 233 } 202 234 203 235 pub fn session(&self, id: &SessionId) -> Option<&SessionMeta> {