import {
type IssueInput,
type JsonRecord,
type SentryEvent,
type SummarizeIssueEventOptions,
getLatestIssueEvent,
requireRecord,
requireStringOrNumber,
summarizeIssueEvent,
} from './client.ts'
type WrappedInput = {
event: SentryEvent
options?: SummarizeIssueEventOptions
}
type SummarizeLatestInput = IssueInput & {
latest?: boolean
options?: SummarizeIssueEventOptions
}
/**
* Summarize a Sentry event object, or fetch and summarize an issue's latest event.
*
* @param params.event - Raw Sentry event, or `{ event, options }` wrapper.
* @param params.issueId - With `latest: true` (or alone), fetch the issue's latest event first.
* @param params.host - Optional API host when fetching by `issueId`. Default `sentry.io`.
* @returns Truncated summary with exceptions, breadcrumbs, and tags.
* @example
* import summarizeEvent from 'kody:@kody/sentry/summarize-issue-event'
* const summary = summarizeEvent({ event: { title: 'TypeError', entries: [] } })
* // => { title: 'TypeError', exceptions: [...], breadcrumbs: [...] }
*/
export default async function summarizeIssueEventEntrypoint(params: unknown) {
const input = requireRecord(params, 'summarize-issue-event')
if (input.latest === true || (input.issueId !== undefined && !('event' in input))) {
requireStringOrNumber(input, 'issueId', 'summarize-issue-event')
const latestInput = input as SummarizeLatestInput
const event = await getLatestIssueEvent(latestInput)
return summarizeIssueEvent(event, latestInput.options)
}
const typedInput = input as WrappedInput | SentryEvent
if ('event' in typedInput) {
const wrappedInput = typedInput as WrappedInput
return summarizeIssueEvent(wrappedInput.event, wrappedInput.options)
}
return summarizeIssueEvent(typedInput as JsonRecord as SentryEvent)
}