From dd2089d71b28a2505781f02aae6c2bff5b7d76c9 Mon Sep 17 00:00:00 2001 From: Colin McDonnell Date: Thu, 20 Nov 2025 16:58:21 -0800 Subject: [PATCH] have payload.agent take precedence over inputs.defaultAgent --- action.yml | 9 +++++++++ entry.ts | 2 +- external.ts | 4 ++++ main.ts | 29 ++++++++++++++++------------- play.ts | 5 ++++- 5 files changed, 34 insertions(+), 15 deletions(-) diff --git a/action.yml b/action.yml index 128f5db..5b33ef3 100644 --- a/action.yml +++ b/action.yml @@ -7,6 +7,15 @@ inputs: description: "Prompt to send to Claude Code" required: true default: "Hello from Claude Code!" + defaultAgent: + description: "Default agent to use. Overridden by payload.agent if present." + required: false + type: choice + options: + - claude + - codex + - cursor + - gemini anthropic_api_key: description: "Anthropic API key for Claude Code authentication" required: false diff --git a/entry.ts b/entry.ts index dd2ac43..6f9d77c 100644 --- a/entry.ts +++ b/entry.ts @@ -22,7 +22,7 @@ async function run(): Promise { try { const inputs: Required = { prompt: core.getInput("prompt", { required: true }), - agent: core.getInput("agent") ? AgentName.assert(core.getInput("agent")) : undefined, + defaultAgent: core.getInput("defaultAgent") ? AgentName.assert(core.getInput("defaultAgent")) : undefined, ...flatMorph(agents, (_, agent) => agent.apiKeyNames.map((inputKey) => [inputKey, core.getInput(inputKey)]) ), diff --git a/external.ts b/external.ts index efda803..b1b3d6a 100644 --- a/external.ts +++ b/external.ts @@ -123,6 +123,10 @@ export type PayloadEvent = url: string; }; [key: string]: any; + } + | { + trigger: "unknown"; + [key: string]: any; }; // payload type for agent execution diff --git a/main.ts b/main.ts index 72ef58c..9127a99 100644 --- a/main.ts +++ b/main.ts @@ -35,7 +35,9 @@ const keyInputDefs = flatMorph(agents, (_, agent) => export const Inputs = type({ prompt: "string", ...keyInputDefs, - "agent?": type.enumerated(...Object.values(agents).map((agent) => agent.name)).or("undefined"), + "defaultAgent?": type + .enumerated(...Object.values(agents).map((agent) => agent.name)) + .or("undefined"), }); export type Inputs = typeof Inputs.infer; @@ -51,12 +53,13 @@ export async function main(inputs: Inputs): Promise { const ctx = partialCtx as MainContext; try { + // parse payload early to extract agent for determineAgent + ctx.payload = parsePayload(inputs); await determineAgent(ctx); setupGitAuth(ctx.githubInstallationToken, ctx.repoContext); await setupTempDirectory(ctx); setupMcpLogPolling(ctx); - ctx.payload = parsePayload(inputs); setupGitBranch(ctx.payload); setupMcpServers(ctx); await installAgentCli(ctx); @@ -73,7 +76,10 @@ export async function main(inputs: Inputs): Promise { error: errorMessage, }; } finally { - await cleanup(partialCtx); + await cleanup({ + ...partialCtx, + payload: ctx.payload, + }); } } @@ -167,14 +173,16 @@ async function initializeContext( } async function determineAgent( - ctx: Omit + ctx: Omit ): Promise { const repoSettings = await fetchRepoSettings({ token: ctx.githubInstallationToken, repoContext: ctx.repoContext, }); - ctx.agentName = ctx.inputs.agent || repoSettings.defaultAgent || "claude"; + // precedence: payload.agent > inputs.defaultAgent > repoSettings.defaultAgent > "claude" + ctx.agentName = + ctx.payload.agent || ctx.inputs.defaultAgent || repoSettings.defaultAgent || "claude"; ctx.agent = agents[ctx.agentName]; } @@ -215,11 +223,8 @@ function parsePayload(inputs: Inputs): Payload { agent: null, prompt: inputs.prompt, event: { - trigger: "issues_opened", - issue_number: 0, - issue_title: "", - issue_body: null, - } as Payload["event"], + trigger: "unknown", + }, modes, }; } @@ -283,9 +288,7 @@ async function handleAgentResult( }; } -async function cleanup( - ctx: Omit -): Promise { +async function cleanup(ctx: Omit): Promise { if (ctx.pollInterval) { clearInterval(ctx.pollInterval); } diff --git a/play.ts b/play.ts index e04074a..7926fe0 100644 --- a/play.ts +++ b/play.ts @@ -21,9 +21,12 @@ export async function run(prompt: string): Promise { const originalCwd = process.cwd(); process.chdir(tempDir); + // check if prompt is a pullfrog payload and extract agent + // note: agent from payload will be used by determineAgent with highest precedence + // we don't need to extract it here since main() will parse the payload const inputs: Required = { prompt, - agent: "codex", + defaultAgent: undefined, ...flatMorph(agents, (_, agent) => agent.apiKeyNames.map((inputKey) => [inputKey, process.env[inputKey.toUpperCase()]]) ),