2026-04-21 08:30:02 +00:00
|
|
|
package commands
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"fmt"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func contextCommand() Definition {
|
|
|
|
|
return Definition{
|
|
|
|
|
Name: "context",
|
|
|
|
|
Description: "Show current session context and token usage",
|
|
|
|
|
Usage: "/context",
|
|
|
|
|
Handler: func(_ context.Context, req Request, rt *Runtime) error {
|
|
|
|
|
if rt == nil || rt.GetContextStats == nil {
|
|
|
|
|
return req.Reply(unavailableMsg)
|
|
|
|
|
}
|
|
|
|
|
stats := rt.GetContextStats()
|
|
|
|
|
if stats == nil {
|
|
|
|
|
return req.Reply("No active session context.")
|
|
|
|
|
}
|
|
|
|
|
return req.Reply(formatContextStats(stats))
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func formatContextStats(s *ContextStats) string {
|
|
|
|
|
remaining := s.CompressAtTokens - s.UsedTokens
|
|
|
|
|
if remaining < 0 {
|
|
|
|
|
remaining = 0
|
|
|
|
|
}
|
|
|
|
|
usedWindowPercent := s.UsedTokens * 100 / max(s.TotalTokens, 1)
|
2026-06-02 07:43:24 +00:00
|
|
|
msg := fmt.Sprintf(
|
2026-06-05 16:28:32 +00:00
|
|
|
"Context usage \nMessages: %d \nUsed: ~%d / %d tokens (%d%%) \nHistory: ~%d tokens \nCompress at: %d tokens \nSummarize at: %d tokens \nCompression progress: %d%% \nRemaining: ~%d tokens",
|
2026-04-21 08:30:02 +00:00
|
|
|
s.MessageCount,
|
|
|
|
|
s.UsedTokens,
|
|
|
|
|
s.TotalTokens,
|
|
|
|
|
usedWindowPercent,
|
2026-06-05 16:28:32 +00:00
|
|
|
s.HistoryTokens,
|
2026-04-21 08:30:02 +00:00
|
|
|
s.CompressAtTokens,
|
2026-06-02 07:43:24 +00:00
|
|
|
s.SummarizeAtTokens,
|
2026-04-21 08:30:02 +00:00
|
|
|
s.UsedPercent,
|
|
|
|
|
remaining,
|
|
|
|
|
)
|
2026-06-02 07:43:24 +00:00
|
|
|
return msg
|
2026-04-21 08:30:02 +00:00
|
|
|
}
|