everruns-core 0.40.0

Transport-neutral agent execution contracts for Everruns
Documentation
use super::*;
use crate::builtins::tool_types::ToolCall;
use serde_json::json;

fn make_message_tool_turn(
    call_id: &str,
    tool_name: &str,
    result: serde_json::Value,
) -> Vec<RuntimeMessage> {
    vec![
        RuntimeMessage::assistant_with_tools(
            "",
            vec![ToolCall {
                id: call_id.to_string(),
                name: tool_name.to_string(),
                arguments: json!({"path": "/workspace/src/lib.rs"}),
            }],
        ),
        RuntimeMessage::tool_result(call_id, Some(result), None),
    ]
}

#[test]
fn provider_managed_reduction_bypasses_generic_model_view_masking() {
    let mut messages = vec![RuntimeMessage::user("inspect files repeatedly")];
    for index in 0..9 {
        messages.extend(make_message_tool_turn(
            &format!("call_{index}"),
            "read_file",
            json!({
                "path": "/workspace/src/lib.rs",
                "content": "large file line\n".repeat(1000),
                "total_lines": 1000,
                "lines_shown": {"start": 1, "end": 1000},
                "truncated": false
            }),
        ));
    }
    let original = messages.clone();
    let context = ModelViewContext {
        session_id: crate::builtins::typed_id::SessionId::new(),
        prior_usage: None,
        provider_managed_reduction: true,
    };

    let result = CompactionModelViewProvider.apply_model_view(messages, &json!({}), &context);

    assert_eq!(
        serde_json::to_value(result).unwrap(),
        serde_json::to_value(original).unwrap()
    );
}

#[test]
fn test_model_view_masks_with_compaction_config() {
    let mut messages = vec![RuntimeMessage::user("inspect files repeatedly")];
    for index in 0..9 {
        messages.extend(make_message_tool_turn(
            &format!("call_{index}"),
            "read_file",
            json!({
                "path": "/workspace/session_019e4c9dd1b17021af70ad3227361b16.jsonl",
                "content": format!("{}{}", "large transcript line\n".repeat(1000), index),
                "total_lines": 1000,
                "lines_shown": {"start": 1, "end": 1000},
                "truncated": false,
                "content_hash": format!("sha256:{index}")
            }),
        ));
    }

    let config = RuntimeCompactionConfig::default();
    let result = build_model_view_messages(&messages, &config, None);

    assert_eq!(result.masked_count, 7);
    assert!(result.tool_result_bytes_after < result.tool_result_bytes_before / 4);
    let first_tool = result.messages[2].tool_result_content().unwrap();
    let masked = first_tool.result.as_ref().unwrap();
    assert_eq!(masked["masked"], true);
    assert!(masked["summary"].as_str().unwrap().contains("read_file"));
    let last_tool = result
        .messages
        .last()
        .unwrap()
        .tool_result_content()
        .unwrap();
    assert!(last_tool.result.as_ref().unwrap().get("content").is_some());
}