@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,7 +1,7 @@
1
1
  import { OnInit } from '@angular/core';
2
2
  import { HistoryCall } from '../../models/ai-receptionist.types';
3
- import { formatOutcomeLabel, outcomeBadgeTone } from '../../utils/call-outcome.util';
4
- import { isNeedsReview, reviewBadgeTone, reviewLabel, ReviewFilterTab } from '../../utils/call-review.util';
3
+ import { callerMetaLine, historyResolution, historyResolutionLabel, historyResultChips, resultChipIcon } from '../../utils/call-history-display.util';
4
+ import { isNeedsReview, ReviewFilterTab } from '../../utils/call-review.util';
5
5
  import * as i0 from "@angular/core";
6
6
  export declare class CallHistoryPageComponent implements OnInit {
7
7
  private readonly api;
@@ -9,7 +9,10 @@ export declare class CallHistoryPageComponent implements OnInit {
9
9
  private readonly toast;
10
10
  private readonly route;
11
11
  private readonly router;
12
- protected readonly allRows: import("@angular/core").WritableSignal<HistoryCall[]>;
12
+ protected readonly pageSize = 50;
13
+ protected readonly rows: import("@angular/core").WritableSignal<HistoryCall[]>;
14
+ protected readonly total: import("@angular/core").WritableSignal<number>;
15
+ protected readonly page: import("@angular/core").WritableSignal<number>;
13
16
  protected readonly loading: import("@angular/core").WritableSignal<boolean>;
14
17
  protected readonly reviewingId: import("@angular/core").WritableSignal<string | null>;
15
18
  protected readonly search: import("@angular/core").WritableSignal<string>;
@@ -21,21 +24,25 @@ export declare class CallHistoryPageComponent implements OnInit {
21
24
  id: ReviewFilterTab;
22
25
  label: string;
23
26
  }[];
24
- protected readonly rows: import("@angular/core").Signal<HistoryCall[]>;
25
- protected readonly needsReviewCount: import("@angular/core").Signal<number>;
26
- protected reviewLabel: typeof reviewLabel;
27
- protected reviewTone: typeof reviewBadgeTone;
28
27
  protected isNeedsReview: typeof isNeedsReview;
29
- protected outcomeTone: typeof outcomeBadgeTone;
30
- protected outcomeLabel: typeof formatOutcomeLabel;
28
+ protected callerMetaLine: typeof callerMetaLine;
29
+ protected resultChipIcon: typeof resultChipIcon;
30
+ protected historyResultChips: typeof historyResultChips;
31
+ protected historyResolution: typeof historyResolution;
32
+ protected historyResolutionLabel: typeof historyResolutionLabel;
31
33
  ngOnInit(): void;
32
34
  protected load(): void;
33
35
  protected applyFilters(): void;
34
36
  protected setReviewTab(tab: ReviewFilterTab): void;
35
37
  protected tabBadgeCount(tab: ReviewFilterTab): number | null;
38
+ protected totalPages(): number;
39
+ protected prevPage(): void;
40
+ protected nextPage(): void;
36
41
  protected markReviewed(row: HistoryCall, event: Event): void;
37
42
  protected formatDuration(sec: number): string;
38
43
  protected openCallDetail(id: string): void;
44
+ protected avatarTone(row: HistoryCall): 'gray' | 'brand';
45
+ protected resolutionOf(row: HistoryCall): import("../../utils/call-history-display.util").HistoryResolution;
39
46
  protected exportCsv(): void;
40
47
  static ɵfac: i0.ɵɵFactoryDeclaration<CallHistoryPageComponent, never>;
41
48
  static ɵcmp: i0.ɵɵComponentDeclaration<CallHistoryPageComponent, "eds-call-history-page", never, {}, {}, never, never, true, never>;
@@ -1,7 +1,7 @@
1
1
  import { OnDestroy, OnInit } from '@angular/core';
2
- import { DashboardData } from '../../models/ai-receptionist.types';
3
- import { formatOutcomeLabel, outcomeBadgeTone } from '../../utils/call-outcome.util';
4
- import { isNeedsReview, reviewBadgeTone, reviewLabel } from '../../utils/call-review.util';
2
+ import { DashboardData, HistoryCall } from '../../models/ai-receptionist.types';
3
+ import { callerMetaLine, historyResolutionLabel, historyResultChips, resultChipIcon } from '../../utils/call-history-display.util';
4
+ import { isNeedsReview } from '../../utils/call-review.util';
5
5
  import * as i0 from "@angular/core";
6
6
  export declare class DashboardPageComponent implements OnInit, OnDestroy {
7
7
  private readonly api;
@@ -40,21 +40,25 @@ export declare class DashboardPageComponent implements OnInit, OnDestroy {
40
40
  icon: string;
41
41
  suffix: string;
42
42
  })[];
43
+ protected isNeedsReview: typeof isNeedsReview;
44
+ protected callerMetaLine: typeof callerMetaLine;
45
+ protected resultChipIcon: typeof resultChipIcon;
46
+ protected historyResultChips: typeof historyResultChips;
47
+ protected historyResolutionLabel: typeof historyResolutionLabel;
43
48
  ngOnInit(): void;
44
49
  ngOnDestroy(): void;
45
50
  protected statValue(key: keyof DashboardData['stats']): number;
46
51
  protected statusTone(status: string): 'brand' | 'pos' | 'notice' | 'neg' | 'violet' | 'gray';
47
52
  protected statusLabel(status: string): string;
48
- protected outcomeTone: typeof outcomeBadgeTone;
49
- protected outcomeLabel: typeof formatOutcomeLabel;
50
- protected reviewLabel: typeof reviewLabel;
51
- protected reviewTone: typeof reviewBadgeTone;
52
- protected isNeedsReview: typeof isNeedsReview;
53
+ protected historyAvatarTone(row: HistoryCall): 'gray' | 'brand';
54
+ protected resolutionOf(row: HistoryCall): import("../../utils/call-history-display.util").HistoryResolution;
55
+ protected formatDuration(sec: number): string;
53
56
  protected exportCsv(): void;
54
57
  protected openOutboundDial(): void;
55
58
  protected closeOutboundDial(): void;
56
59
  protected openHistoryDetail(id: string): void;
57
60
  protected callDetailLink(callId: string): string[];
61
+ protected appointmentDetailLink(callId: string | null | undefined): string[];
58
62
  static ɵfac: i0.ɵɵFactoryDeclaration<DashboardPageComponent, never>;
59
63
  static ɵcmp: i0.ɵɵComponentDeclaration<DashboardPageComponent, "eds-dashboard-page", never, {}, {}, never, never, true, never>;
60
64
  }
@@ -1,37 +1,27 @@
1
1
  import { OnDestroy, OnInit } from '@angular/core';
2
+ import { LiveCall, Sentiment } from '../../models/ai-receptionist.types';
2
3
  import * as i0 from "@angular/core";
3
- type LiveFilter = 'all' | 'ai' | 'needs-staff';
4
- interface LiveCallsEmptyState {
5
- title: string;
6
- detail: string;
7
- icon: string;
8
- }
9
4
  export declare class LiveCallsPageComponent implements OnInit, OnDestroy {
10
- private readonly api;
11
5
  private readonly router;
12
6
  private readonly route;
13
7
  private readonly liveCallsList;
14
- protected readonly filter: import("@angular/core").WritableSignal<LiveFilter>;
15
- protected readonly calls: import("@angular/core").WritableSignal<import("../../models/ai-receptionist.types").LiveCall[]>;
8
+ protected readonly calls: import("@angular/core").WritableSignal<LiveCall[]>;
16
9
  protected readonly loading: import("@angular/core").WritableSignal<boolean>;
17
10
  protected readonly error: import("@angular/core").WritableSignal<string | null>;
18
- protected readonly lastUpdated: import("@angular/core").WritableSignal<number | null>;
19
- protected readonly filters: {
20
- id: LiveFilter;
21
- label: string;
22
- }[];
23
- protected readonly filteredCalls: import("@angular/core").Signal<import("../../models/ai-receptionist.types").LiveCall[]>;
24
- protected readonly emptyState: import("@angular/core").Signal<LiveCallsEmptyState | null>;
25
- protected readonly waveHeights: number[];
11
+ protected readonly emptyState: import("@angular/core").Signal<{
12
+ title: string;
13
+ detail: string;
14
+ icon: string;
15
+ } | null>;
26
16
  ngOnInit(): void;
27
17
  ngOnDestroy(): void;
28
- protected setFilter(id: LiveFilter): void;
29
- protected refresh(): void;
30
- protected statusTone(status: string): 'brand' | 'pos' | 'notice' | 'neg' | 'violet' | 'gray';
31
- protected statusLabel(status: string): string;
32
- protected monitor(id: string): void;
33
- protected takeover(id: string, event: Event): void;
18
+ protected openMonitor(id: string): void;
19
+ protected displayName(call: LiveCall): string;
20
+ protected displayMeta(call: LiveCall): string;
21
+ protected isUnknown(call: LiveCall): boolean;
22
+ protected sentimentLabel(sentiment: Sentiment | string | null | undefined): string;
23
+ protected avatarInitials(call: LiveCall): string;
24
+ protected avatarTone(call: LiveCall): 'gray' | 'brand';
34
25
  static ɵfac: i0.ɵɵFactoryDeclaration<LiveCallsPageComponent, never>;
35
26
  static ɵcmp: i0.ɵɵComponentDeclaration<LiveCallsPageComponent, "eds-live-calls-page", never, {}, {}, never, never, true, never>;
36
27
  }
37
- export {};
@@ -1,11 +1,15 @@
1
1
  import { OnDestroy, OnInit } from '@angular/core';
2
2
  import { LiveCall, Sentiment } from '../../models/ai-receptionist.types';
3
+ import { StaffMediaMode } from '../../models/staff-media.types';
3
4
  import { toolEventTrackKey } from '../../utils/tool-labels.util';
4
5
  import * as i0 from "@angular/core";
5
6
  export declare class LiveMonitorPageComponent implements OnInit, OnDestroy {
6
7
  private readonly api;
7
8
  private readonly route;
8
9
  private readonly stream;
10
+ private readonly staffMedia;
11
+ private readonly socket;
12
+ private readonly toast;
9
13
  private readonly destroyRef;
10
14
  protected readonly call: import("@angular/core").WritableSignal<LiveCall | null>;
11
15
  protected readonly staffMessage: import("@angular/core").WritableSignal<string>;
@@ -13,24 +17,53 @@ export declare class LiveMonitorPageComponent implements OnInit, OnDestroy {
13
17
  protected readonly callId: import("@angular/core").WritableSignal<string>;
14
18
  protected readonly summary: import("@angular/core").WritableSignal<string | null>;
15
19
  protected readonly summaryLoading: import("@angular/core").WritableSignal<boolean>;
20
+ protected readonly mediaBusy: import("@angular/core").WritableSignal<boolean>;
16
21
  protected readonly liveTools: import("@angular/core").WritableSignal<import("../../models/ai-receptionist.types").ToolEvent[]>;
17
22
  protected readonly callEnded: import("@angular/core").WritableSignal<boolean>;
23
+ protected readonly mediaState: import("@angular/core").WritableSignal<import("../../services/staff-media.service").StaffMediaConnectionState>;
24
+ protected readonly mediaMode: import("@angular/core").WritableSignal<StaffMediaMode | null>;
25
+ protected readonly micEnabled: import("@angular/core").WritableSignal<boolean>;
26
+ protected readonly audioPlaybackAllowed: import("@angular/core").WritableSignal<boolean>;
18
27
  private summaryLoaded;
28
+ private staffJoined;
29
+ private readonly onControlChanged;
19
30
  constructor();
20
31
  ngOnInit(): void;
32
+ /**
33
+ * Leaving the page must never drop the caller. The LiveKit session is owned by the
34
+ * root StaffMediaService and keeps running until End Call or an explicit leave.
35
+ */
21
36
  ngOnDestroy(): void;
37
+ /** True when this page's call is the one the softphone is connected to. */
38
+ protected isMediaForThisCall(): boolean;
22
39
  protected isTakeover(): boolean;
40
+ /** After takeover the AI is gone for good — no resume path is offered. */
41
+ protected isHandedOff(): boolean;
23
42
  protected isPaused(): boolean;
24
43
  protected isLive(): boolean;
25
44
  protected confidenceLevel(confidence: number): 'high' | 'low' | 'mid';
26
45
  protected sentimentPercent(sentiment: Sentiment): number;
27
46
  protected toolStateClass(state: string): string;
28
47
  protected readonly toolTrackKey: typeof toolEventTrackKey;
48
+ protected isUnknownCaller(call: LiveCall): boolean;
49
+ protected displayName(call: LiveCall): string;
50
+ protected profileInitials(call: LiveCall): string;
51
+ protected profileMeta(call: LiveCall): string;
52
+ protected goalBadge(call: LiveCall): string | null;
29
53
  protected takeover(): void;
30
- protected resumeAi(): void;
54
+ protected toggleMic(): void;
31
55
  protected transfer(): void;
32
56
  protected endCall(): void;
33
57
  protected sendMessage(): void;
58
+ protected enableSound(): void;
59
+ private joinMedia;
60
+ /**
61
+ * Disconnect LiveKit first, then tell the server to drop staff and restore AI.
62
+ * Only valid in listen mode — a taken-over call stays with the human.
63
+ * Does not hang up the patient.
64
+ */
65
+ private leaveMedia;
66
+ private applyJoinMetadata;
34
67
  /** Initial load — seeds transcript/tools from REST, then starts socket. */
35
68
  private loadCallMetadata;
36
69
  /** Metadata-only refresh after staff actions — does not overwrite live transcript/tools. */
@@ -16,6 +16,20 @@ export interface SettingsSectionMeta {
16
16
  title: string;
17
17
  description: string;
18
18
  }
19
+ export declare const AGENT_TONE_OPTIONS: SettingsFieldOption[];
20
+ export declare const LANGUAGE_OPTIONS: SettingsFieldOption[];
21
+ export declare const GREETING_VARIABLES: {
22
+ key: string;
23
+ label: string;
24
+ token: string;
25
+ }[];
26
+ export declare const RETENTION_DAY_OPTIONS: SettingsFieldOption[];
27
+ export declare const RING_TIMEOUT_OPTIONS: SettingsFieldOption[];
28
+ export declare const MAX_CALL_DURATION_OPTIONS: SettingsFieldOption[];
29
+ export declare const SILENCE_TIMEOUT_OPTIONS: SettingsFieldOption[];
30
+ export declare const AI_ANSWER_MODE_OPTIONS: SettingsFieldOption[];
31
+ export declare const AFTER_HOURS_OPTIONS: SettingsFieldOption[];
32
+ export declare const DEFAULT_DISCLOSURE_WARNING = "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.";
19
33
  export declare const SETTINGS_SECTION_META: Record<SettingsSection, SettingsSectionMeta>;
20
34
  /** Entire sections where every field is read-only (including unknown API fields). */
21
35
  export declare const READ_ONLY_SECTIONS: Set<SettingsSection>;
@@ -33,3 +47,5 @@ export declare const SETTINGS_FIELDS: Record<SettingsSection, SettingsFieldMeta[
33
47
  /** Fallback label for API fields not listed in config. */
34
48
  export declare function humanizeFieldKey(key: string): string;
35
49
  export declare function resolveFieldMeta(section: SettingsSection, key: string, value: string | boolean | number): SettingsFieldMeta;
50
+ export declare function parseCsvList(value: unknown): string[];
51
+ export declare function toCsvList(values: string[]): string;
@@ -1,37 +1,58 @@
1
1
  import { OnInit } from '@angular/core';
2
- import { AgentSettings } from '../../models/ai-receptionist.types';
3
- import { isFieldReadOnly, SettingsFieldMeta, SettingsSection } from './settings-fields.config';
2
+ import { AgentSettings, LocationOption } from '../../models/ai-receptionist.types';
3
+ import { isFieldReadOnly, SettingsFieldMeta } from './settings-fields.config';
4
4
  import * as i0 from "@angular/core";
5
5
  type SettingsTab = keyof AgentSettings;
6
6
  export declare class SettingsPageComponent implements OnInit {
7
7
  private readonly api;
8
8
  private readonly toast;
9
+ private readonly route;
10
+ private readonly agentOnline;
9
11
  private originalSettings;
10
12
  protected readonly isFieldReadOnly: typeof isFieldReadOnly;
11
- protected readonly readOnlySections: Set<SettingsSection>;
12
- protected readonly disabledTabs: Set<SettingsSection>;
13
+ protected readonly knowledgeMax = 8000;
14
+ protected readonly disclosureMax = 1000;
15
+ protected readonly welcomeMax = 1000;
16
+ protected readonly voicePresets: readonly import("./tts-voice-presets").TtsVoicePreset[];
17
+ protected readonly toneOptions: import("./settings-fields.config").SettingsFieldOption[];
18
+ protected readonly greetingVariables: {
19
+ key: string;
20
+ label: string;
21
+ token: string;
22
+ }[];
23
+ protected readonly retentionOptions: import("./settings-fields.config").SettingsFieldOption[];
24
+ protected readonly ringTimeoutOptions: import("./settings-fields.config").SettingsFieldOption[];
25
+ protected readonly maxCallDurationOptions: import("./settings-fields.config").SettingsFieldOption[];
26
+ protected readonly silenceTimeoutOptions: import("./settings-fields.config").SettingsFieldOption[];
27
+ protected readonly answerModeOptions: import("./settings-fields.config").SettingsFieldOption[];
28
+ protected readonly afterHoursOptions: import("./settings-fields.config").SettingsFieldOption[];
13
29
  protected readonly settings: import("@angular/core").WritableSignal<AgentSettings | null>;
14
30
  protected readonly tab: import("@angular/core").WritableSignal<keyof AgentSettings>;
15
31
  protected readonly loading: import("@angular/core").WritableSignal<boolean>;
16
32
  protected readonly saving: import("@angular/core").WritableSignal<boolean>;
17
33
  protected readonly saved: import("@angular/core").WritableSignal<boolean>;
18
- protected readonly welcomeMax = 500;
19
- protected readonly previewingVoice: import("@angular/core").WritableSignal<boolean>;
20
- private voicePreviewAudio;
34
+ protected readonly knowledgeTestOpen: import("@angular/core").WritableSignal<boolean>;
35
+ protected readonly locations: import("@angular/core").WritableSignal<LocationOption[]>;
36
+ protected readonly confirmOffOpen: import("@angular/core").WritableSignal<boolean>;
37
+ protected readonly online: import("@angular/core").Signal<import("../../services/agent-online.service").AgentOnlineKnownState>;
38
+ protected readonly agentLoading: import("@angular/core").Signal<boolean>;
39
+ protected readonly toggling: import("@angular/core").Signal<boolean>;
21
40
  protected readonly tabs: {
22
41
  id: SettingsTab;
23
42
  label: string;
24
- icon: string;
25
43
  }[];
26
44
  protected readonly sectionMeta: import("@angular/core").Signal<import("./settings-fields.config").SettingsSectionMeta>;
27
45
  protected readonly fieldsForTab: import("@angular/core").Signal<SettingsFieldMeta[]>;
28
- protected readonly generalIdentityFields: import("@angular/core").Signal<SettingsFieldMeta[]>;
29
- protected readonly generalOtherFields: import("@angular/core").Signal<SettingsFieldMeta[]>;
30
46
  protected readonly welcomeMessage: import("@angular/core").Signal<string>;
31
47
  protected readonly welcomePlaceholder: import("@angular/core").Signal<string>;
32
48
  protected readonly welcomePreview: import("@angular/core").Signal<string>;
33
- protected readonly usingDefaultWelcome: import("@angular/core").Signal<boolean>;
34
- protected readonly showRecordingConsentHint: import("@angular/core").Signal<boolean>;
49
+ protected readonly whatToSay: import("@angular/core").Signal<string>;
50
+ protected readonly whatNotToSay: import("@angular/core").Signal<string>;
51
+ protected readonly selectedLocationIds: import("@angular/core").Signal<string[]>;
52
+ protected readonly selectedTone: import("@angular/core").Signal<string>;
53
+ protected readonly disclosureEnabled: import("@angular/core").Signal<boolean>;
54
+ protected readonly disclosureText: import("@angular/core").Signal<string>;
55
+ protected readonly agentSwitchDisabled: import("@angular/core").Signal<boolean>;
35
56
  ngOnInit(): void;
36
57
  protected fieldIsReadOnly(section: SettingsTab, key: string): boolean;
37
58
  protected sectionIsReadOnly(section: SettingsTab): boolean;
@@ -39,8 +60,21 @@ export declare class SettingsPageComponent implements OnInit {
39
60
  protected setTab(id: SettingsTab): void;
40
61
  protected updateField(section: SettingsTab, key: string, value: string | boolean | number): void;
41
62
  protected updateWelcomeMessage(value: string): void;
42
- protected resetWelcomeMessage(): void;
43
- protected previewSelectedVoice(): void;
63
+ protected insertGreetingVariable(token: string): void;
64
+ protected updateKnowledgeField(key: 'whatToSay' | 'whatNotToSay', value: string): void;
65
+ protected setTone(tone: string): void;
66
+ protected toggleLocation(id: string): void;
67
+ protected selectNumberField(section: 'phone' | 'transcripts', key: string, value: string): void;
68
+ protected numberFieldAsString(section: 'phone' | 'transcripts', key: string): string;
69
+ protected setDisclosureEnabled(enabled: boolean): void;
70
+ protected updateDisclosureText(value: string): void;
71
+ protected openTestCall(): void;
72
+ protected closeTestCall(): void;
73
+ protected selectedVoiceId(): string;
74
+ protected onAgentToggleClick(): void;
75
+ protected cancelConfirmOff(): void;
76
+ protected confirmTurnOff(): void;
77
+ private applyOnline;
44
78
  protected fieldValue(section: SettingsTab, key: string): string | boolean | number;
45
79
  protected save(): void;
46
80
  private restoreReadOnlyFields;
@@ -5,7 +5,10 @@ import * as i0 from "@angular/core";
5
5
  export declare class TasksPageComponent implements OnInit {
6
6
  private readonly api;
7
7
  private readonly route;
8
+ protected readonly pageSize = 50;
8
9
  protected readonly tasks: import("@angular/core").WritableSignal<TaskItem[]>;
10
+ protected readonly total: import("@angular/core").WritableSignal<number>;
11
+ protected readonly page: import("@angular/core").WritableSignal<number>;
9
12
  protected readonly loading: import("@angular/core").WritableSignal<boolean>;
10
13
  protected readonly selectedTask: import("@angular/core").WritableSignal<TaskItem | null>;
11
14
  protected readonly statusFilter: import("@angular/core").WritableSignal<"" | TaskStatus>;
@@ -29,6 +32,9 @@ export declare class TasksPageComponent implements OnInit {
29
32
  protected openTask(task: TaskItem): void;
30
33
  protected closeDrawer(): void;
31
34
  protected onStatusChange(status: TaskStatus): void;
35
+ protected totalPages(): number;
36
+ protected prevPage(): void;
37
+ protected nextPage(): void;
32
38
  private load;
33
39
  static ɵfac: i0.ɵɵFactoryDeclaration<TasksPageComponent, never>;
34
40
  static ɵcmp: i0.ɵɵComponentDeclaration<TasksPageComponent, "eds-tasks-page", never, {}, {}, never, never, true, never>;
@@ -1,7 +1,11 @@
1
1
  import { Observable } from 'rxjs';
2
2
  import { AgentSettings, AiReceptionistStatus, AnalyticsData, AuditEvent, DashboardData, CallRecordingMeta, HistoryCall, HistoryDetail, LiveCall, LocationOption, ProviderOption, SetupData, TaskItem, CreateTaskRequest, TaskFilters, RegenerateSummaryResult, ToolEvent, TranscriptLine } from '../models/ai-receptionist.types';
3
+ import { StaffMediaJoinResult, StaffMediaMode } from '../models/staff-media.types';
4
+ import { type PaginatedResult } from '../models/pagination';
3
5
  import { ApiLogDetail, ApiLogFilters, ApiLogListResponse, ApiLogStats } from '../models/api-log.types';
4
6
  import { CreateOutboundPurposeRequest, OutboundPurpose, OutboundPurposesResponse, PlaceOutboundCallRequest, PlaceOutboundCallResponse, UpdateOutboundPurposeRequest } from '../models/outbound-purpose.types';
7
+ import type { OutboundAppointmentHit, OutboundPatientHit } from '../models/outbound-patient.types';
8
+ import type { AgentActivity, AgentActivityFilters } from '../models/agent-activity.types';
5
9
  import * as i0 from "@angular/core";
6
10
  export declare class AiReceptionistApiMockService {
7
11
  private readonly liveCalls;
@@ -11,6 +15,7 @@ export declare class AiReceptionistApiMockService {
11
15
  private readonly status;
12
16
  private readonly outboundPurposes;
13
17
  private mock;
18
+ private paginate;
14
19
  getStatus(): Observable<{
15
20
  data: AiReceptionistStatus;
16
21
  }>;
@@ -42,9 +47,9 @@ export declare class AiReceptionistApiMockService {
42
47
  outcome?: string;
43
48
  location?: string;
44
49
  review?: 'needs' | 'reviewed';
45
- }): Observable<{
46
- data: HistoryCall[];
47
- }>;
50
+ page?: number;
51
+ limit?: number;
52
+ }): Observable<PaginatedResult<HistoryCall>>;
48
53
  getCallDetail(id: string): Observable<{
49
54
  data: HistoryDetail | null;
50
55
  }>;
@@ -56,6 +61,14 @@ export declare class AiReceptionistApiMockService {
56
61
  success: boolean;
57
62
  };
58
63
  }>;
64
+ postMediaJoin(id: string, mode: StaffMediaMode): Observable<{
65
+ data: StaffMediaJoinResult;
66
+ }>;
67
+ postMediaLeave(id: string): Observable<{
68
+ data: {
69
+ success: boolean;
70
+ };
71
+ }>;
59
72
  postResumeAi(id: string): Observable<{
60
73
  data: {
61
74
  success: boolean;
@@ -66,6 +79,16 @@ export declare class AiReceptionistApiMockService {
66
79
  success: boolean;
67
80
  };
68
81
  }>;
82
+ postResume(id: string): Observable<{
83
+ data: {
84
+ success: boolean;
85
+ };
86
+ }>;
87
+ postListen(id: string): Observable<{
88
+ data: {
89
+ success: boolean;
90
+ };
91
+ }>;
69
92
  postTransfer(id: string): Observable<{
70
93
  data: {
71
94
  success: boolean;
@@ -86,9 +109,7 @@ export declare class AiReceptionistApiMockService {
86
109
  review: string;
87
110
  };
88
111
  }>;
89
- getTasks(filters?: TaskFilters): Observable<{
90
- data: TaskItem[];
91
- }>;
112
+ getTasks(filters?: TaskFilters): Observable<PaginatedResult<TaskItem>>;
92
113
  getCallTasks(callId: string): Observable<{
93
114
  data: TaskItem[];
94
115
  }>;
@@ -108,10 +129,22 @@ export declare class AiReceptionistApiMockService {
108
129
  data: AgentSettings;
109
130
  }>;
110
131
  previewVoice(_voiceId: string): Observable<Blob>;
111
- private withEffectiveWelcome;
112
- getAudit(q?: string, actor?: string): Observable<{
113
- data: AuditEvent[];
132
+ testKnowledgeAnswer(params: {
133
+ question: string;
134
+ whatToSay: string;
135
+ whatNotToSay: string;
136
+ voiceId?: string;
137
+ }): Observable<{
138
+ answer: string;
139
+ voiceId: string;
140
+ audioBlob: Blob;
114
141
  }>;
142
+ private withEffectiveWelcome;
143
+ getAudit(q?: string, actor?: string, opts?: {
144
+ page?: number;
145
+ limit?: number;
146
+ }): Observable<PaginatedResult<AuditEvent>>;
147
+ getActivities(filters?: AgentActivityFilters): Observable<PaginatedResult<AgentActivity>>;
115
148
  getSetup(): Observable<{
116
149
  data: SetupData;
117
150
  }>;
@@ -144,6 +177,8 @@ export declare class AiReceptionistApiMockService {
144
177
  success: boolean;
145
178
  }>;
146
179
  placeOutboundCall(body: PlaceOutboundCallRequest): Observable<PlaceOutboundCallResponse>;
180
+ searchPatientsForOutbound(q: string, limit?: number): Observable<OutboundPatientHit[]>;
181
+ listPatientAppointmentsForOutbound(patientId: string, limit?: number): Observable<OutboundAppointmentHit[]>;
147
182
  private patchLive;
148
183
  static ɵfac: i0.ɵɵFactoryDeclaration<AiReceptionistApiMockService, never>;
149
184
  static ɵprov: i0.ɵɵInjectableDeclaration<AiReceptionistApiMockService>;
@@ -1,7 +1,11 @@
1
1
  import { Observable } from 'rxjs';
2
2
  import { ApiLogDetail, ApiLogFilters, ApiLogListResponse, ApiLogStats } from '../models/api-log.types';
3
3
  import { CreateOutboundPurposeRequest, OutboundPurpose, OutboundPurposesResponse, PlaceOutboundCallRequest, PlaceOutboundCallResponse, UpdateOutboundPurposeRequest } from '../models/outbound-purpose.types';
4
+ import { type OutboundAppointmentHit, type OutboundPatientHit } from '../models/outbound-patient.types';
5
+ import { type StaffMediaJoinResult, type StaffMediaMode } from '../models/staff-media.types';
4
6
  import { AgentSettings, AiReceptionistStatus, AnalyticsData, AuditEvent, DashboardData, HistoryCall, HistoryDetail, LiveCall, RegenerateSummaryResult, LocationOption, ProviderOption, SetupData, TaskItem, CreateTaskRequest, TaskFilters, ToolEvent, TranscriptLine, CallRecordingMeta } from '../models/ai-receptionist.types';
7
+ import { type AgentActivity, type AgentActivityFilters } from '../models/agent-activity.types';
8
+ import { type PaginatedResult } from '../models/pagination';
5
9
  import * as i0 from "@angular/core";
6
10
  export declare class AiReceptionistApiService {
7
11
  private readonly http;
@@ -47,20 +51,35 @@ export declare class AiReceptionistApiService {
47
51
  outcome?: string;
48
52
  location?: string;
49
53
  review?: 'needs' | 'reviewed';
50
- }): Observable<{
51
- data: HistoryCall[];
52
- }>;
54
+ page?: number;
55
+ limit?: number;
56
+ }): Observable<PaginatedResult<HistoryCall>>;
53
57
  getCallDetail(id: string): Observable<{
54
58
  data: HistoryDetail | null;
55
59
  }>;
56
60
  regenerateCallSummary(callId: string): Observable<{
57
61
  data: RegenerateSummaryResult;
58
62
  }>;
59
- postTakeover(id: string): Observable<{
63
+ /**
64
+ * Staff softphone join into LiveKit room `call-{callId}`.
65
+ * POST /calls/:id/media/join { mode: listen|takeover }
66
+ */
67
+ postMediaJoin(id: string, mode: StaffMediaMode): Observable<{
68
+ data: StaffMediaJoinResult;
69
+ }>;
70
+ /** Drop staff WebRTC only; does not hang up the patient. */
71
+ postMediaLeave(id: string): Observable<{
60
72
  data: {
61
73
  success: boolean;
62
74
  };
63
75
  }>;
76
+ /**
77
+ * Take over — same join payload as media/join { mode: takeover }.
78
+ * Prefer this or postMediaJoin('takeover'); both are supported by BE.
79
+ */
80
+ postTakeover(id: string): Observable<{
81
+ data: StaffMediaJoinResult;
82
+ }>;
64
83
  postResumeAi(id: string): Observable<{
65
84
  data: {
66
85
  success: boolean;
@@ -71,6 +90,15 @@ export declare class AiReceptionistApiService {
71
90
  success: boolean;
72
91
  };
73
92
  }>;
93
+ postResume(id: string): Observable<{
94
+ data: {
95
+ success: boolean;
96
+ };
97
+ }>;
98
+ /** Listen — same join payload as media/join { mode: listen }. */
99
+ postListen(id: string): Observable<{
100
+ data: StaffMediaJoinResult;
101
+ }>;
74
102
  postTransfer(id: string): Observable<{
75
103
  data: {
76
104
  success: boolean;
@@ -91,9 +119,7 @@ export declare class AiReceptionistApiService {
91
119
  review: string;
92
120
  };
93
121
  }>;
94
- getTasks(filters?: TaskFilters): Observable<{
95
- data: TaskItem[];
96
- }>;
122
+ getTasks(filters?: TaskFilters): Observable<PaginatedResult<TaskItem>>;
97
123
  getCallTasks(callId: string): Observable<{
98
124
  data: TaskItem[];
99
125
  }>;
@@ -114,9 +140,29 @@ export declare class AiReceptionistApiService {
114
140
  }>;
115
141
  /** ElevenLabs spoken sample for Agent Settings voice picker. */
116
142
  previewVoice(voiceId: string): Observable<Blob>;
117
- getAudit(q?: string): Observable<{
118
- data: AuditEvent[];
119
- }>;
143
+ /**
144
+ * Knowledge Base test: draft an answer from whatToSay / whatNotToSay and
145
+ * return spoken audio in the practice (or selected) voice.
146
+ */
147
+ testKnowledgeAnswer(params: {
148
+ question: string;
149
+ whatToSay: string;
150
+ whatNotToSay: string;
151
+ voiceId?: string;
152
+ }): Observable<{
153
+ answer: string;
154
+ voiceId: string;
155
+ audioBlob: Blob;
156
+ }>;
157
+ getAudit(q?: string, opts?: {
158
+ page?: number;
159
+ limit?: number;
160
+ }): Observable<PaginatedResult<AuditEvent>>;
161
+ /**
162
+ * Agent activity feed: patients created, appointments booked, tasks from AI.
163
+ * GET /api/ai-receptionist/activities
164
+ */
165
+ getActivities(filters?: AgentActivityFilters): Observable<PaginatedResult<AgentActivity>>;
120
166
  getSetup(): Observable<{
121
167
  data: SetupData;
122
168
  }>;
@@ -149,6 +195,15 @@ export declare class AiReceptionistApiService {
149
195
  success: boolean;
150
196
  }>;
151
197
  placeOutboundCall(body: PlaceOutboundCallRequest): Observable<PlaceOutboundCallResponse>;
198
+ /**
199
+ * Patient typeahead for outbound dialer.
200
+ * Tries `/api/v1/patients/search`, then `/api/v1/patients?q=`, then by-phone for digit queries.
201
+ */
202
+ searchPatientsForOutbound(q: string, limit?: number): Observable<OutboundPatientHit[]>;
203
+ /** Upcoming appointments for a patient (dialer picker). */
204
+ listPatientAppointmentsForOutbound(patientId: string, limit?: number): Observable<OutboundAppointmentHit[]>;
205
+ private mapPatientHits;
206
+ private mapAppointmentHits;
152
207
  private postCallAction;
153
208
  private apiErrorMessage;
154
209
  static ɵfac: i0.ɵɵFactoryDeclaration<AiReceptionistApiService, never>;
@@ -10,6 +10,7 @@ export declare class LiveTranscriptService {
10
10
  readonly lines: import("@angular/core").WritableSignal<TranscriptLine[]>;
11
11
  readonly patientInterim: import("@angular/core").WritableSignal<string | null>;
12
12
  readonly aiInterim: import("@angular/core").WritableSignal<string | null>;
13
+ readonly staffInterim: import("@angular/core").WritableSignal<string | null>;
13
14
  readonly tools: import("@angular/core").WritableSignal<ToolEvent[]>;
14
15
  readonly connected: import("@angular/core").WritableSignal<boolean>;
15
16
  readonly error: import("@angular/core").WritableSignal<string | null>;