From 296ece113f6f743c9a60f1b3aa95601d74a6353c Mon Sep 17 00:00:00 2001 From: thesiti92 Date: Mon, 26 Oct 2026 16:39:19 -0400 Subject: [PATCH 1/5] Make the summary length limit an option and lift it in Test setup Summaries longer than max_length_ratio (default 0.67, as before) of the body are discarded. Test setup lifts the limit when diffr supports it, so it checks the credential and model instead of the sample's length. The code fence models add despite the prompt is stripped first. Agent-Session: 02fbf542-41e9-4dde-86c4-2f75d6db972d Agent-Session: 7d7ae491-dbed-4fe3-8bc2-fe4851572ede Agent-Session: 5625cb14-3381-4fef-8d68-2cdc27ef7155 Agent-Session: ab3076ed-7808-4738-a770-0261b6018801 Agent-Session: 9a4dd689-814b-4ec4-aee5-d93cc4647727 Agent-Session: 99993da5-66b9-4872-b400-ba7f8c41628b Agent-Session: e05d0ee1-ebec-4824-922f-319222ec3817 --- diffr/docs/agents.md | 1 + diffr/plugins/shape/summarize/plugin.toml | 7 +++ diffr/plugins/shape/summarize/rust/src/lib.rs | 20 +++++++-- diffr/src/plugin/tests/summarize.rs | 18 +++++++- packages/review/src/server/diffr-config.ts | 44 ++++++++++++------- 5 files changed, 68 insertions(+), 22 deletions(-) diff --git a/diffr/docs/agents.md b/diffr/docs/agents.md index e0c6da36df..065275e72e 100644 --- a/diffr/docs/agents.md +++ b/diffr/docs/agents.md @@ -48,6 +48,7 @@ use. The bundled plugins' settings: | `summarize.min_lines` | 20 | New bodies shorter than this are shown as code. | | `summarize.tests` | true | Summarize new test bodies too. | | `summarize.test_min_lines` | 20 | Shorter test bodies keep their ordinary labels. | +| `summarize.max_length_ratio` | 0.67 | Pseudocode longer than this fraction of the body is discarded. | | `summarize.system_prompt` | built in | The instruction sent with each body. Change it to change the style of the summaries. | | `summarize.request_timeout_ms` | 60000 | Timeout for each request. | | `summarize.retries` | 3 | Retries after a timeout, rate limit or server error. | diff --git a/diffr/plugins/shape/summarize/plugin.toml b/diffr/plugins/shape/summarize/plugin.toml index 2fcb8c9f49..9fda793e99 100644 --- a/diffr/plugins/shape/summarize/plugin.toml +++ b/diffr/plugins/shape/summarize/plugin.toml @@ -34,6 +34,13 @@ title = "Shortest body to summarize (lines)" description = "New function bodies shorter than this are shown as code, not summarized: pseudocode only pays off once the body is long." default = 20 +[options.max_length_ratio] +type = "number" +exclusiveMinimum = 0 +title = "Longest summary" +description = "Summaries longer than this fraction of the body are discarded." +default = 0.67 + [options.api_key] type = "string" "x-reset-by" = "provider" diff --git a/diffr/plugins/shape/summarize/rust/src/lib.rs b/diffr/plugins/shape/summarize/rust/src/lib.rs index 3e9a401715..9b92981188 100644 --- a/diffr/plugins/shape/summarize/rust/src/lib.rs +++ b/diffr/plugins/shape/summarize/rust/src/lib.rs @@ -28,6 +28,7 @@ pub struct Options { pub min_lines: usize, pub tests: bool, pub test_min_lines: usize, + pub max_length_ratio: f64, pub api_key: Option, pub endpoint: Option, pub request_timeout_ms: u64, @@ -119,10 +120,21 @@ impl Summarize { .text(&text) .ok_or_else(|| failed("no text in the response".to_owned()))? .trim(); + let pseudocode = unfenced(pseudocode).trim(); Ok((!pseudocode.is_empty()).then(|| pseudocode.to_owned())) } } +fn unfenced(text: &str) -> &str { + let Some((opening, rest)) = text.split_once('\n') else { + return text; + }; + match rest.strip_suffix("```") { + Some(inner) if opening.starts_with("```") => inner, + _ => text, + } +} + /// The API key: the `api_key` option, or else the first of the provider's /// environment variables that is set and not empty. `Missing` says why on /// stderr. @@ -204,10 +216,10 @@ impl GuestPlugin for Summarize { else { return Ok(false); }; - // Pseudocode earns its place only when it is at most two thirds as - // long as the body; otherwise the body keeps its original visibility. - let size = |text: &str| text.chars().filter(|c| !c.is_whitespace()).count(); - if size(&pseudocode) * 3 > size(&text) * 2 { + // Pseudocode earns its place only when it is short enough; otherwise + // the body keeps its original visibility. + let size = |text: &str| text.chars().filter(|c| !c.is_whitespace()).count() as f64; + if size(&pseudocode) > size(&text) * self.options.max_length_ratio { return Ok(false); } cursor.set_collapsed(data.id, true)?; diff --git a/diffr/src/plugin/tests/summarize.rs b/diffr/src/plugin/tests/summarize.rs index f7787fd58b..fc322fe1bc 100644 --- a/diffr/src/plugin/tests/summarize.rs +++ b/diffr/src/plugin/tests/summarize.rs @@ -207,6 +207,22 @@ fn long_summaries_are_discarded_without_changing_initial_folding() { assert_eq!(folds, vec![(false, String::new())]); } +#[test] +fn a_higher_length_ratio_keeps_a_long_summary() { + let (file, mut sides) = project("a.py", "", LARGE); + let (endpoint, server) = serve(vec![(200, gemini_answer("a()\nb()\nc()"))]); + let pipeline = summarizer_with(json!({ + "api_key": "test", + "endpoint": endpoint, + "min_lines": 3, + "retries": 0, + "max_length_ratio": 100.0, + })); + shape(&pipeline, &file, &mut sides).unwrap(); + server.join().unwrap(); + assert_eq!(fold_label(&sides), "a()\nb()\nc()"); +} + #[test] fn summaries_collapse_selected_folds_behind_pseudocode() { let (file, mut sides) = project("a.py", "", LARGE); @@ -318,7 +334,7 @@ fn each_provider_sends_its_own_request_and_reads_its_own_answer() { ( "anthropic", "", - json!({"content": [{"type": "thinking", "thinking": "hmm"}, {"type": "text", "text": "a b c"}]}), + json!({"content": [{"type": "thinking", "thinking": "hmm"}, {"type": "text", "text": "```pseudo\na b c\n```"}]}), "x-api-key: test-key", ), ] { diff --git a/packages/review/src/server/diffr-config.ts b/packages/review/src/server/diffr-config.ts index 3d34cf1300..ed012e7942 100644 --- a/packages/review/src/server/diffr-config.ts +++ b/packages/review/src/server/diffr-config.ts @@ -203,27 +203,30 @@ function strings(value: JsonValue | undefined): string[] { return Array.isArray(value) ? value.filter(isStringValue) : []; } +const summarizeSchema = + "properties.plugins.properties.shape.properties.bundled.properties.summarize.properties"; + +async function readSchema(rootPath?: string): Promise { + try { + return json(await diffr({ command: "schema" }, rootPath)); + } catch { + return undefined; + } +} + /** * Defaults supplied by diffr's schema for tag hiding and summary controls. * If the schema cannot be read, resolved settings still work. */ -async function configDefaults( - rootPath?: string, -): Promise< - Pick +function configDefaults( + schema: JsonObject | undefined, +): Pick< + ReviewDiffrConfig, + "providers" | "defaultPrompt" | "defaultHiddenTags" > { - let schema: JsonObject; - - try { - schema = json(await diffr({ command: "schema" }, rootPath)); - } catch { - return {}; - } + if (!schema) return {}; - const options = valueAt( - schema, - "properties.plugins.properties.shape.properties.bundled.properties.summarize.properties", - ); + const options = valueAt(schema, summarizeSchema); const defaultHiddenTags = strings( valueAt( @@ -269,7 +272,7 @@ async function configDefaults( async function read(rootPath?: string): Promise { const config = await values(rootPath); - const defaults = await configDefaults(rootPath); + const defaults = configDefaults(await readSchema(rootPath)); const saved = valueAt(config, `${prefix}.api_key`); const credentialSource = @@ -421,7 +424,8 @@ export async function testDiffrSummarizer( throw new Error("The summarizer is not available in this configuration."); const { provider, endpoint, model, systemPrompt } = parsed.data; - const providers = (await configDefaults(rootPath)).providers ?? []; + const schema = await readSchema(rootPath); + const providers = configDefaults(schema).providers ?? []; const variables = providers.find((known) => known.id === provider)?.keyVariables ?? []; @@ -444,6 +448,12 @@ export async function testDiffrSummarizer( model, ...(systemPrompt.trim() && { system_prompt: systemPrompt }), min_lines: 1, + ...(schema && + isJsonObject( + valueAt(schema, `${summarizeSchema}.max_length_ratio`), + ) && { + max_length_ratio: 1000, + }), retries: 0, request_timeout_ms: 45_000, }; From 8acbfa5a28276fa843b9d2521e88678a77056251 Mon Sep 17 00:00:00 2001 From: thesiti92 Date: Mon, 26 Oct 2026 16:39:29 -0400 Subject: [PATCH 2/5] Add a codex provider to the summarizer It calls the ChatGPT backend Codex uses: the streamed Responses API with a ChatGPT token. provider_details.login names the sign-in the host reads when no key is set. Agent-Session: 02fbf542-41e9-4dde-86c4-2f75d6db972d Agent-Session: 7d7ae491-dbed-4fe3-8bc2-fe4851572ede Agent-Session: 5625cb14-3381-4fef-8d68-2cdc27ef7155 Agent-Session: ab3076ed-7808-4738-a770-0261b6018801 Agent-Session: 9a4dd689-814b-4ec4-aee5-d93cc4647727 Agent-Session: 99993da5-66b9-4872-b400-ba7f8c41628b Agent-Session: e05d0ee1-ebec-4824-922f-319222ec3817 --- diffr/crates/diffr-core/src/config/store.rs | 2 +- diffr/docs/agents.md | 6 +- diffr/plugins/shape/summarize/plugin.toml | 15 +++-- diffr/plugins/shape/summarize/plugin.wasm | Bin 613519 -> 633237 bytes diffr/plugins/shape/summarize/rust/src/lib.rs | 17 +++--- .../shape/summarize/rust/src/provider.rs | 54 +++++++++++++++--- diffr/src/plugin/tests/summarize.rs | 28 +++++++++ 7 files changed, 97 insertions(+), 25 deletions(-) diff --git a/diffr/crates/diffr-core/src/config/store.rs b/diffr/crates/diffr-core/src/config/store.rs index 42704fd32e..26d2e99257 100644 --- a/diffr/crates/diffr-core/src/config/store.rs +++ b/diffr/crates/diffr-core/src/config/store.rs @@ -498,7 +498,7 @@ mod tests { ); assert_eq!( error("plugins.shape.bundled.summarize.provider", "mistral"), - "plugins.shape.bundled.summarize.provider: expected one of \"gemini\", \"openai\", \"anthropic\", got \"mistral\"" + "plugins.shape.bundled.summarize.provider: expected one of \"gemini\", \"openai\", \"anthropic\", \"codex\", got \"mistral\"" ); assert_eq!( error("plugins.shape.mine.enabled", "true"), diff --git a/diffr/docs/agents.md b/diffr/docs/agents.md index 065275e72e..c742e150f6 100644 --- a/diffr/docs/agents.md +++ b/diffr/docs/agents.md @@ -40,10 +40,10 @@ use. The bundled plugins' settings: | `deleted-bodies.min_lines` | 12 | Deleted bodies shorter than this stay open. | | `removed-runs.min_lines` | 5 | Removed stretches shorter than this stay open. | | `test-bodies.min_lines` | 3 | Test bodies shorter than this stay open. | -| `summarize.enabled` | false | LLM pseudocode summaries of large new bodies and tests. Needs a key. | -| `summarize.provider` | `gemini` | `gemini`, `openai` or `anthropic`. Changing it clears `api_key`. | +| `summarize.enabled` | false | LLM pseudocode summaries of large new bodies and tests. Needs a key or the Codex sign-in. | +| `summarize.provider` | `gemini` | `gemini`, `openai`, `anthropic` or `codex`. Changing it clears `api_key`. | | `summarize.model` | the provider's | The model name sent to the provider. | -| `summarize.api_key` | unset | Without it, the provider's variable in the environment is used: `GEMINI_API_KEY` or `GOOGLE_API_KEY`, `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`. | +| `summarize.api_key` | unset | Without it, the provider's variable in the environment is used: `GEMINI_API_KEY` or `GOOGLE_API_KEY`, `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`. `codex` reads Codex's saved sign-in instead; `diffr config logins` says whether it is ready. | | `summarize.endpoint` | the provider's | Another base URL: a proxy, OpenRouter, or a local OpenAI-compatible server with `provider = "openai"`. | | `summarize.min_lines` | 20 | New bodies shorter than this are shown as code. | | `summarize.tests` | true | Summarize new test bodies too. | diff --git a/diffr/plugins/shape/summarize/plugin.toml b/diffr/plugins/shape/summarize/plugin.toml index 9fda793e99..3337f35224 100644 --- a/diffr/plugins/shape/summarize/plugin.toml +++ b/diffr/plugins/shape/summarize/plugin.toml @@ -11,10 +11,10 @@ description = "Summarize large new function bodies and new tests as pseudocode. default = false [options.provider] -enum = ["gemini", "openai", "anthropic"] -"x-enum-titles" = ["Gemini", "OpenAI", "Anthropic"] +enum = ["gemini", "openai", "anthropic", "codex"] +"x-enum-titles" = ["Gemini", "OpenAI", "Anthropic", "Codex"] title = "Provider" -description = "Which model API to call. `openai` also reaches OpenRouter and any other OpenAI-compatible server through `endpoint`." +description = "Which model API to call. `openai` also reaches OpenRouter and any other OpenAI-compatible server through `endpoint`. `codex` uses Codex's saved sign-in." default = "gemini" [options.model] @@ -25,7 +25,7 @@ description = "The model name sent to the provider. Unset uses the provider's de [options.model."x-default-by"] key = "provider" -values = { gemini = "gemini-3.8-flash", openai = "gpt-6-luna", anthropic = "claude-haiku-5-5" } +values = { gemini = "gemini-3.8-flash", openai = "gpt-6-luna", anthropic = "claude-haiku-5-5", codex = "gpt-6-luna" } [options.min_lines] type = "integer" @@ -158,6 +158,7 @@ additionalProperties = false endpoint = { type = "string" } key_variables = { type = "array", items = { type = "string" } } keyless_custom_endpoint = { type = "boolean" } +login = { enum = ["codex"] } [options.provider_details."x-default-by"] key = "provider" @@ -177,6 +178,12 @@ endpoint = "https://api.anthropic.com" key_variables = ["ANTHROPIC_API_KEY"] keyless_custom_endpoint = false +[options.provider_details."x-default-by".values.codex] +endpoint = "https://chatgpt.com/backend-api/codex" +key_variables = [] +keyless_custom_endpoint = false +login = "codex" + # The fold queries for each language, as files in this folder. [queries] rust = "queries/rust.scm" diff --git a/diffr/plugins/shape/summarize/plugin.wasm b/diffr/plugins/shape/summarize/plugin.wasm index b351ac257d95b29c5b4478778484886402fc79ac..ad68b3f4058efdbbae173786c7e64e9aad9b9690 100644 GIT binary patch delta 146180 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 delta 128644 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

n3;RL)+MEfHMskQ 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

XAzKFpb{QQ* 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 { - break serde_json::from_slice(&body) - .map_err(|error| failed(error.to_string()))?; - } + Ok((status, body)) if (200..300).contains(&status) => break body, Ok((status, _)) if status == 429 || status >= 500 => format!("HTTP {status}"), Ok((status, body)) => { return Err(failed(format!( @@ -117,10 +114,9 @@ impl Summarize { } }; let pseudocode = provider - .text(&text) - .ok_or_else(|| failed("no text in the response".to_owned()))? - .trim(); - let pseudocode = unfenced(pseudocode).trim(); + .text(&body) + .ok_or_else(|| failed("no text in the response".to_owned()))?; + let pseudocode = unfenced(pseudocode.trim()).trim(); Ok((!pseudocode.is_empty()).then(|| pseudocode.to_owned())) } } @@ -158,6 +154,9 @@ fn resolve_key(config: &Options, custom_endpoint: bool) -> Key { if config.provider_details.keyless_custom_endpoint && custom_endpoint { return Key::NotRequired; } + if config.provider_details.login.is_some() { + return Key::Missing; + } eprintln!( "summarize: off for this run: no API key: set plugins.shape.bundled.summarize.api_key, or {} in the environment, or turn the summarizer off with plugins.shape.bundled.summarize.enabled = false", variables.join(" or ") diff --git a/diffr/plugins/shape/summarize/rust/src/provider.rs b/diffr/plugins/shape/summarize/rust/src/provider.rs index 2e957b2068..2da1e34aba 100644 --- a/diffr/plugins/shape/summarize/rust/src/provider.rs +++ b/diffr/plugins/shape/summarize/rust/src/provider.rs @@ -14,6 +14,8 @@ pub struct Details { /// Whether a custom endpoint may go without a key, as OpenAI-compatible /// servers such as Ollama often do. pub keyless_custom_endpoint: bool, + #[serde(default)] + pub login: Option, } #[derive(Clone, Copy, Debug, PartialEq, Eq, Deserialize)] @@ -22,6 +24,7 @@ pub enum Provider { Gemini, OpenAi, Anthropic, + Codex, } impl Provider { @@ -31,6 +34,7 @@ impl Provider { Self::Gemini => format!("{endpoint}/v1beta/models/{model}:generateContent"), Self::OpenAi => format!("{endpoint}/chat/completions"), Self::Anthropic => format!("{endpoint}/v1/messages"), + Self::Codex => format!("{endpoint}/responses"), } } @@ -41,6 +45,7 @@ impl Provider { Self::Gemini => ("x-goog-api-key", key.to_owned()), Self::OpenAi => ("authorization", format!("Bearer {key}")), Self::Anthropic => ("x-api-key", key.to_owned()), + Self::Codex => ("authorization", format!("Bearer {key}")), }); } if self == Self::Anthropic { @@ -52,6 +57,7 @@ impl Provider { /// Only Gemini gets a temperature: current reasoning models reject one. /// OpenAI gets no length limit either, since compatible servers name it /// differently; Anthropic's limit also covers thinking, so it has a floor. + /// The ChatGPT backend only streams. pub fn body(self, model: &str, system: &str, user: &str, max_tokens: usize) -> Value { match self { Self::Gemini => json!({ @@ -76,22 +82,54 @@ impl Provider { "system": system, "messages": [{"role": "user", "content": user}], }), + Self::Codex => json!({ + "model": model, + "instructions": system, + "input": [{"role": "user", "content": [{"type": "input_text", "text": user}]}], + "reasoning": {"effort": "low"}, + "store": false, + "stream": true, + }), } } - pub fn text(self, response: &Value) -> Option<&str> { - match self { - Self::Gemini => response["candidates"][0]["content"]["parts"] + pub fn text(self, body: &[u8]) -> Option { + let json = || serde_json::from_slice::(body).ok(); + let text = match self { + Self::Codex => return completed(body), + Self::Gemini => json()?["candidates"][0]["content"]["parts"] .as_array()? .last()?["text"] - .as_str(), - Self::OpenAi => response["choices"][0]["message"]["content"].as_str(), - Self::Anthropic => response["content"] + .as_str()? + .to_owned(), + Self::OpenAi => json()?["choices"][0]["message"]["content"] + .as_str()? + .to_owned(), + Self::Anthropic => json()?["content"] .as_array()? .iter() .rev() .find(|block| block["type"] == "text")?["text"] - .as_str(), - } + .as_str()? + .to_owned(), + }; + Some(text) } } + +fn completed(body: &[u8]) -> Option { + let event = String::from_utf8_lossy(body) + .lines() + .filter_map(|line| line.strip_prefix("data:")) + .filter_map(|data| serde_json::from_str::(data.trim_start()).ok()) + .find(|event| event["type"] == "response.completed")?; + let text: String = event["response"]["output"] + .as_array()? + .iter() + .filter(|item| item["type"] == "message") + .flat_map(|item| item["content"].as_array().into_iter().flatten()) + .filter(|part| part["type"] == "output_text") + .filter_map(|part| part["text"].as_str()) + .collect(); + Some(text) +} diff --git a/diffr/src/plugin/tests/summarize.rs b/diffr/src/plugin/tests/summarize.rs index fc322fe1bc..a6ddbe940d 100644 --- a/diffr/src/plugin/tests/summarize.rs +++ b/diffr/src/plugin/tests/summarize.rs @@ -384,6 +384,34 @@ fn each_provider_sends_its_own_request_and_reads_its_own_answer() { } } +#[test] +fn codex_streams_a_response_and_reads_the_completed_event() { + let (file, mut sides) = project("a.py", "", LARGE); + let completed = json!({"type": "response.completed", "response": {"output": [ + {"type": "reasoning", "summary": []}, + {"type": "message", "content": [{"type": "output_text", "text": "a b c"}]}, + ]}}); + let stream = format!( + "event: response.created\ndata: {{\"type\":\"response.created\"}}\n\nevent: response.completed\ndata: {completed}\n\n" + ); + let (endpoint, server) = serve_requests(vec![(200, stream)]); + let pipeline = summarizer_with(json!({ + "provider": "codex", + "model": "test-model", + "api_key": "test-token", + "endpoint": format!("{endpoint}/codex"), + "min_lines": 3, + "retries": 0, + })); + shape(&pipeline, &file, &mut sides).unwrap(); + assert_eq!(fold_label(&sides), "a b c"); + let request = server.join().unwrap().remove(0); + assert_eq!(request.line, "POST /codex/responses HTTP/1.1"); + assert!(request + .headers + .contains(&"authorization: bearer test-token".to_owned())); +} + /// The default chain with the summarizer on, answering from `endpoint`. fn default_chain(endpoint: &str) -> Pipeline { configured(&format!( From 8795cd6e48440cb48895e1ccf6aa2aaa6f82a972 Mon Sep 17 00:00:00 2001 From: thesiti92 Date: Mon, 26 Oct 2026 16:39:29 -0400 Subject: [PATCH 3/5] Read the Codex sign-in for the summarizer diffr reads $CODEX_HOME/auth.json on every run, never refreshing it, and passes the token in the summarizer's options. `diffr config logins` reports whether it is ready, and `diffr config init` prefers Codex when it is. Agent-Session: 02fbf542-41e9-4dde-86c4-2f75d6db972d Agent-Session: 7d7ae491-dbed-4fe3-8bc2-fe4851572ede Agent-Session: 5625cb14-3381-4fef-8d68-2cdc27ef7155 Agent-Session: ab3076ed-7808-4738-a770-0261b6018801 Agent-Session: 9a4dd689-814b-4ec4-aee5-d93cc4647727 Agent-Session: 99993da5-66b9-4872-b400-ba7f8c41628b Agent-Session: e05d0ee1-ebec-4824-922f-319222ec3817 --- diffr/Cargo.lock | 1 + diffr/Cargo.toml | 1 + diffr/src/cli.rs | 6 +++ diffr/src/init.rs | 23 +++++++-- diffr/src/login.rs | 103 +++++++++++++++++++++++++++++++++++++++ diffr/src/main.rs | 1 + diffr/src/plugin/wasm.rs | 4 +- 7 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 diffr/src/login.rs diff --git a/diffr/Cargo.lock b/diffr/Cargo.lock index 0b2e15bdc6..e9de81e1aa 100644 --- a/diffr/Cargo.lock +++ b/diffr/Cargo.lock @@ -759,6 +759,7 @@ version = "0.1.21" dependencies = [ "anyhow", "assert_cmd", + "base64", "bytes", "clap", "cliclack", diff --git a/diffr/Cargo.toml b/diffr/Cargo.toml index aa3f6a7245..28b8ca026a 100644 --- a/diffr/Cargo.toml +++ b/diffr/Cargo.toml @@ -54,6 +54,7 @@ bytes = "1.12" wasmtime-wasi-http = { version = "49.0.2", default-features = false, features = ["p2", "p3", "default-send-request"] } cliclack = "0.5.6" dirs = "5" +base64 = "0.22" [target.'cfg(not(any(windows, target_os = "illumos", target_os = "freebsd")))'.dependencies] diff --git a/diffr/src/cli.rs b/diffr/src/cli.rs index b57c3358d1..f27bb4abdd 100644 --- a/diffr/src/cli.rs +++ b/diffr/src/cli.rs @@ -220,6 +220,8 @@ enum ConfigCommand { #[arg(long)] json: bool, }, + /// Print which agent sign-ins are ready, as JSON + Logins, } pub(crate) fn run(runtime: &tokio::runtime::Runtime) -> Result { @@ -735,6 +737,10 @@ fn run_config(config: &ConfigArgs) -> Result { })(); return config_result(&mut stdout, result, *json); } + Some(ConfigCommand::Logins) => { + serde_json::to_writer_pretty(&mut stdout, &crate::login::status())?; + stdout.write_all(b"\n")?; + } Some(ConfigCommand::Init { json, answers }) => { return crate::init::run(*json, answers.as_deref()) } diff --git a/diffr/src/init.rs b/diffr/src/init.rs index 7e91bb0c98..7d7b5c33d9 100644 --- a/diffr/src/init.rs +++ b/diffr/src/init.rs @@ -16,6 +16,7 @@ const KEY_INSTRUCTIONS: &str = "To enable pseudocode summarization, we need: 1. An API Key from a supported provider (OpenAI, Anthropic, or Gemini-API compatible) 2. This API key can also be sourced from the environment 3. Otherwise, if that's not convenient, you can grab an API key and provide it to your agent (securely). +Codex needs no key: diffr uses its saved ChatGPT sign-in. "; /// The summarizer's options in `config schema`. @@ -72,6 +73,7 @@ struct State { config: Config, /// Each provider's id, title and key variables, from the schema. providers: Vec<(String, String, Vec)>, + signed_in: Vec, } impl State { @@ -110,10 +112,19 @@ impl State { ) }) .collect(); + let signed_in = ids + .iter() + .filter_map(|id| { + let id = id.as_str()?; + let login = details[id]["login"].as_str()?; + crate::login::token(login).is_ok().then(|| id.to_owned()) + }) + .collect(); Ok(Self { found: Agent::found(), config: Config::load()?, providers, + signed_in, }) } @@ -129,8 +140,8 @@ impl State { .any(|(name, _)| name == "bundled.summarize") } - /// The saved provider when summaries are on; otherwise the first with a - /// key, or the saved one. + /// The saved provider when summaries are on; otherwise Codex, the first + /// with a key, or the saved one. fn provider(&self) -> String { let saved = self.summarize()["provider"] .as_str() @@ -138,6 +149,9 @@ impl State { if self.on() { return saved.to_owned(); } + if self.signed_in.iter().any(|id| id == "codex") { + return "codex".to_owned(); + } self.providers .iter() .map(|(id, _, _)| id.as_str()) @@ -156,8 +170,11 @@ impl State { } /// Whether the summarizer has a key for `provider`: the saved one, which - /// belongs to the saved provider, or one in the environment. + /// belongs to the saved provider, one in the environment, or a sign-in. fn has_key(&self, provider: &str) -> bool { + if self.signed_in.iter().any(|id| id == provider) { + return true; + } let saved = self.summarize()["provider"] == provider && self .summarize() diff --git a/diffr/src/login.rs b/diffr/src/login.rs new file mode 100644 index 0000000000..8364ac13ee --- /dev/null +++ b/diffr/src/login.rs @@ -0,0 +1,103 @@ +//! Agent sign-ins used in place of an API key. They are never refreshed, so +//! the agent's own session is untouched. +use base64::Engine; +use serde_json::{json, Map, Value}; +use std::{ + path::PathBuf, + time::{SystemTime, UNIX_EPOCH}, +}; + +pub(crate) const LOGINS: [&str; 1] = ["codex"]; + +/// Fill `api_key` from the provider's `login` when no key is set. +pub(crate) fn fill(name: &str, options: &mut Map) { + let details = options.get("provider_details"); + let Some(login) = details.and_then(|details| details.get("login")?.as_str()) else { + return; + }; + let set = |key: &str| !key.is_empty(); + let in_environment = details + .and_then(|details| details.get("key_variables")?.as_array()) + .into_iter() + .flatten() + .filter_map(Value::as_str) + .any(|variable| std::env::var(variable).is_ok_and(|key| set(&key))); + let in_options = options + .get("api_key") + .and_then(Value::as_str) + .is_some_and(set); + if in_options || in_environment { + return; + } + match token(login) { + Ok(token) => { + options.insert("api_key".into(), token.into()); + } + Err(why) => eprintln!("plugins.shape.{name}: off for this run: {why}"), + } +} + +pub(crate) fn status() -> Value { + LOGINS + .iter() + .map(|login| { + let state = match token(login) { + Ok(_) => json!({ "ready": true }), + Err(why) => json!({ "ready": false, "message": why }), + }; + (login.to_string(), state) + }) + .collect::>() + .into() +} + +pub(crate) fn token(login: &str) -> Result { + match login { + "codex" => codex(), + _ => Err(format!("unknown sign-in {login}")), + } +} + +fn now_ms() -> u64 { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .map_or(0, |since| since.as_millis() as u64) +} + +fn home(variable: &str, default: &str) -> Option { + std::env::var_os(variable) + .filter(|dir| !dir.is_empty()) + .map(PathBuf::from) + .or_else(|| dirs::home_dir().map(|home| home.join(default))) +} + +fn codex() -> Result { + let path = home("CODEX_HOME", ".codex") + .ok_or("no home directory for this user")? + .join("auth.json"); + let saved = std::fs::read_to_string(&path).map_err(|_| { + format!( + "no Codex sign-in found in {}: run `codex login`, with cli_auth_credentials_store = \"file\" if Codex keeps it in the system keyring", + path.display() + ) + })?; + let saved: Value = + serde_json::from_str(&saved).map_err(|_| "the Codex sign-in is unreadable")?; + let token = saved["tokens"]["access_token"] + .as_str() + .ok_or("Codex is not signed in with ChatGPT: run `codex login`, or use the OpenAI provider with an API key")?; + if expiry_ms(token).is_some_and(|at| at <= now_ms()) { + return Err("the Codex sign-in expired: open Codex to renew it".into()); + } + Ok(token.to_owned()) +} + +/// A JWT's `exp`, in milliseconds. +fn expiry_ms(token: &str) -> Option { + let payload = token.split('.').nth(1)?; + let payload = base64::engine::general_purpose::URL_SAFE_NO_PAD + .decode(payload.trim_end_matches('=')) + .ok()?; + let claims: Value = serde_json::from_slice(&payload).ok()?; + claims["exp"].as_u64().map(|exp| exp * 1000) +} diff --git a/diffr/src/main.rs b/diffr/src/main.rs index 391f2acae6..b220666304 100644 --- a/diffr/src/main.rs +++ b/diffr/src/main.rs @@ -47,6 +47,7 @@ mod files; mod git; mod init; mod install; +mod login; mod options; mod plugin; mod pprint; diff --git a/diffr/src/plugin/wasm.rs b/diffr/src/plugin/wasm.rs index a803066f96..641fdda42b 100644 --- a/diffr/src/plugin/wasm.rs +++ b/diffr/src/plugin/wasm.rs @@ -661,11 +661,13 @@ fn compile( let pre = DiffrPluginPre::new(link(engine, linker, &entry.folder().component())?) .map_err(anyhow::Error::from) .context("not a shape plugin: it must export diffr:plugin/api")?; + let mut options = entry.options.clone(); + crate::login::fill(name, &mut options); Ok(Component { name: entry.folder().name().into(), reference: name.to_owned(), pre, - options: Value::Object(entry.options.clone()).to_string(), + options: Value::Object(options).to_string(), deferred: entry.folder().deferred(), }) } From c201353097a958f7776dbcd641a97a6a8669e46a Mon Sep 17 00:00:00 2001 From: thesiti92 Date: Mon, 26 Oct 2026 16:39:38 -0400 Subject: [PATCH 4/5] Show the Codex sign-in in Settings Settings shows the sign-in's status in place of the key field, accepts it as a credential, and picks Codex when it is signed in and no other provider has a key. Agent-Session: 02fbf542-41e9-4dde-86c4-2f75d6db972d Agent-Session: 7d7ae491-dbed-4fe3-8bc2-fe4851572ede Agent-Session: 5625cb14-3381-4fef-8d68-2cdc27ef7155 Agent-Session: ab3076ed-7808-4738-a770-0261b6018801 Agent-Session: 9a4dd689-814b-4ec4-aee5-d93cc4647727 Agent-Session: 99993da5-66b9-4872-b400-ba7f8c41628b Agent-Session: e05d0ee1-ebec-4824-922f-319222ec3817 --- packages/review-protocol/src/contracts.ts | 15 ++- .../src/diffr-config-section.browser.test.tsx | 50 ++++++++++ .../review/app/src/diffr-config-section.tsx | 98 ++++++++++++------- .../review/src/server/diffr-config.test.ts | 46 +++++++++ packages/review/src/server/diffr-config.ts | 60 ++++++++++-- 5 files changed, 225 insertions(+), 44 deletions(-) diff --git a/packages/review-protocol/src/contracts.ts b/packages/review-protocol/src/contracts.ts index 371e98f832..f4dbdaaa64 100644 --- a/packages/review-protocol/src/contracts.ts +++ b/packages/review-protocol/src/contracts.ts @@ -771,12 +771,21 @@ export interface ReviewDiffrProvider { endpoint: string; keyVariables: string[]; keylessCustomEndpoint: boolean; + login?: string; } +export const reviewDiffrLoginsSchema = z.record( + z.string(), + z.object({ ready: z.boolean(), message: z.string().optional() }), +); + +export type ReviewDiffrLogin = z.infer[string]; + export interface ReviewDiffrConfig { values: JsonObject; - credentialSource: "config" | "environment" | "missing"; + credentialSource: "config" | "environment" | "login" | "missing"; providers?: ReviewDiffrProvider[]; + logins?: Record; defaultPrompt?: string; defaultHiddenTags?: string[]; changed?: boolean; @@ -800,7 +809,7 @@ export type ReviewDiffrSummarizerInput = z.infer< const reviewDiffrConfigSchema = z.object({ values: z.custom(isJsonObject), - credentialSource: z.enum(["config", "environment", "missing"]), + credentialSource: z.enum(["config", "environment", "login", "missing"]), providers: z .array( z.object({ @@ -810,9 +819,11 @@ const reviewDiffrConfigSchema = z.object({ endpoint: z.string(), keyVariables: z.array(z.string()), keylessCustomEndpoint: z.boolean(), + login: z.string().optional(), }), ) .optional(), + logins: reviewDiffrLoginsSchema.optional(), defaultPrompt: z.string().optional(), defaultHiddenTags: z.array(z.string()).optional(), changed: z.boolean().optional(), diff --git a/packages/review/app/src/diffr-config-section.browser.test.tsx b/packages/review/app/src/diffr-config-section.browser.test.tsx index b68f5e7a96..caef5d5507 100644 --- a/packages/review/app/src/diffr-config-section.browser.test.tsx +++ b/packages/review/app/src/diffr-config-section.browser.test.tsx @@ -483,3 +483,53 @@ test("offers whatever providers diffr describes, with their defaults", async () .element(page.getByLabelText("Endpoint URL", { exact: true })) .toHaveAttribute("placeholder", "https://api.mistral.ai/v1"); }); + +test("prefers a signed-in Codex when nothing has a key, and shows its sign-in in place of a key", async () => { + const providers = [ + ...config().providers!, + { + id: "codex", + title: "Codex", + model: "gpt-6-luna", + endpoint: "https://chatgpt.com/backend-api/codex", + keyVariables: [], + keylessCustomEndpoint: false, + login: "codex", + }, + ]; + + const { actions } = await mount({ + credentialSource: "missing", + providers, + logins: { + codex: { ready: true }, + }, + }); + + await open(); + await expect + .element(page.getByRole("button", { name: "Codex" })) + .toHaveAttribute("aria-pressed", "true"); + await expect + .element(page.getByLabelText("Model", { exact: true })) + .toHaveValue("gpt-6-luna"); + await expect + .element(page.getByText(/Uses the Codex sign-in saved on this computer/)) + .toBeVisible(); + expect(document.body.textContent).not.toContain("API key"); + + await act(async () => { + await page.getByLabelText("Enable summaries", { exact: true }).click(); + }); + await act(async () => { + await page.getByRole("button", { name: "Save summaries" }).click(); + }); + expect(actions.saveSummarizer).toHaveBeenCalledWith( + expect.objectContaining({ + enabled: true, + provider: "codex", + model: "gpt-6-luna", + apiKey: "", + }), + ); +}); diff --git a/packages/review/app/src/diffr-config-section.tsx b/packages/review/app/src/diffr-config-section.tsx index 27385cda5b..0e10775d28 100644 --- a/packages/review/app/src/diffr-config-section.tsx +++ b/packages/review/app/src/diffr-config-section.tsx @@ -64,17 +64,31 @@ function title(config: ReviewDiffrConfig, id: string): string { return described(config, id)?.title ?? id; } +/** Codex when summaries are off, nothing else has a key, and it is signed in. */ +function preferCodex(config: ReviewDiffrConfig): boolean { + return ( + setting(config, "plugins.shape.bundled.summarize.enabled") !== true && + config.credentialSource === "missing" && + !!described(config, "codex") && + !!config.logins?.codex?.ready + ); +} + function summaryDraft(config: ReviewDiffrConfig): ReviewDiffrSummarizerInput { + const codex = preferCodex(config); + return { enabled: setting(config, "plugins.shape.bundled.summarize.enabled") === true, - provider: provider(config), - model: String( - setting(config, "plugins.shape.bundled.summarize.model") ?? "", - ), - endpoint: String( - setting(config, "plugins.shape.bundled.summarize.endpoint") ?? "", - ), + provider: codex ? "codex" : provider(config), + model: codex + ? (described(config, "codex")?.model ?? "") + : String(setting(config, "plugins.shape.bundled.summarize.model") ?? ""), + endpoint: codex + ? "" + : String( + setting(config, "plugins.shape.bundled.summarize.endpoint") ?? "", + ), systemPrompt: String( setting(config, "plugins.shape.bundled.summarize.system_prompt") ?? config.defaultPrompt ?? @@ -171,6 +185,7 @@ export function DiffrConfigSection({ setting(config, "plugins.shape.bundled.summarize.enabled") === undefined; const summaryValid = !!draft?.model.trim(); + const login = config && draft && described(config, draft.provider)?.login; const savedDraft = config && summaryDraft(config); const hiddenTags = config && setting(config, hideKey); @@ -304,35 +319,46 @@ export function DiffrConfigSection({ /> )} - - - setDraft({ ...draft, apiKey: event.target.value }) - } - /> - -

- {draft.provider !== provider(config) || - draft.endpoint !== savedDraft?.endpoint - ? config.credentialSource !== "config" - ? `Enter a key for ${title(config, draft.provider)}, or leave blank to use its environment variable.` - : draft.provider !== provider(config) - ? `Saving clears the key saved for ${title(config, provider(config))}.` - : "Saving clears the saved key, since the endpoint changed." - : `${ - config.credentialSource === "config" - ? "Saved key" - : config.credentialSource === "environment" - ? "Environment key available" - : "Not configured" - }. Replacement keys are stored in diffr’s config. Leave blank to keep the current key.`} -

+ {login ? ( +

+ {config.logins?.[login]?.ready + ? `Uses the ${title(config, draft.provider)} sign-in saved on this computer. No key needed.` + : (config.logins?.[login]?.message ?? + "Sign-in status unavailable.")} +

+ ) : ( + <> + + + setDraft({ ...draft, apiKey: event.target.value }) + } + /> + +

+ {draft.provider !== provider(config) || + draft.endpoint !== savedDraft?.endpoint + ? config.credentialSource !== "config" + ? `Enter a key for ${title(config, draft.provider)}, or leave blank to use its environment variable.` + : draft.provider !== provider(config) + ? `Saving clears the key saved for ${title(config, provider(config))}.` + : "Saving clears the saved key, since the endpoint changed." + : `${ + config.credentialSource === "config" + ? "Saved key" + : config.credentialSource === "environment" + ? "Environment key available" + : "Not configured" + }. Replacement keys are stored in diffr’s config. Leave blank to keep the current key.`} +

+ + )} { }); }); +test("a ready agent sign-in is a credential and a missing one says why", async () => { + const fake = await diffrTestProcess(); + const values = path.join(fake.root, "values.json"); + await writeFile( + values, + JSON.stringify({ + plugins: { + // oxlint-disable-next-line anti-slop/no-shape-in-symbol-names -- Native diffr config key. + shape: { + bundled: { summarize: { enabled: false, provider: "codex" } }, + }, + }, + }), + ); + vi.stubEnv("TEST_VALUES", values); + vi.stubEnv("TEST_LOGINS", JSON.stringify({ codex: { ready: true } })); + const config = await readDiffrConfig(); + expect(config.credentialSource).toBe("login"); + expect(config.providers).toContainEqual( + expect.objectContaining({ id: "codex", login: "codex" }), + ); + + vi.stubEnv( + "TEST_LOGINS", + JSON.stringify({ codex: { ready: false, message: "run codex login" } }), + ); + expect( + await saveDiffrSummarizer({ ...draft, provider: "codex" }), + ).toMatchObject({ changed: false, error: "run codex login" }); + expect((await fake.calls()).some((args) => args[1] === "set")).toBe(false); +}); + test("synthetic test returns a summary without saving and cleans its config", async () => { const fake = await diffrTestProcess("saved-secret"); const before = await readFile(fake.state, "utf8"); diff --git a/packages/review/src/server/diffr-config.ts b/packages/review/src/server/diffr-config.ts index ed012e7942..70299617f6 100644 --- a/packages/review/src/server/diffr-config.ts +++ b/packages/review/src/server/diffr-config.ts @@ -13,10 +13,12 @@ import { } from "@dev.fast/json"; import { type ReviewDiffrConfig, + type ReviewDiffrLogin, type ReviewDiffrProvider, type ReviewDiffrSummarizerInput, type StructuralRegion, decodeStructuralDiffEvent, + reviewDiffrLoginsSchema, reviewDiffrSummarizerInputSchema, } from "@dev.fast/review-protocol"; import { stringify } from "smol-toml"; @@ -39,6 +41,7 @@ function serialized(operation: () => Promise): Promise { type DiffrArguments = | { command: "schema" } + | { command: "logins" } | { command: "show"; reveal: boolean } | { command: "set"; patch: JsonObject } | { command: "migrate" } @@ -48,6 +51,8 @@ function diffrArgv(args: DiffrArguments): string[] { switch (args.command) { case "schema": return ["config", "schema"]; + case "logins": + return ["config", "logins"]; case "show": return ["config", "show", "--json", ...(args.reveal ? ["--reveal"] : [])]; case "set": @@ -188,6 +193,32 @@ function environmentKey( .find((key) => !!key); } +function signedIn( + providers: ReviewDiffrProvider[], + logins: Record, + id: string, +): boolean { + const login = providers.find((provider) => provider.id === id)?.login; + + return !!login && !!logins[login]?.ready; +} + +/** Older diffr builds have no sign-ins. */ +async function readLogins( + rootPath?: string, + signal?: AbortSignal, +): Promise> { + try { + const result = reviewDiffrLoginsSchema.safeParse( + json(await diffr({ command: "logins" }, rootPath, { signal })), + ); + + return result.success ? result.data : {}; + } catch { + return {}; + } +} + function keyOptional( providers: ReviewDiffrProvider[], id: string, @@ -249,6 +280,7 @@ function configDefaults( const detail = isJsonObject(details) ? details[id] : undefined; const model = isJsonObject(models) ? models[id] : undefined; const endpoint = isJsonObject(detail) ? detail.endpoint : undefined; + const login = isJsonObject(detail) ? detail.login : undefined; return { id, @@ -258,6 +290,7 @@ function configDefaults( keyVariables: isJsonObject(detail) ? strings(detail.key_variables) : [], keylessCustomEndpoint: isJsonObject(detail) && detail.keyless_custom_endpoint === true, + ...(isStringValue(login) && { login }), }; }); @@ -273,14 +306,18 @@ function configDefaults( async function read(rootPath?: string): Promise { const config = await values(rootPath); const defaults = configDefaults(await readSchema(rootPath)); + const logins = await readLogins(rootPath); + const providers = defaults.providers ?? []; const saved = valueAt(config, `${prefix}.api_key`); const credentialSource = isStringValue(saved) && saved.length > 0 ? "config" - : environmentKey(defaults.providers ?? [], savedProvider(config)) + : environmentKey(providers, savedProvider(config)) ? "environment" - : "missing"; + : signedIn(providers, logins, savedProvider(config)) + ? "login" + : "missing"; const plugins = valueAt(config, "plugins.shape"); @@ -293,7 +330,7 @@ async function read(rootPath?: string): Promise { if (isJsonObject(plugin)) delete plugin.api_key; } - return { values: config, credentialSource, ...defaults }; + return { values: config, credentialSource, logins, ...defaults }; } export function readDiffrConfig(rootPath?: string): Promise { @@ -371,12 +408,19 @@ export function saveDiffrSummarizer( !draft.apiKey && !(savedKey && !moving) && !environmentKey(providers, draft.provider) && + !signedIn(providers, current.logins ?? {}, draft.provider) && !keyOptional(providers, draft.provider, draft.endpoint) ) { + const login = providers.find( + (provider) => provider.id === draft.provider, + )?.login; + return { ...current, changed: false, - error: "Add an API key before enabling summaries.", + error: + (login && current.logins?.[login]?.message) || + "Add an API key before enabling summaries.", }; } @@ -437,7 +481,11 @@ export async function testDiffrSummarizer( : "") || environmentKey(providers, provider); - if (!apiKey && !keyOptional(providers, provider, endpoint)) + if ( + !apiKey && + !keyOptional(providers, provider, endpoint) && + !signedIn(providers, await readLogins(rootPath, deadline), provider) + ) throw new Error("Add an API key to test summaries."); directory = await mkdtemp(join(tmpdir(), "review-summary-")); @@ -533,7 +581,7 @@ export async function testDiffrSummarizer( } throw new Error( - "No summary was produced. Check the API key, model, and network connection.", + "No summary was produced. Check the API key or sign-in, the model, and the network connection.", ); } finally { testing = false; From 0743d8908b691f4447331d21bc8649f1330a2853 Mon Sep 17 00:00:00 2001 From: thesiti92 Date: Mon, 26 Oct 2026 16:39:39 -0400 Subject: [PATCH 5/5] Document diffr configuration, with AI summary setup Agent-Session: 02fbf542-41e9-4dde-86c4-2f75d6db972d Agent-Session: 7d7ae491-dbed-4fe3-8bc2-fe4851572ede Agent-Session: 5625cb14-3381-4fef-8d68-2cdc27ef7155 Agent-Session: ab3076ed-7808-4738-a770-0261b6018801 Agent-Session: 9a4dd689-814b-4ec4-aee5-d93cc4647727 Agent-Session: 99993da5-66b9-4872-b400-ba7f8c41628b Agent-Session: e05d0ee1-ebec-4824-922f-319222ec3817 --- docs/README.md | 1 + docs/diffr-configuration.md | 78 +++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 docs/diffr-configuration.md diff --git a/docs/README.md b/docs/README.md index adf1ea9384..a70ccd8c8a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -5,6 +5,7 @@ Published at [dev.fast/docs](https://dev.fast/docs). - [Quick start](quick-start.md) - [Connect your agent](connect-your-agent.md) - [Create a review](create-a-review.md) +- [diffr configuration](diffr-configuration.md) - [Remote hosts](remote-hosts.md) - [Troubleshooting](troubleshooting.md) - [Privacy](privacy.md) diff --git a/docs/diffr-configuration.md b/docs/diffr-configuration.md new file mode 100644 index 0000000000..e036b0e224 --- /dev/null +++ b/docs/diffr-configuration.md @@ -0,0 +1,78 @@ +# diffr configuration + +diffr computes the diffs in Whiteboard. Its settings apply to every +repository, and the diffr command line uses the same settings. + +## Change a setting + +- In Whiteboard, open Settings, then **Tools**, then **Diff display and AI + summaries**. +- In a terminal, run `diffr config` to open the settings screen, or + `diffr config set ` to change one setting. +- Edit `~/.config/diffr/config.toml`. Reopen the review after you edit it. + +## Display + +| Setting | What it does | Key | +| --- | --- | --- | +| Collapse unchanged lines | Keeps a few unchanged lines around each change and collapses the rest. **Context lines** sets how many. | `plugins.shape.bundled.context` | +| Collapse test bodies | Collapses the bodies of tests. | `plugins.shape.bundled.test-bodies` | +| Collapse deleted function bodies | Collapses long functions that were deleted. | `plugins.shape.bundled.deleted-bodies` | +| Collapse long removed stretches | Collapses long runs of removed lines. | `plugins.shape.bundled.removed-runs` | +| Hide files by tag | Hides generated and vendored files. See [Hidden files](configuration.md#hidden-files). | `plugins.classify.bundled.hide` | +| Hide deleted files | Hides files that were deleted. | `plugins.classify.bundled.hide_deleted` | + +## AI summaries + +diffr can replace large new functions and tests with short pseudocode. It +sends those bodies to the provider you pick, so summaries are off until you +turn them on. + +### Turn on AI summaries + +1. Open Settings, then **Tools**, then **Diff display and AI summaries**. +2. Pick a provider under **AI summaries**. +3. Check **Enable summaries** and click **Save summaries**. + +**Test setup** sends a sample function and shows the summary without saving. + +### Providers + +| Provider | Credential | +| --- | --- | +| Codex | Codex's ChatGPT sign-in. No key needed. | +| Gemini, OpenAI, Anthropic | An API key, entered in Settings or set as `GEMINI_API_KEY`, `OPENAI_API_KEY` or `ANTHROPIC_API_KEY`. | + +If Codex is signed in and no other provider has a key, Settings picks Codex. + +### Codex + +Sign in once with `codex login`. diffr reads `~/.codex/auth.json` (or +`$CODEX_HOME/auth.json`) on every run. Summaries count against your ChatGPT +plan. + +If Codex keeps its sign-in in the system keyring, add this to +`~/.codex/config.toml` and sign in again: + +```toml +cli_auth_credentials_store = "file" +``` + +diffr never refreshes the sign-in, so Codex's own session is untouched. The +token lasts about 10 days after Codex last ran. If it has expired, summaries +skip that run and Settings says so. Open Codex once to renew it. + +### Short summaries only + +A summary that is longer than two thirds of the function is dropped, and the +function stays as code. To change that, set `max_length_ratio`. + +### From the command line + +```toml +[plugins.shape.bundled.summarize] +enabled = true +provider = "codex" +``` + +`diffr config logins` prints whether the Codex sign-in is ready.