feat(maestro): carry a blocked-work indicator on Session (#83)
Session.blocked_work is Option<InTheWay>, refreshed by the daemon's watcher; None for worktree-less sessions and until first probed. Defaults on the wire so older payloads stay forward-compatible.
This commit is contained in:
@@ -87,6 +87,13 @@ pub struct Session {
|
||||
/// from daemons that predate the field.
|
||||
#[serde(default)]
|
||||
pub current_cwd: Option<PathBuf>,
|
||||
/// Whether the session's worktree currently holds anything that would
|
||||
/// block an unforced kill (#83), summarised by [`InTheWay`]'s `Display`.
|
||||
/// Refreshed by the daemon's watcher; `None` for sessions without a
|
||||
/// worktree and until the first probe. Defaults on the wire so payloads
|
||||
/// from daemons that predate the field stay forward-compatible.
|
||||
#[serde(default)]
|
||||
pub blocked_work: Option<InTheWay>,
|
||||
}
|
||||
|
||||
/// Default for [`Session::last_activity_at`] when an older payload omits it.
|
||||
@@ -531,6 +538,7 @@ mod tests {
|
||||
.unwrap()
|
||||
.with_timezone(&Utc),
|
||||
current_cwd: Some(PathBuf::from("/home/naps62/projects/maestro/crates")),
|
||||
blocked_work: None,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -550,6 +558,34 @@ mod tests {
|
||||
assert_eq!(s.activity, ActivityState::Idle);
|
||||
assert_eq!(s.last_activity_at, epoch());
|
||||
assert!(s.current_cwd.is_none());
|
||||
assert!(s.blocked_work.is_none());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn blocked_work_defaults_to_none_on_legacy_payload() {
|
||||
// A pre-#83 daemon omits the indicator; it must deserialize to `None`
|
||||
// rather than failing, and a present value round-trips.
|
||||
let json = serde_json::json!({
|
||||
"id": Uuid::from_u128(1),
|
||||
"cwd": "/tmp",
|
||||
"command": "bash",
|
||||
"status": "Running",
|
||||
"created_at": "2026-05-24T12:00:00Z"
|
||||
});
|
||||
let s: Session = serde_json::from_value(json).unwrap();
|
||||
assert_eq!(s.blocked_work, None);
|
||||
|
||||
let mut with_blocker = sample_session();
|
||||
with_blocker.blocked_work = Some(InTheWay {
|
||||
uncommitted_files: 3,
|
||||
..InTheWay::default()
|
||||
});
|
||||
assert_eq!(
|
||||
with_blocker.clone().blocked_work,
|
||||
serde_json::from_value::<Session>(serde_json::to_value(&with_blocker).unwrap())
|
||||
.unwrap()
|
||||
.blocked_work
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
Reference in New Issue
Block a user