update: session-grouping review follow-up

- PickerOutcome::Picked から未使用の session_id を除去(pod-cli が lookup_session_of で再解決)
- picker preview が singular AssistantItem も拾うように
- fs_store layout doc に migration(後方互換なし、旧 flat sessions は破棄)を明記
- TaskStore は Session-lifetime、ScopedFs/Tracker は Pod-process lifetime と用語整理
- Pod::session_id / from_manifest_spawned のコメント補強
This commit is contained in:
2026-05-20 06:29:37 +09:00
parent 5edc4d3b03
commit 0dfdd11921
9 changed files with 155 additions and 26 deletions
+1 -1
View File
@@ -210,7 +210,7 @@ async fn run_resume() -> Result<(), Box<dyn std::error::Error>> {
// viewport before the name dialog opens so each phase gets fresh
// vertical room.
let leaf_segment_id = match picker::run().await? {
PickerOutcome::Picked { segment_id, .. } => segment_id,
PickerOutcome::Picked { segment_id } => segment_id,
PickerOutcome::Cancelled => return Ok(()),
};
run_spawn(Some(leaf_segment_id)).await
+10 -8
View File
@@ -62,11 +62,10 @@ impl From<session_store::StoreError> for PickerError {
}
pub enum PickerOutcome {
/// User picked a session; resume at its leaf segment.
Picked {
session_id: SessionId,
segment_id: SegmentId,
},
/// User picked a session; resume at its leaf segment. The pod-cli
/// rehydrates `session_id` via `Store::lookup_session_of` so we only
/// need to surface the segment here.
Picked { segment_id: SegmentId },
Cancelled,
}
@@ -134,10 +133,8 @@ pub async fn run() -> Result<PickerOutcome, PickerError> {
}
Some(Action::Submit) => {
close_viewport(&mut terminal)?;
let row = &rows[selected];
return Ok(PickerOutcome::Picked {
session_id: row.session_id,
segment_id: row.leaf_segment_id,
segment_id: rows[selected].leaf_segment_id,
});
}
Some(Action::Cancel) => {
@@ -200,6 +197,11 @@ fn last_message_preview(entries: &[LogEntry]) -> Option<String> {
return Some(format!("user: {}", trim_one_line(&text, 60)));
}
}
LogEntry::AssistantItem { item, .. } => {
if let Some(text) = first_text_logged(item) {
return Some(format!("assistant: {}", trim_one_line(&text, 60)));
}
}
LogEntry::AssistantItems { items, .. } => {
if let Some(text) = items.iter().find_map(first_text_logged) {
return Some(format!("assistant: {}", trim_one_line(&text, 60)));