{"record":{"id":"01e1938af611d722","repo":"nikivdev/code","slug":"gemini-returned-empty-handoff","errorCode":null,"errorMessage":"Gemini returned empty handoff","messagePattern":"Gemini returned empty handoff","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/ai.rs","lineNumber":14717,"sourceCode":"        .context(\"failed to call Gemini API\")?;\n\n    if !resp.status().is_success() {\n        let status = resp.status();\n        let text = resp.text().unwrap_or_default();\n        bail!(\"Gemini API error {}: {}\", status, text);\n    }\n\n    let parsed: GeminiResponse = resp.json().context(\"failed to parse Gemini response\")?;\n    let content = parsed\n        .candidates\n        .get(0)\n        .and_then(|c| c.content.parts.get(0))\n        .and_then(|p| p.text.as_deref())\n        .unwrap_or(\"\")\n        .trim();\n\n    if content.is_empty() {\n        bail!(\"Gemini returned empty handoff\");\n    }\n\n    Ok(content.to_string())\n}\n\nfn parse_summary_response(content: &str) -> Result<SessionSummaryResponse> {\n    if let Ok(parsed) = serde_json::from_str::<SessionSummaryResponse>(content) {\n        return Ok(parsed);\n    }\n\n    let json_blob = extract_json_object(content)\n        .ok_or_else(|| anyhow::anyhow!(\"summary response was not valid JSON\"))?;\n    serde_json::from_str(&json_blob).context(\"failed to parse summary JSON\")\n}\n\nfn extract_json_object(s: &str) -> Option<String> {\n    let start = s.find('{')?;\n    let end = s.rfind('}')?;","sourceCodeStart":14699,"sourceCodeEnd":14735,"githubUrl":"https://github.com/nikivdev/code/blob/a747e741ae92c09071d0ae946ab48488adcff1ce/src/ai.rs#L14699-L14735","documentation":"Error \"Gemini returned empty handoff\" thrown in nikivdev/code.","triggerScenarios":"Thrown at src/ai.rs:14717 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"a747e741ae92c09071d0ae946ab48488adcff1ce","analyzedAt":"2026-09-01T22:43:55.719Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}