import { Type } from "typebox"; import { StringEnum } from "@earendil-works/pi-ai"; export const GithubParams = Type.Object({ action: Type.Optional( StringEnum( [ "format", "list_images", "download_image", "list_changes", "get_change", "list_issues", "list_prs", "pr_overview", "list_pr_commits", "get_pr_commit", "list_review_comments", "list_pr_checks", "list_participants", "read_file", "list_directory", "search_code", "glob_files", "search_commits", ] as const, { description: "Action: format thread markdown; list_issues/list_prs; list_images/download_image; or list_changes/get_change for PR file diffs", }, ), ), id: Type.Optional(Type.Integer({ minimum: 1, description: "GitHub thread ID (issue/PR/discussion number)" })), entity: Type.Optional(StringEnum(["issue", "pr", "discussion"] as const)), owner: Type.Optional(Type.String({ description: "GitHub repository owner/org (optional; auto-detected from git origin)" })), repo: Type.Optional(Type.String({ description: "GitHub repository name (optional; auto-detected from git origin)" })), page: Type.Optional(Type.Integer({ minimum: 1, description: "Pagination page (default 1)" })), perPage: Type.Optional(Type.Integer({ minimum: 1, maximum: 100, description: "Items per page (default 20)" })), imageId: Type.Optional(Type.Integer({ minimum: 1, description: "Image ID (for download_image)" })), changeId: Type.Optional(Type.Integer({ minimum: 1, description: "Change ID (for get_change)" })), tmpDir: Type.Optional(Type.String({ description: "Download directory for images (default /tmp)" })), path: Type.Optional(Type.String({ description: "File path filter or file path for file-focused actions" })), ref: Type.Optional(Type.String({ description: "Git ref (branch/tag/SHA) for ref-aware actions" })), startLine: Type.Optional(Type.Integer({ minimum: 1, description: "Start line for file output (1-indexed)" })), endLine: Type.Optional(Type.Integer({ minimum: 1, description: "End line for file output (1-indexed)" })), commitSha: Type.Optional(Type.String({ description: "PR commit SHA for action=get_pr_commit" })), includeFiles: Type.Optional(Type.Boolean({ description: "Include changed files in action=pr_overview (default true)" })), includeReviews: Type.Optional(Type.Boolean({ description: "Include review summary in action=pr_overview (default true)" })), includeChecks: Type.Optional(Type.Boolean({ description: "Include checks summary in action=pr_overview (default true)" })), author: Type.Optional(Type.String({ description: "Filter by author login" })), kind: Type.Optional(Type.String({ description: "Filter by thread item kind" })), since: Type.Optional(Type.String({ description: "ISO date/time lower bound filter" })), until: Type.Optional(Type.String({ description: "ISO date/time upper bound filter" })), contains: Type.Optional(Type.String({ description: "Case-insensitive body substring filter" })), query: Type.Optional(Type.String({ description: "Search query for action=search_code/search_commits" })), filePattern: Type.Optional(Type.String({ description: "Glob pattern for action=glob_files" })), limit: Type.Optional(Type.Integer({ minimum: 1, description: "Maximum results for list/search actions" })), offset: Type.Optional(Type.Integer({ minimum: 0, description: "Offset for paginated list/search actions" })), });