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:
Gitead
2026-05-09 15:23:55 -04:00
parent e9296c68f9
commit 112529155c
321 changed files with 5096 additions and 446 deletions

View File

@@ -29,6 +29,7 @@ export * from './enums/OfficeHoursScalarFieldEnum.schema'
export * from './enums/OfficeContactScalarFieldEnum.schema'
export * from './enums/InsuranceContactScalarFieldEnum.schema'
export * from './enums/ProcedureTimeslotScalarFieldEnum.schema'
export * from './enums/PatientConversationScalarFieldEnum.schema'
export * from './enums/SortOrder.schema'
export * from './enums/NullableJsonNullValueInput.schema'
export * from './enums/JsonNullValueInput.schema'
@@ -557,6 +558,23 @@ export * from './updateManyAndReturnProcedureTimeslot.schema'
export * from './upsertOneProcedureTimeslot.schema'
export * from './aggregateProcedureTimeslot.schema'
export * from './groupByProcedureTimeslot.schema'
export * from './findUniquePatientConversation.schema'
export * from './findUniqueOrThrowPatientConversation.schema'
export * from './findFirstPatientConversation.schema'
export * from './findFirstOrThrowPatientConversation.schema'
export * from './findManyPatientConversation.schema'
export * from './countPatientConversation.schema'
export * from './createOnePatientConversation.schema'
export * from './createManyPatientConversation.schema'
export * from './createManyAndReturnPatientConversation.schema'
export * from './deleteOnePatientConversation.schema'
export * from './deleteManyPatientConversation.schema'
export * from './updateOnePatientConversation.schema'
export * from './updateManyPatientConversation.schema'
export * from './updateManyAndReturnPatientConversation.schema'
export * from './upsertOnePatientConversation.schema'
export * from './aggregatePatientConversation.schema'
export * from './groupByPatientConversation.schema'
export * from './results/UserFindUniqueResult.schema'
export * from './results/UserFindFirstResult.schema'
export * from './results/UserFindManyResult.schema'
@@ -947,6 +965,19 @@ export * from './results/ProcedureTimeslotDeleteManyResult.schema'
export * from './results/ProcedureTimeslotAggregateResult.schema'
export * from './results/ProcedureTimeslotGroupByResult.schema'
export * from './results/ProcedureTimeslotCountResult.schema'
export * from './results/PatientConversationFindUniqueResult.schema'
export * from './results/PatientConversationFindFirstResult.schema'
export * from './results/PatientConversationFindManyResult.schema'
export * from './results/PatientConversationCreateResult.schema'
export * from './results/PatientConversationCreateManyResult.schema'
export * from './results/PatientConversationUpdateResult.schema'
export * from './results/PatientConversationUpdateManyResult.schema'
export * from './results/PatientConversationUpsertResult.schema'
export * from './results/PatientConversationDeleteResult.schema'
export * from './results/PatientConversationDeleteManyResult.schema'
export * from './results/PatientConversationAggregateResult.schema'
export * from './results/PatientConversationGroupByResult.schema'
export * from './results/PatientConversationCountResult.schema'
export * from './results/index'
export * from './objects/index'
export * from './variants/pure/User.pure'
@@ -979,6 +1010,7 @@ export * from './variants/pure/OfficeHours.pure'
export * from './variants/pure/OfficeContact.pure'
export * from './variants/pure/InsuranceContact.pure'
export * from './variants/pure/ProcedureTimeslot.pure'
export * from './variants/pure/PatientConversation.pure'
export * from './variants/pure/index'
export * from './variants/input/User.input'
export * from './variants/input/Patient.input'
@@ -1010,6 +1042,7 @@ export * from './variants/input/OfficeHours.input'
export * from './variants/input/OfficeContact.input'
export * from './variants/input/InsuranceContact.input'
export * from './variants/input/ProcedureTimeslot.input'
export * from './variants/input/PatientConversation.input'
export * from './variants/input/index'
export * from './variants/result/User.result'
export * from './variants/result/Patient.result'
@@ -1041,5 +1074,6 @@ export * from './variants/result/OfficeHours.result'
export * from './variants/result/OfficeContact.result'
export * from './variants/result/InsuranceContact.result'
export * from './variants/result/ProcedureTimeslot.result'
export * from './variants/result/PatientConversation.result'
export * from './variants/result/index'
export * from './variants/index'