127 lines
3.8 KiB
Go
127 lines
3.8 KiB
Go
package ide
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/modelcontextprotocol/go-sdk/mcp"
|
|
)
|
|
|
|
// Dashboard tool input/output types.
|
|
|
|
// DashboardOverviewInput is the input for ide_dashboard_overview.
|
|
type DashboardOverviewInput struct{}
|
|
|
|
// DashboardOverview contains high-level platform stats.
|
|
type DashboardOverview struct {
|
|
Repos int `json:"repos"`
|
|
Services int `json:"services"`
|
|
ActiveSessions int `json:"activeSessions"`
|
|
RecentBuilds int `json:"recentBuilds"`
|
|
BridgeOnline bool `json:"bridgeOnline"`
|
|
}
|
|
|
|
// DashboardOverviewOutput is the output for ide_dashboard_overview.
|
|
type DashboardOverviewOutput struct {
|
|
Overview DashboardOverview `json:"overview"`
|
|
}
|
|
|
|
// DashboardActivityInput is the input for ide_dashboard_activity.
|
|
type DashboardActivityInput struct {
|
|
Limit int `json:"limit,omitempty"`
|
|
}
|
|
|
|
// ActivityEvent represents a single activity feed item.
|
|
type ActivityEvent struct {
|
|
Type string `json:"type"`
|
|
Message string `json:"message"`
|
|
Timestamp time.Time `json:"timestamp"`
|
|
}
|
|
|
|
// DashboardActivityOutput is the output for ide_dashboard_activity.
|
|
type DashboardActivityOutput struct {
|
|
Events []ActivityEvent `json:"events"`
|
|
}
|
|
|
|
// DashboardMetricsInput is the input for ide_dashboard_metrics.
|
|
type DashboardMetricsInput struct {
|
|
Period string `json:"period,omitempty"` // "1h", "24h", "7d"
|
|
}
|
|
|
|
// DashboardMetrics contains aggregate metrics.
|
|
type DashboardMetrics struct {
|
|
BuildsTotal int `json:"buildsTotal"`
|
|
BuildsSuccess int `json:"buildsSuccess"`
|
|
BuildsFailed int `json:"buildsFailed"`
|
|
AvgBuildTime string `json:"avgBuildTime"`
|
|
AgentSessions int `json:"agentSessions"`
|
|
MessagesTotal int `json:"messagesTotal"`
|
|
SuccessRate float64 `json:"successRate"`
|
|
}
|
|
|
|
// DashboardMetricsOutput is the output for ide_dashboard_metrics.
|
|
type DashboardMetricsOutput struct {
|
|
Period string `json:"period"`
|
|
Metrics DashboardMetrics `json:"metrics"`
|
|
}
|
|
|
|
func (s *Subsystem) registerDashboardTools(server *mcp.Server) {
|
|
mcp.AddTool(server, &mcp.Tool{
|
|
Name: "ide_dashboard_overview",
|
|
Description: "Get a high-level overview of the platform (repos, services, sessions, builds)",
|
|
}, s.dashboardOverview)
|
|
|
|
mcp.AddTool(server, &mcp.Tool{
|
|
Name: "ide_dashboard_activity",
|
|
Description: "Get the recent activity feed",
|
|
}, s.dashboardActivity)
|
|
|
|
mcp.AddTool(server, &mcp.Tool{
|
|
Name: "ide_dashboard_metrics",
|
|
Description: "Get aggregate build and agent metrics for a time period",
|
|
}, s.dashboardMetrics)
|
|
}
|
|
|
|
func (s *Subsystem) dashboardOverview(_ context.Context, _ *mcp.CallToolRequest, _ DashboardOverviewInput) (*mcp.CallToolResult, DashboardOverviewOutput, error) {
|
|
connected := s.bridge != nil && s.bridge.Connected()
|
|
|
|
if s.bridge != nil {
|
|
_ = s.bridge.Send(BridgeMessage{Type: "dashboard_overview"})
|
|
}
|
|
|
|
return nil, DashboardOverviewOutput{
|
|
Overview: DashboardOverview{
|
|
BridgeOnline: connected,
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func (s *Subsystem) dashboardActivity(_ context.Context, _ *mcp.CallToolRequest, input DashboardActivityInput) (*mcp.CallToolResult, DashboardActivityOutput, error) {
|
|
if s.bridge == nil {
|
|
return nil, DashboardActivityOutput{}, fmt.Errorf("bridge not available")
|
|
}
|
|
_ = s.bridge.Send(BridgeMessage{
|
|
Type: "dashboard_activity",
|
|
Data: map[string]any{"limit": input.Limit},
|
|
})
|
|
return nil, DashboardActivityOutput{Events: []ActivityEvent{}}, nil
|
|
}
|
|
|
|
func (s *Subsystem) dashboardMetrics(_ context.Context, _ *mcp.CallToolRequest, input DashboardMetricsInput) (*mcp.CallToolResult, DashboardMetricsOutput, error) {
|
|
if s.bridge == nil {
|
|
return nil, DashboardMetricsOutput{}, fmt.Errorf("bridge not available")
|
|
}
|
|
period := input.Period
|
|
if period == "" {
|
|
period = "24h"
|
|
}
|
|
_ = s.bridge.Send(BridgeMessage{
|
|
Type: "dashboard_metrics",
|
|
Data: map[string]any{"period": period},
|
|
})
|
|
return nil, DashboardMetricsOutput{
|
|
Period: period,
|
|
Metrics: DashboardMetrics{},
|
|
}, nil
|
|
}
|