aidaemon 0.9.34

A personal AI agent that runs as a background daemon, accessible via Telegram, Slack, or Discord, with tool use, MCP integration, and persistent memory
use super::*;

#[test]
fn detects_explicit_positive_signals_only() {
    let detected = detect_explicit_outcome_signal("thanks, that worked");
    assert_eq!(detected, Some(("positive", true)));
}

#[test]
fn detects_explicit_negative_signals_only() {
    let detected = detect_explicit_outcome_signal("you misunderstood");
    assert_eq!(detected, Some(("negative", false)));
}

#[test]
fn ignores_non_explicit_feedback() {
    let detected = detect_explicit_outcome_signal("can you try a different approach");
    assert!(detected.is_none());
}

#[test]
fn risk_scoring_prefers_word_boundary_action_terms() {
    let caps = std::collections::HashMap::new();
    let direct = build_policy_bundle("please deploy to production", &caps, false).risk_score;
    let morph =
        build_policy_bundle("the deployed artifact is production-like", &caps, false).risk_score;
    assert!(
        direct > morph,
        "expected direct action wording to score higher than morphological variants"
    );
}

#[test]
fn risk_scoring_does_not_treat_overwritten_as_overwrite_command() {
    let caps = std::collections::HashMap::new();
    let destructive = build_policy_bundle("overwrite the file now", &caps, false).risk_score;
    let descriptive = build_policy_bundle("this is an overwritten file", &caps, false).risk_score;
    assert!(
        destructive > descriptive,
        "expected imperative overwrite command to score higher than descriptive text"
    );
}