// A persona is "project-scoped" when it declares requires_folder: an explicit directory the // user picks, sessions grouped by project in the sidebar. Everything else runs on a transparent // per-conversation scratch dir, with real folders added as roots when needed — no folder gate. // (The old family/workspace-enum pair collapsed into this trait; workspace-scratch-design.md.) export function isProjectScoped(p?: { requires_folder?: boolean }): boolean { return p?.requires_folder === true; } // Persona naming: the product is "OpenWorker"; the personas are a "Coworker" family — Coworker // (general), Code Coworker, Ops Coworker. In lists/chrome we use the SHORT label (Coworker / Code / // Ops); the persona detail page uses the FULL family name. Backend names are left untouched (the // API + tests keep "OpenWorker" / "Ops Coworker"); this is purely the display layer. // Short label for the sidebar + top bar: "Coworker" / "Code" / "Ops" / "Chat". export function shortPersonaName(name?: string, id?: string): string { if (id === "cowork") return "Coworker"; const n = (name || id || "").trim(); return n.replace(/\s*coworker$/i, "").trim() || n; } // Full family name for the persona detail page: "Coworker" / "Code Coworker" / "Ops Coworker". // Chat isn't a coworker — left as-is. export function fullPersonaName(name?: string, id?: string): string { if (id === "cowork") return "Coworker"; const n = (name || id || "").trim(); if (id === "chat" || !n) return n; return /coworker$/i.test(n) ? n : `${n} Coworker`; }