@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.
- package/README.md +3 -0
- package/fesm2022/edvak99-voice-receptionist-widget-activities-page.component-DT9UKvQO.mjs +307 -0
- package/fesm2022/edvak99-voice-receptionist-widget-activities-page.component-DT9UKvQO.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-CMhknpGf.mjs → edvak99-voice-receptionist-widget-ai-receptionist-api.service-48cifVPF.mjs} +1351 -579
- package/fesm2022/edvak99-voice-receptionist-widget-ai-receptionist-api.service-48cifVPF.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-analytics-page.component-C5inEHJw.mjs +278 -0
- package/fesm2022/edvak99-voice-receptionist-widget-analytics-page.component-C5inEHJw.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-detail-page.component-sYhM20CE.mjs +418 -0
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-detail-page.component-sYhM20CE.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-page.component-DpwajEOE.mjs +194 -0
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-page.component-DpwajEOE.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-call-recording-player.component-AN6GcSDq.mjs → edvak99-voice-receptionist-widget-call-recording-player.component-CgkRcFOl.mjs} +5 -4
- 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
- package/fesm2022/{edvak99-voice-receptionist-widget-call-review.service-Cy_Bf7AO.mjs → edvak99-voice-receptionist-widget-call-review.service-CIMcjGKX.mjs} +2 -2
- 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
- package/fesm2022/edvak99-voice-receptionist-widget-call-review.util-Deh3jPgo.mjs +21 -0
- package/fesm2022/edvak99-voice-receptionist-widget-call-review.util-Deh3jPgo.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-dashboard-page.component-CxbO0eDS.mjs +440 -0
- package/fesm2022/edvak99-voice-receptionist-widget-dashboard-page.component-CxbO0eDS.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-eds-elapsed.pipe-ouRlPpwT.mjs → edvak99-voice-receptionist-widget-dashboard-socket.service-BX91r74O.mjs} +5 -21
- package/fesm2022/edvak99-voice-receptionist-widget-dashboard-socket.service-BX91r74O.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-eds-avatar.component-CWRiJGfv.mjs +38 -0
- package/fesm2022/edvak99-voice-receptionist-widget-eds-avatar.component-CWRiJGfv.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-eds-button.component-Bg5T5BN8.mjs +27 -0
- package/fesm2022/edvak99-voice-receptionist-widget-eds-button.component-Bg5T5BN8.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-eds-elapsed.pipe-BFCiJOT3.mjs +22 -0
- package/fesm2022/edvak99-voice-receptionist-widget-eds-elapsed.pipe-BFCiJOT3.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-live-calls-list.service-CDtFRW8w.mjs → edvak99-voice-receptionist-widget-eds-pulse-dot.component-BPY6xN7C.mjs} +15 -5
- package/fesm2022/edvak99-voice-receptionist-widget-eds-pulse-dot.component-BPY6xN7C.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-BsBQIS_f.mjs +203 -0
- package/fesm2022/edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-BsBQIS_f.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-live-calls-page.component-CaSDMxpV.mjs +81 -0
- package/fesm2022/edvak99-voice-receptionist-widget-live-calls-page.component-CaSDMxpV.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-live-monitor-page.component-Cy3ND-c-.mjs +1070 -0
- package/fesm2022/edvak99-voice-receptionist-widget-live-monitor-page.component-Cy3ND-c-.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-modal.component-COfi7biN.mjs +48 -0
- package/fesm2022/edvak99-voice-receptionist-widget-modal.component-COfi7biN.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-outbound-purpose.util-Bdh4QfFe.mjs +127 -0
- package/fesm2022/edvak99-voice-receptionist-widget-outbound-purpose.util-Bdh4QfFe.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-outbound-purposes-page.component-fHVzpiVk.mjs +268 -0
- package/fesm2022/edvak99-voice-receptionist-widget-outbound-purposes-page.component-fHVzpiVk.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-settings-page.component-Bok64X2q.mjs +968 -0
- package/fesm2022/edvak99-voice-receptionist-widget-settings-page.component-Bok64X2q.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-tasks-page.component-Bb9lPcYi.mjs +317 -0
- package/fesm2022/edvak99-voice-receptionist-widget-tasks-page.component-Bb9lPcYi.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-wizard-page.component-CJLa5pia.mjs → edvak99-voice-receptionist-widget-wizard-page.component-BZVlWLWh.mjs} +6 -4
- package/fesm2022/{edvak99-voice-receptionist-widget-wizard-page.component-CJLa5pia.mjs.map → edvak99-voice-receptionist-widget-wizard-page.component-BZVlWLWh.mjs.map} +1 -1
- package/fesm2022/edvak99-voice-receptionist-widget.mjs +1 -1
- package/lib/components/call-conversation-panel/call-conversation-panel.component.d.ts +9 -6
- package/lib/components/call-tasks-panel/call-tasks-panel.component.d.ts +8 -8
- package/lib/components/knowledge-test-modal/knowledge-test-modal.component.d.ts +28 -0
- package/lib/components/live-transcript-panel/live-transcript-panel.component.d.ts +7 -4
- package/lib/components/outbound-dial-modal/outbound-dial-modal.component.d.ts +26 -0
- package/lib/layout/eds-module-nav.component.d.ts +0 -3
- package/lib/mocks/agent-activity.seed.d.ts +2 -0
- package/lib/models/agent-activity.types.d.ts +54 -0
- package/lib/models/ai-receptionist.types.d.ts +26 -0
- package/lib/models/api-dto.types.d.ts +18 -0
- package/lib/models/live-transcript.types.d.ts +2 -1
- package/lib/models/outbound-patient.types.d.ts +23 -0
- package/lib/models/outbound-purpose.types.d.ts +2 -0
- package/lib/models/pagination.d.ts +11 -0
- package/lib/models/staff-media.types.d.ts +36 -0
- package/lib/pages/activities-page/activities-page.component.d.ts +57 -0
- package/lib/pages/analytics-page/analytics-page.component.d.ts +38 -14
- package/lib/pages/call-history-detail-page/call-history-detail-page.component.d.ts +2 -3
- package/lib/pages/call-history-page/call-history-page.component.d.ts +16 -9
- package/lib/pages/dashboard-page/dashboard-page.component.d.ts +12 -8
- package/lib/pages/live-calls-page/live-calls-page.component.d.ts +14 -24
- package/lib/pages/live-monitor-page/live-monitor-page.component.d.ts +34 -1
- package/lib/pages/settings-page/settings-fields.config.d.ts +16 -0
- package/lib/pages/settings-page/settings-page.component.d.ts +48 -14
- package/lib/pages/tasks-page/tasks-page.component.d.ts +6 -0
- package/lib/services/ai-receptionist-api.mock.d.ts +44 -9
- package/lib/services/ai-receptionist-api.service.d.ts +65 -10
- package/lib/services/live-transcript.service.d.ts +1 -0
- package/lib/services/staff-media.service.d.ts +52 -0
- package/lib/ui/eds-avatar.component.d.ts +5 -2
- package/lib/ui/eds-button.component.d.ts +1 -1
- package/lib/utils/call-history-display.util.d.ts +21 -0
- package/lib/utils/outbound-purpose.util.d.ts +19 -0
- package/lib/utils/transcript-timing.util.d.ts +1 -1
- package/lib/utils/welcome-message.util.d.ts +1 -1
- package/package.json +2 -1
- package/styles/_index.scss +5 -40
- package/styles/chat-ui.scss +18 -18
- package/styles/eds.scss +188 -119
- package/fesm2022/edvak99-voice-receptionist-widget-analytics-page.component-CW5OKmik.mjs +0 -113
- package/fesm2022/edvak99-voice-receptionist-widget-analytics-page.component-CW5OKmik.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-audit-page.component-DL1GfQyF.mjs +0 -35
- package/fesm2022/edvak99-voice-receptionist-widget-audit-page.component-DL1GfQyF.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-detail-page.component-CTwfUHUf.mjs +0 -316
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-detail-page.component-CTwfUHUf.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-page.component-Cj4wxd4e.mjs +0 -138
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-page.component-Cj4wxd4e.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-call-review.util-DQLIw7xb.mjs +0 -70
- package/fesm2022/edvak99-voice-receptionist-widget-call-review.util-DQLIw7xb.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-dashboard-page.component-DzdIt2A7.mjs +0 -248
- package/fesm2022/edvak99-voice-receptionist-widget-dashboard-page.component-DzdIt2A7.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-eds-avatar.component-PCnIWeOA.mjs +0 -27
- package/fesm2022/edvak99-voice-receptionist-widget-eds-avatar.component-PCnIWeOA.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-eds-elapsed.pipe-ouRlPpwT.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-CMhknpGf.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-knowledge-hub.page-cZqBuull.mjs +0 -575
- package/fesm2022/edvak99-voice-receptionist-widget-knowledge-hub.page-cZqBuull.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-live-calls-list.service-CDtFRW8w.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-live-calls-page.component-DrYzXJQW.mjs +0 -115
- package/fesm2022/edvak99-voice-receptionist-widget-live-calls-page.component-DrYzXJQW.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-live-monitor-page.component-D7dlk0y2.mjs +0 -574
- package/fesm2022/edvak99-voice-receptionist-widget-live-monitor-page.component-D7dlk0y2.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-outbound-purpose.util-BQECIuJu.mjs +0 -54
- package/fesm2022/edvak99-voice-receptionist-widget-outbound-purpose.util-BQECIuJu.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-outbound-purposes-page.component-CJ8NEjcj.mjs +0 -265
- package/fesm2022/edvak99-voice-receptionist-widget-outbound-purposes-page.component-CJ8NEjcj.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-settings-page.component-Bo3XNK3b.mjs +0 -509
- package/fesm2022/edvak99-voice-receptionist-widget-settings-page.component-Bo3XNK3b.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-task.util-DdtI0CR3.mjs +0 -52
- package/fesm2022/edvak99-voice-receptionist-widget-task.util-DdtI0CR3.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-tasks-page.component-CBwl15NP.mjs +0 -237
- package/fesm2022/edvak99-voice-receptionist-widget-tasks-page.component-CBwl15NP.mjs.map +0 -1
- package/lib/knowledge/components/faq-empty-state/faq-empty-state.component.d.ts +0 -22
- package/lib/knowledge/components/faq-form/faq-form.component.d.ts +0 -27
- package/lib/knowledge/components/faq-search-tester/faq-search-tester.component.d.ts +0 -17
- package/lib/knowledge/mocks/practice-faq.seed.d.ts +0 -2
- package/lib/knowledge/models/practice-faq.model.d.ts +0 -47
- package/lib/knowledge/pages/knowledge-hub.page.d.ts +0 -47
- package/lib/knowledge/services/practice-faq-api.mock.d.ts +0 -16
- package/lib/knowledge/services/practice-faq-api.service.d.ts +0 -22
- package/lib/knowledge/utils/faq.util.d.ts +0 -3
- package/lib/layout/eds-topbar.component.d.ts +0 -29
- package/lib/pages/audit-page/audit-page.component.d.ts +0 -14
- package/lib/ui/eds-waveform.component.d.ts +0 -8
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { StaffMediaJoinResult, StaffMediaMode } from '../models/staff-media.types';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export type StaffMediaConnectionState = 'idle' | 'connecting' | 'connected' | 'disconnecting' | 'error';
|
|
4
|
+
/**
|
|
5
|
+
* Browser softphone for staff Listen / Take Over via LiveKit.
|
|
6
|
+
* Secrets stay on the server — FE only uses short-lived clientToken + livekitUrl.
|
|
7
|
+
*
|
|
8
|
+
* Root-provided on purpose: the session must survive navigating away from the
|
|
9
|
+
* Live Monitor page, otherwise switching dashboard tabs would drop the call.
|
|
10
|
+
*/
|
|
11
|
+
export declare class StaffMediaService {
|
|
12
|
+
readonly connectionState: import("@angular/core").WritableSignal<StaffMediaConnectionState>;
|
|
13
|
+
readonly mode: import("@angular/core").WritableSignal<StaffMediaMode | null>;
|
|
14
|
+
readonly micEnabled: import("@angular/core").WritableSignal<boolean>;
|
|
15
|
+
readonly error: import("@angular/core").WritableSignal<string | null>;
|
|
16
|
+
readonly activeCallId: import("@angular/core").WritableSignal<string | null>;
|
|
17
|
+
/** False when the browser blocks autoplay — UI should offer an "enable sound" action. */
|
|
18
|
+
readonly audioPlaybackAllowed: import("@angular/core").WritableSignal<boolean>;
|
|
19
|
+
/** True once remote caller audio is actually attached and playing. */
|
|
20
|
+
readonly remoteAudioAttached: import("@angular/core").WritableSignal<boolean>;
|
|
21
|
+
private room;
|
|
22
|
+
private audioContainer;
|
|
23
|
+
private readonly attached;
|
|
24
|
+
get isConnected(): boolean;
|
|
25
|
+
/** True when a softphone session is live for this call, regardless of page. */
|
|
26
|
+
isConnectedTo(callId: string): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* getUserMedia only exists in a secure context (https or localhost) and, inside an
|
|
29
|
+
* iframe, requires allow="microphone". Returns null when capture is possible.
|
|
30
|
+
*/
|
|
31
|
+
microphoneBlockedReason(): string | null;
|
|
32
|
+
join(join: StaffMediaJoinResult): Promise<void>;
|
|
33
|
+
setMicrophoneEnabled(enabled: boolean): Promise<void>;
|
|
34
|
+
toggleMicrophone(): Promise<void>;
|
|
35
|
+
/** Retry blocked autoplay — must be called from a user gesture. */
|
|
36
|
+
startAudioPlayback(): Promise<void>;
|
|
37
|
+
disconnect(): Promise<void>;
|
|
38
|
+
private readonly onTrackSubscribed;
|
|
39
|
+
private readonly onTrackUnsubscribed;
|
|
40
|
+
private readonly onParticipantDisconnected;
|
|
41
|
+
/** Staff tracks are dropped server-side as soon as they appear. */
|
|
42
|
+
private readonly onTrackPublished;
|
|
43
|
+
private attachExistingRemoteTracks;
|
|
44
|
+
private isStaff;
|
|
45
|
+
private detachKey;
|
|
46
|
+
private ensureAudioContainer;
|
|
47
|
+
private enableMicrophone;
|
|
48
|
+
private friendlyError;
|
|
49
|
+
private cleanupLocal;
|
|
50
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<StaffMediaService, never>;
|
|
51
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<StaffMediaService>;
|
|
52
|
+
}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import * as i0 from "@angular/core";
|
|
2
|
+
export type EdsAvatarTone = 'gray' | 'brand' | 'green' | 'amber' | 'violet' | 'rose';
|
|
3
|
+
export type EdsAvatarShape = 'circle' | 'box';
|
|
2
4
|
export declare class EdsAvatarComponent {
|
|
3
5
|
readonly initials: import("@angular/core").InputSignal<string>;
|
|
4
|
-
readonly tone: import("@angular/core").InputSignal<
|
|
6
|
+
readonly tone: import("@angular/core").InputSignal<string>;
|
|
7
|
+
readonly shape: import("@angular/core").InputSignal<EdsAvatarShape>;
|
|
5
8
|
readonly gradient: import("@angular/core").InputSignal<boolean>;
|
|
6
9
|
static ɵfac: i0.ɵɵFactoryDeclaration<EdsAvatarComponent, never>;
|
|
7
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<EdsAvatarComponent, "eds-avatar", never, { "initials": { "alias": "initials"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "gradient": { "alias": "gradient"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
10
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<EdsAvatarComponent, "eds-avatar", never, { "initials": { "alias": "initials"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "gradient": { "alias": "gradient"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
8
11
|
}
|
|
@@ -2,7 +2,7 @@ import * as i0 from "@angular/core";
|
|
|
2
2
|
export type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger' | 'positive';
|
|
3
3
|
export declare class EdsButtonComponent {
|
|
4
4
|
readonly variant: import("@angular/core").InputSignal<ButtonVariant>;
|
|
5
|
-
readonly type: import("@angular/core").InputSignal<"
|
|
5
|
+
readonly type: import("@angular/core").InputSignal<"submit" | "button">;
|
|
6
6
|
readonly disabled: import("@angular/core").InputSignal<boolean>;
|
|
7
7
|
static ɵfac: i0.ɵɵFactoryDeclaration<EdsButtonComponent, never>;
|
|
8
8
|
static ɵcmp: i0.ɵɵComponentDeclaration<EdsButtonComponent, "eds-button", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Call history table helpers — resolution badges + result chips. */
|
|
2
|
+
export type HistoryResolution = 'resolved' | 'needs_attention';
|
|
3
|
+
export declare function historyResolution(input: {
|
|
4
|
+
outcome?: string;
|
|
5
|
+
risk?: 'urgent' | 'review' | null;
|
|
6
|
+
}): HistoryResolution;
|
|
7
|
+
export declare function historyResolutionLabel(resolution: HistoryResolution): string;
|
|
8
|
+
export declare function resultChipIcon(label: string): string;
|
|
9
|
+
export declare function callerMetaLine(input: {
|
|
10
|
+
dob?: string | null;
|
|
11
|
+
age?: number | null;
|
|
12
|
+
gender?: string | null;
|
|
13
|
+
phone?: string | null;
|
|
14
|
+
name?: string | null;
|
|
15
|
+
matched?: boolean;
|
|
16
|
+
}): string;
|
|
17
|
+
/** Age in whole years from YYYY-MM-DD (or partial ISO). */
|
|
18
|
+
export declare function ageFromDob(dob: string | null | undefined, at?: Date): number | null;
|
|
19
|
+
export declare function isUnknownCaller(name: string | null | undefined, matched?: boolean): boolean;
|
|
20
|
+
/** Derive result chips from explicit actions, else from outcome text. */
|
|
21
|
+
export declare function historyResultChips(results: string[] | undefined, outcome: string): string[];
|
|
@@ -3,12 +3,31 @@ export declare const REQUIRED_FIELD_OPTIONS: {
|
|
|
3
3
|
value: OutboundRequiredField;
|
|
4
4
|
label: string;
|
|
5
5
|
}[];
|
|
6
|
+
/** Live dialer values used to fill opening-template tokens. */
|
|
7
|
+
export interface OpeningPreviewValues {
|
|
8
|
+
patientName?: string;
|
|
9
|
+
appointmentDate?: string;
|
|
10
|
+
appointmentTime?: string;
|
|
11
|
+
providerName?: string;
|
|
12
|
+
practiceName?: string;
|
|
13
|
+
locationName?: string;
|
|
14
|
+
visitType?: string;
|
|
15
|
+
customScript?: string;
|
|
16
|
+
}
|
|
6
17
|
export declare function requiredFieldLabel(field: OutboundRequiredField): string;
|
|
7
18
|
export declare function formatRequiredFields(fields: OutboundRequiredField[]): string;
|
|
8
19
|
/** Substitute placeholder tokens with sample values. */
|
|
9
20
|
export declare function substitutePlaceholders(text: string, placeholders: OutboundPurposePlaceholder[]): string;
|
|
10
21
|
/** Live preview: sampleOpening if set, else openingTemplate with substitutions. */
|
|
11
22
|
export declare function renderOpeningPreview(sampleOpening: string, openingTemplate: string, placeholders: OutboundPurposePlaceholder[]): string;
|
|
23
|
+
/**
|
|
24
|
+
* Dialer preview: prefer openingTemplate and fill with live patient/appointment values.
|
|
25
|
+
* Unfilled tokens show as [Label] so staff see what is still missing.
|
|
26
|
+
*/
|
|
27
|
+
export declare function renderLiveOpeningPreview(purpose: Pick<OutboundPurpose, 'openingTemplate' | 'sampleOpening' | 'placeholders'>, live: OpeningPreviewValues): string;
|
|
28
|
+
/** Human-friendly date/time for opening lines (from ISO or form fields). */
|
|
29
|
+
export declare function formatOpeningDate(isoOrYmd: string | null | undefined): string;
|
|
30
|
+
export declare function formatOpeningTime(isoOrHm: string | null | undefined, fallbackIso?: string | null): string;
|
|
12
31
|
export declare function purposeShowsCustomScript(purpose: OutboundPurpose): boolean;
|
|
13
32
|
export declare function isCustomScriptRequired(purpose: OutboundPurpose): boolean;
|
|
14
33
|
export declare function isPurposeFormValid(purpose: OutboundPurpose | null, values: Record<string, string>): boolean;
|
|
@@ -14,4 +14,4 @@ export declare function buildTimedTranscript(lines: TranscriptLine[], durationSe
|
|
|
14
14
|
export declare function activeTranscriptIndex(lines: TimedTranscriptLine[], currentSec: number): number;
|
|
15
15
|
export declare function formatPlaybackTime(seconds: number): string;
|
|
16
16
|
export declare function toolStateClass(state: ToolEvent['state']): string;
|
|
17
|
-
export declare function transcriptRoleLabel(who: TranscriptLine['who']): string;
|
|
17
|
+
export declare function transcriptRoleLabel(who: TranscriptLine['who'], callerName?: string | null, callerMatched?: boolean): string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AgentSettings } from '../models/ai-receptionist.types';
|
|
2
|
-
export declare const WELCOME_MESSAGE_MAX =
|
|
2
|
+
export declare const WELCOME_MESSAGE_MAX = 1000;
|
|
3
3
|
export declare function buildAutoWelcomeTemplate(practiceName: string, agentName: string): string;
|
|
4
4
|
export declare function resolveWelcomePreview(welcomeMessage: string | undefined, practiceName: string, agentName: string): string;
|
|
5
5
|
export declare function computeEffectiveWelcomeMessage(settings: Pick<AgentSettings, 'general'>): string;
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@edvak99/voice-receptionist-widget",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.4",
|
|
4
4
|
"description": "Edvak AI Receptionist — embeddable Angular routes and UI for EHR hosts",
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"@angular/common": "^19.2.0",
|
|
7
7
|
"@angular/core": "^19.2.0",
|
|
8
8
|
"@angular/forms": "^19.2.0",
|
|
9
9
|
"@angular/router": "^19.2.0",
|
|
10
|
+
"livekit-client": "^2.15.0",
|
|
10
11
|
"rxjs": "^7.8.0",
|
|
11
12
|
"socket.io-client": "^4.8.0"
|
|
12
13
|
},
|
package/styles/_index.scss
CHANGED
|
@@ -1,47 +1,12 @@
|
|
|
1
|
-
/* @edvak99/voice-receptionist-widget styles — import in host global styles
|
|
1
|
+
/* @edvak99/voice-receptionist-widget styles — import in host global styles.
|
|
2
|
+
*
|
|
3
|
+
* Tokens live on eds-app-shell / .voice-receptionist-host only (see eds.scss).
|
|
4
|
+
* This entry must NOT set unprefixed --color-primary (etc.) on :root.
|
|
5
|
+
*/
|
|
2
6
|
|
|
3
7
|
@use './eds';
|
|
4
8
|
@use './chat-ui';
|
|
5
9
|
|
|
6
|
-
:root {
|
|
7
|
-
--color-primary: #3681f4;
|
|
8
|
-
--color-primary-hover: #2f6de0;
|
|
9
|
-
--color-primary-light: #eaf2ff;
|
|
10
|
-
--color-accent: #5aa2ff;
|
|
11
|
-
--color-accent-light: #d6e8ff;
|
|
12
|
-
--color-bg: #f7faff;
|
|
13
|
-
--color-surface: #ffffff;
|
|
14
|
-
--color-surface-alt: #f8fafc;
|
|
15
|
-
--color-sidebar-bg: #0f172a;
|
|
16
|
-
--color-chat-ai: #f1f5f9;
|
|
17
|
-
--color-text: #0f172a;
|
|
18
|
-
--color-text-muted: #64748b;
|
|
19
|
-
--color-text-soft: #94a3b8;
|
|
20
|
-
--color-border: #e2e8f0;
|
|
21
|
-
--color-border-strong: #cbd5e1;
|
|
22
|
-
--color-success: #22c55e;
|
|
23
|
-
--color-success-soft: #ecfdf3;
|
|
24
|
-
--color-warning: #f59e0b;
|
|
25
|
-
--color-warning-soft: #fffbeb;
|
|
26
|
-
--color-danger: #ef4444;
|
|
27
|
-
--color-danger-soft: #fef2f2;
|
|
28
|
-
--color-info: #3b82f6;
|
|
29
|
-
--color-info-soft: #eff6ff;
|
|
30
|
-
--color-primary-soft: var(--color-primary-light);
|
|
31
|
-
--shadow-sm: 0 2px 6px rgba(0, 0, 0, 0.05);
|
|
32
|
-
--shadow-md: 0 6px 16px rgba(0, 0, 0, 0.08);
|
|
33
|
-
--shadow-card: var(--shadow-sm);
|
|
34
|
-
--shadow-modal: var(--shadow-md);
|
|
35
|
-
--radius-sm: 8px;
|
|
36
|
-
--radius-md: 10px;
|
|
37
|
-
--radius-lg: 12px;
|
|
38
|
-
--radius-xl: 16px;
|
|
39
|
-
--sidebar-width: 240px;
|
|
40
|
-
--space-sm: 16px;
|
|
41
|
-
--space-md: 24px;
|
|
42
|
-
--space-lg: 32px;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
10
|
.visually-hidden {
|
|
46
11
|
position: absolute;
|
|
47
12
|
width: 1px;
|
package/styles/chat-ui.scss
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
flex-direction: column;
|
|
6
6
|
gap: 12px;
|
|
7
7
|
padding: 16px;
|
|
8
|
-
background: var(--color-bg);
|
|
9
|
-
border: 1px solid var(--color-border);
|
|
10
|
-
border-radius: var(--radius-lg);
|
|
8
|
+
background: var(--eds-color-bg);
|
|
9
|
+
border: 1px solid var(--eds-color-border);
|
|
10
|
+
border-radius: var(--eds-radius-lg);
|
|
11
11
|
scroll-behavior: smooth;
|
|
12
12
|
}
|
|
13
13
|
|
|
@@ -36,31 +36,31 @@
|
|
|
36
36
|
gap: 4px;
|
|
37
37
|
max-width: min(78%, 520px);
|
|
38
38
|
padding: 10px 14px;
|
|
39
|
-
border-radius: var(--radius-lg);
|
|
39
|
+
border-radius: var(--eds-radius-lg);
|
|
40
40
|
transition: background 150ms ease, box-shadow 150ms ease;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
.chat-bubble--agent,
|
|
44
44
|
.chat-bubble--ai {
|
|
45
|
-
background: var(--color-chat-ai);
|
|
46
|
-
border: 1px solid var(--color-border);
|
|
47
|
-
border-bottom-left-radius: var(--radius-sm);
|
|
48
|
-
box-shadow: var(--shadow-sm);
|
|
45
|
+
background: var(--eds-color-chat-ai);
|
|
46
|
+
border: 1px solid var(--eds-color-border);
|
|
47
|
+
border-bottom-left-radius: var(--eds-radius-sm);
|
|
48
|
+
box-shadow: var(--eds-shadow-sm);
|
|
49
49
|
|
|
50
50
|
.chat-label {
|
|
51
|
-
color: var(--color-accent);
|
|
51
|
+
color: var(--eds-color-accent);
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
.chat-content {
|
|
55
|
-
color: var(--color-text);
|
|
55
|
+
color: var(--eds-color-text);
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
.chat-bubble--caller,
|
|
60
60
|
.chat-bubble--user {
|
|
61
|
-
background: var(--color-primary);
|
|
61
|
+
background: var(--eds-color-primary);
|
|
62
62
|
color: #fff;
|
|
63
|
-
border-bottom-right-radius: var(--radius-sm);
|
|
63
|
+
border-bottom-right-radius: var(--eds-radius-sm);
|
|
64
64
|
box-shadow: 0 4px 12px rgba(54, 129, 244, 0.22);
|
|
65
65
|
|
|
66
66
|
.chat-label {
|
|
@@ -80,21 +80,21 @@
|
|
|
80
80
|
.chat-bubble--tool {
|
|
81
81
|
max-width: min(92%, 640px);
|
|
82
82
|
padding: 8px 14px;
|
|
83
|
-
background: var(--color-primary-light);
|
|
84
|
-
border: 1px dashed var(--color-accent-light);
|
|
85
|
-
border-radius: var(--radius-md);
|
|
83
|
+
background: var(--eds-color-primary-light);
|
|
84
|
+
border: 1px dashed var(--eds-color-accent-light);
|
|
85
|
+
border-radius: var(--eds-radius-md);
|
|
86
86
|
text-align: center;
|
|
87
87
|
|
|
88
88
|
.chat-label {
|
|
89
89
|
justify-content: center;
|
|
90
|
-
color: var(--color-text-muted);
|
|
90
|
+
color: var(--eds-color-text-muted);
|
|
91
91
|
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
|
|
92
92
|
font-size: 11.5px;
|
|
93
93
|
}
|
|
94
94
|
|
|
95
95
|
.chat-content {
|
|
96
96
|
font-size: 12.5px;
|
|
97
|
-
color: var(--color-text-muted);
|
|
97
|
+
color: var(--eds-color-text-muted);
|
|
98
98
|
text-align: left;
|
|
99
99
|
}
|
|
100
100
|
}
|
|
@@ -128,6 +128,6 @@
|
|
|
128
128
|
|
|
129
129
|
.chat-time {
|
|
130
130
|
font-size: 10.5px;
|
|
131
|
-
color: var(--color-text-soft);
|
|
131
|
+
color: var(--eds-color-text-soft);
|
|
132
132
|
margin-top: 2px;
|
|
133
133
|
}
|