//! A signed prompt registry: version a template, promote an alias, render it, //! and show that every change sealed a verifiable receipt. //! //! ```text //! cargo run -p jcp-prompt --example registry //! ``` use std::collections::BTreeMap; use ed25519_dalek::SigningKey; use jcp_prompt::{verify, PromptRegistry}; fn main() { let mut reg = PromptRegistry::new(SigningKey::from_bytes(&[9u8; 32]), "did:example:prompt-steward"); // Two versions of a support prompt; v2 tightens the instruction. let v1 = reg.register("support", "Answer {{ user }} about {{ topic }}."); let v2 = reg.register("support", "Answer {{ user }} about {{ topic }} in one sentence."); println!("registered support v{} ({}…)", v1.version, &v1.content_id().to_hex()[..12]); println!("registered support v{} ({}…)", v2.version, &v2.content_id().to_hex()[..12]); println!("template variables: {:?}", v2.variables()); // Promote production to v1 first, then to v2 — an auditable move. reg.set_alias("support", "production", 1).unwrap(); reg.set_alias("support", "production", 2).unwrap(); // Resolve the production alias and render it. let live = reg.resolve("prompts:/support@production").unwrap(); let mut vars = BTreeMap::new(); vars.insert("user".to_string(), "Alice".to_string()); vars.insert("topic".to_string(), "a refund".to_string()); println!("\nprompts:/support@production → v{}", live.version); println!("rendered: {}", live.render(&vars).unwrap()); // A pinned older version still resolves byte-for-byte. println!("prompts:/support/1 → {:?}", reg.resolve("prompts:/support/1").unwrap().template); // Every register + promote sealed a hash-chained, verifiable receipt. let steward = reg.steward().to_string(); let pk = reg.steward_pubkey(); println!("\nsealed prompt/1 receipts:"); for (i, r) in reg.receipts().iter().enumerate() { let pr = verify(r, &steward, &pk).unwrap(); let what = match pr.alias { Some(a) => format!("{} {}@{} → v{}", pr.kind, pr.name, a, pr.version), None => format!("{} {} v{}", pr.kind, pr.name, pr.version), }; println!(" [{i}] {what:38} verifies ✓"); } }