Skip to content
This repository was archived by the owner on Feb 18, 2025. It is now read-only.

Commit 98b137f

Browse files
committed
Upgrade API to version 0.2.7
1 parent d2d942c commit 98b137f

File tree

11 files changed

+110
-218
lines changed

11 files changed

+110
-218
lines changed

crates/cursor-core/src/conversation/chat/session.rs

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
11
use futures::StreamExt;
22
use node_bridge::prelude::*;
3-
use uuid::Uuid;
43
use wasm_bindgen::JsValue;
54

65
use crate::{
76
conversation::{
8-
make_conversation_request,
97
models::{user_message::UserMessage, BotMessage, MessageType, RequestBody, UserRequest},
8+
send_conversation_request,
109
},
1110
GenerateInput,
1211
};
1312

1413
#[derive(Debug)]
1514
pub struct Session {
1615
request_body: Option<RequestBody>,
17-
conversation_id: String,
16+
message_counter: usize,
1817
}
1918

2019
impl Session {
@@ -34,42 +33,35 @@ impl Session {
3433
}
3534

3635
fn push_bot_message(&mut self, message: String) {
37-
let bot_message = BotMessage::new(
38-
self.conversation_id.clone(),
39-
MessageType::Markdown,
40-
message,
41-
"<|END_message|>".to_owned(),
42-
self.request_body
43-
.as_ref()
44-
.map(|r| r.user_request.current_root_path.clone())
45-
.unwrap_or_default(),
46-
true,
47-
);
36+
let bot_message = BotMessage::new(message, self.message_counter);
4837
self.request_body
4938
.as_mut()
5039
.map(|r| r.bot_messages.push(bot_message));
40+
self.message_counter += 1;
5141
}
5242

53-
fn push_user_message(&mut self, input: &GenerateInput) {
54-
let user_message =
55-
UserMessage::new_with_input(input, &self.conversation_id, MessageType::Freeform);
43+
fn push_user_message(&mut self, message: String) {
44+
let user_message = UserMessage::new(message, self.message_counter);
5645
self.request_body
5746
.as_mut()
5847
.map(|r| r.user_messages.push(user_message));
48+
self.message_counter += 1;
5949
}
6050
}
6151

6252
impl Session {
6353
pub fn new() -> Self {
6454
Self {
6555
request_body: None,
66-
conversation_id: Uuid::new_v4().to_string(),
56+
message_counter: 0,
6757
}
6858
}
6959

7060
pub async fn send_message(&mut self, input: &GenerateInput) -> Result<(), JsValue> {
7161
let request_body = self.body_with_input(input);
72-
let mut state = make_conversation_request("/conversation", request_body).await?;
62+
#[cfg(debug_assertions)]
63+
console::log_str(&serde_json::to_string(&request_body).unwrap());
64+
let mut state = send_conversation_request("/conversation", request_body).await?;
7365

7466
let mut message: String = "".to_owned();
7567

@@ -87,7 +79,7 @@ impl Session {
8779

8880
result_stream.end();
8981

90-
self.push_user_message(input);
82+
self.push_user_message(input.prompt());
9183
self.push_bot_message(message);
9284

9385
Ok(())

crates/cursor-core/src/conversation/generate/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ use wasm_bindgen::prelude::*;
1111
use crate::GenerateInput;
1212

1313
use super::{
14-
make_conversation_request,
1514
models::{MessageType, RequestBody},
15+
send_conversation_request,
1616
};
1717

1818
async fn generate_code_inner(input: &GenerateInput) -> Result<(), JsValue> {
@@ -29,7 +29,7 @@ async fn generate_code_inner(input: &GenerateInput) -> Result<(), JsValue> {
2929
#[cfg(debug_assertions)]
3030
console::log_str(&serde_json::to_string(&request_body).unwrap());
3131

32-
let mut state = make_conversation_request("/conversation", &request_body).await?;
32+
let mut state = send_conversation_request("/conversation", &request_body).await?;
3333

3434
#[cfg(debug_assertions)]
3535
console::log_str("response received");

crates/cursor-core/src/conversation/mod.rs

Lines changed: 8 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -2,65 +2,28 @@ pub mod chat;
22
pub mod generate;
33
pub mod models;
44

5-
use futures::{stream, Stream, StreamExt};
6-
use node_bridge::{
7-
http_client::{HttpMethod, HttpResponse},
8-
prelude::console,
9-
};
105
use wasm_bindgen::{JsError, JsValue};
116
use wasm_bindgen_futures::spawn_local;
127

138
use crate::{
149
auth::account_token,
1510
context::get_extension_context,
16-
request::{make_request, JsonSendable},
11+
request::{
12+
stream::{make_stream_request, StreamResponseState},
13+
JsonSendable,
14+
},
1715
};
1816

1917
use self::models::RequestBody;
2018

21-
struct ResponseState {
22-
response: HttpResponse,
23-
}
24-
25-
impl ResponseState {
26-
fn new(response: HttpResponse) -> Self {
27-
Self { response }
28-
}
29-
30-
pub fn data_stream(&mut self) -> impl Stream<Item = String> + '_ {
31-
self.response.body().flat_map(|chunk| {
32-
let chunk = chunk.to_string("utf-8");
33-
#[cfg(debug_assertions)]
34-
console::log_str(&chunk);
35-
36-
let lines: Vec<_> = chunk
37-
.split("\n")
38-
.filter_map(|l| {
39-
if l.len() > 0 && l.starts_with("data: \"") {
40-
serde_json::from_str::<String>(&l["data: ".len()..]).ok()
41-
} else {
42-
None
43-
}
44-
})
45-
.filter(|s| s != "[DONE]")
46-
.collect();
47-
stream::iter(lines)
48-
})
49-
}
50-
51-
pub async fn complete(self) -> Result<(), JsValue> {
52-
self.response.await
53-
}
54-
}
55-
5619
const SIGN_IN_ITEM: &str = "Sign In / Sign Up";
5720
const CONFIGURE_API_KEY_ITEM: &str = "Configure API Key";
5821

59-
async fn make_conversation_request(
22+
async fn send_conversation_request(
6023
path: &str,
6124
body: &RequestBody,
62-
) -> Result<ResponseState, JsValue> {
63-
let mut request = make_request(path, HttpMethod::Post);
25+
) -> Result<StreamResponseState, JsValue> {
26+
let mut request = make_stream_request(path, body);
6427
if body.api_key.is_none() {
6528
if let Some(token) = account_token() {
6629
request =
@@ -105,5 +68,5 @@ async fn make_conversation_request(
10568
))
10669
.into());
10770
}
108-
Ok(ResponseState::new(response))
71+
Ok(response.into())
10972
}
Lines changed: 3 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,23 @@
11
use serde::Serialize;
22

3-
use super::{request_body::MessageType, random};
4-
53
#[derive(Debug, Serialize, Clone)]
64
pub struct BotMessage {
75
#[serde(rename = "sender")]
86
pub sender: String,
97

108
#[serde(rename = "sentAt")]
11-
pub sent_at: i64,
12-
13-
#[serde(rename = "conversationId")]
14-
pub conversation_id: String,
15-
16-
#[serde(rename = "type")]
17-
pub message_type: MessageType,
9+
pub index: usize,
1810

1911
#[serde(rename = "message")]
2012
pub message: String,
21-
22-
#[serde(rename = "lastToken")]
23-
pub last_token: String,
24-
25-
#[serde(rename = "finished")]
26-
pub finished: bool,
27-
28-
#[serde(rename = "currentFile")]
29-
pub current_file: String,
30-
31-
#[serde(rename = "interrupted")]
32-
pub interrupted: bool,
33-
34-
#[serde(rename = "maxOrigLine")]
35-
pub max_original_line: i32,
36-
37-
#[serde(rename = "hitTokenLimit")]
38-
pub hit_token_limit: bool,
39-
40-
#[serde(rename = "useDiagnostics")]
41-
pub use_diagnostics: bool,
4213
}
4314

4415
impl BotMessage {
45-
pub fn new(
46-
conversation_id: String,
47-
message_type: MessageType,
48-
message: String,
49-
last_token: String,
50-
current_file: String,
51-
finished: bool,
52-
) -> Self {
16+
pub fn new(message: String, index: usize) -> Self {
5317
Self {
5418
sender: "bot".to_owned(),
55-
sent_at: chrono::Utc::now().timestamp_millis(),
56-
conversation_id,
57-
message_type,
19+
index,
5820
message,
59-
last_token,
60-
finished,
61-
current_file,
62-
interrupted: !finished,
63-
max_original_line: random(),
64-
hit_token_limit: true,
65-
use_diagnostics: false,
6621
}
6722
}
6823
}

crates/cursor-core/src/conversation/models/request_body.rs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use serde::Serialize;
1+
use serde::{Serialize, Serializer};
22

33
use crate::GenerateInput;
44

@@ -10,7 +10,6 @@ pub enum MessageType {
1010
Edit,
1111
Generate,
1212
Freeform,
13-
Markdown,
1413
}
1514

1615
#[derive(Debug, Serialize, Clone)]
@@ -24,9 +23,6 @@ pub struct RequestBody {
2423
#[serde(rename = "userMessages")]
2524
pub user_messages: Vec<UserMessage>,
2625

27-
#[serde(rename = "contextType")]
28-
pub context_type: String,
29-
3026
#[serde(rename = "rootPath")]
3127
pub root_path: String,
3228

@@ -35,6 +31,17 @@ pub struct RequestBody {
3531

3632
#[serde(rename = "customModel", skip_serializing_if = "Option::is_none")]
3733
pub gpt_model: Option<String>,
34+
35+
/// Allow Cursor to use code snippets for product improvements.
36+
#[serde(rename = "noStorageMode", serialize_with = "serialize_invert_bool")]
37+
pub telemetry: bool,
38+
}
39+
40+
fn serialize_invert_bool<S>(value: &bool, serializer: S) -> Result<S::Ok, S::Error>
41+
where
42+
S: Serializer,
43+
{
44+
serializer.serialize_bool(!value)
3845
}
3946

4047
impl RequestBody {
@@ -50,10 +57,10 @@ impl RequestBody {
5057
user_request,
5158
bot_messages,
5259
user_messages,
53-
context_type: "copilot".to_owned(),
5460
root_path: root_path.unwrap_or_default(),
5561
api_key,
5662
gpt_model,
63+
telemetry: true,
5764
}
5865
}
5966

0 commit comments

Comments
 (0)