20b08b5321
* add "Rerun failed job" link to error comment footer * Remove issueNumber guard from rerun link The rerun action only needs run_id — the issue number in the trigger URL path is just a route segment requirement. Use 0 as a fallback so the link is always shown when a run ID is available. * Overload `[number]` path segment as `runId` for the rerun action For the rerun trigger, the `[number]` path param now carries the workflow run ID instead of an issue number. The rerun link changes from `/trigger/o/r/ISSUE?action=rerun&run_id=RID` to `/trigger/o/r/RID?action=rerun`. - Remove `run_id` query param from page.tsx and searchParams type - Add error handling around `reRunWorkflow` for invalid run IDs - Drop `issueNumber` from `BuildErrorCommentBodyParams` and all rerun link builders (errorReport, exitHandler, postCleanup) * Reorder validation: action first, then rerun, then issueNumber * address review: remove early toolState assignment, restructure rerun into dedicated block * revert self-contained rerun block, share auth logic via issueOrRunId * improve error handling * normalize runid early --------- Co-authored-by: pullfrog[bot] <226033991+pullfrog[bot]@users.noreply.github.com> Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Mateusz Burzyński <mateuszburzynski@gmail.com>
80 lines
2.6 KiB
TypeScript
80 lines
2.6 KiB
TypeScript
export const PULLFROG_DIVIDER = "<!-- PULLFROG_DIVIDER_DO_NOT_REMOVE_PLZ -->";
|
||
|
||
const FROG_LOGO = `<a href="https://pullfrog.com"><picture><source media="(prefers-color-scheme: dark)" srcset="https://pullfrog.com/logos/frog-white-full-18px.png"><img src="https://pullfrog.com/logos/frog-green-full-18px.png" width="9px" height="9px" style="vertical-align: middle; " alt="Pullfrog"></picture></a>`;
|
||
|
||
export interface AgentInfo {
|
||
displayName: string;
|
||
url: string;
|
||
}
|
||
|
||
export interface WorkflowRunFooterInfo {
|
||
owner: string;
|
||
repo: string;
|
||
runId: number;
|
||
/** optional job ID - if provided, will append /job/{jobId} to the workflow run URL */
|
||
jobId?: string | undefined;
|
||
}
|
||
|
||
export interface BuildPullfrogFooterParams {
|
||
/** add "Triggered by Pullfrog" link */
|
||
triggeredBy?: boolean;
|
||
/** add "Using [agent](url)" link */
|
||
agent?: AgentInfo | undefined;
|
||
/** add "View workflow run" link */
|
||
workflowRun?: WorkflowRunFooterInfo | undefined;
|
||
/** alternative: just pass a pre-built URL directly (for shortlinks etc.) */
|
||
workflowRunUrl?: string | undefined;
|
||
/** arbitrary custom parts (e.g., action links) */
|
||
customParts?: string[];
|
||
}
|
||
|
||
/**
|
||
* build a pullfrog footer with configurable parts
|
||
* always includes: frog logo at start, pullfrog.com link and X link at end
|
||
* order: action links (customParts) > workflow run > agent > attribution > reference links
|
||
*/
|
||
export function buildPullfrogFooter(params: BuildPullfrogFooterParams): string {
|
||
const parts: string[] = [];
|
||
|
||
if (params.customParts) {
|
||
parts.push(...params.customParts);
|
||
}
|
||
|
||
if (params.workflowRunUrl) {
|
||
parts.push(`[View workflow run](${params.workflowRunUrl})`);
|
||
} else if (params.workflowRun) {
|
||
const baseUrl = `https://github.com/${params.workflowRun.owner}/${params.workflowRun.repo}/actions/runs/${params.workflowRun.runId}`;
|
||
const url = params.workflowRun.jobId ? `${baseUrl}/job/${params.workflowRun.jobId}` : baseUrl;
|
||
parts.push(`[View workflow run](${url})`);
|
||
}
|
||
|
||
if (params.agent) {
|
||
parts.push(`Using [${params.agent.displayName}](${params.agent.url})`);
|
||
}
|
||
|
||
if (params.triggeredBy) {
|
||
parts.push("Triggered by [Pullfrog](https://pullfrog.com)");
|
||
}
|
||
|
||
const allParts = [
|
||
...parts,
|
||
"[pullfrog.com](https://pullfrog.com)",
|
||
"[𝕏](https://x.com/pullfrogai)",
|
||
];
|
||
|
||
return `
|
||
${PULLFROG_DIVIDER}
|
||
<sup>${FROG_LOGO} | ${allParts.join(" | ")}</sup>`;
|
||
}
|
||
|
||
/**
|
||
* strip any existing pullfrog footer from a comment body
|
||
*/
|
||
export function stripExistingFooter(body: string): string {
|
||
const dividerIndex = body.indexOf(PULLFROG_DIVIDER);
|
||
if (dividerIndex === -1) {
|
||
return body;
|
||
}
|
||
return body.substring(0, dividerIndex).trimEnd();
|
||
}
|