feat: persist AI conversation state in DB and fix LangGraph flow bugs
- Replace in-memory Maps in aiHandoffStore with DB-backed async functions using new patient_conversation table (stage + aiHandoff per patient) - Add afterHoursEnabled to ai_settings table (persists across restarts) - Fix runtime crash in reschedule-graph: mon/tue/wed variables were out of scope in the next-week fallback branch (ReferenceError) - Wire rescheduleGreeting and generalFallback chat templates through to LangGraph nodes so user-configured messages take effect - Add otherNode to reminder-graph to handle unclassified patient replies (e.g. "I want another appointment") and route to booking flow - Fetch chatTemplates once per webhook request instead of per stage Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -421,7 +421,8 @@ exports.Prisma.TwilioSettingsScalarFieldEnum = {
|
||||
exports.Prisma.AiSettingsScalarFieldEnum = {
|
||||
id: 'id',
|
||||
userId: 'userId',
|
||||
apiKey: 'apiKey'
|
||||
apiKey: 'apiKey',
|
||||
afterHoursEnabled: 'afterHoursEnabled'
|
||||
};
|
||||
|
||||
exports.Prisma.OfficeHoursScalarFieldEnum = {
|
||||
@@ -455,6 +456,15 @@ exports.Prisma.ProcedureTimeslotScalarFieldEnum = {
|
||||
data: 'data'
|
||||
};
|
||||
|
||||
exports.Prisma.PatientConversationScalarFieldEnum = {
|
||||
id: 'id',
|
||||
patientId: 'patientId',
|
||||
userId: 'userId',
|
||||
stage: 'stage',
|
||||
aiHandoff: 'aiHandoff',
|
||||
updatedAt: 'updatedAt'
|
||||
};
|
||||
|
||||
exports.Prisma.SortOrder = {
|
||||
asc: 'asc',
|
||||
desc: 'desc'
|
||||
@@ -602,7 +612,8 @@ exports.Prisma.ModelName = {
|
||||
OfficeHours: 'OfficeHours',
|
||||
OfficeContact: 'OfficeContact',
|
||||
InsuranceContact: 'InsuranceContact',
|
||||
ProcedureTimeslot: 'ProcedureTimeslot'
|
||||
ProcedureTimeslot: 'ProcedureTimeslot',
|
||||
PatientConversation: 'PatientConversation'
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
2116
packages/db/generated/prisma/index.d.ts
vendored
2116
packages/db/generated/prisma/index.d.ts
vendored
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "prisma-client-15a1f883083e7bed207e0ace797742e2241c3e7ca8304117cb9604fe5f882a3f",
|
||||
"name": "prisma-client-841b8b7214f98d624249fcce8221ef527e6df11b7ccf3685b686d6606451965c",
|
||||
"main": "index.js",
|
||||
"types": "index.d.ts",
|
||||
"browser": "default.js",
|
||||
|
||||
@@ -43,6 +43,7 @@ model User {
|
||||
officeContact OfficeContact?
|
||||
procedureTimeslot ProcedureTimeslot?
|
||||
insuranceContacts InsuranceContact[]
|
||||
patientConversations PatientConversation[]
|
||||
}
|
||||
|
||||
model Patient {
|
||||
@@ -75,6 +76,7 @@ model Patient {
|
||||
payment Payment[]
|
||||
communications Communication[]
|
||||
documents PatientDocument[]
|
||||
conversation PatientConversation?
|
||||
|
||||
@@index([insuranceId])
|
||||
@@index([createdAt])
|
||||
@@ -572,9 +574,10 @@ model TwilioSettings {
|
||||
}
|
||||
|
||||
model AiSettings {
|
||||
id Int @id @default(autoincrement())
|
||||
userId Int @unique
|
||||
apiKey String
|
||||
id Int @id @default(autoincrement())
|
||||
userId Int @unique
|
||||
apiKey String
|
||||
afterHoursEnabled Boolean @default(true)
|
||||
|
||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@ -627,3 +630,17 @@ model ProcedureTimeslot {
|
||||
|
||||
@@map("procedure_timeslot")
|
||||
}
|
||||
|
||||
model PatientConversation {
|
||||
id Int @id @default(autoincrement())
|
||||
patientId Int @unique
|
||||
userId Int
|
||||
stage String @default("initial")
|
||||
aiHandoff Boolean @default(true)
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
patient Patient @relation(fields: [patientId], references: [id], onDelete: Cascade)
|
||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@map("patient_conversation")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user