omk 0.5.0

A Rust runtime for Kimi CLI. Turns prompts into proof-backed engineering runs with gates, worktrees, and replay.
Documentation
use std::sync::Arc;

use omk::runtime::classifier::Intent;
use omk::runtime::conversation::bus::BusEvent;
use omk::runtime::conversation::outcome::RouteOutcome;
use omk::runtime::escalation::{
    backends::{MediumPlanResult, SmallEditResult},
    mocks::{MockClassifier, MockGoalBridge, MockLlmDirect, MockWireWorker},
    router::{Router, RouterConfig},
};

use crate::common::{make_classifier_output, make_handle, make_session};

#[tokio::test]
async fn test_medium_intent_creates_plan_with_n_steps_and_emits_events() {
    let bus = omk::runtime::conversation::bus::EventBus::new().arc();
    let mut rx = bus.subscribe();
    let router = Router::new(
        Arc::new(MockClassifier::new(make_classifier_output(
            Intent::Medium,
            0.88,
        ))),
        Arc::new(MockLlmDirect::new(0)),
        Arc::new(MockWireWorker::new(
            SmallEditResult {
                worker_id: "sw1".into(),
                files_touched: 0,
                diff_summary: "".into(),
            },
            MediumPlanResult {
                workers: vec!["mw1".into()],
                steps_completed: 1,
                steps_failed: 0,
            },
        )),
        Arc::new(MockGoalBridge::new(make_handle("g1"))),
        RouterConfig::default(),
        bus.clone(),
    );
    let session = make_session();
    let outcome = router
        .dispatch("add validation and write tests", &session)
        .await;
    assert!(matches!(outcome, RouteOutcome::Medium { .. }));

    let mut events = Vec::new();
    while let Ok(ev) = rx.try_recv() {
        events.push(ev);
    }
    assert!(events.iter().any(|e| matches!(
        e,
        BusEvent::RouterEscalating {
            target_mode: omk::runtime::conversation::bus::ActiveMode::PlannerWorkers,
            ..
        }
    )));
    assert!(events.iter().any(|e| matches!(
        e,
        BusEvent::WorkerStarted { worker_id, .. } if worker_id == "mw1"
    )));
    assert!(events.iter().any(|e| matches!(
        e,
        BusEvent::WorkerCompleted { worker_id, .. } if worker_id == "mw1"
    )));
}