diff --git a/packages/app/e2e/browser/agent-heartbeat-track.spec.ts b/packages/app/e2e/browser/agent-heartbeat-track.spec.ts index 2fb0819657..7b9ac862fd 100644 --- a/packages/app/e2e/browser/agent-heartbeat-track.spec.ts +++ b/packages/app/e2e/browser/agent-heartbeat-track.spec.ts @@ -51,13 +51,14 @@ test("an agent heartbeat stays visible and keeps its workspace running", async ( await expectWorkspaceDone(page); await captureHeartbeatEvidence(page, testInfo, "heartbeat-removed-workspace-done"); - const expiringHeartbeat = await scenario.createHeartbeat({ - name: "Temporary watch", - expiresAt: new Date(Date.now() + 20_000).toISOString(), - }); + const expiringHeartbeat = await scenario.createHeartbeat({ name: "Temporary watch" }); await expectWorkspaceRunning(page); await page.getByRole("button", { name: "1 heartbeat" }).click(); await expectHeartbeatVisible(page, expiringHeartbeat); + await scenario.setHeartbeatExpiry( + expiringHeartbeat.id, + new Date(Date.now() + 20_000).toISOString(), + ); await expect(page.getByRole("button", { name: "1 heartbeat" })).toHaveCount(0, { timeout: 30_000, }); diff --git a/packages/app/e2e/support/helpers/heartbeats.ts b/packages/app/e2e/support/helpers/heartbeats.ts index 71158b4777..60ec611423 100644 --- a/packages/app/e2e/support/helpers/heartbeats.ts +++ b/packages/app/e2e/support/helpers/heartbeats.ts @@ -14,6 +14,10 @@ interface HeartbeatScheduleClient { }): Promise<{ schedule: ScheduleSummary | null; error: string | null }>; scheduleDelete(input: { id: string }): Promise<{ error: string | null }>; scheduleList(): Promise<{ schedules: ScheduleSummary[]; error: string | null }>; + scheduleUpdate(input: { + id: string; + expiresAt: string; + }): Promise<{ schedule: ScheduleSummary | null; error: string | null }>; } export interface SeededHeartbeat { @@ -27,6 +31,7 @@ export interface AgentHeartbeatScenario { parent: { id: string; title: string }; child: { id: string; title: string }; createHeartbeat(input?: { name?: string; expiresAt?: string }): Promise; + setHeartbeatExpiry(id: string, expiresAt: string): Promise; readWorkspaceStatus(): Promise; readHeartbeatExists(id: string): Promise; readAgentStatuses(): Promise>; @@ -75,6 +80,12 @@ export async function seedAgentWithHeartbeat(): Promise heartbeatIds.add(created.schedule.id); return { id: created.schedule.id, name, cadence: "Every 15 minutes" }; }, + setHeartbeatExpiry: async (id, expiresAt) => { + const updated = await scheduleClient.scheduleUpdate({ id, expiresAt }); + if (!updated.schedule) { + throw new Error(updated.error ?? "Failed to update heartbeat expiry"); + } + }, readWorkspaceStatus: async () => { const result = await workspace.client.fetchWorkspaces(); return (