{"record":{"id":"90b20158f3c09348","repo":"nikivdev/code","slug":"browse-is-only-supported-for-codex-sessions-use","errorCode":null,"errorMessage":"browse is only supported for Codex sessions; use `f ai codex browse ...`","messagePattern":"browse is only supported for Codex sessions; use `f ai codex browse \\.\\.\\.`","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/ai.rs","lineNumber":800,"sourceCode":"\n/// Run the ai subcommand.\npub fn run(action: Option<AiAction>) -> Result<()> {\n    let action = action.unwrap_or(AiAction::List);\n\n    match action {\n        AiAction::List => list_sessions(Provider::All)?,\n        AiAction::Cursor { action } => run_provider(Provider::Cursor, action)?,\n        AiAction::Claude { action } => match action {\n            None => quick_start_session(Provider::Claude)?,\n            Some(ProviderAiAction::List) => list_sessions(Provider::Claude)?,\n            Some(ProviderAiAction::LatestId { path }) => {\n                print_latest_session_id(Provider::Claude, path)?\n            }\n            Some(ProviderAiAction::Sessions { path, json }) => {\n                provider_sessions(Provider::Claude, path, json)?\n            }\n            Some(ProviderAiAction::Browse { .. }) => {\n                bail!(\"browse is only supported for Codex sessions; use `f ai codex browse ...`\");\n            }\n            Some(ProviderAiAction::Continue { session, path }) => {\n                continue_session(session, path, Provider::Claude)?\n            }\n            Some(ProviderAiAction::New) => new_session(Provider::Claude)?,\n            Some(ProviderAiAction::Connect { .. }) => {\n                bail!(\"connect is only supported for Codex sessions; use `f codex connect ...`\");\n            }\n            Some(ProviderAiAction::Open { .. }) | Some(ProviderAiAction::Resolve { .. }) => {\n                bail!(\"open/resolve is only supported for Codex sessions; use `f codex ...`\");\n            }\n            Some(ProviderAiAction::Runtime { .. }) => {\n                bail!(\n                    \"runtime helpers are only supported for Codex sessions; use `f codex runtime ...`\"\n                );\n            }\n            Some(ProviderAiAction::Doctor { .. }) => {\n                bail!(\"doctor is only supported for Codex sessions; use `f codex doctor`\");","sourceCodeStart":782,"sourceCodeEnd":818,"githubUrl":"https://github.com/nikivdev/code/blob/a747e741ae92c09071d0ae946ab48488adcff1ce/src/ai.rs#L782-L818","documentation":"Raised in the Claude branch of `run_provider` in src/ai.rs: the `browse` action is implemented only for Codex sessions (browse_codex_sessions), so dispatching it under the Claude provider bails with a pointer to `f ai codex browse ...`. Unlike the Cursor arm, Claude supports most actions but explicitly excludes Browse and a few Codex-specific integrations.","triggerScenarios":"Running `f claude browse ...` or `f ai claude browse ...`, i.e. run_provider/run's Claude match on Some(ProviderAiAction::Browse{..}). Occurs when searching/filtering session history is attempted against Claude transcripts.","commonSituations":"Searching Claude session history with a query the way `f ai codex browse` allows, scripts that use browse for session triage across providers, tab-completion suggesting browse under `f claude`.","solutions":["Use `f ai codex browse ...` for searchable session browsing","For Claude, enumerate sessions with `f claude list` (or `f ai list` across providers) and filter externally","Get the latest Claude session via `f claude latest-id` and inspect it with `f claude show`/`copy`","Update triage scripts to branch: browse for Codex, list+filter for Claude"],"exampleFix":"// before\nf claude browse --query \"refactor\"\n// after\nf ai codex browse --query \"refactor\"\n# or for Claude:\nf claude list | grep refactor","handlingStrategy":"validation","validationCode":"fn supports_browse(provider: Provider) -> bool {\n    matches!(provider, Provider::Codex)\n}\nif !supports_browse(provider) {\n    eprintln!(\"browse requires Codex: use `f ai codex browse ...`; for Claude use `f claude list`\");\n    return;\n}","typeGuard":"fn is_codex(provider: Provider) -> bool {\n    matches!(provider, Provider::Codex)\n}","tryCatchPattern":"if let Err(e) = run_provider(Provider::Claude, Some(ProviderAiAction::Browse { .. })) {\n    if e.to_string().contains(\"browse is only supported for Codex\") {\n        eprintln!(\"falling back to `f claude list` + local filtering\");\n    } else {\n        return Err(e);\n    }\n}","preventionTips":["Reserve `browse` for Codex sessions only","For Claude history triage, use `f claude list` / `latest-id` and filter output locally","Branch on provider in session-search scripts (browse for Codex, list for Claude)","Note that Claude supports most actions but excludes browse/connect/open/resolve and Codex integrations"],"tags":["unsupported-action","provider-dispatch","cli"],"backgroundTag":"provider-unsupported-action","analyzedSha":"a747e741ae92c09071d0ae946ab48488adcff1ce","analyzedAt":"2026-09-01T22:43:55.719Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}