Skip to content

Commit 779951b

Browse files
fix: improve Devin check status with session URL and blocked state handling (#2081)
- Add Devin session URL to check summary for easy access from GitHub check page - Add isDevinSessionActive helper to handle both 'working' and 'blocked' states consistently - Update devin-status.ts to use isDevinSessionActive instead of isDevinSessionWorking - Show appropriate title ('Devin is working' vs 'Devin is blocked') based on session state Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
1 parent 497a78d commit 779951b

File tree

3 files changed

+33
-15
lines changed

3 files changed

+33
-15
lines changed

apps/bot/src/devin/detail.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,10 @@ export async function getDevinSessionDetail(
4545
export function isDevinSessionWorking(detail: DevinSessionDetail): boolean {
4646
return detail.status_enum === DevinSessionStatus.Working;
4747
}
48+
49+
export function isDevinSessionActive(detail: DevinSessionDetail): boolean {
50+
return (
51+
detail.status_enum === DevinSessionStatus.Working ||
52+
detail.status_enum === DevinSessionStatus.Blocked
53+
);
54+
}

apps/bot/src/devin/poller.ts

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -211,35 +211,38 @@ export class DevinStatusPoller {
211211
) {
212212
this.trackPR(trackedPR);
213213
} else if (detail.status_enum === DevinSessionStatus.Finished) {
214+
const sessionUrl = `https://app.devin.ai/sessions/${session.session_id}`;
214215
await this.updateCheckStatus(
215216
trackedPR,
216217
"completed",
217218
"success",
218219
{
219220
title: "Devin finished",
220-
summary: `Devin session ${session.session_id} has completed.`,
221+
summary: `Devin session has completed.\n\nView session: ${sessionUrl}`,
221222
},
222223
session.session_id,
223224
);
224225
} else if (detail.status_enum === DevinSessionStatus.Expired) {
226+
const sessionUrl = `https://app.devin.ai/sessions/${session.session_id}`;
225227
await this.updateCheckStatus(
226228
trackedPR,
227229
"completed",
228230
"cancelled",
229231
{
230232
title: "Devin session expired",
231-
summary: `Devin session ${session.session_id} has expired.`,
233+
summary: `Devin session has expired.\n\nView session: ${sessionUrl}`,
232234
},
233235
session.session_id,
234236
);
235237
} else if (detail.status_enum) {
238+
const sessionUrl = `https://app.devin.ai/sessions/${session.session_id}`;
236239
await this.updateCheckStatus(
237240
trackedPR,
238241
"completed",
239242
"neutral",
240243
{
241244
title: "Devin session ended",
242-
summary: `Devin session ${session.session_id} ended with status: ${detail.status_enum}`,
245+
summary: `Devin session ended with status: ${detail.status_enum}\n\nView session: ${sessionUrl}`,
243246
},
244247
session.session_id,
245248
);
@@ -336,14 +339,15 @@ export class DevinStatusPoller {
336339
// Verify the actual session status before marking as complete
337340
try {
338341
const detail = await getDevinSessionDetail(pr.sessionId);
342+
const sessionUrl = `https://app.devin.ai/sessions/${pr.sessionId}`;
339343
if (detail.status_enum === DevinSessionStatus.Finished) {
340344
await this.updateCheckStatus(
341345
pr,
342346
"completed",
343347
"success",
344348
{
345349
title: "Devin finished",
346-
summary: `Devin session ${pr.sessionId} has completed.`,
350+
summary: `Devin session has completed.\n\nView session: ${sessionUrl}`,
347351
},
348352
pr.sessionId,
349353
);
@@ -354,7 +358,7 @@ export class DevinStatusPoller {
354358
"cancelled",
355359
{
356360
title: "Devin session expired",
357-
summary: `Devin session ${pr.sessionId} has expired.`,
361+
summary: `Devin session has expired.\n\nView session: ${sessionUrl}`,
358362
},
359363
pr.sessionId,
360364
);
@@ -368,7 +372,7 @@ export class DevinStatusPoller {
368372
"neutral",
369373
{
370374
title: "Devin session ended",
371-
summary: `Devin session ${pr.sessionId} ended with status: ${detail.status_enum}`,
375+
summary: `Devin session ended with status: ${detail.status_enum}\n\nView session: ${sessionUrl}`,
372376
},
373377
pr.sessionId,
374378
);
@@ -383,6 +387,7 @@ export class DevinStatusPoller {
383387
}
384388

385389
const detail = await getDevinSessionDetail(session.session_id);
390+
const sessionUrl = `https://app.devin.ai/sessions/${session.session_id}`;
386391

387392
if (detail.status_enum === DevinSessionStatus.Working) {
388393
await this.updateCheckStatus(
@@ -391,7 +396,7 @@ export class DevinStatusPoller {
391396
undefined,
392397
{
393398
title: "Devin is working",
394-
summary: `Devin session ${session.session_id} is currently working on this PR.`,
399+
summary: `Devin session is currently working on this PR.\n\nView session: ${sessionUrl}`,
395400
},
396401
session.session_id,
397402
);
@@ -405,7 +410,7 @@ export class DevinStatusPoller {
405410
undefined,
406411
{
407412
title: "Devin is blocked",
408-
summary: `Devin session ${session.session_id} is blocked and waiting for input.`,
413+
summary: `Devin session is blocked and waiting for input.\n\nView session: ${sessionUrl}`,
409414
},
410415
session.session_id,
411416
);
@@ -419,7 +424,7 @@ export class DevinStatusPoller {
419424
"success",
420425
{
421426
title: "Devin finished",
422-
summary: `Devin session ${session.session_id} has completed.`,
427+
summary: `Devin session has completed.\n\nView session: ${sessionUrl}`,
423428
},
424429
session.session_id,
425430
);
@@ -434,7 +439,7 @@ export class DevinStatusPoller {
434439
"cancelled",
435440
{
436441
title: "Devin session expired",
437-
summary: `Devin session ${session.session_id} has expired.`,
442+
summary: `Devin session has expired.\n\nView session: ${sessionUrl}`,
438443
},
439444
session.session_id,
440445
);

apps/bot/src/features/devin-status.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { Probot } from "probot";
22

33
import {
4+
DevinSessionStatus,
45
findRunningSessionForPR,
56
getDevinSessionDetail,
67
getDevinStatusPoller,
7-
isDevinSessionWorking,
8+
isDevinSessionActive,
89
} from "../devin/index.js";
910
import { createOrUpdateCheck, ProbotContext } from "../github/check.js";
1011

@@ -57,7 +58,7 @@ async function checkDevinSession(
5758
}
5859

5960
const detail = await getDevinSessionDetail(session.session_id);
60-
if (!isDevinSessionWorking(detail)) {
61+
if (!isDevinSessionActive(detail)) {
6162
return;
6263
}
6364

@@ -74,16 +75,21 @@ async function checkDevinSession(
7475
});
7576
}
7677

78+
const sessionUrl = `https://app.devin.ai/sessions/${session.session_id}`;
79+
const isBlocked = detail.status_enum === DevinSessionStatus.Blocked;
80+
7781
await createOrUpdateCheck(context, {
7882
owner,
7983
repo,
8084
name: CHECK_NAME,
8185
head_sha: headSha,
8286
status: "in_progress",
83-
details_url: `https://app.devin.ai/sessions/${session.session_id}`,
87+
details_url: sessionUrl,
8488
output: {
85-
title: "Devin is working",
86-
summary: `Devin session ${session.session_id} is currently working on this PR.`,
89+
title: isBlocked ? "Devin is blocked" : "Devin is working",
90+
summary: isBlocked
91+
? `Devin session is blocked and waiting for input.\n\nView session: ${sessionUrl}`
92+
: `Devin session is currently working on this PR.\n\nView session: ${sessionUrl}`,
8793
},
8894
});
8995
}

0 commit comments

Comments
 (0)