File size: 1,826 Bytes
afa0cbf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//! Reports v2 readiness without exposing memory contents or persistence details to clients.

use super::*;
use codex_app_server_protocol::MemoryStatusParams;
use codex_app_server_protocol::MemoryStatusResponse;
use codex_protocol::MemoryVersion;

impl ThreadRequestProcessor {
    pub(crate) async fn memory_status(
        &self,
        params: MemoryStatusParams,
    ) -> Result<Option<ClientResponsePayload>, JSONRPCErrorError> {
        let minimum = params.min_consolidated_threads.unwrap_or(20);
        if !(1..=4096).contains(&minimum) {
            return Err(invalid_params(
                "minConsolidatedThreads must be between 1 and 4096",
            ));
        }
        let db = self
            .state_db
            .as_ref()
            .ok_or_else(|| internal_error("sqlite state db unavailable for memory status"))?;
        let store = db
            .memories_for_version(MemoryVersion::V2)
            .await
            .map_err(|error| internal_error(format!("failed to open v2 memory state: {error}")))?;
        let count = store
            .max_consolidated_thread_count()
            .await
            .map_err(|error| internal_error(format!("failed to read memory progress: {error}")))?;
        let root = self
            .config
            .codex_home
            .join(MemoryVersion::V2.directory_name());
        let summary = tokio::fs::read_to_string(root.join("memory_summary.md"))
            .await
            .ok();
        let ready = count >= minimum
            && summary
                .as_deref()
                .is_some_and(codex_memories_write::workspace::is_valid_v2_summary);
        Ok(Some(
            MemoryStatusResponse {
                v2_consolidated_threads: count,
                v2_ready: ready,
            }
            .into(),
        ))
    }
}