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