package tools import ( "context" "encoding/json" "gitea.d-ma.be/mathias/gitea-mcp/internal/allowlist" "gitea.d-ma.be/mathias/gitea-mcp/internal/gitea" "gitea.d-ma.be/mathias/gitea-mcp/internal/registry" ) type WorkflowRunList struct { c *gitea.Client a *allowlist.Allowlist } func NewWorkflowRunList(c *gitea.Client, a *allowlist.Allowlist) *WorkflowRunList { return &WorkflowRunList{c: c, a: a} } func (t *WorkflowRunList) Descriptor() registry.ToolDescriptor { return registry.ToolDescriptor{ Name: "workflow_run_list", Description: "List recent Gitea Actions workflow runs with optional filters (branch, head_sha, status, event, workflow).", InputSchema: json.RawMessage(`{ "type":"object", "properties":{ "owner":{"type":"string"}, "name":{"type":"string"}, "branch":{"type":"string"}, "head_sha":{"type":"string"}, "status":{"type":"string","enum":["queued","in_progress","completed","all"]}, "event":{"type":"string","enum":["push","pull_request","schedule","workflow_dispatch","all"]}, "workflow":{"type":"string"}, "page":{"type":"integer","minimum":1}, "limit":{"type":"integer","minimum":1,"maximum":50} }, "required":["owner","name"] }`), } } type workflowRunListArgs struct { Owner string `json:"owner"` Name string `json:"name"` Branch string `json:"branch"` HeadSHA string `json:"head_sha"` Status string `json:"status"` Event string `json:"event"` Workflow string `json:"workflow"` Page int `json:"page"` Limit int `json:"limit"` } func (t *WorkflowRunList) Call(ctx context.Context, raw json.RawMessage) (json.RawMessage, error) { var args workflowRunListArgs if err := parseArgs(raw, &args); err != nil { return nil, err } if err := t.a.Check(args.Owner); err != nil { return nil, err } args.Limit = capLimit(args.Limit, 10) if args.Page < 1 { args.Page = 1 } resp, err := t.c.ListWorkflowRuns(ctx, args.Owner, args.Name, gitea.ListWorkflowRunsArgs{ Branch: args.Branch, HeadSHA: args.HeadSHA, Status: args.Status, Event: args.Event, Workflow: args.Workflow, Page: args.Page, Limit: args.Limit, }) if err != nil { return nil, err } out := map[string]any{ "runs": resp.WorkflowRuns, "total": resp.TotalCount, } if len(resp.WorkflowRuns) == args.Limit { out["next_page"] = args.Page + 1 } return textOK(out) }