@@ -25,6 +25,7 @@ import (
2525 pluginpkg "ccgo/internal/plugins"
2626 "ccgo/internal/session"
2727 "ccgo/internal/skills"
28+ telemetrypkg "ccgo/internal/telemetry"
2829 "ccgo/internal/tool"
2930)
3031
@@ -578,10 +579,10 @@ func (r Runner) formatStatusSummary(raw string) string {
578579 switch args [0 ] {
579580 case "show" , "info" :
580581 if len (args ) < 2 || strings .TrimSpace (args [1 ]) == "" {
581- return "Usage: /status " + args [0 ] + " <session|model|auth|tools|mcp|plugins>"
582+ return "Usage: /status " + args [0 ] + " <session|model|auth|tools|mcp|plugins|telemetry >"
582583 }
583584 return r .formatStatusShow (args [1 ])
584- case "session" , "model" , "auth" , "tools" , "mcp" , "plugins" :
585+ case "session" , "model" , "auth" , "tools" , "mcp" , "plugins" , "telemetry" :
585586 return r .formatStatusShow (args [0 ])
586587 default :
587588 return "Status section is not implemented in the Go runtime yet: " + strings .Join (args , " " )
@@ -720,8 +721,10 @@ func (r Runner) formatStatusShow(raw string) string {
720721 }
721722 }
722723 return strings .Join (lines , "\n " )
724+ case "telemetry" :
725+ return r .formatStatusTelemetry ()
723726 default :
724- return "Unknown status section " + strings .TrimSpace (raw ) + ". Available sections: session, model, auth, tools, mcp, plugins"
727+ return "Unknown status section " + strings .TrimSpace (raw ) + ". Available sections: session, model, auth, tools, mcp, plugins, telemetry "
725728 }
726729}
727730
@@ -742,11 +745,51 @@ func normalizeStatusSection(raw string) string {
742745 return "mcp"
743746 case "plugin" , "plugins" :
744747 return "plugins"
748+ case "telemetry" , "telemetry-events" , "diagnostics" , "trace" , "tracing" :
749+ return "telemetry"
745750 default :
746751 return compact
747752 }
748753}
749754
755+ func (r Runner ) formatStatusTelemetry () string {
756+ path := telemetrypkg .SessionPath (r .SessionPath , r .SessionID )
757+ lines := []string {
758+ "Status telemetry" ,
759+ "Enabled: " + boolEnabledText (r .telemetryEnabled ()),
760+ }
761+ if path == "" {
762+ return strings .Join (append (lines , "Telemetry path: (not configured)" , "Events: 0" ), "\n " )
763+ }
764+ events , err := telemetrypkg .Load (path )
765+ if err != nil {
766+ return strings .Join (append (lines , "Telemetry path: " + path , "Telemetry error: " + err .Error ()), "\n " )
767+ }
768+ summary := telemetrypkg .Summarize (events )
769+ lines = append (lines ,
770+ "Telemetry path: " + path ,
771+ fmt .Sprintf ("Events: %d" , summary .Total ),
772+ fmt .Sprintf ("Tool events: %d" , summary .ToolEvents ),
773+ fmt .Sprintf ("Tool errors: %d" , summary .ToolErrors ),
774+ fmt .Sprintf ("Error events: %d" , summary .ErrorEvents ),
775+ fmt .Sprintf ("Compactions: %d" , summary .Compactions ),
776+ fmt .Sprintf ("Token warnings: %d" , summary .TokenWarnings ),
777+ )
778+ if len (summary .ByType ) > 0 {
779+ lines = append (lines , "Event types:" )
780+ for _ , key := range sortedIntMapKeys (summary .ByType ) {
781+ lines = append (lines , fmt .Sprintf ("- %s: %d" , key , summary .ByType [key ]))
782+ }
783+ }
784+ if len (summary .ByModel ) > 0 {
785+ lines = append (lines , "Models:" )
786+ for _ , key := range sortedIntMapKeys (summary .ByModel ) {
787+ lines = append (lines , fmt .Sprintf ("- %s: %d" , key , summary .ByModel [key ]))
788+ }
789+ }
790+ return strings .Join (lines , "\n " )
791+ }
792+
750793func (r * Runner ) formatConfigSummary (raw string ) string {
751794 args := strings .Fields (strings .TrimSpace (raw ))
752795 if len (args ) > 0 {
@@ -2536,6 +2579,18 @@ func sortedAnyMapKeys(values map[string]any) []string {
25362579 return keys
25372580}
25382581
2582+ func sortedIntMapKeys (values map [string ]int ) []string {
2583+ keys := make ([]string , 0 , len (values ))
2584+ for key := range values {
2585+ key = strings .TrimSpace (key )
2586+ if key != "" {
2587+ keys = append (keys , key )
2588+ }
2589+ }
2590+ sort .Strings (keys )
2591+ return keys
2592+ }
2593+
25392594func sortedNestedAnyMapKeys (values map [string ]map [string ]any ) []string {
25402595 keys := make ([]string , 0 , len (values ))
25412596 for key := range values {
0 commit comments