use kube::CustomResource;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
pub const FINALIZER: &str = "polychrome.dev/toolservice-cleanup";
fn default_transport() -> String {
"streamable-http".to_owned()
}
#[derive(CustomResource, Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
#[kube(
group = "polychrome.dev",
version = "v1alpha1",
kind = "ToolService",
namespaced,
status = "ToolServiceStatus",
shortname = "ts",
category = "polychrome",
derive = "PartialEq",
printcolumn = r#"{"name":"Healthy","type":"boolean","jsonPath":".status.healthy"}"#,
printcolumn = r#"{"name":"Version","type":"string","jsonPath":".spec.version"}"#,
printcolumn = r#"{"name":"Age","type":"date","jsonPath":".metadata.creationTimestamp"}"#
)]
#[serde(rename_all = "camelCase")]
pub struct ToolServiceSpec {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub server_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub version: String,
pub remotes: Vec<Remote>,
#[serde(default)]
pub needs_approval: bool,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub approval_tools: Vec<String>,
#[serde(default)]
pub default_enabled: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub auth: Option<Auth>,
#[serde(default, skip_serializing_if = "std::collections::BTreeMap::is_empty")]
pub tool_expansions: std::collections::BTreeMap<String, String>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct Auth {
pub bearer_secret_ref: BearerSecretRef,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct BearerSecretRef {
pub name: String,
pub key: String,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct Remote {
pub url: String,
#[serde(default = "default_transport")]
pub transport: String,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct ToolServiceStatus {
#[serde(default)]
pub healthy: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub last_checked_at: Option<String>,
#[serde(default)]
pub available_tools: Vec<ToolDescriptor>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub message: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub observed_version: Option<String>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct ToolDescriptor {
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub input_schema: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(default, skip_serializing_if = "std::ops::Not::not")]
pub read_only: bool,
#[serde(default, skip_serializing_if = "std::ops::Not::not")]
pub destructive: bool,
#[serde(default, skip_serializing_if = "std::ops::Not::not")]
pub open_world: bool,
}