* fix(ci): skip unrelated required checks cleanly Matrix jobs had to start no-op runners to preserve interpolated required-check names. Static named jobs let GitHub report genuine skipped conclusions while keeping those names stable. * fix(ci): gate changes to install patching script * fix(ci): route cross-package test contracts narrowly * fix(ci): keep routed contracts merge-blocking * fix(server): exclude nested test utilities from builds * fix(ci): cover app-owned native and browser domains * refactor(ci): align tests with runtime domains Own browser specs, desktop specs, and Electron-only app code by stable directories so PR routing does not depend on filename conventions. Keep desktop integration coverage inside the required desktop check. * fix(ci): keep routing and desktop suites isolated The routing regression must run before dependency installation, and desktop Vitest must not collect Playwright-owned specs. * fix(ci): isolate desktop e2e runtime * perf(test): isolate Playwright workers * perf(test): parallelize Playwright within specs * fix(test): keep Playwright file scheduling * fix(test): share dynamic Metro fixture * fix(test): preserve own-host restart fixtures * fix(ci): preserve routed contracts after rebase * Stabilize Playwright wheel-scroll assertions
66 lines
2.6 KiB
TypeScript
66 lines
2.6 KiB
TypeScript
import { test } from "../support/fixtures";
|
|
import { installDaemonWebSocketGate } from "../support/helpers/daemon-websocket-gate";
|
|
import {
|
|
expectTimelinePresentationUnchanged,
|
|
expectTimelinePromptNotMounted,
|
|
expectTimelinePromptVisible,
|
|
openAgentTimeline,
|
|
rememberTimelinePresentation,
|
|
scrollTimelinePromptIntoView,
|
|
scrollTimelineUntilOlderHistoryIsReachable,
|
|
seedLongMockAgentTimeline,
|
|
} from "../support/helpers/timeline-pagination";
|
|
import {
|
|
commitTimelineTurnsWhileDisconnected,
|
|
disconnectViewedTimeline,
|
|
expectOneTailCheckWithoutCatchUpPages,
|
|
rememberTimelineRequestCounts,
|
|
restoreViewedTimelineWithHeldTail,
|
|
} from "../support/helpers/timeline-resume";
|
|
|
|
test.describe("Agent timeline resume", () => {
|
|
test("a long disconnected run lands as one latest-tail update", async ({ page }) => {
|
|
test.setTimeout(120_000);
|
|
const gate = await installDaemonWebSocketGate(page);
|
|
const agent = await seedLongMockAgentTimeline({ turns: 3 });
|
|
try {
|
|
await openAgentTimeline(page, agent);
|
|
await expectTimelinePromptVisible(page, agent.newestPrompt);
|
|
const requests = rememberTimelineRequestCounts(gate);
|
|
await disconnectViewedTimeline(page, gate);
|
|
const background = await commitTimelineTurnsWhileDisconnected(agent, 24);
|
|
await restoreViewedTimelineWithHeldTail(page, gate);
|
|
|
|
await expectTimelinePromptVisible(page, background.newestPrompt);
|
|
await expectTimelinePromptNotMounted(page, background.firstPrompt);
|
|
expectOneTailCheckWithoutCatchUpPages(gate, requests);
|
|
await scrollTimelineUntilOlderHistoryIsReachable(page, background.firstPrompt);
|
|
} finally {
|
|
gate.restore();
|
|
await agent.cleanup();
|
|
}
|
|
});
|
|
|
|
test("an unchanged resume leaves a scrolled-up timeline untouched", async ({ page }) => {
|
|
test.setTimeout(120_000);
|
|
const gate = await installDaemonWebSocketGate(page);
|
|
const agent = await seedLongMockAgentTimeline({ turns: 30 });
|
|
try {
|
|
await openAgentTimeline(page, agent);
|
|
await expectTimelinePromptVisible(page, agent.newestPrompt);
|
|
await scrollTimelinePromptIntoView(page, agent.initialTailAnchorPrompt);
|
|
const presentation = await rememberTimelinePresentation(page, agent.initialTailAnchorPrompt);
|
|
const requests = rememberTimelineRequestCounts(gate);
|
|
|
|
await disconnectViewedTimeline(page, gate);
|
|
await restoreViewedTimelineWithHeldTail(page, gate);
|
|
|
|
await expectTimelinePresentationUnchanged(page, presentation);
|
|
expectOneTailCheckWithoutCatchUpPages(gate, requests);
|
|
} finally {
|
|
gate.restore();
|
|
await agent.cleanup();
|
|
}
|
|
});
|
|
});
|