vv_agent/app_server/protocol/
thread.rs1use 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}