Skip to main content

vv_agent/app_server/protocol/
initialize.rs

1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3use ts_rs::TS;
4
5#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema, TS)]
6#[serde(rename_all = "camelCase")]
7pub struct InitializeParams {
8    pub client_info: AppClientInfo,
9    #[serde(default)]
10    pub capabilities: AppClientCapabilities,
11}
12
13#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema, TS)]
14#[serde(rename_all = "camelCase")]
15pub struct AppClientInfo {
16    pub name: String,
17    #[serde(default, skip_serializing_if = "Option::is_none")]
18    pub title: Option<String>,
19    #[serde(default, skip_serializing_if = "Option::is_none")]
20    pub version: Option<String>,
21}
22
23#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize, JsonSchema, TS)]
24#[serde(rename_all = "camelCase")]
25pub struct AppClientCapabilities {
26    #[serde(default)]
27    pub experimental_api: bool,
28    #[serde(default)]
29    pub opt_out_notification_methods: Vec<String>,
30}
31
32#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema, TS)]
33#[serde(rename_all = "camelCase")]
34pub struct InitializeResponse {
35    pub user_agent: String,
36    pub protocol_version: String,
37    pub capabilities: AppServerCapabilities,
38}
39
40impl InitializeResponse {
41    pub fn new(capabilities: AppServerCapabilities) -> Self {
42        Self {
43            user_agent: "vv-agent-app-server".to_string(),
44            protocol_version: "v1".to_string(),
45            capabilities,
46        }
47    }
48}
49
50#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema, TS)]
51#[serde(rename_all = "camelCase")]
52pub struct AppServerCapabilities {
53    pub model_list: bool,
54    pub thread_lifecycle: bool,
55    pub notification_opt_out: bool,
56    pub schema_export: bool,
57    pub approval_resolve: bool,
58}
59
60impl AppServerCapabilities {
61    pub fn for_runtime(runtime_configured: bool) -> Self {
62        Self {
63            model_list: true,
64            thread_lifecycle: runtime_configured,
65            notification_opt_out: true,
66            schema_export: true,
67            approval_resolve: true,
68        }
69    }
70}