1use serde::{Deserialize, Serialize};
2
3pub const PROTOCOL_VERSION: u32 = 7;
4
5#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
6pub struct RequestEnvelope {
7 pub version: u32,
8 #[serde(flatten)]
9 pub request: Request,
10}
11
12impl RequestEnvelope {
13 pub fn new(request: Request) -> Self {
14 Self {
15 version: PROTOCOL_VERSION,
16 request,
17 }
18 }
19}
20
21#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
22#[serde(tag = "type", rename_all = "snake_case", deny_unknown_fields)]
23pub enum Request {
24 Ping,
25 Shutdown,
26 Record {
27 command: String,
28 cwd: String,
29 exit_code: i32,
30 observed_at_ms: i64,
31 session_id: String,
32 },
33 Complete {
34 buffer: String,
35 cursor_byte: usize,
36 cwd: String,
37 limit: Option<usize>,
38 },
39 Fuzzy {
40 query: String,
41 cwd: String,
42 limit: Option<usize>,
43 },
44 ImportHistory {
45 path: String,
46 },
47}
48
49#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
50#[serde(tag = "type", rename_all = "snake_case")]
51pub enum Response {
52 Pong { version: String },
53 Recorded,
54 ShuttingDown,
55 Completion(CompletionResponse),
56 Imported { imported: usize, skipped: bool },
57 Error { message: String },
58}
59
60#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
61pub struct CompletionResponse {
62 pub replace_start_byte: usize,
63 pub replace_end_byte: usize,
64 pub candidates: Vec<Candidate>,
65 pub enrichment_pending: bool,
66}
67
68impl CompletionResponse {
69 pub fn empty(cursor_byte: usize) -> Self {
70 Self {
71 replace_start_byte: cursor_byte,
72 replace_end_byte: cursor_byte,
73 candidates: Vec::new(),
74 enrichment_pending: false,
75 }
76 }
77}
78
79#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
80pub struct Candidate {
81 pub display: String,
82 pub description: String,
83 pub description_pending: bool,
84 pub kind: CandidateKind,
85 pub insert_text: String,
86 pub accept_text: String,
87 pub source: CandidateSource,
88}
89
90#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
91#[serde(rename_all = "snake_case")]
92pub enum CandidateKind {
93 History,
94 Command,
95 File,
96 Directory,
97 Option,
98}
99
100#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
101#[serde(rename_all = "snake_case")]
102pub enum CandidateSource {
103 History,
104 Command,
105 Filesystem,
106 Help,
107}