smol-workflow-cli 0.2.1

CLI for the smol-workflows Rust engine.
mod claude_code;
mod codex;
mod common;
mod opencode;
mod pi;

use ratatui::text::Line;
use smol_workflow_engine::events::WorkflowEventType;

use super::EventRecord;

pub(super) fn should_show_in_timeline(record: &EventRecord) -> bool {
    record.event.event_type != WorkflowEventType::AgentEvent
        || match provider(record) {
            Some("pi") => pi::should_show_in_timeline(provider_event(record)),
            Some("codex") => codex::should_show_in_timeline(provider_event(record)),
            Some("claude-code") => claude_code::should_show_in_timeline(provider_event(record)),
            Some("opencode") => opencode::should_show_in_timeline(provider_event(record)),
            _ => common::should_show_in_timeline(provider_event(record)),
        }
}

pub(super) fn timeline_label(record: &EventRecord) -> String {
    match provider(record) {
        Some("pi") => pi::timeline_label(provider_event(record)),
        Some("codex") => codex::timeline_label(provider_event(record)),
        Some("claude-code") => claude_code::timeline_label(provider_event(record)),
        Some("opencode") => opencode::timeline_label(provider_event(record)),
        _ => common::timeline_label("raw", provider_event(record)),
    }
}

pub(super) fn details_lines(record: &EventRecord) -> Vec<Line<'static>> {
    match provider(record) {
        Some("pi") => pi::details_lines(provider_event(record)),
        Some("codex") => codex::details_lines(provider_event(record)),
        Some("claude-code") => claude_code::details_lines(provider_event(record)),
        Some("opencode") => opencode::details_lines(provider_event(record)),
        _ => common::details_lines("provider", "raw", provider_event(record)),
    }
}

fn provider_event(record: &EventRecord) -> &serde_json::Value {
    record
        .event
        .data
        .get("providerEvent")
        .unwrap_or(&record.event.data)
}

fn provider(record: &EventRecord) -> Option<&str> {
    record
        .event
        .metadata
        .as_ref()
        .and_then(|metadata| metadata.provider.as_deref())
}