Skip to main content

systemprompt_models/mcp/
deployment.rs

1use crate::ai::ToolModelConfig;
2use crate::auth::{JwtAudience, Permission};
3use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6#[derive(Debug, Clone, Serialize, Deserialize, Default)]
7pub struct ToolUiConfig {
8    #[serde(default = "default_resource_uri_template")]
9    pub resource_uri_template: String,
10    #[serde(default = "default_visibility")]
11    pub visibility: Vec<String>,
12}
13
14fn default_resource_uri_template() -> String {
15    "ui://systemprompt/{artifact_id}".to_string()
16}
17
18fn default_visibility() -> Vec<String> {
19    vec!["model".to_string()]
20}
21
22impl ToolUiConfig {
23    pub fn to_meta_json(&self) -> serde_json::Value {
24        serde_json::json!({
25            "ui": {
26                "resourceUri": self.resource_uri_template,
27                "visibility": self.visibility
28            }
29        })
30    }
31}
32
33#[derive(Debug, Clone, Serialize, Deserialize, Default)]
34pub struct ToolMetadata {
35    #[serde(default)]
36    pub terminal_on_success: bool,
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub model_config: Option<ToolModelConfig>,
39    #[serde(skip_serializing_if = "Option::is_none")]
40    pub ui: Option<ToolUiConfig>,
41}
42
43#[derive(Debug, Clone, Serialize, Deserialize)]
44pub struct DeploymentConfig {
45    pub deployments: HashMap<String, Deployment>,
46    pub settings: Settings,
47}
48
49#[derive(Debug, Clone, Serialize, Deserialize)]
50pub struct Deployment {
51    pub binary: String,
52    pub package: Option<String>,
53    pub port: u16,
54    pub endpoint: String,
55    pub enabled: bool,
56    pub display_in_web: bool,
57    #[serde(default)]
58    pub dev_only: bool,
59    #[serde(default)]
60    pub schemas: Vec<SchemaDefinition>,
61    pub oauth: OAuthRequirement,
62    #[serde(default)]
63    pub tools: HashMap<String, ToolMetadata>,
64    #[serde(skip_serializing_if = "Option::is_none")]
65    pub model_config: Option<ToolModelConfig>,
66    #[serde(default)]
67    pub env_vars: Vec<String>,
68}
69
70#[derive(Debug, Clone, Serialize, Deserialize)]
71pub struct SchemaDefinition {
72    pub file: String,
73    pub table: String,
74    pub required_columns: Vec<String>,
75}
76
77#[derive(Debug, Clone, Serialize, Deserialize)]
78pub struct OAuthRequirement {
79    pub required: bool,
80    pub scopes: Vec<Permission>,
81    pub audience: JwtAudience,
82    pub client_id: Option<String>,
83}
84
85#[derive(Debug, Clone, Serialize, Deserialize)]
86pub struct Settings {
87    pub auto_build: bool,
88    pub build_timeout: u64,
89    pub health_check_timeout: u64,
90    #[serde(default = "default_base_port")]
91    pub base_port: u16,
92    #[serde(default = "default_working_dir")]
93    pub working_dir: String,
94}
95
96const fn default_base_port() -> u16 {
97    5000
98}
99
100fn default_working_dir() -> String {
101    "/app".to_string()
102}