use std::collections::HashMap;
use clap::{Parser, Subcommand};
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Parser)]
#[command(name = "terraphim_rlm")]
#[command(about = "Terraphim RLM - Recursive Language Model orchestration")]
#[command(version = env!("CARGO_PKG_VERSION"))]
pub struct Cli {
#[command(subcommand)]
pub command: Commands,
}
#[derive(Subcommand)]
pub enum Commands {
Session {
#[command(subcommand)]
action: SessionAction,
},
Code {
#[arg(long)]
session_id: String,
},
Bash {
#[arg(long)]
session_id: String,
},
Query {
#[arg(long)]
session_id: String,
},
Context {
#[arg(long)]
session_id: String,
},
Snapshot {
#[arg(long)]
session_id: String,
},
Status {
#[arg(long)]
session_id: String,
},
}
#[derive(Subcommand)]
pub enum SessionAction {
Create,
Destroy {
#[arg(long)]
session_id: String,
},
}
#[derive(Debug, Default, Deserialize)]
pub struct CodeRequest {
pub code: String,
}
#[derive(Debug, Default, Deserialize)]
pub struct BashRequest {
pub command: String,
}
#[derive(Debug, Default, Deserialize)]
pub struct QueryRequest {
pub prompt: String,
}
#[derive(Debug, Default, Deserialize)]
pub struct ContextRequest {
pub action: String,
#[serde(default)]
pub key: Option<String>,
#[serde(default)]
pub value: Option<String>,
}
#[derive(Debug, Default, Deserialize)]
pub struct SnapshotRequest {
pub action: String,
#[serde(default)]
pub snapshot_name: Option<String>,
}
#[derive(Debug, Default, Deserialize)]
pub struct StatusRequest {
#[serde(default)]
pub include_history: bool,
}
#[derive(Debug, Serialize)]
pub struct CliResponse {
pub success: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<CliError>,
}
#[derive(Debug, Serialize)]
pub struct CliError {
pub r#type: String,
pub message: String,
}
impl CliResponse {
pub fn success<T: Serialize>(data: T) -> Self {
Self {
success: true,
data: Some(serde_json::to_value(data).unwrap_or(Value::Null)),
error: None,
}
}
pub fn error(error_type: &str, message: String) -> Self {
Self {
success: false,
data: None,
error: Some(CliError {
r#type: error_type.to_string(),
message,
}),
}
}
}
#[derive(Debug, Serialize)]
pub struct ExecutionResponse {
pub stdout: String,
pub stderr: String,
pub exit_code: i32,
pub execution_time_ms: u64,
pub success: bool,
}
#[derive(Debug, Serialize)]
pub struct QueryResponse {
pub model: String,
pub response: String,
pub tokens_used: u64,
}
#[derive(Debug, Serialize)]
pub struct ContextResponse {
pub action: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub value: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub variables: Option<HashMap<String, String>>,
}
#[derive(Debug, Serialize)]
pub struct SnapshotResponse {
pub action: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub snapshot_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub snapshot_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub snapshots: Option<Vec<String>>,
}
#[derive(Debug, Serialize)]
pub struct SessionCreateResponse {
pub session_id: String,
pub state: String,
pub created_at: String,
pub expires_at: String,
}