SessionEntry.total_tokens was initialized to 0 in the constructor but
never updated during the session lifecycle. The agent tracks cumulative
tokens on agent.session_total_tokens, but that value was never written
back to the session store.
Changes:
- session.py: update_session() accepts optional total_tokens parameter
- run.py: pipe agent.session_total_tokens through result dict into
update_session() after each agent run (both success and error paths)
- test_status_command.py: updated assertion for new call signature
When an agent was actively processing a message, /status sent via Telegram
(or any gateway) was queued as a pending interrupt instead of being dispatched
immediately. The base platform adapter's handle_message() only had special-case
bypass logic for /approve and /deny, so /status fell through to the default
interrupt path and was never processed as a system command.
Apply the same bypass pattern used by /approve//deny: detect cmd == 'status'
inside the active-session guard, dispatch directly to the message handler, and
send the response without touching session lifecycle or interrupt state.
Adds a regression test that verifies /status is dispatched and responded to
immediately even when _active_sessions contains an entry for the session.