Revert the timeline optimistic and pagination rework (#2596)

* Add npm release track invariant and beta dist-tag procedure

* Revert "Keep older chat history and image previews stable (#2490)"

The timeline optimistic/pagination rework needs more work than main releases can wait for. Reverted together with #2484; both are reapplied on integration/timeline-optimistic-rework.

* Revert "Stop completed turns from appearing stuck (#2484)"

See the #2490 revert. #2490 built on this submission-authority change, so the two revert and reapply as a pair.
This commit is contained in:
Mohamed Boudra
2026-07-29 13:35:43 +02:00
committed by GitHub
parent ab24070075
commit acb8506d1f
81 changed files with 1721 additions and 7893 deletions
@@ -49,25 +49,6 @@ describe("MockLoadTestAgentClient", () => {
});
});
test("rejects the configured number of prompts before starting a retry", async () => {
const client = new MockLoadTestAgentClient();
const session = await client.createSession({
provider: "mock",
cwd: process.cwd(),
model: "ten-second-stream",
featureValues: { mockPromptRejections: 1 },
});
await expect(session.startTurn("Reject this prompt.")).rejects.toThrow(
"Requested mock prompt rejection",
);
await expect(session.startTurn("Accept this retry.")).resolves.toEqual({
turnId: expect.any(String),
});
await session.interrupt();
});
test("returns schema-shaped JSON for structured branch-name generation", async () => {
vi.useFakeTimers();
const client = new MockLoadTestAgentClient();
@@ -284,39 +265,6 @@ describe("MockLoadTestAgentClient", () => {
unsubscribe();
});
test("emits a settled assistant Markdown image path selected by prompt", async () => {
vi.useFakeTimers();
const client = new MockLoadTestAgentClient();
const session = await client.createSession({
provider: "mock",
cwd: process.cwd(),
model: "ten-second-stream",
});
const events: AgentStreamEvent[] = [];
const unsubscribe = session.subscribe((event) => events.push(event));
const markdown = "![Fixture image](screenshots/fixture.png)";
const resultPromise = session.run(`Emit settled assistant image Markdown: ${markdown}`);
await vi.advanceTimersByTimeAsync(0);
expect(
events.flatMap((event): AgentTimelineItem[] =>
event.type === "timeline" && event.item.type === "assistant_message" ? [event.item] : [],
),
).toEqual([
expect.objectContaining({
type: "assistant_message",
text: markdown,
}),
]);
await expect(resultPromise).resolves.toMatchObject({
sessionId: session.id,
finalText: markdown,
canceled: false,
});
unsubscribe();
});
test("agent manager coalesces adjacent assistant tokens into fewer messages", async () => {
vi.useFakeTimers();
const workdir = mkdtempSync(join(tmpdir(), "paseo-mock-load-test-"));
@@ -36,8 +36,6 @@ export const MOCK_LOAD_TEST_DEFAULT_MODEL_ID = "five-minute-stream";
const MOCK_LOAD_TEST_MODE_ID = "load-test";
const MOCK_LOAD_TEST_DURATION_MS = 5 * 60 * 1000;
const MOCK_LOAD_TEST_INTERVAL_MS = 40;
const ONE_PIXEL_PNG_BASE64 =
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Wl4Kj8AAAAASUVORK5CYII=";
const CAPABILITIES: AgentCapabilityFlags = {
supportsStreaming: true,
@@ -158,13 +156,6 @@ function shouldEmitTurnFailure(prompt: AgentPromptInput): boolean {
return /emit\s+(?:a\s+)?synthetic\s+turn\s+failure/i.test(promptToText(prompt));
}
function parseSettledAssistantImageMarkdown(prompt: AgentPromptInput): string | null {
const match = /^emit settled assistant image markdown:\s*(!\[[^\]\r\n]*\]\(.+\))\s*$/i.exec(
promptToText(prompt),
);
return match?.[1] ?? null;
}
function parseMockQuestionPrompt(prompt: AgentPromptInput): MockQuestionPromptRequest | null {
const text = promptToText(prompt);
if (!/emit\s+(?:a\s+)?synthetic\s+questions?/i.test(text)) {
@@ -592,7 +583,6 @@ export class MockLoadTestAgentSession implements AgentSession {
private modeId: string | null;
private modelId: string | null;
private readonly rewindError: string | null;
private remainingPromptRejections: number;
constructor(options: { config: AgentSessionConfig; sessionId: string; logger?: Logger }) {
this.id = options.sessionId;
@@ -603,13 +593,6 @@ export class MockLoadTestAgentSession implements AgentSession {
typeof options.config.featureValues?.mockRewindError === "string"
? options.config.featureValues.mockRewindError
: null;
const requestedPromptRejections = options.config.featureValues?.mockPromptRejections;
this.remainingPromptRejections =
typeof requestedPromptRejections === "number" &&
Number.isSafeInteger(requestedPromptRejections) &&
requestedPromptRejections > 0
? requestedPromptRejections
: 0;
}
async run(prompt: AgentPromptInput, options?: AgentRunOptions): Promise<AgentRunResult> {
@@ -628,10 +611,6 @@ export class MockLoadTestAgentSession implements AgentSession {
if (this.activeTurn) {
throw new Error("Mock load-test provider already has an active turn");
}
if (this.remainingPromptRejections > 0) {
this.remainingPromptRejections -= 1;
throw new Error("Requested mock prompt rejection");
}
const profile = resolveModelProfile(this.modelId);
const turnId = randomUUID();
@@ -678,13 +657,10 @@ export class MockLoadTestAgentSession implements AgentSession {
const stress = parseAgentStreamStressPrompt(prompt);
const questionPrompt = parseMockQuestionPrompt(prompt);
const structuredBranchName = parseStructuredBranchNamePrompt(prompt);
const settledAssistantImageMarkdown = parseSettledAssistantImageMarkdown(prompt);
if (shouldEmitTurnFailure(prompt)) {
this.scheduleFailedTurn(turn);
} else if (structuredBranchName) {
this.scheduleSettledAssistantTurn(turn, JSON.stringify(structuredBranchName));
} else if (settledAssistantImageMarkdown) {
this.scheduleSettledAssistantTurn(turn, settledAssistantImageMarkdown);
this.scheduleStructuredJsonTurn(turn, structuredBranchName);
} else if (shouldEmitPlanApprovalPrompt(prompt)) {
this.schedulePlanApprovalTurn(turn);
} else if (questionPrompt) {
@@ -899,14 +875,14 @@ export class MockLoadTestAgentSession implements AgentSession {
turn.timer.unref?.();
}
private scheduleSettledAssistantTurn(turn: ActiveTurn, finalText: string): void {
private scheduleStructuredJsonTurn(turn: ActiveTurn, result: Record<string, string>): void {
turn.timer = setTimeout(() => {
this.emitSettledAssistantTurn(turn, finalText);
this.emitStructuredJsonTurn(turn, result);
}, 0);
turn.timer.unref?.();
}
private emitSettledAssistantTurn(turn: ActiveTurn, finalText: string): void {
private emitStructuredJsonTurn(turn: ActiveTurn, result: Record<string, string>): void {
if (this.activeTurn !== turn) {
return;
}
@@ -918,6 +894,7 @@ export class MockLoadTestAgentSession implements AgentSession {
turnId: turn.turnId,
});
const finalText = JSON.stringify(result);
this.emitTimeline(turn.turnId, {
type: "assistant_message",
text: finalText,
@@ -1128,14 +1105,9 @@ export class MockLoadTestAgentSession implements AgentSession {
}),
);
} else {
const imageBytes = Buffer.from(ONE_PIXEL_PNG_BASE64, "base64");
const imagePayload = Buffer.concat([
imageBytes,
Buffer.alloc(Math.max(0, largePayload.bytes - imageBytes.length)),
]).toString("base64");
this.emitTimeline(turn.turnId, {
type: "assistant_message",
text: `![Synthetic image](data:image/png;base64,${imagePayload})`,
text: `data:image/png;base64,${payload}`,
messageId: turn.assistantMessageId,
});
}
-2
View File
@@ -6345,7 +6345,6 @@ export class Session {
agentId,
accepted: true,
error: null,
outOfBand: true,
},
});
return;
@@ -6373,7 +6372,6 @@ export class Session {
agentId,
accepted: true,
error: null,
outOfBand: false,
},
});
} catch (error) {