@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
@@ -1,6 +1,7 @@
1
- import { ToolEvent, TranscriptLine } from '../../models/ai-receptionist.types';
2
- import { formatPlaybackTime, TimedTranscriptLine, toolStateClass, transcriptRoleLabel } from '../../utils/transcript-timing.util';
1
+ import { ToolEvent, TranscriptLine, TranscriptWho } from '../../models/ai-receptionist.types';
2
+ import { formatPlaybackTime, TimedTranscriptLine, toolStateClass } from '../../utils/transcript-timing.util';
3
3
  import { toolEventTrackKey } from '../../utils/tool-labels.util';
4
+ import { type BadgeTone } from '../../ui/eds-badge.component';
4
5
  import * as i0 from "@angular/core";
5
6
  export declare class CallConversationPanelComponent {
6
7
  private readonly api;
@@ -11,6 +12,8 @@ export declare class CallConversationPanelComponent {
11
12
  readonly tools: import("@angular/core").InputSignal<ToolEvent[]>;
12
13
  readonly callDurationSec: import("@angular/core").InputSignal<number>;
13
14
  readonly allowRegenerate: import("@angular/core").InputSignal<boolean>;
15
+ readonly callerName: import("@angular/core").InputSignal<string | null>;
16
+ readonly callerMatched: import("@angular/core").InputSignal<boolean | null>;
14
17
  readonly summaryRegenerated: import("@angular/core").OutputEmitterRef<void>;
15
18
  private readonly player;
16
19
  private readonly scrollHost;
@@ -28,18 +31,18 @@ export declare class CallConversationPanelComponent {
28
31
  protected readonly timedLines: import("@angular/core").Signal<TimedTranscriptLine[]>;
29
32
  protected readonly activeIndex: import("@angular/core").Signal<number>;
30
33
  protected readonly hasExplicitTiming: import("@angular/core").Signal<boolean>;
31
- protected readonly roleLabel: typeof transcriptRoleLabel;
32
34
  protected readonly toolClass: typeof toolStateClass;
33
35
  protected readonly formatTime: typeof formatPlaybackTime;
34
36
  protected readonly toolTrackKey: typeof toolEventTrackKey;
37
+ protected roleLabel(who: TranscriptLine['who']): string;
38
+ protected speakerIcon(who: TranscriptWho | string): string;
39
+ protected toolTone(state: string): BadgeTone;
35
40
  constructor();
36
41
  protected onPlaybackTime(sec: number): void;
37
42
  protected onPlaybackDuration(sec: number): void;
38
43
  protected seekLine(line: TimedTranscriptLine): void;
39
44
  protected toggleSummary(): void;
40
45
  protected regenerateSummary(): void;
41
- protected lineClass(line: TimedTranscriptLine): Record<string, boolean>;
42
- protected toolTone(state: ToolEvent['state']): 'pos' | 'notice' | 'neg' | 'brand' | 'gray';
43
46
  static ɵfac: i0.ɵɵFactoryDeclaration<CallConversationPanelComponent, never>;
44
- static ɵcmp: i0.ɵɵComponentDeclaration<CallConversationPanelComponent, "eds-call-conversation-panel", never, { "callId": { "alias": "callId"; "required": true; "isSignal": true; }; "summary": { "alias": "summary"; "required": true; "isSignal": true; }; "transcript": { "alias": "transcript"; "required": true; "isSignal": true; }; "tools": { "alias": "tools"; "required": true; "isSignal": true; }; "callDurationSec": { "alias": "callDurationSec"; "required": false; "isSignal": true; }; "allowRegenerate": { "alias": "allowRegenerate"; "required": false; "isSignal": true; }; }, { "summaryRegenerated": "summaryRegenerated"; }, never, ["[summary-side]"], true, never>;
47
+ static ɵcmp: i0.ɵɵComponentDeclaration<CallConversationPanelComponent, "eds-call-conversation-panel", never, { "callId": { "alias": "callId"; "required": true; "isSignal": true; }; "summary": { "alias": "summary"; "required": true; "isSignal": true; }; "transcript": { "alias": "transcript"; "required": true; "isSignal": true; }; "tools": { "alias": "tools"; "required": true; "isSignal": true; }; "callDurationSec": { "alias": "callDurationSec"; "required": false; "isSignal": true; }; "allowRegenerate": { "alias": "allowRegenerate"; "required": false; "isSignal": true; }; "callerName": { "alias": "callerName"; "required": false; "isSignal": true; }; "callerMatched": { "alias": "callerMatched"; "required": false; "isSignal": true; }; }, { "summaryRegenerated": "summaryRegenerated"; }, never, ["[summary-side]"], true, never>;
45
48
  }
@@ -1,19 +1,19 @@
1
1
  import { OnInit } from '@angular/core';
2
- import { TaskItem } from '../../models/ai-receptionist.types';
3
- import { taskStatusLabel, taskStatusTone, taskTypeTone } from '../../utils/task.util';
2
+ import { AgentActivity, activityTypeLabel } from '../../models/agent-activity.types';
4
3
  import * as i0 from "@angular/core";
5
4
  export declare class CallTasksPanelComponent implements OnInit {
6
5
  private readonly api;
7
6
  readonly callId: import("@angular/core").InputSignal<string>;
8
7
  readonly compact: import("@angular/core").InputSignal<boolean>;
9
- protected readonly tasks: import("@angular/core").WritableSignal<TaskItem[]>;
8
+ protected readonly activities: import("@angular/core").WritableSignal<AgentActivity[]>;
9
+ protected readonly total: import("@angular/core").WritableSignal<number>;
10
10
  protected readonly loading: import("@angular/core").WritableSignal<boolean>;
11
- protected readonly expandedId: import("@angular/core").WritableSignal<string | null>;
12
- protected readonly taskStatusLabel: typeof taskStatusLabel;
13
- protected readonly taskStatusTone: typeof taskStatusTone;
14
- protected readonly taskTypeTone: typeof taskTypeTone;
11
+ protected readonly previewLimit = 4;
12
+ protected readonly activityTypeLabel: typeof activityTypeLabel;
13
+ protected readonly previewActivities: import("@angular/core").Signal<AgentActivity[]>;
15
14
  ngOnInit(): void;
16
- protected toggleExpand(id: string): void;
15
+ protected activitySubline(item: AgentActivity): string;
16
+ protected activityTone(type: string): 'brand' | 'pos' | 'notice' | 'violet' | 'gray';
17
17
  static ɵfac: i0.ɵɵFactoryDeclaration<CallTasksPanelComponent, never>;
18
18
  static ɵcmp: i0.ɵɵComponentDeclaration<CallTasksPanelComponent, "eds-call-tasks-panel", never, { "callId": { "alias": "callId"; "required": true; "isSignal": true; }; "compact": { "alias": "compact"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
19
19
  }
@@ -0,0 +1,28 @@
1
+ import { EventEmitter, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export declare class KnowledgeTestModalComponent implements OnChanges, OnDestroy {
4
+ private readonly api;
5
+ private readonly toast;
6
+ open: boolean;
7
+ whatToSay: string;
8
+ whatNotToSay: string;
9
+ voiceId: string;
10
+ readonly closed: EventEmitter<void>;
11
+ protected readonly questionMax = 500;
12
+ protected readonly question: import("@angular/core").WritableSignal<string>;
13
+ protected readonly testing: import("@angular/core").WritableSignal<boolean>;
14
+ protected readonly answer: import("@angular/core").WritableSignal<string | null>;
15
+ protected readonly playing: import("@angular/core").WritableSignal<boolean>;
16
+ private audio;
17
+ private objectUrl;
18
+ ngOnChanges(changes: SimpleChanges): void;
19
+ ngOnDestroy(): void;
20
+ protected close(): void;
21
+ protected onQuestionChange(value: string): void;
22
+ protected runTest(): void;
23
+ protected replay(): void;
24
+ private playAudio;
25
+ private stopAudio;
26
+ static ɵfac: i0.ɵɵFactoryDeclaration<KnowledgeTestModalComponent, never>;
27
+ static ɵcmp: i0.ɵɵComponentDeclaration<KnowledgeTestModalComponent, "eds-knowledge-test-modal", never, { "open": { "alias": "open"; "required": true; }; "whatToSay": { "alias": "whatToSay"; "required": false; }; "whatNotToSay": { "alias": "whatNotToSay"; "required": false; }; "voiceId": { "alias": "voiceId"; "required": false; }; }, { "closed": "closed"; }, never, never, true, never>;
28
+ }
@@ -7,6 +7,10 @@ export declare class LiveTranscriptPanelComponent implements AfterViewChecked {
7
7
  readonly humanTakeover: import("@angular/core").InputSignal<boolean>;
8
8
  readonly showStaffInput: import("@angular/core").InputSignal<boolean>;
9
9
  readonly staffMessage: import("@angular/core").InputSignal<string>;
10
+ /** Resolved patient display name from the live call. */
11
+ readonly callerName: import("@angular/core").InputSignal<string | null>;
12
+ /** Whether the caller was matched to a patient chart. */
13
+ readonly callerMatched: import("@angular/core").InputSignal<boolean>;
10
14
  readonly staffMessageChange: import("@angular/core").OutputEmitterRef<string>;
11
15
  readonly sendMessage: import("@angular/core").OutputEmitterRef<void>;
12
16
  private readonly stream;
@@ -14,14 +18,13 @@ export declare class LiveTranscriptPanelComponent implements AfterViewChecked {
14
18
  protected readonly lines: import("@angular/core").WritableSignal<import("../../models/ai-receptionist.types").TranscriptLine[]>;
15
19
  protected readonly patientInterim: import("@angular/core").WritableSignal<string | null>;
16
20
  protected readonly aiInterim: import("@angular/core").WritableSignal<string | null>;
21
+ protected readonly staffInterim: import("@angular/core").WritableSignal<string | null>;
17
22
  protected readonly connected: import("@angular/core").WritableSignal<boolean>;
18
23
  protected readonly error: import("@angular/core").WritableSignal<string | null>;
24
+ protected readonly callerLabel: import("@angular/core").Signal<string>;
19
25
  private shouldScroll;
20
26
  constructor();
21
27
  ngAfterViewChecked(): void;
22
- protected waveformActive(): boolean;
23
- protected waveformTone(): 'brand' | 'violet';
24
- protected recLabel(): string;
25
28
  protected roleLabel(who: TranscriptWho): string;
26
29
  protected speakerIcon(who: TranscriptWho): string;
27
30
  protected systemIcon(flag?: string): string;
@@ -32,5 +35,5 @@ export declare class LiveTranscriptPanelComponent implements AfterViewChecked {
32
35
  protected onSend(): void;
33
36
  private requestScroll;
34
37
  static ɵfac: i0.ɵɵFactoryDeclaration<LiveTranscriptPanelComponent, never>;
35
- static ɵcmp: i0.ɵɵComponentDeclaration<LiveTranscriptPanelComponent, "eds-live-transcript-panel", never, { "live": { "alias": "live"; "required": false; "isSignal": true; }; "paused": { "alias": "paused"; "required": false; "isSignal": true; }; "humanTakeover": { "alias": "humanTakeover"; "required": false; "isSignal": true; }; "showStaffInput": { "alias": "showStaffInput"; "required": false; "isSignal": true; }; "staffMessage": { "alias": "staffMessage"; "required": false; "isSignal": true; }; }, { "staffMessageChange": "staffMessageChange"; "sendMessage": "sendMessage"; }, never, never, true, never>;
38
+ static ɵcmp: i0.ɵɵComponentDeclaration<LiveTranscriptPanelComponent, "eds-live-transcript-panel", never, { "live": { "alias": "live"; "required": false; "isSignal": true; }; "paused": { "alias": "paused"; "required": false; "isSignal": true; }; "humanTakeover": { "alias": "humanTakeover"; "required": false; "isSignal": true; }; "showStaffInput": { "alias": "showStaffInput"; "required": false; "isSignal": true; }; "staffMessage": { "alias": "staffMessage"; "required": false; "isSignal": true; }; "callerName": { "alias": "callerName"; "required": false; "isSignal": true; }; "callerMatched": { "alias": "callerMatched"; "required": false; "isSignal": true; }; }, { "staffMessageChange": "staffMessageChange"; "sendMessage": "sendMessage"; }, never, never, true, never>;
36
39
  }
@@ -1,10 +1,12 @@
1
1
  import { EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
2
+ import { OutboundAppointmentHit, OutboundPatientHit } from '../../models/outbound-patient.types';
2
3
  import { OutboundPurpose } from '../../models/outbound-purpose.types';
3
4
  import { requiredFieldLabel } from '../../utils/outbound-purpose.util';
4
5
  import * as i0 from "@angular/core";
5
6
  export declare class OutboundDialModalComponent implements OnChanges {
6
7
  private readonly api;
7
8
  private readonly toast;
9
+ private readonly destroyRef;
8
10
  open: boolean;
9
11
  readonly closed: EventEmitter<void>;
10
12
  readonly dialed: EventEmitter<void>;
@@ -12,6 +14,17 @@ export declare class OutboundDialModalComponent implements OnChanges {
12
14
  protected readonly loading: import("@angular/core").WritableSignal<boolean>;
13
15
  protected readonly submitting: import("@angular/core").WritableSignal<boolean>;
14
16
  protected readonly serverError: import("@angular/core").WritableSignal<string | null>;
17
+ protected readonly patientHits: import("@angular/core").WritableSignal<OutboundPatientHit[]>;
18
+ protected readonly searchingPatients: import("@angular/core").WritableSignal<boolean>;
19
+ protected readonly selectedPatient: import("@angular/core").WritableSignal<OutboundPatientHit | null>;
20
+ protected readonly appointments: import("@angular/core").WritableSignal<OutboundAppointmentHit[]>;
21
+ protected readonly loadingAppointments: import("@angular/core").WritableSignal<boolean>;
22
+ protected readonly selectedAppointmentId: import("@angular/core").WritableSignal<string | null>;
23
+ protected readonly showManualEntry: import("@angular/core").WritableSignal<boolean>;
24
+ protected readonly practiceName: import("@angular/core").WritableSignal<string>;
25
+ /** Bumps OnPush re-render when plain ngModel fields change. */
26
+ protected readonly formEpoch: import("@angular/core").WritableSignal<number>;
27
+ protected patientQuery: string;
15
28
  protected phone: string;
16
29
  protected name: string;
17
30
  protected purposeId: string;
@@ -20,16 +33,29 @@ export declare class OutboundDialModalComponent implements OnChanges {
20
33
  protected providerName: string;
21
34
  protected customScript: string;
22
35
  protected requiredFieldLabel: typeof requiredFieldLabel;
36
+ private readonly search$;
37
+ constructor();
23
38
  ngOnChanges(changes: SimpleChanges): void;
24
39
  protected get selectedPurpose(): OutboundPurpose | null;
40
+ protected get selectedAppointment(): OutboundAppointmentHit | null;
25
41
  protected get previewText(): string;
26
42
  protected showsField(field: 'appointmentDate' | 'appointmentTime' | 'providerName'): boolean;
27
43
  protected showsCustomScript(): boolean;
28
44
  protected customScriptRequired(): boolean;
29
45
  protected canPlaceCall(): boolean;
46
+ protected touchForm(): void;
47
+ protected onPatientQueryChange(value: string): void;
48
+ protected selectPatient(patient: OutboundPatientHit): void;
49
+ protected clearPatient(): void;
50
+ protected selectAppointment(appt: OutboundAppointmentHit | null): void;
30
51
  protected onPurposeChange(): void;
31
52
  protected close(): void;
32
53
  protected submit(): void;
54
+ private preferAppointmentPurpose;
55
+ private applyAppointmentFields;
56
+ private clearApptDerivedFields;
57
+ private loadAppointments;
58
+ private loadPracticeName;
33
59
  private resetForm;
34
60
  private loadPurposes;
35
61
  static ɵfac: i0.ɵɵFactoryDeclaration<OutboundDialModalComponent, never>;
@@ -11,12 +11,9 @@ interface NavItem {
11
11
  export declare class EdsModuleNavComponent {
12
12
  private readonly config;
13
13
  private readonly session;
14
- private readonly agentOnline;
15
- protected readonly agentOn: import("@angular/core").Signal<import("../services/agent-online.service").AgentOnlineKnownState>;
16
14
  protected readonly includePracticeNav: boolean;
17
15
  protected readonly receptionistNav: NavItem[];
18
16
  protected readonly practiceNav: NavItem[];
19
- constructor();
20
17
  protected showNavItem(item: NavItem): boolean;
21
18
  static ɵfac: i0.ɵɵFactoryDeclaration<EdsModuleNavComponent, never>;
22
19
  static ɵcmp: i0.ɵɵComponentDeclaration<EdsModuleNavComponent, "eds-module-nav", never, {}, {}, never, never, true, never>;
@@ -0,0 +1,2 @@
1
+ import { AgentActivity } from '../models/agent-activity.types';
2
+ export declare const SEED_ACTIVITIES: AgentActivity[];
@@ -0,0 +1,54 @@
1
+ /** Agent activity feed item (patients, appointments, tasks created by AI). */
2
+ export type AgentActivityType = 'patient_created' | 'appointment_booked' | 'task_created' | string;
3
+ export type ActivitiesTab = 'task_created' | 'appointment_booked' | 'patient_created';
4
+ export interface AgentActivity {
5
+ id: string;
6
+ type: AgentActivityType;
7
+ occurredAt: string;
8
+ title: string;
9
+ detail: string;
10
+ patientId?: string | null;
11
+ patientName?: string | null;
12
+ appointmentId?: string | null;
13
+ taskId?: string | null;
14
+ callId?: string | null;
15
+ /** Appointment window start (ISO or date string). */
16
+ startAt?: string | null;
17
+ /** Appointment window end (ISO). */
18
+ endAt?: string | null;
19
+ durationMinutes?: number | null;
20
+ /** Visit / appointment category shown under the time. */
21
+ visitType?: string | null;
22
+ practiceName?: string | null;
23
+ patientDob?: string | null;
24
+ patientAge?: number | null;
25
+ patientGender?: string | null;
26
+ patientInitials?: string | null;
27
+ /** Medical record number when known. */
28
+ patientMrn?: string | null;
29
+ /** True/false when the backend knows the coverage status; null when it never told us. */
30
+ hasInsurance?: boolean | null;
31
+ /** Payer / plan name, shown as the insurance tooltip when present. */
32
+ insuranceName?: string | null;
33
+ providerId?: string | null;
34
+ providerName?: string | null;
35
+ providerInitials?: string | null;
36
+ providerSpecialty?: string | null;
37
+ /** Task priority for task_created rows. */
38
+ priority?: ActivityPriority | null;
39
+ }
40
+ export type ActivityPriority = 'urgent' | 'high' | 'medium' | 'low' | 'normal';
41
+ export interface AgentActivityFilters {
42
+ page?: number;
43
+ limit?: number;
44
+ /** Comma-separated or multi types filter. */
45
+ types?: string;
46
+ search?: string;
47
+ from?: string;
48
+ to?: string;
49
+ /** Restrict to activities created during a specific call. */
50
+ callId?: string;
51
+ }
52
+ export declare function mapAgentActivity(raw: unknown, index?: number): AgentActivity;
53
+ export declare function activityTypeLabel(type: string): string;
54
+ export declare function initialsFromName(name: string | null | undefined): string | null;
@@ -1,5 +1,7 @@
1
1
  export type Verification = 'verified' | 'partial' | 'failed' | 'unknown';
2
2
  export type CallStatus = 'ai' | 'needs-help' | 'human-requested' | 'urgent' | 'takeover' | 'transferring';
3
+ /** Staff control mode from live call DTO (preferred over status alone). */
4
+ export type CallControlMode = 'ai' | 'takeover' | 'listen' | 'paused';
3
5
  export type Sentiment = 'calm' | 'neutral' | 'frustrated' | 'urgent';
4
6
  export type ToolState = 'ok' | 'warn' | 'error' | 'active';
5
7
  export type TranscriptWho = 'ai' | 'patient' | 'staff' | 'system';
@@ -34,14 +36,20 @@ export interface LiveCall {
34
36
  confidence: number;
35
37
  goal: string;
36
38
  dob?: string;
39
+ age?: number | null;
40
+ gender?: string | null;
37
41
  location: string;
38
42
  provider: string | null;
39
43
  language: string;
40
44
  matched: boolean;
41
45
  assigned: string | null;
46
+ /** Preferred staff-control signal from BE. */
47
+ controlMode?: CallControlMode;
42
48
  tools: ToolEvent[];
43
49
  transcript: TranscriptLine[];
44
50
  aiPaused?: boolean;
51
+ /** True once staff took over — the AI left the call and cannot be resumed. */
52
+ aiHandedOff?: boolean;
45
53
  reviewed?: boolean;
46
54
  }
47
55
  export interface HistoryCall {
@@ -59,6 +67,15 @@ export interface HistoryCall {
59
67
  location: string;
60
68
  verification: Verification;
61
69
  review: 'needs' | 'reviewed';
70
+ /** Who primarily handled the call. */
71
+ handledBy?: 'ai' | 'staff';
72
+ dob?: string | null;
73
+ age?: number | null;
74
+ gender?: string | null;
75
+ /** Outcome chips shown in the Result column (from API `actions`). */
76
+ results?: string[];
77
+ /** Backend risk flag — drives Needs Attention resolution when present. */
78
+ risk?: 'urgent' | 'review' | null;
62
79
  }
63
80
  export interface HistoryDetail extends HistoryCall {
64
81
  summary: string;
@@ -141,6 +158,7 @@ export interface TaskFilters {
141
158
  source?: TaskSource;
142
159
  callId?: string;
143
160
  limit?: number;
161
+ page?: number;
144
162
  }
145
163
  export interface CreateTaskRequest {
146
164
  title: string;
@@ -171,6 +189,8 @@ export interface AnalyticsVolumePoint {
171
189
  day: string;
172
190
  label: string;
173
191
  count: number;
192
+ inbound?: number;
193
+ outbound?: number;
174
194
  }
175
195
  export interface AnalyticsVolumeSeries {
176
196
  timezone: string;
@@ -221,6 +241,12 @@ export interface AgentSettings {
221
241
  verify: Record<string, string | boolean | number>;
222
242
  escalation: Record<string, string | boolean | number>;
223
243
  outbound: Record<string, string | boolean | number>;
244
+ /** Freeform practice guidance injected into the AI system prompt. */
245
+ /**
246
+ * Freeform practice guidance (whatToSay / whatNotToSay) — mapped to/from
247
+ * backend `settings.knowledgeBase`. Injected into the AI system prompt.
248
+ */
249
+ knowledge: Record<string, string | boolean | number>;
224
250
  safety: {
225
251
  id: string;
226
252
  label: string;
@@ -31,11 +31,20 @@ export interface LiveCallDto {
31
31
  confidence: number;
32
32
  goal: string;
33
33
  dob: string | null;
34
+ dateOfBirth?: string | null;
35
+ age?: number | string | null;
36
+ gender?: string | null;
37
+ sex?: string | null;
34
38
  location: string | null;
35
39
  provider: string | null;
36
40
  language: string;
37
41
  matched: boolean;
38
42
  assigned: string | null;
43
+ /** 'ai' | 'takeover' | 'listen' | 'paused' */
44
+ controlMode?: string | null;
45
+ aiPaused?: boolean;
46
+ /** True once staff took over — the AI left the call for good. */
47
+ aiHandedOff?: boolean;
39
48
  tools: LiveCallToolDto[];
40
49
  transcript: LiveTranscriptLineDto[];
41
50
  }
@@ -59,6 +68,13 @@ export interface HistoryCallDto {
59
68
  startedAt?: string;
60
69
  provider: string;
61
70
  location: string;
71
+ handledBy?: 'ai' | 'staff' | string;
72
+ handler?: string;
73
+ dob?: string | null;
74
+ dateOfBirth?: string | null;
75
+ age?: number | string | null;
76
+ gender?: string | null;
77
+ sex?: string | null;
62
78
  }
63
79
  export interface HistoryDetailDto {
64
80
  id: string;
@@ -154,6 +170,8 @@ export interface AnalyticsVolumePointDto {
154
170
  day: string;
155
171
  label: string;
156
172
  count: number;
173
+ inbound?: number;
174
+ outbound?: number;
157
175
  }
158
176
  export interface AnalyticsVolumeSeriesDto {
159
177
  timezone?: string;
@@ -1,7 +1,8 @@
1
1
  import { ToolEvent, TranscriptLine } from './ai-receptionist.types';
2
2
  /** Socket.io `new_chunk` payload from /dashboard namespace */
3
3
  export interface TranscriptChunk {
4
- role: 'user' | 'assistant';
4
+ /** `staff` is a human agent speaking after a softphone takeover. */
5
+ role: 'user' | 'assistant' | 'staff' | 'system';
5
6
  text: string;
6
7
  isFinal: boolean;
7
8
  timestamp: string;
@@ -0,0 +1,23 @@
1
+ /** Lightweight patient hit for outbound dialer typeahead. */
2
+ export interface OutboundPatientHit {
3
+ patientId: string;
4
+ firstName: string;
5
+ lastName: string;
6
+ fullName: string;
7
+ phone: string | null;
8
+ dob: string | null;
9
+ }
10
+ /** Upcoming appointment option for a selected patient. */
11
+ export interface OutboundAppointmentHit {
12
+ appointmentId: string;
13
+ startTime: string | null;
14
+ endTime: string | null;
15
+ providerName: string | null;
16
+ locationName: string | null;
17
+ status: string | null;
18
+ visitType: string | null;
19
+ }
20
+ export declare function mapOutboundPatientHit(raw: unknown): OutboundPatientHit | null;
21
+ export declare function mapOutboundAppointmentHit(raw: unknown): OutboundAppointmentHit | null;
22
+ /** Best-effort E.164 for US/local numbers used in dialer. */
23
+ export declare function toE164Phone(raw: string | null | undefined): string;
@@ -42,6 +42,8 @@ export interface PlaceOutboundCallRequest {
42
42
  appointmentTime?: string;
43
43
  providerName?: string;
44
44
  customScript?: string;
45
+ patientId?: string;
46
+ appointmentId?: string;
45
47
  }
46
48
  export interface PlaceOutboundCallResponse {
47
49
  callId?: string;
@@ -0,0 +1,11 @@
1
+ /** Standard list pagination envelope from AI Receptionist APIs. */
2
+ export interface PaginatedResult<T> {
3
+ items: T[];
4
+ total: number;
5
+ page: number;
6
+ limit: number;
7
+ }
8
+ export declare const DEFAULT_PAGE_SIZE = 50;
9
+ /** Parse `{ items, total, page, limit }` or a bare array (legacy). */
10
+ export declare function asPaginatedResult<T>(body: unknown, fallbackPage?: number, fallbackLimit?: number): PaginatedResult<T>;
11
+ export declare function totalPages(total: number, pageSize: number): number;
@@ -0,0 +1,36 @@
1
+ import { CallControlMode } from './ai-receptionist.types';
2
+ /** Staff softphone join modes. */
3
+ export type StaffMediaMode = 'listen' | 'takeover';
4
+ /**
5
+ * Response from POST /calls/:callId/media/join (also takeover / listen).
6
+ * Staff join the existing LiveKit room `call-{callId}` — not Vonage Conversation.
7
+ */
8
+ export interface StaffMediaJoinResult {
9
+ ok: boolean;
10
+ callId: string;
11
+ mode: StaffMediaMode;
12
+ provider: 'livekit' | string;
13
+ /** LiveKit WebSocket URL for Room.connect */
14
+ livekitUrl: string;
15
+ /** Short-lived LiveKit access token — never a server secret */
16
+ clientToken: string;
17
+ tokenExpiresAt?: string | null;
18
+ conversationId?: string | null;
19
+ memberId?: string | null;
20
+ roomName?: string | null;
21
+ iceServers?: unknown[];
22
+ controlMode?: CallControlMode | string | null;
23
+ aiPaused?: boolean;
24
+ /** True once staff took over — the AI left the call and cannot be resumed. */
25
+ aiHandedOff?: boolean;
26
+ assigned?: string | null;
27
+ }
28
+ export interface CallControlChangedEvent {
29
+ callId: string;
30
+ controlMode?: CallControlMode | string | null;
31
+ aiPaused?: boolean;
32
+ aiHandedOff?: boolean;
33
+ assigned?: string | null;
34
+ status?: string | null;
35
+ }
36
+ export declare function mapStaffMediaJoinResult(raw: unknown): StaffMediaJoinResult | null;
@@ -0,0 +1,57 @@
1
+ import { OnInit } from '@angular/core';
2
+ import { ActivitiesTab, AgentActivity } from '../../models/agent-activity.types';
3
+ import * as i0 from "@angular/core";
4
+ type TabId = ActivitiesTab;
5
+ export declare class ActivitiesPageComponent implements OnInit {
6
+ private readonly api;
7
+ private readonly route;
8
+ private readonly router;
9
+ protected readonly tabs: {
10
+ id: TabId;
11
+ label: string;
12
+ }[];
13
+ protected readonly pageSize = 50;
14
+ protected readonly items: import("@angular/core").WritableSignal<AgentActivity[]>;
15
+ protected readonly total: import("@angular/core").WritableSignal<number>;
16
+ protected readonly page: import("@angular/core").WritableSignal<number>;
17
+ protected readonly activeTab: import("@angular/core").WritableSignal<ActivitiesTab>;
18
+ protected readonly callIdFilter: import("@angular/core").WritableSignal<string | null>;
19
+ protected readonly loading: import("@angular/core").WritableSignal<boolean>;
20
+ protected readonly loadError: import("@angular/core").WritableSignal<string | null>;
21
+ ngOnInit(): void;
22
+ protected setTab(tab: TabId): void;
23
+ protected clearCallFilter(): void;
24
+ protected load(): void;
25
+ protected totalPages(): number;
26
+ protected prevPage(): void;
27
+ protected nextPage(): void;
28
+ protected historyLink(callId: string | null | undefined): string[] | null;
29
+ protected openCallHistory(callId: string | null | undefined, ev?: Event): void;
30
+ protected displayMrn(item: AgentActivity): string;
31
+ protected providerSpecialtyLabel(item: AgentActivity): string | null;
32
+ /** Day-anchored stamp — a bare clock time gave no idea which day a row belonged to. */
33
+ protected timestampLabel(item: AgentActivity): string;
34
+ protected durationLabel(item: AgentActivity): string | null;
35
+ protected categoryLabel(item: AgentActivity): string;
36
+ protected patientMeta(item: AgentActivity): string | null;
37
+ protected patientInitials(item: AgentActivity): string;
38
+ protected providerInitials(item: AgentActivity): string;
39
+ protected avatarTone(key: string | null | undefined, salt: number): string;
40
+ protected insuranceState(item: AgentActivity): 'covered' | 'none' | 'unknown';
41
+ protected insuranceIcon(item: AgentActivity): string;
42
+ protected insuranceLabel(item: AgentActivity): string;
43
+ protected insuranceTitle(item: AgentActivity): string;
44
+ protected isTaskRow(item: AgentActivity): boolean;
45
+ protected taskTitle(item: AgentActivity): string;
46
+ protected priorityLabel(item: AgentActivity): string;
47
+ protected priorityTone(item: AgentActivity): string;
48
+ protected isRegistrationTab(): boolean;
49
+ protected emptyLabel(): string;
50
+ private parseDate;
51
+ private formatDay;
52
+ private formatClock;
53
+ private formatDob;
54
+ static ɵfac: i0.ɵɵFactoryDeclaration<ActivitiesPageComponent, never>;
55
+ static ɵcmp: i0.ɵɵComponentDeclaration<ActivitiesPageComponent, "eds-activities-page", never, {}, {}, never, never, true, never>;
56
+ }
57
+ export {};
@@ -1,15 +1,32 @@
1
1
  import { OnInit } from '@angular/core';
2
- import { AnalyticsData, AnalyticsPeakPoint, AnalyticsVolumePoint } from '../../models/ai-receptionist.types';
2
+ import { AnalyticsData, AnalyticsKpiCard, AnalyticsPeakPoint, AnalyticsVolumePoint } from '../../models/ai-receptionist.types';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class AnalyticsPageComponent implements OnInit {
5
5
  private readonly api;
6
6
  protected readonly data: import("@angular/core").WritableSignal<AnalyticsData | null>;
7
7
  protected readonly range: import("@angular/core").WritableSignal<string>;
8
8
  protected readonly loading: import("@angular/core").WritableSignal<boolean>;
9
+ protected readonly chartsReady: import("@angular/core").WritableSignal<boolean>;
10
+ protected readonly hoveredVolume: import("@angular/core").WritableSignal<number | null>;
9
11
  protected readonly ranges: {
10
12
  id: string;
11
13
  label: string;
12
14
  }[];
15
+ protected readonly impactKpi: import("@angular/core").Signal<AnalyticsKpiCard | null>;
16
+ protected readonly resolutionKpi: import("@angular/core").Signal<AnalyticsKpiCard | null>;
17
+ protected readonly secondaryKpis: import("@angular/core").Signal<AnalyticsKpiCard[]>;
18
+ protected readonly distribution: import("@angular/core").Signal<{
19
+ pct: number;
20
+ width: number;
21
+ label: string;
22
+ value: number;
23
+ color: string;
24
+ }[]>;
25
+ protected readonly totalCallsLabel: import("@angular/core").Signal<string>;
26
+ protected readonly directionSub: import("@angular/core").Signal<string | null>;
27
+ protected readonly volumePoints: import("@angular/core").Signal<AnalyticsVolumePoint[]>;
28
+ /** Human date span for the selected analytics window (month + year included). */
29
+ protected readonly periodLabel: import("@angular/core").Signal<string>;
13
30
  ngOnInit(): void;
14
31
  protected setRange(id: string): void;
15
32
  protected maxCount(items: {
@@ -20,24 +37,31 @@ export declare class AnalyticsPageComponent implements OnInit {
20
37
  }, points: {
21
38
  count: number;
22
39
  }[]): number;
23
- /** Hide inline counts when bars are too narrow to stay readable. */
24
- protected showBarValue(point: {
25
- count: number;
26
- }, points: {
27
- count: number;
28
- }[]): boolean;
29
40
  protected maxValue(items: {
30
41
  value: number;
31
42
  }[]): number;
32
- protected volumeTooltip(point: AnalyticsVolumePoint): string;
43
+ protected reasonColor(index: number): string;
44
+ protected stuckColor(index: number): string;
33
45
  protected peakTooltip(point: AnalyticsPeakPoint): string;
34
- /** ISO or YYYY-MM-DD → MM/DD (zero-padded). */
35
- protected formatChartDate(date: string): string;
36
- /** Compact x-axis for volume — full labels on 7d, sparse dates on longer ranges. */
37
- protected volumeAxisLabel(point: AnalyticsVolumePoint, index: number, total: number): string;
46
+ protected volumeTooltip(point: AnalyticsVolumePoint): string;
47
+ protected hbarTooltip(label: string, value: number): string;
48
+ protected distributionTooltip(label: string, value: number): string;
38
49
  protected showPeakAxisLabel(index: number, total: number): boolean;
39
- protected volumeRangeLabel(): string;
40
- protected kpiIcon(label: string): string;
50
+ protected volumePath(series: 'total' | 'inbound' | 'outbound'): string;
51
+ protected volumeAreaPath(): string;
52
+ protected volumeAxisLabels(): string[];
53
+ protected volumeAxisLabel(point: AnalyticsVolumePoint, index: number, total: number): string;
54
+ protected deltaTone(kpi: AnalyticsKpiCard | null | undefined): string;
55
+ protected formatChartDate(date: string): string;
56
+ protected estimatedCalls(pct: number): number;
57
+ protected onVolumeEnter(index: number): void;
58
+ protected onVolumeLeave(): void;
59
+ private volumePointHeadline;
60
+ private formatMonthYear;
61
+ private formatFullChartDate;
62
+ private formatPeriodRange;
63
+ private parseIsoDate;
64
+ private findKpi;
41
65
  private load;
42
66
  static ɵfac: i0.ɵɵFactoryDeclaration<AnalyticsPageComponent, never>;
43
67
  static ɵcmp: i0.ɵɵComponentDeclaration<AnalyticsPageComponent, "eds-analytics-page", never, {}, {}, never, never, true, never>;
@@ -1,7 +1,7 @@
1
1
  import { OnInit } from '@angular/core';
2
2
  import { HistoryDetail } from '../../models/ai-receptionist.types';
3
3
  import { formatOutcomeLabel, outcomeBadgeTone } from '../../utils/call-outcome.util';
4
- import { isNeedsReview, reviewBadgeTone, reviewLabel } from '../../utils/call-review.util';
4
+ import { isNeedsReview } from '../../utils/call-review.util';
5
5
  import * as i0 from "@angular/core";
6
6
  export declare class CallHistoryDetailPageComponent implements OnInit {
7
7
  private readonly api;
@@ -11,11 +11,10 @@ export declare class CallHistoryDetailPageComponent implements OnInit {
11
11
  protected readonly detail: import("@angular/core").WritableSignal<HistoryDetail | null>;
12
12
  protected readonly loading: import("@angular/core").WritableSignal<boolean>;
13
13
  protected readonly markingReview: import("@angular/core").WritableSignal<boolean>;
14
- protected reviewLabel: typeof reviewLabel;
15
- protected reviewTone: typeof reviewBadgeTone;
16
14
  protected isNeedsReview: typeof isNeedsReview;
17
15
  protected outcomeTone: typeof outcomeBadgeTone;
18
16
  protected outcomeLabel: typeof formatOutcomeLabel;
17
+ protected isUnknownName(name: string | null | undefined): boolean;
19
18
  ngOnInit(): void;
20
19
  protected markReviewed(): void;
21
20
  protected refreshCallDetail(): void;