mirror of
https://github.com/openai/codex.git
synced 2026-11-08 20:40:33 +00:00
## Why `thread/list` can filter direct children with `parentThreadId`, but clients cannot request an entire spawned subtree. Discovering every descendant requires repeated client-side requests and gives up the database's existing filtering and pagination path. ## What changed Experimental clients can use `ancestorThreadId` to return strict descendants at any depth while `parentThreadId` retains its direct-child meaning. The filters are mutually exclusive, the ancestor is excluded, and every result preserves its immediate `parentThreadId` so callers can reconstruct the tree. ## How it works - **Explicit relationship:** Internal list parameters distinguish direct children from transitive descendants without changing the meaning of `parentThreadId`. - **Existing graph:** Persisted parent-child spawn edges remain the source of truth, so descendant lookup needs no schema migration or ancestry cache. - **Indexed traversal:** A recursive SQLite query starts from the parent-edge index, walks each generation, and applies thread filters, sorting, and cursor pagination in the same database request. - **Reconstructable results:** The response stays flat and normally ordered while carrying each descendant's immediate parent. ## Verification Ran 550 tests across the protocol, state, rollout, and thread-store crates, then reran the four focused state, store, and app-server descendant-listing tests after the final diff reduction. Scoped Clippy and formatting checks passed. Stable and experimental schema generation was checked; the stable fixtures remain unchanged while the experimental schema includes the new field.
47 lines
1.5 KiB
Rust
47 lines
1.5 KiB
Rust
mod agent_job;
|
|
mod backfill_state;
|
|
mod graph;
|
|
mod log;
|
|
mod memories;
|
|
mod thread_goal;
|
|
mod thread_metadata;
|
|
|
|
pub use agent_job::AgentJob;
|
|
pub use agent_job::AgentJobCreateParams;
|
|
pub use agent_job::AgentJobItem;
|
|
pub use agent_job::AgentJobItemCreateParams;
|
|
pub use agent_job::AgentJobItemStatus;
|
|
pub use agent_job::AgentJobProgress;
|
|
pub use agent_job::AgentJobStatus;
|
|
pub use backfill_state::BackfillState;
|
|
pub use backfill_state::BackfillStatus;
|
|
pub use graph::DirectionalThreadSpawnEdgeStatus;
|
|
pub use log::LogEntry;
|
|
pub use log::LogQuery;
|
|
pub use log::LogRow;
|
|
pub use memories::Phase2JobClaimOutcome;
|
|
pub use memories::Stage1JobClaim;
|
|
pub use memories::Stage1JobClaimOutcome;
|
|
pub use memories::Stage1Output;
|
|
pub use memories::Stage1StartupClaimParams;
|
|
pub use thread_goal::ThreadGoal;
|
|
pub use thread_goal::ThreadGoalStatus;
|
|
pub use thread_metadata::Anchor;
|
|
pub use thread_metadata::BackfillStats;
|
|
pub use thread_metadata::ExtractionOutcome;
|
|
pub use thread_metadata::SortDirection;
|
|
pub use thread_metadata::SortKey;
|
|
pub use thread_metadata::ThreadMetadata;
|
|
pub use thread_metadata::ThreadMetadataBuilder;
|
|
pub use thread_metadata::ThreadRelationFilter;
|
|
pub use thread_metadata::ThreadsPage;
|
|
|
|
pub(crate) use agent_job::AgentJobItemRow;
|
|
pub(crate) use agent_job::AgentJobRow;
|
|
pub(crate) use thread_goal::ThreadGoalRow;
|
|
pub(crate) use thread_metadata::ThreadRow;
|
|
pub(crate) use thread_metadata::anchor_from_item;
|
|
pub(crate) use thread_metadata::datetime_to_epoch_millis;
|
|
pub(crate) use thread_metadata::datetime_to_epoch_seconds;
|
|
pub(crate) use thread_metadata::epoch_millis_to_datetime;
|