diff --git a/features/session_cli.feature b/features/session_cli.feature index 35b26e637..b363e03ea 100644 --- a/features/session_cli.feature +++ b/features/session_cli.feature @@ -39,10 +39,10 @@ Feature: Session CLI commands Then the session CLI output should be valid JSON And the session CLI JSON should contain "sessions" - Scenario: List sessions JSON includes token usage counts + Scenario: List sessions JSON matches the documented contract Given there are mocked existing sessions When I run session CLI list with --format json - Then the session CLI JSON list token usage should include counts + Then the session CLI JSON list entries should match the documented contract # Show command tests Scenario: Show session with valid ID diff --git a/features/steps/session_cli_steps.py b/features/steps/session_cli_steps.py index a74c8a4f6..779643ffb 100644 --- a/features/steps/session_cli_steps.py +++ b/features/steps/session_cli_steps.py @@ -525,18 +525,26 @@ def step_json_show_token_usage_counts(context: Context) -> None: _assert_token_usage_counts_are_ints(token_usage) -@then("the session CLI JSON list token usage should include counts") -def step_json_list_token_usage_counts(context: Context) -> None: +@then("the session CLI JSON list entries should match the documented contract") +def step_json_list_contract(context: Context) -> None: parsed = json.loads(context.result.output) data = _unwrap_envelope(parsed) sessions = data.get("sessions") assert isinstance(sessions, list), f"sessions missing or not a list: {sessions}" for index, session in enumerate(sessions): - token_usage = session.get("token_usage") - assert isinstance(token_usage, dict), ( - f"token_usage missing for session {index}: {token_usage}" + assert isinstance(session, dict), ( + f"session entry at index {index} is not an object: {session!r}" + ) + expected_keys = {"id", "name", "actor", "messages", "updated"} + actual_keys = set(session.keys()) + missing = expected_keys - actual_keys + extra = actual_keys - expected_keys + assert not missing, ( + f"session entry {index} missing keys {sorted(missing)}: {session!r}" + ) + assert not extra, ( + f"session entry {index} has undocumented keys {sorted(extra)}: {session!r}" ) - _assert_token_usage_counts_are_ints(token_usage) def _assert_token_usage_counts_are_ints(token_usage: dict[str, Any]) -> None: diff --git a/src/cleveragents/cli/commands/session.py b/src/cleveragents/cli/commands/session.py index a6690eb80..25229f840 100644 --- a/src/cleveragents/cli/commands/session.py +++ b/src/cleveragents/cli/commands/session.py @@ -133,11 +133,6 @@ def _session_list_dict(sessions: list[Session]) -> dict[str, Any]: "actor": s.actor_name or "(none)", "messages": s.message_count, "updated": s.updated_at.isoformat(), - "token_usage": { - "input_tokens": s.token_usage.input_tokens, - "output_tokens": s.token_usage.output_tokens, - "estimated_cost": f"${s.token_usage.estimated_cost:.4f}", - }, } )