agent: Fix project context on first thread (#51868)

We seemed to have a regression where the worktrees weren't showing up in
the system prompt on first load.

Release Notes:

- N/A
This commit is contained in:
Ben Brandt 2026-03-18 23:43:44 +01:00 committed by GitHub
parent 7baf5dc04e
commit c932aa9f5b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -493,8 +493,12 @@ impl NativeAgent {
})??
.await;
this.update(cx, |this, cx| {
if let Some(state) = this.projects.get_mut(&project_id) {
state.project_context = cx.new(|_| project_context);
if let Some(state) = this.projects.get(&project_id) {
state
.project_context
.update(cx, |current_project_context, _cx| {
*current_project_context = project_context;
});
}
})?;
}
@ -2131,10 +2135,15 @@ mod internal_tests {
.unwrap();
cx.run_until_parked();
let thread = agent.read_with(cx, |agent, _cx| {
agent.sessions.values().next().unwrap().thread.clone()
});
agent.read_with(cx, |agent, cx| {
let project_id = project.entity_id();
let state = agent.projects.get(&project_id).unwrap();
assert_eq!(state.project_context.read(cx).worktrees, vec![])
assert_eq!(state.project_context.read(cx).worktrees, vec![]);
assert_eq!(thread.read(cx).project_context().read(cx).worktrees, vec![]);
});
let worktree = project
@ -2145,14 +2154,16 @@ mod internal_tests {
agent.read_with(cx, |agent, cx| {
let project_id = project.entity_id();
let state = agent.projects.get(&project_id).unwrap();
let expected_worktrees = vec![WorktreeContext {
root_name: "a".into(),
abs_path: Path::new("/a").into(),
rules_file: None,
}];
assert_eq!(state.project_context.read(cx).worktrees, expected_worktrees);
assert_eq!(
state.project_context.read(cx).worktrees,
vec![WorktreeContext {
root_name: "a".into(),
abs_path: Path::new("/a").into(),
rules_file: None
}]
)
thread.read(cx).project_context().read(cx).worktrees,
expected_worktrees
);
});
// Creating `/a/.rules` updates the project context.
@ -2165,18 +2176,20 @@ mod internal_tests {
.read(cx)
.entry_for_path(rel_path(".rules"))
.unwrap();
let expected_worktrees = vec![WorktreeContext {
root_name: "a".into(),
abs_path: Path::new("/a").into(),
rules_file: Some(RulesFileContext {
path_in_worktree: rel_path(".rules").into(),
text: "".into(),
project_entry_id: rules_entry.id.to_usize(),
}),
}];
assert_eq!(state.project_context.read(cx).worktrees, expected_worktrees);
assert_eq!(
state.project_context.read(cx).worktrees,
vec![WorktreeContext {
root_name: "a".into(),
abs_path: Path::new("/a").into(),
rules_file: Some(RulesFileContext {
path_in_worktree: rel_path(".rules").into(),
text: "".into(),
project_entry_id: rules_entry.id.to_usize()
})
}]
)
thread.read(cx).project_context().read(cx).worktrees,
expected_worktrees
);
});
}