ai-agent 0.13.4

Idiomatic agent sdk inspired by the claude code source leak
Documentation
// Source: /data/home/swei/claudecode/openclaudecode/src/utils/words.ts
#![allow(dead_code)]

use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};

const ADJECTIVES: &[&str] = &[
    "abundant",
    "ancient",
    "bright",
    "calm",
    "cheerful",
    "clever",
    "cozy",
    "curious",
    "dapper",
    "dazzling",
    "deep",
    "delightful",
    "eager",
    "elegant",
    "enchanted",
    "fancy",
    "fluffy",
    "gentle",
    "gleaming",
    "golden",
    "graceful",
    "happy",
    "hidden",
    "humble",
    "jolly",
    "joyful",
    "keen",
    "kind",
    "lively",
    "lovely",
    "lucky",
    "luminous",
    "magical",
    "majestic",
    "mellow",
    "merry",
    "mighty",
    "misty",
    "noble",
    "peaceful",
    "playful",
    "polished",
    "precious",
    "proud",
    "quiet",
    "quirky",
    "radiant",
    "rosy",
    "serene",
    "shiny",
    "silly",
    "sleepy",
    "smooth",
    "snazzy",
    "snug",
    "snuggly",
    "soft",
    "sparkling",
    "spicy",
    "splendid",
    "sprightly",
    "starry",
    "steady",
    "sunny",
    "swift",
    "tender",
    "tidy",
    "toasty",
    "tranquil",
    "twinkly",
    "valiant",
    "vast",
    "velvet",
    "vivid",
    "warm",
    "whimsical",
    "wild",
    "wise",
    "witty",
    "wondrous",
    "zany",
    "zesty",
    "zippy",
];

const NOUNS: &[&str] = &[
    "aurora",
    "avalanche",
    "blossom",
    "breeze",
    "brook",
    "bubble",
    "canyon",
    "cascade",
    "cloud",
    "clover",
    "comet",
    "coral",
    "cosmos",
    "creek",
    "crescent",
    "crystal",
    "dawn",
    "dewdrop",
    "dusk",
    "eclipse",
    "ember",
    "feather",
    "fern",
    "firefly",
    "flame",
    "flurry",
    "fog",
    "forest",
    "frost",
    "galaxy",
    "garden",
    "glacier",
    "glade",
    "grove",
    "harbor",
    "horizon",
    "island",
    "lagoon",
    "lake",
    "leaf",
    "lightning",
    "meadow",
    "meteor",
    "mist",
    "moon",
    "moonbeam",
    "mountain",
    "nebula",
    "nova",
    "ocean",
    "orbit",
    "pebble",
    "petal",
    "pine",
    "planet",
    "pond",
    "puddle",
    "quasar",
    "rain",
    "rainbow",
    "reef",
    "ripple",
    "river",
    "shore",
    "sky",
    "snowflake",
    "spark",
    "spring",
    "star",
    "stardust",
    "starlight",
    "storm",
    "stream",
    "summit",
    "sun",
    "sunbeam",
    "sunrise",
    "sunset",
    "thunder",
    "tide",
    "twilight",
    "valley",
    "volcano",
    "waterfall",
    "wave",
    "willow",
    "wind",
];

const VERBS: &[&str] = &[
    "baking",
    "beaming",
    "booping",
    "bouncing",
    "brewing",
    "bubbling",
    "chasing",
    "churning",
    "coalescing",
    "conjuring",
    "cooking",
    "crafting",
    "crunching",
    "cuddling",
    "dancing",
    "dazzling",
    "discovering",
    "doodling",
    "dreaming",
    "drifting",
    "enchanting",
    "exploring",
    "finding",
    "floating",
    "fluttering",
    "foraging",
    "forging",
    "frolicking",
    "gathering",
    "giggling",
    "gliding",
    "greeting",
    "growing",
    "hatching",
    "herding",
    "honking",
    "hopping",
    "hugging",
    "humming",
    "imagining",
    "inventing",
    "jingling",
    "juggling",
    "jumping",
    "kindling",
    "knitting",
    "launching",
    "leaping",
    "mapping",
    "marinating",
    "meandering",
    "mixing",
    "moseying",
    "munching",
    "napping",
    "nibbling",
    "noodling",
    "orbiting",
    "painting",
    "percolating",
    "petting",
    "plotting",
    "pondering",
    "popping",
    "prancing",
    "purring",
    "puzzling",
    "questing",
    "riding",
    "roaming",
    "rolling",
    "sauteeing",
    "scribbling",
    "seeking",
    "shimmying",
    "singing",
    "skipping",
    "sleeping",
    "snacking",
    "sniffing",
    "snuggling",
    "soaring",
    "sparking",
    "spinning",
    "splashing",
    "sprouting",
    "squishing",
    "stargazing",
    "stirring",
    "strolling",
    "swimming",
    "swinging",
    "tickling",
    "tinkering",
    "toasting",
    "tumbling",
    "twirling",
    "waddling",
    "wandering",
    "watching",
    "weaving",
    "whistling",
    "wibbling",
    "wiggling",
    "wishing",
    "wobbling",
    "wondering",
    "yawning",
    "zooming",
];

fn random_int(max: usize) -> usize {
    let mut hasher = DefaultHasher::new();
    std::time::SystemTime::now()
        .duration_since(std::time::UNIX_EPOCH)
        .unwrap()
        .as_nanos()
        .hash(&mut hasher);
    (hasher.finish() as usize) % max
}

fn pick_random<T: Clone>(array: &[T]) -> T {
    array[random_int(array.len())].clone()
}

pub fn generate_word_slug() -> String {
    let adjective = pick_random(ADJECTIVES);
    let verb = pick_random(VERBS);
    let noun = pick_random(NOUNS);
    format!("{}-{}-{}", adjective, verb, noun)
}

pub fn generate_short_word_slug() -> String {
    let adjective = pick_random(ADJECTIVES);
    let noun = pick_random(NOUNS);
    format!("{}-{}", adjective, noun)
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_generate_word_slug() {
        let slug = generate_word_slug();
        let parts: Vec<&str> = slug.split('-').collect();
        assert_eq!(parts.len(), 3);
    }

    #[test]
    fn test_generate_short_word_slug() {
        let slug = generate_short_word_slug();
        let parts: Vec<&str> = slug.split('-').collect();
        assert_eq!(parts.len(), 2);
    }
}