Skip to main content

vv_agent/app_server/protocol/
thread.rs

1use std::path::PathBuf;
2
3use schemars::JsonSchema;
4use serde::{Deserialize, Serialize};
5use ts_rs::TS;
6
7use super::item::AppItem;
8use super::turn::AppTurn;
9
10#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema, TS)]
11#[serde(rename_all = "camelCase")]
12pub struct ThreadStartParams {
13    #[serde(default, skip_serializing_if = "Option::is_none")]
14    pub cwd: Option<PathBuf>,
15    #[serde(default, skip_serializing_if = "Option::is_none")]
16    pub title: Option<String>,
17    #[serde(default, skip_serializing_if = "Option::is_none")]
18    pub model: Option<String>,
19    #[serde(default)]
20    pub ephemeral: bool,
21}
22
23#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema, TS)]
24#[serde(rename_all = "camelCase")]
25pub struct ThreadResumeParams {
26    pub thread_id: String,
27    #[serde(default = "default_subscribe")]
28    pub subscribe: bool,
29}
30
31#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema, TS)]
32#[serde(rename_all = "camelCase")]
33pub struct ThreadReadParams {
34    pub thread_id: String,
35    #[serde(default, skip_serializing_if = "Option::is_none")]
36    pub after_item_id: Option<String>,
37}
38
39#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema, TS)]
40#[serde(rename_all = "camelCase")]
41pub struct ThreadListParams {
42    #[serde(default)]
43    pub include_archived: bool,
44    #[serde(default, skip_serializing_if = "Option::is_none")]
45    pub archived: Option<bool>,
46    #[serde(default, skip_serializing_if = "Option::is_none")]
47    pub offset: Option<usize>,
48    #[serde(default, skip_serializing_if = "Option::is_none")]
49    pub limit: Option<usize>,
50}
51
52#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema, TS)]
53#[serde(rename_all = "camelCase")]
54pub struct ThreadArchiveParams {
55    pub thread_id: String,
56}
57
58#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, TS)]
59#[serde(rename_all = "camelCase")]
60pub struct ThreadStartResponse {
61    pub thread: AppThread,
62}
63
64#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, TS)]
65#[serde(rename_all = "camelCase")]
66pub struct ThreadResumeResponse {
67    pub thread: AppThread,
68    pub items: Vec<AppItem>,
69    #[serde(default, skip_serializing_if = "Option::is_none")]
70    pub active_turn: Option<AppTurn>,
71}
72
73#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, TS)]
74#[serde(rename_all = "camelCase")]
75pub struct ThreadReadResponse {
76    pub thread: AppThread,
77    pub items: Vec<AppItem>,
78    #[serde(default, skip_serializing_if = "Option::is_none")]
79    pub active_turn: Option<AppTurn>,
80}
81
82#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, TS)]
83#[serde(rename_all = "camelCase")]
84pub struct ThreadListResponse {
85    pub threads: Vec<AppThread>,
86}
87
88#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema, TS)]
89#[serde(rename_all = "camelCase")]
90pub struct ThreadArchiveResponse {}
91
92#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, TS)]
93#[serde(rename_all = "camelCase")]
94pub struct ThreadStartedParams {
95    pub thread: AppThread,
96}
97
98#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema, TS)]
99#[serde(rename_all = "camelCase")]
100pub struct ThreadArchivedParams {
101    pub thread_id: String,
102}
103
104#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, TS)]
105#[serde(rename_all = "camelCase")]
106pub struct AppThread {
107    pub id: String,
108    #[serde(default, skip_serializing_if = "Option::is_none")]
109    pub title: Option<String>,
110    #[serde(default, skip_serializing_if = "Option::is_none")]
111    pub cwd: Option<PathBuf>,
112    #[serde(default, skip_serializing_if = "Option::is_none")]
113    pub model: Option<String>,
114    pub status: ThreadStatus,
115    pub archived: bool,
116    pub ephemeral: bool,
117    pub created_at_ms: u128,
118    pub updated_at_ms: u128,
119    #[serde(default, skip_serializing_if = "Option::is_none")]
120    pub active_turn_id: Option<String>,
121}
122
123#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema, TS)]
124#[serde(rename_all = "camelCase")]
125pub enum ThreadStatus {
126    Idle,
127    Running,
128    Archived,
129}
130
131fn default_subscribe() -> bool {
132    true
133}