{"version":3,"file":"retry.mjs","names":[],"sources":["../src/retry.ts"],"sourcesContent":["import type { GatewayModelId } from \"ai\"\n\nimport { DEFAULT_MODEL, resolveConfig } from \"./config\"\nimport type { GitRunner } from \"./git\"\nimport { runGit } from \"./git\"\nimport { sendReleaseNotesForRange } from \"./release\"\nimport type { PluginConfig, ReleaseNotesLogger, ResolvedConfig } from \"./shared/types\"\n\nconst EMPTY_TREE_GIT_HEAD = \"4b825dc642cb6eb9a060e54bf8d69288fbee4904\"\n\nexport type PublisherSelection = \"both\" | \"discord\" | \"slack\"\n\nexport type RetryOptions = {\n  version?: string\n  tag?: string\n  branchName: string\n  publisher: PublisherSelection\n  dryRun?: boolean\n  discordWebhookUrl?: string\n  slackWebhookUrl?: string\n  gatewayApiKey?: string\n  model?: GatewayModelId\n  prompt?: string\n  includePaths?: string[]\n  excludePaths?: string[]\n}\n\ntype RetryReleaseContext = {\n  tag: string\n  version: string\n  from: string\n  to: string\n  releaseNotes: string\n}\n\nfunction trimLeadingV(value: string) {\n  return value.replace(/^v/, \"\")\n}\n\nasync function resolveReleaseTag({\n  version,\n  tag,\n  git,\n}: {\n  version?: string\n  tag?: string\n  git: GitRunner\n}) {\n  if (tag) return tag\n  if (version) return `v${trimLeadingV(version)}`\n  return await git([\"describe\", \"--tags\", \"--abbrev=0\"])\n}\n\nfunction resolveReleaseVersion({ version, tag }: { version?: string; tag: string }) {\n  return version ?? trimLeadingV(tag)\n}\n\nfunction normalizeList(values: string[] | undefined) {\n  return values\n    ?.flatMap((value) => value.split(\",\"))\n    .map((value) => value.trim())\n    .filter(Boolean)\n}\n\nfunction extractReleaseNotes(commitMessage: string) {\n  return commitMessage.split(\"\\n\").slice(1).join(\"\\n\").trim()\n}\n\nasync function maybeRunGit(git: GitRunner, args: string[]) {\n  try {\n    return await git(args)\n  } catch {\n    return undefined\n  }\n}\n\nexport async function resolveRetryReleaseContext({\n  version,\n  tag,\n  git = runGit,\n}: {\n  version?: string\n  tag?: string\n  git?: GitRunner\n}): Promise<RetryReleaseContext> {\n  const releaseTag = await resolveReleaseTag({ version, tag, git })\n  const releaseVersion = resolveReleaseVersion({ version, tag: releaseTag })\n  const to = await git([\"rev-list\", \"-n\", \"1\", releaseTag])\n  const from =\n    (await maybeRunGit(git, [\"describe\", \"--tags\", \"--abbrev=0\", `${releaseTag}^`])) ??\n    EMPTY_TREE_GIT_HEAD\n  const releaseNotes = extractReleaseNotes(await git([\"show\", \"-s\", \"--format=%B\", releaseTag]))\n\n  return {\n    tag: releaseTag,\n    version: releaseVersion,\n    from,\n    to,\n    releaseNotes,\n  }\n}\n\nfunction buildPluginConfig(options: RetryOptions): PluginConfig {\n  return {\n    discordWebhookUrl: options.discordWebhookUrl,\n    slackWebhookUrl: options.slackWebhookUrl,\n    gatewayApiKey: options.gatewayApiKey,\n    model: options.model,\n    prompt: options.prompt,\n    branches: [options.branchName],\n    includePaths: normalizeList(options.includePaths),\n    excludePaths: normalizeList(options.excludePaths),\n    dryRun: options.dryRun,\n  }\n}\n\nfunction selectPublishers(config: ResolvedConfig, publisher: PublisherSelection): ResolvedConfig {\n  return {\n    ...config,\n    discordWebhookUrl: publisher === \"slack\" ? undefined : config.discordWebhookUrl,\n    slackWebhookUrl: publisher === \"discord\" ? undefined : config.slackWebhookUrl,\n  }\n}\n\nexport async function retryReleaseAnnouncement({\n  options,\n  logger,\n  git = runGit,\n}: {\n  options: RetryOptions\n  logger: ReleaseNotesLogger\n  git?: GitRunner\n}) {\n  const release = await resolveRetryReleaseContext({\n    version: options.version,\n    tag: options.tag,\n    git,\n  })\n  const config = selectPublishers(resolveConfig(buildPluginConfig(options)), options.publisher)\n\n  if (!(config.dryRun || config.discordWebhookUrl || config.slackWebhookUrl)) {\n    throw new Error(`Missing ${options.publisher} webhook URL for retry`)\n  }\n\n  logger.log(`Retrying AI changelog notification for ${release.tag}`)\n\n  return await sendReleaseNotesForRange({\n    from: release.from,\n    to: release.to,\n    version: release.version,\n    releaseNotes: release.releaseNotes,\n    branchName: options.branchName,\n    logger,\n    config,\n  })\n}\n\nexport { DEFAULT_MODEL }\n"],"mappings":";;;;AAQA,MAAM,sBAAsB;AA2B5B,SAAS,aAAa,OAAe;CACnC,OAAO,MAAM,QAAQ,MAAM,EAAE;AAC/B;AAEA,eAAe,kBAAkB,EAC/B,SACA,KACA,OAKC;CACD,IAAI,KAAK,OAAO;CAChB,IAAI,SAAS,OAAO,IAAI,aAAa,OAAO;CAC5C,OAAO,MAAM,IAAI;EAAC;EAAY;EAAU;CAAY,CAAC;AACvD;AAEA,SAAS,sBAAsB,EAAE,SAAS,OAA0C;CAClF,OAAO,WAAW,aAAa,GAAG;AACpC;AAEA,SAAS,cAAc,QAA8B;CACnD,OAAO,QACH,SAAS,UAAU,MAAM,MAAM,GAAG,CAAC,CAAC,CACrC,KAAK,UAAU,MAAM,KAAK,CAAC,CAAC,CAC5B,OAAO,OAAO;AACnB;AAEA,SAAS,oBAAoB,eAAuB;CAClD,OAAO,cAAc,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK;AAC5D;AAEA,eAAe,YAAY,KAAgB,MAAgB;CACzD,IAAI;EACF,OAAO,MAAM,IAAI,IAAI;CACvB,QAAQ;EACN;CACF;AACF;AAEA,eAAsB,2BAA2B,EAC/C,SACA,KACA,MAAM,UAKyB;CAC/B,MAAM,aAAa,MAAM,kBAAkB;EAAE;EAAS;EAAK;CAAI,CAAC;CAChE,MAAM,iBAAiB,sBAAsB;EAAE;EAAS,KAAK;CAAW,CAAC;CACzE,MAAM,KAAK,MAAM,IAAI;EAAC;EAAY;EAAM;EAAK;CAAU,CAAC;CAMxD,OAAO;EACL,KAAK;EACL,SAAS;EACT,MAPC,MAAM,YAAY,KAAK;GAAC;GAAY;GAAU;GAAc,GAAG,WAAW;EAAE,CAAC,KAC9E;EAOA;EACA,cAPmB,oBAAoB,MAAM,IAAI;GAAC;GAAQ;GAAM;GAAe;EAAU,CAAC,CAO/E;CACb;AACF;AAEA,SAAS,kBAAkB,SAAqC;CAC9D,OAAO;EACL,mBAAmB,QAAQ;EAC3B,iBAAiB,QAAQ;EACzB,eAAe,QAAQ;EACvB,OAAO,QAAQ;EACf,QAAQ,QAAQ;EAChB,UAAU,CAAC,QAAQ,UAAU;EAC7B,cAAc,cAAc,QAAQ,YAAY;EAChD,cAAc,cAAc,QAAQ,YAAY;EAChD,QAAQ,QAAQ;CAClB;AACF;AAEA,SAAS,iBAAiB,QAAwB,WAA+C;CAC/F,OAAO;EACL,GAAG;EACH,mBAAmB,cAAc,UAAU,KAAA,IAAY,OAAO;EAC9D,iBAAiB,cAAc,YAAY,KAAA,IAAY,OAAO;CAChE;AACF;AAEA,eAAsB,yBAAyB,EAC7C,SACA,QACA,MAAM,UAKL;CACD,MAAM,UAAU,MAAM,2BAA2B;EAC/C,SAAS,QAAQ;EACjB,KAAK,QAAQ;EACb;CACF,CAAC;CACD,MAAM,SAAS,iBAAiB,cAAc,kBAAkB,OAAO,CAAC,GAAG,QAAQ,SAAS;CAE5F,IAAI,EAAE,OAAO,UAAU,OAAO,qBAAqB,OAAO,kBACxD,MAAM,IAAI,MAAM,WAAW,QAAQ,UAAU,uBAAuB;CAGtE,OAAO,IAAI,0CAA0C,QAAQ,KAAK;CAElE,OAAO,MAAM,yBAAyB;EACpC,MAAM,QAAQ;EACd,IAAI,QAAQ;EACZ,SAAS,QAAQ;EACjB,cAAc,QAAQ;EACtB,YAAY,QAAQ;EACpB;EACA;CACF,CAAC;AACH"}