109 lines
3 KiB
Go
109 lines
3 KiB
Go
package ide
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/modelcontextprotocol/go-sdk/mcp"
|
|
)
|
|
|
|
// Build tool input/output types.
|
|
|
|
// BuildStatusInput is the input for ide_build_status.
|
|
type BuildStatusInput struct {
|
|
BuildID string `json:"buildId"`
|
|
}
|
|
|
|
// BuildInfo represents a single build.
|
|
type BuildInfo struct {
|
|
ID string `json:"id"`
|
|
Repo string `json:"repo"`
|
|
Branch string `json:"branch"`
|
|
Status string `json:"status"`
|
|
Duration string `json:"duration,omitempty"`
|
|
StartedAt time.Time `json:"startedAt"`
|
|
}
|
|
|
|
// BuildStatusOutput is the output for ide_build_status.
|
|
type BuildStatusOutput struct {
|
|
Build BuildInfo `json:"build"`
|
|
}
|
|
|
|
// BuildListInput is the input for ide_build_list.
|
|
type BuildListInput struct {
|
|
Repo string `json:"repo,omitempty"`
|
|
Limit int `json:"limit,omitempty"`
|
|
}
|
|
|
|
// BuildListOutput is the output for ide_build_list.
|
|
type BuildListOutput struct {
|
|
Builds []BuildInfo `json:"builds"`
|
|
}
|
|
|
|
// BuildLogsInput is the input for ide_build_logs.
|
|
type BuildLogsInput struct {
|
|
BuildID string `json:"buildId"`
|
|
Tail int `json:"tail,omitempty"`
|
|
}
|
|
|
|
// BuildLogsOutput is the output for ide_build_logs.
|
|
type BuildLogsOutput struct {
|
|
BuildID string `json:"buildId"`
|
|
Lines []string `json:"lines"`
|
|
}
|
|
|
|
func (s *Subsystem) registerBuildTools(server *mcp.Server) {
|
|
mcp.AddTool(server, &mcp.Tool{
|
|
Name: "ide_build_status",
|
|
Description: "Get the status of a specific build",
|
|
}, s.buildStatus)
|
|
|
|
mcp.AddTool(server, &mcp.Tool{
|
|
Name: "ide_build_list",
|
|
Description: "List recent builds, optionally filtered by repository",
|
|
}, s.buildList)
|
|
|
|
mcp.AddTool(server, &mcp.Tool{
|
|
Name: "ide_build_logs",
|
|
Description: "Retrieve log output for a build",
|
|
}, s.buildLogs)
|
|
}
|
|
|
|
func (s *Subsystem) buildStatus(_ context.Context, _ *mcp.CallToolRequest, input BuildStatusInput) (*mcp.CallToolResult, BuildStatusOutput, error) {
|
|
if s.bridge == nil {
|
|
return nil, BuildStatusOutput{}, fmt.Errorf("bridge not available")
|
|
}
|
|
_ = s.bridge.Send(BridgeMessage{
|
|
Type: "build_status",
|
|
Data: map[string]any{"buildId": input.BuildID},
|
|
})
|
|
return nil, BuildStatusOutput{
|
|
Build: BuildInfo{ID: input.BuildID, Status: "unknown"},
|
|
}, nil
|
|
}
|
|
|
|
func (s *Subsystem) buildList(_ context.Context, _ *mcp.CallToolRequest, input BuildListInput) (*mcp.CallToolResult, BuildListOutput, error) {
|
|
if s.bridge == nil {
|
|
return nil, BuildListOutput{}, fmt.Errorf("bridge not available")
|
|
}
|
|
_ = s.bridge.Send(BridgeMessage{
|
|
Type: "build_list",
|
|
Data: map[string]any{"repo": input.Repo, "limit": input.Limit},
|
|
})
|
|
return nil, BuildListOutput{Builds: []BuildInfo{}}, nil
|
|
}
|
|
|
|
func (s *Subsystem) buildLogs(_ context.Context, _ *mcp.CallToolRequest, input BuildLogsInput) (*mcp.CallToolResult, BuildLogsOutput, error) {
|
|
if s.bridge == nil {
|
|
return nil, BuildLogsOutput{}, fmt.Errorf("bridge not available")
|
|
}
|
|
_ = s.bridge.Send(BridgeMessage{
|
|
Type: "build_logs",
|
|
Data: map[string]any{"buildId": input.BuildID, "tail": input.Tail},
|
|
})
|
|
return nil, BuildLogsOutput{
|
|
BuildID: input.BuildID,
|
|
Lines: []string{},
|
|
}, nil
|
|
}
|