The reported bug (2026-09-28): every chat ran glm-5.3-flash regardless of any pick, while composer and settings UIs agreed with each other and lied about the run. Root cause: a fossil default-settings record (settings.json chat section, frozen pre-slots-wave) was stamped verbatim into every new chat at birth by the new-session flow, and resolveConversationSpec prefers the per-chat record over the strong slot forever. Owner redesign — models are per session, always; the strong slot is the new-session default: - POST /api/chats stamps the newborn verbatim from the strong slot (model + thinking level); no client settings PUT on create anymore - the composer control is dual-bound: in-session it reads/writes the session's own record (GET /api/chats/:id, PUT .../settings); on the draft surfaces it binds the strong slot (picking there = changing the default) - thinking levels follow the identical mechanics (confirmed by owner) - the zombie default-settings system dies whole: useDefaultSettings, /api/settings/defaults, src/store/default-settings.ts, the chat section of UserSettings (sanitizer strips fossil copies), the legacy default-settings.json fold, and DEFAULT_SETTINGS_FILE - catalogDefaultsFor collapses to the strong slot alone - thinking display for a legacy unstamped session resolves exactly like the engine (session ?? strong ?? model ladder) Tests: new chat-birth-stamp suite pins the stamp, the unconfigured boot, the unset level, and the copy-not-live-view regression; defaults pins rewritten strong-only; legacy-migration suite deleted.
23 lines
921 B
TypeScript
23 lines
921 B
TypeScript
import { NewSession } from "@/components/new-session";
|
|
import { readSettingsRecord } from "@/src/server";
|
|
import { slotsConfigured } from "@/src/core";
|
|
|
|
export const dynamic = "force-dynamic";
|
|
|
|
/**
|
|
* The draft view behind "+ New session" (owner, 2026-09-13): NO session is
|
|
* created until the first message is sent — the view is a sessionless empty
|
|
* chat; on send it creates the chat (title = that message) and redirects to
|
|
* the real page, whose initialPrompt path delivers the message as turn 1.
|
|
* Static segment beats the dynamic [id] route — "new" is never a chat id.
|
|
*
|
|
* The draft's model control binds the STRONG SLOT (the new-session
|
|
* default); the session the first send creates is stamped from it
|
|
* server-side (per-session models, owner 2026-09-28).
|
|
*/
|
|
export default function NewSessionPage() {
|
|
return (
|
|
<NewSession initialConfigured={slotsConfigured(readSettingsRecord()?.models)} />
|
|
);
|
|
}
|