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