Skip to content

Commit 37d7809

Browse files
committed
fix(assistant): parse folder_ids from data-folders in HTML fallback
Address review feedback from Codex (P2: preserve folder state) and Greptile (P2: use expect for compile-time constant selectors).
1 parent 9663070 commit 37d7809

1 file changed

Lines changed: 10 additions & 9 deletions

File tree

src/api.rs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3869,8 +3869,8 @@ fn parse_assistant_thread_open_stream(
38693869

38703870
fn parse_assistant_thread_open_html(html: &str) -> Result<AssistantThread, KagiError> {
38713871
let document = Html::parse_fragment(html);
3872-
let thread_selector = selector(".thread")?;
3873-
let title_selector = selector(".title")?;
3872+
let thread_selector = Selector::parse(".thread").expect("valid CSS selector");
3873+
let title_selector = Selector::parse(".title").expect("valid CSS selector");
38743874

38753875
let element = document
38763876
.select(&thread_selector)
@@ -3890,6 +3890,11 @@ fn parse_assistant_thread_open_html(html: &str) -> Result<AssistantThread, KagiE
38903890
.filter(|value| !value.is_empty())
38913891
.ok_or_else(|| KagiError::Parse("assistant thread html missing title".to_string()))?;
38923892

3893+
let folder_ids = serde_json::from_str::<Vec<String>>(
3894+
element.value().attr("data-folders").unwrap_or("[]"),
3895+
)
3896+
.unwrap_or_default();
3897+
38933898
Ok(AssistantThread {
38943899
id,
38953900
title,
@@ -3905,7 +3910,7 @@ fn parse_assistant_thread_open_html(html: &str) -> Result<AssistantThread, KagiE
39053910
.attr("data-public")
39063911
.is_some_and(|value| value == "true"),
39073912
branch_id: String::new(),
3908-
folder_ids: Vec::new(),
3913+
folder_ids,
39093914
})
39103915
}
39113916

@@ -3917,11 +3922,6 @@ fn format_received_frame_tags(tags: &[String]) -> String {
39173922
}
39183923
}
39193924

3920-
fn selector(value: &str) -> Result<Selector, KagiError> {
3921-
Selector::parse(value)
3922-
.map_err(|error| KagiError::Parse(format!("failed to parse selector `{value}`: {error:?}")))
3923-
}
3924-
39253925
fn parse_assistant_thread_list_stream(
39263926
body: &str,
39273927
) -> Result<AssistantThreadListResponse, KagiError> {
@@ -5862,6 +5862,7 @@ mod tests {
58625862
" data-saved=\"false\"\n",
58635863
" data-public=\"false\"\n",
58645864
" data-tags=\"[]\"\n",
5865+
" data-folders='[\"folder-1\", \"folder-2\"]'\n",
58655866
" data-snippet=\"none\"\n",
58665867
" >\n",
58675868
" <i title=\"Temporary\">temp</i>\n",
@@ -5883,7 +5884,7 @@ mod tests {
58835884
assert!(parsed.thread.created_at.is_empty());
58845885
assert!(parsed.thread.expires_at.is_empty());
58855886
assert!(parsed.thread.branch_id.is_empty());
5886-
assert!(parsed.thread.folder_ids.is_empty());
5887+
assert_eq!(parsed.thread.folder_ids, vec!["folder-1", "folder-2"]);
58875888
assert_eq!(parsed.messages.len(), 1);
58885889
}
58895890

0 commit comments

Comments
 (0)