Skip to content

Commit dee70e8

Browse files
SamigosDimillian
andauthored
feat(settings): auto-generate new thread titles (#382)
Co-authored-by: Thomas Ricouard <ricouard77@gmail.com>
1 parent 9aee0a3 commit dee70e8

21 files changed

Lines changed: 584 additions & 200 deletions

docs/mobile-ios-cloudflare-blueprint.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ Implemented in shared core + daemon/app adapters:
237237
- Workspace/app extras:
238238
- `add_clone`, `apply_worktree_changes`, `open_workspace_in`, `get_open_app_icon`
239239
- Utility commands:
240-
- `codex_doctor`, `get_commit_message_prompt`, `generate_commit_message`, `generate_run_metadata`, `local_usage_snapshot`, `send_notification_fallback`, `is_macos_debug_build`, `menu_set_accelerators`
240+
- `codex_doctor`, `generate_commit_message`, `generate_run_metadata`, `local_usage_snapshot`, `send_notification_fallback`, `is_macos_debug_build`, `menu_set_accelerators`
241241

242242
Out of scope for this mobile phase:
243243

src-tauri/src/bin/codex_monitor_daemon.rs

Lines changed: 7 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,107 +1101,43 @@ impl DaemonState {
11011101
codex_aux_core::codex_doctor_core(&self.app_settings, codex_bin, codex_args).await
11021102
}
11031103

1104-
async fn get_commit_message_prompt(&self, workspace_id: String) -> Result<String, String> {
1105-
let repo_root =
1106-
git_ui_core::resolve_repo_root_for_workspace_core(&self.workspaces, workspace_id)
1107-
.await?;
1108-
let diff = git_ui_core::collect_workspace_diff_core(&repo_root)?;
1109-
if diff.trim().is_empty() {
1110-
return Err("No changes to generate commit message for".to_string());
1111-
}
1112-
let commit_message_prompt = {
1113-
let settings = self.app_settings.lock().await;
1114-
settings.commit_message_prompt.clone()
1115-
};
1116-
Ok(codex_aux_core::build_commit_message_prompt(
1117-
&diff,
1118-
&commit_message_prompt,
1119-
))
1120-
}
1121-
11221104
async fn generate_commit_message(&self, workspace_id: String) -> Result<String, String> {
11231105
let repo_root = git_ui_core::resolve_repo_root_for_workspace_core(
11241106
&self.workspaces,
11251107
workspace_id.clone(),
11261108
)
11271109
.await?;
11281110
let diff = git_ui_core::collect_workspace_diff_core(&repo_root)?;
1129-
if diff.trim().is_empty() {
1130-
return Err("No changes to generate commit message for".to_string());
1131-
}
11321111
let commit_message_prompt = {
11331112
let settings = self.app_settings.lock().await;
11341113
settings.commit_message_prompt.clone()
11351114
};
1136-
let prompt = codex_aux_core::build_commit_message_prompt(
1137-
&diff,
1138-
&commit_message_prompt,
1139-
);
1140-
let response = codex_aux_core::run_background_prompt_core(
1115+
codex_aux_core::generate_commit_message_core(
11411116
&self.sessions,
11421117
workspace_id,
1143-
prompt,
1118+
&diff,
1119+
&commit_message_prompt,
11441120
|workspace_id, thread_id| {
11451121
emit_background_thread_hide(&self.event_sink, workspace_id, thread_id);
11461122
},
1147-
"Timeout waiting for commit message generation",
1148-
"Unknown error during commit message generation",
11491123
)
1150-
.await?;
1151-
1152-
let trimmed = response.trim().to_string();
1153-
if trimmed.is_empty() {
1154-
return Err("No commit message was generated".to_string());
1155-
}
1156-
Ok(trimmed)
1124+
.await
11571125
}
11581126

11591127
async fn generate_run_metadata(
11601128
&self,
11611129
workspace_id: String,
11621130
prompt: String,
11631131
) -> Result<Value, String> {
1164-
let cleaned_prompt = prompt.trim();
1165-
if cleaned_prompt.is_empty() {
1166-
return Err("Prompt is required.".to_string());
1167-
}
1168-
1169-
let title_prompt = codex_aux_core::build_run_metadata_prompt(cleaned_prompt);
1170-
let response_text = codex_aux_core::run_background_prompt_core(
1132+
codex_aux_core::generate_run_metadata_core(
11711133
&self.sessions,
11721134
workspace_id,
1173-
title_prompt,
1135+
&prompt,
11741136
|workspace_id, thread_id| {
11751137
emit_background_thread_hide(&self.event_sink, workspace_id, thread_id);
11761138
},
1177-
"Timeout waiting for metadata generation",
1178-
"Unknown error during metadata generation",
11791139
)
1180-
.await?;
1181-
1182-
let trimmed = response_text.trim();
1183-
if trimmed.is_empty() {
1184-
return Err("No metadata was generated".to_string());
1185-
}
1186-
let json_value = codex_aux_core::extract_json_value(trimmed)
1187-
.ok_or_else(|| "Failed to parse metadata JSON".to_string())?;
1188-
let title = json_value
1189-
.get("title")
1190-
.and_then(|v| v.as_str())
1191-
.map(|v| v.trim().to_string())
1192-
.filter(|v| !v.is_empty())
1193-
.ok_or_else(|| "Missing title in metadata".to_string())?;
1194-
let worktree_name = json_value
1195-
.get("worktreeName")
1196-
.or_else(|| json_value.get("worktree_name"))
1197-
.and_then(|v| v.as_str())
1198-
.map(codex_aux_core::sanitize_run_worktree_name)
1199-
.filter(|v| !v.is_empty())
1200-
.ok_or_else(|| "Missing worktree name in metadata".to_string())?;
1201-
Ok(json!({
1202-
"title": title,
1203-
"worktreeName": worktree_name
1204-
}))
1140+
.await
12051141
}
12061142

12071143
async fn local_usage_snapshot(

src-tauri/src/bin/codex_monitor_daemon/rpc.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -695,11 +695,6 @@ pub(super) async fn handle_rpc_request(
695695
let codex_args = parse_optional_string(&params, "codexArgs");
696696
state.codex_doctor(codex_bin, codex_args).await
697697
}
698-
"get_commit_message_prompt" => {
699-
let workspace_id = parse_string(&params, "workspaceId")?;
700-
let prompt = state.get_commit_message_prompt(workspace_id).await?;
701-
Ok(Value::String(prompt))
702-
}
703698
"generate_commit_message" => {
704699
let workspace_id = parse_string(&params, "workspaceId")?;
705700
let message = state.generate_commit_message(workspace_id).await?;

src-tauri/src/codex/mod.rs

Lines changed: 7 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -550,42 +550,6 @@ pub(crate) async fn respond_to_server_request(
550550
.await
551551
}
552552

553-
/// Gets the diff content for commit message generation
554-
#[tauri::command]
555-
pub(crate) async fn get_commit_message_prompt(
556-
workspace_id: String,
557-
state: State<'_, AppState>,
558-
app: AppHandle,
559-
) -> Result<String, String> {
560-
if remote_backend::is_remote_mode(&*state).await {
561-
let value = remote_backend::call_remote(
562-
&*state,
563-
app,
564-
"get_commit_message_prompt",
565-
json!({ "workspaceId": workspace_id }),
566-
)
567-
.await?;
568-
return serde_json::from_value(value).map_err(|err| err.to_string());
569-
}
570-
571-
// Get the diff from git
572-
let diff = crate::git::get_workspace_diff(&workspace_id, &state).await?;
573-
574-
if diff.trim().is_empty() {
575-
return Err("No changes to generate commit message for".to_string());
576-
}
577-
578-
let commit_message_prompt = {
579-
let settings = state.app_settings.lock().await;
580-
settings.commit_message_prompt.clone()
581-
};
582-
583-
Ok(crate::shared::codex_aux_core::build_commit_message_prompt(
584-
&diff,
585-
&commit_message_prompt,
586-
))
587-
}
588-
589553
#[tauri::command]
590554
pub(crate) async fn remember_approval_rule(
591555
workspace_id: String,
@@ -634,22 +598,15 @@ pub(crate) async fn generate_commit_message(
634598

635599
let diff = crate::git::get_workspace_diff(&workspace_id, &state).await?;
636600

637-
if diff.trim().is_empty() {
638-
return Err("No changes to generate commit message for".to_string());
639-
}
640-
641601
let commit_message_prompt = {
642602
let settings = state.app_settings.lock().await;
643603
settings.commit_message_prompt.clone()
644604
};
645-
let prompt = crate::shared::codex_aux_core::build_commit_message_prompt(
646-
&diff,
647-
&commit_message_prompt,
648-
);
649-
let response = crate::shared::codex_aux_core::run_background_prompt_core(
605+
crate::shared::codex_aux_core::generate_commit_message_core(
650606
&state.sessions,
651607
workspace_id,
652-
prompt,
608+
&diff,
609+
&commit_message_prompt,
653610
|workspace_id, thread_id| {
654611
let _ = app.emit(
655612
"app-server-event",
@@ -665,17 +622,8 @@ pub(crate) async fn generate_commit_message(
665622
},
666623
);
667624
},
668-
"Timeout waiting for commit message generation",
669-
"Unknown error during commit message generation",
670625
)
671-
.await?;
672-
673-
let trimmed = response.trim().to_string();
674-
if trimmed.is_empty() {
675-
return Err("No commit message was generated".to_string());
676-
}
677-
678-
Ok(trimmed)
626+
.await
679627
}
680628

681629
#[tauri::command]
@@ -695,16 +643,10 @@ pub(crate) async fn generate_run_metadata(
695643
.await;
696644
}
697645

698-
let cleaned_prompt = prompt.trim();
699-
if cleaned_prompt.is_empty() {
700-
return Err("Prompt is required.".to_string());
701-
}
702-
703-
let title_prompt = crate::shared::codex_aux_core::build_run_metadata_prompt(cleaned_prompt);
704-
let response_text = crate::shared::codex_aux_core::run_background_prompt_core(
646+
crate::shared::codex_aux_core::generate_run_metadata_core(
705647
&state.sessions,
706648
workspace_id,
707-
title_prompt,
649+
&prompt,
708650
|workspace_id, thread_id| {
709651
let _ = app.emit(
710652
"app-server-event",
@@ -720,34 +662,6 @@ pub(crate) async fn generate_run_metadata(
720662
},
721663
);
722664
},
723-
"Timeout waiting for metadata generation",
724-
"Unknown error during metadata generation",
725665
)
726-
.await?;
727-
728-
let trimmed = response_text.trim();
729-
if trimmed.is_empty() {
730-
return Err("No metadata was generated".to_string());
731-
}
732-
733-
let json_value = crate::shared::codex_aux_core::extract_json_value(trimmed)
734-
.ok_or_else(|| "Failed to parse metadata JSON".to_string())?;
735-
let title = json_value
736-
.get("title")
737-
.and_then(|v| v.as_str())
738-
.map(|v| v.trim().to_string())
739-
.filter(|v| !v.is_empty())
740-
.ok_or_else(|| "Missing title in metadata".to_string())?;
741-
let worktree_name = json_value
742-
.get("worktreeName")
743-
.or_else(|| json_value.get("worktree_name"))
744-
.and_then(|v| v.as_str())
745-
.map(crate::shared::codex_aux_core::sanitize_run_worktree_name)
746-
.filter(|v| !v.is_empty())
747-
.ok_or_else(|| "Missing worktree name in metadata".to_string())?;
748-
749-
Ok(json!({
750-
"title": title,
751-
"worktreeName": worktree_name
752-
}))
666+
.await
753667
}

src-tauri/src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,6 @@ pub fn run() {
229229
codex::start_review,
230230
codex::respond_to_server_request,
231231
codex::remember_approval_rule,
232-
codex::get_commit_message_prompt,
233232
codex::generate_commit_message,
234233
codex::generate_run_metadata,
235234
codex::resume_thread,

src-tauri/src/remote_backend/mod.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,6 @@ fn can_retry_after_disconnect(method: &str) -> bool {
130130
| "file_read"
131131
| "get_config_model"
132132
| "get_git_commit_diff"
133-
| "get_commit_message_prompt"
134133
| "get_git_diffs"
135134
| "get_git_log"
136135
| "get_git_remote"
@@ -255,7 +254,6 @@ mod tests {
255254
fn retries_only_retry_safe_methods_after_disconnect() {
256255
assert!(can_retry_after_disconnect("resume_thread"));
257256
assert!(can_retry_after_disconnect("list_threads"));
258-
assert!(can_retry_after_disconnect("get_commit_message_prompt"));
259257
assert!(can_retry_after_disconnect("local_usage_snapshot"));
260258
assert!(!can_retry_after_disconnect("send_user_message"));
261259
assert!(!can_retry_after_disconnect("start_thread"));

0 commit comments

Comments
 (0)