Add read-only Noya admin panel with assignments and UX polish.

Ship admin auth, user overview, assessments, chats, assignment filters/export, security hardening, and a separate desktop admin shell with clearer assessment answers.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
ar.badiei
2026-09-21 08:00:24 +03:30
co-authored by Cursor
parent 8016b8f45e
commit c6243caa35
104 changed files with 15654 additions and 415 deletions
+8 -8
View File
@@ -102,7 +102,7 @@ const checks = {
unknownAnswerExample: prompt.includes('نمی‌دانم'),
// Teaching style — section-end questions
sectionEndQuestion: prompt.includes('در مورد مطالبی که تا اینجا گفتیم، سؤالی دارید؟'),
sectionEndQuestion: prompt.includes('تا اینجا چیزی که گفتم، سؤالی داری؟'),
sectionEndNaturalBoundaries: prompt.includes('natural section boundaries'),
// Session 1 — no previous session
@@ -132,9 +132,11 @@ const checks = {
// Teaching style — message formatting
messageFormatting: prompt.includes('MESSAGE FORMATTING'),
chatgptLayout: prompt.includes('Write like ChatGPT'),
shortParagraphs: prompt.includes('1–2 short sentences per paragraph'),
occasionalEmoji: prompt.includes('EMOJI / STICKER-LIKE EXPRESSIONS'),
emojiHardLimit: prompt.includes('0–1 emoji per message'),
numberedListFormatting: prompt.includes('numbered list'),
numberedListFormatting: prompt.includes('numbered list') || prompt.includes('numbered ۱'),
boldKeyPhrases: prompt.includes('double asterisks'),
headingOwnLine: prompt.includes('OWN separate line'),
headingNumberedFirstTime: prompt.includes('FIRST time you introduce a section title'),
@@ -142,7 +144,7 @@ const checks = {
noVisibleHash: prompt.includes('NEVER show # ## ###'),
noVisibleAt: prompt.includes('NEVER show @ mentions'),
standardPersianPunctuation: prompt.includes('STANDARD PERSIAN PUNCTUATION'),
justifyFriendlyParagraphs: prompt.includes('justified'),
justifyFriendlyParagraphs: prompt.includes('justified') || prompt.includes('Write like ChatGPT'),
neverGenerateImages: prompt.includes('NEVER generate, attach, draw, or request images'),
formattingDoesNotChangeContent: prompt.includes('MUST NOT add, remove, or change educational content'),
formattingDoesNotChangeOrder: prompt.includes('MUST NOT change the teaching order'),
@@ -164,15 +166,13 @@ const checks = {
// Session start cue
startCue: COACH_SESSION_START_CUE.includes('[SESSION_START]'),
startCueEducationalPackage: COACH_SESSION_START_CUE.includes('introduce the overall educational package'),
startCueNoPreviousSession: COACH_SESSION_START_CUE.includes('Do NOT review a previous session'),
startCueEducationalPackage: COACH_SESSION_START_CUE.includes('بسته آموزشی مثبت‌نگر ایرانی ـ اسلامی'),
startCueInformalTone: COACH_SESSION_START_CUE.includes('informal colloquial Persian'),
startCueGrounding: COACH_SESSION_START_CUE.includes('Do not invent missing details'),
startCueNoAssessment: COACH_SESSION_START_CUE.includes('Do NOT administer or invent any psychological assessment'),
startCueNoAssessment: COACH_SESSION_START_CUE.includes('or assessments'),
startCueNoTopicChoice: COACH_SESSION_START_CUE.includes('Do not ask the user to choose topics'),
startCueNoOverQuestion: COACH_SESSION_START_CUE.includes('Do not over-question'),
startCueIranianIslamic: COACH_SESSION_START_CUE.includes('بسته آموزشی مثبت‌نگر ایرانی ـ اسلامی'),
startCueLivedExamples: COACH_SESSION_START_CUE.includes('lived examples'),
startCueStayOnPath: COACH_SESSION_START_CUE.includes('Stay on the educational path'),
startCueNeverPretest: COACH_SESSION_START_CUE.includes('NEVER mention پیش‌آزمون'),
startCueNoSpouse: COACH_SESSION_START_CUE.includes('NEVER ask about همسر'),