Inspired by Claude Code's /insights, adapted for Hermes Agent's multi-platform architecture. Analyzes session history from state.db to produce comprehensive usage insights. Features: - Overview stats: sessions, messages, tokens, estimated cost, active time - Model breakdown: per-model sessions, tokens, and cost estimation - Platform breakdown: CLI vs Telegram vs Discord etc. (unique to Hermes) - Tool usage ranking: most-used tools with percentages - Activity patterns: day-of-week chart, peak hours, streaks - Notable sessions: longest, most messages, most tokens, most tool calls - Cost estimation: real pricing data for 25+ models (OpenAI, Anthropic, DeepSeek, Google, Meta) with fuzzy model name matching - Configurable time window: --days flag (default 30) - Source filtering: --source flag to filter by platform Three entry points: - /insights slash command in CLI (supports --days and --source flags) - /insights slash command in gateway (compact markdown format) - hermes insights CLI subcommand (standalone) Includes 56 tests covering pricing helpers, format helpers, empty DB, populated DB with multi-platform data, filtering, formatting, and edge cases.
53 lines
2.1 KiB
Python
53 lines
2.1 KiB
Python
"""Slash command definitions and autocomplete for the Hermes CLI.
|
|
|
|
Contains the COMMANDS dict and the SlashCommandCompleter class.
|
|
These are pure data/UI with no HermesCLI state dependency.
|
|
"""
|
|
|
|
from prompt_toolkit.completion import Completer, Completion
|
|
|
|
|
|
COMMANDS = {
|
|
"/help": "Show this help message",
|
|
"/tools": "List available tools",
|
|
"/toolsets": "List available toolsets",
|
|
"/model": "Show or change the current model",
|
|
"/prompt": "View/set custom system prompt",
|
|
"/personality": "Set a predefined personality",
|
|
"/clear": "Clear screen and reset conversation (fresh start)",
|
|
"/history": "Show conversation history",
|
|
"/new": "Start a new conversation (reset history)",
|
|
"/reset": "Reset conversation only (keep screen)",
|
|
"/retry": "Retry the last message (resend to agent)",
|
|
"/undo": "Remove the last user/assistant exchange",
|
|
"/save": "Save the current conversation",
|
|
"/config": "Show current configuration",
|
|
"/cron": "Manage scheduled tasks (list, add, remove)",
|
|
"/skills": "Search, install, inspect, or manage skills from online registries",
|
|
"/platforms": "Show gateway/messaging platform status",
|
|
"/verbose": "Cycle tool progress display: off → new → all → verbose",
|
|
"/compress": "Manually compress conversation context (flush memories + summarize)",
|
|
"/usage": "Show token usage for the current session",
|
|
"/insights": "Show usage insights and analytics (last 30 days)",
|
|
"/quit": "Exit the CLI (also: /exit, /q)",
|
|
}
|
|
|
|
|
|
class SlashCommandCompleter(Completer):
|
|
"""Autocomplete for /commands in the input area."""
|
|
|
|
def get_completions(self, document, complete_event):
|
|
text = document.text_before_cursor
|
|
if not text.startswith("/"):
|
|
return
|
|
word = text[1:]
|
|
for cmd, desc in COMMANDS.items():
|
|
cmd_name = cmd[1:]
|
|
if cmd_name.startswith(word):
|
|
yield Completion(
|
|
cmd_name,
|
|
start_position=-len(word),
|
|
display=cmd,
|
|
display_meta=desc,
|
|
)
|