mirror of
https://github.com/openai/codex.git
synced 2026-05-27 14:34:24 +00:00
- make ThreadStore::update_thread_metadata accept a broad range of metadata patches - keep ThreadStore::append_items as raw canonical history append (no metadata side effects) - in the local store, write these metadata updates to a combination of sqlite and rollout jsonl files for backwards-compat. It special cases which fields need to go into jsonl vs sqlite vs whatever, confining the awkwardness to just this implementation - in remote stores we can simply persist the metadata directly to a database, no special casing required. - move the "implicit metadata updates triggered by appending rollout items" from the RolloutRecorder (which is local-threadstore-specific) to the LiveThread layer above the ThreadStore, inside of a private helper utility called ThreadMetadataSync. LiveThread calls ThreadStore append_items and update_metadata separately. - Add a generic update metadata method to ThreadManager that works on both live threads and "cold" threads - Call that ThreadManager method from app server code, so app server doesn't need to worry about whether the thread is live or not
46 lines
1.4 KiB
Rust
46 lines
1.4 KiB
Rust
use super::LocalThreadStore;
|
|
use crate::CreateThreadParams;
|
|
use crate::ThreadStoreError;
|
|
use crate::ThreadStoreResult;
|
|
use codex_protocol::protocol::ThreadMemoryMode;
|
|
use codex_rollout::RolloutConfig;
|
|
use codex_rollout::RolloutRecorder;
|
|
use codex_rollout::RolloutRecorderParams;
|
|
|
|
pub(super) async fn create_thread(
|
|
store: &LocalThreadStore,
|
|
params: CreateThreadParams,
|
|
) -> ThreadStoreResult<RolloutRecorder> {
|
|
let cwd = params
|
|
.metadata
|
|
.cwd
|
|
.clone()
|
|
.ok_or_else(|| ThreadStoreError::InvalidRequest {
|
|
message: "local thread store requires a cwd".to_string(),
|
|
})?;
|
|
let config = RolloutConfig {
|
|
codex_home: store.config.codex_home.clone(),
|
|
sqlite_home: store.config.sqlite_home.clone(),
|
|
cwd,
|
|
model_provider_id: params.metadata.model_provider.clone(),
|
|
generate_memories: matches!(params.metadata.memory_mode, ThreadMemoryMode::Enabled),
|
|
};
|
|
let recorder = RolloutRecorder::new(
|
|
&config,
|
|
RolloutRecorderParams::new(
|
|
params.thread_id,
|
|
params.forked_from_id,
|
|
params.source,
|
|
params.thread_source,
|
|
params.base_instructions,
|
|
params.dynamic_tools,
|
|
),
|
|
)
|
|
.await
|
|
.map_err(|err| ThreadStoreError::Internal {
|
|
message: format!("failed to initialize local thread recorder: {err}"),
|
|
})?;
|
|
|
|
Ok(recorder)
|
|
}
|