Watch
1
0
Fork
You've already forked souveraine
0

agent sessions: show conversations, not storage ghosts

This commit is contained in:
Fimeg 2026-08-11 18:47:54 -04:00
commit dd19ab227f
2 changed files with 31 additions and 10 deletions

View file

@ -152,12 +152,20 @@ souveraine_json() {
local out="[]"
while IFS= read -r f; do
[ -n "$f" ] || continue
local s
s=$(jq -c '
if .archived == true then empty else {
local s agent_id parent_id agent_name
agent_id=$(jq -r '.agent_id // empty' "$f" 2>/dev/null)
parent_id=${agent_id%-sub}
agent_name=$(jq -r '.name // empty' "$dir/$parent_id/agent.json" 2>/dev/null)
[ -n "$agent_name" ] || agent_name="Souveraine"
s=$(jq -c --arg agentName "$agent_name" '
# A zero-message record is a newly-minted conversation slot, not
# an agent session. Rendering it made every panel restart add a
# plausible-looking ghost row.
if .archived == true or (.message_count // 0) == 0 then empty else {
provider: "souveraine",
id: (.id // ""),
agentId: (.agent_id // ""),
agentName: $agentName,
cwd: "",
model: "",
lastActivity: (.last_message_at // .updated_at // ""),
@ -187,6 +195,7 @@ SOUV=$(souveraine_json); [ -n "$SOUV" ] || SOUV='{"available":false,"er
# timestamps would be a guess wearing the costume of a measurement.
jq -c -n \
--argjson now "$NOW" \
--argjson window "$((WINDOW_MIN * 60))" \
--argjson claude "$CLAUDE" \
--argjson codex "$CODEX" \
--argjson souv "$SOUV" '
@ -207,6 +216,10 @@ jq -c -n \
else "idle" end;
( ($claude.sessions // []) + ($codex.sessions // []) + ($souv.sessions // []) )
| map(. + {state: state($now), age: ($now - (.lastActivity | epoch))})
# `find -mmin` is only the cheap filesystem prefilter. Restores and copies
# can touch a May record today; enforce the promised window against the
# the record timestamp before anything calls it a current session.
| map(select(.age >= 0 and .age <= $window))
| sort_by(.age)
as $all
| {
@ -214,9 +227,9 @@ jq -c -n \
sessions: $all,
active: ($all | map(select(.state == "active")) | length),
providers: {
claude: ($claude | del(.sessions)) + {sessions: ($claude.sessions // [] | length)},
codex: ($codex | del(.sessions)) + {sessions: ($codex.sessions // [] | length)},
souveraine: ($souv | del(.sessions)) + {sessions: ($souv.sessions // [] | length)}
claude: ($claude | del(.sessions)) + {sessions: ($all | map(select(.provider == "claude")) | length)},
codex: ($codex | del(.sessions)) + {sessions: ($all | map(select(.provider == "codex")) | length)},
souveraine: ($souv | del(.sessions)) + {sessions: ($all | map(select(.provider == "souveraine")) | length)}
}
}' 2>/dev/null \
|| printf '{"ts":%s,"sessions":[],"active":0,"providers":{"claude":{"available":false,"error":"merge failed"},"codex":{"available":false,"error":"merge failed"},"souveraine":{"available":false,"error":"merge failed"}}}\n' "$NOW"