greentic-runner-host 0.4.73

Host runtime shim for Greentic runner: config, pack loading, activity handling
Documentation
use std::hint::black_box;
use std::path::Path;
use std::time::{Duration, Instant};

use base64::Engine;
use chrono::Utc;
use greentic_runner_host::ingress::{
    ProviderIds, build_canonical_payload, canonical_session_key, default_metadata, empty_entities,
};
use greentic_runner_host::routing::{RoutingConfig, TenantResolver, TenantRouting};
use runner_core::normalize_under_root;
use serde_json::json;

fn sample_provider_ids() -> ProviderIds {
    ProviderIds {
        workspace_id: Some("T123".into()),
        conversation_id: Some("conv-123".into()),
        thread_id: Some("thread-123".into()),
        channel_id: Some("channel-123".into()),
        user_id: Some("user-123".into()),
        message_id: Some("message-123".into()),
        event_id: Some("event-123".into()),
        ..ProviderIds::default()
    }
}

#[test]
fn perf_guards_finish_quickly() {
    let start = Instant::now();
    let routing = TenantRouting::new(RoutingConfig {
        resolver: TenantResolver::Jwt {
            header: axum::http::header::AUTHORIZATION,
            claim: "tenant".into(),
        },
        default_tenant: "demo".into(),
    });
    let root = std::env::current_dir().expect("cwd");

    for _ in 0..5_000 {
        let payload = base64::engine::general_purpose::URL_SAFE_NO_PAD
            .encode(r#"{"tenant":"jwt-tenant","scope":"perf"}"#);
        let (parts, _) = axum::http::Request::builder()
            .header(
                axum::http::header::AUTHORIZATION,
                format!("Bearer header.{payload}.signature"),
            )
            .body(())
            .expect("request")
            .into_parts();
        black_box(routing.resolve(&parts).expect("tenant"));
    }

    let provider_ids = sample_provider_ids();
    for _ in 0..2_000 {
        black_box(build_canonical_payload(
            "demo",
            "slack",
            &provider_ids,
            canonical_session_key("demo", "slack", &provider_ids),
            &["chat".to_string(), "attachments".to_string()],
            Utc::now(),
            Some("en".into()),
            Some("hello".into()),
            vec![json!({
                "type": "image",
                "url": "https://example.invalid/image.png",
                "size": 1024
            })],
            Vec::new(),
            empty_entities(),
            default_metadata(),
            json!({"type": "message"}),
            json!({"raw": true}),
        ));
    }

    for _ in 0..5_000 {
        black_box(normalize_under_root(&root, Path::new("Cargo.toml")).expect("normalize"));
    }

    let elapsed = start.elapsed();
    assert!(
        elapsed < Duration::from_secs(5),
        "perf guard workload too slow: {:?}",
        elapsed
    );
}