huskies: merge 736_story_drain_and_prepend_buffered_status_events_on_the_user_s_next_agent_message
This commit is contained in:
@@ -100,6 +100,11 @@ impl AgentPool {
|
||||
// (bug 118).
|
||||
let resolved_name: String;
|
||||
let key: String;
|
||||
// Buffered status events accumulated while the agent was idle. Drained
|
||||
// inside the lock (before the new entry replaces the old one) and
|
||||
// formatted as a `<recent-events>` block for prepending to the first
|
||||
// agent turn (story 736).
|
||||
let prior_events: Option<String>;
|
||||
{
|
||||
let mut agents = self.agents.lock().map_err(|e| e.to_string())?;
|
||||
|
||||
@@ -249,6 +254,17 @@ impl AgentPool {
|
||||
story '{story_id}' will be picked up when the agent becomes available"
|
||||
));
|
||||
}
|
||||
// Drain accumulated status events from the previous session before
|
||||
// replacing the entry with the new one. The drained items are
|
||||
// formatted and prepended to the first agent turn (story 736).
|
||||
prior_events = {
|
||||
let items = agents
|
||||
.get(&key)
|
||||
.and_then(|a| a.status_buffer.as_ref().map(|b| b.drain()))
|
||||
.unwrap_or_default();
|
||||
crate::service::status::buffer::format_buffered_items(&items)
|
||||
};
|
||||
|
||||
agents.insert(
|
||||
key.clone(),
|
||||
StoryAgent {
|
||||
@@ -336,6 +352,7 @@ impl AgentPool {
|
||||
self.watcher_tx.clone(),
|
||||
Arc::clone(&self.merge_jobs),
|
||||
inactivity_timeout_secs,
|
||||
prior_events,
|
||||
));
|
||||
|
||||
// Store the task handle while the agent is still Pending.
|
||||
|
||||
@@ -48,6 +48,11 @@ pub(super) async fn run_agent_spawn(
|
||||
watcher_tx: broadcast::Sender<WatcherEvent>,
|
||||
merge_jobs: Arc<Mutex<HashMap<String, MergeJob>>>,
|
||||
inactivity_timeout_secs: u64,
|
||||
// Formatted `<recent-events>` block drained from the previous session's
|
||||
// buffer. Prepended to the first agent turn so the agent sees what
|
||||
// happened while it was idle (story 736). `None` when there were no
|
||||
// buffered events.
|
||||
buffered_events_block: Option<String>,
|
||||
) {
|
||||
// Re-bind to the legacy `_clone` / `_owned` names so the body below remains
|
||||
// a verbatim copy of the original closure (story 157).
|
||||
@@ -169,6 +174,13 @@ pub(super) async fn run_agent_spawn(
|
||||
}
|
||||
};
|
||||
|
||||
// Prepend buffered pipeline events from the previous idle period so the
|
||||
// agent sees what happened while it was not running (story 736).
|
||||
let effective_prompt = match buffered_events_block {
|
||||
Some(block) if !block.is_empty() => format!("{block}\n\n{effective_prompt}"),
|
||||
_ => effective_prompt,
|
||||
};
|
||||
|
||||
// Step 3: transition to Running now that the worktree is ready.
|
||||
{
|
||||
if let Ok(mut agents) = agents_ref.lock()
|
||||
|
||||
Reference in New Issue
Block a user