feat(shell): yellow active session, growing composer, phase title, refined activity log, arrow panel toggle

Fix six GUI defects, verified live against the real stack:

- NavSessions: mark the in-progress (active) session in yellow (warning
  token) — both its status dot and its row background.
- SteerInput: the composer is now an auto-growing textarea that wraps and
  grows vertically (caps at 160px, then scrolls); Enter sends, Shift+Enter
  inserts a newline.
- WorkflowBar: show a synthetic title of the current phase under the 8 dots
  from static EN/IT strings (no LLM); English is displayed to match the chrome.
- CentralStatus: reformat the 5-line system-message tail as a structured,
  monospace list with per-line markers and an emphasized last line.
- AppShell + CentralStatus: move the left Model-activity panel toggle off the
  working spinner (now a pure status indicator) onto a dedicated arrow button
  (→ opens, ← closes).
- gate: rename the phase-confirm button "Conferma e prosegui" → "Salva e
  procedi" (builders.js + its L1 test).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-04 14:32:01 +02:00
co-authored by Claude Opus 4.8
parent 1f9818c50f
commit d6b4729ddf
8 changed files with 132 additions and 59 deletions
+6 -7
View File
@@ -1,17 +1,16 @@
import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { beforeEach, vi } from "vitest";
import { beforeEach } from "vitest";
import { useSessionStore } from "../store/sessionStore";
import { CentralStatus } from "./CentralStatus";
beforeEach(() => useSessionStore.getState().resetSession());
test("the working activity icon opens the model-activity panel", async () => {
const onOpenActivity = vi.fn();
test("the working spinner is a pure status indicator (no activity toggle on it)", () => {
useSessionStore.getState().applyEvent({ type: "text_delta", text: "reading the schema" });
render(<CentralStatus working onOpenActivity={onOpenActivity} />);
await userEvent.click(screen.getByRole("button", { name: /model activity/i }));
expect(onOpenActivity).toHaveBeenCalledTimes(1);
render(<CentralStatus working />);
// The spinner no longer opens the panel — that moved to the header arrow toggle.
expect(screen.queryByRole("button", { name: /model activity/i })).not.toBeInTheDocument();
expect(screen.getByRole("status")).toBeInTheDocument();
});
test("renders nothing when not working and there is no user entry or step messages", () => {