use libpetri_docgen::*;
use libpetri_docgen::export::mapper::DotConfig;
use libpetri_docgen::export::graph::RankDir;
use std::collections::HashSet;
fn main() {
generate_svg("basic_chain", &basic_chain());
SvgGenerator::new()
.config(DotConfig {
direction: RankDir::LeftToRight,
environment_places: HashSet::from([
"KeyboardEvent".to_string(),
"UserMessage".to_string(),
"TopicChange".to_string(),
]),
..DotConfig::default()
})
.generate("showcase", &showcase());
}
fn basic_chain() -> PetriNet {
let p1 = Place::<i32>::new("p1");
let p2 = Place::<i32>::new("p2");
let p3 = Place::<i32>::new("p3");
let t1 = Transition::builder("t1")
.input(one(&p1))
.output(out_place(&p2))
.action(fork())
.build();
let t2 = Transition::builder("t2")
.input(one(&p2))
.output(out_place(&p3))
.action(fork())
.build();
PetriNet::builder("basic_chain")
.transition(t1)
.transition(t2)
.build()
}
fn showcase() -> PetriNet {
let keyboard = Place::<()>::new("KeyboardEvent"); let user_message = Place::<String>::new("UserMessage"); let topic_change = Place::<()>::new("TopicChange"); let composing = Place::<()>::new("Composing"); let pending = Place::<String>::new("Pending"); let processing = Place::<()>::new("Processing"); let context_ready = Place::<String>::new("ContextReady"); let conversation = Place::<String>::new("Conversation"); let summary = Place::<String>::new("Summary"); let summarizing = Place::<()>::new("Summarizing"); let thinking = Place::<String>::new("Thinking"); let urgency = Place::<()>::new("Urgency"); let response = Place::<String>::new("Response");
let typing = Transition::builder("Typing")
.input(one(&keyboard))
.reset(reset(&urgency))
.output(out_place(&composing))
.timing(immediate())
.priority(20)
.action(fork())
.build();
let receive = Transition::builder("Receive")
.input(one(&user_message))
.reset(reset(&composing))
.output(and(vec![
out_place(&pending),
out_place(&processing),
out_place(&conversation),
]))
.timing(immediate())
.priority(10)
.action(fork())
.build();
let gather_context = Transition::builder("GatherContext")
.input(one(&pending))
.read(read(&conversation))
.read(read(&summary))
.output(out_place(&context_ready))
.timing(immediate())
.action(fork())
.build();
let gather_fresh = Transition::builder("GatherFresh")
.input(one(&pending))
.read(read(&conversation))
.inhibitor(inhibitor(&summary))
.output(out_place(&context_ready))
.timing(immediate())
.action(fork())
.build();
let deep_agent = Transition::builder("DeepAgent")
.input(one(&context_ready))
.output(out_place(&thinking))
.timing(window(500, 10000))
.action(fork())
.build();
let timeout = Transition::builder("Timeout")
.read(read(&processing))
.inhibitor(inhibitor(&response))
.inhibitor(inhibitor(&composing))
.output(out_place(&urgency))
.timing(exact(5000))
.action(fork())
.build();
let quick_agent = Transition::builder("QuickAgent")
.input(one(&processing))
.input(one(&urgency))
.read(read(&conversation))
.output(out_place(&response))
.timing(immediate())
.action(fork())
.build();
let complete = Transition::builder("Complete")
.input(one(&thinking))
.input(one(&processing))
.inhibitor(inhibitor(&response))
.reset(reset(&urgency))
.output(out_place(&response))
.timing(deadline(3000))
.action(fork())
.build();
let dump = Transition::builder("Dump")
.input(one(&thinking))
.read(read(&response))
.timing(immediate())
.action(fork())
.build();
let auto_summarize = Transition::builder("AutoSummarize")
.input(at_least(3, &conversation))
.inhibitor(inhibitor(&summarizing))
.reset(reset(&conversation))
.output(out_place(&summarizing))
.timing(delayed(2000))
.action(fork())
.build();
let tool_summarize = Transition::builder("ToolSummarize")
.input(one(&topic_change))
.read(read(&conversation))
.inhibitor(inhibitor(&summarizing))
.reset(reset(&conversation))
.output(out_place(&summarizing))
.timing(immediate())
.action(fork())
.build();
let summary_done = Transition::builder("SummaryDone")
.input(one(&summarizing))
.reset(reset(&summary))
.output(out_place(&summary))
.timing(deadline(2000))
.action(fork())
.build();
PetriNet::builder("AgentPipeline")
.transition(typing)
.transition(receive)
.transition(gather_context)
.transition(gather_fresh)
.transition(deep_agent)
.transition(timeout)
.transition(quick_agent)
.transition(complete)
.transition(dump)
.transition(auto_summarize)
.transition(tool_summarize)
.transition(summary_done)
.build()
}