Skip to content
← Public packages

@kentcdodds/kody-issue-triage

Loop-safe triage for Kody run errors and fleet package-runtime error-rate elevations. Wakes Cole (Grok Bot) to decide; Cursor agents only when Cole escalates.

src/format-discord-report.ts

98 lines · 3.0 KB · TypeScript
import { formatKentReport } from 'kody:@kentcdodds/discord/format-report'
// Rebundle official v3 application emoji mentions from format-report.
import { formatReportDecisionFields } from './decision-fields.ts'
import type { FingerprintRecord } from './shared.ts'

type IssueFields = Pick<
	FingerprintRecord,
	| 'fingerprint'
	| 'surface'
	| 'owner'
	| 'count'
	| 'activity_url'
	| 'agent_url'
	| 'kody_agent_url'
	| 'classification'
	| 'sample_message'
	| 'error_family'
	| 'pr_url'
	| 'merge_commit_url'
	| 'deploy_url'
>

function compactTitle(record: IssueFields, fallback: string) {
	const family = String(record.error_family || '').trim()
	const owner = String(record.owner || '').trim()
	if (family && owner && owner !== family) return `${owner} ${family}`
	if (family) return family
	const sample = String(record.sample_message || '').trim()
	if (sample) return sample.slice(0, 80)
	return fallback
}

function pushUniqueLink(
	links: Array<{ label: string; url: string }>,
	label: string,
	url: string | null | undefined,
) {
	const trimmed = typeof url === 'string' ? url.trim() : ''
	if (!trimmed) return
	if (links.some((link) => link.url === trimmed && link.label === label)) return
	links.push({ label, url: trimmed })
}

export function formatKodyIssueReport(input: {
	status: string
	record: IssueFields
	title?: string | null
	summary?: string | null
	prUrl?: string | null
	mergeCommitUrl?: string | null
	deployUrl?: string | null
	extras?: string[]
	context?: string | null
	recommendation?: string | null
	rightFix?: string | null
	whyNotRightFix?: string | null
	options?: Array<string | { label?: string; text?: string; difficulty?: string; change?: string }> | string | null
}) {
	const decision = formatReportDecisionFields(input)
	const facts = [
		{ label: 'Surface', value: String(input.record.surface || '') },
		{ label: 'Owner', value: String(input.record.owner || '') },
		{ label: 'Count', value: `×${input.record.count || 0}` },
	].filter((fact) => fact.value)
	if (input.record.classification) {
		facts.push({ label: 'Class', value: input.record.classification })
	}
	const links = []
	pushUniqueLink(links, 'Activity', input.record.activity_url)
	pushUniqueLink(links, 'Agent', input.record.agent_url)
	pushUniqueLink(links, 'Kody agent', input.record.kody_agent_url)
	pushUniqueLink(links, 'PR', input.prUrl || input.record.pr_url)
	pushUniqueLink(
		links,
		'Merge',
		input.mergeCommitUrl || input.record.merge_commit_url,
	)
	pushUniqueLink(links, 'Deploy', input.deployUrl || input.record.deploy_url)
	return formatKentReport({
		kind: 'kody-issue',
		title: decision.title || compactTitle(input.record, 'Kody issue'),
		status: input.status,
		id: input.record.fingerprint,
		facts,
		context: decision.context,
		recommendation: decision.recommendation,
		rightFix: decision.rightFix,
		whyNotRightFix: decision.whyNotRightFix,
		options: decision.options,
		summary:
			decision.summary ||
			(decision.context || decision.recommendation || decision.options
				? undefined
				: input.record.sample_message || undefined),
		links,
		extras: input.extras,
	})
}