mirror of
https://github.com/openai/codex.git
synced 2026-11-03 19:53:25 +00:00
feat: include network_proxy in /debug-config
This commit is contained in:
@@ -174,6 +174,7 @@ use crate::protocol::RequestUserInputEvent;
|
||||
use crate::protocol::ReviewDecision;
|
||||
use crate::protocol::SandboxPolicy;
|
||||
use crate::protocol::SessionConfiguredEvent;
|
||||
use crate::protocol::SessionNetworkProxyRuntime;
|
||||
use crate::protocol::SkillDependencies as ProtocolSkillDependencies;
|
||||
use crate::protocol::SkillErrorInfo;
|
||||
use crate::protocol::SkillInterface as ProtocolSkillInterface;
|
||||
@@ -1076,6 +1077,14 @@ impl Session {
|
||||
})?),
|
||||
None => None,
|
||||
};
|
||||
let session_network_proxy = network_proxy.as_ref().map(|started| {
|
||||
let proxy = started.proxy();
|
||||
SessionNetworkProxyRuntime {
|
||||
http_addr: proxy.http_addr().to_string(),
|
||||
socks_addr: proxy.socks_addr().to_string(),
|
||||
admin_addr: proxy.admin_addr().to_string(),
|
||||
}
|
||||
});
|
||||
|
||||
let services = SessionServices {
|
||||
mcp_connection_manager: Arc::new(RwLock::new(McpConnectionManager::default())),
|
||||
@@ -1157,6 +1166,7 @@ impl Session {
|
||||
history_log_id,
|
||||
history_entry_count,
|
||||
initial_messages,
|
||||
network_proxy: session_network_proxy,
|
||||
rollout_path,
|
||||
}),
|
||||
})
|
||||
|
||||
@@ -98,6 +98,7 @@ fn session_configured_produces_thread_started_event() {
|
||||
history_log_id: 0,
|
||||
history_entry_count: 0,
|
||||
initial_messages: None,
|
||||
network_proxy: None,
|
||||
rollout_path: Some(rollout_path),
|
||||
}),
|
||||
);
|
||||
|
||||
@@ -307,6 +307,7 @@ mod tests {
|
||||
history_log_id: 1,
|
||||
history_entry_count: 1000,
|
||||
initial_messages: None,
|
||||
network_proxy: None,
|
||||
rollout_path: Some(rollout_file.path().to_path_buf()),
|
||||
}),
|
||||
};
|
||||
@@ -348,6 +349,7 @@ mod tests {
|
||||
history_log_id: 1,
|
||||
history_entry_count: 1000,
|
||||
initial_messages: None,
|
||||
network_proxy: None,
|
||||
rollout_path: Some(rollout_file.path().to_path_buf()),
|
||||
};
|
||||
let event = Event {
|
||||
@@ -413,6 +415,7 @@ mod tests {
|
||||
history_log_id: 1,
|
||||
history_entry_count: 1000,
|
||||
initial_messages: None,
|
||||
network_proxy: None,
|
||||
rollout_path: Some(rollout_file.path().to_path_buf()),
|
||||
};
|
||||
let event = Event {
|
||||
|
||||
@@ -363,6 +363,18 @@ impl NetworkProxy {
|
||||
NetworkProxyBuilder::default()
|
||||
}
|
||||
|
||||
pub fn http_addr(&self) -> SocketAddr {
|
||||
self.http_addr
|
||||
}
|
||||
|
||||
pub fn socks_addr(&self) -> SocketAddr {
|
||||
self.socks_addr
|
||||
}
|
||||
|
||||
pub fn admin_addr(&self) -> SocketAddr {
|
||||
self.admin_addr
|
||||
}
|
||||
|
||||
pub fn apply_to_env(&self, env: &mut HashMap<String, String>) {
|
||||
// Enforce proxying for child processes. We intentionally override existing values so
|
||||
// command-level environment cannot bypass the managed proxy endpoint.
|
||||
|
||||
@@ -2265,6 +2265,13 @@ pub struct SkillsListEntry {
|
||||
pub errors: Vec<SkillErrorInfo>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize, Serialize, JsonSchema, TS, PartialEq, Eq)]
|
||||
pub struct SessionNetworkProxyRuntime {
|
||||
pub http_addr: String,
|
||||
pub socks_addr: String,
|
||||
pub admin_addr: String,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize, Serialize, JsonSchema, TS)]
|
||||
pub struct SessionConfiguredEvent {
|
||||
pub session_id: ThreadId,
|
||||
@@ -2306,6 +2313,11 @@ pub struct SessionConfiguredEvent {
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub initial_messages: Option<Vec<EventMsg>>,
|
||||
|
||||
/// Runtime proxy bind addresses, when the managed proxy was started for this session.
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub network_proxy: Option<SessionNetworkProxyRuntime>,
|
||||
|
||||
/// Path in which the rollout is stored. Can be `None` for ephemeral threads
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub rollout_path: Option<PathBuf>,
|
||||
@@ -2696,6 +2708,7 @@ mod tests {
|
||||
history_log_id: 0,
|
||||
history_entry_count: 0,
|
||||
initial_messages: None,
|
||||
network_proxy: None,
|
||||
rollout_path: Some(rollout_file.path().to_path_buf()),
|
||||
}),
|
||||
};
|
||||
|
||||
@@ -2353,6 +2353,7 @@ impl App {
|
||||
history_log_id: 0,
|
||||
history_entry_count: 0,
|
||||
initial_messages: None,
|
||||
network_proxy: None,
|
||||
rollout_path: thread.rollout_path(),
|
||||
}),
|
||||
};
|
||||
@@ -3042,6 +3043,7 @@ mod tests {
|
||||
history_log_id: 0,
|
||||
history_entry_count: 0,
|
||||
initial_messages: None,
|
||||
network_proxy: None,
|
||||
rollout_path: Some(PathBuf::new()),
|
||||
};
|
||||
Arc::new(new_session_info(
|
||||
@@ -3096,6 +3098,7 @@ mod tests {
|
||||
history_log_id: 0,
|
||||
history_entry_count: 0,
|
||||
initial_messages: None,
|
||||
network_proxy: None,
|
||||
rollout_path: Some(PathBuf::new()),
|
||||
}),
|
||||
});
|
||||
@@ -3142,6 +3145,7 @@ mod tests {
|
||||
history_log_id: 0,
|
||||
history_entry_count: 0,
|
||||
initial_messages: None,
|
||||
network_proxy: None,
|
||||
rollout_path: Some(PathBuf::new()),
|
||||
};
|
||||
|
||||
|
||||
@@ -613,6 +613,8 @@ pub(crate) struct ChatWidget {
|
||||
current_rollout_path: Option<PathBuf>,
|
||||
// Current working directory (if known)
|
||||
current_cwd: Option<PathBuf>,
|
||||
// Runtime network proxy bind addresses from SessionConfigured.
|
||||
session_network_proxy: Option<codex_core::protocol::SessionNetworkProxyRuntime>,
|
||||
// Shared latch so we only warn once about invalid status-line item IDs.
|
||||
status_line_invalid_items_warned: Arc<AtomicBool>,
|
||||
// Cached git branch name for the status line (None if unknown).
|
||||
@@ -1015,6 +1017,7 @@ impl ChatWidget {
|
||||
self.bottom_pane
|
||||
.set_history_metadata(event.history_log_id, event.history_entry_count);
|
||||
self.set_skills(None);
|
||||
self.session_network_proxy = event.network_proxy.clone();
|
||||
self.thread_id = Some(event.session_id);
|
||||
self.thread_name = event.thread_name.clone();
|
||||
self.forked_from = event.forked_from_id;
|
||||
@@ -2658,6 +2661,7 @@ impl ChatWidget {
|
||||
feedback_audience,
|
||||
current_rollout_path: None,
|
||||
current_cwd,
|
||||
session_network_proxy: None,
|
||||
status_line_invalid_items_warned,
|
||||
status_line_branch: None,
|
||||
status_line_branch_cwd: None,
|
||||
@@ -2822,6 +2826,7 @@ impl ChatWidget {
|
||||
feedback_audience,
|
||||
current_rollout_path: None,
|
||||
current_cwd,
|
||||
session_network_proxy: None,
|
||||
status_line_invalid_items_warned,
|
||||
status_line_branch: None,
|
||||
status_line_branch_cwd: None,
|
||||
@@ -2975,6 +2980,7 @@ impl ChatWidget {
|
||||
feedback_audience,
|
||||
current_rollout_path: None,
|
||||
current_cwd,
|
||||
session_network_proxy: None,
|
||||
status_line_invalid_items_warned,
|
||||
status_line_branch: None,
|
||||
status_line_branch_cwd: None,
|
||||
@@ -4239,7 +4245,10 @@ impl ChatWidget {
|
||||
}
|
||||
|
||||
pub(crate) fn add_debug_config_output(&mut self) {
|
||||
self.add_to_history(crate::debug_config::new_debug_config_output(&self.config));
|
||||
self.add_to_history(crate::debug_config::new_debug_config_output(
|
||||
&self.config,
|
||||
self.session_network_proxy.as_ref(),
|
||||
));
|
||||
}
|
||||
|
||||
fn open_status_line_setup(&mut self) {
|
||||
|
||||
@@ -164,6 +164,7 @@ async fn resumed_initial_messages_render_history() {
|
||||
message: "assistant reply".to_string(),
|
||||
}),
|
||||
]),
|
||||
network_proxy: None,
|
||||
rollout_path: Some(rollout_file.path().to_path_buf()),
|
||||
};
|
||||
|
||||
@@ -226,6 +227,7 @@ async fn replayed_user_message_preserves_text_elements_and_local_images() {
|
||||
text_elements: text_elements.clone(),
|
||||
local_images: local_images.clone(),
|
||||
})]),
|
||||
network_proxy: None,
|
||||
rollout_path: Some(rollout_file.path().to_path_buf()),
|
||||
};
|
||||
|
||||
@@ -338,6 +340,7 @@ async fn submission_preserves_text_elements_and_local_images() {
|
||||
history_log_id: 0,
|
||||
history_entry_count: 0,
|
||||
initial_messages: None,
|
||||
network_proxy: None,
|
||||
rollout_path: Some(rollout_file.path().to_path_buf()),
|
||||
};
|
||||
chat.handle_codex_event(Event {
|
||||
@@ -417,6 +420,7 @@ async fn submission_prefers_selected_duplicate_skill_path() {
|
||||
history_log_id: 0,
|
||||
history_entry_count: 0,
|
||||
initial_messages: None,
|
||||
network_proxy: None,
|
||||
rollout_path: Some(rollout_file.path().to_path_buf()),
|
||||
};
|
||||
chat.handle_codex_event(Event {
|
||||
@@ -1108,6 +1112,7 @@ async fn make_chatwidget_manual(
|
||||
feedback_audience: FeedbackAudience::External,
|
||||
current_rollout_path: None,
|
||||
current_cwd: None,
|
||||
session_network_proxy: None,
|
||||
status_line_invalid_items_warned: Arc::new(AtomicBool::new(false)),
|
||||
status_line_branch: None,
|
||||
status_line_branch_cwd: None,
|
||||
@@ -2973,6 +2978,7 @@ async fn plan_slash_command_with_args_submits_prompt_in_plan_mode() {
|
||||
history_log_id: 0,
|
||||
history_entry_count: 0,
|
||||
initial_messages: None,
|
||||
network_proxy: None,
|
||||
rollout_path: None,
|
||||
};
|
||||
chat.handle_codex_event(Event {
|
||||
|
||||
@@ -8,11 +8,31 @@ use codex_core::config_loader::RequirementSource;
|
||||
use codex_core::config_loader::ResidencyRequirement;
|
||||
use codex_core::config_loader::SandboxModeRequirement;
|
||||
use codex_core::config_loader::WebSearchModeRequirement;
|
||||
use codex_core::protocol::SessionNetworkProxyRuntime;
|
||||
use ratatui::style::Stylize;
|
||||
use ratatui::text::Line;
|
||||
|
||||
pub(crate) fn new_debug_config_output(config: &Config) -> PlainHistoryCell {
|
||||
PlainHistoryCell::new(render_debug_config_lines(&config.config_layer_stack))
|
||||
pub(crate) fn new_debug_config_output(
|
||||
config: &Config,
|
||||
session_network_proxy: Option<&SessionNetworkProxyRuntime>,
|
||||
) -> PlainHistoryCell {
|
||||
let mut lines = render_debug_config_lines(&config.config_layer_stack);
|
||||
|
||||
if let Some(proxy) = session_network_proxy {
|
||||
lines.push("".into());
|
||||
lines.push("Session runtime:".bold().into());
|
||||
lines.push(" - network_proxy".into());
|
||||
let SessionNetworkProxyRuntime {
|
||||
http_addr,
|
||||
socks_addr,
|
||||
admin_addr,
|
||||
} = proxy;
|
||||
lines.push(format!(" - HTTP_PROXY = http://{http_addr}").into());
|
||||
lines.push(format!(" - ALL_PROXY = socks5h://{socks_addr}").into());
|
||||
lines.push(format!(" - ADMIN_PROXY = http://{admin_addr}").into());
|
||||
}
|
||||
|
||||
PlainHistoryCell::new(lines)
|
||||
}
|
||||
|
||||
fn render_debug_config_lines(stack: &ConfigLayerStack) -> Vec<Line<'static>> {
|
||||
|
||||
Reference in New Issue
Block a user