tea-context 0.1.0

Deterministic prompt modules, context providers, and compiler for tea-rs
Documentation
use crate::common;

use common::{module, segment};
use tea_context::{
    BudgetBehavior, CacheScope, PromptAuthority, PromptBudget, PromptCompiler, SegmentDisposition,
    TrustLevel,
};

#[test]
fn included_byte_ranges_slice_exact_content_and_preserve_provenance() {
    let prompt = PromptCompiler
        .compile(
            [module(
                "inspect",
                PromptAuthority::Workspace,
                0,
                vec![
                    segment("one", "alpha", BudgetBehavior::Required),
                    segment("two", "βeta", BudgetBehavior::Required),
                ],
            )],
            PromptBudget::new(100, 100).unwrap(),
        )
        .unwrap();
    assert_eq!(prompt.text(), "alpha\n\nβeta");
    for entry in prompt.inspection() {
        let range = entry.byte_range().unwrap().clone();
        let slice = &prompt.text()[range];
        assert_eq!(slice.len(), entry.rendered_bytes());
        assert_eq!(entry.disposition(), SegmentDisposition::Included);
        assert_eq!(entry.trust(), TrustLevel::Delegated);
        assert_eq!(entry.cache_scope(), CacheScope::Run);
        assert_eq!(entry.provenance().source_kind(), "test");
        assert!(!slice.is_empty());
    }
    assert_eq!(prompt.inspection()[0].byte_range().unwrap(), &(0..5));
    assert_eq!(prompt.inspection()[1].byte_range().unwrap(), &(7..12));
}

#[test]
fn inspection_is_identical_for_permuted_module_inputs() {
    let modules = vec![
        module(
            "later",
            PromptAuthority::Session,
            0,
            vec![segment("later", "later", BudgetBehavior::Required)],
        ),
        module(
            "earlier",
            PromptAuthority::Product,
            0,
            vec![segment("earlier", "earlier", BudgetBehavior::Required)],
        ),
    ];
    let forward = PromptCompiler
        .compile(modules.clone(), PromptBudget::new(100, 100).unwrap())
        .unwrap();
    let reverse = PromptCompiler
        .compile(
            modules.into_iter().rev(),
            PromptBudget::new(100, 100).unwrap(),
        )
        .unwrap();
    assert_eq!(forward.inspection(), reverse.inspection());
    assert_eq!(forward.diagnostics(), reverse.diagnostics());
}