import type { TaskSourceContext } from '../../shared/task-source-context' import type { ClassifiedError } from '../../shared/classified-error' import type { GetGitLabRateLimitResult, GitLabAssignableUser, GitLabAuthDiagnostic, GitLabCommentResult, GitLabDiscussionResolveResult, GitLabIssueInfo, GitLabIssueUpdate, GitLabJobTraceResult, GitLabMRInlineCommentInput, GitLabMRReviewersUpdateResult, GitLabMRUpdate, GitLabProjectRef, GitLabRetryJobResult, GitLabTodo, GitLabViewer, GitLabWorkItem, GitLabWorkItemDetails, ListMergeRequestsResult, MRInfo, MRListState } from '../../shared/gitlab-types' export type GitLabRepoSelectorArgs = { repoPath: string repoId?: string | null sourceContext?: TaskSourceContext | null /** Desktop IPC-only owner guard; web adapters remove it before runtime RPC. */ repoOwnerExecutionHostId?: string } // ── GitLab — parallel to gh, MR/issue surface only in v1 ──────── // Shapes mirror gh.* except where GitLab's API differs (MR states, host-qualified project path, `glab api -i` paging). export type GitLabApi = { viewer: () => Promise diagnoseAuth: () => Promise rateLimit: (args?: { force?: boolean; host?: string | null }) => Promise projectSlug: (args: GitLabRepoSelectorArgs) => Promise mrForBranch: ( args: GitLabRepoSelectorArgs & { branch: string linkedMRIid?: number | null } ) => Promise mr: (args: GitLabRepoSelectorArgs & { iid: number }) => Promise listMRs: ( args: GitLabRepoSelectorArgs & { state?: MRListState page?: number perPage?: number query?: string } ) => Promise /** Combined MR + issue list filtered by state. Issues are skipped * when state is 'merged' (issues don't merge). */ listWorkItems: ( args: GitLabRepoSelectorArgs & { state?: MRListState page?: number perPage?: number query?: string } ) => Promise issue: (args: GitLabRepoSelectorArgs & { number: number }) => Promise listIssues: ( args: GitLabRepoSelectorArgs & { state?: 'opened' | 'closed' | 'all' assignee?: string limit?: number page?: number } ) => Promise<{ items: GitLabWorkItem[] /** Optional while paired with a host older than issue pagination. */ totalPages?: number error?: ClassifiedError }> createIssue: ( args: GitLabRepoSelectorArgs & { title: string body: string } ) => Promise<{ ok: true; number: number; url: string } | { ok: false; error: string }> updateIssue: ( args: GitLabRepoSelectorArgs & { number: number updates: GitLabIssueUpdate } ) => Promise<{ ok: true } | { ok: false; error: string }> addIssueComment: ( args: GitLabRepoSelectorArgs & { number: number body: string } ) => Promise listLabels: (args: GitLabRepoSelectorArgs) => Promise listAssignableUsers: (args: GitLabRepoSelectorArgs) => Promise /** Cross-project user-scoped todos (gitlab.com/dashboard/todos). */ todos: (args: GitLabRepoSelectorArgs) => Promise /** Aggregated dialog payload — body + discussions + pipeline jobs. */ workItemDetails: ( args: GitLabRepoSelectorArgs & { iid: number type: 'issue' | 'mr' } ) => Promise closeMR: ( args: GitLabRepoSelectorArgs & { iid: number } ) => Promise<{ ok: true } | { ok: false; error: string }> reopenMR: ( args: GitLabRepoSelectorArgs & { iid: number } ) => Promise<{ ok: true } | { ok: false; error: string }> mergeMR: ( args: GitLabRepoSelectorArgs & { iid: number method?: 'merge' | 'squash' | 'rebase' } ) => Promise<{ ok: true } | { ok: false; error: string }> updateMR: ( args: GitLabRepoSelectorArgs & { iid: number updates: GitLabMRUpdate } ) => Promise<{ ok: true } | { ok: false; error: string }> updateMRReviewers: ( args: GitLabRepoSelectorArgs & { iid: number reviewerIds: number[] projectRef?: GitLabProjectRef | null } ) => Promise addMRComment: ( args: GitLabRepoSelectorArgs & { iid: number body: string } ) => Promise addMRInlineComment: ( args: GitLabRepoSelectorArgs & { iid: number input: GitLabMRInlineCommentInput projectRef?: GitLabProjectRef | null } ) => Promise resolveMRDiscussion: ( args: GitLabRepoSelectorArgs & { iid: number discussionId: string resolved: boolean } ) => Promise jobTrace: ( args: GitLabRepoSelectorArgs & { jobId: number projectRef?: GitLabProjectRef | null /** Bound the trace in main to a readable excerpt (see gitLabJobTraceToLogExcerpt). */ logExcerpt?: boolean } ) => Promise retryJob: ( args: GitLabRepoSelectorArgs & { jobId: number projectRef?: GitLabProjectRef | null } ) => Promise workItemByPath: ( args: GitLabRepoSelectorArgs & { host: string path: string iid: number type: 'issue' | 'mr' } ) => Promise | null> }