mirror of
https://github.com/openai/codex.git
synced 2026-04-24 22:54:54 +00:00
bind
This commit is contained in:
@@ -93,6 +93,7 @@ use codex_app_server_protocol::ServerRequest;
|
||||
use codex_app_server_protocol::SkillsListResponse;
|
||||
use codex_app_server_protocol::ThreadItem;
|
||||
use codex_app_server_protocol::ThreadLoadedListParams;
|
||||
use codex_app_server_protocol::ThreadMemoryMode;
|
||||
use codex_app_server_protocol::ThreadRollbackResponse;
|
||||
use codex_app_server_protocol::ThreadStartSource;
|
||||
use codex_app_server_protocol::Turn;
|
||||
@@ -1468,7 +1469,11 @@ impl App {
|
||||
}
|
||||
}
|
||||
|
||||
async fn update_memory_settings(&mut self, use_memories: bool, generate_memories: bool) {
|
||||
async fn update_memory_settings(
|
||||
&mut self,
|
||||
use_memories: bool,
|
||||
generate_memories: bool,
|
||||
) -> bool {
|
||||
let active_profile = self.active_profile.clone();
|
||||
let scoped_memory_segments = |key: &str| {
|
||||
if let Some(profile) = active_profile.as_deref() {
|
||||
@@ -1501,13 +1506,50 @@ impl App {
|
||||
tracing::error!(error = %err, "failed to persist memory settings");
|
||||
self.chat_widget
|
||||
.add_error_message(format!("Failed to save memory settings: {err}"));
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
self.config.memories.use_memories = use_memories;
|
||||
self.config.memories.generate_memories = generate_memories;
|
||||
self.chat_widget
|
||||
.set_memory_settings(use_memories, generate_memories);
|
||||
true
|
||||
}
|
||||
|
||||
async fn update_memory_settings_with_app_server(
|
||||
&mut self,
|
||||
app_server: &mut AppServerSession,
|
||||
use_memories: bool,
|
||||
generate_memories: bool,
|
||||
) {
|
||||
let previous_generate_memories = self.config.memories.generate_memories;
|
||||
if !self
|
||||
.update_memory_settings(use_memories, generate_memories)
|
||||
.await
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if previous_generate_memories == generate_memories {
|
||||
return;
|
||||
}
|
||||
|
||||
let Some(thread_id) = self.current_displayed_thread_id() else {
|
||||
return;
|
||||
};
|
||||
|
||||
let mode = if generate_memories {
|
||||
ThreadMemoryMode::Enabled
|
||||
} else {
|
||||
ThreadMemoryMode::Disabled
|
||||
};
|
||||
|
||||
if let Err(err) = app_server.thread_memory_mode_set(thread_id, mode).await {
|
||||
tracing::error!(error = %err, %thread_id, "failed to update thread memory mode");
|
||||
self.chat_widget.add_error_message(format!(
|
||||
"Saved memory settings, but failed to update the current thread: {err}"
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
fn open_url_in_browser(&mut self, url: String) {
|
||||
@@ -5315,8 +5357,12 @@ impl App {
|
||||
use_memories,
|
||||
generate_memories,
|
||||
} => {
|
||||
self.update_memory_settings(use_memories, generate_memories)
|
||||
.await;
|
||||
self.update_memory_settings_with_app_server(
|
||||
app_server,
|
||||
use_memories,
|
||||
generate_memories,
|
||||
)
|
||||
.await;
|
||||
}
|
||||
AppEvent::SkipNextWorldWritableScan => {
|
||||
self.windows_sandbox.skip_world_writable_scan_once = true;
|
||||
@@ -7951,10 +7997,13 @@ mod tests {
|
||||
async fn update_memory_settings_persists_and_updates_widget_config() -> Result<()> {
|
||||
let (mut app, _app_event_rx, _op_rx) = make_test_app_with_channels().await;
|
||||
let codex_home = tempdir()?;
|
||||
app.config.codex_home = codex_home.path().to_path_buf();
|
||||
app.config.codex_home = codex_home.path().to_path_buf().abs();
|
||||
let mut app_server = crate::start_embedded_app_server_for_picker(&app.config).await?;
|
||||
|
||||
app.update_memory_settings(
|
||||
/*use_memories*/ false, /*generate_memories*/ false,
|
||||
app.update_memory_settings_with_app_server(
|
||||
&mut app_server,
|
||||
/*use_memories*/ false,
|
||||
/*generate_memories*/ false,
|
||||
)
|
||||
.await;
|
||||
|
||||
@@ -7982,6 +8031,41 @@ mod tests {
|
||||
!memories.contains_key("no_memories_if_mcp_or_web_search"),
|
||||
"the TUI menu should not write the MCP pollution setting"
|
||||
);
|
||||
app_server.shutdown().await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn update_memory_settings_updates_current_thread_memory_mode() -> Result<()> {
|
||||
let (mut app, _app_event_rx, _op_rx) = make_test_app_with_channels().await;
|
||||
let codex_home = tempdir()?;
|
||||
app.config.codex_home = codex_home.path().to_path_buf().abs();
|
||||
|
||||
let mut app_server = crate::start_embedded_app_server_for_picker(&app.config).await?;
|
||||
let started = app_server.start_thread(&app.config).await?;
|
||||
let thread_id = started.session.thread_id;
|
||||
app.active_thread_id = Some(thread_id);
|
||||
|
||||
app.update_memory_settings_with_app_server(
|
||||
&mut app_server,
|
||||
/*use_memories*/ true,
|
||||
/*generate_memories*/ false,
|
||||
)
|
||||
.await;
|
||||
|
||||
let state_db = codex_state::StateRuntime::init(
|
||||
codex_home.path().to_path_buf(),
|
||||
app.config.model_provider_id.clone(),
|
||||
)
|
||||
.await
|
||||
.expect("state db should initialize");
|
||||
let memory_mode = state_db
|
||||
.get_thread_memory_mode(thread_id)
|
||||
.await
|
||||
.expect("thread memory mode should be readable");
|
||||
assert_eq!(memory_mode.as_deref(), Some("disabled"));
|
||||
|
||||
app_server.shutdown().await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
||||
@@ -38,6 +38,9 @@ use codex_app_server_protocol::ThreadListParams;
|
||||
use codex_app_server_protocol::ThreadListResponse;
|
||||
use codex_app_server_protocol::ThreadLoadedListParams;
|
||||
use codex_app_server_protocol::ThreadLoadedListResponse;
|
||||
use codex_app_server_protocol::ThreadMemoryMode;
|
||||
use codex_app_server_protocol::ThreadMemoryModeSetParams;
|
||||
use codex_app_server_protocol::ThreadMemoryModeSetResponse;
|
||||
use codex_app_server_protocol::ThreadReadParams;
|
||||
use codex_app_server_protocol::ThreadReadResponse;
|
||||
use codex_app_server_protocol::ThreadRealtimeAppendAudioParams;
|
||||
@@ -511,6 +514,26 @@ impl AppServerSession {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub(crate) async fn thread_memory_mode_set(
|
||||
&mut self,
|
||||
thread_id: ThreadId,
|
||||
mode: ThreadMemoryMode,
|
||||
) -> Result<()> {
|
||||
let request_id = self.next_request_id();
|
||||
let _: ThreadMemoryModeSetResponse = self
|
||||
.client
|
||||
.request_typed(ClientRequest::ThreadMemoryModeSet {
|
||||
request_id,
|
||||
params: ThreadMemoryModeSetParams {
|
||||
thread_id: thread_id.to_string(),
|
||||
mode,
|
||||
},
|
||||
})
|
||||
.await
|
||||
.wrap_err("thread/memoryMode/set failed in TUI")?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub(crate) async fn thread_unsubscribe(&mut self, thread_id: ThreadId) -> Result<()> {
|
||||
let request_id = self.next_request_id();
|
||||
let _: ThreadUnsubscribeResponse = self
|
||||
|
||||
Reference in New Issue
Block a user