diff --git a/src/cleveragents/cli/commands/session.py b/src/cleveragents/cli/commands/session.py index e8fb89cf9..e8b32d9a8 100644 --- a/src/cleveragents/cli/commands/session.py +++ b/src/cleveragents/cli/commands/session.py @@ -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() diff --git a/src/cleveragents/domain/models/core/session.py b/src/cleveragents/domain/models/core/session.py index 7242f3305..05c6b97ce 100644 --- a/src/cleveragents/domain/models/core/session.py +++ b/src/cleveragents/domain/models/core/session.py @@ -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)", diff --git a/src/cleveragents/infrastructure/database/models.py b/src/cleveragents/infrastructure/database/models.py index 0f1919c5c..34b6fe4d9 100644 --- a/src/cleveragents/infrastructure/database/models.py +++ b/src/cleveragents/infrastructure/database/models.py @@ -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),