import { linearGraphql } from './client.ts' import { COMMENT_FIELDS, mapComment, nodesFromConnection, pageInfoFromConnection, PAGE_INFO_FIELDS, } from './models.ts' import type { LinearAuthInput, LinearCommentSummary, LinearPageInfo, } from './types.ts' import { clampInt, optionalBoolean, optionalString, requireRecord, requireString } from './types.ts' import { requireAuthMode } from './auth.ts' export type ListCommentsInput = LinearAuthInput & { /** Issue UUID or identifier (`ENG-123`). */ issueId: string first?: number after?: string includeArchived?: boolean } export type ListCommentsResult = { issueId: string issueIdentifier: string | null items: Array pageInfo: LinearPageInfo } /** * List comments on a Linear issue. * @example * import listComments from 'kody:@kody/linear/list-comments' * const { items } = await listComments({ issueId: 'ENG-123' }) */ export async function listComments(input: ListCommentsInput): Promise { const issueId = requireString(input.issueId, 'issueId') const first = clampInt(input.first, 1, 50, 25) const result = await linearGraphql<{ issue: { id?: string identifier?: string comments?: unknown } | null }>({ ...input, operation: 'query', query: `query ListComments($id: String!, $first: Int!, $after: String, $includeArchived: Boolean) { issue(id: $id) { id identifier comments(first: $first, after: $after, includeArchived: $includeArchived) { ${PAGE_INFO_FIELDS} nodes { ${COMMENT_FIELDS} } } } }`, variables: { id: issueId, first, after: optionalString(input.after, 'after') ?? null, includeArchived: optionalBoolean(input.includeArchived, 'includeArchived') ?? false, }, }) if (!result.data.issue) throw new Error(`Linear issue not found: ${issueId}`) return { issueId: result.data.issue.id || issueId, issueIdentifier: result.data.issue.identifier ?? null, items: nodesFromConnection(result.data.issue.comments).map(mapComment), pageInfo: pageInfoFromConnection(result.data.issue.comments), } } /** * List comments on a Linear issue. * @example * import listComments from 'kody:@kody/linear/list-comments' * const result = await listComments({ issueId: 'ENG-123' }) */ export default async function listCommentsEntrypoint( params: Partial & Record = {}, ) { const input = requireRecord(params, 'list-comments') return listComments({ issueId: requireString(input.issueId, 'issueId'), first: input.first as number | undefined, after: optionalString(input.after, 'after'), includeArchived: optionalBoolean(input.includeArchived, 'includeArchived'), integrationName: optionalString(input.integrationName, 'integrationName'), integration: optionalString(input.integration, 'integration'), account: optionalString(input.account, 'account'), secretName: optionalString(input.secretName, 'secretName'), auth: requireAuthMode(input.auth), }) }