Files
codex/codex-rs/thread-store/src/projects.rs
Anton Panasenko f6726e8986 Add recency sorting to project/list (#41223)
## What changed

- Include `recencyAt`, derived from the newest non-archived assigned thread, in project responses.
- Let `project/list` sort by `position` or `recencyAt` in either direction, with recency as the default descending order for that key and projects without activity placed last.
- Encode the sort key, direction, and millisecond-precision anchor in new cursors while retaining existing ascending-position cursors.
- Add an index for project recency lookups and document the API's sorting and pagination behavior.

## Testing

- Cover recency updates when threads are assigned, archived, unarchived, or deleted.
- Cover ordering, null handling, tie-breaking, cursor pagination, invalid sort combinations, and cursor mismatches.

GitOrigin-RevId: 6165e2b9976b0b45cfa16bcd42978b67811f6df5
2026-08-27 23:43:46 +00:00

82 lines
1.9 KiB
Rust

use std::collections::BTreeMap;
use crate::SortDirection;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct StoredProjectRoot {
pub path: String,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct StoredProject {
pub id: String,
pub name: String,
pub roots: Vec<StoredProjectRoot>,
pub metadata: BTreeMap<String, String>,
pub position: i64,
pub created_at_ms: i64,
pub updated_at_ms: i64,
pub recency_at_ms: Option<i64>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct StoredProjectsPage {
pub projects: Vec<StoredProject>,
pub next_cursor: Option<String>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct ListProjectsParams {
pub cursor: Option<String>,
pub limit: usize,
pub sort_key: codex_state::ProjectSortKey,
pub sort_direction: SortDirection,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct CreateProjectParams {
pub name: String,
pub roots: Vec<StoredProjectRoot>,
pub metadata: BTreeMap<String, String>,
pub thread_ids: Vec<String>,
pub idempotency_key: String,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct CreatedProject {
pub project: StoredProject,
pub created: bool,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct UpdateProjectParams {
pub project_id: String,
pub name: Option<String>,
pub roots: Option<Vec<StoredProjectRoot>>,
pub metadata: Option<BTreeMap<String, String>>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct MoveProjectParams {
pub project_id: String,
pub before_project_id: Option<String>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum ProjectMoveOutcome {
Unchanged,
Moved,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct UpdatedProject {
pub project: StoredProject,
pub changed: bool,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct DeletedProject {
pub affected_active_thread_ids: Vec<String>,
pub affected_archived_thread_ids: Vec<String>,
}