Shared personas
-diff --git a/README.md b/README.md index c701a3f..32617e1 100644 --- a/README.md +++ b/README.md @@ -91,3 +91,20 @@ Pure chat message, retry, memory, summary, and persona-state formatting lives in - [Privacy Policy](PRIVACY_POLICY.md) - [Terms of Service](TERMS_OF_SERVICE.md) + +## Page navigation + +- `/` is the public landing page, even for signed-in visitors. +- `/login` and `/register` provide dedicated account forms. Registration starts a session automatically. +- `/app` is workspace home, with recent chats and optional starters. +- `/app/chats/new` opens an empty composer; sending the first message creates the conversation. +- `/app/chats/:id` opens a conversation. Legacy `/?chat=:id` links redirect here. +- `/app/personas` provides persona management, using the shared settings editor module. +- `/app/settings` contains account and appearance settings. `/settings` redirects here. +- `/market` allows visitors to browse public summaries and signed-in users to use the full persona market. + +Protected pages redirect to sign-in with a local return destination. Public discovery only returns published persona summaries; using a persona requires an account. + +All page routes render the same navigation from `src/pageLayout.js` into the `` placeholder. `public/shell.css` owns the shared header, page spacing, and mobile navigation; `public/app/workspaceNavigation.js` owns sign-out. Page-specific headers contain only local titles and actions. The chat sidebar is reserved for conversation history. Public and home content share `public/pages.css` and `public/pages.js`. Page routes run before static assets and authenticated API routers; rendered pages use private, non-cacheable responses. + +For environments that block child-process test workers, run `node --test --test-isolation=none`. diff --git a/public/app/constants.js b/public/app/constants.js index cda0318..53e03e1 100644 --- a/public/app/constants.js +++ b/public/app/constants.js @@ -1,4 +1,4 @@ -export const requestedChatId = Number(new URLSearchParams(window.location.search).get("chat")) || null; +export const requestedChatId = Number(window.location.pathname.match(/^\/app\/chats\/(\d+)$/)?.[1] || new URLSearchParams(window.location.search).get("chat")) || null; export const onboardingPrompts = { ask: ["Explain this topic in simple terms.", "Compare these options and recommend one."], diff --git a/public/app/dom.js b/public/app/dom.js index c8114a2..9669391 100644 --- a/public/app/dom.js +++ b/public/app/dom.js @@ -1,9 +1,6 @@ const $ = (id) => document.getElementById(id); -const authDiv = $("auth"); const chatDiv = $("chat"); -const authMsg = $("authMsg"); -const logoutButton = $("logout"); const messagesDiv = $("messages"); const modelSelect = $("model"); const modelPanel = $("modelPanel"); @@ -20,18 +17,8 @@ const chatResponseLengthInput = $("chatResponseLength"); const chatSystemInstructionInput = $("chatSystemInstruction"); const saveGenerationSettingsBtn = $("saveGenerationSettings"); const chatDrawerPersonaValue = $("chatDrawerPersonaValue"); -const loginForm = $("loginForm"); -const registerForm = $("registerForm"); const msgInput = $("msgInput"); const sendBtn = $("send"); -const loginUsernameInput = $("loginUsername"); -const loginPasswordInput = $("loginPassword"); -const registerUsernameInput = $("registerUsername"); -const registerPasswordInput = $("registerPassword"); -const registerInviteField = $("registerInviteField"); -const registerInviteCodeInput = $("registerInviteCode"); -const loginSubmit = $("loginSubmit"); -const registerSubmit = $("registerSubmit"); const chatList = $("chatList"); const chatSearchInput = $("chatSearch"); const chatSidebar = $("chatSidebar"); @@ -54,7 +41,6 @@ const backupWorkspaceBtn = $("backupWorkspace"); const importWorkspaceBtn = $("importWorkspace"); const importWorkspaceFileInput = $("importWorkspaceFile"); const activeChatTitle = $("activeChatTitle"); -const sessionUser = $("sessionUser"); const chatActivityOverlay = $("chatActivityOverlay"); const chatActivityEyebrow = $("chatActivityEyebrow"); const chatActivityTitle = $("chatActivityTitle"); @@ -110,8 +96,6 @@ const onboardingChoices = $("onboardingChoices"); const onboardingBack = $("onboardingBack"); const onboardingContinue = $("onboardingContinue"); const onboardingSkip = $("onboardingSkip"); -const authScreens = document.querySelectorAll(".auth-screen"); -const toggleButtons = document.querySelectorAll(".auth-toggle .toggle"); const brandNameTargets = document.querySelectorAll("[data-brand-name]"); const brandLogoTargets = document.querySelectorAll("[data-brand-logo]"); const modelSection = document.querySelector(".chat-drawer-section--model"); @@ -121,9 +105,6 @@ export { $, activeChatTitle, activeUserPersonaStatus, - authDiv, - authMsg, - authScreens, chatActivityDetail, chatActivityEyebrow, chatActivityOverlay, @@ -156,11 +137,6 @@ export { backupWorkspaceBtn, importWorkspaceBtn, importWorkspaceFileInput, - loginForm, - loginPasswordInput, - loginSubmit, - loginUsernameInput, - logoutButton, messagesDiv, modelBadgeName, headerModelName, @@ -206,12 +182,6 @@ export { popupInputLabel, popupModal, popupTitle, - registerForm, - registerInviteCodeInput, - registerInviteField, - registerPasswordInput, - registerSubmit, - registerUsernameInput, renameChatBtn, roleplayCharacterSelect, roleplayNewPersonaBtn, @@ -230,9 +200,7 @@ export { roleplayUserPersonaSelect, sendBtn, saveGenerationSettingsBtn, - sessionUser, brandLogoTargets, brandNameTargets, - toggleButtons, userPersonaList }; diff --git a/public/index.html b/public/index.html deleted file mode 100644 index a10e550..0000000 --- a/public/index.html +++ /dev/null @@ -1,431 +0,0 @@ - - -
- - -Your conversation space
-A space for every conversation.
-Shared personas
-