{"version":3,"file":"ai.mjs","names":[],"sources":["../src/ai.ts"],"sourcesContent":["import { createGateway, type GatewayModelId, generateText, Output } from \"ai\"\nimport * as z from \"zod\"\n\nimport type { Announcement, ReleaseNotesLogger } from \"./shared/types\"\n\nconst announcementSchema = z.object({\n  title: z.string(),\n  description: z.string(),\n})\n\nconst MAX_PATCH_CHARS = 120_000\nexport const DEFAULT_PROMPT =\n  \"Generate concise, professional release notes for non-developer readers. \" +\n  \"Only mention user-facing changes. Group content naturally. \" +\n  \"If there are no user-facing changes, return empty strings.\"\n\nfunction clamp(text: string, maxChars: number) {\n  if (text.length <= maxChars) return text\n  return `${text.slice(0, maxChars)}\\n\\n[...truncated...]`\n}\n\nexport function buildPrompt({\n  version,\n  releaseNotes,\n  diffStat,\n  commitList,\n  changedFiles,\n  patch,\n}: {\n  version: string\n  releaseNotes: string\n  diffStat: string\n  commitList: string\n  changedFiles: string[]\n  patch: string\n}) {\n  return [\n    `Version: ${version}`,\n    releaseNotes.trim() ? `Existing release notes:\\n${clamp(releaseNotes, 6_000)}` : \"\",\n    diffStat.trim() ? `Diffstat:\\n${clamp(diffStat, 6_000)}` : \"\",\n    commitList.trim() ? `Commits:\\n${clamp(commitList, 8_000)}` : \"\",\n    changedFiles.length ? `Changed files:\\n${clamp(changedFiles.join(\"\\n\"), 6_000)}` : \"\",\n    patch.trim() ? `Patch diff:\\n${clamp(patch, MAX_PATCH_CHARS)}` : \"\",\n  ]\n    .filter(Boolean)\n    .join(\"\\n\\n\")\n}\n\nexport async function generateAnnouncement({\n  gatewayApiKey,\n  model,\n  prompt,\n  systemPrompt,\n  logger,\n}: {\n  gatewayApiKey?: string\n  model: GatewayModelId\n  prompt: string\n  systemPrompt: string\n  logger: ReleaseNotesLogger\n}): Promise<Announcement> {\n  logger.log(`Generating AI changelog announcement with ${model}`)\n\n  const gateway = createGateway({ apiKey: gatewayApiKey })\n  const { output } = await generateText({\n    model: gateway(model),\n    instructions: systemPrompt,\n    prompt,\n    output: Output.object({ schema: announcementSchema }),\n  })\n\n  return output\n}\n"],"mappings":";;;AAKA,MAAM,qBAAqB,EAAE,OAAO;CAClC,OAAO,EAAE,OAAO;CAChB,aAAa,EAAE,OAAO;AACxB,CAAC;AAED,MAAM,kBAAkB;AACxB,MAAa,iBACX;AAIF,SAAS,MAAM,MAAc,UAAkB;CAC7C,IAAI,KAAK,UAAU,UAAU,OAAO;CACpC,OAAO,GAAG,KAAK,MAAM,GAAG,QAAQ,EAAE;AACpC;AAEA,SAAgB,YAAY,EAC1B,SACA,cACA,UACA,YACA,cACA,SAQC;CACD,OAAO;EACL,YAAY;EACZ,aAAa,KAAK,IAAI,4BAA4B,MAAM,cAAc,GAAK,MAAM;EACjF,SAAS,KAAK,IAAI,cAAc,MAAM,UAAU,GAAK,MAAM;EAC3D,WAAW,KAAK,IAAI,aAAa,MAAM,YAAY,GAAK,MAAM;EAC9D,aAAa,SAAS,mBAAmB,MAAM,aAAa,KAAK,IAAI,GAAG,GAAK,MAAM;EACnF,MAAM,KAAK,IAAI,gBAAgB,MAAM,OAAO,eAAe,MAAM;CACnE,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,MAAM;AAChB;AAEA,eAAsB,qBAAqB,EACzC,eACA,OACA,QACA,cACA,UAOwB;CACxB,OAAO,IAAI,6CAA6C,OAAO;CAE/D,MAAM,UAAU,cAAc,EAAE,QAAQ,cAAc,CAAC;CACvD,MAAM,EAAE,WAAW,MAAM,aAAa;EACpC,OAAO,QAAQ,KAAK;EACpB,cAAc;EACd;EACA,QAAQ,OAAO,OAAO,EAAE,QAAQ,mBAAmB,CAAC;CACtD,CAAC;CAED,OAAO;AACT"}