aboutsummaryrefslogtreecommitdiff
path: root/src/server/headless/render.rs
diff options
context:
space:
mode:
authorCan Celik <ogulcancelik@gmail.com>2026-09-21 20:47:14 +0300
committerGitHub <noreply@github.com>2026-09-21 20:47:14 +0300
commit28360107c1bfab57fb0de99d74bfa48e74423ca8 (patch)
tree30f9d953e48fb81b32f2a663500c6cff6f447f8f /src/server/headless/render.rs
parent309749ad65f3aa596f077ec23a1bf3ee428b7a04 (diff)
fix: distinguish agent completion from startup and session changes (#4457)
refs #3338 refs #3990 refs #3916
Diffstat (limited to 'src/server/headless/render.rs')
-rw-r--r--src/server/headless/render.rs19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/server/headless/render.rs b/src/server/headless/render.rs
index dd2cce38..82564ba3 100644
--- a/src/server/headless/render.rs
+++ b/src/server/headless/render.rs
@@ -483,7 +483,7 @@ impl HeadlessServer {
let Some(client) = self.clients.get_mut(&client_id) else {
continue;
};
- let mut candidate = client_shell_snapshot(
+ let (mut candidate, mut completions) = client_shell_snapshot(
&self.app,
&self.client_shell_boot_id,
client.shell_projection_revision,
@@ -497,11 +497,26 @@ impl HeadlessServer {
};
candidate.revision = client.shell_projection_revision;
if client.shell_snapshot.as_ref() != Some(&candidate)
+ || client.shell_agent_completions.as_ref() != Some(&completions)
|| client.shell_agent_view != agent_view
{
client.shell_projection_revision =
client.shell_projection_revision.saturating_add(1);
candidate.revision = client.shell_projection_revision;
+ completions.revision = candidate.revision;
+ let completion_framed =
+ match crate::protocol::endpoint::agent_completions_message(&completions)
+ .map_err(std::io::Error::other)
+ .and_then(|message| {
+ Self::frame_server_message(&message).map_err(std::io::Error::other)
+ }) {
+ Ok(message) => message,
+ Err(err) => {
+ warn!(client_id, err = %err, "failed to frame agent completions");
+ broken_clients.push(client_id);
+ continue;
+ }
+ };
let projection_message = if agent_view.is_some()
|| client.shell_agent_view.is_some()
{
@@ -554,12 +569,14 @@ impl HeadlessServer {
continue;
};
if projection_framed.is_some_and(|framed| writer.control.send(framed).is_err())
+ || writer.control.send(completion_framed).is_err()
|| writer.control.send(snapshot_framed).is_err()
{
broken_clients.push(client_id);
continue;
}
client.shell_snapshot = Some(candidate);
+ client.shell_agent_completions = Some(completions);
client.shell_agent_view = agent_view;
}
shell_projection_revision = client.shell_projection_revision;