// ACC-2 and ACC-11 on the hosted site: Try a fictional patient needs no account and no shared
// password. Each browser gets a random demo id (it only keeps one browser's drafts apart), and
// the demo reads only the fictional patients' own records, with the local reader.
import { randomUUID } from "node:crypto";
import { CASES } from "./cases";
import { ModelError } from "./model-runtime";
const COOKIE = "__Host-marmar-context-demo";
const TTL = 2 * 60 * 60;
const FICTIONAL = new Set(CASES.flatMap((c) => c.sources.map((s) => s.text)));
/** The browser's demo id, and the cookie to set when it is new. */
export function demoOwner(request: Request): { owner: string; setCookie: string | null } {
const token = request.headers
.get("Cookie")
?.split(";")
.map((x) => x.trim())
.find((x) => x.startsWith(COOKIE + "="))
?.slice(COOKIE.length + 1);
if (token && /^[a-f0-9-]{36}$/.test(token)) return { owner: `demo-${token}`, setCookie: null };
const id = randomUUID();
return { owner: `demo-${id}`, setCookie: `${COOKIE}=${id}; Secure; HttpOnly; SameSite=Strict; Path=/; Max-Age=${TTL}` };
}
/** Only the fictional patients' records, never pasted or real text, and never the model. */
export function demoOnly(sources: { text: string; clarification?: unknown }[], useModel = false) {
if (useModel) throw new ModelError("Try a fictional patient uses the local reader only. No model is called.", 403);
if (!sources.every((s) => !s.clarification && FICTIONAL.has(s.text)))
throw new ModelError("Try a fictional patient reads the fictional patients' records only.", 403);
}