use serde::{Deserialize, Serialize};
use serde_json::{json, Value};
#[derive(Deserialize, Debug, Clone)]
pub struct CatalogEventsQuery {
pub after: Option<String>,
}
#[derive(Serialize, Debug, Clone)]
pub struct CatalogEventsResponse {
pub catalog_version: String,
pub cursor: String,
pub events: Vec<crate::catalog::CatalogEvent>,
}
#[derive(Deserialize, Debug, Clone, Default)]
pub struct CallCapabilityRequest {
pub capability_id: String,
pub args: Value,
#[serde(default)]
pub request_id: Option<String>,
#[serde(default)]
pub context: Option<crate::context::RequestContext>,
#[serde(default)]
pub idempotency_key: Option<String>,
#[serde(default)]
pub input_responses: Option<std::collections::BTreeMap<String, Value>>,
#[serde(default)]
pub request_state: Option<String>,
#[serde(default)]
pub async_task: bool,
}
#[derive(Deserialize, Debug, Clone)]
pub struct ReadResourceRequest {
pub resource_id: String,
#[serde(default)]
pub request_id: Option<String>,
#[serde(default)]
pub context: Option<crate::context::RequestContext>,
#[serde(default)]
pub idempotency_key: Option<String>,
#[serde(default)]
pub input_responses: Option<std::collections::BTreeMap<String, Value>>,
#[serde(default)]
pub request_state: Option<String>,
}
#[derive(Deserialize, Debug, Clone)]
pub struct GetPromptRequest {
pub prompt_id: String,
#[serde(default)]
pub arguments: Option<Value>,
#[serde(default)]
pub request_id: Option<String>,
#[serde(default)]
pub context: Option<crate::context::RequestContext>,
#[serde(default)]
pub idempotency_key: Option<String>,
#[serde(default)]
pub input_responses: Option<std::collections::BTreeMap<String, Value>>,
#[serde(default)]
pub request_state: Option<String>,
}
pub(crate) fn default_search_limit() -> usize {
8
}
#[derive(Deserialize, Debug, Clone)]
pub struct SearchCapabilitiesRequest {
pub query: Option<String>,
#[serde(default = "default_search_limit")]
pub limit: usize,
#[serde(default)]
pub server_ids: Vec<String>,
#[serde(default)]
pub tags: Vec<String>,
#[serde(default)]
pub modes: Vec<String>,
}
#[derive(Deserialize, Debug, Clone)]
pub struct CompletionRequest {
pub ref_type: String,
pub ref_name: String,
pub argument_name: String,
#[serde(default)]
pub argument_value: String,
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct SamplingRequest {
pub server_id: String,
#[serde(default)]
pub messages: Vec<crate::sampling::SamplingMessage>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub model_preferences: Option<crate::sampling::ModelPreferences>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub system_prompt: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub include_context: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_tokens: Option<usize>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub stop_sequences: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub metadata: Option<Value>,
#[serde(default)]
pub async_mode: Option<bool>,
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct RespondSamplingRequest {
pub result: crate::sampling::CreateMessageResult,
}
#[derive(Deserialize, Debug, Clone, Default)]
pub struct SamplingListQuery {
pub server_id: Option<String>,
pub status: Option<String>,
}
#[derive(Deserialize, Debug, Clone)]
pub struct UpsertServerRequest {
pub name: String,
pub server: crate::config::ServerConfig,
}
#[derive(Deserialize, Debug, Clone)]
pub struct ImportConfigRequest {
pub source_path: Option<String>,
pub overwrite: Option<bool>,
}
#[derive(Deserialize, Debug, Clone)]
pub struct UpdateAliasRequest {
pub kind: String,
pub alias: String,
pub target: Option<String>,
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct UpsertProfileRequest {
pub name: String,
pub servers: Vec<String>,
#[serde(default)]
pub description: Option<String>,
}
#[derive(Deserialize, Debug, Clone)]
pub struct ApproveTicketRequest {
pub operator: String,
#[serde(default)]
pub modified_args: Option<Value>,
}
#[derive(Deserialize, Debug, Clone)]
pub struct RejectTicketRequest {
pub operator: String,
#[serde(default)]
pub reason: Option<String>,
}
pub fn error_envelope(
trace_id: String,
request_id: Option<String>,
context: Option<crate::context::RequestContext>,
retry: crate::idempotency::RetryMetadata,
code: &str,
message: impl Into<String>,
retryable: bool,
) -> Value {
let ctx_val = context.unwrap_or_default();
json!({
"ok": false,
"request_id": request_id,
"context": ctx_val,
"trace_id": trace_id,
"data": null,
"error": {
"code": code,
"message": message.into(),
"retryable": retryable,
},
"retry": retry,
})
}