From f29b28ab3b9a06bf4c0ac436e72b6e7dff463485 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 13 Mar 2026 08:28:11 +0000 Subject: [PATCH] Fix last-msg and pr-url commands to use correct activity field names - Update `last-msg` text extraction to use `lastMsg.planGenerated.plan.steps` or `lastMsg.userFeedbackRequired.message` - Update `pr-url` to use `session.outputs[].pullRequest.url` fetched via `getSession(id)` --- packages/cli/src/index.ts | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index 048bad3..ac541b5 100755 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -215,16 +215,13 @@ program if (!lastMsg) { console.log('No message found from Jules.'); } else { - // Extract text from the actual typed payload fields - // A real Jules API response has payload inside `message` or similar - // Typical Jules activity format: a.message?.text or a.text let text = JSON.stringify(lastMsg, null, 2); - if (lastMsg.message?.text) { - text = lastMsg.message.text; - } else if (lastMsg.text) { - text = lastMsg.text; - } else if (lastMsg.message) { - text = typeof lastMsg.message === 'string' ? lastMsg.message : JSON.stringify(lastMsg.message, null, 2); + if (lastMsg.planGenerated?.plan?.steps) { + text = lastMsg.planGenerated.plan.steps + .map((s: any, i: number) => `Step ${i + 1}: ${s.title}`) + .join('\n'); + } else if (lastMsg.userFeedbackRequired?.message) { + text = lastMsg.userFeedbackRequired.message; } console.log(text); @@ -243,25 +240,23 @@ program .action(async (sessionId, options) => { try { const client = new JulesClient(); - const response = await client.getActivities(sessionId); - const activities = response.activities || []; + const session = await client.getSession(sessionId); - // Find an activity with a pull request URL - // A typical session activity that contains PR data has `completedSession.pullRequestUrl` - // or similar. Let's inspect `completedSession` or `sessionCompletion` payload. - const prActivity = activities.find((a: any) => a.completedSession?.pullRequestUrl !== undefined); + const outputs = session.outputs || []; + const prOutput = outputs.find((o: any) => o.pullRequest?.url); + const url = prOutput?.pullRequest?.url; if (options.json) { - console.log(JSON.stringify(prActivity ? { pullRequestUrl: prActivity.completedSession.pullRequestUrl } : {}, null, 2)); + console.log(JSON.stringify(url ? { pullRequestUrl: url } : {}, null, 2)); } else { - if (prActivity && prActivity.completedSession?.pullRequestUrl) { - console.log(prActivity.completedSession.pullRequestUrl); + if (url) { + console.log(url); } else { - console.log('No PR URL found in session activities.'); + console.log('No PR URL found in session outputs.'); } } } catch (error: any) { - console.error('Error fetching activities:', error.message); + console.error('Error fetching session:', error.message); process.exit(1); } });