CognxSafeTrack commited on
Commit ·
c1cf9c6
1
Parent(s): b80a3ef
fix(progression): atomic logic inversion and command unlocking
Browse files
apps/api/src/services/ai/index.ts
CHANGED
|
@@ -319,6 +319,7 @@ class AIService {
|
|
| 319 |
- Tu NE DOIS PLUS JAMAIS demander à l'utilisateur de s'expliquer davantage (ex: "Quel est l'âge exact ?", "Combien gagnes-tu ?").
|
| 320 |
- S'il manque un détail mais que l'idée est claire, c'est TOI qui apportes le savoir (donne les tranches d'âges classiques du secteur, donne les revenus moyens du pays).
|
| 321 |
- Tu es là pour ENRICHIR sa vision, pas pour lui faire passer un interrogatoire. Ne pose AUCUNE question bloquante à la fin.
|
|
|
|
| 322 |
|
| 323 |
INVITATION DEEP-DIVE OBLIGATOIRE :
|
| 324 |
${hasQuestion ? `L'utilisateur ayant posé une question, tu DOIS systématiquement proposer l'option d'approfondissement pour explorer des alternatives stratégiques.` : ''}
|
|
|
|
| 319 |
- Tu NE DOIS PLUS JAMAIS demander à l'utilisateur de s'expliquer davantage (ex: "Quel est l'âge exact ?", "Combien gagnes-tu ?").
|
| 320 |
- S'il manque un détail mais que l'idée est claire, c'est TOI qui apportes le savoir (donne les tranches d'âges classiques du secteur, donne les revenus moyens du pays).
|
| 321 |
- Tu es là pour ENRICHIR sa vision, pas pour lui faire passer un interrogatoire. Ne pose AUCUNE question bloquante à la fin.
|
| 322 |
+
- **CRITÈRE DE VALIDATION (isQualified)** : Dès que l'utilisateur fournit une réponse sérieuse liée à son projet (même courte), mets 'isQualified: true'. Ne sois pas trop sévère. S'il y a un doute, valide et enrichis dans ton feedback.
|
| 323 |
|
| 324 |
INVITATION DEEP-DIVE OBLIGATOIRE :
|
| 325 |
${hasQuestion ? `L'utilisateur ayant posé une question, tu DOIS systématiquement proposer l'option d'approfondissement pour explorer des alternatives stratégiques.` : ''}
|
apps/api/src/services/whatsapp.ts
CHANGED
|
@@ -361,9 +361,14 @@ export class WhatsAppService {
|
|
| 361 |
where: { userId_trackId: { userId: user.id, trackId: activeEnrollment.trackId } }
|
| 362 |
});
|
| 363 |
|
| 364 |
-
//
|
| 365 |
-
|
| 366 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 367 |
await scheduleMessage(user.id, user.language === 'WOLOF'
|
| 368 |
? "Dafa laaj nga tontu laaj bi ci kaw dëbb (audio walla texte) balaa nga dem ci kanam ! 🎙️"
|
| 369 |
: "Tu dois d'abord répondre à l'exercice ci-dessus pour continuer ! 🎙️"
|
|
@@ -394,13 +399,26 @@ export class WhatsAppService {
|
|
| 394 |
where: { userId_trackId: { userId: user.id, trackId: activeEnrollment.trackId } }
|
| 395 |
});
|
| 396 |
|
| 397 |
-
|
| 398 |
-
|
| 399 |
-
|
| 400 |
-
|
| 401 |
-
|
| 402 |
-
});
|
| 403 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 404 |
await scheduleMessage(user.id, user.language === 'WOLOF'
|
| 405 |
? "Baax na ! Wax ma ndox mi nga yor ci sa mbir (njëg, jafe-jafe, njëgëndal, njàngat, etc.) ngir ma gën a deesi njàngat bi :"
|
| 406 |
: "Très bien ! Quelle information précise issue de ton terrain veux-tu ajouter ? (ex: un prix précis, un obstacle, un fournisseur, etc.) :"
|
|
|
|
| 361 |
where: { userId_trackId: { userId: user.id, trackId: activeEnrollment.trackId } }
|
| 362 |
});
|
| 363 |
|
| 364 |
+
// 🚨 UNBLOCKING GUARD: Allow SUITE if a response has been recorded for the current day OR if status is valid.
|
| 365 |
+
const lastResponse = await prisma.response.findFirst({
|
| 366 |
+
where: { userId: user.id, dayNumber: activeEnrollment.currentDay },
|
| 367 |
+
orderBy: { createdAt: 'desc' }
|
| 368 |
+
});
|
| 369 |
+
|
| 370 |
+
if (userProgress?.exerciseStatus !== 'COMPLETED' && userProgress?.exerciseStatus !== 'PENDING_DEEPDIVE' && !lastResponse) {
|
| 371 |
+
console.log(`[SUITE-BLOCKED] User ${user.id} tried SUITE but status is ${userProgress?.exerciseStatus || 'null'} and no response found.`);
|
| 372 |
await scheduleMessage(user.id, user.language === 'WOLOF'
|
| 373 |
? "Dafa laaj nga tontu laaj bi ci kaw dëbb (audio walla texte) balaa nga dem ci kanam ! 🎙️"
|
| 374 |
: "Tu dois d'abord répondre à l'exercice ci-dessus pour continuer ! 🎙️"
|
|
|
|
| 399 |
where: { userId_trackId: { userId: user.id, trackId: activeEnrollment.trackId } }
|
| 400 |
});
|
| 401 |
|
| 402 |
+
// 🚨 UNBLOCKING GUARD: Allow 1/APPROFONDIR if a response exists.
|
| 403 |
+
const lastResponse = await prisma.response.findFirst({
|
| 404 |
+
where: { userId: user.id, dayNumber: activeEnrollment.currentDay },
|
| 405 |
+
orderBy: { createdAt: 'desc' }
|
| 406 |
+
});
|
|
|
|
| 407 |
|
| 408 |
+
if (userProgress?.exerciseStatus === 'COMPLETED' || (userProgress?.exerciseStatus === 'PENDING' && lastResponse)) {
|
| 409 |
+
// Force state transition if it was stuck
|
| 410 |
+
if (userProgress?.exerciseStatus === 'PENDING') {
|
| 411 |
+
await prisma.userProgress.update({
|
| 412 |
+
where: { id: userProgress.id },
|
| 413 |
+
data: { exerciseStatus: 'PENDING_DEEPDIVE' }
|
| 414 |
+
});
|
| 415 |
+
} else {
|
| 416 |
+
await prisma.userProgress.update({
|
| 417 |
+
where: { id: userProgress.id },
|
| 418 |
+
data: { exerciseStatus: 'PENDING_DEEPDIVE' }
|
| 419 |
+
});
|
| 420 |
+
}
|
| 421 |
+
|
| 422 |
await scheduleMessage(user.id, user.language === 'WOLOF'
|
| 423 |
? "Baax na ! Wax ma ndox mi nga yor ci sa mbir (njëg, jafe-jafe, njëgëndal, njàngat, etc.) ngir ma gën a deesi njàngat bi :"
|
| 424 |
: "Très bien ! Quelle information précise issue de ton terrain veux-tu ajouter ? (ex: un prix précis, un obstacle, un fournisseur, etc.) :"
|