1use serde::{Deserialize, Serialize};
2
3// Outbound messages
4#[derive(Debug, Serialize)]
5#[serde(tag = "kind", rename_all = "snake_case")]
6pub enum OutboundMessage {
7 StateUpdate(StateUpdateMessage),
8 #[allow(dead_code)]
9 UseFreeVersion,
10 Logout,
11}
12
13#[derive(Debug, Serialize, Deserialize)]
14#[serde(rename_all = "camelCase")]
15pub struct StateUpdateMessage {
16 pub new_id: String,
17 pub updates: Vec<StateUpdate>,
18}
19
20#[derive(Debug, Serialize, Deserialize)]
21#[serde(tag = "kind", rename_all = "snake_case")]
22pub enum StateUpdate {
23 FileUpdate(FileUpdateMessage),
24 CursorUpdate(CursorPositionUpdateMessage),
25}
26
27#[derive(Debug, Serialize, Deserialize)]
28#[serde(rename_all = "snake_case")]
29pub struct FileUpdateMessage {
30 pub path: String,
31 pub content: String,
32}
33
34#[derive(Debug, Serialize, Deserialize)]
35#[serde(rename_all = "snake_case")]
36pub struct CursorPositionUpdateMessage {
37 pub path: String,
38 pub offset: usize,
39}
40
41// Inbound messages coming in on stdout
42
43#[derive(Debug, Serialize, Deserialize)]
44#[serde(tag = "kind", rename_all = "snake_case")]
45pub enum ResponseItem {
46 // A completion
47 Text { text: String },
48 // Vestigial message type from old versions -- safe to ignore
49 Del { text: String },
50 // Be able to delete whitespace prior to the cursor, likely for the rest of the completion
51 Dedent { text: String },
52 // When the completion is over
53 End,
54 // Got the closing parentheses and shouldn't show any more after
55 Barrier,
56}
57
58#[derive(Debug, Serialize, Deserialize)]
59#[serde(rename_all = "camelCase")]
60pub struct SupermavenResponse {
61 pub state_id: String,
62 pub items: Vec<ResponseItem>,
63}
64
65#[derive(Debug, Serialize, Deserialize)]
66pub struct SupermavenMetadataMessage {
67 pub dust_strings: Option<Vec<String>>,
68}
69
70#[derive(Debug, Serialize, Deserialize)]
71pub struct SupermavenTaskUpdateMessage {
72 pub task: String,
73 pub status: TaskStatus,
74 pub percent_complete: Option<f32>,
75}
76
77#[derive(Debug, Serialize, Deserialize)]
78#[serde(rename_all = "snake_case")]
79pub enum TaskStatus {
80 InProgress,
81 Complete,
82}
83
84#[derive(Debug, Serialize, Deserialize)]
85pub struct SupermavenActiveRepoMessage {
86 pub repo_simple_name: Option<String>,
87}
88
89#[derive(Debug, Serialize, Deserialize)]
90#[serde(tag = "kind", rename_all = "snake_case")]
91pub enum SupermavenPopupAction {
92 OpenUrl { label: String, url: String },
93 NoOp { label: String },
94}
95
96#[derive(Debug, Serialize, Deserialize)]
97#[serde(rename_all = "snake_case")]
98pub struct SupermavenPopupMessage {
99 pub message: String,
100 pub actions: Vec<SupermavenPopupAction>,
101}
102
103#[derive(Debug, Serialize, Deserialize)]
104#[serde(tag = "kind", rename_all = "camelCase")]
105pub struct ActivationRequest {
106 pub activate_url: Option<String>,
107}
108
109#[derive(Debug, Serialize, Deserialize)]
110#[serde(rename_all = "camelCase")]
111pub struct SupermavenSetMessage {
112 pub key: String,
113 pub value: serde_json::Value,
114}
115
116#[derive(Clone, Debug, Serialize, Deserialize)]
117pub enum ServiceTier {
118 FreeNoLicense,
119 #[serde(other)]
120 Unknown,
121}
122
123#[derive(Debug, Serialize, Deserialize)]
124#[serde(tag = "kind", rename_all = "snake_case")]
125pub enum SupermavenMessage {
126 Response(SupermavenResponse),
127 Metadata(SupermavenMetadataMessage),
128 Apology {
129 message: Option<String>,
130 },
131 ActivationRequest(ActivationRequest),
132 ActivationSuccess,
133 Passthrough {
134 passthrough: Box<SupermavenMessage>,
135 },
136 Popup(SupermavenPopupMessage),
137 TaskStatus(SupermavenTaskUpdateMessage),
138 ActiveRepo(SupermavenActiveRepoMessage),
139 ServiceTier {
140 service_tier: ServiceTier,
141 },
142
143 Set(SupermavenSetMessage),
144 #[serde(other)]
145 Unknown,
146}