Codex Handbook
agent-graph-store/src/store.rs 53 lines
use codex_protocol::ThreadId;use crate::AgentGraphStoreResult;use crate::ThreadSpawnEdgeStatus;/// Storage-neutral boundary for persisted thread-spawn parent/child topology.////// Implementations are expected to return stable ordering for list methods so callers can merge/// persisted graph state with live in-memory state without introducing nondeterministic output.pub trait AgentGraphStore: Send + Sync {    /// Insert or replace the directional parent/child edge for a spawned thread.    ///    /// `child_thread_id` has at most one persisted parent. Re-inserting the same child should    /// update both the parent and status to match the supplied values.    fn upsert_thread_spawn_edge(        &self,        parent_thread_id: ThreadId,        child_thread_id: ThreadId,        status: ThreadSpawnEdgeStatus,    ) -> impl std::future::Future<Output = AgentGraphStoreResult<()>> + Send;    /// Update the persisted lifecycle status of a spawned thread's incoming edge.    ///    /// Implementations should treat missing children as a successful no-op.    fn set_thread_spawn_edge_status(        &self,        child_thread_id: ThreadId,        status: ThreadSpawnEdgeStatus,    ) -> impl std::future::Future<Output = AgentGraphStoreResult<()>> + Send;    /// List direct spawned children of a parent thread.    ///    /// When `status_filter` is `Some`, only child edges with that exact status are returned. When    /// it is `None`, all direct child edges are returned regardless of status, including statuses    /// that may be added by a future store implementation.    fn list_thread_spawn_children(        &self,        parent_thread_id: ThreadId,        status_filter: Option<ThreadSpawnEdgeStatus>,    ) -> impl std::future::Future<Output = AgentGraphStoreResult<Vec<ThreadId>>> + Send;    /// List spawned descendants breadth-first by depth, then by thread id.    ///    /// `status_filter` is applied to every traversed edge, not just to the returned descendants.    /// For example, `Some(Open)` walks only open edges, so descendants under a closed edge are not    /// included even if their own incoming edge is open. `None` walks and returns every persisted    /// edge regardless of status.    fn list_thread_spawn_descendants(        &self,        root_thread_id: ThreadId,        status_filter: Option<ThreadSpawnEdgeStatus>,    ) -> impl std::future::Future<Output = AgentGraphStoreResult<Vec<ThreadId>>> + Send;}