// Why: per-repo fetch budget for gh CLI calls. Kept in shared/ so the renderer's // prefetch sites (SidebarNav, ui.ts openTaskPage) and the TaskPage all use the // same value for cache-key alignment. export const PER_REPO_FETCH_LIMIT = 36 // Why: how many items to show after cross-repo merge. Decoupled from the per-repo // fetch limit so changing the display cap doesn't invalidate cache keys. export const CROSS_REPO_DISPLAY_LIMIT = 100 export const GITHUB_WORK_ITEMS_SSH_REMOTE_REQUIRED_MESSAGE = 'GitHub work items require a GitHub remote for SSH repositories' export function isGitHubWorkItemsSshRemoteRequiredError(error: unknown): boolean { const message = error instanceof Error ? error.message : typeof error === 'object' && error !== null && 'message' in error && typeof error.message === 'string' ? error.message : typeof error === 'string' ? error : '' return message.includes(GITHUB_WORK_ITEMS_SSH_REMOTE_REQUIRED_MESSAGE) } // Why: generic over the item shape because main-process callers emit items // without repoId (stamped by the renderer after IPC), while renderer callers // carry the full GitHubWorkItem. Both share only the updatedAt field needed // here. export function sortWorkItemsByUpdatedAt(items: T[]): T[] { return [...items].sort((left, right) => { return new Date(right.updatedAt).getTime() - new Date(left.updatedAt).getTime() }) }