@memberjunction/ng-mj-livekit-room 6.2.0-edge.3 → 6.2.0-edge.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 +27 -3
- package/dist/lib/agent-avatar-notices.d.ts +57 -0
- package/dist/lib/agent-avatar-notices.d.ts.map +1 -0
- package/dist/lib/agent-avatar-notices.js +90 -0
- package/dist/lib/agent-avatar-notices.js.map +1 -0
- package/dist/lib/device-error-notice.d.ts +20 -0
- package/dist/lib/device-error-notice.d.ts.map +1 -0
- package/dist/lib/device-error-notice.js +62 -0
- package/dist/lib/device-error-notice.js.map +1 -0
- package/dist/lib/mj-livekit-room.component.d.ts +127 -8
- package/dist/lib/mj-livekit-room.component.d.ts.map +1 -1
- package/dist/lib/mj-livekit-room.component.js +447 -145
- package/dist/lib/mj-livekit-room.component.js.map +1 -1
- package/package.json +14 -8
package/README.md
CHANGED
|
@@ -28,7 +28,7 @@ RealtimeBridgeResolver (MJServer) ──► @memberjunction/livekit-room-server
|
|
|
28
28
|
></mj-livekit-agent-room>
|
|
29
29
|
|
|
30
30
|
<!-- Or just join an existing room -->
|
|
31
|
-
<mj-livekit-agent-room [Mode]="'join'" [RoomName]="'support-42'" [DisplayName]="'
|
|
31
|
+
<mj-livekit-agent-room [Mode]="'join'" [RoomName]="'support-42'" [DisplayName]="'Jordan'"></mj-livekit-agent-room>
|
|
32
32
|
```
|
|
33
33
|
|
|
34
34
|
## What it adds over the generic component
|
|
@@ -39,11 +39,18 @@ RealtimeBridgeResolver (MJServer) ──► @memberjunction/livekit-room-server
|
|
|
39
39
|
emits `SessionStarted` with the bridge id.
|
|
40
40
|
- **Server-authorized recording** — `EnableRecording` wires the record button to the egress mutations.
|
|
41
41
|
- **Multi-provider** — extends `BaseAngularComponent`; pass `[Provider]` to scope to a specific MJ server.
|
|
42
|
+
- **Saved layout** — the user's layout of the room is saved per user (see [Saved layout](#saved-layout)).
|
|
43
|
+
- **Avatar notices** — when an agent's bot says the agent's avatar can't be shown, the room shows one info notice per
|
|
44
|
+
agent per join, such as "Audio only for Sage: the avatar can't be shown in this meeting". The user can dismiss it; it
|
|
45
|
+
also hides after 10 seconds or when the agent leaves, and doesn't show again in that join. A reconnect is the same
|
|
46
|
+
join; a disconnect or "Try again" starts a new one. `AvatarNoticeLabels` (`AvatarNoticeOverrides` from
|
|
47
|
+
`@memberjunction/ng-realtime-media`) gives a host's own line per reason, shown as written with `{Agent}` for the
|
|
48
|
+
agent's name. A reason it leaves out, or one the room doesn't know, gets the stock line.
|
|
42
49
|
|
|
43
50
|
## Inputs
|
|
44
51
|
|
|
45
|
-
`Mode` (`agent` / `join`), `AgentID`, `AgentName`, `RoomName`, `DisplayName`, `TurnMode`, `AutoStart`,
|
|
46
|
-
plus pass-through gates: `Layout`, `Title`, `ShowHeader`, `ShowControlBar`, `ShowChat`,
|
|
52
|
+
`Mode` (`agent` / `join` / `preview`), `AgentID`, `AgentName`, `RoomName`, `DisplayName`, `TurnMode`, `AutoStart`,
|
|
53
|
+
`AvatarNoticeLabels`, plus pass-through gates: `Layout`, `Title`, `ShowHeader`, `ShowControlBar`, `ShowChat`,
|
|
47
54
|
`ShowParticipantsPanel`, `EnablePinning`, `EnableLayoutSwitcher`, `EnableNoiseFilter`,
|
|
48
55
|
`EnableBackgroundEffects`, `ShowAgentState`, `ShowPreJoin`, `EnableRecording`, `StartWithMicrophone`,
|
|
49
56
|
`StartWithCamera`, `AgentAvatarUrl`, `E2EEPassphrase`, `E2EEWorker`, and the device-control gates.
|
|
@@ -53,6 +60,23 @@ plus pass-through gates: `Layout`, `Title`, `ShowHeader`, `ShowControlBar`, `Sho
|
|
|
53
60
|
`SessionStarted`, `Connected`, `Disconnected`, `ParticipantJoined`, `ParticipantLeft`, `DataReceived`,
|
|
54
61
|
`ErrorOccurred`.
|
|
55
62
|
|
|
63
|
+
## Saved layout
|
|
64
|
+
|
|
65
|
+
The binding saves the user's room layout in `MJ: User Settings`, per user and for every room: where they moved
|
|
66
|
+
participants' tiles, where they put picture-in-picture boxes, and whether they hid their self-view. It loads the layout
|
|
67
|
+
when it starts, gives it to the room, and saves each change the room reports, through `MediaLayoutPrefs` from
|
|
68
|
+
`@memberjunction/ai-realtime-client/media`. The preview room (`Mode="preview"`) saves under its own keys, so trying it
|
|
69
|
+
never changes a meeting's layout.
|
|
70
|
+
|
|
71
|
+
| Saved | Meetings | Preview room |
|
|
72
|
+
|---|---|---|
|
|
73
|
+
| Tile moves | `mj.livekit.placement.v1` (`LIVEKIT_PLACEMENT_PREF_KEY`) | `mj.livekit.preview.placement.v1` (`LIVEKIT_PREVIEW_PLACEMENT_PREF_KEY`) |
|
|
74
|
+
| Picture-in-picture boxes | `mj.livekit.pip.v1` (`LIVEKIT_PIP_PREF_KEY`) | `mj.livekit.preview.pip.v1` (`LIVEKIT_PREVIEW_PIP_PREF_KEY`) |
|
|
75
|
+
| Self-view hidden | `mj.livekit.selfView.hidden.v1` (`LIVEKIT_SELF_VIEW_HIDDEN_PREF_KEY`) | `mj.livekit.preview.selfView.hidden.v1` (`LIVEKIT_PREVIEW_SELF_VIEW_HIDDEN_PREF_KEY`) |
|
|
76
|
+
|
|
77
|
+
Only a saved `true` hides the self-view; nothing saved, `false` or any other value shows it. Show and Reset layout save
|
|
78
|
+
`false`. When saving fails, the change still holds for the session.
|
|
79
|
+
|
|
56
80
|
## In Explorer
|
|
57
81
|
|
|
58
82
|
`@memberjunction/ng-explorer-core` registers a `LiveKitRoomResource` (`DriverClass = 'LiveKitRoomResource'`)
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview The meeting room's notice that an agent's avatar can't be shown. Everyone in the room sees it, once per
|
|
3
|
+
* agent per join, from the agent's bot's attribute (`LiveKitParticipantView.AvatarAudioOnly`, read by the room core).
|
|
4
|
+
* Its words are `ng-realtime-media`'s `AvatarNoticeText` in the meeting form, which names the agent, since a meeting
|
|
5
|
+
* can have several.
|
|
6
|
+
*
|
|
7
|
+
* @module @memberjunction/ng-mj-livekit-room
|
|
8
|
+
*/
|
|
9
|
+
import type { LiveKitAvatarAudioOnly, LiveKitRoomState } from '@memberjunction/livekit-room-core';
|
|
10
|
+
/** How long a notice shows before it hides itself, in milliseconds. */
|
|
11
|
+
export declare const AGENT_AVATAR_NOTICE_HIDE_MS = 10000;
|
|
12
|
+
/** A reason the room can name (`RealtimeAvatarUnavailableReason` in `@memberjunction/ai`). */
|
|
13
|
+
type AvatarAudioOnlyReason = NonNullable<LiveKitAvatarAudioOnly['Reason']>;
|
|
14
|
+
/** A notice over the room: the agent it is about, and why its avatar can't be shown. */
|
|
15
|
+
export interface AgentAvatarNotice {
|
|
16
|
+
/** The agent's participant identity. */
|
|
17
|
+
Identity: string;
|
|
18
|
+
/** The agent's name, as the room shows it. */
|
|
19
|
+
AgentName: string;
|
|
20
|
+
/** Why, when the agent's bot gave a reason the room knows. */
|
|
21
|
+
Reason?: AvatarAudioOnlyReason;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The notices that agents' avatars can't be shown, for one meeting room. A notice shows from the first room state in
|
|
25
|
+
* which the agent's bot says audio only, until the user dismisses it, {@link AGENT_AVATAR_NOTICE_HIDE_MS} passes or the
|
|
26
|
+
* agent leaves, and not again in the same join: a reconnect is the same join, and only {@link Reset} starts a new one.
|
|
27
|
+
*/
|
|
28
|
+
export declare class AgentAvatarNotices {
|
|
29
|
+
private readonly changed;
|
|
30
|
+
private readonly hideAfterMs;
|
|
31
|
+
/** The agents that have had their notice in this join. */
|
|
32
|
+
private readonly noticed;
|
|
33
|
+
/** The hide timer of each notice showing, by agent. */
|
|
34
|
+
private readonly timers;
|
|
35
|
+
private visible;
|
|
36
|
+
/**
|
|
37
|
+
* @param changed Called whenever the notices showing change, including when one hides itself.
|
|
38
|
+
* @param hideAfterMs How long a notice shows before it hides itself.
|
|
39
|
+
*/
|
|
40
|
+
constructor(changed: () => void, hideAfterMs?: number);
|
|
41
|
+
/** The notices showing now, oldest first. */
|
|
42
|
+
get Visible(): readonly AgentAvatarNotice[];
|
|
43
|
+
/** Shows a notice for each agent newly audio only in this join, and drops the notices of agents who left. */
|
|
44
|
+
Update(state: LiveKitRoomState): void;
|
|
45
|
+
/** Hides an agent's notice; it does not show again in this join. */
|
|
46
|
+
Dismiss(identity: string): void;
|
|
47
|
+
/** Starts a new join: no notice shows now, and each agent's can show once more. */
|
|
48
|
+
Reset(): void;
|
|
49
|
+
/** Stops the hide timers, for a room that is going away. */
|
|
50
|
+
Dispose(): void;
|
|
51
|
+
/** A new notice for an agent newly audio only in this join, with its hide timer started; none for anyone else. */
|
|
52
|
+
private noticeFor;
|
|
53
|
+
private hide;
|
|
54
|
+
private stopTimer;
|
|
55
|
+
}
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=agent-avatar-notices.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-avatar-notices.d.ts","sourceRoot":"","sources":["../../src/lib/agent-avatar-notices.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAA0B,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAE1H,uEAAuE;AACvE,eAAO,MAAM,2BAA2B,QAAS,CAAC;AAElD,8FAA8F;AAC9F,KAAK,qBAAqB,GAAG,WAAW,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC;AAE3E,wFAAwF;AACxF,MAAM,WAAW,iBAAiB;IAChC,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAChC;AAED;;;;GAIG;AACH,qBAAa,kBAAkB;IAY3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAZ9B,0DAA0D;IAC1D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,uDAAuD;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoD;IAC3E,OAAO,CAAC,OAAO,CAAoC;IAEnD;;;OAGG;gBAEgB,OAAO,EAAE,MAAM,IAAI,EACnB,WAAW,GAAE,MAAoC;IAGpE,6CAA6C;IAC7C,IAAW,OAAO,IAAI,SAAS,iBAAiB,EAAE,CAEjD;IAED,6GAA6G;IACtG,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAY5C,oEAAoE;IAC7D,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMtC,mFAAmF;IAC5E,KAAK,IAAI,IAAI;IASpB,4DAA4D;IACrD,OAAO,IAAI,IAAI;IAItB,kHAAkH;IAClH,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,SAAS;CAOlB"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview The meeting room's notice that an agent's avatar can't be shown. Everyone in the room sees it, once per
|
|
3
|
+
* agent per join, from the agent's bot's attribute (`LiveKitParticipantView.AvatarAudioOnly`, read by the room core).
|
|
4
|
+
* Its words are `ng-realtime-media`'s `AvatarNoticeText` in the meeting form, which names the agent, since a meeting
|
|
5
|
+
* can have several.
|
|
6
|
+
*
|
|
7
|
+
* @module @memberjunction/ng-mj-livekit-room
|
|
8
|
+
*/
|
|
9
|
+
/** How long a notice shows before it hides itself, in milliseconds. */
|
|
10
|
+
export const AGENT_AVATAR_NOTICE_HIDE_MS = 10_000;
|
|
11
|
+
/**
|
|
12
|
+
* The notices that agents' avatars can't be shown, for one meeting room. A notice shows from the first room state in
|
|
13
|
+
* which the agent's bot says audio only, until the user dismisses it, {@link AGENT_AVATAR_NOTICE_HIDE_MS} passes or the
|
|
14
|
+
* agent leaves, and not again in the same join: a reconnect is the same join, and only {@link Reset} starts a new one.
|
|
15
|
+
*/
|
|
16
|
+
export class AgentAvatarNotices {
|
|
17
|
+
changed;
|
|
18
|
+
hideAfterMs;
|
|
19
|
+
/** The agents that have had their notice in this join. */
|
|
20
|
+
noticed = new Set();
|
|
21
|
+
/** The hide timer of each notice showing, by agent. */
|
|
22
|
+
timers = new Map();
|
|
23
|
+
visible = [];
|
|
24
|
+
/**
|
|
25
|
+
* @param changed Called whenever the notices showing change, including when one hides itself.
|
|
26
|
+
* @param hideAfterMs How long a notice shows before it hides itself.
|
|
27
|
+
*/
|
|
28
|
+
constructor(changed, hideAfterMs = AGENT_AVATAR_NOTICE_HIDE_MS) {
|
|
29
|
+
this.changed = changed;
|
|
30
|
+
this.hideAfterMs = hideAfterMs;
|
|
31
|
+
}
|
|
32
|
+
/** The notices showing now, oldest first. */
|
|
33
|
+
get Visible() {
|
|
34
|
+
return this.visible;
|
|
35
|
+
}
|
|
36
|
+
/** Shows a notice for each agent newly audio only in this join, and drops the notices of agents who left. */
|
|
37
|
+
Update(state) {
|
|
38
|
+
const present = new Set(state.Remote.map((p) => p.Identity));
|
|
39
|
+
const kept = this.visible.filter((notice) => present.has(notice.Identity));
|
|
40
|
+
this.visible.filter((notice) => !present.has(notice.Identity)).forEach((notice) => this.stopTimer(notice.Identity));
|
|
41
|
+
const added = state.Remote.flatMap((p) => this.noticeFor(p));
|
|
42
|
+
if (added.length === 0 && kept.length === this.visible.length) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
this.visible = [...kept, ...added];
|
|
46
|
+
this.changed();
|
|
47
|
+
}
|
|
48
|
+
/** Hides an agent's notice; it does not show again in this join. */
|
|
49
|
+
Dismiss(identity) {
|
|
50
|
+
if (this.visible.some((notice) => notice.Identity === identity)) {
|
|
51
|
+
this.hide(identity);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** Starts a new join: no notice shows now, and each agent's can show once more. */
|
|
55
|
+
Reset() {
|
|
56
|
+
this.noticed.clear();
|
|
57
|
+
[...this.timers.keys()].forEach((identity) => this.stopTimer(identity));
|
|
58
|
+
if (this.visible.length > 0) {
|
|
59
|
+
this.visible = [];
|
|
60
|
+
this.changed();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** Stops the hide timers, for a room that is going away. */
|
|
64
|
+
Dispose() {
|
|
65
|
+
[...this.timers.keys()].forEach((identity) => this.stopTimer(identity));
|
|
66
|
+
}
|
|
67
|
+
/** A new notice for an agent newly audio only in this join, with its hide timer started; none for anyone else. */
|
|
68
|
+
noticeFor(participant) {
|
|
69
|
+
const audioOnly = participant.AvatarAudioOnly;
|
|
70
|
+
if (participant.Role !== 'agent' || !audioOnly || this.noticed.has(participant.Identity)) {
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
this.noticed.add(participant.Identity);
|
|
74
|
+
this.timers.set(participant.Identity, setTimeout(() => this.hide(participant.Identity), this.hideAfterMs));
|
|
75
|
+
return [{ Identity: participant.Identity, AgentName: participant.DisplayName, ...(audioOnly.Reason ? { Reason: audioOnly.Reason } : {}) }];
|
|
76
|
+
}
|
|
77
|
+
hide(identity) {
|
|
78
|
+
this.stopTimer(identity);
|
|
79
|
+
this.visible = this.visible.filter((notice) => notice.Identity !== identity);
|
|
80
|
+
this.changed();
|
|
81
|
+
}
|
|
82
|
+
stopTimer(identity) {
|
|
83
|
+
const timer = this.timers.get(identity);
|
|
84
|
+
if (timer !== undefined) {
|
|
85
|
+
clearTimeout(timer);
|
|
86
|
+
this.timers.delete(identity);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=agent-avatar-notices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-avatar-notices.js","sourceRoot":"","sources":["../../src/lib/agent-avatar-notices.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview The meeting room's notice that an agent's avatar can't be shown. Everyone in the room sees it, once per\n * agent per join, from the agent's bot's attribute (`LiveKitParticipantView.AvatarAudioOnly`, read by the room core).\n * Its words are `ng-realtime-media`'s `AvatarNoticeText` in the meeting form, which names the agent, since a meeting\n * can have several.\n *\n * @module @memberjunction/ng-mj-livekit-room\n */\n\nimport type { LiveKitAvatarAudioOnly, LiveKitParticipantView, LiveKitRoomState } from '@memberjunction/livekit-room-core';\n\n/** How long a notice shows before it hides itself, in milliseconds. */\nexport const AGENT_AVATAR_NOTICE_HIDE_MS = 10_000;\n\n/** A reason the room can name (`RealtimeAvatarUnavailableReason` in `@memberjunction/ai`). */\ntype AvatarAudioOnlyReason = NonNullable<LiveKitAvatarAudioOnly['Reason']>;\n\n/** A notice over the room: the agent it is about, and why its avatar can't be shown. */\nexport interface AgentAvatarNotice {\n /** The agent's participant identity. */\n Identity: string;\n /** The agent's name, as the room shows it. */\n AgentName: string;\n /** Why, when the agent's bot gave a reason the room knows. */\n Reason?: AvatarAudioOnlyReason;\n}\n\n/**\n * The notices that agents' avatars can't be shown, for one meeting room. A notice shows from the first room state in\n * which the agent's bot says audio only, until the user dismisses it, {@link AGENT_AVATAR_NOTICE_HIDE_MS} passes or the\n * agent leaves, and not again in the same join: a reconnect is the same join, and only {@link Reset} starts a new one.\n */\nexport class AgentAvatarNotices {\n /** The agents that have had their notice in this join. */\n private readonly noticed = new Set<string>();\n /** The hide timer of each notice showing, by agent. */\n private readonly timers = new Map<string, ReturnType<typeof setTimeout>>();\n private visible: readonly AgentAvatarNotice[] = [];\n\n /**\n * @param changed Called whenever the notices showing change, including when one hides itself.\n * @param hideAfterMs How long a notice shows before it hides itself.\n */\n constructor(\n private readonly changed: () => void,\n private readonly hideAfterMs: number = AGENT_AVATAR_NOTICE_HIDE_MS,\n ) {}\n\n /** The notices showing now, oldest first. */\n public get Visible(): readonly AgentAvatarNotice[] {\n return this.visible;\n }\n\n /** Shows a notice for each agent newly audio only in this join, and drops the notices of agents who left. */\n public Update(state: LiveKitRoomState): void {\n const present = new Set(state.Remote.map((p) => p.Identity));\n const kept = this.visible.filter((notice) => present.has(notice.Identity));\n this.visible.filter((notice) => !present.has(notice.Identity)).forEach((notice) => this.stopTimer(notice.Identity));\n const added = state.Remote.flatMap((p) => this.noticeFor(p));\n if (added.length === 0 && kept.length === this.visible.length) {\n return;\n }\n this.visible = [...kept, ...added];\n this.changed();\n }\n\n /** Hides an agent's notice; it does not show again in this join. */\n public Dismiss(identity: string): void {\n if (this.visible.some((notice) => notice.Identity === identity)) {\n this.hide(identity);\n }\n }\n\n /** Starts a new join: no notice shows now, and each agent's can show once more. */\n public Reset(): void {\n this.noticed.clear();\n [...this.timers.keys()].forEach((identity) => this.stopTimer(identity));\n if (this.visible.length > 0) {\n this.visible = [];\n this.changed();\n }\n }\n\n /** Stops the hide timers, for a room that is going away. */\n public Dispose(): void {\n [...this.timers.keys()].forEach((identity) => this.stopTimer(identity));\n }\n\n /** A new notice for an agent newly audio only in this join, with its hide timer started; none for anyone else. */\n private noticeFor(participant: LiveKitParticipantView): AgentAvatarNotice[] {\n const audioOnly = participant.AvatarAudioOnly;\n if (participant.Role !== 'agent' || !audioOnly || this.noticed.has(participant.Identity)) {\n return [];\n }\n this.noticed.add(participant.Identity);\n this.timers.set(participant.Identity, setTimeout(() => this.hide(participant.Identity), this.hideAfterMs));\n return [{ Identity: participant.Identity, AgentName: participant.DisplayName, ...(audioOnly.Reason ? { Reason: audioOnly.Reason } : {}) }];\n }\n\n private hide(identity: string): void {\n this.stopTimer(identity);\n this.visible = this.visible.filter((notice) => notice.Identity !== identity);\n this.changed();\n }\n\n private stopTimer(identity: string): void {\n const timer = this.timers.get(identity);\n if (timer !== undefined) {\n clearTimeout(timer);\n this.timers.delete(identity);\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview The meeting room's notice for a device error: a microphone, camera, speaker or share that failed, or
|
|
3
|
+
* that the browser refused. Its line says what the user asked for and, after a colon, the reason the browser, LiveKit or
|
|
4
|
+
* the share picker gave, as the room's notice about what the agent sees does ("Couldn't change what the agent sees: …").
|
|
5
|
+
* For a panel share where the user picked another surface, the reason is `/media`'s own hint, so the line reads
|
|
6
|
+
* "Couldn't start sharing: To share only the panel, choose this tab in the browser's picker." A share picker the user
|
|
7
|
+
* closed is no error, so nothing shows for it.
|
|
8
|
+
*
|
|
9
|
+
* @module @memberjunction/ng-mj-livekit-room
|
|
10
|
+
*/
|
|
11
|
+
import type { LiveKitRoomError } from '@memberjunction/livekit-room-core';
|
|
12
|
+
/**
|
|
13
|
+
* The meeting room's notice line for a room error: for a `device` error, what the user asked for and the reason given,
|
|
14
|
+
* or what they asked for alone when no reason was given; `null` for any other kind of error.
|
|
15
|
+
*
|
|
16
|
+
* @param error The error the room reported.
|
|
17
|
+
* @returns The line, such as "Couldn't turn on your camera: Could not start video source", or `null`.
|
|
18
|
+
*/
|
|
19
|
+
export declare function DeviceErrorNoticeText(error: LiveKitRoomError): string | null;
|
|
20
|
+
//# sourceMappingURL=device-error-notice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-error-notice.d.ts","sourceRoot":"","sources":["../../src/lib/device-error-notice.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAsB,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAoC9F;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAO5E"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview The meeting room's notice for a device error: a microphone, camera, speaker or share that failed, or
|
|
3
|
+
* that the browser refused. Its line says what the user asked for and, after a colon, the reason the browser, LiveKit or
|
|
4
|
+
* the share picker gave, as the room's notice about what the agent sees does ("Couldn't change what the agent sees: …").
|
|
5
|
+
* For a panel share where the user picked another surface, the reason is `/media`'s own hint, so the line reads
|
|
6
|
+
* "Couldn't start sharing: To share only the panel, choose this tab in the browser's picker." A share picker the user
|
|
7
|
+
* closed is no error, so nothing shows for it.
|
|
8
|
+
*
|
|
9
|
+
* @module @memberjunction/ng-mj-livekit-room
|
|
10
|
+
*/
|
|
11
|
+
/** How the notice starts: what the user asked for, by device and request. */
|
|
12
|
+
const LEADS = {
|
|
13
|
+
microphone: {
|
|
14
|
+
on: "Couldn't turn on your microphone",
|
|
15
|
+
off: "Couldn't turn off your microphone",
|
|
16
|
+
switch: "Couldn't switch your microphone",
|
|
17
|
+
unknown: "Couldn't use your microphone",
|
|
18
|
+
},
|
|
19
|
+
camera: {
|
|
20
|
+
on: "Couldn't turn on your camera",
|
|
21
|
+
off: "Couldn't turn off your camera",
|
|
22
|
+
switch: "Couldn't switch your camera",
|
|
23
|
+
unknown: "Couldn't use your camera",
|
|
24
|
+
},
|
|
25
|
+
screen: {
|
|
26
|
+
on: "Couldn't start sharing",
|
|
27
|
+
off: "Couldn't stop sharing",
|
|
28
|
+
switch: "Couldn't share",
|
|
29
|
+
unknown: "Couldn't share",
|
|
30
|
+
},
|
|
31
|
+
speaker: {
|
|
32
|
+
on: "Couldn't turn on the sound",
|
|
33
|
+
off: "Couldn't turn off the sound",
|
|
34
|
+
switch: "Couldn't switch your speaker",
|
|
35
|
+
unknown: "Couldn't play the sound",
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
/** How the notice starts for a device error about no one device (listing the devices). */
|
|
39
|
+
const NO_DEVICE_LEAD = "Couldn't use your devices";
|
|
40
|
+
/**
|
|
41
|
+
* The meeting room's notice line for a room error: for a `device` error, what the user asked for and the reason given,
|
|
42
|
+
* or what they asked for alone when no reason was given; `null` for any other kind of error.
|
|
43
|
+
*
|
|
44
|
+
* @param error The error the room reported.
|
|
45
|
+
* @returns The line, such as "Couldn't turn on your camera: Could not start video source", or `null`.
|
|
46
|
+
*/
|
|
47
|
+
export function DeviceErrorNoticeText(error) {
|
|
48
|
+
if (error.Kind !== 'device') {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
const lead = error.Device ? LEADS[error.Device.Media][error.Device.Change ?? 'unknown'] : NO_DEVICE_LEAD;
|
|
52
|
+
const reason = reasonOf(error.Cause);
|
|
53
|
+
return reason ? `${lead}: ${reason}` : `${lead}.`;
|
|
54
|
+
}
|
|
55
|
+
/** The reason an error's cause gives: an error's message, or the text the preview room passes; empty for anything else. */
|
|
56
|
+
function reasonOf(cause) {
|
|
57
|
+
if (cause instanceof Error) {
|
|
58
|
+
return cause.message.trim();
|
|
59
|
+
}
|
|
60
|
+
return typeof cause === 'string' ? cause.trim() : '';
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=device-error-notice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-error-notice.js","sourceRoot":"","sources":["../../src/lib/device-error-notice.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,6EAA6E;AAC7E,MAAM,KAAK,GAA2F;IACpG,UAAU,EAAE;QACV,EAAE,EAAE,kCAAkC;QACtC,GAAG,EAAE,mCAAmC;QACxC,MAAM,EAAE,iCAAiC;QACzC,OAAO,EAAE,8BAA8B;KACxC;IACD,MAAM,EAAE;QACN,EAAE,EAAE,8BAA8B;QAClC,GAAG,EAAE,+BAA+B;QACpC,MAAM,EAAE,6BAA6B;QACrC,OAAO,EAAE,0BAA0B;KACpC;IACD,MAAM,EAAE;QACN,EAAE,EAAE,wBAAwB;QAC5B,GAAG,EAAE,uBAAuB;QAC5B,MAAM,EAAE,gBAAgB;QACxB,OAAO,EAAE,gBAAgB;KAC1B;IACD,OAAO,EAAE;QACP,EAAE,EAAE,4BAA4B;QAChC,GAAG,EAAE,6BAA6B;QAClC,MAAM,EAAE,8BAA8B;QACtC,OAAO,EAAE,yBAAyB;KACnC;CACF,CAAC;AAEF,0FAA0F;AAC1F,MAAM,cAAc,GAAG,2BAA2B,CAAC;AAEnD;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAuB;IAC3D,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;IACzG,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrC,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC;AACpD,CAAC;AAED,2HAA2H;AAC3H,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACvD,CAAC","sourcesContent":["/**\n * @fileoverview The meeting room's notice for a device error: a microphone, camera, speaker or share that failed, or\n * that the browser refused. Its line says what the user asked for and, after a colon, the reason the browser, LiveKit or\n * the share picker gave, as the room's notice about what the agent sees does (\"Couldn't change what the agent sees: …\").\n * For a panel share where the user picked another surface, the reason is `/media`'s own hint, so the line reads\n * \"Couldn't start sharing: To share only the panel, choose this tab in the browser's picker.\" A share picker the user\n * closed is no error, so nothing shows for it.\n *\n * @module @memberjunction/ng-mj-livekit-room\n */\n\nimport type { LiveKitErrorDevice, LiveKitRoomError } from '@memberjunction/livekit-room-core';\n\n/** What the user asked of a device, or `'unknown'` when the room can't tell. */\ntype DeviceRequest = NonNullable<LiveKitErrorDevice['Change']> | 'unknown';\n\n/** How the notice starts: what the user asked for, by device and request. */\nconst LEADS: Readonly<Record<LiveKitErrorDevice['Media'], Readonly<Record<DeviceRequest, string>>>> = {\n microphone: {\n on: \"Couldn't turn on your microphone\",\n off: \"Couldn't turn off your microphone\",\n switch: \"Couldn't switch your microphone\",\n unknown: \"Couldn't use your microphone\",\n },\n camera: {\n on: \"Couldn't turn on your camera\",\n off: \"Couldn't turn off your camera\",\n switch: \"Couldn't switch your camera\",\n unknown: \"Couldn't use your camera\",\n },\n screen: {\n on: \"Couldn't start sharing\",\n off: \"Couldn't stop sharing\",\n switch: \"Couldn't share\",\n unknown: \"Couldn't share\",\n },\n speaker: {\n on: \"Couldn't turn on the sound\",\n off: \"Couldn't turn off the sound\",\n switch: \"Couldn't switch your speaker\",\n unknown: \"Couldn't play the sound\",\n },\n};\n\n/** How the notice starts for a device error about no one device (listing the devices). */\nconst NO_DEVICE_LEAD = \"Couldn't use your devices\";\n\n/**\n * The meeting room's notice line for a room error: for a `device` error, what the user asked for and the reason given,\n * or what they asked for alone when no reason was given; `null` for any other kind of error.\n *\n * @param error The error the room reported.\n * @returns The line, such as \"Couldn't turn on your camera: Could not start video source\", or `null`.\n */\nexport function DeviceErrorNoticeText(error: LiveKitRoomError): string | null {\n if (error.Kind !== 'device') {\n return null;\n }\n const lead = error.Device ? LEADS[error.Device.Media][error.Device.Change ?? 'unknown'] : NO_DEVICE_LEAD;\n const reason = reasonOf(error.Cause);\n return reason ? `${lead}: ${reason}` : `${lead}.`;\n}\n\n/** The reason an error's cause gives: an error's message, or the text the preview room passes; empty for anything else. */\nfunction reasonOf(cause: unknown): string {\n if (cause instanceof Error) {\n return cause.message.trim();\n }\n return typeof cause === 'string' ? cause.trim() : '';\n}\n"]}
|
|
@@ -3,11 +3,33 @@ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
|
3
3
|
import { UUIDsEqual } from '@memberjunction/global';
|
|
4
4
|
import { LiveKitRoomTurnState, RealtimeModelVoices, RealtimeVoiceOption } from '@memberjunction/graphql-dataprovider';
|
|
5
5
|
import { type LiveKitRoomLayout } from '@memberjunction/ng-livekit-room';
|
|
6
|
-
import
|
|
6
|
+
import { type AvatarNoticeOverrides } from '@memberjunction/ng-realtime-media';
|
|
7
|
+
import { type MediaPipRect, type MediaPlacementMove } from '@memberjunction/ai-realtime-client/media';
|
|
8
|
+
import { type LiveKitDataMessage, type LiveKitDisconnectedEvent, type LiveKitParticipantJoinedEvent, type LiveKitParticipantLeftEvent, type LiveKitRoomError, type LiveKitRoomState } from '@memberjunction/livekit-room-core';
|
|
9
|
+
import { type AgentAvatarNotice } from './agent-avatar-notices';
|
|
7
10
|
import { type RosterTurnBadge, type TurnAddressingChoice, type TurnModeChoice } from './turn-taking-options';
|
|
11
|
+
import type { RoomOptions } from 'livekit-client';
|
|
8
12
|
import * as i0 from "@angular/core";
|
|
9
|
-
/**
|
|
10
|
-
|
|
13
|
+
/**
|
|
14
|
+
* The `MJ: User Settings` keys under which the meeting room's layout is saved, per user and for every room: where the
|
|
15
|
+
* user moved participants' tiles, where they put picture-in-picture boxes, and whether they hid their self-view. The
|
|
16
|
+
* realtime call saves its own layout under `mj.realtime.*`.
|
|
17
|
+
*/
|
|
18
|
+
export declare const LIVEKIT_PLACEMENT_PREF_KEY = "mj.livekit.placement.v1";
|
|
19
|
+
export declare const LIVEKIT_PIP_PREF_KEY = "mj.livekit.pip.v1";
|
|
20
|
+
export declare const LIVEKIT_SELF_VIEW_HIDDEN_PREF_KEY = "mj.livekit.selfView.hidden.v1";
|
|
21
|
+
/**
|
|
22
|
+
* The keys the preview room saves its layout under: it remembers its layout as a meeting does, but apart, so moving the
|
|
23
|
+
* simulated people, hiding the self-view (or resetting the layout) there never changes what is saved for meetings.
|
|
24
|
+
*/
|
|
25
|
+
export declare const LIVEKIT_PREVIEW_PLACEMENT_PREF_KEY = "mj.livekit.preview.placement.v1";
|
|
26
|
+
export declare const LIVEKIT_PREVIEW_PIP_PREF_KEY = "mj.livekit.preview.pip.v1";
|
|
27
|
+
export declare const LIVEKIT_PREVIEW_SELF_VIEW_HIDDEN_PREF_KEY = "mj.livekit.preview.selfView.hidden.v1";
|
|
28
|
+
/**
|
|
29
|
+
* How the MJ binding obtains its room: start an agent in a room (`'agent'`), join an existing room (`'join'`), or open
|
|
30
|
+
* the preview room (`'preview'`): your camera and microphone with simulated people, and no server.
|
|
31
|
+
*/
|
|
32
|
+
export type MJLiveKitConnectionMode = 'agent' | 'join' | 'preview';
|
|
11
33
|
/** Emitted when an agent room session has been started server-side. */
|
|
12
34
|
export interface MJLiveKitSessionStartedEvent {
|
|
13
35
|
/** The durable bridge-session row id. */
|
|
@@ -36,7 +58,10 @@ export interface AgentInRoom {
|
|
|
36
58
|
*/
|
|
37
59
|
export declare class MJLiveKitRoomComponent extends BaseAngularComponent implements OnInit {
|
|
38
60
|
private readonly cdr;
|
|
39
|
-
/**
|
|
61
|
+
/**
|
|
62
|
+
* Whether to start an agent in the room (`'agent'`), just join an existing room (`'join'`), or open the preview room
|
|
63
|
+
* (`'preview'`: no token, no agent session, no recording). Read when the room is created.
|
|
64
|
+
*/
|
|
40
65
|
Mode: MJLiveKitConnectionMode;
|
|
41
66
|
/** The agent to voice (agent mode) — the Realtime Co-Agent / voice front-end. */
|
|
42
67
|
AgentID: string | null;
|
|
@@ -132,6 +157,11 @@ export declare class MJLiveKitRoomComponent extends BaseAngularComponent impleme
|
|
|
132
157
|
get addVoice(): string | null;
|
|
133
158
|
/** @deprecated Use {@link AddVoice}. */
|
|
134
159
|
set addVoice(value: string | null);
|
|
160
|
+
/**
|
|
161
|
+
* The voice option picked in the "Add an agent" picker (one of {@link AddVoices}), or null. Kept beside
|
|
162
|
+
* {@link AddVoice} because two personas can share a voice id: the option, not the id, says which one shows picked.
|
|
163
|
+
*/
|
|
164
|
+
AddVoiceOption: RealtimeVoiceOption | null;
|
|
135
165
|
/** Exposed for template use — platform-safe UUID equality (SQL upper vs PG lower). */
|
|
136
166
|
UUIDsEqual: typeof UUIDsEqual;
|
|
137
167
|
/** True while an Add request is in flight. */
|
|
@@ -192,7 +222,10 @@ export declare class MJLiveKitRoomComponent extends BaseAngularComponent impleme
|
|
|
192
222
|
OnAddModelChange(event: Event): void;
|
|
193
223
|
/** @deprecated Use {@link OnAddModelChange}. */
|
|
194
224
|
onAddModelChange(event: Event): void;
|
|
195
|
-
/**
|
|
225
|
+
/**
|
|
226
|
+
* Records the add-agent VOICE choice: the picked option, found by its position (two personas can share a voice id,
|
|
227
|
+
* so the value can't tell them apart; option 0 is "Default voice"), and its voice id.
|
|
228
|
+
*/
|
|
196
229
|
OnAddVoiceChange(event: Event): void;
|
|
197
230
|
/** @deprecated Use {@link OnAddVoiceChange}. */
|
|
198
231
|
onAddVoiceChange(event: Event): void;
|
|
@@ -238,12 +271,22 @@ export declare class MJLiveKitRoomComponent extends BaseAngularComponent impleme
|
|
|
238
271
|
ShowWhiteboard: boolean;
|
|
239
272
|
/** @see LiveKitRoomComponent.ShowPreJoin */
|
|
240
273
|
ShowPreJoin: boolean;
|
|
274
|
+
/** @see LiveKitRoomComponent.EnableAgentVisionControl */
|
|
275
|
+
EnableAgentVisionControl: boolean;
|
|
276
|
+
/**
|
|
277
|
+
* The host's own words for why the room shows an agent without its avatar, per reason (for example its product's name
|
|
278
|
+
* for "this app"), shown as written; `{Agent}` stands for the agent's name. `unknown` words a reason the room doesn't
|
|
279
|
+
* know, such as a newer bot's. A reason it leaves out keeps the stock line, which names the agent.
|
|
280
|
+
*/
|
|
281
|
+
AvatarNoticeLabels: AvatarNoticeOverrides | null;
|
|
241
282
|
/** Enable the server-authorized recording control (composite egress). */
|
|
242
283
|
EnableRecording: boolean;
|
|
243
284
|
/** @see LiveKitRoomComponent.E2EEPassphrase */
|
|
244
285
|
E2EEPassphrase: string | null;
|
|
245
286
|
/** @see LiveKitRoomComponent.E2EEWorker */
|
|
246
287
|
E2EEWorker: Worker | null;
|
|
288
|
+
/** Advanced livekit-client room options merged into the constructed Room (overrides speech defaults). */
|
|
289
|
+
RoomOptions?: RoomOptions;
|
|
247
290
|
/** Emitted once the agent room session is started (agent mode). */
|
|
248
291
|
SessionStarted: EventEmitter<MJLiveKitSessionStartedEvent>;
|
|
249
292
|
/**
|
|
@@ -290,8 +333,28 @@ export declare class MJLiveKitRoomComponent extends BaseAngularComponent impleme
|
|
|
290
333
|
get resolvedDisplayName(): string | null;
|
|
291
334
|
/** @deprecated Use {@link ResolvedDisplayName}. */
|
|
292
335
|
set resolvedDisplayName(value: string | null);
|
|
293
|
-
/** The resolved room name (for recording calls). */
|
|
336
|
+
/** The resolved room name (for recording and agent-vision calls). */
|
|
294
337
|
ResolvedRoomName: string | null;
|
|
338
|
+
/**
|
|
339
|
+
* Why the server could not record the user's last choice of what the agent sees, shown over the room until they
|
|
340
|
+
* dismiss it or choose again; `null` when there is nothing to say.
|
|
341
|
+
*/
|
|
342
|
+
AgentVisionNotice: string | null;
|
|
343
|
+
/**
|
|
344
|
+
* What went wrong with the user's microphone, camera, speaker or share while the room was connected, such as a share
|
|
345
|
+
* the browser refused, shown over the room until they dismiss it, ask for another change to their devices, or leave;
|
|
346
|
+
* `null` when there is nothing to say. A share picker the user closed is no error, so it says nothing.
|
|
347
|
+
*/
|
|
348
|
+
DeviceNotice: string | null;
|
|
349
|
+
/** Which agents' notices show that the meeting can't show their avatar: once per agent per join. */
|
|
350
|
+
private readonly avatarNotices;
|
|
351
|
+
/**
|
|
352
|
+
* The notices over the room that an agent's avatar can't be shown, oldest first: one per agent per join, for everyone
|
|
353
|
+
* in the room, from the agent's bot. Each hides itself after a while or when dismissed.
|
|
354
|
+
*/
|
|
355
|
+
get AvatarNotices(): readonly AgentAvatarNotice[];
|
|
356
|
+
/** A notice's line, naming the agent, in the host's words when it gave some ({@link AvatarNoticeLabels}). */
|
|
357
|
+
AvatarNoticeLine(notice: AgentAvatarNotice): string;
|
|
295
358
|
/** @deprecated Use {@link ResolvedRoomName}. */
|
|
296
359
|
get resolvedRoomName(): string | null;
|
|
297
360
|
/** @deprecated Use {@link ResolvedRoomName}. */
|
|
@@ -320,6 +383,57 @@ export declare class MJLiveKitRoomComponent extends BaseAngularComponent impleme
|
|
|
320
383
|
get showRecordingPanel(): boolean;
|
|
321
384
|
/** @deprecated Use {@link ShowRecordingPanel}. */
|
|
322
385
|
set showRecordingPanel(value: boolean);
|
|
386
|
+
/** Where the user moved participants' tiles, as saved for them; given to the room, and saved again as they change. */
|
|
387
|
+
TileMoves: readonly MediaPlacementMove[];
|
|
388
|
+
/** Where the user put picture-in-picture boxes, by participant identity, as saved for them. */
|
|
389
|
+
PipRects: ReadonlyMap<string, MediaPipRect>;
|
|
390
|
+
/** Whether the user hid their self-view, as saved for them; given to the room, and saved again as they change it. */
|
|
391
|
+
SelfViewHidden: boolean;
|
|
392
|
+
/** The user's meeting layout, saved per user under the room's keys in the provider's settings. */
|
|
393
|
+
private readonly meetingLayoutPrefs;
|
|
394
|
+
/** The preview room's layout, saved the same way under its own keys. */
|
|
395
|
+
private readonly previewLayoutPrefs;
|
|
396
|
+
/** Where this room's layout is saved: the preview room's own keys in preview mode, the meeting room's otherwise. */
|
|
397
|
+
private get layoutPrefs();
|
|
398
|
+
/** The user moved a tile or reset the layout: keep the room's moves and save them. */
|
|
399
|
+
OnTileMovesChange(moves: readonly MediaPlacementMove[]): void;
|
|
400
|
+
/** The user moved or resized a box, or reset the layout: keep the boxes and save them. */
|
|
401
|
+
OnPipRectsChange(rects: ReadonlyMap<string, MediaPipRect>): void;
|
|
402
|
+
/**
|
|
403
|
+
* The user hid their self-view, showed it again, or reset the layout: keep it and save it. When saving fails, it still
|
|
404
|
+
* holds for this session.
|
|
405
|
+
*/
|
|
406
|
+
OnSelfViewHiddenChange(hidden: boolean): void;
|
|
407
|
+
/**
|
|
408
|
+
* The user chose whether agents may see their camera and screen. The preview room records it at once. In a meeting,
|
|
409
|
+
* MJAPI records it, since a participant's token can't change its own attributes, and the room shows the change when
|
|
410
|
+
* LiveKit reports it; when MJAPI can't, a notice says why.
|
|
411
|
+
*/
|
|
412
|
+
OnAgentVisionChange(on: boolean): void;
|
|
413
|
+
/** Asks MJAPI to record the user's choice for this room; when it can't, shows why and emits the error. */
|
|
414
|
+
private recordAgentVision;
|
|
415
|
+
/** The room's state changed: a notice shows for each agent whose bot newly says the meeting can't show its avatar. */
|
|
416
|
+
OnRoomStateChanged(state: LiveKitRoomState): void;
|
|
417
|
+
/** The room disconnected: its notices go, and joining again shows each agent's once more. */
|
|
418
|
+
OnRoomDisconnected(event: LiveKitDisconnectedEvent): void;
|
|
419
|
+
/**
|
|
420
|
+
* The room reported an error: the host hears it ({@link ErrorOccurred}), and a device error while the room is
|
|
421
|
+
* connected shows over the room ({@link DeviceNotice}), the latest in place of any earlier one. Until the room
|
|
422
|
+
* connects, it shows its own connection overlay, which says why a join failed.
|
|
423
|
+
*/
|
|
424
|
+
OnRoomError(error: LiveKitRoomError): void;
|
|
425
|
+
/**
|
|
426
|
+
* The user asked for a change to their devices (turned the microphone, camera or share on or off, or switched a
|
|
427
|
+
* device): the device notice goes, since it was about an earlier request. Should this one fail too, its own shows.
|
|
428
|
+
*/
|
|
429
|
+
OnDeviceChangeRequested(): void;
|
|
430
|
+
/** The user dismissed an agent's avatar notice: it does not show again in this join. */
|
|
431
|
+
OnAvatarNoticeDismissed(identity: string): void;
|
|
432
|
+
/**
|
|
433
|
+
* The settings engine for this component's provider. A host that never ran startup (lazy startup) can hand back an
|
|
434
|
+
* engine that has not loaded the user's settings; the loaded global one is used then.
|
|
435
|
+
*/
|
|
436
|
+
private userInfoEngine;
|
|
323
437
|
ngOnInit(): void;
|
|
324
438
|
/**
|
|
325
439
|
* Max time to wait for the connection to start before surfacing a retryable error, so a hung or very
|
|
@@ -327,7 +441,7 @@ export declare class MJLiveKitRoomComponent extends BaseAngularComponent impleme
|
|
|
327
441
|
* `0` to disable the client-side timeout.
|
|
328
442
|
*/
|
|
329
443
|
ConnectTimeoutMs: number;
|
|
330
|
-
/** Resolves the connection (mints a token and, in agent mode, starts the agent session). */
|
|
444
|
+
/** Resolves the connection (mints a token and, in agent mode, starts the agent session). A new join, too. */
|
|
331
445
|
Start(): Promise<void>;
|
|
332
446
|
/**
|
|
333
447
|
* Races `op` against a timeout: if it hasn't settled within `ms`, rejects with a clear, retryable
|
|
@@ -365,6 +479,11 @@ export declare class MJLiveKitRoomComponent extends BaseAngularComponent impleme
|
|
|
365
479
|
get inviteUrl(): string;
|
|
366
480
|
/** Copies {@link inviteUrl} to the clipboard and flips the pill to "Link copied" briefly. */
|
|
367
481
|
CopyInvite(): Promise<void>;
|
|
482
|
+
/**
|
|
483
|
+
* Opens the preview room: nothing is minted and no agent session starts. You join as the signed-in user unless
|
|
484
|
+
* {@link DisplayName} names someone else.
|
|
485
|
+
*/
|
|
486
|
+
private openPreview;
|
|
368
487
|
/** Joins an existing room by minting a client token. */
|
|
369
488
|
private joinRoom;
|
|
370
489
|
/** Records the add-agent turn-mode choice. */
|
|
@@ -393,6 +512,6 @@ export declare class MJLiveKitRoomComponent extends BaseAngularComponent impleme
|
|
|
393
512
|
/** Records a failure and emits an error event. */
|
|
394
513
|
private fail;
|
|
395
514
|
static ɵfac: i0.ɵɵFactoryDeclaration<MJLiveKitRoomComponent, never>;
|
|
396
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<MJLiveKitRoomComponent, "mj-livekit-agent-room", never, { "Mode": { "alias": "Mode"; "required": false; }; "AgentID": { "alias": "AgentID"; "required": false; }; "AgentName": { "alias": "AgentName"; "required": false; }; "TargetAgentID": { "alias": "TargetAgentID"; "required": false; }; "RoomName": { "alias": "RoomName"; "required": false; }; "DisplayName": { "alias": "DisplayName"; "required": false; }; "TurnMode": { "alias": "TurnMode"; "required": false; }; "TurnAddressing": { "alias": "TurnAddressing"; "required": false; }; "EnableTurnTaking": { "alias": "EnableTurnTaking"; "required": false; }; "TurnPollIntervalMs": { "alias": "TurnPollIntervalMs"; "required": false; }; "AutoStart": { "alias": "AutoStart"; "required": false; }; "EnableAgentManagement": { "alias": "EnableAgentManagement"; "required": false; }; "EnableInvite": { "alias": "EnableInvite"; "required": false; }; "EnableEndForAll": { "alias": "EnableEndForAll"; "required": false; }; "AvailableAgents": { "alias": "AvailableAgents"; "required": false; }; "RealtimeModelID": { "alias": "RealtimeModelID"; "required": false; }; "RealtimeVoice": { "alias": "RealtimeVoice"; "required": false; }; "EnableHandoff": { "alias": "EnableHandoff"; "required": false; }; "CanPickModelVoice": { "alias": "CanPickModelVoice"; "required": false; }; "AvailableModels": { "alias": "AvailableModels"; "required": false; }; "Layout": { "alias": "Layout"; "required": false; }; "Title": { "alias": "Title"; "required": false; }; "ShowHeader": { "alias": "ShowHeader"; "required": false; }; "ShowControlBar": { "alias": "ShowControlBar"; "required": false; }; "ShowChat": { "alias": "ShowChat"; "required": false; }; "ShowParticipantsPanel": { "alias": "ShowParticipantsPanel"; "required": false; }; "EnableMicrophoneControl": { "alias": "EnableMicrophoneControl"; "required": false; }; "EnableCameraControl": { "alias": "EnableCameraControl"; "required": false; }; "EnableScreenShareControl": { "alias": "EnableScreenShareControl"; "required": false; }; "EnableDeviceSettings": { "alias": "EnableDeviceSettings"; "required": false; }; "EnableLeaveControl": { "alias": "EnableLeaveControl"; "required": false; }; "StartWithMicrophone": { "alias": "StartWithMicrophone"; "required": false; }; "StartWithCamera": { "alias": "StartWithCamera"; "required": false; }; "AgentAvatarUrl": { "alias": "AgentAvatarUrl"; "required": false; }; "EnablePinning": { "alias": "EnablePinning"; "required": false; }; "EnableLayoutSwitcher": { "alias": "EnableLayoutSwitcher"; "required": false; }; "EnableNoiseFilter": { "alias": "EnableNoiseFilter"; "required": false; }; "EnableBackgroundEffects": { "alias": "EnableBackgroundEffects"; "required": false; }; "ShowAgentState": { "alias": "ShowAgentState"; "required": false; }; "ShowWhiteboard": { "alias": "ShowWhiteboard"; "required": false; }; "ShowPreJoin": { "alias": "ShowPreJoin"; "required": false; }; "EnableRecording": { "alias": "EnableRecording"; "required": false; }; "E2EEPassphrase": { "alias": "E2EEPassphrase"; "required": false; }; "E2EEWorker": { "alias": "E2EEWorker"; "required": false; }; "ConnectTimeoutMs": { "alias": "ConnectTimeoutMs"; "required": false; }; }, { "SessionStarted": "SessionStarted"; "InvitePeopleRequested": "InvitePeopleRequested"; "Connected": "Connected"; "Disconnected": "Disconnected"; "ParticipantJoined": "ParticipantJoined"; "ParticipantLeft": "ParticipantLeft"; "DataReceived": "DataReceived"; "ErrorOccurred": "ErrorOccurred"; }, never, never, true, never>;
|
|
515
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<MJLiveKitRoomComponent, "mj-livekit-agent-room", never, { "Mode": { "alias": "Mode"; "required": false; }; "AgentID": { "alias": "AgentID"; "required": false; }; "AgentName": { "alias": "AgentName"; "required": false; }; "TargetAgentID": { "alias": "TargetAgentID"; "required": false; }; "RoomName": { "alias": "RoomName"; "required": false; }; "DisplayName": { "alias": "DisplayName"; "required": false; }; "TurnMode": { "alias": "TurnMode"; "required": false; }; "TurnAddressing": { "alias": "TurnAddressing"; "required": false; }; "EnableTurnTaking": { "alias": "EnableTurnTaking"; "required": false; }; "TurnPollIntervalMs": { "alias": "TurnPollIntervalMs"; "required": false; }; "AutoStart": { "alias": "AutoStart"; "required": false; }; "EnableAgentManagement": { "alias": "EnableAgentManagement"; "required": false; }; "EnableInvite": { "alias": "EnableInvite"; "required": false; }; "EnableEndForAll": { "alias": "EnableEndForAll"; "required": false; }; "AvailableAgents": { "alias": "AvailableAgents"; "required": false; }; "RealtimeModelID": { "alias": "RealtimeModelID"; "required": false; }; "RealtimeVoice": { "alias": "RealtimeVoice"; "required": false; }; "EnableHandoff": { "alias": "EnableHandoff"; "required": false; }; "CanPickModelVoice": { "alias": "CanPickModelVoice"; "required": false; }; "AvailableModels": { "alias": "AvailableModels"; "required": false; }; "Layout": { "alias": "Layout"; "required": false; }; "Title": { "alias": "Title"; "required": false; }; "ShowHeader": { "alias": "ShowHeader"; "required": false; }; "ShowControlBar": { "alias": "ShowControlBar"; "required": false; }; "ShowChat": { "alias": "ShowChat"; "required": false; }; "ShowParticipantsPanel": { "alias": "ShowParticipantsPanel"; "required": false; }; "EnableMicrophoneControl": { "alias": "EnableMicrophoneControl"; "required": false; }; "EnableCameraControl": { "alias": "EnableCameraControl"; "required": false; }; "EnableScreenShareControl": { "alias": "EnableScreenShareControl"; "required": false; }; "EnableDeviceSettings": { "alias": "EnableDeviceSettings"; "required": false; }; "EnableLeaveControl": { "alias": "EnableLeaveControl"; "required": false; }; "StartWithMicrophone": { "alias": "StartWithMicrophone"; "required": false; }; "StartWithCamera": { "alias": "StartWithCamera"; "required": false; }; "AgentAvatarUrl": { "alias": "AgentAvatarUrl"; "required": false; }; "EnablePinning": { "alias": "EnablePinning"; "required": false; }; "EnableLayoutSwitcher": { "alias": "EnableLayoutSwitcher"; "required": false; }; "EnableNoiseFilter": { "alias": "EnableNoiseFilter"; "required": false; }; "EnableBackgroundEffects": { "alias": "EnableBackgroundEffects"; "required": false; }; "ShowAgentState": { "alias": "ShowAgentState"; "required": false; }; "ShowWhiteboard": { "alias": "ShowWhiteboard"; "required": false; }; "ShowPreJoin": { "alias": "ShowPreJoin"; "required": false; }; "EnableAgentVisionControl": { "alias": "EnableAgentVisionControl"; "required": false; }; "AvatarNoticeLabels": { "alias": "AvatarNoticeLabels"; "required": false; }; "EnableRecording": { "alias": "EnableRecording"; "required": false; }; "E2EEPassphrase": { "alias": "E2EEPassphrase"; "required": false; }; "E2EEWorker": { "alias": "E2EEWorker"; "required": false; }; "RoomOptions": { "alias": "RoomOptions"; "required": false; }; "ConnectTimeoutMs": { "alias": "ConnectTimeoutMs"; "required": false; }; }, { "SessionStarted": "SessionStarted"; "InvitePeopleRequested": "InvitePeopleRequested"; "Connected": "Connected"; "Disconnected": "Disconnected"; "ParticipantJoined": "ParticipantJoined"; "ParticipantLeft": "ParticipantLeft"; "DataReceived": "DataReceived"; "ErrorOccurred": "ErrorOccurred"; }, never, never, true, never>;
|
|
397
516
|
}
|
|
398
517
|
//# sourceMappingURL=mj-livekit-room.component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mj-livekit-room.component.d.ts","sourceRoot":"","sources":["../../src/lib/mj-livekit-room.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqE,YAAY,EAAS,MAAM,EAA6B,MAAM,eAAe,CAAC;AAC1J,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,EAA6C,oBAAoB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AACjK,OAAO,
|
|
1
|
+
{"version":3,"file":"mj-livekit-room.component.d.ts","sourceRoot":"","sources":["../../src/lib/mj-livekit-room.component.ts"],"names":[],"mappings":"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"}
|