use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Serialize, Deserialize)]
pub struct DharaFlowDef {
pub id: String,
#[serde(default = "default_version")]
pub version: String,
#[serde(default)]
pub description: Option<String>,
pub system_prompt: String,
pub initial_node: String,
pub nodes: HashMap<String, NodeDef>,
#[serde(default)]
pub functions: HashMap<String, FunctionDef>,
}
fn default_version() -> String {
"1.0".to_string()
}
#[derive(Debug, Serialize, Deserialize)]
pub struct NodeDef {
#[serde(default)]
pub system_prompt_override: Option<String>,
#[serde(default)]
pub task_messages: Vec<TaskMessage>,
#[serde(default)]
pub context_strategy: ContextStrategyDef,
#[serde(default = "default_true")]
pub respond_immediately: bool,
#[serde(default)]
pub functions: Vec<String>,
}
fn default_true() -> bool {
true
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaskMessage {
pub role: String,
pub content: String,
}
#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum ContextStrategyDef {
#[default]
Append,
Reset,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct FunctionDef {
pub description: String,
#[serde(default = "empty_object_schema")]
pub parameters: Value,
#[serde(default)]
pub transitions: HashMap<String, String>,
}
fn empty_object_schema() -> Value {
serde_json::json!({
"type": "object",
"properties": {},
"required": []
})
}