Add thread attachment operations with coordinated deletion (#44350)

## Why

Attachment mutations must coordinate with thread deletion so queued requests cannot use metadata belonging to a deleted thread.

## What changed

- Add typed `ThreadStore` operations for idempotent attachment creation, paginated listing, and removal, with capability detection and unsupported defaults.
- Implement attachment operations for SQLite-backed `LocalThreadStore`, including unloaded threads, and preserve invalid-request and missing-thread errors.
- Coordinate attachment mutations with lifecycle locks and move SQLite cleanup into thread-store deletion. Remove state rows only after rollout deletion, preserving retries after cleanup failures.
- Give the in-memory store ownership of its associated SQLite cleanup and remove duplicate cleanup from the app-server.

## Testing

Add coverage for attachment pagination and idempotency, unsupported stores, error categories, lifecycle exclusion, mutations queued behind single and batch deletion, cleanup failure retries, and in-memory state cleanup. Extend the app-server descendant deletion test to verify SQLite rows are removed.

GitOrigin-RevId: f0157538c7c5c2ee1362ce40eac157101c5d4505
This commit is contained in:
joeytrasatti-openai authored and copyberry committed 2026-09-10 00:30:27 +00:00
1 parent e444aa99d7
commit 2df0b747ba
11 files changed
+834 -20

No files matched your search

+9
View File
@@ -11,13 +11,19 @@ mod local;
mod projects;
mod queue_store;
mod store;
mod thread_attachments;
mod thread_metadata_sync;
mod thread_sections;
mod types;
pub use codex_state::AddThreadAttachmentOutcome;
pub use codex_state::MAX_QUEUE_ITEMS;
pub use codex_state::MAX_THREAD_ATTACHMENT_PAYLOAD_BYTES;
pub use codex_state::ProjectSortKey;
pub use codex_state::QueuedUserSubmissionRecord;
pub use codex_state::RemoveThreadAttachmentOutcome;
pub use codex_state::ThreadAttachment;
pub use codex_state::ThreadAttachmentPage;
pub use error::ThreadStoreError;
pub use error::ThreadStoreResult;
pub use in_memory::InMemoryThreadStore;
@@ -49,6 +55,9 @@ pub use queue_store::QueueStore;
pub use store::PersistContext;
pub use store::ThreadStore;
pub use store::ThreadStoreFuture;
pub use thread_attachments::AddThreadAttachmentParams;
pub use thread_attachments::ListThreadAttachmentsParams;
pub use thread_attachments::RemoveThreadAttachmentParams;
pub use thread_sections::CreateThreadSectionParams;
pub use thread_sections::DeleteThreadSectionParams;
pub use thread_sections::ListThreadSectionsParams;