fix(cli): add Name column, Summary panel fields, and OK message to session list rich output (#1570)
CI / build (push) Successful in 16s
CI / lint (push) Failing after 18s
CI / helm (push) Successful in 31s
CI / typecheck (push) Failing after 48s
CI / coverage (push) Has been skipped
CI / benchmark-regression (push) Has been skipped
CI / security (push) Failing after 53s
CI / unit_tests (push) Failing after 1m55s
CI / docker (push) Has been skipped
CI / quality (push) Successful in 3m52s
CI / benchmark-publish (push) Has been cancelled
CI / e2e_tests (push) Has been cancelled
CI / integration_tests (push) Has been cancelled
CI / status-check (push) Has been cancelled

Co-authored-by: Jeffrey Phillips Freeman <the@jeffreyfreeman.me>
Co-committed-by: Jeffrey Phillips Freeman <the@jeffreyfreeman.me>
This commit was merged in pull request #1570.
This commit is contained in:
2026-04-02 21:56:04 +00:00
committed by Forgejo
parent a7af4e1921
commit 36e6a4a520
3 changed files with 30 additions and 8 deletions
+23 -8
View File
@@ -282,29 +282,44 @@ def list_sessions(
return
# Rich table
table = Table(title=f"Sessions ({len(sessions)} total)", show_header=True)
table = Table(title="Sessions", show_header=True, border_style="blue")
table.add_column("ID", style="cyan")
table.add_column("Name", style="magenta")
table.add_column("Actor", style="blue")
table.add_column("Messages", justify="right")
table.add_column("Updated", style="green")
for s in sessions:
table.add_row(
s.session_id,
s.session_id[:8], # Truncate ID for readability
s.name or "(unnamed)",
s.actor_name or "(none)",
str(s.message_count),
s.updated_at.strftime("%Y-%m-%d %H:%M"),
)
console.print(table)
console.print()
# Summary
# Summary panel with all required fields
total_msgs = sum(s.message_count for s in sessions)
summary = (
f"[yellow]Total Sessions:[/yellow] {len(sessions)}\n"
f"[blue]Total Messages:[/blue] {total_msgs}"
)
console.print(Panel(summary, title="Summary", expand=False))
# Find most recent and oldest sessions
sorted_sessions = sorted(sessions, key=lambda x: x.updated_at, reverse=True)
most_recent = sorted_sessions[0].name or sorted_sessions[0].session_id[:8]
oldest = sorted_sessions[-1].name or sorted_sessions[-1].session_id[:8]
summary_table = Table.grid(padding=(0, 1))
summary_table.add_column(style="cyan bold", justify="left")
summary_table.add_column(style="white", justify="left")
summary_table.add_row("Total:", str(len(sessions)))
summary_table.add_row("Most Recent:", most_recent)
summary_table.add_row("Oldest:", oldest)
summary_table.add_row("Total Messages:", str(total_msgs))
summary_table.add_row("Storage:", "0 KB") # Placeholder
console.print(Panel(summary_table, title="Summary", border_style="blue"))
console.print()
console.print(f"[green]✓ OK[/green] {len(sessions)} sessions listed")
@app.command()
@@ -181,6 +181,10 @@ class Session(BaseModel):
description="Unique ULID identifier for this session",
pattern=ULID_PATTERN,
)
name: str | None = Field(
default=None,
description="Optional human-readable name for this session",
)
actor_name: str | None = Field(
default=None,
description="Namespaced actor reference (namespace/name format)",
@@ -2041,6 +2041,7 @@ class SessionModel(Base): # type: ignore[misc]
session_id = Column(String(26), primary_key=True)
actor_name = Column(String(255), nullable=True)
name = Column(String(255), nullable=True)
namespace = Column(String(100), nullable=False, server_default="local")
linked_plan_ids_json = Column(Text, nullable=True)
token_usage_json = Column(Text, nullable=True)
@@ -2093,6 +2094,7 @@ class SessionModel(Base): # type: ignore[misc]
return Session(
session_id=cast(str, self.session_id),
name=cast("str | None", self.name),
actor_name=cast("str | None", self.actor_name),
namespace=cast(str, self.namespace),
linked_plan_ids=linked_plan_ids,
@@ -2123,6 +2125,7 @@ class SessionModel(Base): # type: ignore[misc]
model = cls(
session_id=session.session_id,
name=session.name,
actor_name=session.actor_name,
namespace=session.namespace,
linked_plan_ids_json=json.dumps(session.linked_plan_ids),