Fixed how payload-as-prompt is handled and progress comment updates (#212)

This commit is contained in:
Mateusz Burzyński
2026-02-01 22:13:39 +00:00
committed by pullfrog[bot]
parent 18ba8e5fd0
commit bfe72ac2cf
8 changed files with 126 additions and 166 deletions
+44 -67
View File
@@ -135585,12 +135585,6 @@ var agentsManifest = {
var AgentName = type.enumerated(...Object.keys(agentsManifest));
var Effort = type.enumerated("mini", "auto", "max");
// mcp/bash.ts
import { spawn } from "node:child_process";
import { randomUUID as randomUUID2 } from "node:crypto";
import { closeSync, openSync, writeFileSync } from "node:fs";
import { join } from "node:path";
// utils/log.ts
var core = __toESM(require_core(), 1);
var import_table = __toESM(require_src(), 1);
@@ -135767,6 +135761,12 @@ function formatJsonValue(value2) {
return compact.length > 80 || compact.includes("\n") ? JSON.stringify(value2, null, 2) : compact;
}
// mcp/bash.ts
import { spawn } from "node:child_process";
import { randomUUID as randomUUID2 } from "node:crypto";
import { closeSync, openSync, writeFileSync } from "node:fs";
import { join } from "node:path";
// node_modules/.pnpm/@toon-format+toon@1.4.0/node_modules/@toon-format/toon/dist/index.mjs
var LIST_ITEM_MARKER = "-";
var LIST_ITEM_PREFIX = "- ";
@@ -143291,10 +143291,12 @@ function UploadFileTool(ctx) {
}
// mcp/server.ts
function initToolState(ctx) {
const progressCommentIdStr = ctx.runInfo.workflowRunInfo.progressCommentId;
const progressCommentId = progressCommentIdStr ? parseInt(progressCommentIdStr, 10) : null;
function initToolState(params) {
const progressCommentId = params.progressCommentId ? parseInt(params.progressCommentId, 10) : null;
const resolvedId = Number.isNaN(progressCommentId) ? null : progressCommentId;
if (progressCommentId) {
log.info(`\xBB using pre-created progress comment: ${progressCommentId}`);
}
return {
progressCommentId: resolvedId,
backgroundProcesses: /* @__PURE__ */ new Map()
@@ -162544,12 +162546,13 @@ var JsonPayload = type({
"~pullfrog": "true",
version: "string",
"agent?": AgentName.or("undefined"),
"prompt?": "string",
prompt: "string",
"eventInstructions?": "string",
"repoInstructions?": "string",
"event?": "object",
"effort?": Effort.or("undefined"),
"timeout?": type.string.or("undefined")
"timeout?": type.string.or("undefined"),
"progressCommentId?": type.string.or("undefined")
});
var COLLABORATOR_PERMISSIONS = ["admin", "maintain", "write"];
function isCollaborator(event) {
@@ -162579,9 +162582,23 @@ function resolveCwd(cwd2) {
if (isAbsolute(cwd2)) return cwd2;
return workspace ? resolve(workspace, cwd2) : cwd2;
}
function resolvePayload(repoSettings) {
const inputs = Inputs.assert({
prompt: core4.getInput("prompt", { required: true }),
function resolvePromptInput() {
const prompt = core4.getInput("prompt", { required: true });
let parsed2;
try {
parsed2 = JSON.parse(prompt);
} catch {
return prompt;
}
if (!parsed2 || typeof parsed2 !== "object" || !("~pullfrog" in parsed2)) {
return prompt;
}
const jsonPayload = JsonPayload.assert(parsed2);
validateCompatibility(jsonPayload.version, package_default.version);
return jsonPayload;
}
function resolveNonPromptInputs() {
return Inputs.omit("prompt").assert({
effort: core4.getInput("effort") || void 0,
timeout: core4.getInput("timeout") || void 0,
agent: core4.getInput("agent") || void 0,
@@ -162591,19 +162608,11 @@ function resolvePayload(repoSettings) {
write: core4.getInput("write") || void 0,
bash: core4.getInput("bash") || void 0
});
}
function resolvePayload(resolvedPromptInput, repoSettings) {
const [prompt, jsonPayload] = typeof resolvedPromptInput !== "string" ? [resolvedPromptInput.prompt, resolvedPromptInput] : [resolvedPromptInput, void 0];
const inputs = resolveNonPromptInputs();
const agent2 = inputs.agent !== void 0 && isAgentName(inputs.agent) ? inputs.agent : void 0;
let jsonPayload = null;
try {
const parsed2 = JSON.parse(inputs.prompt);
if (parsed2 && typeof parsed2 === "object" && "~pullfrog" in parsed2) {
jsonPayload = JsonPayload.assert(parsed2);
}
} catch (error50) {
if (error50 instanceof type.errors) {
throw new Error(`invalid pullfrog payload: ${error50.summary}`);
}
}
if (jsonPayload) validateCompatibility(jsonPayload.version, package_default.version);
const rawEvent = jsonPayload?.event;
const event = isPayloadEvent(rawEvent) ? rawEvent : { trigger: "unknown" };
const jsonAgent = jsonPayload?.agent;
@@ -162624,9 +162633,7 @@ function resolvePayload(repoSettings) {
"~pullfrog": true,
version: jsonPayload?.version ?? package_default.version,
agent: resolvedAgent,
// inverted: jsonPayload.prompt extracts the text from the JSON payload,
// whereas inputs.prompt IS the raw JSON string when internally dispatched
prompt: jsonPayload?.prompt ?? inputs.prompt,
prompt,
eventInstructions: jsonPayload?.eventInstructions,
repoInstructions: jsonPayload?.repoInstructions,
event,
@@ -162835,35 +162842,6 @@ var Timer = class {
}
};
// utils/workflowRun.ts
async function fetchWorkflowRunInfo(params) {
const apiUrl = process.env.API_URL || "https://pullfrog.com";
const timeoutMs = 3e4;
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
try {
const response = await fetch(`${apiUrl}/api/workflow-run/${params.runId}`, {
method: "GET",
headers: {
// apiToken not strictly required (route only exposes public IDs)
// but claims in token enable preview API URL forwarding
Authorization: `Bearer ${params.apiToken}`,
"Content-Type": "application/json"
},
signal: controller.signal
});
clearTimeout(timeoutId);
if (!response.ok) {
return { progressCommentId: null };
}
const data = await response.json();
return data;
} catch {
clearTimeout(timeoutId);
return { progressCommentId: null };
}
}
// utils/workflow.ts
async function resolveRun(params) {
const runId = process.env.GITHUB_RUN_ID || "";
@@ -162872,10 +162850,6 @@ async function resolveRun(params) {
throw new Error(`GITHUB_REPOSITORY env var must be set to "owner/repo", got: ${githubRepo}`);
}
const [owner, repo] = githubRepo.split("/");
const workflowRunInfo = runId ? await fetchWorkflowRunInfo({ runId, apiToken: params.apiToken }) : { progressCommentId: null };
if (workflowRunInfo.progressCommentId) {
log.info(`\xBB using pre-created progress comment: ${workflowRunInfo.progressCommentId}`);
}
let jobId;
const jobName = process.env.GITHUB_JOB;
if (jobName && runId) {
@@ -162890,7 +162864,7 @@ async function resolveRun(params) {
log.debug(`\xBB found job ID: ${jobId}`);
}
}
return { runId, jobId, workflowRunInfo };
return { runId, jobId };
}
// main.ts
@@ -162900,17 +162874,20 @@ async function main() {
normalizeEnv();
const timer = new Timer();
let activityTimeout = null;
const resolvedPromptInput = resolvePromptInput();
const toolState = initToolState({
progressCommentId: typeof resolvedPromptInput !== "string" ? resolvedPromptInput.progressCommentId : void 0
});
setupExitHandler(toolState);
const tokenRef = __using(_stack2, await resolveInstallationToken(), true);
const octokit = createOctokit(tokenRef.token);
const runContext = await resolveRunContextData({ octokit, token: tokenRef.token });
timer.checkpoint("runContextData");
const runInfo = await resolveRun({ octokit, apiToken: runContext.apiToken });
const toolState = initToolState({ runInfo });
setupExitHandler(toolState);
const runInfo = await resolveRun({ octokit });
try {
var _stack = [];
try {
const payload = resolvePayload(runContext.repoSettings);
const payload = resolvePayload(resolvedPromptInput, runContext.repoSettings);
if (payload.cwd && process.cwd() !== payload.cwd) {
process.chdir(payload.cwd);
}