vtcode 0.137.0

A Rust-based terminal coding agent with modular architecture supporting multiple LLM providers
use vtcode_core::exec::events::{PermissionDecision, ThreadEvent};

use crate::agent::runloop::unified::inline_events::harness::HarnessEventEmitter;

pub(super) fn map_hitl_to_permission_decision(decision: &super::HitlDecision) -> PermissionDecision {
    match decision {
        super::HitlDecision::Approved
        | super::HitlDecision::ApprovedSession
        | super::HitlDecision::ApprovedPermanent
        | super::HitlDecision::Enable => PermissionDecision::Allow,
        super::HitlDecision::Denied | super::HitlDecision::DeniedOnce => PermissionDecision::Deny,
        super::HitlDecision::Interrupt | super::HitlDecision::Exit => PermissionDecision::Cancelled,
    }
}

pub(super) fn emit_permission_requested(harness_emitter: Option<&HarnessEventEmitter>, tool_name: &str) {
    let Some(emitter) = harness_emitter else { return };
    let _ = emitter.emit(ThreadEvent::PermissionRequested(vtcode_core::exec::events::PermissionRequestedEvent {
        tool_name: tool_name.to_string(),
    }));
}

pub(super) fn emit_permission_resolved(
    harness_emitter: Option<&HarnessEventEmitter>,
    tool_name: &str,
    decision: PermissionDecision,
    wait_ms: u64,
) {
    let Some(emitter) = harness_emitter else { return };
    let _ = emitter.emit(ThreadEvent::PermissionResolved(vtcode_core::exec::events::PermissionResolvedEvent {
        tool_name: tool_name.to_string(),
        decision,
        wait_ms,
    }));
}