{"record":{"id":"cda6582437fe7765","repo":"nikivdev/code","slug":"recover-is-only-supported-for-codex-sessions-use","errorCode":null,"errorMessage":"recover is only supported for Codex sessions; use `f ai codex recover ...`","messagePattern":"recover is only supported for Codex sessions; use `f ai codex recover \\.\\.\\.`","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/ai.rs","lineNumber":634,"sourceCode":"            }\n            Some(ProviderAiAction::Log { .. }) => {\n                bail!(\"log is only supported for Codex sessions; use `f codex log ...`\");\n            }\n            Some(ProviderAiAction::Sessions { .. })\n            | Some(ProviderAiAction::Browse { .. })\n            | Some(ProviderAiAction::Continue { .. })\n            | Some(ProviderAiAction::New)\n            | Some(ProviderAiAction::Open { .. })\n            | Some(ProviderAiAction::Resolve { .. })\n            | Some(ProviderAiAction::Resume { .. })\n            | Some(ProviderAiAction::Find { .. })\n            | Some(ProviderAiAction::FindAndCopy { .. }) => {\n                bail!(\n                    \"Cursor transcripts are readable only; use `f cursor list`, `f cursor copy`, or `f cursor context`\"\n                );\n            }\n            Some(ProviderAiAction::Recover { .. }) => {\n                bail!(\"recover is only supported for Codex sessions; use `f ai codex recover ...`\");\n            }\n        }\n        return Ok(());\n    }\n\n    match action {\n        None => quick_start_session(provider)?,\n        Some(ProviderAiAction::List) => list_sessions(provider)?,\n        Some(ProviderAiAction::LatestId { path }) => print_latest_session_id(provider, path)?,\n        Some(ProviderAiAction::Sessions { path, json }) => provider_sessions(provider, path, json)?,\n        Some(ProviderAiAction::Browse { path, query }) => {\n            browse_codex_sessions(path, query, provider)?\n        }\n        Some(ProviderAiAction::Continue { session, path }) => {\n            continue_session(session, path, provider)?\n        }\n        Some(ProviderAiAction::New) => new_session(provider)?,\n        Some(ProviderAiAction::Connect {","sourceCodeStart":616,"sourceCodeEnd":652,"githubUrl":"https://github.com/nikivdev/code/blob/a747e741ae92c09071d0ae946ab48488adcff1ce/src/ai.rs#L616-L652","documentation":"Raised by `run_provider` in src/ai.rs when the `recover` action is dispatched against a Cursor session. Session recovery is a Codex-only integration (see recover_codex_sessions); the Cursor match arm bails with guidance toward `f ai codex recover ...`.","triggerScenarios":"Running `f cursor recover ...` or `f ai cursor recover ...`, i.e. run_provider(Provider::Cursor, Some(ProviderAiAction::Recover{..})). Occurs when attempting to recover lost sessions from Cursor transcript files.","commonSituations":"Trying to salvage a lost Cursor chat after a crash, recovery scripts written for Codex run against Cursor, assuming transcript files are writable/restorable like Codex session files.","solutions":["Run `f ai codex recover ...` — recovery only operates on Codex sessions","For Cursor, manually copy the transcript you still have via `f cursor copy` or `f cursor context` before it is lost","Keep regular backups of Cursor transcript data since no CLI recovery exists","Gate Recover dispatch on Provider::Codex in automation"],"exampleFix":"// before\nf cursor recover --limit 5\n// after\nf ai codex recover --limit 5\n# for Cursor, salvage what exists:\nf cursor copy --session abc > backup.md","handlingStrategy":"validation","validationCode":"fn supports_recover(provider: Provider) -> bool {\n    matches!(provider, Provider::Codex)\n}\nif !supports_recover(provider) {\n    eprintln!(\"recover requires Codex: use `f ai codex recover ...`\");\n    return;\n}\n// For Cursor, proactively copy transcripts before data loss:\n// f cursor list && f cursor copy --session <id> > backup.md","typeGuard":"fn is_codex(provider: Provider) -> bool {\n    matches!(provider, Provider::Codex)\n}","tryCatchPattern":"match run_provider(provider, Some(ProviderAiAction::Recover { .. })) {\n    Err(e) if e.to_string().contains(\"recover is only supported for Codex\") => {\n        eprintln!(\"recovery unavailable for this provider; copying existing transcript instead\");\n    }\n    other => other?,\n}","preventionTips":["Only attempt recovery on Codex sessions","Back up Cursor transcripts regularly — there is no CLI recovery path for them","Salvage readable Cursor data with `f cursor copy` immediately after data loss","Keep recovery scripts pinned to `f ai codex recover`"],"tags":["unsupported-action","provider-dispatch","data-recovery"],"backgroundTag":"provider-unsupported-action","analyzedSha":"a747e741ae92c09071d0ae946ab48488adcff1ce","analyzedAt":"2026-09-01T22:43:55.719Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}