loopd: a failed heartbeat still advances last_heartbeat
Co-Authored-By: ornith-1.5-35b-a3b <agent@wntrmute.dev>
This commit is contained in:
@@ -252,7 +252,7 @@ impl Scheduler {
|
||||
let text = format!("It is {}.\n\n{file}", now.to_rfc3339());
|
||||
let mut emit = |_event: &TurnEvent| {};
|
||||
let outcome = run_turn(&mut session, &runtime, &text, None, &mut emit);
|
||||
let outcome = compact::finish_turn(
|
||||
let _ = compact::finish_turn(
|
||||
&mut session,
|
||||
&runtime,
|
||||
&*ctx.memory,
|
||||
@@ -261,11 +261,9 @@ impl Scheduler {
|
||||
&mut emit,
|
||||
outcome,
|
||||
);
|
||||
if outcome.is_ok() {
|
||||
self.last_heartbeat = Some(now);
|
||||
work.push(TickWork::Heartbeat);
|
||||
}
|
||||
drop(held);
|
||||
self.last_heartbeat = Some(now);
|
||||
work.push(TickWork::Heartbeat);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
//! A failed heartbeat turn still advances `last_heartbeat`. Do not edit.
|
||||
|
||||
mod support;
|
||||
|
||||
use bxcore::Timestamp;
|
||||
use loopd::channel::Context;
|
||||
use loopd::llama::Client;
|
||||
use loopd::memory::NoMemory;
|
||||
use loopd::scheduler::{Scheduler, TickWork};
|
||||
use loopd::tools::Registry;
|
||||
use std::sync::Arc;
|
||||
use support::{FakeServer, Home, Reply, ScriptedPort};
|
||||
|
||||
const CHAT: &str = "/v1/chat/completions";
|
||||
const PROMPT: &str = "Look around.\n";
|
||||
|
||||
fn ts(s: &str) -> Timestamp {
|
||||
Timestamp::parse(s).unwrap()
|
||||
}
|
||||
|
||||
fn world() -> (Home, FakeServer, Arc<Context>) {
|
||||
let home = Home::new();
|
||||
home.write("heartbeat.md", PROMPT);
|
||||
home.write("compact.md", "Summarise.\n");
|
||||
let server = FakeServer::start();
|
||||
let mut cfg = home.config(&server.socket);
|
||||
cfg.heartbeat.every_s = 60;
|
||||
cfg.heartbeat.prompt = home.dir.join("heartbeat.md");
|
||||
server.route(CHAT, vec![Reply::fixture("bad_request")]);
|
||||
let ctx = Arc::new(Context::new(
|
||||
cfg.clone(),
|
||||
Client::new(cfg),
|
||||
Box::new(ScriptedPort::new(vec![])),
|
||||
Registry::m2b(),
|
||||
Box::new(NoMemory),
|
||||
));
|
||||
(home, server, ctx)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn a_failed_heartbeat_turn_still_advances_last_heartbeat() {
|
||||
let (_home, server, ctx) = world();
|
||||
let mut sched = Scheduler::new(ts("2026-10-03T07:00:00.000Z"));
|
||||
let work = sched.tick(&ctx, ts("2026-10-03T07:01:00.000Z"));
|
||||
assert_eq!(work, vec![TickWork::Heartbeat]);
|
||||
assert_eq!(server.requests_to(CHAT).len(), 1);
|
||||
let work = sched.tick(&ctx, ts("2026-10-03T07:01:30.000Z"));
|
||||
assert!(work.is_empty(), "{work:?}");
|
||||
assert_eq!(server.requests_to(CHAT).len(), 1);
|
||||
}
|
||||
Reference in New Issue
Block a user