codex-mobile-bridge 0.3.2

Remote bridge and service manager for codex-mobile.
Documentation
mod protocol;
mod threads;
mod timeline;

use anyhow::Result;
use serde_json::Value;

use super::helpers::emit_unhandled_notification_notice;
use crate::state::BridgeState;

pub(super) async fn handle_notification(
    state: &BridgeState,
    runtime_id: &str,
    method: &str,
    params: Value,
) -> Result<()> {
    let render_params = params.clone();
    let result = match method {
        "thread/started" => threads::handle_thread_started(state, runtime_id, params).await,
        "thread/status/changed" => {
            threads::handle_thread_status_changed(state, runtime_id, params).await
        }
        "thread/name/updated" => {
            threads::handle_thread_name_updated(state, runtime_id, params).await
        }
        "thread/archived" => threads::handle_thread_archived(state, runtime_id, params).await,
        "thread/unarchived" => threads::handle_thread_unarchived(state, runtime_id, params).await,
        "thread/closed" => threads::handle_thread_closed(state, runtime_id, params).await,
        "thread/tokenUsage/updated" => {
            threads::handle_thread_token_usage_updated(state, runtime_id, params).await
        }
        "configWarning" => protocol::handle_config_warning(state, runtime_id, params).await,
        "deprecationNotice" => protocol::handle_deprecation_notice(state, runtime_id, params).await,
        "model/rerouted" => protocol::handle_model_rerouted(state, runtime_id, params).await,
        "command/exec/outputDelta" => {
            protocol::handle_command_exec_output_delta(state, runtime_id, params).await
        }
        "serverRequest/resolved" => {
            protocol::handle_server_request_resolved(state, runtime_id, params).await
        }
        "error" => protocol::handle_error_notification(state, runtime_id, params).await,
        "turn/started" => timeline::handle_turn_started(state, runtime_id, params).await,
        "item/agentMessage/delta" => {
            timeline::handle_agent_message_delta(state, runtime_id, params).await
        }
        "item/commandExecution/outputDelta" => {
            timeline::handle_command_execution_output_delta(state, runtime_id, params).await
        }
        "item/fileChange/outputDelta" => {
            timeline::handle_file_change_output_delta(state, runtime_id, params).await
        }
        "turn/diff/updated" => timeline::handle_turn_diff_updated(state, runtime_id, params).await,
        "turn/plan/updated" => timeline::handle_turn_plan_updated(state, runtime_id, params).await,
        "item/started" => timeline::handle_item_started(state, runtime_id, params).await,
        "item/completed" => timeline::handle_item_completed(state, runtime_id, params).await,
        "item/plan/delta" => timeline::handle_item_plan_delta(state, runtime_id, params).await,
        "item/mcpToolCall/progress" => {
            timeline::handle_mcp_tool_call_progress(state, runtime_id, params).await
        }
        "item/reasoning/textDelta" => {
            timeline::handle_reasoning_text_delta(state, runtime_id, params).await
        }
        "item/reasoning/summaryPartAdded" => {
            timeline::handle_reasoning_summary_part_added(state, runtime_id, params).await
        }
        "item/reasoning/summaryTextDelta" => {
            timeline::handle_reasoning_summary_text_delta(state, runtime_id, params).await
        }
        "turn/completed" => timeline::handle_turn_completed(state, runtime_id, params).await,
        _ => emit_unhandled_notification_notice(state, runtime_id, method, &params),
    };
    if result.is_ok() {
        state.apply_thread_render_notification(runtime_id, method, &render_params)?;
    }
    result
}