feat: parse info from auth.json and show in /status (#1923)

- `/status` renders
    ```
    signed in with chatgpt
      login: example@example.com
      plan: plus
    ```
- Setup for using this info in a few more places.

---------

Co-authored-by: Michael Bolin <mbolin@openai.com>
This commit is contained in:
ae
2025-08-07 01:27:45 -07:00
committed by GitHub
parent 6d19b73edf
commit 0334476894
6 changed files with 254 additions and 47 deletions

View File

@@ -15,6 +15,8 @@ use codex_core::protocol::FileChange;
use codex_core::protocol::McpInvocation;
use codex_core::protocol::SessionConfiguredEvent;
use codex_core::protocol::TokenUsage;
use codex_login::get_auth_file;
use codex_login::try_read_auth_json;
use image::DynamicImage;
use image::ImageReader;
use mcp_types::EmbeddedResourceResource;
@@ -469,8 +471,38 @@ impl HistoryCell {
lines.push(Line::from(vec![format!("{key}: ").bold(), value.into()]));
}
// Token usage
lines.push(Line::from(""));
// Auth
let auth_file = get_auth_file(&config.codex_home);
if let Ok(auth) = try_read_auth_json(&auth_file) {
if auth.tokens.as_ref().is_some() {
lines.push(Line::from("signed in with chatgpt".bold()));
if let Some(tokens) = auth.tokens.as_ref() {
let info = tokens.id_token.clone();
if let Some(email) = info.email {
lines.push(Line::from(vec![" login: ".bold(), email.into()]));
}
match auth.openai_api_key.as_deref() {
Some(key) if !key.is_empty() => {
lines.push(Line::from(" using api key"));
}
_ => {
let plan_text = info
.chatgpt_plan_type
.unwrap_or_else(|| "Unknown".to_string());
lines.push(Line::from(vec![" plan: ".bold(), plan_text.into()]));
}
}
}
lines.push(Line::from(""));
}
}
// Token usage
lines.push(Line::from("token usage".bold()));
lines.push(Line::from(vec![
" input: ".bold(),