use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use serde_json::{Map, Value};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum GuideTopic {
Start,
Overview,
Cards,
Verification,
BifrostSql,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct GuideRequest {
pub topic: GuideTopic,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct GuideResponse {
pub topic: GuideTopic,
pub steps: Vec<String>,
pub examples: Vec<GuideExample>,
}
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct GuideExample {
pub tool: String,
pub purpose: String,
pub arguments: Map<String, Value>,
}
pub const SETUP_PROMPT_NAME: &str = "setup";
pub const SETUP_PROMPT: &str = include_str!("setup-prompt.md");
#[must_use]
pub fn setup_prompt(release: &str) -> String {
format!("# Wyrd {release} setup\n\n{SETUP_PROMPT}")
}
#[cfg(test)]
mod tests {
use super::setup_prompt;
#[test]
fn setup_prompt_names_its_release_and_holds_no_secret() {
let prompt = setup_prompt("9.8.7");
assert!(prompt.starts_with("# Wyrd 9.8.7 setup\n\n"));
for secret in ["wyrd_sk_", "wyrd_global_", "postgres://", "postgresql://"] {
assert!(!prompt.contains(secret), "{secret}");
}
}
}