fix(FN-2586): restore 0.4.x release line and agent log stability

This commit is contained in:
gsxdsm
2026-04-26 12:22:06 -07:00
parent 8097db235a
commit ec3e2cb280
24 changed files with 56 additions and 69 deletions

View File

@@ -185,26 +185,6 @@ export function AgentLogViewer({
}
}, [isFullscreen, handleKeyDown]);
if (loading && entries.length === 0) {
return (
<div className="agent-log-viewer" data-testid="agent-log-viewer">
<div className="agent-log-loading">Loading agent logs</div>
</div>
);
}
if (entries.length === 0) {
return (
<div className="agent-log-viewer" data-testid="agent-log-viewer">
<div className="agent-log-empty">No agent output yet.</div>
</div>
);
}
// Reverse entries so newest appear first
const reversedEntries = [...entries].reverse();
const reversedEntryKeys = [...chronologicalEntryKeys].reverse();
const hasExecutorOverride = executorModel?.provider && executorModel?.modelId;
const hasValidatorOverride = validatorModel?.provider && validatorModel?.modelId;
const hasPlanningOverride = planningModel?.provider && planningModel?.modelId;
@@ -242,6 +222,26 @@ export function AgentLogViewer({
planningModel,
]);
if (loading && entries.length === 0) {
return (
<div className="agent-log-viewer" data-testid="agent-log-viewer">
<div className="agent-log-loading">Loading agent logs</div>
</div>
);
}
if (entries.length === 0) {
return (
<div className="agent-log-viewer" data-testid="agent-log-viewer">
<div className="agent-log-empty">No agent output yet.</div>
</div>
);
}
// Reverse entries so newest appear first
const reversedEntries = [...entries].reverse();
const reversedEntryKeys = [...chronologicalEntryKeys].reverse();
return (
<div
ref={containerRef}

View File

@@ -36,6 +36,19 @@ describe("AgentLogViewer", () => {
expect(screen.getByText("No agent output yet.")).toBeTruthy();
});
it("rerenders from empty state to populated logs without changing hook order", () => {
const consoleErrorSpy = vi.spyOn(console, "error").mockImplementation(() => {});
const entry = makeEntry({ text: "streamed chunk" });
const { rerender } = render(<AgentLogViewer entries={[]} loading={false} />);
expect(() => {
rerender(<AgentLogViewer entries={[entry]} loading={false} />);
}).not.toThrow();
expect(screen.getByText("streamed chunk")).toBeTruthy();
consoleErrorSpy.mockRestore();
});
it("renders text entries as spans in reverse order (newest first)", () => {
const entries = [
makeEntry({ text: "first chunk" }),