mirror of
https://github.com/openai/codex.git
synced 2026-09-08 15:50:34 +00:00
Begin migrating the thread write codepaths to ThreadStore. This starts using ThreadStore inside of core session code, not only in the app server code. Rework the interfaces around thread recording/persistence. We're left with the following: * `ThreadManager`: owns the process-level registry of loaded threads and handles cross-thread orchestration: start, resume, fork, lookup, remove, and route ops to running CodexThreads. * `CodexThread`: represents one loaded/running thread from the outside. It is the handle app-server and callers use to submit ops, inspect session metadata, and shut the thread down. * `LiveThread`: session-owned persistence lifecycle handle for one active thread. Core session code uses it to append rollout items, materialize lazy persistence, flush, shutdown, discard init-failed writers, and load that thread’s persisted history. * `ThreadStore`: storage backend abstraction. It answers “how are threads persisted, read, listed, updated, archived?” Local and remote implementations live behind this trait. * `LocalThreadStore`: local ThreadStore implementation. It owns the file/sqlite-specific details and keeps RolloutRecorder as a local implementation detail. This is a few too many Thread abstractions for my liking, but they do all represent different concepts / needs / layers. Migration note: in places where the core code explicitly requires a path, rather than a thread ID, throw an error if we're running with a remote store. Cover the new local live-writer lifecycle with focused tests and preserve app-server thread-start behavior, including ephemeral pathless sessions.
42 lines
1.3 KiB
Rust
42 lines
1.3 KiB
Rust
use super::LocalThreadStore;
|
|
use crate::CreateThreadParams;
|
|
use crate::ThreadEventPersistenceMode;
|
|
use crate::ThreadStoreError;
|
|
use crate::ThreadStoreResult;
|
|
use codex_rollout::EventPersistenceMode;
|
|
use codex_rollout::RolloutRecorder;
|
|
use codex_rollout::RolloutRecorderParams;
|
|
|
|
pub(super) async fn create_thread(
|
|
store: &LocalThreadStore,
|
|
params: CreateThreadParams,
|
|
) -> ThreadStoreResult<RolloutRecorder> {
|
|
let state_db_ctx = store.state_db().await;
|
|
let recorder = RolloutRecorder::new(
|
|
&store.config,
|
|
RolloutRecorderParams::new(
|
|
params.thread_id,
|
|
params.forked_from_id,
|
|
params.source,
|
|
params.base_instructions,
|
|
params.dynamic_tools,
|
|
event_persistence_mode(params.event_persistence_mode),
|
|
),
|
|
state_db_ctx,
|
|
/*state_builder*/ None,
|
|
)
|
|
.await
|
|
.map_err(|err| ThreadStoreError::Internal {
|
|
message: format!("failed to initialize local thread recorder: {err}"),
|
|
})?;
|
|
|
|
Ok(recorder)
|
|
}
|
|
|
|
pub(super) fn event_persistence_mode(mode: ThreadEventPersistenceMode) -> EventPersistenceMode {
|
|
match mode {
|
|
ThreadEventPersistenceMode::Limited => EventPersistenceMode::Limited,
|
|
ThreadEventPersistenceMode::Extended => EventPersistenceMode::Extended,
|
|
}
|
|
}
|