@edvak99/voice-receptionist-widget 1.1.2 → 1.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/README.md +3 -0
  2. package/fesm2022/edvak99-voice-receptionist-widget-activities-page.component-DT9UKvQO.mjs +307 -0
  3. package/fesm2022/edvak99-voice-receptionist-widget-activities-page.component-DT9UKvQO.mjs.map +1 -0
  4. package/fesm2022/{edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-CMhknpGf.mjs → edvak99-voice-receptionist-widget-ai-receptionist-api.service-48cifVPF.mjs} +1351 -579
  5. package/fesm2022/edvak99-voice-receptionist-widget-ai-receptionist-api.service-48cifVPF.mjs.map +1 -0
  6. package/fesm2022/edvak99-voice-receptionist-widget-analytics-page.component-C5inEHJw.mjs +278 -0
  7. package/fesm2022/edvak99-voice-receptionist-widget-analytics-page.component-C5inEHJw.mjs.map +1 -0
  8. package/fesm2022/edvak99-voice-receptionist-widget-call-history-detail-page.component-sYhM20CE.mjs +418 -0
  9. package/fesm2022/edvak99-voice-receptionist-widget-call-history-detail-page.component-sYhM20CE.mjs.map +1 -0
  10. package/fesm2022/edvak99-voice-receptionist-widget-call-history-page.component-DpwajEOE.mjs +194 -0
  11. package/fesm2022/edvak99-voice-receptionist-widget-call-history-page.component-DpwajEOE.mjs.map +1 -0
  12. package/fesm2022/{edvak99-voice-receptionist-widget-call-recording-player.component-AN6GcSDq.mjs → edvak99-voice-receptionist-widget-call-recording-player.component-CgkRcFOl.mjs} +5 -4
  13. package/fesm2022/{edvak99-voice-receptionist-widget-call-recording-player.component-AN6GcSDq.mjs.map → edvak99-voice-receptionist-widget-call-recording-player.component-CgkRcFOl.mjs.map} +1 -1
  14. package/fesm2022/{edvak99-voice-receptionist-widget-call-review.service-Cy_Bf7AO.mjs → edvak99-voice-receptionist-widget-call-review.service-CIMcjGKX.mjs} +2 -2
  15. package/fesm2022/{edvak99-voice-receptionist-widget-call-review.service-Cy_Bf7AO.mjs.map → edvak99-voice-receptionist-widget-call-review.service-CIMcjGKX.mjs.map} +1 -1
  16. package/fesm2022/edvak99-voice-receptionist-widget-call-review.util-Deh3jPgo.mjs +21 -0
  17. package/fesm2022/edvak99-voice-receptionist-widget-call-review.util-Deh3jPgo.mjs.map +1 -0
  18. package/fesm2022/edvak99-voice-receptionist-widget-dashboard-page.component-CxbO0eDS.mjs +440 -0
  19. package/fesm2022/edvak99-voice-receptionist-widget-dashboard-page.component-CxbO0eDS.mjs.map +1 -0
  20. package/fesm2022/{edvak99-voice-receptionist-widget-eds-elapsed.pipe-ouRlPpwT.mjs → edvak99-voice-receptionist-widget-dashboard-socket.service-BX91r74O.mjs} +5 -21
  21. package/fesm2022/edvak99-voice-receptionist-widget-dashboard-socket.service-BX91r74O.mjs.map +1 -0
  22. package/fesm2022/edvak99-voice-receptionist-widget-eds-avatar.component-CWRiJGfv.mjs +38 -0
  23. package/fesm2022/edvak99-voice-receptionist-widget-eds-avatar.component-CWRiJGfv.mjs.map +1 -0
  24. package/fesm2022/edvak99-voice-receptionist-widget-eds-button.component-Bg5T5BN8.mjs +27 -0
  25. package/fesm2022/edvak99-voice-receptionist-widget-eds-button.component-Bg5T5BN8.mjs.map +1 -0
  26. package/fesm2022/edvak99-voice-receptionist-widget-eds-elapsed.pipe-BFCiJOT3.mjs +22 -0
  27. package/fesm2022/edvak99-voice-receptionist-widget-eds-elapsed.pipe-BFCiJOT3.mjs.map +1 -0
  28. package/fesm2022/{edvak99-voice-receptionist-widget-live-calls-list.service-CDtFRW8w.mjs → edvak99-voice-receptionist-widget-eds-pulse-dot.component-BPY6xN7C.mjs} +15 -5
  29. package/fesm2022/edvak99-voice-receptionist-widget-eds-pulse-dot.component-BPY6xN7C.mjs.map +1 -0
  30. package/fesm2022/edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-BsBQIS_f.mjs +203 -0
  31. package/fesm2022/edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-BsBQIS_f.mjs.map +1 -0
  32. package/fesm2022/edvak99-voice-receptionist-widget-live-calls-page.component-CaSDMxpV.mjs +81 -0
  33. package/fesm2022/edvak99-voice-receptionist-widget-live-calls-page.component-CaSDMxpV.mjs.map +1 -0
  34. package/fesm2022/edvak99-voice-receptionist-widget-live-monitor-page.component-Cy3ND-c-.mjs +1070 -0
  35. package/fesm2022/edvak99-voice-receptionist-widget-live-monitor-page.component-Cy3ND-c-.mjs.map +1 -0
  36. package/fesm2022/edvak99-voice-receptionist-widget-modal.component-COfi7biN.mjs +48 -0
  37. package/fesm2022/edvak99-voice-receptionist-widget-modal.component-COfi7biN.mjs.map +1 -0
  38. package/fesm2022/edvak99-voice-receptionist-widget-outbound-purpose.util-Bdh4QfFe.mjs +127 -0
  39. package/fesm2022/edvak99-voice-receptionist-widget-outbound-purpose.util-Bdh4QfFe.mjs.map +1 -0
  40. package/fesm2022/edvak99-voice-receptionist-widget-outbound-purposes-page.component-fHVzpiVk.mjs +268 -0
  41. package/fesm2022/edvak99-voice-receptionist-widget-outbound-purposes-page.component-fHVzpiVk.mjs.map +1 -0
  42. package/fesm2022/edvak99-voice-receptionist-widget-settings-page.component-Bok64X2q.mjs +968 -0
  43. package/fesm2022/edvak99-voice-receptionist-widget-settings-page.component-Bok64X2q.mjs.map +1 -0
  44. package/fesm2022/edvak99-voice-receptionist-widget-tasks-page.component-Bb9lPcYi.mjs +317 -0
  45. package/fesm2022/edvak99-voice-receptionist-widget-tasks-page.component-Bb9lPcYi.mjs.map +1 -0
  46. package/fesm2022/{edvak99-voice-receptionist-widget-wizard-page.component-CJLa5pia.mjs → edvak99-voice-receptionist-widget-wizard-page.component-BZVlWLWh.mjs} +6 -4
  47. package/fesm2022/{edvak99-voice-receptionist-widget-wizard-page.component-CJLa5pia.mjs.map → edvak99-voice-receptionist-widget-wizard-page.component-BZVlWLWh.mjs.map} +1 -1
  48. package/fesm2022/edvak99-voice-receptionist-widget.mjs +1 -1
  49. package/lib/components/call-conversation-panel/call-conversation-panel.component.d.ts +9 -6
  50. package/lib/components/call-tasks-panel/call-tasks-panel.component.d.ts +8 -8
  51. package/lib/components/knowledge-test-modal/knowledge-test-modal.component.d.ts +28 -0
  52. package/lib/components/live-transcript-panel/live-transcript-panel.component.d.ts +7 -4
  53. package/lib/components/outbound-dial-modal/outbound-dial-modal.component.d.ts +26 -0
  54. package/lib/layout/eds-module-nav.component.d.ts +0 -3
  55. package/lib/mocks/agent-activity.seed.d.ts +2 -0
  56. package/lib/models/agent-activity.types.d.ts +54 -0
  57. package/lib/models/ai-receptionist.types.d.ts +26 -0
  58. package/lib/models/api-dto.types.d.ts +18 -0
  59. package/lib/models/live-transcript.types.d.ts +2 -1
  60. package/lib/models/outbound-patient.types.d.ts +23 -0
  61. package/lib/models/outbound-purpose.types.d.ts +2 -0
  62. package/lib/models/pagination.d.ts +11 -0
  63. package/lib/models/staff-media.types.d.ts +36 -0
  64. package/lib/pages/activities-page/activities-page.component.d.ts +57 -0
  65. package/lib/pages/analytics-page/analytics-page.component.d.ts +38 -14
  66. package/lib/pages/call-history-detail-page/call-history-detail-page.component.d.ts +2 -3
  67. package/lib/pages/call-history-page/call-history-page.component.d.ts +16 -9
  68. package/lib/pages/dashboard-page/dashboard-page.component.d.ts +12 -8
  69. package/lib/pages/live-calls-page/live-calls-page.component.d.ts +14 -24
  70. package/lib/pages/live-monitor-page/live-monitor-page.component.d.ts +34 -1
  71. package/lib/pages/settings-page/settings-fields.config.d.ts +16 -0
  72. package/lib/pages/settings-page/settings-page.component.d.ts +48 -14
  73. package/lib/pages/tasks-page/tasks-page.component.d.ts +6 -0
  74. package/lib/services/ai-receptionist-api.mock.d.ts +44 -9
  75. package/lib/services/ai-receptionist-api.service.d.ts +65 -10
  76. package/lib/services/live-transcript.service.d.ts +1 -0
  77. package/lib/services/staff-media.service.d.ts +52 -0
  78. package/lib/ui/eds-avatar.component.d.ts +5 -2
  79. package/lib/ui/eds-button.component.d.ts +1 -1
  80. package/lib/utils/call-history-display.util.d.ts +21 -0
  81. package/lib/utils/outbound-purpose.util.d.ts +19 -0
  82. package/lib/utils/transcript-timing.util.d.ts +1 -1
  83. package/lib/utils/welcome-message.util.d.ts +1 -1
  84. package/package.json +2 -1
  85. package/styles/_index.scss +5 -40
  86. package/styles/chat-ui.scss +18 -18
  87. package/styles/eds.scss +188 -119
  88. package/fesm2022/edvak99-voice-receptionist-widget-analytics-page.component-CW5OKmik.mjs +0 -113
  89. package/fesm2022/edvak99-voice-receptionist-widget-analytics-page.component-CW5OKmik.mjs.map +0 -1
  90. package/fesm2022/edvak99-voice-receptionist-widget-audit-page.component-DL1GfQyF.mjs +0 -35
  91. package/fesm2022/edvak99-voice-receptionist-widget-audit-page.component-DL1GfQyF.mjs.map +0 -1
  92. package/fesm2022/edvak99-voice-receptionist-widget-call-history-detail-page.component-CTwfUHUf.mjs +0 -316
  93. package/fesm2022/edvak99-voice-receptionist-widget-call-history-detail-page.component-CTwfUHUf.mjs.map +0 -1
  94. package/fesm2022/edvak99-voice-receptionist-widget-call-history-page.component-Cj4wxd4e.mjs +0 -138
  95. package/fesm2022/edvak99-voice-receptionist-widget-call-history-page.component-Cj4wxd4e.mjs.map +0 -1
  96. package/fesm2022/edvak99-voice-receptionist-widget-call-review.util-DQLIw7xb.mjs +0 -70
  97. package/fesm2022/edvak99-voice-receptionist-widget-call-review.util-DQLIw7xb.mjs.map +0 -1
  98. package/fesm2022/edvak99-voice-receptionist-widget-dashboard-page.component-DzdIt2A7.mjs +0 -248
  99. package/fesm2022/edvak99-voice-receptionist-widget-dashboard-page.component-DzdIt2A7.mjs.map +0 -1
  100. package/fesm2022/edvak99-voice-receptionist-widget-eds-avatar.component-PCnIWeOA.mjs +0 -27
  101. package/fesm2022/edvak99-voice-receptionist-widget-eds-avatar.component-PCnIWeOA.mjs.map +0 -1
  102. package/fesm2022/edvak99-voice-receptionist-widget-eds-elapsed.pipe-ouRlPpwT.mjs.map +0 -1
  103. package/fesm2022/edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-CMhknpGf.mjs.map +0 -1
  104. package/fesm2022/edvak99-voice-receptionist-widget-knowledge-hub.page-cZqBuull.mjs +0 -575
  105. package/fesm2022/edvak99-voice-receptionist-widget-knowledge-hub.page-cZqBuull.mjs.map +0 -1
  106. package/fesm2022/edvak99-voice-receptionist-widget-live-calls-list.service-CDtFRW8w.mjs.map +0 -1
  107. package/fesm2022/edvak99-voice-receptionist-widget-live-calls-page.component-DrYzXJQW.mjs +0 -115
  108. package/fesm2022/edvak99-voice-receptionist-widget-live-calls-page.component-DrYzXJQW.mjs.map +0 -1
  109. package/fesm2022/edvak99-voice-receptionist-widget-live-monitor-page.component-D7dlk0y2.mjs +0 -574
  110. package/fesm2022/edvak99-voice-receptionist-widget-live-monitor-page.component-D7dlk0y2.mjs.map +0 -1
  111. package/fesm2022/edvak99-voice-receptionist-widget-outbound-purpose.util-BQECIuJu.mjs +0 -54
  112. package/fesm2022/edvak99-voice-receptionist-widget-outbound-purpose.util-BQECIuJu.mjs.map +0 -1
  113. package/fesm2022/edvak99-voice-receptionist-widget-outbound-purposes-page.component-CJ8NEjcj.mjs +0 -265
  114. package/fesm2022/edvak99-voice-receptionist-widget-outbound-purposes-page.component-CJ8NEjcj.mjs.map +0 -1
  115. package/fesm2022/edvak99-voice-receptionist-widget-settings-page.component-Bo3XNK3b.mjs +0 -509
  116. package/fesm2022/edvak99-voice-receptionist-widget-settings-page.component-Bo3XNK3b.mjs.map +0 -1
  117. package/fesm2022/edvak99-voice-receptionist-widget-task.util-DdtI0CR3.mjs +0 -52
  118. package/fesm2022/edvak99-voice-receptionist-widget-task.util-DdtI0CR3.mjs.map +0 -1
  119. package/fesm2022/edvak99-voice-receptionist-widget-tasks-page.component-CBwl15NP.mjs +0 -237
  120. package/fesm2022/edvak99-voice-receptionist-widget-tasks-page.component-CBwl15NP.mjs.map +0 -1
  121. package/lib/knowledge/components/faq-empty-state/faq-empty-state.component.d.ts +0 -22
  122. package/lib/knowledge/components/faq-form/faq-form.component.d.ts +0 -27
  123. package/lib/knowledge/components/faq-search-tester/faq-search-tester.component.d.ts +0 -17
  124. package/lib/knowledge/mocks/practice-faq.seed.d.ts +0 -2
  125. package/lib/knowledge/models/practice-faq.model.d.ts +0 -47
  126. package/lib/knowledge/pages/knowledge-hub.page.d.ts +0 -47
  127. package/lib/knowledge/services/practice-faq-api.mock.d.ts +0 -16
  128. package/lib/knowledge/services/practice-faq-api.service.d.ts +0 -22
  129. package/lib/knowledge/utils/faq.util.d.ts +0 -3
  130. package/lib/layout/eds-topbar.component.d.ts +0 -29
  131. package/lib/pages/audit-page/audit-page.component.d.ts +0 -14
  132. package/lib/ui/eds-waveform.component.d.ts +0 -8
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edvak99-voice-receptionist-widget-settings-page.component-Bok64X2q.mjs","sources":["../../../projects/voice-receptionist-widget/src/lib/components/knowledge-test-modal/knowledge-test-modal.component.ts","../../../projects/voice-receptionist-widget/src/lib/components/knowledge-test-modal/knowledge-test-modal.component.html","../../../projects/voice-receptionist-widget/src/lib/services/agent-online.service.ts","../../../projects/voice-receptionist-widget/src/lib/pages/settings-page/tts-voice-presets.ts","../../../projects/voice-receptionist-widget/src/lib/pages/settings-page/settings-fields.config.ts","../../../projects/voice-receptionist-widget/src/lib/pages/settings-page/settings-page.component.ts","../../../projects/voice-receptionist-widget/src/lib/pages/settings-page/settings-page.component.html"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n inject,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { AiReceptionistApiService } from '../../services/ai-receptionist-api.service';\nimport { EdsButtonComponent } from '../../ui/eds-button.component';\nimport { EdsIconComponent } from '../../ui/eds-icon.component';\nimport { ModalComponent } from '../../shared/modal.component';\nimport { ToastService } from '../../shared/toast.service';\n\nconst QUESTION_MAX = 500;\n\n@Component({\n selector: 'eds-knowledge-test-modal',\n imports: [FormsModule, ModalComponent, EdsButtonComponent, EdsIconComponent],\n templateUrl: './knowledge-test-modal.component.html',\n styleUrl: './knowledge-test-modal.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class KnowledgeTestModalComponent implements OnChanges, OnDestroy {\n private readonly api = inject(AiReceptionistApiService);\n private readonly toast = inject(ToastService);\n\n @Input({ required: true }) open = false;\n @Input() whatToSay = '';\n @Input() whatNotToSay = '';\n @Input() voiceId = '';\n @Output() readonly closed = new EventEmitter<void>();\n\n protected readonly questionMax = QUESTION_MAX;\n protected readonly question = signal('');\n protected readonly testing = signal(false);\n protected readonly answer = signal<string | null>(null);\n protected readonly playing = signal(false);\n\n private audio: HTMLAudioElement | null = null;\n private objectUrl: string | null = null;\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['open'] && this.open) {\n this.question.set('');\n this.answer.set(null);\n this.stopAudio();\n }\n if (changes['open'] && !this.open) {\n this.stopAudio();\n }\n }\n\n ngOnDestroy(): void {\n this.stopAudio();\n }\n\n protected close(): void {\n this.stopAudio();\n this.closed.emit();\n }\n\n protected onQuestionChange(value: string): void {\n this.question.set(value.slice(0, QUESTION_MAX));\n }\n\n protected runTest(): void {\n const q = this.question().trim();\n if (!q || this.testing()) return;\n\n const whatToSay = this.whatToSay.trim();\n const whatNotToSay = this.whatNotToSay.trim();\n if (!whatToSay || !whatNotToSay) {\n this.toast.show(\n 'Fill in both “What to say” and “What not to say” before testing.',\n 'error',\n );\n return;\n }\n\n this.testing.set(true);\n this.answer.set(null);\n this.stopAudio();\n\n this.api\n .testKnowledgeAnswer({\n question: q,\n whatToSay,\n whatNotToSay,\n voiceId: this.voiceId.trim() || undefined,\n })\n .subscribe({\n next: (result) => {\n this.testing.set(false);\n this.answer.set(result.answer);\n this.playAudio(result.audioBlob);\n },\n error: (err: unknown) => {\n this.testing.set(false);\n const message =\n err instanceof Error && err.message.trim()\n ? err.message\n : 'Could not generate a test answer.';\n this.toast.show(message, 'error');\n },\n });\n }\n\n protected replay(): void {\n if (!this.audio) return;\n this.audio.currentTime = 0;\n this.playing.set(true);\n void this.audio.play().catch(() => {\n this.playing.set(false);\n this.toast.show('Could not play audio in this browser.', 'error');\n });\n }\n\n private playAudio(blob: Blob): void {\n this.stopAudio();\n this.objectUrl = URL.createObjectURL(blob);\n const audio = new Audio(this.objectUrl);\n this.audio = audio;\n this.playing.set(true);\n audio.onended = () => this.playing.set(false);\n audio.onerror = () => {\n this.playing.set(false);\n this.toast.show('Could not play audio in this browser.', 'error');\n };\n void audio.play().catch(() => {\n this.playing.set(false);\n this.toast.show('Could not play audio in this browser.', 'error');\n });\n }\n\n private stopAudio(): void {\n if (this.audio) {\n this.audio.pause();\n this.audio.onended = null;\n this.audio.onerror = null;\n this.audio = null;\n }\n if (this.objectUrl) {\n URL.revokeObjectURL(this.objectUrl);\n this.objectUrl = null;\n }\n this.playing.set(false);\n }\n}\n","@if (open) {\n <app-modal\n title=\"Test Knowledge Base\"\n subtitle=\"Ask a sample caller question — hear how the agent answers with your guidance and voice\"\n maxWidth=\"560px\"\n (closed)=\"close()\"\n >\n <form class=\"kb-test\" (ngSubmit)=\"runTest()\" novalidate autocomplete=\"off\">\n <label class=\"kb-test__field\">\n <span class=\"kb-test__label\">\n What might a caller ask? <span class=\"kb-test__req\">*</span>\n </span>\n <textarea\n class=\"kb-test__textarea\"\n rows=\"3\"\n [maxlength]=\"questionMax\"\n [ngModel]=\"question()\"\n (ngModelChange)=\"onQuestionChange($event)\"\n name=\"question\"\n placeholder=\"e.g. What are your Saturday hours? Is parking free?\"\n [disabled]=\"testing()\"\n autocomplete=\"off\"\n ></textarea>\n <span class=\"kb-test__hint\">{{ question().length }}/{{ questionMax }}</span>\n </label>\n\n @if (answer(); as spoken) {\n <div class=\"kb-test__answer\" role=\"status\">\n <div class=\"kb-test__answer-head\">\n <eds-icon name=\"graphic_eq\" [size]=\"18\" />\n <span>Agent reply</span>\n @if (playing()) {\n <span class=\"kb-test__playing\">Playing…</span>\n } @else {\n <button type=\"button\" class=\"kb-test__replay\" (click)=\"replay()\">\n Replay\n </button>\n }\n </div>\n <p class=\"kb-test__answer-text\">{{ spoken }}</p>\n </div>\n }\n\n <footer class=\"kb-test__actions\">\n <eds-button type=\"button\" variant=\"secondary\" (click)=\"close()\" [disabled]=\"testing()\">\n Close\n </eds-button>\n <eds-button type=\"submit\" variant=\"primary\" [disabled]=\"testing() || !question().trim()\">\n @if (testing()) {\n Generating…\n } @else {\n <eds-icon name=\"play_arrow\" [size]=\"18\" />\n Test\n }\n </eds-button>\n </footer>\n </form>\n </app-modal>\n}\n","import { Injectable, inject, signal } from '@angular/core';\nimport { catchError, finalize, of, switchMap, tap, throwError } from 'rxjs';\n\nimport { AiReceptionistApiService } from './ai-receptionist-api.service';\n\nexport type AgentOnlineKnownState = boolean | null;\n\n/**\n * Shared source of truth for Ava online/offline across topbar + module nav.\n * Always re-fetches GET /status after mutations.\n */\n@Injectable({ providedIn: 'root' })\nexport class AgentOnlineService {\n private readonly api = inject(AiReceptionistApiService);\n\n /** true = online, false = offline, null = unknown / not loaded */\n private readonly _online = signal<AgentOnlineKnownState>(null);\n private readonly _loading = signal(false);\n private readonly _toggling = signal(false);\n private readonly _error = signal<string | null>(null);\n private readonly _readiness = signal<number | null>(null);\n\n readonly online = this._online.asReadonly();\n readonly loading = this._loading.asReadonly();\n readonly toggling = this._toggling.asReadonly();\n readonly error = this._error.asReadonly();\n readonly readiness = this._readiness.asReadonly();\n\n refresh(): void {\n this._loading.set(true);\n this._error.set(null);\n this.api.getStatus().subscribe({\n next: ({ data }) => {\n this._online.set(data.agentOn);\n this._readiness.set(data.readiness);\n this._loading.set(false);\n },\n error: (err: { message?: string }) => {\n this._online.set(null);\n this._error.set(err.message ?? 'Could not load agent status.');\n this._loading.set(false);\n },\n });\n }\n\n /**\n * PUT /agent-online then re-fetch GET /status.\n */\n setOnline(enabled: boolean) {\n this._toggling.set(true);\n this._error.set(null);\n\n return this.api.setAgentOnline(enabled).pipe(\n switchMap(() =>\n this.api.getStatus().pipe(\n catchError((err: { message?: string }) => {\n this._error.set(err.message ?? 'Status refresh failed after toggle.');\n return of(null);\n }),\n ),\n ),\n tap((result) => {\n if (result) {\n this._online.set(result.data.agentOn);\n this._readiness.set(result.data.readiness);\n } else {\n // Toggle likely succeeded; use requested value until refresh works.\n this._online.set(enabled);\n }\n }),\n catchError((err: { message?: string }) => {\n this._error.set(err.message ?? 'Failed to update agent online status.');\n return throwError(() => err);\n }),\n finalize(() => this._toggling.set(false)),\n );\n }\n}\n","/** Curated ElevenLabs voices — keep in sync with backend `tts-voice-presets.ts`. */\n\nexport interface TtsVoicePreset {\n id: string;\n label: string;\n}\n\nexport const DEFAULT_TTS_VOICE_ID = '7EzWGsX10sAS4c9m9cPf';\n\nexport const TTS_VOICE_PRESETS: readonly TtsVoicePreset[] = [\n {\n id: '7EzWGsX10sAS4c9m9cPf',\n label: 'Jack John – Conversational and Upbeat',\n },\n {\n id: 'NUjosfEayZAdRcDmcHM8',\n label: 'Madison – Cool, Calm & Conversational',\n },\n {\n id: 'gE0owC0H9C8SzfDyIUtB',\n label: 'Ivanna – Sassy, Condescending and Clear',\n },\n {\n id: 'Uc7anshoV8mdBhDnEZEX',\n label: 'Cecily – Clear and Warm',\n },\n] as const;\n","import { AgentSettings } from '../../models/ai-receptionist.types';\nimport { TTS_VOICE_PRESETS } from './tts-voice-presets';\n\nexport type SettingsSection = Exclude<keyof AgentSettings, 'safety' | 'effectiveWelcomeMessage'>;\n\nexport interface SettingsFieldOption {\n value: string;\n label: string;\n}\n\nexport interface SettingsFieldMeta {\n key: string;\n label: string;\n description: string;\n type: 'text' | 'number' | 'boolean' | 'select';\n options?: SettingsFieldOption[];\n readOnly?: boolean;\n}\n\nexport interface SettingsSectionMeta {\n title: string;\n description: string;\n}\n\nexport const AGENT_TONE_OPTIONS: SettingsFieldOption[] = [\n { value: 'warm_friendly', label: 'Warm & friendly' },\n { value: 'professional', label: 'Professional' },\n { value: 'efficient_brief', label: 'Efficient & brief' },\n { value: 'casual_friendly', label: 'Casual & friendly' },\n];\n\nexport const LANGUAGE_OPTIONS: SettingsFieldOption[] = [\n { value: 'English', label: 'English' },\n { value: 'Spanish', label: 'Spanish' },\n { value: 'Chinese', label: 'Chinese' },\n { value: 'Hindi', label: 'Hindi' },\n { value: 'French', label: 'French' },\n { value: 'German', label: 'German' },\n { value: 'Portuguese', label: 'Portuguese' },\n { value: 'Arabic', label: 'Arabic' },\n { value: 'Korean', label: 'Korean' },\n { value: 'Japanese', label: 'Japanese' },\n];\n\nexport const GREETING_VARIABLES: { key: string; label: string; token: string }[] = [\n { key: 'practiceName', label: 'Practice Name', token: '{{practiceName}}' },\n { key: 'agentName', label: 'Agent Name', token: '{{agentName}}' },\n { key: 'locationName', label: 'Location Name', token: '{{locationName}}' },\n { key: 'businessHours', label: 'Business Hours', token: '{{businessHours}}' },\n];\n\nexport const RETENTION_DAY_OPTIONS: SettingsFieldOption[] = [\n { value: '7', label: '7 days' },\n { value: '14', label: '14 days' },\n { value: '30', label: '30 days' },\n { value: '60', label: '60 days' },\n { value: '90', label: '90 days' },\n { value: '180', label: '180 days' },\n { value: '365', label: '1 year' },\n];\n\nexport const RING_TIMEOUT_OPTIONS: SettingsFieldOption[] = [\n { value: '10', label: '10 sec' },\n { value: '15', label: '15 sec' },\n { value: '20', label: '20 sec' },\n { value: '30', label: '30 sec' },\n { value: '45', label: '45 sec' },\n { value: '60', label: '60 sec' },\n];\n\nexport const MAX_CALL_DURATION_OPTIONS: SettingsFieldOption[] = [\n { value: '3', label: '3 min' },\n { value: '5', label: '5 min' },\n { value: '10', label: '10 min' },\n { value: '15', label: '15 min' },\n { value: '20', label: '20 min' },\n { value: '30', label: '30 min' },\n];\n\nexport const SILENCE_TIMEOUT_OPTIONS: SettingsFieldOption[] = [\n { value: '10', label: '10 seconds' },\n { value: '15', label: '15 seconds' },\n { value: '20', label: '20 seconds' },\n { value: '30', label: '30 seconds' },\n { value: '45', label: '45 seconds' },\n { value: '60', label: '60 seconds' },\n];\n\nexport const AI_ANSWER_MODE_OPTIONS: SettingsFieldOption[] = [\n { value: 'always_first', label: 'Always first' },\n { value: 'ring_then_ai', label: 'Ring staff, then AI' },\n { value: 'ai_backup', label: 'AI as backup only' },\n];\n\nexport const AFTER_HOURS_OPTIONS: SettingsFieldOption[] = [\n { value: 'ai_answers', label: 'AI answers' },\n { value: 'voicemail', label: 'Voicemail' },\n { value: 'transfer', label: 'Transfer to after-hours number' },\n];\n\nexport const DEFAULT_DISCLOSURE_WARNING =\n 'This call may be handled by an automated assistant and could be recorded for quality and training. You can ask to speak with a staff member at any time.';\n\nexport const SETTINGS_SECTION_META: Record<SettingsSection, SettingsSectionMeta> = {\n general: {\n title: 'AI Identity',\n description: 'Name, voice, languages, tone, and inbound greeting.',\n },\n phone: {\n title: 'Phone & Availability',\n description: 'Inbound routing, ring timing, locations, and after-hours behavior.',\n },\n tasks: {\n title: 'Task Rules',\n description: 'When the AI should create staff tasks after a call.',\n },\n scheduling: {\n title: 'Scheduling Rules',\n description: 'Rules for booking and rescheduling appointments.',\n },\n refill: {\n title: 'Medication refills',\n description: 'Refill approval windows and staff review requirements.',\n },\n verify: {\n title: 'Patient Verification',\n description: 'Identity checks before accessing chart or scheduling data.',\n },\n escalation: {\n title: 'Safety Escalation',\n description: 'When to offer a human or transfer to reception.',\n },\n outbound: {\n title: 'Outbound Purpose',\n description: 'Outbound dialer defaults. Purpose templates are managed separately.',\n },\n knowledge: {\n title: 'Knowledge Base',\n description: 'Practice information the AI should share — and topics it must avoid.',\n },\n transcripts: {\n title: 'Data & Compliance',\n description: 'Recording retention, transcripts, and disclosure warnings.',\n },\n advanced: {\n title: 'Advanced',\n description: 'Agent online status and model options.',\n },\n};\n\n/** Entire sections where every field is read-only (including unknown API fields). */\nexport const READ_ONLY_SECTIONS = new Set<SettingsSection>(['verify']);\n\n/** Settings tabs that stay visible but cannot be selected/edited. */\nexport const DISABLED_SETTINGS_TABS = new Set<SettingsSection>(['verify', 'escalation']);\n\n/** Individual fields locked for compliance, telephony, or core agent identity. */\nexport const READ_ONLY_FIELD_KEYS: ReadonlyArray<{ section: SettingsSection; key: string; reason: string }> = [\n { section: 'general', key: 'timezone', reason: 'Practice timezone' },\n { section: 'phone', key: 'mainNumber', reason: 'AI phone number' },\n { section: 'phone', key: 'transferNumber', reason: 'Transfer number' },\n { section: 'tasks', key: 'defaultAssignee', reason: 'Default task assignee' },\n { section: 'outbound', key: 'callerId', reason: 'Outbound caller ID' },\n { section: 'advanced', key: 'modelVersion', reason: 'Voice AI model profile' },\n { section: 'advanced', key: 'debugMode', reason: 'Debug logging' },\n];\n\nconst READ_ONLY_LOOKUP = new Set(\n READ_ONLY_FIELD_KEYS.map(({ section, key }) => `${section}.${key}`),\n);\n\nexport function isFieldReadOnly(section: SettingsSection, key: string): boolean {\n if (READ_ONLY_SECTIONS.has(section)) return true;\n return READ_ONLY_LOOKUP.has(`${section}.${key}`);\n}\n\nexport function readOnlyFieldReason(section: SettingsSection, key: string): string | undefined {\n return READ_ONLY_FIELD_KEYS.find((f) => f.section === section && f.key === key)?.reason;\n}\n\nexport const SETTINGS_FIELDS: Record<SettingsSection, SettingsFieldMeta[]> = {\n general: [\n {\n key: 'agentName',\n label: 'Name',\n description: 'How the assistant introduces itself.',\n type: 'text',\n },\n {\n key: 'ttsVoiceId',\n label: 'Voice',\n description: 'Spoken voice used on phone calls.',\n type: 'select',\n options: TTS_VOICE_PRESETS.map((p) => ({ value: p.id, label: p.label })),\n },\n {\n key: 'languages',\n label: 'Language',\n description: 'Languages the AI can speak on calls.',\n type: 'text',\n },\n {\n key: 'tone',\n label: 'Tone',\n description: 'Conversational style for the AI.',\n type: 'select',\n options: AGENT_TONE_OPTIONS,\n },\n {\n key: 'welcomeMessage',\n label: 'Inbound Greetings',\n description: 'Spoken when a caller connects.',\n type: 'text',\n },\n ],\n phone: [\n {\n key: 'answerMode',\n label: 'AI Answer Mode',\n description: 'When the AI picks up inbound calls.',\n type: 'select',\n options: AI_ANSWER_MODE_OPTIONS,\n },\n {\n key: 'mainNumber',\n label: 'AI Phone Number',\n description: 'Number patients dial for the AI receptionist.',\n type: 'text',\n },\n {\n key: 'transferNumber',\n label: 'Transfer Number',\n description: 'Staff / front-desk number for handoff.',\n type: 'text',\n },\n {\n key: 'ringTimeout',\n label: 'Ringing Time Wait',\n description: 'How long to ring before the AI answers.',\n type: 'select',\n options: RING_TIMEOUT_OPTIONS,\n },\n {\n key: 'createFollowUpTask',\n label: 'Create Follow-up Task',\n description: 'If no one answers in time, the agent auto-creates a high priority task.',\n type: 'boolean',\n },\n {\n key: 'locationIds',\n label: 'Location Handled',\n description: 'Locations this AI receptionist covers.',\n type: 'text',\n },\n {\n key: 'maxCallDurationMin',\n label: 'Max AI Call Duration',\n description: 'Longest call the AI will stay on before wrapping up.',\n type: 'select',\n options: MAX_CALL_DURATION_OPTIONS,\n },\n {\n key: 'silenceTimeoutSec',\n label: 'Silence Timeout',\n description: 'How long silence lasts before the AI prompts or ends.',\n type: 'select',\n options: SILENCE_TIMEOUT_OPTIONS,\n },\n {\n key: 'afterHoursBehavior',\n label: 'After-Hours Behaviour',\n description: 'What happens outside business hours.',\n type: 'select',\n options: AFTER_HOURS_OPTIONS,\n },\n ],\n tasks: [\n {\n key: 'autoCreate',\n label: 'Auto-create tasks',\n description: 'Create a staff task when the AI cannot fully resolve a request.',\n type: 'boolean',\n },\n {\n key: 'defaultAssignee',\n label: 'Default assignee',\n description: 'Team or role new tasks are routed to.',\n type: 'text',\n },\n ],\n scheduling: [\n {\n key: 'leadTimeHours',\n label: 'Minimum lead time (hours)',\n description: 'Earliest bookable slot from now.',\n type: 'number',\n },\n {\n key: 'allowSameDay',\n label: 'Allow same-day booking',\n description: 'Let patients book appointments later today.',\n type: 'boolean',\n },\n ],\n refill: [\n {\n key: 'autoApproveDays',\n label: 'Auto-approve within (days)',\n description: 'Refills due within this window may be auto-approved.',\n type: 'number',\n },\n {\n key: 'requireStaffReview',\n label: 'Require staff review',\n description: 'All refill requests need staff approval before sending to pharmacy.',\n type: 'boolean',\n },\n ],\n verify: [\n {\n key: 'requireDob',\n label: 'Require date of birth',\n description: 'Ask for DOB before lookup or scheduling.',\n type: 'boolean',\n },\n {\n key: 'requireName',\n label: 'Require full name',\n description: 'Ask for patient name during verification.',\n type: 'boolean',\n },\n {\n key: 'maxAttempts',\n label: 'Max verification attempts',\n description: 'After this many failures, offer transfer to staff.',\n type: 'number',\n },\n ],\n escalation: [\n {\n key: 'sentimentThreshold',\n label: 'Sentiment threshold',\n description: 'Escalate when caller sentiment reaches this level (e.g. frustrated).',\n type: 'text',\n },\n {\n key: 'urgentKeywords',\n label: 'Urgent keywords',\n description: 'Comma-separated phrases that trigger immediate escalation.',\n type: 'text',\n },\n ],\n outbound: [\n {\n key: 'enabled',\n label: 'Outbound calls enabled',\n description: 'Allow staff to place outbound calls from the dashboard.',\n type: 'boolean',\n },\n {\n key: 'callerId',\n label: 'Outbound caller ID',\n description: 'Number shown to patients on outbound calls.',\n type: 'text',\n },\n ],\n knowledge: [\n {\n key: 'whatToSay',\n label: 'What to say',\n description: 'Facts and guidance the AI may share with callers.',\n type: 'text',\n },\n {\n key: 'whatNotToSay',\n label: 'What not to say',\n description: 'Topics the AI must refuse or escalate.',\n type: 'text',\n },\n ],\n transcripts: [\n {\n key: 'recordingRetainDays',\n label: 'Keep Call Recordings',\n description: 'How long call recordings are retained.',\n type: 'select',\n options: RETENTION_DAY_OPTIONS,\n },\n {\n key: 'transcriptRetainDays',\n label: 'Keep Transcripts',\n description: 'How long call transcripts are retained.',\n type: 'select',\n options: RETENTION_DAY_OPTIONS,\n },\n {\n key: 'disclosureWarningEnabled',\n label: 'Disclosure Warning',\n description: 'Play or show a disclosure when the AI answers.',\n type: 'boolean',\n },\n {\n key: 'disclosureWarningText',\n label: 'Disclosure text',\n description: 'Spoken or shown disclosure message.',\n type: 'text',\n },\n ],\n advanced: [\n {\n key: 'modelVersion',\n label: 'Model version',\n description: 'Voice AI model profile (set by Edvak support).',\n type: 'text',\n },\n {\n key: 'debugMode',\n label: 'Debug mode',\n description: 'Verbose logging for troubleshooting — not for production.',\n type: 'boolean',\n },\n ],\n};\n\n/** Fallback label for API fields not listed in config. */\nexport function humanizeFieldKey(key: string): string {\n return key\n .replace(/([A-Z])/g, ' $1')\n .replace(/_/g, ' ')\n .trim()\n .replace(/^\\w/, (c) => c.toUpperCase());\n}\n\nexport function resolveFieldMeta(\n section: SettingsSection,\n key: string,\n value: string | boolean | number,\n): SettingsFieldMeta {\n const known = SETTINGS_FIELDS[section]?.find((f) => f.key === key);\n if (known) return known;\n return {\n key,\n label: humanizeFieldKey(key),\n description: '',\n type: typeof value === 'boolean' ? 'boolean' : typeof value === 'number' ? 'number' : 'text',\n };\n}\n\nexport function parseCsvList(value: unknown): string[] {\n return String(value ?? '')\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\nexport function toCsvList(values: string[]): string {\n return values.map((v) => v.trim()).filter(Boolean).join(',');\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, OnInit, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ActivatedRoute } from '@angular/router';\n\nimport { KnowledgeTestModalComponent } from '../../components/knowledge-test-modal/knowledge-test-modal.component';\nimport { AgentSettings, LocationOption } from '../../models/ai-receptionist.types';\nimport { AiReceptionistApiService } from '../../services/ai-receptionist-api.service';\nimport { AgentOnlineService } from '../../services/agent-online.service';\nimport { ModalComponent } from '../../shared/modal.component';\nimport { ToastService } from '../../shared/toast.service';\nimport { EdsButtonComponent } from '../../ui/eds-button.component';\nimport { EdsIconComponent } from '../../ui/eds-icon.component';\nimport {\n buildAutoWelcomeTemplate,\n resolveWelcomePreview,\n WELCOME_MESSAGE_MAX,\n} from '../../utils/welcome-message.util';\nimport { TTS_VOICE_PRESETS } from './tts-voice-presets';\nimport {\n AFTER_HOURS_OPTIONS,\n AGENT_TONE_OPTIONS,\n AI_ANSWER_MODE_OPTIONS,\n DEFAULT_DISCLOSURE_WARNING,\n DISABLED_SETTINGS_TABS,\n GREETING_VARIABLES,\n isFieldReadOnly,\n MAX_CALL_DURATION_OPTIONS,\n parseCsvList,\n READ_ONLY_SECTIONS,\n resolveFieldMeta,\n RETENTION_DAY_OPTIONS,\n RING_TIMEOUT_OPTIONS,\n SETTINGS_FIELDS,\n SETTINGS_SECTION_META,\n SettingsFieldMeta,\n SettingsSection,\n SILENCE_TIMEOUT_OPTIONS,\n toCsvList,\n} from './settings-fields.config';\n\ntype SettingsTab = keyof AgentSettings;\n\nconst CUSTOM_PANEL_TABS = new Set<SettingsTab>([\n 'general',\n 'phone',\n 'transcripts',\n 'knowledge',\n 'advanced',\n]);\nconst HIDDEN_GENERIC_KEYS = new Set([\n 'welcomeMessage',\n 'practiceName',\n 'language',\n 'languages',\n 'tone',\n 'timezone',\n]);\nconst KNOWLEDGE_MAX = 8000;\nconst DISCLOSURE_MAX = 1000;\n\n@Component({\n selector: 'eds-settings-page',\n imports: [\n FormsModule,\n EdsButtonComponent,\n EdsIconComponent,\n KnowledgeTestModalComponent,\n ModalComponent,\n ],\n templateUrl: './settings-page.component.html',\n styleUrl: './settings-page.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SettingsPageComponent implements OnInit {\n private readonly api = inject(AiReceptionistApiService);\n private readonly toast = inject(ToastService);\n private readonly route = inject(ActivatedRoute);\n private readonly agentOnline = inject(AgentOnlineService);\n private originalSettings: AgentSettings | null = null;\n\n protected readonly isFieldReadOnly = isFieldReadOnly;\n protected readonly knowledgeMax = KNOWLEDGE_MAX;\n protected readonly disclosureMax = DISCLOSURE_MAX;\n protected readonly welcomeMax = WELCOME_MESSAGE_MAX;\n protected readonly voicePresets = TTS_VOICE_PRESETS;\n protected readonly toneOptions = AGENT_TONE_OPTIONS;\n protected readonly greetingVariables = GREETING_VARIABLES;\n protected readonly retentionOptions = RETENTION_DAY_OPTIONS;\n protected readonly ringTimeoutOptions = RING_TIMEOUT_OPTIONS;\n protected readonly maxCallDurationOptions = MAX_CALL_DURATION_OPTIONS;\n protected readonly silenceTimeoutOptions = SILENCE_TIMEOUT_OPTIONS;\n protected readonly answerModeOptions = AI_ANSWER_MODE_OPTIONS;\n protected readonly afterHoursOptions = AFTER_HOURS_OPTIONS;\n\n protected readonly settings = signal<AgentSettings | null>(null);\n protected readonly tab = signal<SettingsTab>('general');\n protected readonly loading = signal(true);\n protected readonly saving = signal(false);\n protected readonly saved = signal(false);\n protected readonly knowledgeTestOpen = signal(false);\n protected readonly locations = signal<LocationOption[]>([]);\n protected readonly confirmOffOpen = signal(false);\n\n protected readonly online = this.agentOnline.online;\n protected readonly agentLoading = this.agentOnline.loading;\n protected readonly toggling = this.agentOnline.toggling;\n\n protected readonly tabs: { id: SettingsTab; label: string }[] = [\n { id: 'general', label: 'Identity & Greetings' },\n { id: 'phone', label: 'Phone & Availability' },\n { id: 'scheduling', label: 'Scheduling Rules' },\n { id: 'outbound', label: 'Outbound Purpose' },\n { id: 'knowledge', label: 'Knowledge Base' },\n { id: 'transcripts', label: 'Data & Compliance' },\n { id: 'advanced', label: 'Advanced' },\n ];\n\n protected readonly sectionMeta = computed(() => {\n const id = this.tab();\n return SETTINGS_SECTION_META[id as SettingsSection] ?? { title: String(id), description: '' };\n });\n\n protected readonly fieldsForTab = computed((): SettingsFieldMeta[] => {\n const s = this.settings();\n const id = this.tab();\n if (!s || CUSTOM_PANEL_TABS.has(id)) return [];\n\n const section = s[id] as Record<string, string | boolean | number>;\n const configured = SETTINGS_FIELDS[id as SettingsSection] ?? [];\n const configuredKeys = new Set(configured.map((f) => f.key));\n\n const extras = Object.keys(section)\n .filter((key) => !HIDDEN_GENERIC_KEYS.has(key) && !configuredKeys.has(key))\n .map((key) => resolveFieldMeta(id as SettingsSection, key, section[key]));\n\n return [...configured, ...extras];\n });\n\n protected readonly welcomeMessage = computed(() =>\n String(this.settings()?.general['welcomeMessage'] ?? ''),\n );\n\n protected readonly welcomePlaceholder = computed(() => {\n const s = this.settings();\n if (!s) return '';\n return buildAutoWelcomeTemplate(\n String(s.general['practiceName'] ?? ''),\n String(s.general['agentName'] ?? ''),\n );\n });\n\n protected readonly welcomePreview = computed(() => {\n const s = this.settings();\n if (!s) return '';\n const raw = resolveWelcomePreview(\n String(s.general['welcomeMessage'] ?? ''),\n String(s.general['practiceName'] ?? ''),\n String(s.general['agentName'] ?? ''),\n );\n return raw\n .replaceAll('{{practiceName}}', String(s.general['practiceName'] || 'our practice'))\n .replaceAll('{{agentName}}', String(s.general['agentName'] || 'your AI receptionist'))\n .replaceAll('{{locationName}}', 'Main location')\n .replaceAll('{{businessHours}}', 'Mon–Fri 8am–5pm');\n });\n\n protected readonly whatToSay = computed(() =>\n String(this.settings()?.knowledge?.['whatToSay'] ?? ''),\n );\n\n protected readonly whatNotToSay = computed(() =>\n String(this.settings()?.knowledge?.['whatNotToSay'] ?? ''),\n );\n\n protected readonly selectedLocationIds = computed(() =>\n parseCsvList(this.settings()?.phone?.['locationIds']),\n );\n\n protected readonly selectedTone = computed(() =>\n String(this.settings()?.general?.['tone'] ?? 'professional'),\n );\n\n protected readonly disclosureEnabled = computed(\n () => this.settings()?.transcripts?.['disclosureWarningEnabled'] !== false,\n );\n\n protected readonly disclosureText = computed(() =>\n String(this.settings()?.transcripts?.['disclosureWarningText'] ?? DEFAULT_DISCLOSURE_WARNING),\n );\n\n protected readonly agentSwitchDisabled = computed(\n () => this.agentLoading() || this.toggling() || this.online() === null,\n );\n\n ngOnInit(): void {\n this.agentOnline.refresh();\n\n const dataTab = this.route.snapshot.data['settingsTab'] as SettingsTab | undefined;\n const tabParam = this.route.snapshot.queryParamMap.get('tab');\n if (dataTab && this.tabs.some((t) => t.id === dataTab)) {\n this.tab.set(dataTab);\n } else if (tabParam && this.tabs.some((t) => t.id === tabParam)) {\n this.tab.set(tabParam as SettingsTab);\n }\n\n this.api.getSettings().subscribe({\n next: ({ data }) => {\n this.originalSettings = structuredClone(data);\n this.settings.set(structuredClone(data));\n this.loading.set(false);\n },\n error: () => {\n this.loading.set(false);\n this.toast.show('Failed to load agent settings', 'error');\n },\n });\n\n this.api.getLocations().subscribe({\n next: ({ data }) => this.locations.set(data ?? []),\n error: () => this.locations.set([]),\n });\n }\n\n protected fieldIsReadOnly(section: SettingsTab, key: string): boolean {\n if (section === 'safety' || section === 'effectiveWelcomeMessage') return true;\n return isFieldReadOnly(section, key);\n }\n\n protected sectionIsReadOnly(section: SettingsTab): boolean {\n if (section === 'safety' || section === 'effectiveWelcomeMessage') return true;\n return READ_ONLY_SECTIONS.has(section);\n }\n\n protected isTabDisabled(id: SettingsTab): boolean {\n return id !== 'safety' && id !== 'effectiveWelcomeMessage' && DISABLED_SETTINGS_TABS.has(id);\n }\n\n protected setTab(id: SettingsTab): void {\n if (this.isTabDisabled(id)) return;\n this.tab.set(id);\n }\n\n protected updateField(section: SettingsTab, key: string, value: string | boolean | number): void {\n const current = this.settings();\n if (!current || section === 'safety' || isFieldReadOnly(section as SettingsSection, key)) return;\n const sectionData = { ...(current[section] as Record<string, string | boolean | number>) };\n sectionData[key] = value;\n this.settings.set({ ...current, [section]: sectionData });\n }\n\n protected updateWelcomeMessage(value: string): void {\n this.updateField('general', 'welcomeMessage', value.slice(0, WELCOME_MESSAGE_MAX));\n }\n\n protected insertGreetingVariable(token: string): void {\n const current = this.welcomeMessage();\n const next = `${current}${current && !/\\s$/.test(current) ? ' ' : ''}${token}`;\n this.updateWelcomeMessage(next);\n }\n\n protected updateKnowledgeField(key: 'whatToSay' | 'whatNotToSay', value: string): void {\n this.updateField('knowledge', key, value.slice(0, KNOWLEDGE_MAX));\n }\n\n protected setTone(tone: string): void {\n this.updateField('general', 'tone', tone);\n }\n\n protected toggleLocation(id: string): void {\n const current = this.selectedLocationIds();\n const next = current.includes(id) ? current.filter((x) => x !== id) : [...current, id];\n this.updateField('phone', 'locationIds', toCsvList(next));\n }\n\n protected selectNumberField(\n section: 'phone' | 'transcripts',\n key: string,\n value: string,\n ): void {\n this.updateField(section, key, Number(value));\n }\n\n protected numberFieldAsString(section: 'phone' | 'transcripts', key: string): string {\n return String(this.fieldValue(section, key) ?? '');\n }\n\n protected setDisclosureEnabled(enabled: boolean): void {\n this.updateField('transcripts', 'disclosureWarningEnabled', enabled);\n if (enabled && !String(this.settings()?.transcripts?.['disclosureWarningText'] ?? '').trim()) {\n this.updateField('transcripts', 'disclosureWarningText', DEFAULT_DISCLOSURE_WARNING);\n }\n }\n\n protected updateDisclosureText(value: string): void {\n this.updateField('transcripts', 'disclosureWarningText', value.slice(0, DISCLOSURE_MAX));\n }\n\n protected openTestCall(): void {\n const whatToSay = this.whatToSay().trim();\n const whatNotToSay = this.whatNotToSay().trim();\n if (!whatToSay || !whatNotToSay) {\n this.toast.show(\n 'Fill in both “What to say” and “What not to say” before testing.',\n 'error',\n );\n return;\n }\n this.knowledgeTestOpen.set(true);\n }\n\n protected closeTestCall(): void {\n this.knowledgeTestOpen.set(false);\n }\n\n protected selectedVoiceId(): string {\n return String(this.settings()?.general?.['ttsVoiceId'] ?? '').trim();\n }\n\n protected onAgentToggleClick(): void {\n if (this.agentSwitchDisabled()) return;\n if (this.online()) {\n this.confirmOffOpen.set(true);\n return;\n }\n this.applyOnline(true);\n }\n\n protected cancelConfirmOff(): void {\n this.confirmOffOpen.set(false);\n }\n\n protected confirmTurnOff(): void {\n this.confirmOffOpen.set(false);\n this.applyOnline(false);\n }\n\n private applyOnline(enabled: boolean): void {\n this.agentOnline.setOnline(enabled).subscribe({\n next: () => {\n this.toast.show(\n enabled\n ? 'AI receptionist is online — it will answer inbound calls.'\n : 'AI receptionist is offline — calls go to the front desk.',\n 'success',\n );\n },\n error: (err: { message?: string }) => {\n this.toast.show(err.message ?? 'Failed to update agent status.', 'error');\n this.agentOnline.refresh();\n },\n });\n }\n\n protected fieldValue(section: SettingsTab, key: string): string | boolean | number {\n const s = this.settings();\n if (!s || section === 'safety') return '';\n return (s[section] as Record<string, string | boolean | number>)[key];\n }\n\n protected save(): void {\n const s = this.settings();\n const orig = this.originalSettings;\n if (!s || !orig) return;\n\n const payload = structuredClone(s);\n payload.general['welcomeMessage'] = String(payload.general['welcomeMessage'] ?? '').trim();\n payload.general['agentName'] = String(payload.general['agentName'] ?? '').trim();\n\n if (!String(payload.general['agentName'] ?? '').trim()) {\n this.tab.set('general');\n this.toast.show('Agent name is required.', 'error');\n return;\n }\n if (!String(payload.general['welcomeMessage'] ?? '').trim()) {\n this.tab.set('general');\n this.toast.show('Inbound greeting is required.', 'error');\n return;\n }\n\n const whatToSay = String(payload.knowledge?.['whatToSay'] ?? '').trim();\n const whatNotToSay = String(payload.knowledge?.['whatNotToSay'] ?? '').trim();\n if (!whatToSay || !whatNotToSay) {\n this.tab.set('knowledge');\n this.toast.show('Knowledge Base requires both “What to say” and “What not to say”.', 'error');\n return;\n }\n payload.knowledge = { whatToSay, whatNotToSay };\n\n // Keep legacy retainDays in sync for older BE consumers.\n const recDays = Number(payload.transcripts['recordingRetainDays'] ?? 30);\n const txDays = Number(payload.transcripts['transcriptRetainDays'] ?? 30);\n payload.transcripts['retainDays'] = Math.max(recDays, txDays);\n\n this.restoreReadOnlyFields(payload, orig);\n\n this.saving.set(true);\n this.api.putSettings(payload).subscribe({\n next: ({ data }) => {\n this.originalSettings = structuredClone(data);\n this.settings.set(structuredClone(data));\n this.saving.set(false);\n this.saved.set(true);\n this.toast.show('Agent settings saved', 'success');\n setTimeout(() => this.saved.set(false), 2000);\n },\n error: (err: unknown) => {\n this.saving.set(false);\n const message =\n err instanceof Error && err.message.trim()\n ? err.message\n : 'Failed to save agent settings';\n this.toast.show(message, 'error');\n },\n });\n }\n\n private restoreReadOnlyFields(payload: AgentSettings, orig: AgentSettings): void {\n const editableSections: SettingsSection[] = [\n 'general',\n 'phone',\n 'tasks',\n 'scheduling',\n 'refill',\n 'verify',\n 'escalation',\n 'outbound',\n 'knowledge',\n 'transcripts',\n 'advanced',\n ];\n\n for (const sectionKey of editableSections) {\n if (READ_ONLY_SECTIONS.has(sectionKey)) {\n payload[sectionKey] = structuredClone(orig[sectionKey]);\n continue;\n }\n\n const payloadSection = payload[sectionKey] as Record<string, string | boolean | number>;\n const origSection = orig[sectionKey] as Record<string, string | boolean | number>;\n for (const key of Object.keys(payloadSection)) {\n if (isFieldReadOnly(sectionKey, key)) {\n payloadSection[key] = origSection[key];\n }\n }\n }\n }\n}\n","<div class=\"eds-page settings-page\">\n <header class=\"settings-page__header\">\n <div>\n <h1 class=\"eds-h1\">Agent settings</h1>\n <p class=\"settings-page__subtitle\">Configure AI receptionist behavior and safety</p>\n </div>\n <div class=\"settings-page__save-row\">\n @if (saved()) {\n <span class=\"settings-page__saved\">Saved</span>\n }\n <eds-button variant=\"primary\" [disabled]=\"saving()\" (click)=\"save()\">\n <eds-icon name=\"save\" [size]=\"18\" />\n {{ saving() ? 'Saving…' : 'Save changes' }}\n </eds-button>\n </div>\n </header>\n\n @if (loading()) {\n <p class=\"settings-page__loading\">Loading settings…</p>\n } @else if (settings()) {\n <div class=\"settings-page__layout\">\n <nav class=\"eds-card settings-page__sidebar\" aria-label=\"Settings sections\">\n @for (t of tabs; track t.id) {\n <button\n type=\"button\"\n class=\"settings-page__nav-item\"\n [class.settings-page__nav-item--active]=\"tab() === t.id\"\n [class.settings-page__nav-item--disabled]=\"isTabDisabled(t.id)\"\n [disabled]=\"isTabDisabled(t.id)\"\n [attr.title]=\"isTabDisabled(t.id) ? 'This section is currently disabled' : null\"\n (click)=\"setTab(t.id)\"\n >\n {{ t.label }}\n @if (isTabDisabled(t.id)) {\n <span class=\"settings-page__nav-disabled-badge\">Disabled</span>\n }\n </button>\n }\n </nav>\n\n <article class=\"eds-card settings-page__panel\">\n <header class=\"settings-page__panel-head\">\n <div class=\"settings-page__panel-head-text\">\n <h2 class=\"settings-page__panel-title\">{{ sectionMeta().title }}</h2>\n @if (tab() !== 'knowledge' && tab() !== 'general' && tab() !== 'phone' && tab() !== 'transcripts') {\n <p class=\"settings-page__panel-desc\">{{ sectionMeta().description }}</p>\n }\n </div>\n @if (tab() === 'knowledge') {\n <eds-button variant=\"secondary\" type=\"button\" (click)=\"openTestCall()\">\n <eds-icon name=\"phone_in_talk\" [size]=\"18\" />\n Test Call\n </eds-button>\n }\n </header>\n\n @if (sectionIsReadOnly(tab())) {\n <p class=\"settings-page__readonly-banner\">\n <eds-icon name=\"lock\" [size]=\"18\" />\n These settings are managed by Edvak. Contact support to request changes.\n </p>\n }\n\n @if (tab() === 'knowledge') {\n <div class=\"settings-page__knowledge\">\n <label class=\"settings-page__field settings-page__field--full\">\n <span class=\"settings-page__field-label\">\n What to say <span class=\"settings-page__req\">*</span>\n </span>\n <textarea\n class=\"settings-page__textarea settings-page__textarea--knowledge\"\n rows=\"10\"\n [maxlength]=\"knowledgeMax\"\n [ngModel]=\"whatToSay()\"\n (ngModelChange)=\"updateKnowledgeField('whatToSay', $event)\"\n placeholder=\"Hours, parking, payment options, arrival instructions, emergencies…\"\n autocomplete=\"off\"\n ></textarea>\n <span class=\"settings-page__char-count\">{{ whatToSay().length }}/{{ knowledgeMax }}</span>\n </label>\n\n <label class=\"settings-page__field settings-page__field--full\">\n <span class=\"settings-page__field-label\">\n What not to say <span class=\"settings-page__req\">*</span>\n </span>\n <textarea\n class=\"settings-page__textarea settings-page__textarea--knowledge\"\n rows=\"10\"\n [maxlength]=\"knowledgeMax\"\n [ngModel]=\"whatNotToSay()\"\n (ngModelChange)=\"updateKnowledgeField('whatNotToSay', $event)\"\n placeholder=\"Clinical advice, unverified prices, PHI, promises the practice cannot keep…\"\n autocomplete=\"off\"\n ></textarea>\n <span class=\"settings-page__char-count\">{{ whatNotToSay().length }}/{{ knowledgeMax }}</span>\n </label>\n </div>\n } @else if (tab() === 'general') {\n <div class=\"settings-page__form\">\n <label class=\"settings-page__field settings-page__field--full\">\n <span class=\"settings-page__field-label\">\n Name <span class=\"settings-page__req\">*</span>\n <eds-icon name=\"info\" [size]=\"16\" class=\"settings-page__info\" title=\"How the AI introduces itself on calls\" />\n </span>\n <input\n type=\"text\"\n class=\"settings-page__input\"\n [ngModel]=\"fieldValue('general', 'agentName')\"\n (ngModelChange)=\"updateField('general', 'agentName', $event)\"\n autocomplete=\"off\"\n />\n </label>\n\n <div class=\"settings-page__voice-row\">\n <label class=\"settings-page__field settings-page__field--grow\">\n <span class=\"settings-page__field-label\">\n Voice <span class=\"settings-page__req\">*</span>\n </span>\n <div class=\"settings-page__select-wrap\">\n <select\n class=\"settings-page__input settings-page__select\"\n [ngModel]=\"fieldValue('general', 'ttsVoiceId')\"\n (ngModelChange)=\"updateField('general', 'ttsVoiceId', $event)\"\n autocomplete=\"off\"\n >\n @for (v of voicePresets; track v.id) {\n <option [ngValue]=\"v.id\">{{ v.label }}</option>\n }\n </select>\n <eds-icon name=\"expand_more\" [size]=\"20\" class=\"settings-page__select-caret\" />\n </div>\n </label>\n </div>\n\n <div class=\"settings-page__field settings-page__field--full\">\n <span class=\"settings-page__field-label\">Tone</span>\n <div class=\"settings-page__tone-row\" role=\"radiogroup\" aria-label=\"Tone\">\n @for (tone of toneOptions; track tone.value) {\n <button\n type=\"button\"\n class=\"settings-page__tone\"\n [class.settings-page__tone--active]=\"selectedTone() === tone.value\"\n (click)=\"setTone(tone.value)\"\n >\n {{ tone.label }}\n </button>\n }\n </div>\n </div>\n\n <label class=\"settings-page__field settings-page__field--full\">\n <span class=\"settings-page__field-label\">\n Inbound Greetings <span class=\"settings-page__req\">*</span>\n </span>\n <textarea\n class=\"settings-page__textarea\"\n rows=\"4\"\n [maxlength]=\"welcomeMax\"\n [placeholder]=\"welcomePlaceholder()\"\n [ngModel]=\"welcomeMessage()\"\n (ngModelChange)=\"updateWelcomeMessage($event)\"\n autocomplete=\"off\"\n ></textarea>\n <span class=\"settings-page__char-count\">{{ welcomeMessage().length }}/{{ welcomeMax }}</span>\n <div class=\"settings-page__variables\">\n <span class=\"settings-page__variables-label\">Variables</span>\n @for (v of greetingVariables; track v.key) {\n <button\n type=\"button\"\n class=\"settings-page__var-chip\"\n (click)=\"insertGreetingVariable(v.token)\"\n [title]=\"'Insert ' + v.token\"\n >\n {{ v.label }}\n </button>\n }\n </div>\n </label>\n </div>\n } @else if (tab() === 'phone') {\n <div class=\"settings-page__form\">\n <label class=\"settings-page__field settings-page__field--full\">\n <span class=\"settings-page__field-label\">\n AI Answer Mode <span class=\"settings-page__req\">*</span>\n <eds-icon name=\"info\" [size]=\"16\" class=\"settings-page__info\" title=\"When the AI picks up inbound calls\" />\n </span>\n <select\n class=\"settings-page__input settings-page__select\"\n [ngModel]=\"fieldValue('phone', 'answerMode')\"\n (ngModelChange)=\"updateField('phone', 'answerMode', $event)\"\n autocomplete=\"off\"\n >\n @for (opt of answerModeOptions; track opt.value) {\n <option [ngValue]=\"opt.value\">{{ opt.label }}</option>\n }\n </select>\n </label>\n\n <label\n class=\"settings-page__field settings-page__field--full\"\n [class.settings-page__field--readonly]=\"isFieldReadOnly('phone', 'mainNumber')\"\n >\n <span class=\"settings-page__field-label\">\n AI Phone Number <span class=\"settings-page__req\">*</span>\n @if (isFieldReadOnly('phone', 'mainNumber')) {\n }\n </span>\n <input\n type=\"text\"\n class=\"settings-page__input\"\n [class.settings-page__input--readonly]=\"isFieldReadOnly('phone', 'mainNumber')\"\n [disabled]=\"isFieldReadOnly('phone', 'mainNumber')\"\n [ngModel]=\"fieldValue('phone', 'mainNumber')\"\n (ngModelChange)=\"updateField('phone', 'mainNumber', $event)\"\n autocomplete=\"off\"\n />\n </label>\n\n <label\n class=\"settings-page__field settings-page__field--full\"\n [class.settings-page__field--readonly]=\"isFieldReadOnly('phone', 'transferNumber')\"\n >\n <span class=\"settings-page__field-label\">\n Transfer Number <span class=\"settings-page__req\">*</span>\n @if (isFieldReadOnly('phone', 'transferNumber')) {\n }\n </span>\n <input\n type=\"text\"\n class=\"settings-page__input\"\n [class.settings-page__input--readonly]=\"isFieldReadOnly('phone', 'transferNumber')\"\n [disabled]=\"isFieldReadOnly('phone', 'transferNumber')\"\n [ngModel]=\"fieldValue('phone', 'transferNumber')\"\n (ngModelChange)=\"updateField('phone', 'transferNumber', $event)\"\n autocomplete=\"off\"\n />\n </label>\n\n <label class=\"settings-page__field settings-page__field--full\">\n <span class=\"settings-page__field-label\">\n Ringing Time Wait <span class=\"settings-page__req\">*</span>\n </span>\n <select\n class=\"settings-page__input settings-page__select\"\n [ngModel]=\"numberFieldAsString('phone', 'ringTimeout')\"\n (ngModelChange)=\"selectNumberField('phone', 'ringTimeout', $event)\"\n autocomplete=\"off\"\n >\n @for (opt of ringTimeoutOptions; track opt.value) {\n <option [value]=\"opt.value\">{{ opt.label }}</option>\n }\n </select>\n </label>\n\n <div class=\"settings-page__feature-card\">\n <eds-icon name=\"event_available\" [size]=\"22\" class=\"settings-page__feature-icon\" />\n <div class=\"settings-page__feature-copy\">\n <span class=\"settings-page__feature-title\">Create Follow-up Task</span>\n <span class=\"settings-page__feature-desc\">\n If no one answers in time, the agent auto-creates a high priority task.\n </span>\n </div>\n <button\n type=\"button\"\n class=\"settings-page__switch\"\n [class.settings-page__switch--on]=\"!!fieldValue('phone', 'createFollowUpTask')\"\n [attr.aria-pressed]=\"!!fieldValue('phone', 'createFollowUpTask')\"\n (click)=\"updateField('phone', 'createFollowUpTask', !fieldValue('phone', 'createFollowUpTask'))\"\n >\n <span class=\"settings-page__switch-thumb\"></span>\n </button>\n </div>\n\n <div class=\"settings-page__field settings-page__field--full\">\n <span class=\"settings-page__field-label\">\n Location Handled <span class=\"settings-page__req\">*</span>\n </span>\n <div class=\"settings-page__check-grid\" role=\"group\" aria-label=\"Locations handled\">\n @for (loc of locations(); track loc.id) {\n <label class=\"settings-page__check-item\">\n <input\n type=\"checkbox\"\n [checked]=\"selectedLocationIds().includes(loc.id)\"\n (change)=\"toggleLocation(loc.id)\"\n autocomplete=\"off\"\n />\n <span>{{ loc.name }}</span>\n </label>\n } @empty {\n <p class=\"settings-page__menu-empty\">No locations available.</p>\n }\n </div>\n </div>\n\n <label class=\"settings-page__field settings-page__field--full\">\n <span class=\"settings-page__field-label\">\n Max AI Call Duration <span class=\"settings-page__req\">*</span>\n </span>\n <select\n class=\"settings-page__input settings-page__select\"\n [ngModel]=\"numberFieldAsString('phone', 'maxCallDurationMin')\"\n (ngModelChange)=\"selectNumberField('phone', 'maxCallDurationMin', $event)\"\n autocomplete=\"off\"\n >\n @for (opt of maxCallDurationOptions; track opt.value) {\n <option [value]=\"opt.value\">{{ opt.label }}</option>\n }\n </select>\n </label>\n\n <label class=\"settings-page__field settings-page__field--full\">\n <span class=\"settings-page__field-label\">\n Silence Timeout <span class=\"settings-page__req\">*</span>\n </span>\n <select\n class=\"settings-page__input settings-page__select\"\n [ngModel]=\"numberFieldAsString('phone', 'silenceTimeoutSec')\"\n (ngModelChange)=\"selectNumberField('phone', 'silenceTimeoutSec', $event)\"\n autocomplete=\"off\"\n >\n @for (opt of silenceTimeoutOptions; track opt.value) {\n <option [value]=\"opt.value\">{{ opt.label }}</option>\n }\n </select>\n </label>\n\n <label class=\"settings-page__field settings-page__field--full\">\n <span class=\"settings-page__field-label\">\n After-Hours Behaviour <span class=\"settings-page__req\">*</span>\n </span>\n <select\n class=\"settings-page__input settings-page__select\"\n [ngModel]=\"fieldValue('phone', 'afterHoursBehavior')\"\n (ngModelChange)=\"updateField('phone', 'afterHoursBehavior', $event)\"\n autocomplete=\"off\"\n >\n @for (opt of afterHoursOptions; track opt.value) {\n <option [ngValue]=\"opt.value\">{{ opt.label }}</option>\n }\n </select>\n </label>\n </div>\n } @else if (tab() === 'transcripts') {\n <div class=\"settings-page__form\">\n <label class=\"settings-page__field settings-page__field--full\">\n <span class=\"settings-page__field-label\">\n Keep Call Recordings <span class=\"settings-page__req\">*</span>\n </span>\n <select\n class=\"settings-page__input settings-page__select\"\n [ngModel]=\"numberFieldAsString('transcripts', 'recordingRetainDays')\"\n (ngModelChange)=\"selectNumberField('transcripts', 'recordingRetainDays', $event)\"\n autocomplete=\"off\"\n >\n @for (opt of retentionOptions; track opt.value) {\n <option [value]=\"opt.value\">{{ opt.label }}</option>\n }\n </select>\n </label>\n\n <label class=\"settings-page__field settings-page__field--full\">\n <span class=\"settings-page__field-label\">\n Keep Transcripts <span class=\"settings-page__req\">*</span>\n </span>\n <select\n class=\"settings-page__input settings-page__select\"\n [ngModel]=\"numberFieldAsString('transcripts', 'transcriptRetainDays')\"\n (ngModelChange)=\"selectNumberField('transcripts', 'transcriptRetainDays', $event)\"\n autocomplete=\"off\"\n >\n @for (opt of retentionOptions; track opt.value) {\n <option [value]=\"opt.value\">{{ opt.label }}</option>\n }\n </select>\n </label>\n\n <div class=\"settings-page__disclosure\">\n <div class=\"settings-page__disclosure-head\">\n <span class=\"settings-page__field-label\">Disclosure Warning</span>\n <button\n type=\"button\"\n class=\"settings-page__switch\"\n [class.settings-page__switch--on]=\"disclosureEnabled()\"\n [attr.aria-pressed]=\"disclosureEnabled()\"\n (click)=\"setDisclosureEnabled(!disclosureEnabled())\"\n >\n <span class=\"settings-page__switch-thumb\"></span>\n </button>\n </div>\n @if (disclosureEnabled()) {\n <textarea\n class=\"settings-page__textarea\"\n rows=\"4\"\n [maxlength]=\"disclosureMax\"\n [ngModel]=\"disclosureText()\"\n (ngModelChange)=\"updateDisclosureText($event)\"\n autocomplete=\"off\"\n ></textarea>\n }\n </div>\n </div>\n } @else if (tab() === 'advanced') {\n <div class=\"settings-page__form\">\n <div class=\"settings-page__feature-card\">\n <eds-icon name=\"smart_toy\" [size]=\"22\" class=\"settings-page__feature-icon\" />\n <div class=\"settings-page__feature-copy\">\n <span class=\"settings-page__feature-title\">\n @if (toggling()) {\n Updating…\n } @else if (online() === true) {\n Agent online\n } @else if (online() === false) {\n Agent offline\n } @else {\n Status unknown\n }\n </span>\n <span class=\"settings-page__feature-desc\">\n @if (online() === true) {\n AI receptionist is answering inbound calls.\n } @else if (online() === false) {\n AI is offline — calls go to the front desk.\n } @else {\n Checking agent status…\n }\n </span>\n </div>\n <button\n type=\"button\"\n class=\"settings-page__switch\"\n [class.settings-page__switch--on]=\"online() === true\"\n [disabled]=\"agentSwitchDisabled()\"\n [attr.aria-pressed]=\"online() === true\"\n (click)=\"onAgentToggleClick()\"\n >\n <span class=\"settings-page__switch-thumb\"></span>\n </button>\n </div>\n\n <label class=\"settings-page__field settings-page__field--full settings-page__field--readonly\">\n <span class=\"settings-page__field-label\">\n Model version\n </span>\n <input\n type=\"text\"\n class=\"settings-page__input settings-page__input--readonly\"\n [ngModel]=\"fieldValue('advanced', 'modelVersion')\"\n disabled\n autocomplete=\"off\"\n />\n </label>\n\n <label class=\"settings-page__toggle-row settings-page__toggle-row--readonly\">\n <div class=\"settings-page__toggle-copy\">\n <span class=\"settings-page__field-label\">\n Debug mode\n </span>\n <span class=\"settings-page__field-desc\">Verbose logging — contact Edvak to change.</span>\n </div>\n <input\n type=\"checkbox\"\n class=\"settings-page__checkbox\"\n [ngModel]=\"fieldValue('advanced', 'debugMode')\"\n disabled\n autocomplete=\"off\"\n />\n </label>\n </div>\n } @else {\n <div class=\"settings-page__fields\">\n @for (field of fieldsForTab(); track field.key) {\n @if (field.type === 'boolean') {\n <label\n class=\"settings-page__toggle-row\"\n [class.settings-page__toggle-row--readonly]=\"fieldIsReadOnly(tab(), field.key)\"\n >\n <div class=\"settings-page__toggle-copy\">\n <span class=\"settings-page__field-label\">\n {{ field.label }}\n </span>\n @if (field.description) {\n <span class=\"settings-page__field-desc\">{{ field.description }}</span>\n }\n </div>\n <input\n type=\"checkbox\"\n class=\"settings-page__checkbox\"\n [disabled]=\"fieldIsReadOnly(tab(), field.key)\"\n [ngModel]=\"fieldValue(tab(), field.key)\"\n (ngModelChange)=\"updateField(tab(), field.key, $event)\"\n autocomplete=\"off\"\n />\n </label>\n } @else {\n <label\n class=\"settings-page__field\"\n [class.settings-page__field--readonly]=\"fieldIsReadOnly(tab(), field.key)\"\n >\n <span class=\"settings-page__field-label\">\n {{ field.label }}\n </span>\n @if (field.description) {\n <span class=\"settings-page__field-desc\">{{ field.description }}</span>\n }\n @if (field.type === 'number') {\n <input\n type=\"number\"\n class=\"settings-page__input\"\n [class.settings-page__input--readonly]=\"fieldIsReadOnly(tab(), field.key)\"\n [disabled]=\"fieldIsReadOnly(tab(), field.key)\"\n [ngModel]=\"fieldValue(tab(), field.key)\"\n (ngModelChange)=\"updateField(tab(), field.key, +$event)\"\n autocomplete=\"off\"\n />\n } @else if (field.type === 'select' && field.options?.length) {\n <select\n class=\"settings-page__input settings-page__select\"\n [class.settings-page__input--readonly]=\"fieldIsReadOnly(tab(), field.key)\"\n [disabled]=\"fieldIsReadOnly(tab(), field.key)\"\n [ngModel]=\"fieldValue(tab(), field.key)\"\n (ngModelChange)=\"updateField(tab(), field.key, $event)\"\n autocomplete=\"off\"\n >\n @for (opt of field.options; track opt.value) {\n <option [ngValue]=\"opt.value\">{{ opt.label }}</option>\n }\n </select>\n } @else {\n <input\n type=\"text\"\n class=\"settings-page__input\"\n [class.settings-page__input--readonly]=\"fieldIsReadOnly(tab(), field.key)\"\n [disabled]=\"fieldIsReadOnly(tab(), field.key)\"\n [ngModel]=\"fieldValue(tab(), field.key)\"\n (ngModelChange)=\"updateField(tab(), field.key, $event)\"\n autocomplete=\"off\"\n />\n }\n </label>\n }\n }\n </div>\n }\n </article>\n </div>\n }\n</div>\n\n<eds-knowledge-test-modal\n [open]=\"knowledgeTestOpen()\"\n [whatToSay]=\"whatToSay()\"\n [whatNotToSay]=\"whatNotToSay()\"\n [voiceId]=\"selectedVoiceId()\"\n (closed)=\"closeTestCall()\"\n/>\n\n@if (confirmOffOpen()) {\n <app-modal\n title=\"Turn off AI receptionist?\"\n subtitle=\"Inbound callers will be transferred to the front desk instead of the AI.\"\n maxWidth=\"480px\"\n (closed)=\"cancelConfirmOff()\"\n >\n <p class=\"settings-page__confirm-body\">\n While offline, the AI will not answer calls. Callers are routed to the human receptionist.\n </p>\n <div class=\"settings-page__confirm-actions\">\n <eds-button variant=\"secondary\" type=\"button\" (click)=\"cancelConfirmOff()\">Cancel</eds-button>\n <eds-button variant=\"danger\" type=\"button\" [disabled]=\"toggling()\" (click)=\"confirmTurnOff()\">\n Turn off\n </eds-button>\n </div>\n </app-modal>\n}\n"],"names":[],"mappings":"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"}