omk 0.5.0

A Rust runtime for Kimi CLI. Turns prompts into proof-backed engineering runs with gates, worktrees, and replay.
Documentation
use once_cell::sync::Lazy;
use std::collections::HashMap;
use std::sync::Arc;
use tokio::sync::broadcast;
use tokio::task::JoinHandle;

use super::events::ChildGoalEvent;

pub(crate) struct GoalEntry {
    pub(crate) sender: broadcast::Sender<ChildGoalEvent>,
    pub(crate) tail_task: JoinHandle<()>,
    pub(crate) exec_task: JoinHandle<()>,
}

static REGISTRY: Lazy<std::sync::RwLock<HashMap<String, Arc<GoalEntry>>>> =
    Lazy::new(|| std::sync::RwLock::new(HashMap::new()));

pub(crate) fn register(goal_id: String, entry: GoalEntry) -> broadcast::Sender<ChildGoalEvent> {
    let sender = entry.sender.clone();
    let mut map = REGISTRY.write().expect("registry lock poisoned");
    map.insert(goal_id, Arc::new(entry));
    sender
}

pub(crate) fn get(goal_id: &str) -> Option<Arc<GoalEntry>> {
    let map = REGISTRY.read().expect("registry lock poisoned");
    map.get(goal_id).cloned()
}

pub(crate) fn deregister(goal_id: &str) {
    let mut map = REGISTRY.write().expect("registry lock poisoned");
    if let Some(entry) = map.remove(goal_id) {
        entry.tail_task.abort();
        entry.exec_task.abort();
    }
}