@memberjunction/ng-explorer-core 6.2.0-edge.1 → 6.2.0-edge.3

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 (67) hide show
  1. package/dist/generated/lazy-feature-config.d.ts +1 -1
  2. package/dist/generated/lazy-feature-config.d.ts.map +1 -1
  3. package/dist/generated/lazy-feature-config.js +22 -2
  4. package/dist/generated/lazy-feature-config.js.map +1 -1
  5. package/dist/lib/resource-wrappers/artifact-resource.component.d.ts +7 -3
  6. package/dist/lib/resource-wrappers/artifact-resource.component.d.ts.map +1 -1
  7. package/dist/lib/resource-wrappers/artifact-resource.component.js +10 -5
  8. package/dist/lib/resource-wrappers/artifact-resource.component.js.map +1 -1
  9. package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts +13 -2
  10. package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts.map +1 -1
  11. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js +35 -6
  12. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js.map +1 -1
  13. package/dist/lib/resource-wrappers/compose-email-fallback.d.ts +46 -0
  14. package/dist/lib/resource-wrappers/compose-email-fallback.d.ts.map +1 -0
  15. package/dist/lib/resource-wrappers/compose-email-fallback.js +62 -0
  16. package/dist/lib/resource-wrappers/compose-email-fallback.js.map +1 -0
  17. package/dist/lib/resource-wrappers/human-handoff-console-resource.component.d.ts +32 -0
  18. package/dist/lib/resource-wrappers/human-handoff-console-resource.component.d.ts.map +1 -0
  19. package/dist/lib/resource-wrappers/human-handoff-console-resource.component.js +114 -0
  20. package/dist/lib/resource-wrappers/human-handoff-console-resource.component.js.map +1 -0
  21. package/dist/lib/resource-wrappers/livekit-room-resource.component.d.ts +13 -0
  22. package/dist/lib/resource-wrappers/livekit-room-resource.component.d.ts.map +1 -1
  23. package/dist/lib/resource-wrappers/livekit-room-resource.component.js +210 -132
  24. package/dist/lib/resource-wrappers/livekit-room-resource.component.js.map +1 -1
  25. package/dist/lib/resource-wrappers/meetings-resource.component.d.ts +42 -0
  26. package/dist/lib/resource-wrappers/meetings-resource.component.d.ts.map +1 -0
  27. package/dist/lib/resource-wrappers/meetings-resource.component.js +225 -0
  28. package/dist/lib/resource-wrappers/meetings-resource.component.js.map +1 -0
  29. package/dist/lib/resource-wrappers/record-resource.component.d.ts +27 -2
  30. package/dist/lib/resource-wrappers/record-resource.component.d.ts.map +1 -1
  31. package/dist/lib/resource-wrappers/record-resource.component.js +58 -6
  32. package/dist/lib/resource-wrappers/record-resource.component.js.map +1 -1
  33. package/dist/lib/resource-wrappers/view-resource.component.d.ts +6 -1
  34. package/dist/lib/resource-wrappers/view-resource.component.d.ts.map +1 -1
  35. package/dist/lib/resource-wrappers/view-resource.component.js +37 -7
  36. package/dist/lib/resource-wrappers/view-resource.component.js.map +1 -1
  37. package/dist/lib/services/server-connectivity.service.d.ts +9 -4
  38. package/dist/lib/services/server-connectivity.service.d.ts.map +1 -1
  39. package/dist/lib/services/server-connectivity.service.js +56 -12
  40. package/dist/lib/services/server-connectivity.service.js.map +1 -1
  41. package/dist/lib/shell/components/tabs/component-cache-manager.d.ts.map +1 -1
  42. package/dist/lib/shell/components/tabs/component-cache-manager.js.map +1 -1
  43. package/dist/lib/shell/components/tabs/tab-container.component.d.ts +31 -0
  44. package/dist/lib/shell/components/tabs/tab-container.component.d.ts.map +1 -1
  45. package/dist/lib/shell/components/tabs/tab-container.component.js +57 -2
  46. package/dist/lib/shell/components/tabs/tab-container.component.js.map +1 -1
  47. package/dist/lib/shell/shell.component.d.ts +2 -0
  48. package/dist/lib/shell/shell.component.d.ts.map +1 -1
  49. package/dist/lib/shell/shell.component.js +19 -9
  50. package/dist/lib/shell/shell.component.js.map +1 -1
  51. package/dist/lib/single-record/single-record.component.d.ts +29 -3
  52. package/dist/lib/single-record/single-record.component.d.ts.map +1 -1
  53. package/dist/lib/single-record/single-record.component.js +44 -4
  54. package/dist/lib/single-record/single-record.component.js.map +1 -1
  55. package/dist/lib/user-notifications/user-notifications.component.d.ts +13 -0
  56. package/dist/lib/user-notifications/user-notifications.component.d.ts.map +1 -1
  57. package/dist/lib/user-notifications/user-notifications.component.js +67 -0
  58. package/dist/lib/user-notifications/user-notifications.component.js.map +1 -1
  59. package/dist/module.d.ts +36 -33
  60. package/dist/module.d.ts.map +1 -1
  61. package/dist/module.js +25 -4
  62. package/dist/module.js.map +1 -1
  63. package/dist/public-api.d.ts +1 -0
  64. package/dist/public-api.d.ts.map +1 -1
  65. package/dist/public-api.js +1 -0
  66. package/dist/public-api.js.map +1 -1
  67. package/package.json +53 -52
@@ -1 +1 @@
1
- {"version":3,"file":"livekit-room-resource.component.js","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/livekit-room-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, AfterViewInit, ChangeDetectorRef, inject } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { RunView } from '@memberjunction/core';\nimport { GraphQLLiveKitClient, GraphQLDataProvider, RealtimeModelVoices, RealtimeVoiceOption } from '@memberjunction/graphql-dataprovider';\nimport { UserHoldsAuthorization, REALTIME_ADVANCED_SESSION_CONTROLS } from '@memberjunction/ng-conversations';\n\n/** A selectable target agent for the pre-join picker. */\ninterface TargetAgentChoice {\n ID: string;\n Name: string;\n Description: string | null;\n}\n\n/** A user shown in the \"Invite people\" search/selection. */\ninterface InviteeChoice {\n ID: string;\n Name: string;\n Email: string | null;\n}\n\n/**\n * LiveKit Room Resource — hosts the MJ-native LiveKit room (`mj-livekit-agent-room`) as an Explorer tab\n * (the **Meet** app's \"Live Room\").\n *\n * Flow: resolve the Realtime **co-agent** (voice front-end), then show a **pre-join picker** to choose\n * the **target** agent you're \"calling\" (the co-agent voices it via `invoke-target-agent` — without a\n * target it sits idle). \"Start call\" joins the room. An explicit `ResourceRecordID` skips the picker and\n * calls that agent directly.\n *\n * Registered via `@RegisterClass(BaseResourceComponent, 'LiveKitRoomResource')`.\n */\n@RegisterClass(BaseResourceComponent, 'LiveKitRoomResource')\n@Component({\n standalone: false,\n selector: 'mj-livekit-room-resource',\n template: `\n @switch (phase) {\n @case ('live') {\n <mj-livekit-agent-room\n class=\"mj-livekit-room-resource\"\n [Mode]=\"roomMode\"\n [RoomName]=\"joinRoomName\"\n [AgentID]=\"agentId\"\n [TargetAgentID]=\"targetAgentId\"\n [AgentName]=\"targetAgentName\"\n [AvailableAgents]=\"agents\"\n [RealtimeModelID]=\"selectedModelId\"\n [RealtimeVoice]=\"selectedVoice\"\n [CanPickModelVoice]=\"canPickModelVoice\"\n [AvailableModels]=\"realtimeModels\"\n [Provider]=\"ProviderToUse\"\n [ShowAgentState]=\"true\"\n [ShowWhiteboard]=\"true\"\n [EnableLayoutSwitcher]=\"true\"\n [EnablePinning]=\"true\"\n (Connected)=\"NotifyLoadComplete()\"\n (Disconnected)=\"onRoomLeft()\"\n (ErrorOccurred)=\"NotifyLoadComplete()\"\n (InvitePeopleRequested)=\"openInvite($event)\"\n ></mj-livekit-agent-room>\n }\n @case ('picking') {\n <div class=\"mj-lk-prejoin\">\n <div class=\"mj-lk-prejoin__card\">\n <button type=\"button\" class=\"mj-lk-back\" (click)=\"backToLanding()\"><i class=\"fa-solid fa-arrow-left\"></i> Back</button>\n <div class=\"mj-lk-prejoin__icon\"><i class=\"fa-solid fa-video\"></i></div>\n <h2 class=\"mj-lk-prejoin__title\">Start a call</h2>\n <p class=\"mj-lk-prejoin__subtitle\">\n Choose the agent you want to talk to. You can add more agents (and invite people) once\n you're in the room.\n </p>\n <label class=\"mj-lk-prejoin__label\" for=\"mj-lk-target\">Agent</label>\n <select id=\"mj-lk-target\" class=\"mj-input mj-lk-prejoin__select\" (change)=\"onTargetChange($event)\">\n @for (a of agents; track a.ID) {\n <option [value]=\"a.ID\" [selected]=\"UUIDsEqual(a.ID, selectedTargetId)\">{{ a.Name }}</option>\n }\n </select>\n @if (selectedDescription) {\n <p class=\"mj-lk-prejoin__desc\">{{ selectedDescription }}</p>\n }\n @if (canPickModelVoice && realtimeModels.length) {\n <label class=\"mj-lk-prejoin__label\" for=\"mj-lk-model\">Model <span class=\"mj-lk-prejoin__dev\">dev</span></label>\n <select id=\"mj-lk-model\" class=\"mj-input mj-lk-prejoin__select\" (change)=\"onModelChange($event)\">\n <option value=\"\">Default model</option>\n @for (m of realtimeModels; track m.ModelID) {\n <option [value]=\"m.ModelID\" [selected]=\"UUIDsEqual(m.ModelID, selectedModelId)\">{{ m.ModelName }}</option>\n }\n </select>\n @if (selectedModelVoices.length) {\n <label class=\"mj-lk-prejoin__label\" for=\"mj-lk-voice\">Voice <span class=\"mj-lk-prejoin__dev\">dev</span></label>\n <select id=\"mj-lk-voice\" class=\"mj-input mj-lk-prejoin__select\" (change)=\"onVoiceChange($event)\">\n <option value=\"\">Default voice</option>\n @for (v of selectedModelVoices; track v.ID) {\n <option [value]=\"v.ID\" [selected]=\"v.ID === selectedVoice\">{{ v.Name }}</option>\n }\n </select>\n }\n }\n <button type=\"button\" class=\"mj-lk-prejoin__start\" [disabled]=\"!selectedTargetId\" (click)=\"startCall()\">\n <i class=\"fa-solid fa-phone\"></i> Start call\n </button>\n </div>\n </div>\n }\n @case ('landing') {\n <div class=\"mj-lk-prejoin\">\n <div class=\"mj-lk-prejoin__card mj-lk-prejoin__card--wide\">\n <div class=\"mj-lk-prejoin__icon\"><i class=\"fa-solid fa-video\"></i></div>\n <h2 class=\"mj-lk-prejoin__title\">Meet</h2>\n <p class=\"mj-lk-prejoin__subtitle\">Start a live room with agents and people, join one that's in progress, or review a past meeting.</p>\n <div class=\"mj-lk-cards\">\n <button type=\"button\" class=\"mj-lk-card\" (click)=\"startNewRoom()\">\n <i class=\"fa-solid fa-circle-plus\"></i>\n <span class=\"mj-lk-card__t\">New room</span>\n <span class=\"mj-lk-card__d\">Pick an agent and start a fresh call.</span>\n </button>\n <button type=\"button\" class=\"mj-lk-card\" (click)=\"openExisting()\">\n <i class=\"fa-solid fa-door-open\"></i>\n <span class=\"mj-lk-card__t\">Join existing</span>\n <span class=\"mj-lk-card__d\">Hop into a room that's live right now.</span>\n </button>\n <button type=\"button\" class=\"mj-lk-card\" (click)=\"openHistory()\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n <span class=\"mj-lk-card__t\">History</span>\n <span class=\"mj-lk-card__d\">Read transcripts of past meetings.</span>\n </button>\n </div>\n </div>\n </div>\n }\n @case ('existing') {\n <div class=\"mj-lk-prejoin\">\n <div class=\"mj-lk-prejoin__card mj-lk-prejoin__card--wide\">\n <button type=\"button\" class=\"mj-lk-back\" (click)=\"backToLanding()\"><i class=\"fa-solid fa-arrow-left\"></i> Back</button>\n <h2 class=\"mj-lk-prejoin__title\">Join a room</h2>\n @if (loadingActive) {\n <div class=\"mj-lk-listmsg\"><i class=\"fa-solid fa-spinner fa-spin\"></i> Finding active rooms…</div>\n } @else if (activeRooms.length) {\n <div class=\"mj-lk-list\">\n @for (r of activeRooms; track r.RoomName) {\n <button type=\"button\" class=\"mj-lk-list__row\" (click)=\"joinExistingRoom(r.RoomName)\">\n <span class=\"mj-lk-list__name\"><i class=\"fa-solid fa-circle mj-lk-livedot\"></i> {{ r.Label }}</span>\n <span class=\"mj-lk-list__meta\">{{ r.AgentCount }} agent{{ r.AgentCount === 1 ? '' : 's' }} · Join</span>\n </button>\n }\n </div>\n } @else {\n <p class=\"mj-lk-prejoin__desc\">No rooms are active right now.</p>\n }\n <label class=\"mj-lk-prejoin__label\" for=\"mj-lk-room\">Or join by name</label>\n <div class=\"mj-lk-joinrow\">\n <input id=\"mj-lk-room\" class=\"mj-input mj-lk-joinrow__input\" type=\"text\" placeholder=\"Room name…\" [value]=\"manualRoomName\"\n (input)=\"manualRoomName = $any($event.target).value\" (keydown.enter)=\"joinExistingRoom(manualRoomName)\" />\n <button type=\"button\" class=\"mj-lk-prejoin__start mj-lk-joinrow__btn\" [disabled]=\"!manualRoomName.trim()\" (click)=\"joinExistingRoom(manualRoomName)\">Join</button>\n </div>\n </div>\n </div>\n }\n @case ('history') {\n <div class=\"mj-lk-prejoin\">\n <div class=\"mj-lk-prejoin__card mj-lk-prejoin__card--wide\">\n @if (!openHistoryRoom) {\n <button type=\"button\" class=\"mj-lk-back\" (click)=\"backToLanding()\"><i class=\"fa-solid fa-arrow-left\"></i> Back</button>\n <h2 class=\"mj-lk-prejoin__title\">Past meetings</h2>\n @if (loadingHistory) {\n <div class=\"mj-lk-listmsg\"><i class=\"fa-solid fa-spinner fa-spin\"></i> Loading…</div>\n } @else if (historyRooms.length) {\n <div class=\"mj-lk-list\">\n @for (h of historyRooms; track h.ConversationID) {\n <button type=\"button\" class=\"mj-lk-list__row\" (click)=\"openTranscript(h)\">\n <span class=\"mj-lk-list__name\"><i class=\"fa-solid fa-comments\"></i> {{ h.Name }}</span>\n <span class=\"mj-lk-list__meta\">{{ formatTime(h.At) }}</span>\n </button>\n }\n </div>\n } @else {\n <p class=\"mj-lk-prejoin__desc\">No past meetings yet.</p>\n }\n } @else {\n <button type=\"button\" class=\"mj-lk-back\" (click)=\"closeTranscript()\"><i class=\"fa-solid fa-arrow-left\"></i> All meetings</button>\n <h2 class=\"mj-lk-prejoin__title\">{{ openHistoryRoom.Name }}</h2>\n @if (loadingTranscript) {\n <div class=\"mj-lk-listmsg\"><i class=\"fa-solid fa-spinner fa-spin\"></i> Loading transcript…</div>\n } @else if (historyTranscript.length) {\n <div class=\"mj-lk-transcript\">\n @for (line of historyTranscript; track $index) {\n <div class=\"mj-lk-tline\" [class.mj-lk-tline--agent]=\"line.Kind === 'agent'\" [class.mj-lk-tline--error]=\"line.Kind === 'error'\">\n <span class=\"mj-lk-tline__who\">{{ line.Speaker }}</span>\n <span class=\"mj-lk-tline__msg\">{{ line.Message }}</span>\n </div>\n }\n </div>\n } @else {\n <p class=\"mj-lk-prejoin__desc\">No transcript was captured for this meeting.</p>\n }\n }\n </div>\n </div>\n }\n @case ('error') {\n <div class=\"mj-livekit-room-resource__message\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n <span>{{ resolveError }}</span>\n </div>\n }\n @default {\n <div class=\"mj-livekit-room-resource__message\">Preparing room…</div>\n }\n }\n\n @if (showInvite) {\n <mj-dialog [Visible]=\"showInvite\" (Close)=\"showInvite = false\" Title=\"Invite people\" Size=\"auto\" [Width]=\"440\">\n <div class=\"mj-lk-invite\">\n <p class=\"mj-lk-invite__hint\">They'll get an in-app notification (and an email if Comms is set up) to join this room.</p>\n <div class=\"mj-lk-invite__search\">\n <input class=\"mj-input\" type=\"text\" [value]=\"userSearch\" placeholder=\"Search people by name or email…\"\n (input)=\"userSearch = $any($event.target).value\" (keydown.enter)=\"searchUsers()\" />\n <button type=\"button\" class=\"mj-lk-invite__searchbtn\" [disabled]=\"searching\" (click)=\"searchUsers()\">\n <i class=\"fa-solid\" [class.fa-magnifying-glass]=\"!searching\" [class.fa-spinner]=\"searching\" [class.fa-spin]=\"searching\"></i>\n </button>\n </div>\n\n @if (selectedInvitees.length) {\n <div class=\"mj-lk-invite__chips\">\n @for (u of selectedInvitees; track u.ID) {\n <span class=\"mj-lk-invite__chip\">\n {{ u.Name }}\n <button type=\"button\" class=\"mj-lk-invite__chipx\" (click)=\"removeInvitee(u.ID)\"><i class=\"fa-solid fa-xmark\"></i></button>\n </span>\n }\n </div>\n }\n\n @if (userResults.length) {\n <div class=\"mj-lk-invite__results\">\n @for (u of userResults; track u.ID) {\n <button type=\"button\" class=\"mj-lk-invite__result\" (click)=\"addInvitee(u)\">\n <span class=\"mj-lk-invite__rname\">{{ u.Name }}</span>\n @if (u.Email) { <span class=\"mj-lk-invite__remail\">{{ u.Email }}</span> }\n </button>\n }\n </div>\n } @else if (searched && !searching) {\n <div class=\"mj-lk-invite__empty\">No matching people.</div>\n }\n\n @if (inviteMessage) {\n <div class=\"mj-lk-invite__msg\">{{ inviteMessage }}</div>\n }\n\n <div class=\"mj-lk-invite__actions\">\n <button type=\"button\" class=\"mj-lk-invite__send\" [disabled]=\"!selectedInvitees.length || inviting\" (click)=\"sendInvites()\">\n <i class=\"fa-solid\" [class.fa-paper-plane]=\"!inviting\" [class.fa-spinner]=\"inviting\" [class.fa-spin]=\"inviting\"></i>\n Invite {{ selectedInvitees.length || '' }}\n </button>\n <button type=\"button\" class=\"mj-lk-invite__cancel\" (click)=\"showInvite = false\">Cancel</button>\n </div>\n </div>\n </mj-dialog>\n }\n `,\n styles: [\n `\n :host {\n display: block;\n height: 100%;\n }\n .mj-livekit-room-resource {\n display: block;\n height: 100%;\n }\n .mj-livekit-room-resource__message {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n height: 100%;\n padding: 1.5rem;\n text-align: center;\n color: var(--mj-text-secondary);\n }\n .mj-livekit-room-resource__message i {\n color: var(--mj-status-warning);\n }\n .mj-lk-prejoin {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 1.5rem;\n background: var(--mj-bg-page);\n }\n .mj-lk-prejoin__card {\n width: 100%;\n max-width: 440px;\n padding: 2rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 12px);\n background: var(--mj-bg-surface);\n box-shadow: var(--mj-shadow-md, 0 4px 16px rgba(0, 0, 0, 0.12));\n text-align: center;\n }\n .mj-lk-prejoin__icon {\n font-size: 1.75rem;\n color: var(--mj-brand-primary);\n margin-bottom: 0.75rem;\n }\n .mj-lk-prejoin__title {\n margin: 0 0 0.5rem;\n color: var(--mj-text-primary);\n font-size: 1.25rem;\n }\n .mj-lk-prejoin__subtitle {\n margin: 0 0 1.5rem;\n color: var(--mj-text-secondary);\n font-size: 0.875rem;\n line-height: 1.4;\n }\n .mj-lk-prejoin__label {\n display: block;\n text-align: left;\n margin-bottom: 0.35rem;\n color: var(--mj-text-secondary);\n font-size: 0.8125rem;\n font-weight: 600;\n }\n .mj-lk-prejoin__dev {\n margin-left: 0.35rem;\n padding: 0 0.35rem;\n border-radius: 999px;\n font-size: 0.625rem;\n font-weight: 700;\n text-transform: uppercase;\n color: var(--mj-text-inverse);\n background: var(--mj-brand-primary);\n vertical-align: middle;\n }\n .mj-lk-prejoin__select {\n width: 100%;\n margin-bottom: 0.75rem;\n }\n .mj-lk-prejoin__desc {\n text-align: left;\n margin: 0 0 1.25rem;\n color: var(--mj-text-muted);\n font-size: 0.8125rem;\n line-height: 1.4;\n }\n .mj-lk-prejoin__start {\n width: 100%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 0.625rem 1rem;\n border: none;\n border-radius: var(--mj-radius-md, 8px);\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.9375rem;\n font-weight: 600;\n cursor: pointer;\n }\n .mj-lk-prejoin__start:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n .mj-lk-prejoin__start:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .mj-lk-prejoin__card--wide {\n max-width: 560px;\n text-align: left;\n }\n .mj-lk-back {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n margin-bottom: 0.75rem;\n padding: 4px 8px;\n border: none;\n background: none;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-size: 0.8125rem;\n }\n .mj-lk-back:hover { color: var(--mj-text-primary); }\n .mj-lk-cards {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 0.75rem;\n margin-top: 1.25rem;\n }\n .mj-lk-card {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n padding: 1.25rem 0.75rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 12px);\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n text-align: center;\n }\n .mj-lk-card:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-hover, var(--mj-bg-surface-card));\n }\n .mj-lk-card > i { font-size: 1.4rem; color: var(--mj-brand-primary); }\n .mj-lk-card__t { font-weight: 600; color: var(--mj-text-primary); font-size: 0.9rem; }\n .mj-lk-card__d { color: var(--mj-text-muted); font-size: 0.78rem; line-height: 1.3; }\n .mj-lk-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin: 0.5rem 0 1rem;\n max-height: 320px;\n overflow-y: auto;\n }\n .mj-lk-list__row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.75rem;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n text-align: left;\n }\n .mj-lk-list__row:hover { border-color: var(--mj-brand-primary); background: var(--mj-bg-surface-hover, var(--mj-bg-surface-card)); }\n .mj-lk-list__name { color: var(--mj-text-primary); font-size: 0.875rem; display: inline-flex; align-items: center; gap: 8px; }\n .mj-lk-list__meta { color: var(--mj-text-muted); font-size: 0.78rem; white-space: nowrap; }\n .mj-lk-livedot { color: var(--mj-status-success); font-size: 0.5rem; }\n .mj-lk-listmsg { padding: 1rem; color: var(--mj-text-secondary); text-align: center; }\n .mj-lk-joinrow { display: flex; gap: 8px; }\n .mj-lk-joinrow__input { flex: 1; }\n .mj-lk-joinrow__btn { white-space: nowrap; }\n .mj-lk-transcript {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 0.5rem;\n max-height: 60vh;\n overflow-y: auto;\n }\n .mj-lk-tline {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 8px 10px;\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n }\n .mj-lk-tline--agent { background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface)); }\n .mj-lk-tline--error { background: var(--mj-status-error-bg, color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface))); }\n .mj-lk-tline__who { font-size: 0.72rem; font-weight: 600; color: var(--mj-text-secondary); }\n .mj-lk-tline__msg { font-size: 0.875rem; color: var(--mj-text-primary); }\n .mj-lk-invite {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n min-width: 360px;\n padding: 0.25rem;\n }\n .mj-lk-invite__hint {\n margin: 0;\n color: var(--mj-text-muted);\n font-size: 0.8125rem;\n }\n .mj-lk-invite__search {\n display: flex;\n gap: 0.5rem;\n }\n .mj-lk-invite__search .mj-input {\n flex: 1;\n }\n .mj-lk-invite__searchbtn,\n .mj-lk-invite__send,\n .mj-lk-invite__cancel {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.4rem;\n padding: 0.5rem 0.85rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n cursor: pointer;\n font-size: 0.875rem;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n }\n .mj-lk-invite__send {\n border: none;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n .mj-lk-invite__send:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .mj-lk-invite__chips {\n display: flex;\n flex-wrap: wrap;\n gap: 0.4rem;\n }\n .mj-lk-invite__chip {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.2rem 0.5rem;\n border-radius: 999px;\n font-size: 0.8125rem;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n }\n .mj-lk-invite__chipx {\n border: none;\n background: transparent;\n cursor: pointer;\n color: var(--mj-text-muted);\n padding: 0;\n }\n .mj-lk-invite__results {\n max-height: 220px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n }\n .mj-lk-invite__result {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 0.1rem;\n width: 100%;\n padding: 0.5rem 0.75rem;\n border: none;\n border-bottom: 1px solid var(--mj-border-subtle, var(--mj-border-default));\n background: transparent;\n cursor: pointer;\n text-align: left;\n }\n .mj-lk-invite__result:hover {\n background: var(--mj-bg-surface-hover);\n }\n .mj-lk-invite__rname {\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n }\n .mj-lk-invite__remail {\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n }\n .mj-lk-invite__empty {\n color: var(--mj-text-muted);\n font-size: 0.8125rem;\n padding: 0.25rem;\n }\n .mj-lk-invite__msg {\n color: var(--mj-text-secondary);\n font-size: 0.8125rem;\n }\n .mj-lk-invite__actions {\n display: flex;\n gap: 0.5rem;\n margin-top: 0.25rem;\n }\n `,\n ],\n})\nexport class LiveKitRoomResource extends BaseResourceComponent implements OnInit, OnDestroy, AfterViewInit {\n /** Render phase: spinner while resolving → landing (new/existing/history) → picker/existing/history → live room. */\n public Phase: 'loading' | 'landing' | 'picking' | 'existing' | 'history' | 'live' | 'error' = 'loading';\n\n /** @deprecated Use {@link Phase}. */\n public get phase(): 'loading' | 'landing' | 'picking' | 'existing' | 'history' | 'live' | 'error' {\n return this.Phase;\n }\n /** @deprecated Use {@link Phase}. */\n public set phase(value: 'loading' | 'landing' | 'picking' | 'existing' | 'history' | 'live' | 'error') {\n this.Phase = value;\n }\n\n // ── \"Join existing\" state ─────────────────────────────────────────────────────────\n /** Currently-active rooms (a distinct `ExternalConnectionID` with ≥1 connected agent bridge). */\n public ActiveRooms: { RoomName: string; Label: string; AgentCount: number }[] = [];\n\n /** @deprecated Use {@link ActiveRooms}. */\n public get activeRooms(): { RoomName: string; Label: string; AgentCount: number }[] {\n return this.ActiveRooms;\n }\n /** @deprecated Use {@link ActiveRooms}. */\n public set activeRooms(value: { RoomName: string; Label: string; AgentCount: number }[]) {\n this.ActiveRooms = value;\n }\n /** True while loading the active-rooms list. */\n public LoadingActive = false;\n\n /** @deprecated Use {@link LoadingActive}. */\n public get loadingActive() {\n return this.LoadingActive;\n }\n /** @deprecated Use {@link LoadingActive}. */\n public set loadingActive(value) {\n this.LoadingActive = value;\n }\n /** Free-text room name to join directly (the \"join by name/code\" path). */\n public ManualRoomName = '';\n\n /** @deprecated Use {@link ManualRoomName}. */\n public get manualRoomName() {\n return this.ManualRoomName;\n }\n /** @deprecated Use {@link ManualRoomName}. */\n public set manualRoomName(value) {\n this.ManualRoomName = value;\n }\n\n // ── \"History\" (past meetings) state ───────────────────────────────────────────────\n /** Past meeting rooms (the `MJ: Conversations` of Type='Meeting Room' the bridge recorded). */\n public HistoryRooms: { ConversationID: string; Name: string; At: Date }[] = [];\n\n /** @deprecated Use {@link HistoryRooms}. */\n public get historyRooms(): { ConversationID: string; Name: string; At: Date }[] {\n return this.HistoryRooms;\n }\n /** @deprecated Use {@link HistoryRooms}. */\n public set historyRooms(value: { ConversationID: string; Name: string; At: Date }[]) {\n this.HistoryRooms = value;\n }\n /** True while loading the history list. */\n public LoadingHistory = false;\n\n /** @deprecated Use {@link LoadingHistory}. */\n public get loadingHistory() {\n return this.LoadingHistory;\n }\n /** @deprecated Use {@link LoadingHistory}. */\n public set loadingHistory(value) {\n this.LoadingHistory = value;\n }\n /** The history room whose transcript is open (drill-in), or null for the list. */\n public OpenHistoryRoom: { ConversationID: string; Name: string } | null = null;\n\n /** @deprecated Use {@link OpenHistoryRoom}. */\n public get openHistoryRoom(): { ConversationID: string; Name: string } | null {\n return this.OpenHistoryRoom;\n }\n /** @deprecated Use {@link OpenHistoryRoom}. */\n public set openHistoryRoom(value: { ConversationID: string; Name: string } | null) {\n this.OpenHistoryRoom = value;\n }\n /** The opened room's transcript lines. */\n public HistoryTranscript: { Kind: 'agent' | 'human' | 'error'; Speaker: string; Message: string }[] = [];\n\n /** @deprecated Use {@link HistoryTranscript}. */\n public get historyTranscript(): { Kind: 'agent' | 'human' | 'error'; Speaker: string; Message: string }[] {\n return this.HistoryTranscript;\n }\n /** @deprecated Use {@link HistoryTranscript}. */\n public set historyTranscript(value: { Kind: 'agent' | 'human' | 'error'; Speaker: string; Message: string }[]) {\n this.HistoryTranscript = value;\n }\n /** True while loading a room's transcript. */\n public LoadingTranscript = false;\n\n /** @deprecated Use {@link LoadingTranscript}. */\n public get loadingTranscript() {\n return this.LoadingTranscript;\n }\n /** @deprecated Use {@link LoadingTranscript}. */\n public set loadingTranscript(value) {\n this.LoadingTranscript = value;\n }\n\n /** `'agent'` to start/voice an agent (the default), or `'join'` when opened from an invite link. */\n public RoomMode: 'agent' | 'join' = 'agent';\n\n /** @deprecated Use {@link RoomMode}. */\n public get roomMode(): 'agent' | 'join' {\n return this.RoomMode;\n }\n /** @deprecated Use {@link RoomMode}. */\n public set roomMode(value: 'agent' | 'join') {\n this.RoomMode = value;\n }\n\n /** The room to JOIN when opened via an invite link (`?room=…`); null in agent mode. */\n public JoinRoomName: string | null = null;\n\n /** @deprecated Use {@link JoinRoomName}. */\n public get joinRoomName(): string | null {\n return this.JoinRoomName;\n }\n /** @deprecated Use {@link JoinRoomName}. */\n public set joinRoomName(value: string | null) {\n this.JoinRoomName = value;\n }\n\n /** The Realtime co-agent (voice front-end) id — the resolved default Realtime-type agent. */\n public AgentId: string | null = null;\n\n /** @deprecated Use {@link AgentId}. */\n public get agentId(): string | null {\n return this.AgentId;\n }\n /** @deprecated Use {@link AgentId}. */\n public set agentId(value: string | null) {\n this.AgentId = value;\n }\n\n /** The TARGET agent the co-agent voices (the one being \"called\"); the bot is named after it. */\n public TargetAgentId: string | null = null;\n\n /** @deprecated Use {@link TargetAgentId}. */\n public get targetAgentId(): string | null {\n return this.TargetAgentId;\n }\n /** @deprecated Use {@link TargetAgentId}. */\n public set targetAgentId(value: string | null) {\n this.TargetAgentId = value;\n }\n\n /** The target agent's display name — used as the bot name + addressing word (\"Sage, …\"). */\n public TargetAgentName: string | null = null;\n\n /** @deprecated Use {@link TargetAgentName}. */\n public get targetAgentName(): string | null {\n return this.TargetAgentName;\n }\n /** @deprecated Use {@link TargetAgentName}. */\n public set targetAgentName(value: string | null) {\n this.TargetAgentName = value;\n }\n\n /** The agents offered in the pre-join picker (active, excluding the Realtime co-agent itself). */\n public Agents: TargetAgentChoice[] = [];\n\n /** @deprecated Use {@link Agents}. */\n public get agents(): TargetAgentChoice[] {\n return this.Agents;\n }\n /** @deprecated Use {@link Agents}. */\n public set agents(value: TargetAgentChoice[]) {\n this.Agents = value;\n }\n\n /** The currently-selected target in the picker (defaults to \"Sage\" when present). */\n public SelectedTargetId: string | null = null;\n\n /** @deprecated Use {@link SelectedTargetId}. */\n public get selectedTargetId(): string | null {\n return this.SelectedTargetId;\n }\n /** @deprecated Use {@link SelectedTargetId}. */\n public set selectedTargetId(value: string | null) {\n this.SelectedTargetId = value;\n }\n\n // ── Dev model/voice override (gated by the `Realtime: Advanced Session Controls` authorization) ──────\n /** Whether the current user may override the realtime model/voice (drives the dev pickers). */\n public CanPickModelVoice = false;\n\n /** @deprecated Use {@link CanPickModelVoice}. */\n public get canPickModelVoice() {\n return this.CanPickModelVoice;\n }\n /** @deprecated Use {@link CanPickModelVoice}. */\n public set canPickModelVoice(value) {\n this.CanPickModelVoice = value;\n }\n /** Active Realtime models + their voices (loaded once when the user can override). */\n public RealtimeModels: RealtimeModelVoices[] = [];\n\n /** @deprecated Use {@link RealtimeModels}. */\n public get realtimeModels(): RealtimeModelVoices[] {\n return this.RealtimeModels;\n }\n /** @deprecated Use {@link RealtimeModels}. */\n public set realtimeModels(value: RealtimeModelVoices[]) {\n this.RealtimeModels = value;\n }\n /** The MODEL override chosen for the FIRST agent in the pre-join picker (null = default). */\n public SelectedModelId: string | null = null;\n\n /** @deprecated Use {@link SelectedModelId}. */\n public get selectedModelId(): string | null {\n return this.SelectedModelId;\n }\n /** @deprecated Use {@link SelectedModelId}. */\n public set selectedModelId(value: string | null) {\n this.SelectedModelId = value;\n }\n /** The VOICE override chosen for the FIRST agent in the pre-join picker (null = default). */\n public SelectedVoice: string | null = null;\n\n /** @deprecated Use {@link SelectedVoice}. */\n public get selectedVoice(): string | null {\n return this.SelectedVoice;\n }\n /** @deprecated Use {@link SelectedVoice}. */\n public set selectedVoice(value: string | null) {\n this.SelectedVoice = value;\n }\n\n /** Voices for the model chosen in the pre-join picker. */\n public get SelectedModelVoices(): RealtimeVoiceOption[] {\n return this.RealtimeModels.find((m) => UUIDsEqual(m.ModelID, this.SelectedModelId))?.Voices ?? [];\n }\n\n /** @deprecated Use {@link SelectedModelVoices}. */\n public get selectedModelVoices(): RealtimeVoiceOption[] {\n return this.SelectedModelVoices;\n }\n\n /** Records the pre-join MODEL choice; clears the voice so it can't outlive a model switch. */\n public OnModelChange(event: Event): void {\n this.SelectedModelId = (event.target as HTMLSelectElement).value || null;\n this.SelectedVoice = null;\n }\n\n /** @deprecated Use {@link OnModelChange}. */\n public onModelChange(event: Event): void {\n return this.OnModelChange(event);\n }\n\n /** Records the pre-join VOICE choice. */\n public OnVoiceChange(event: Event): void {\n this.SelectedVoice = (event.target as HTMLSelectElement).value || null;\n }\n\n /** @deprecated Use {@link OnVoiceChange}. */\n public onVoiceChange(event: Event): void {\n return this.OnVoiceChange(event);\n }\n\n /** Exposed for template use — platform-safe UUID equality (SQL upper vs PG lower). */\n public UUIDsEqual = UUIDsEqual;\n\n /** Set when no co-agent could be resolved — shown instead of the room. */\n public ResolveError: string | null = null;\n\n /** @deprecated Use {@link ResolveError}. */\n public get resolveError(): string | null {\n return this.ResolveError;\n }\n /** @deprecated Use {@link ResolveError}. */\n public set resolveError(value: string | null) {\n this.ResolveError = value;\n }\n\n // ── \"Invite people\" dialog state ─────────────────────────────────────────────────\n /** Whether the invite-people dialog is open. */\n public ShowInvite = false;\n\n /** @deprecated Use {@link ShowInvite}. */\n public get showInvite() {\n return this.ShowInvite;\n }\n /** @deprecated Use {@link ShowInvite}. */\n public set showInvite(value) {\n this.ShowInvite = value;\n }\n /** The room the invite targets (the live room name). */\n public InviteRoomName: string | null = null;\n\n /** @deprecated Use {@link InviteRoomName}. */\n public get inviteRoomName(): string | null {\n return this.InviteRoomName;\n }\n /** @deprecated Use {@link InviteRoomName}. */\n public set inviteRoomName(value: string | null) {\n this.InviteRoomName = value;\n }\n /** Current search text in the people search box. */\n public UserSearch = '';\n\n /** @deprecated Use {@link UserSearch}. */\n public get userSearch() {\n return this.UserSearch;\n }\n /** @deprecated Use {@link UserSearch}. */\n public set userSearch(value) {\n this.UserSearch = value;\n }\n /** People matching the last search (minus already-selected + the current user). */\n public UserResults: InviteeChoice[] = [];\n\n /** @deprecated Use {@link UserResults}. */\n public get userResults(): InviteeChoice[] {\n return this.UserResults;\n }\n /** @deprecated Use {@link UserResults}. */\n public set userResults(value: InviteeChoice[]) {\n this.UserResults = value;\n }\n /** People chosen to invite. */\n public SelectedInvitees: InviteeChoice[] = [];\n\n /** @deprecated Use {@link SelectedInvitees}. */\n public get selectedInvitees(): InviteeChoice[] {\n return this.SelectedInvitees;\n }\n /** @deprecated Use {@link SelectedInvitees}. */\n public set selectedInvitees(value: InviteeChoice[]) {\n this.SelectedInvitees = value;\n }\n /** True while a people search is running. */\n public Searching = false;\n\n /** @deprecated Use {@link Searching}. */\n public get searching() {\n return this.Searching;\n }\n /** @deprecated Use {@link Searching}. */\n public set searching(value) {\n this.Searching = value;\n }\n /** True once a search has run (drives the \"no matches\" empty state). */\n public Searched = false;\n\n /** @deprecated Use {@link Searched}. */\n public get searched() {\n return this.Searched;\n }\n /** @deprecated Use {@link Searched}. */\n public set searched(value) {\n this.Searched = value;\n }\n /** True while invites are being sent. */\n public Inviting = false;\n\n /** @deprecated Use {@link Inviting}. */\n public get inviting() {\n return this.Inviting;\n }\n /** @deprecated Use {@link Inviting}. */\n public set inviting(value) {\n this.Inviting = value;\n }\n /** Result/status message under the dialog. */\n public InviteMessage: string | null = null;\n\n /** @deprecated Use {@link InviteMessage}. */\n public get inviteMessage(): string | null {\n return this.InviteMessage;\n }\n /** @deprecated Use {@link InviteMessage}. */\n public set inviteMessage(value: string | null) {\n this.InviteMessage = value;\n }\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n /** Description of the selected target, shown under the picker. */\n public get SelectedDescription(): string | null {\n return this.Agents.find((a) => UUIDsEqual(a.ID, this.SelectedTargetId))?.Description ?? null;\n }\n\n /** @deprecated Use {@link SelectedDescription}. */\n public get selectedDescription(): string | null {\n return this.SelectedDescription;\n }\n\n override ngOnInit(): void {\n super.ngOnInit();\n this.resolve();\n }\n\n /**\n * Resolves the co-agent + target choices. Synchronous when the AI engine is already loaded (the common\n * case — it bootstraps at startup) so the first render is settled (avoids NG0100 from an async branch\n * flip under the app's frequent change-detection); a cold engine takes the async path and flushes.\n */\n private resolve(): void {\n // Invite link (?room=…): join that existing room directly — no agent resolution / picker needed.\n const invitedRoom = this.GetQueryParams()?.['room']?.trim();\n if (invitedRoom) {\n this.RoomMode = 'join';\n this.JoinRoomName = invitedRoom;\n this.Phase = 'live';\n this.NotifyLoadComplete();\n return;\n }\n\n if (AIEngineBase.Instance.Loaded) {\n this.applyResolution();\n return;\n }\n void AIEngineBase.Instance.Config(false, undefined, this.ProviderToUse).then(() => {\n this.applyResolution();\n this.cdr.detectChanges();\n });\n }\n\n /** Resolves the co-agent, builds the target list, and chooses the next phase (live for an explicit record, else picker). */\n private applyResolution(): void {\n const realtimeType = AIEngineBase.Instance.AgentTypes.find((t) => t.Name?.trim().toLowerCase() === 'realtime');\n const coAgent = realtimeType\n ? AIEngineBase.Instance.Agents.find((a) => a.Status === 'Active' && UUIDsEqual(a.TypeID, realtimeType.ID))\n : undefined;\n\n if (!coAgent) {\n this.ResolveError =\n 'No active Realtime agent is configured, so the Live Room has no voice to bring in. ' +\n 'Create a Realtime-type AI Agent (e.g. \"Realtime Co-Agent\") and try again.';\n this.Phase = 'error';\n this.NotifyLoadComplete();\n return;\n }\n this.AgentId = coAgent.ID;\n\n // Dev model/voice override: gate on the `Realtime: Advanced Session Controls` authorization and, when\n // held, load the active models + their voices for the pickers (here and the in-room add-agent control).\n this.CanPickModelVoice = UserHoldsAuthorization(\n this.ProviderToUse?.CurrentUser, REALTIME_ADVANCED_SESSION_CONTROLS, this.ProviderToUse,\n );\n if (this.CanPickModelVoice) {\n void this.loadRealtimeModels();\n }\n\n // Target candidates: every active agent EXCEPT the Realtime co-agents (they voice a target, not themselves).\n this.Agents = AIEngineBase.Instance.Agents\n .filter((a) => a.Status === 'Active' && (!realtimeType || !UUIDsEqual(a.TypeID, realtimeType.ID)))\n .map((a) => ({ ID: a.ID, Name: a.Name ?? '(unnamed)', Description: a.Description ?? null }))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n\n // An explicit record id (deep link to a specific agent) skips the picker and calls it directly.\n const explicit = this.Data?.ResourceRecordID ? String(this.Data.ResourceRecordID) : null;\n if (explicit) {\n this.SelectedTargetId = explicit;\n this.StartCall();\n return;\n }\n\n // Default the picker to the general assistant \"Sage\" when present, else the first candidate.\n this.SelectedTargetId =\n this.Agents.find((a) => a.Name.trim().toLowerCase() === 'sage')?.ID ?? this.Agents[0]?.ID ?? null;\n // Land on the Meet home (start new / join existing / history) rather than jumping straight into the picker.\n this.Phase = 'landing';\n this.NotifyLoadComplete();\n }\n\n // ── Meet landing navigation ─────────────────────────────────────────────────────────\n\n /**\n * The room disconnected (the user clicked **Leave** or **End meeting**, or the room dropped). Return to the\n * Meet landing so they can start a new room, join another, or review history — rather than being stranded\n * on a dead room. Resets the join state so the next \"New room\" / \"Join existing\" starts clean.\n */\n public OnRoomLeft(): void {\n this.RoomMode = 'agent';\n this.JoinRoomName = null;\n this.Phase = 'landing';\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnRoomLeft}. */\n public onRoomLeft(): void {\n return this.OnRoomLeft();\n }\n\n /** Go to the \"start a new room\" picker. */\n public StartNewRoom(): void {\n this.Phase = 'picking';\n }\n\n /** @deprecated Use {@link StartNewRoom}. */\n public startNewRoom(): void {\n return this.StartNewRoom();\n }\n\n /** Open the \"join existing room\" view and load the active rooms. */\n public OpenExisting(): void {\n this.Phase = 'existing';\n void this.loadActiveRooms();\n }\n\n /** @deprecated Use {@link OpenExisting}. */\n public openExisting(): void {\n return this.OpenExisting();\n }\n\n /** Open the \"past meetings\" history view and load the list. */\n public OpenHistory(): void {\n this.Phase = 'history';\n this.OpenHistoryRoom = null;\n void this.loadHistory();\n }\n\n /** @deprecated Use {@link OpenHistory}. */\n public openHistory(): void {\n return this.OpenHistory();\n }\n\n /** Back to the Meet home. */\n public BackToLanding(): void {\n this.Phase = 'landing';\n }\n\n /** @deprecated Use {@link BackToLanding}. */\n public backToLanding(): void {\n return this.BackToLanding();\n }\n\n /** Joins an existing room by its LiveKit room name (the bridge `ExternalConnectionID`). */\n public JoinExistingRoom(roomName: string): void {\n const name = roomName.trim();\n if (!name) {\n return;\n }\n this.RoomMode = 'join';\n this.JoinRoomName = name;\n this.Phase = 'live';\n }\n\n /** @deprecated Use {@link JoinExistingRoom}. */\n public joinExistingRoom(roomName: string): void {\n return this.JoinExistingRoom(roomName);\n }\n\n /** Loads currently-active rooms: distinct rooms that have a Connected/Connecting agent bridge. */\n private async loadActiveRooms(): Promise<void> {\n this.LoadingActive = true;\n this.ActiveRooms = [];\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const res = await rv.RunView<{ ExternalConnectionID: string; Agent: string }>(\n {\n EntityName: 'MJ: AI Agent Session Bridges',\n ExtraFilter: `Status IN ('Connected','Connecting') AND ExternalConnectionID IS NOT NULL`,\n Fields: ['ExternalConnectionID', 'Agent'],\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 500,\n ResultType: 'simple',\n },\n this.ProviderToUse.CurrentUser,\n );\n if (res.Success) {\n const byRoom = new Map<string, { count: number; agents: Set<string> }>();\n for (const r of res.Results) {\n const room = String(r['ExternalConnectionID'] ?? '');\n if (!room) {\n continue;\n }\n const entry = byRoom.get(room) ?? { count: 0, agents: new Set<string>() };\n entry.count += 1;\n if (r['Agent']) {\n entry.agents.add(String(r['Agent']));\n }\n byRoom.set(room, entry);\n }\n this.ActiveRooms = [...byRoom.entries()].map(([room, info]) => ({\n RoomName: room,\n Label: info.agents.size ? [...info.agents].join(', ') : room,\n AgentCount: info.count,\n }));\n }\n } finally {\n this.LoadingActive = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Loads past meetings: the `Meeting Room` conversations the bridge recorded, newest first. */\n private async loadHistory(): Promise<void> {\n this.LoadingHistory = true;\n this.HistoryRooms = [];\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const res = await rv.RunView<{ ID: string; Name: string; __mj_UpdatedAt: string }>(\n {\n EntityName: 'MJ: Conversations',\n ExtraFilter: `Type='Meeting Room'`,\n Fields: ['ID', 'Name', '__mj_UpdatedAt'],\n OrderBy: '__mj_UpdatedAt DESC',\n MaxRows: 200,\n ResultType: 'simple',\n },\n this.ProviderToUse.CurrentUser,\n );\n if (res.Success) {\n this.HistoryRooms = res.Results.map((r) => ({\n ConversationID: String(r['ID']),\n Name: String(r['Name'] ?? 'Meeting'),\n At: new Date(String(r['__mj_UpdatedAt'] ?? '')),\n }));\n }\n } finally {\n this.LoadingHistory = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Opens a past meeting's transcript (drill-in). */\n public async OpenTranscript(room: { ConversationID: string; Name: string }): Promise<void> {\n this.OpenHistoryRoom = room;\n this.HistoryTranscript = [];\n this.LoadingTranscript = true;\n this.cdr.detectChanges();\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const res = await rv.RunView<{ Role: string; Message: string; AgentID: string; Error: string }>(\n {\n EntityName: 'MJ: Conversation Details',\n ExtraFilter: `ConversationID='${room.ConversationID.replace(/'/g, \"''\")}'`,\n Fields: ['Role', 'Message', 'AgentID', 'Error', '__mj_CreatedAt'],\n OrderBy: '__mj_CreatedAt ASC',\n MaxRows: 5000,\n ResultType: 'simple',\n },\n this.ProviderToUse.CurrentUser,\n );\n if (res.Success) {\n this.HistoryTranscript = res.Results.map((d) => {\n const role = String(d['Role'] ?? 'User');\n if (role === 'Error') {\n return { Kind: 'error' as const, Speaker: 'Error', Message: String(d['Error'] ?? d['Message'] ?? '') };\n }\n if (role === 'AI') {\n const agentId = String(d['AgentID'] ?? '').toLowerCase();\n const name = AIEngineBase.Instance.Agents.find((a) => a.ID.toLowerCase() === agentId)?.Name ?? 'Agent';\n return { Kind: 'agent' as const, Speaker: name, Message: String(d['Message'] ?? '') };\n }\n return { Kind: 'human' as const, Speaker: 'Participant', Message: String(d['Message'] ?? '') };\n });\n }\n } finally {\n this.LoadingTranscript = false;\n this.cdr.detectChanges();\n }\n }\n\n /** @deprecated Use {@link OpenTranscript}. */\n public async openTranscript(room: { ConversationID: string; Name: string }): Promise<void> {\n return this.OpenTranscript(room);\n }\n\n /** Back to the history list from a transcript drill-in. */\n public CloseTranscript(): void {\n this.OpenHistoryRoom = null;\n }\n\n /** @deprecated Use {@link CloseTranscript}. */\n public closeTranscript(): void {\n return this.CloseTranscript();\n }\n\n /** Formats a meeting timestamp for the history list (avoids a `date` pipe / CommonModule dependency). */\n public FormatTime(d: Date): string {\n return d && !isNaN(d.getTime()) ? d.toLocaleString() : '';\n }\n\n /** @deprecated Use {@link FormatTime}. */\n public formatTime(d: Date): string {\n return this.FormatTime(d);\n }\n\n /** Picker selection handler (native select; avoids a FormsModule dependency). */\n public OnTargetChange(event: Event): void {\n this.SelectedTargetId = (event.target as HTMLSelectElement).value || null;\n }\n\n /** @deprecated Use {@link OnTargetChange}. */\n public onTargetChange(event: Event): void {\n return this.OnTargetChange(event);\n }\n\n /** Loads active Realtime models + their voices for the dev pickers (best-effort; empty on failure). */\n private async loadRealtimeModels(): Promise<void> {\n try {\n const client = new GraphQLLiveKitClient(this.ProviderToUse as unknown as GraphQLDataProvider);\n this.RealtimeModels = await client.GetRealtimeModelVoices();\n } catch {\n this.RealtimeModels = [];\n }\n this.cdr.markForCheck();\n }\n\n /** Commits the chosen target and switches to the live room. */\n public StartCall(): void {\n if (!this.SelectedTargetId) {\n return;\n }\n this.TargetAgentId = this.SelectedTargetId;\n this.TargetAgentName = this.Agents.find((a) => UUIDsEqual(a.ID, this.SelectedTargetId))?.Name ?? null;\n this.Phase = 'live';\n }\n\n /** @deprecated Use {@link StartCall}. */\n public startCall(): void {\n return this.StartCall();\n }\n\n /** Opens the invite-people dialog for the given room. */\n public OpenInvite(roomName: string): void {\n this.InviteRoomName = roomName || null;\n this.UserSearch = '';\n this.UserResults = [];\n this.SelectedInvitees = [];\n this.Searched = false;\n this.InviteMessage = null;\n this.ShowInvite = true;\n }\n\n /** @deprecated Use {@link OpenInvite}. */\n public openInvite(roomName: string): void {\n return this.OpenInvite(roomName);\n }\n\n /** Searches `MJ: Users` by name/email, excluding the current user + already-selected people. */\n public async SearchUsers(): Promise<void> {\n const term = this.UserSearch.trim();\n if (!term) {\n return;\n }\n this.Searching = true;\n this.cdr.markForCheck();\n try {\n const p = this.ProviderToUse;\n const escaped = term.replace(/'/g, \"''\");\n const excluded = [p.CurrentUser?.ID, ...this.SelectedInvitees.map((u) => u.ID)].filter(Boolean) as string[];\n const excludeFilter = excluded.length ? ` AND ID NOT IN (${excluded.map((id) => `'${id}'`).join(',')})` : '';\n const result = await RunView.FromMetadataProvider(p).RunView<{ ID: string; Name: string; Email: string }>({\n EntityName: 'Users',\n ExtraFilter: `IsActive = 1 AND (Name LIKE '%${escaped}%' OR Email LIKE '%${escaped}%')${excludeFilter}`,\n OrderBy: 'Name',\n Fields: ['ID', 'Name', 'Email'],\n MaxRows: 20,\n ResultType: 'simple',\n });\n this.UserResults = (result.Success ? result.Results : []).map((u) => ({\n ID: u.ID,\n Name: u.Name || u.Email || '(unnamed)',\n Email: u.Email ?? null,\n }));\n } finally {\n this.Searching = false;\n this.Searched = true;\n this.cdr.markForCheck();\n }\n }\n\n /** @deprecated Use {@link SearchUsers}. */\n public async searchUsers(): Promise<void> {\n return this.SearchUsers();\n }\n\n /** Adds a person to the invite list (and out of the results). */\n public AddInvitee(user: InviteeChoice): void {\n if (!this.SelectedInvitees.some((u) => UUIDsEqual(u.ID, user.ID))) {\n this.SelectedInvitees = [...this.SelectedInvitees, user];\n }\n this.UserResults = this.UserResults.filter((u) => !UUIDsEqual(u.ID, user.ID));\n }\n\n /** @deprecated Use {@link AddInvitee}. */\n public addInvitee(user: InviteeChoice): void {\n return this.AddInvitee(user);\n }\n\n /** Removes a person from the invite list. */\n public RemoveInvitee(userId: string): void {\n this.SelectedInvitees = this.SelectedInvitees.filter((u) => !UUIDsEqual(u.ID, userId));\n }\n\n /** @deprecated Use {@link RemoveInvitee}. */\n public removeInvitee(userId: string): void {\n return this.RemoveInvitee(userId);\n }\n\n /** Sends the invites — the server notifies each person (in-app + Comms when configured). */\n public async SendInvites(): Promise<void> {\n if (!this.SelectedInvitees.length || !this.InviteRoomName || this.Inviting) {\n return;\n }\n this.Inviting = true;\n this.InviteMessage = null;\n this.cdr.markForCheck();\n try {\n const client = new GraphQLLiveKitClient(this.ProviderToUse as unknown as GraphQLDataProvider);\n const ok = await client.InviteUsers(this.InviteRoomName, this.SelectedInvitees.map((u) => u.ID));\n if (ok) {\n this.InviteMessage = `Invited ${this.SelectedInvitees.length} ${this.SelectedInvitees.length === 1 ? 'person' : 'people'}.`;\n this.SelectedInvitees = [];\n setTimeout(() => {\n this.ShowInvite = false;\n this.cdr.markForCheck();\n }, 900);\n } else {\n this.InviteMessage = 'Could not send the invites. Please try again.';\n }\n } catch (err) {\n this.InviteMessage = err instanceof Error ? err.message : String(err);\n } finally {\n this.Inviting = false;\n this.cdr.markForCheck();\n }\n }\n\n /** @deprecated Use {@link SendInvites}. */\n public async sendInvites(): Promise<void> {\n return this.SendInvites();\n }\n\n ngAfterViewInit(): void {\n // Clear the shell loading screen even if resolution is slow — the picker/room/message shows its own\n // state, so the loader must not hang on direct URL navigation.\n this.NotifyLoadComplete();\n }\n\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Live Room';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-video';\n }\n}\n"]}
1
+ {"version":3,"file":"livekit-room-resource.component.js","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/livekit-room-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, AfterViewInit, ChangeDetectorRef, inject } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { RunView } from '@memberjunction/core';\nimport { GraphQLLiveKitClient, GraphQLDataProvider, RealtimeModelVoices, RealtimeVoiceOption } from '@memberjunction/graphql-dataprovider';\nimport { UserHoldsAuthorization, REALTIME_ADVANCED_SESSION_CONTROLS } from '@memberjunction/ng-conversations';\nimport {\n ParseTurnAddressing,\n ParseTurnMode,\n TURN_ADDRESSING_OPTIONS,\n TURN_MODE_OPTIONS,\n type TurnAddressingChoice,\n type TurnModeChoice,\n} from '@memberjunction/ng-mj-livekit-room';\n\n/** A selectable target agent for the pre-join picker. */\ninterface TargetAgentChoice {\n ID: string;\n Name: string;\n Description: string | null;\n}\n\n/** A user shown in the \"Invite people\" search/selection. */\ninterface InviteeChoice {\n ID: string;\n Name: string;\n Email: string | null;\n}\n\n/**\n * LiveKit Room Resource — hosts the MJ-native LiveKit room (`mj-livekit-agent-room`) as an Explorer tab\n * (the **Meet** app's \"Live Room\").\n *\n * Flow: resolve the Realtime **co-agent** (voice front-end), then show a **pre-join picker** to choose\n * the **target** agent you're \"calling\" (the co-agent voices it via `invoke-target-agent` — without a\n * target it sits idle). \"Start call\" joins the room. An explicit `ResourceRecordID` skips the picker and\n * calls that agent directly.\n *\n * Registered via `@RegisterClass(BaseResourceComponent, 'LiveKitRoomResource')`.\n */\n@RegisterClass(BaseResourceComponent, 'LiveKitRoomResource')\n@Component({\n standalone: false,\n selector: 'mj-livekit-room-resource',\n template: `\n @switch (phase) {\n @case ('live') {\n <mj-livekit-agent-room\n class=\"mj-livekit-room-resource\"\n [Mode]=\"roomMode\"\n [RoomName]=\"joinRoomName\"\n [AgentID]=\"agentId\"\n [TargetAgentID]=\"targetAgentId\"\n [AgentName]=\"targetAgentName\"\n [AvailableAgents]=\"agents\"\n [RealtimeModelID]=\"selectedModelId\"\n [RealtimeVoice]=\"selectedVoice\"\n [CanPickModelVoice]=\"canPickModelVoice\"\n [AvailableModels]=\"realtimeModels\"\n [TurnMode]=\"SelectedTurnMode\"\n [TurnAddressing]=\"SelectedTurnAddressing\"\n [Provider]=\"ProviderToUse\"\n [ShowAgentState]=\"true\"\n [ShowWhiteboard]=\"true\"\n [EnableLayoutSwitcher]=\"true\"\n [EnablePinning]=\"true\"\n (Connected)=\"NotifyLoadComplete()\"\n (Disconnected)=\"onRoomLeft()\"\n (ErrorOccurred)=\"NotifyLoadComplete()\"\n (InvitePeopleRequested)=\"openInvite($event)\"\n ></mj-livekit-agent-room>\n }\n @case ('picking') {\n <div class=\"mj-lk-prejoin\">\n <div class=\"mj-lk-prejoin__card\">\n <button type=\"button\" class=\"mj-lk-back\" (click)=\"backToLanding()\"><i class=\"fa-solid fa-arrow-left\"></i> Back</button>\n <div class=\"mj-lk-prejoin__icon\"><i class=\"fa-solid fa-video\"></i></div>\n <h2 class=\"mj-lk-prejoin__title\">Start a call</h2>\n <p class=\"mj-lk-prejoin__subtitle\">\n Choose the agent you want to talk to. You can add more agents (and invite people) once\n you're in the room.\n </p>\n <label class=\"mj-lk-prejoin__label\" for=\"mj-lk-target\">Agent</label>\n <select id=\"mj-lk-target\" class=\"mj-input mj-lk-prejoin__select\" (change)=\"onTargetChange($event)\">\n @for (a of agents; track a.ID) {\n <option [value]=\"a.ID\" [selected]=\"UUIDsEqual(a.ID, selectedTargetId)\">{{ a.Name }}</option>\n }\n </select>\n @if (selectedDescription) {\n <p class=\"mj-lk-prejoin__desc\">{{ selectedDescription }}</p>\n }\n @if (canPickModelVoice && realtimeModels.length) {\n <label class=\"mj-lk-prejoin__label\" for=\"mj-lk-model\">Model <span class=\"mj-lk-prejoin__dev\">dev</span></label>\n <select id=\"mj-lk-model\" class=\"mj-input mj-lk-prejoin__select\" (change)=\"onModelChange($event)\">\n <option value=\"\">Default model</option>\n @for (m of realtimeModels; track m.ModelID) {\n <option [value]=\"m.ModelID\" [selected]=\"UUIDsEqual(m.ModelID, selectedModelId)\">{{ m.ModelName }}</option>\n }\n </select>\n @if (selectedModelVoices.length) {\n <label class=\"mj-lk-prejoin__label\" for=\"mj-lk-voice\">Voice <span class=\"mj-lk-prejoin__dev\">dev</span></label>\n <select id=\"mj-lk-voice\" class=\"mj-input mj-lk-prejoin__select\" (change)=\"onVoiceChange($event)\">\n <option value=\"\">Default voice</option>\n @for (v of selectedModelVoices; track v.ID) {\n <option [value]=\"v.ID\" [selected]=\"v.ID === selectedVoice\">{{ v.Name }}</option>\n }\n </select>\n }\n }\n <label class=\"mj-lk-prejoin__label\" for=\"mj-lk-turn-mode\">Turn-taking</label>\n <select id=\"mj-lk-turn-mode\" class=\"mj-input mj-lk-prejoin__select\" (change)=\"OnTurnModeChange($event)\">\n <option value=\"\">Default turn mode</option>\n @for (o of TurnModeOptions; track o.Value) {\n <option [value]=\"o.Value\" [title]=\"o.Hint\" [selected]=\"o.Value === SelectedTurnMode\">{{ o.Label }}</option>\n }\n </select>\n <select id=\"mj-lk-turn-addressing\" class=\"mj-input mj-lk-prejoin__select\" aria-label=\"How the agent decides it was addressed\"\n (change)=\"OnTurnAddressingChange($event)\">\n <option value=\"\">Default addressing</option>\n @for (o of TurnAddressingOptions; track o.Value) {\n <option [value]=\"o.Value\" [title]=\"o.Hint\" [selected]=\"o.Value === SelectedTurnAddressing\">{{ o.Label }}</option>\n }\n </select>\n <button type=\"button\" class=\"mj-lk-prejoin__start\" [disabled]=\"!selectedTargetId\" (click)=\"startCall()\">\n <i class=\"fa-solid fa-phone\"></i> Start call\n </button>\n </div>\n </div>\n }\n @case ('landing') {\n <div class=\"mj-lk-prejoin\">\n <div class=\"mj-lk-prejoin__card mj-lk-prejoin__card--wide\">\n <div class=\"mj-lk-prejoin__icon\"><i class=\"fa-solid fa-video\"></i></div>\n <h2 class=\"mj-lk-prejoin__title\">Meet</h2>\n <p class=\"mj-lk-prejoin__subtitle\">Start a live room with agents and people, join one that's in progress, or review a past meeting.</p>\n <div class=\"mj-lk-cards\">\n <button type=\"button\" class=\"mj-lk-card\" (click)=\"startNewRoom()\">\n <i class=\"fa-solid fa-circle-plus\"></i>\n <span class=\"mj-lk-card__t\">New room</span>\n <span class=\"mj-lk-card__d\">Pick an agent and start a fresh call.</span>\n </button>\n <button type=\"button\" class=\"mj-lk-card\" (click)=\"openExisting()\">\n <i class=\"fa-solid fa-door-open\"></i>\n <span class=\"mj-lk-card__t\">Join existing</span>\n <span class=\"mj-lk-card__d\">Hop into a room that's live right now.</span>\n </button>\n <button type=\"button\" class=\"mj-lk-card\" (click)=\"openHistory()\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n <span class=\"mj-lk-card__t\">History</span>\n <span class=\"mj-lk-card__d\">Read transcripts of past meetings.</span>\n </button>\n </div>\n </div>\n </div>\n }\n @case ('existing') {\n <div class=\"mj-lk-prejoin\">\n <div class=\"mj-lk-prejoin__card mj-lk-prejoin__card--wide\">\n <button type=\"button\" class=\"mj-lk-back\" (click)=\"backToLanding()\"><i class=\"fa-solid fa-arrow-left\"></i> Back</button>\n <h2 class=\"mj-lk-prejoin__title\">Join a room</h2>\n @if (loadingActive) {\n <div class=\"mj-lk-listmsg\"><i class=\"fa-solid fa-spinner fa-spin\"></i> Finding active rooms…</div>\n } @else if (activeRooms.length) {\n <div class=\"mj-lk-list\">\n @for (r of activeRooms; track r.RoomName) {\n <button type=\"button\" class=\"mj-lk-list__row\" (click)=\"joinExistingRoom(r.RoomName)\">\n <span class=\"mj-lk-list__name\"><i class=\"fa-solid fa-circle mj-lk-livedot\"></i> {{ r.Label }}</span>\n <span class=\"mj-lk-list__meta\">{{ r.AgentCount }} agent{{ r.AgentCount === 1 ? '' : 's' }} · Join</span>\n </button>\n }\n </div>\n } @else {\n <p class=\"mj-lk-prejoin__desc\">No rooms are active right now.</p>\n }\n <label class=\"mj-lk-prejoin__label\" for=\"mj-lk-room\">Or join by name</label>\n <div class=\"mj-lk-joinrow\">\n <input id=\"mj-lk-room\" class=\"mj-input mj-lk-joinrow__input\" type=\"text\" placeholder=\"Room name…\" [value]=\"manualRoomName\"\n (input)=\"manualRoomName = $any($event.target).value\" (keydown.enter)=\"joinExistingRoom(manualRoomName)\" />\n <button type=\"button\" class=\"mj-lk-prejoin__start mj-lk-joinrow__btn\" [disabled]=\"!manualRoomName.trim()\" (click)=\"joinExistingRoom(manualRoomName)\">Join</button>\n </div>\n </div>\n </div>\n }\n @case ('history') {\n <div class=\"mj-lk-prejoin\">\n <div class=\"mj-lk-prejoin__card mj-lk-prejoin__card--wide\">\n @if (!openHistoryRoom) {\n <button type=\"button\" class=\"mj-lk-back\" (click)=\"backToLanding()\"><i class=\"fa-solid fa-arrow-left\"></i> Back</button>\n <h2 class=\"mj-lk-prejoin__title\">Past meetings</h2>\n @if (loadingHistory) {\n <div class=\"mj-lk-listmsg\"><i class=\"fa-solid fa-spinner fa-spin\"></i> Loading…</div>\n } @else if (historyRooms.length) {\n <div class=\"mj-lk-list\">\n @for (h of historyRooms; track h.ConversationID) {\n <button type=\"button\" class=\"mj-lk-list__row\" (click)=\"openTranscript(h)\">\n <span class=\"mj-lk-list__name\"><i class=\"fa-solid fa-comments\"></i> {{ h.Name }}</span>\n <span class=\"mj-lk-list__meta\">{{ formatTime(h.At) }}</span>\n </button>\n }\n </div>\n } @else {\n <p class=\"mj-lk-prejoin__desc\">No past meetings yet.</p>\n }\n } @else {\n <button type=\"button\" class=\"mj-lk-back\" (click)=\"closeTranscript()\"><i class=\"fa-solid fa-arrow-left\"></i> All meetings</button>\n <h2 class=\"mj-lk-prejoin__title\">{{ openHistoryRoom.Name }}</h2>\n @if (loadingTranscript) {\n <div class=\"mj-lk-listmsg\"><i class=\"fa-solid fa-spinner fa-spin\"></i> Loading transcript…</div>\n } @else if (historyTranscript.length) {\n <div class=\"mj-lk-transcript\">\n @for (line of historyTranscript; track $index) {\n <div class=\"mj-lk-tline\" [class.mj-lk-tline--agent]=\"line.Kind === 'agent'\" [class.mj-lk-tline--error]=\"line.Kind === 'error'\">\n <span class=\"mj-lk-tline__who\">{{ line.Speaker }}</span>\n <span class=\"mj-lk-tline__msg\">{{ line.Message }}</span>\n </div>\n }\n </div>\n } @else {\n <p class=\"mj-lk-prejoin__desc\">No transcript was captured for this meeting.</p>\n }\n }\n </div>\n </div>\n }\n @case ('error') {\n <div class=\"mj-livekit-room-resource__message\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n <span>{{ resolveError }}</span>\n </div>\n }\n @default {\n <div class=\"mj-livekit-room-resource__message\">Preparing room…</div>\n }\n }\n\n @if (showInvite) {\n <mj-dialog [Visible]=\"showInvite\" (Close)=\"showInvite = false\" Title=\"Invite people\" Size=\"auto\" [Width]=\"440\">\n <div class=\"mj-lk-invite\">\n <p class=\"mj-lk-invite__hint\">They'll get an in-app notification (and an email if Comms is set up) to join this room.</p>\n <div class=\"mj-lk-invite__search\">\n <input class=\"mj-input\" type=\"text\" [value]=\"userSearch\" placeholder=\"Search people by name or email…\"\n (input)=\"userSearch = $any($event.target).value\" (keydown.enter)=\"searchUsers()\" />\n <button type=\"button\" class=\"mj-lk-invite__searchbtn\" [disabled]=\"searching\" (click)=\"searchUsers()\">\n <i class=\"fa-solid\" [class.fa-magnifying-glass]=\"!searching\" [class.fa-spinner]=\"searching\" [class.fa-spin]=\"searching\"></i>\n </button>\n </div>\n\n @if (selectedInvitees.length) {\n <div class=\"mj-lk-invite__chips\">\n @for (u of selectedInvitees; track u.ID) {\n <span class=\"mj-lk-invite__chip\">\n {{ u.Name }}\n <button type=\"button\" class=\"mj-lk-invite__chipx\" (click)=\"removeInvitee(u.ID)\"><i class=\"fa-solid fa-xmark\"></i></button>\n </span>\n }\n </div>\n }\n\n @if (userResults.length) {\n <div class=\"mj-lk-invite__results\">\n @for (u of userResults; track u.ID) {\n <button type=\"button\" class=\"mj-lk-invite__result\" (click)=\"addInvitee(u)\">\n <span class=\"mj-lk-invite__rname\">{{ u.Name }}</span>\n @if (u.Email) { <span class=\"mj-lk-invite__remail\">{{ u.Email }}</span> }\n </button>\n }\n </div>\n } @else if (searched && !searching) {\n <div class=\"mj-lk-invite__empty\">No matching people.</div>\n }\n\n @if (inviteMessage) {\n <div class=\"mj-lk-invite__msg\">{{ inviteMessage }}</div>\n }\n\n <div class=\"mj-lk-invite__actions\">\n <button type=\"button\" class=\"mj-lk-invite__send\" [disabled]=\"!selectedInvitees.length || inviting\" (click)=\"sendInvites()\">\n <i class=\"fa-solid\" [class.fa-paper-plane]=\"!inviting\" [class.fa-spinner]=\"inviting\" [class.fa-spin]=\"inviting\"></i>\n Invite {{ selectedInvitees.length || '' }}\n </button>\n <button type=\"button\" class=\"mj-lk-invite__cancel\" (click)=\"showInvite = false\">Cancel</button>\n </div>\n </div>\n </mj-dialog>\n }\n `,\n styles: [\n `\n :host {\n display: block;\n height: 100%;\n }\n .mj-livekit-room-resource {\n display: block;\n height: 100%;\n }\n .mj-livekit-room-resource__message {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n height: 100%;\n padding: 1.5rem;\n text-align: center;\n color: var(--mj-text-secondary);\n }\n .mj-livekit-room-resource__message i {\n color: var(--mj-status-warning);\n }\n .mj-lk-prejoin {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 1.5rem;\n background: var(--mj-bg-page);\n }\n .mj-lk-prejoin__card {\n width: 100%;\n max-width: 440px;\n padding: 2rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 12px);\n background: var(--mj-bg-surface);\n box-shadow: var(--mj-shadow-md, 0 4px 16px rgba(0, 0, 0, 0.12));\n text-align: center;\n }\n .mj-lk-prejoin__icon {\n font-size: 1.75rem;\n color: var(--mj-brand-primary);\n margin-bottom: 0.75rem;\n }\n .mj-lk-prejoin__title {\n margin: 0 0 0.5rem;\n color: var(--mj-text-primary);\n font-size: 1.25rem;\n }\n .mj-lk-prejoin__subtitle {\n margin: 0 0 1.5rem;\n color: var(--mj-text-secondary);\n font-size: 0.875rem;\n line-height: 1.4;\n }\n .mj-lk-prejoin__label {\n display: block;\n text-align: left;\n margin-bottom: 0.35rem;\n color: var(--mj-text-secondary);\n font-size: 0.8125rem;\n font-weight: 600;\n }\n .mj-lk-prejoin__dev {\n margin-left: 0.35rem;\n padding: 0 0.35rem;\n border-radius: 999px;\n font-size: 0.625rem;\n font-weight: 700;\n text-transform: uppercase;\n color: var(--mj-text-inverse);\n background: var(--mj-brand-primary);\n vertical-align: middle;\n }\n .mj-lk-prejoin__select {\n width: 100%;\n margin-bottom: 0.75rem;\n }\n .mj-lk-prejoin__desc {\n text-align: left;\n margin: 0 0 1.25rem;\n color: var(--mj-text-muted);\n font-size: 0.8125rem;\n line-height: 1.4;\n }\n .mj-lk-prejoin__start {\n width: 100%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 0.625rem 1rem;\n border: none;\n border-radius: var(--mj-radius-md, 8px);\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.9375rem;\n font-weight: 600;\n cursor: pointer;\n }\n .mj-lk-prejoin__start:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n .mj-lk-prejoin__start:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .mj-lk-prejoin__card--wide {\n max-width: 560px;\n text-align: left;\n }\n .mj-lk-back {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n margin-bottom: 0.75rem;\n padding: 4px 8px;\n border: none;\n background: none;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-size: 0.8125rem;\n }\n .mj-lk-back:hover { color: var(--mj-text-primary); }\n .mj-lk-cards {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 0.75rem;\n margin-top: 1.25rem;\n }\n .mj-lk-card {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n padding: 1.25rem 0.75rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 12px);\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n text-align: center;\n }\n .mj-lk-card:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-hover, var(--mj-bg-surface-card));\n }\n .mj-lk-card > i { font-size: 1.4rem; color: var(--mj-brand-primary); }\n .mj-lk-card__t { font-weight: 600; color: var(--mj-text-primary); font-size: 0.9rem; }\n .mj-lk-card__d { color: var(--mj-text-muted); font-size: 0.78rem; line-height: 1.3; }\n .mj-lk-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin: 0.5rem 0 1rem;\n max-height: 320px;\n overflow-y: auto;\n }\n .mj-lk-list__row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.75rem;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n text-align: left;\n }\n .mj-lk-list__row:hover { border-color: var(--mj-brand-primary); background: var(--mj-bg-surface-hover, var(--mj-bg-surface-card)); }\n .mj-lk-list__name { color: var(--mj-text-primary); font-size: 0.875rem; display: inline-flex; align-items: center; gap: 8px; }\n .mj-lk-list__meta { color: var(--mj-text-muted); font-size: 0.78rem; white-space: nowrap; }\n .mj-lk-livedot { color: var(--mj-status-success); font-size: 0.5rem; }\n .mj-lk-listmsg { padding: 1rem; color: var(--mj-text-secondary); text-align: center; }\n .mj-lk-joinrow { display: flex; gap: 8px; }\n .mj-lk-joinrow__input { flex: 1; }\n .mj-lk-joinrow__btn { white-space: nowrap; }\n .mj-lk-transcript {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 0.5rem;\n max-height: 60vh;\n overflow-y: auto;\n }\n .mj-lk-tline {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 8px 10px;\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n }\n .mj-lk-tline--agent { background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface)); }\n .mj-lk-tline--error { background: var(--mj-status-error-bg, color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface))); }\n .mj-lk-tline__who { font-size: 0.72rem; font-weight: 600; color: var(--mj-text-secondary); }\n .mj-lk-tline__msg { font-size: 0.875rem; color: var(--mj-text-primary); }\n .mj-lk-invite {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n min-width: 360px;\n padding: 0.25rem;\n }\n .mj-lk-invite__hint {\n margin: 0;\n color: var(--mj-text-muted);\n font-size: 0.8125rem;\n }\n .mj-lk-invite__search {\n display: flex;\n gap: 0.5rem;\n }\n .mj-lk-invite__search .mj-input {\n flex: 1;\n }\n .mj-lk-invite__searchbtn,\n .mj-lk-invite__send,\n .mj-lk-invite__cancel {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.4rem;\n padding: 0.5rem 0.85rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n cursor: pointer;\n font-size: 0.875rem;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n }\n .mj-lk-invite__send {\n border: none;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n .mj-lk-invite__send:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .mj-lk-invite__chips {\n display: flex;\n flex-wrap: wrap;\n gap: 0.4rem;\n }\n .mj-lk-invite__chip {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.2rem 0.5rem;\n border-radius: 999px;\n font-size: 0.8125rem;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n }\n .mj-lk-invite__chipx {\n border: none;\n background: transparent;\n cursor: pointer;\n color: var(--mj-text-muted);\n padding: 0;\n }\n .mj-lk-invite__results {\n max-height: 220px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n }\n .mj-lk-invite__result {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 0.1rem;\n width: 100%;\n padding: 0.5rem 0.75rem;\n border: none;\n border-bottom: 1px solid var(--mj-border-subtle, var(--mj-border-default));\n background: transparent;\n cursor: pointer;\n text-align: left;\n }\n .mj-lk-invite__result:hover {\n background: var(--mj-bg-surface-hover);\n }\n .mj-lk-invite__rname {\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n }\n .mj-lk-invite__remail {\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n }\n .mj-lk-invite__empty {\n color: var(--mj-text-muted);\n font-size: 0.8125rem;\n padding: 0.25rem;\n }\n .mj-lk-invite__msg {\n color: var(--mj-text-secondary);\n font-size: 0.8125rem;\n }\n .mj-lk-invite__actions {\n display: flex;\n gap: 0.5rem;\n margin-top: 0.25rem;\n }\n `,\n ],\n})\nexport class LiveKitRoomResource extends BaseResourceComponent implements OnInit, OnDestroy, AfterViewInit {\n /** Render phase: spinner while resolving → landing (new/existing/history) → picker/existing/history → live room. */\n public Phase: 'loading' | 'landing' | 'picking' | 'existing' | 'history' | 'live' | 'error' = 'loading';\n\n /** @deprecated Use {@link Phase}. */\n public get phase(): 'loading' | 'landing' | 'picking' | 'existing' | 'history' | 'live' | 'error' {\n return this.Phase;\n }\n /** @deprecated Use {@link Phase}. */\n public set phase(value: 'loading' | 'landing' | 'picking' | 'existing' | 'history' | 'live' | 'error') {\n this.Phase = value;\n }\n\n // ── \"Join existing\" state ─────────────────────────────────────────────────────────\n /** Currently-active rooms (a distinct `ExternalConnectionID` with ≥1 connected agent bridge). */\n public ActiveRooms: { RoomName: string; Label: string; AgentCount: number }[] = [];\n\n /** @deprecated Use {@link ActiveRooms}. */\n public get activeRooms(): { RoomName: string; Label: string; AgentCount: number }[] {\n return this.ActiveRooms;\n }\n /** @deprecated Use {@link ActiveRooms}. */\n public set activeRooms(value: { RoomName: string; Label: string; AgentCount: number }[]) {\n this.ActiveRooms = value;\n }\n /** True while loading the active-rooms list. */\n public LoadingActive = false;\n\n /** @deprecated Use {@link LoadingActive}. */\n public get loadingActive() {\n return this.LoadingActive;\n }\n /** @deprecated Use {@link LoadingActive}. */\n public set loadingActive(value) {\n this.LoadingActive = value;\n }\n /** Free-text room name to join directly (the \"join by name/code\" path). */\n public ManualRoomName = '';\n\n /** @deprecated Use {@link ManualRoomName}. */\n public get manualRoomName() {\n return this.ManualRoomName;\n }\n /** @deprecated Use {@link ManualRoomName}. */\n public set manualRoomName(value) {\n this.ManualRoomName = value;\n }\n\n // ── \"History\" (past meetings) state ───────────────────────────────────────────────\n /** Past meeting rooms (the `MJ: Conversations` of Type='Meeting Room' the bridge recorded). */\n public HistoryRooms: { ConversationID: string; Name: string; At: Date }[] = [];\n\n /** @deprecated Use {@link HistoryRooms}. */\n public get historyRooms(): { ConversationID: string; Name: string; At: Date }[] {\n return this.HistoryRooms;\n }\n /** @deprecated Use {@link HistoryRooms}. */\n public set historyRooms(value: { ConversationID: string; Name: string; At: Date }[]) {\n this.HistoryRooms = value;\n }\n /** True while loading the history list. */\n public LoadingHistory = false;\n\n /** @deprecated Use {@link LoadingHistory}. */\n public get loadingHistory() {\n return this.LoadingHistory;\n }\n /** @deprecated Use {@link LoadingHistory}. */\n public set loadingHistory(value) {\n this.LoadingHistory = value;\n }\n /** The history room whose transcript is open (drill-in), or null for the list. */\n public OpenHistoryRoom: { ConversationID: string; Name: string } | null = null;\n\n /** @deprecated Use {@link OpenHistoryRoom}. */\n public get openHistoryRoom(): { ConversationID: string; Name: string } | null {\n return this.OpenHistoryRoom;\n }\n /** @deprecated Use {@link OpenHistoryRoom}. */\n public set openHistoryRoom(value: { ConversationID: string; Name: string } | null) {\n this.OpenHistoryRoom = value;\n }\n /** The opened room's transcript lines. */\n public HistoryTranscript: { Kind: 'agent' | 'human' | 'error'; Speaker: string; Message: string }[] = [];\n\n /** @deprecated Use {@link HistoryTranscript}. */\n public get historyTranscript(): { Kind: 'agent' | 'human' | 'error'; Speaker: string; Message: string }[] {\n return this.HistoryTranscript;\n }\n /** @deprecated Use {@link HistoryTranscript}. */\n public set historyTranscript(value: { Kind: 'agent' | 'human' | 'error'; Speaker: string; Message: string }[]) {\n this.HistoryTranscript = value;\n }\n /** True while loading a room's transcript. */\n public LoadingTranscript = false;\n\n /** @deprecated Use {@link LoadingTranscript}. */\n public get loadingTranscript() {\n return this.LoadingTranscript;\n }\n /** @deprecated Use {@link LoadingTranscript}. */\n public set loadingTranscript(value) {\n this.LoadingTranscript = value;\n }\n\n /** `'agent'` to start/voice an agent (the default), or `'join'` when opened from an invite link. */\n public RoomMode: 'agent' | 'join' = 'agent';\n\n /** @deprecated Use {@link RoomMode}. */\n public get roomMode(): 'agent' | 'join' {\n return this.RoomMode;\n }\n /** @deprecated Use {@link RoomMode}. */\n public set roomMode(value: 'agent' | 'join') {\n this.RoomMode = value;\n }\n\n /** The room to JOIN when opened via an invite link (`?room=…`); null in agent mode. */\n public JoinRoomName: string | null = null;\n\n /** @deprecated Use {@link JoinRoomName}. */\n public get joinRoomName(): string | null {\n return this.JoinRoomName;\n }\n /** @deprecated Use {@link JoinRoomName}. */\n public set joinRoomName(value: string | null) {\n this.JoinRoomName = value;\n }\n\n /** The Realtime co-agent (voice front-end) id — the resolved default Realtime-type agent. */\n public AgentId: string | null = null;\n\n /** @deprecated Use {@link AgentId}. */\n public get agentId(): string | null {\n return this.AgentId;\n }\n /** @deprecated Use {@link AgentId}. */\n public set agentId(value: string | null) {\n this.AgentId = value;\n }\n\n /** The TARGET agent the co-agent voices (the one being \"called\"); the bot is named after it. */\n public TargetAgentId: string | null = null;\n\n /** @deprecated Use {@link TargetAgentId}. */\n public get targetAgentId(): string | null {\n return this.TargetAgentId;\n }\n /** @deprecated Use {@link TargetAgentId}. */\n public set targetAgentId(value: string | null) {\n this.TargetAgentId = value;\n }\n\n /** The target agent's display name — used as the bot name + addressing word (\"Sage, …\"). */\n public TargetAgentName: string | null = null;\n\n /** @deprecated Use {@link TargetAgentName}. */\n public get targetAgentName(): string | null {\n return this.TargetAgentName;\n }\n /** @deprecated Use {@link TargetAgentName}. */\n public set targetAgentName(value: string | null) {\n this.TargetAgentName = value;\n }\n\n /** The agents offered in the pre-join picker (active, excluding the Realtime co-agent itself). */\n public Agents: TargetAgentChoice[] = [];\n\n /** @deprecated Use {@link Agents}. */\n public get agents(): TargetAgentChoice[] {\n return this.Agents;\n }\n /** @deprecated Use {@link Agents}. */\n public set agents(value: TargetAgentChoice[]) {\n this.Agents = value;\n }\n\n /** The currently-selected target in the picker (defaults to \"Sage\" when present). */\n public SelectedTargetId: string | null = null;\n\n /** @deprecated Use {@link SelectedTargetId}. */\n public get selectedTargetId(): string | null {\n return this.SelectedTargetId;\n }\n /** @deprecated Use {@link SelectedTargetId}. */\n public set selectedTargetId(value: string | null) {\n this.SelectedTargetId = value;\n }\n\n // ── Dev model/voice override (gated by the `Realtime: Advanced Session Controls` authorization) ──────\n /** Whether the current user may override the realtime model/voice (drives the dev pickers). */\n public CanPickModelVoice = false;\n\n /** @deprecated Use {@link CanPickModelVoice}. */\n public get canPickModelVoice() {\n return this.CanPickModelVoice;\n }\n /** @deprecated Use {@link CanPickModelVoice}. */\n public set canPickModelVoice(value) {\n this.CanPickModelVoice = value;\n }\n /** Active Realtime models + their voices (loaded once when the user can override). */\n public RealtimeModels: RealtimeModelVoices[] = [];\n\n /** @deprecated Use {@link RealtimeModels}. */\n public get realtimeModels(): RealtimeModelVoices[] {\n return this.RealtimeModels;\n }\n /** @deprecated Use {@link RealtimeModels}. */\n public set realtimeModels(value: RealtimeModelVoices[]) {\n this.RealtimeModels = value;\n }\n /** The MODEL override chosen for the FIRST agent in the pre-join picker (null = default). */\n public SelectedModelId: string | null = null;\n\n /** @deprecated Use {@link SelectedModelId}. */\n public get selectedModelId(): string | null {\n return this.SelectedModelId;\n }\n /** @deprecated Use {@link SelectedModelId}. */\n public set selectedModelId(value: string | null) {\n this.SelectedModelId = value;\n }\n /** The VOICE override chosen for the FIRST agent in the pre-join picker (null = default). */\n public SelectedVoice: string | null = null;\n\n /** @deprecated Use {@link SelectedVoice}. */\n public get selectedVoice(): string | null {\n return this.SelectedVoice;\n }\n /** @deprecated Use {@link SelectedVoice}. */\n public set selectedVoice(value: string | null) {\n this.SelectedVoice = value;\n }\n\n /** Voices for the model chosen in the pre-join picker. */\n public get SelectedModelVoices(): RealtimeVoiceOption[] {\n return this.RealtimeModels.find((m) => UUIDsEqual(m.ModelID, this.SelectedModelId))?.Voices ?? [];\n }\n\n /** @deprecated Use {@link SelectedModelVoices}. */\n public get selectedModelVoices(): RealtimeVoiceOption[] {\n return this.SelectedModelVoices;\n }\n\n /** Records the pre-join MODEL choice; clears the voice so it can't outlive a model switch. */\n public OnModelChange(event: Event): void {\n this.SelectedModelId = (event.target as HTMLSelectElement).value || null;\n this.SelectedVoice = null;\n }\n\n /** @deprecated Use {@link OnModelChange}. */\n public onModelChange(event: Event): void {\n return this.OnModelChange(event);\n }\n\n /** Records the pre-join VOICE choice. */\n public OnVoiceChange(event: Event): void {\n this.SelectedVoice = (event.target as HTMLSelectElement).value || null;\n }\n\n /** @deprecated Use {@link OnVoiceChange}. */\n public onVoiceChange(event: Event): void {\n return this.OnVoiceChange(event);\n }\n\n // ── Turn-taking choices for the FIRST agent (agents added in-room pick their own) ─────────────────────\n /** The turn-mode choices. */\n public readonly TurnModeOptions = TURN_MODE_OPTIONS;\n /** The addressing choices. */\n public readonly TurnAddressingOptions = TURN_ADDRESSING_OPTIONS;\n /** The turn mode chosen for the first agent (null = the room's default). */\n public SelectedTurnMode: TurnModeChoice | null = null;\n /** The addressing mode chosen for the first agent (null = Auto). */\n public SelectedTurnAddressing: TurnAddressingChoice | null = null;\n\n /** Records the pre-join turn-mode choice. */\n public OnTurnModeChange(event: Event): void {\n this.SelectedTurnMode = ParseTurnMode((event.target as HTMLSelectElement).value);\n }\n\n /** Records the pre-join addressing choice. */\n public OnTurnAddressingChange(event: Event): void {\n this.SelectedTurnAddressing = ParseTurnAddressing((event.target as HTMLSelectElement).value);\n }\n\n /** Exposed for template use — platform-safe UUID equality (SQL upper vs PG lower). */\n public UUIDsEqual = UUIDsEqual;\n\n /** Set when no co-agent could be resolved — shown instead of the room. */\n public ResolveError: string | null = null;\n\n /** @deprecated Use {@link ResolveError}. */\n public get resolveError(): string | null {\n return this.ResolveError;\n }\n /** @deprecated Use {@link ResolveError}. */\n public set resolveError(value: string | null) {\n this.ResolveError = value;\n }\n\n // ── \"Invite people\" dialog state ─────────────────────────────────────────────────\n /** Whether the invite-people dialog is open. */\n public ShowInvite = false;\n\n /** @deprecated Use {@link ShowInvite}. */\n public get showInvite() {\n return this.ShowInvite;\n }\n /** @deprecated Use {@link ShowInvite}. */\n public set showInvite(value) {\n this.ShowInvite = value;\n }\n /** The room the invite targets (the live room name). */\n public InviteRoomName: string | null = null;\n\n /** @deprecated Use {@link InviteRoomName}. */\n public get inviteRoomName(): string | null {\n return this.InviteRoomName;\n }\n /** @deprecated Use {@link InviteRoomName}. */\n public set inviteRoomName(value: string | null) {\n this.InviteRoomName = value;\n }\n /** Current search text in the people search box. */\n public UserSearch = '';\n\n /** @deprecated Use {@link UserSearch}. */\n public get userSearch() {\n return this.UserSearch;\n }\n /** @deprecated Use {@link UserSearch}. */\n public set userSearch(value) {\n this.UserSearch = value;\n }\n /** People matching the last search (minus already-selected + the current user). */\n public UserResults: InviteeChoice[] = [];\n\n /** @deprecated Use {@link UserResults}. */\n public get userResults(): InviteeChoice[] {\n return this.UserResults;\n }\n /** @deprecated Use {@link UserResults}. */\n public set userResults(value: InviteeChoice[]) {\n this.UserResults = value;\n }\n /** People chosen to invite. */\n public SelectedInvitees: InviteeChoice[] = [];\n\n /** @deprecated Use {@link SelectedInvitees}. */\n public get selectedInvitees(): InviteeChoice[] {\n return this.SelectedInvitees;\n }\n /** @deprecated Use {@link SelectedInvitees}. */\n public set selectedInvitees(value: InviteeChoice[]) {\n this.SelectedInvitees = value;\n }\n /** True while a people search is running. */\n public Searching = false;\n\n /** @deprecated Use {@link Searching}. */\n public get searching() {\n return this.Searching;\n }\n /** @deprecated Use {@link Searching}. */\n public set searching(value) {\n this.Searching = value;\n }\n /** True once a search has run (drives the \"no matches\" empty state). */\n public Searched = false;\n\n /** @deprecated Use {@link Searched}. */\n public get searched() {\n return this.Searched;\n }\n /** @deprecated Use {@link Searched}. */\n public set searched(value) {\n this.Searched = value;\n }\n /** True while invites are being sent. */\n public Inviting = false;\n\n /** @deprecated Use {@link Inviting}. */\n public get inviting() {\n return this.Inviting;\n }\n /** @deprecated Use {@link Inviting}. */\n public set inviting(value) {\n this.Inviting = value;\n }\n /** Result/status message under the dialog. */\n public InviteMessage: string | null = null;\n\n /** @deprecated Use {@link InviteMessage}. */\n public get inviteMessage(): string | null {\n return this.InviteMessage;\n }\n /** @deprecated Use {@link InviteMessage}. */\n public set inviteMessage(value: string | null) {\n this.InviteMessage = value;\n }\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n /** Description of the selected target, shown under the picker. */\n public get SelectedDescription(): string | null {\n return this.Agents.find((a) => UUIDsEqual(a.ID, this.SelectedTargetId))?.Description ?? null;\n }\n\n /** @deprecated Use {@link SelectedDescription}. */\n public get selectedDescription(): string | null {\n return this.SelectedDescription;\n }\n\n override ngOnInit(): void {\n super.ngOnInit();\n this.resolve();\n }\n\n /**\n * Resolves the co-agent + target choices. Synchronous when the AI engine is already loaded (the common\n * case — it bootstraps at startup) so the first render is settled (avoids NG0100 from an async branch\n * flip under the app's frequent change-detection); a cold engine takes the async path and flushes.\n */\n private resolve(): void {\n // Invite link (?room=…): join that existing room directly — no agent resolution / picker needed.\n const invitedRoom = this.GetQueryParams()?.['room']?.trim();\n if (invitedRoom) {\n this.RoomMode = 'join';\n this.JoinRoomName = invitedRoom;\n this.Phase = 'live';\n this.NotifyLoadComplete();\n return;\n }\n\n if (AIEngineBase.Instance.Loaded) {\n this.applyResolution();\n return;\n }\n void AIEngineBase.Instance.Config(false, undefined, this.ProviderToUse).then(() => {\n this.applyResolution();\n this.cdr.detectChanges();\n });\n }\n\n /** Resolves the co-agent, builds the target list, and chooses the next phase (live for an explicit record, else picker). */\n private applyResolution(): void {\n const realtimeType = AIEngineBase.Instance.AgentTypes.find((t) => t.Name?.trim().toLowerCase() === 'realtime');\n const coAgent = realtimeType\n ? AIEngineBase.Instance.Agents.find((a) => a.Status === 'Active' && UUIDsEqual(a.TypeID, realtimeType.ID))\n : undefined;\n\n if (!coAgent) {\n this.ResolveError =\n 'No active Realtime agent is configured, so the Live Room has no voice to bring in. ' +\n 'Create a Realtime-type AI Agent (e.g. \"Realtime Co-Agent\") and try again.';\n this.Phase = 'error';\n this.NotifyLoadComplete();\n return;\n }\n this.AgentId = coAgent.ID;\n\n // Dev model/voice override: gate on the `Realtime: Advanced Session Controls` authorization and, when\n // held, load the active models + their voices for the pickers (here and the in-room add-agent control).\n this.CanPickModelVoice = UserHoldsAuthorization(\n this.ProviderToUse?.CurrentUser, REALTIME_ADVANCED_SESSION_CONTROLS, this.ProviderToUse,\n );\n if (this.CanPickModelVoice) {\n void this.loadRealtimeModels();\n }\n\n // Target candidates: every active agent EXCEPT the Realtime co-agents (they voice a target, not themselves).\n this.Agents = AIEngineBase.Instance.Agents\n .filter((a) => a.Status === 'Active' && (!realtimeType || !UUIDsEqual(a.TypeID, realtimeType.ID)))\n .map((a) => ({ ID: a.ID, Name: a.Name ?? '(unnamed)', Description: a.Description ?? null }))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n\n // An explicit record id (deep link to a specific agent) skips the picker and calls it directly.\n const explicit = this.Data?.ResourceRecordID ? String(this.Data.ResourceRecordID) : null;\n if (explicit) {\n this.SelectedTargetId = explicit;\n this.StartCall();\n return;\n }\n\n // Default the picker to the general assistant \"Sage\" when present, else the first candidate.\n this.SelectedTargetId =\n this.Agents.find((a) => a.Name.trim().toLowerCase() === 'sage')?.ID ?? this.Agents[0]?.ID ?? null;\n // Land on the Meet home (start new / join existing / history) rather than jumping straight into the picker.\n this.Phase = 'landing';\n this.NotifyLoadComplete();\n }\n\n // ── Meet landing navigation ─────────────────────────────────────────────────────────\n\n /**\n * The room disconnected (the user clicked **Leave** or **End meeting**, or the room dropped). Return to the\n * Meet landing so they can start a new room, join another, or review history — rather than being stranded\n * on a dead room. Resets the join state so the next \"New room\" / \"Join existing\" starts clean.\n */\n public OnRoomLeft(): void {\n this.RoomMode = 'agent';\n this.JoinRoomName = null;\n this.Phase = 'landing';\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnRoomLeft}. */\n public onRoomLeft(): void {\n return this.OnRoomLeft();\n }\n\n /** Go to the \"start a new room\" picker. */\n public StartNewRoom(): void {\n this.Phase = 'picking';\n }\n\n /** @deprecated Use {@link StartNewRoom}. */\n public startNewRoom(): void {\n return this.StartNewRoom();\n }\n\n /** Open the \"join existing room\" view and load the active rooms. */\n public OpenExisting(): void {\n this.Phase = 'existing';\n void this.loadActiveRooms();\n }\n\n /** @deprecated Use {@link OpenExisting}. */\n public openExisting(): void {\n return this.OpenExisting();\n }\n\n /** Open the \"past meetings\" history view and load the list. */\n public OpenHistory(): void {\n this.Phase = 'history';\n this.OpenHistoryRoom = null;\n void this.loadHistory();\n }\n\n /** @deprecated Use {@link OpenHistory}. */\n public openHistory(): void {\n return this.OpenHistory();\n }\n\n /** Back to the Meet home. */\n public BackToLanding(): void {\n this.Phase = 'landing';\n }\n\n /** @deprecated Use {@link BackToLanding}. */\n public backToLanding(): void {\n return this.BackToLanding();\n }\n\n /** Joins an existing room by its LiveKit room name (the bridge `ExternalConnectionID`). */\n public JoinExistingRoom(roomName: string): void {\n const name = roomName.trim();\n if (!name) {\n return;\n }\n this.RoomMode = 'join';\n this.JoinRoomName = name;\n this.Phase = 'live';\n }\n\n /** @deprecated Use {@link JoinExistingRoom}. */\n public joinExistingRoom(roomName: string): void {\n return this.JoinExistingRoom(roomName);\n }\n\n /** Loads currently-active rooms: distinct rooms that have a Connected/Connecting agent bridge. */\n private async loadActiveRooms(): Promise<void> {\n this.LoadingActive = true;\n this.ActiveRooms = [];\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const res = await rv.RunView<{ ExternalConnectionID: string; Agent: string }>(\n {\n EntityName: 'MJ: AI Agent Session Bridges',\n ExtraFilter: `Status IN ('Connected','Connecting') AND ExternalConnectionID IS NOT NULL`,\n Fields: ['ExternalConnectionID', 'Agent'],\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 500,\n ResultType: 'simple',\n },\n this.ProviderToUse.CurrentUser,\n );\n if (res.Success) {\n const byRoom = new Map<string, { count: number; agents: Set<string> }>();\n for (const r of res.Results) {\n const room = String(r['ExternalConnectionID'] ?? '');\n if (!room) {\n continue;\n }\n const entry = byRoom.get(room) ?? { count: 0, agents: new Set<string>() };\n entry.count += 1;\n if (r['Agent']) {\n entry.agents.add(String(r['Agent']));\n }\n byRoom.set(room, entry);\n }\n this.ActiveRooms = [...byRoom.entries()].map(([room, info]) => ({\n RoomName: room,\n Label: info.agents.size ? [...info.agents].join(', ') : room,\n AgentCount: info.count,\n }));\n }\n } finally {\n this.LoadingActive = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Loads past meetings: the `Meeting Room` conversations the bridge recorded, newest first. */\n private async loadHistory(): Promise<void> {\n this.LoadingHistory = true;\n this.HistoryRooms = [];\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const res = await rv.RunView<{ ID: string; Name: string; __mj_UpdatedAt: string }>(\n {\n EntityName: 'MJ: Conversations',\n ExtraFilter: `Type='Meeting Room'`,\n Fields: ['ID', 'Name', '__mj_UpdatedAt'],\n OrderBy: '__mj_UpdatedAt DESC',\n MaxRows: 200,\n ResultType: 'simple',\n },\n this.ProviderToUse.CurrentUser,\n );\n if (res.Success) {\n this.HistoryRooms = res.Results.map((r) => ({\n ConversationID: String(r['ID']),\n Name: String(r['Name'] ?? 'Meeting'),\n At: new Date(String(r['__mj_UpdatedAt'] ?? '')),\n }));\n }\n } finally {\n this.LoadingHistory = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Opens a past meeting's transcript (drill-in). */\n public async OpenTranscript(room: { ConversationID: string; Name: string }): Promise<void> {\n this.OpenHistoryRoom = room;\n this.HistoryTranscript = [];\n this.LoadingTranscript = true;\n this.cdr.detectChanges();\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const res = await rv.RunView<{ Role: string; Message: string; AgentID: string; Error: string }>(\n {\n EntityName: 'MJ: Conversation Details',\n ExtraFilter: `ConversationID='${room.ConversationID.replace(/'/g, \"''\")}'`,\n Fields: ['Role', 'Message', 'AgentID', 'Error', '__mj_CreatedAt'],\n OrderBy: '__mj_CreatedAt ASC',\n MaxRows: 5000,\n ResultType: 'simple',\n },\n this.ProviderToUse.CurrentUser,\n );\n if (res.Success) {\n this.HistoryTranscript = res.Results.map((d) => {\n const role = String(d['Role'] ?? 'User');\n if (role === 'Error') {\n return { Kind: 'error' as const, Speaker: 'Error', Message: String(d['Error'] ?? d['Message'] ?? '') };\n }\n if (role === 'AI') {\n const agentId = String(d['AgentID'] ?? '').toLowerCase();\n const name = AIEngineBase.Instance.Agents.find((a) => a.ID.toLowerCase() === agentId)?.Name ?? 'Agent';\n return { Kind: 'agent' as const, Speaker: name, Message: String(d['Message'] ?? '') };\n }\n return { Kind: 'human' as const, Speaker: 'Participant', Message: String(d['Message'] ?? '') };\n });\n }\n } finally {\n this.LoadingTranscript = false;\n this.cdr.detectChanges();\n }\n }\n\n /** @deprecated Use {@link OpenTranscript}. */\n public async openTranscript(room: { ConversationID: string; Name: string }): Promise<void> {\n return this.OpenTranscript(room);\n }\n\n /** Back to the history list from a transcript drill-in. */\n public CloseTranscript(): void {\n this.OpenHistoryRoom = null;\n }\n\n /** @deprecated Use {@link CloseTranscript}. */\n public closeTranscript(): void {\n return this.CloseTranscript();\n }\n\n /** Formats a meeting timestamp for the history list (avoids a `date` pipe / CommonModule dependency). */\n public FormatTime(d: Date): string {\n return d && !isNaN(d.getTime()) ? d.toLocaleString() : '';\n }\n\n /** @deprecated Use {@link FormatTime}. */\n public formatTime(d: Date): string {\n return this.FormatTime(d);\n }\n\n /** Picker selection handler (native select; avoids a FormsModule dependency). */\n public OnTargetChange(event: Event): void {\n this.SelectedTargetId = (event.target as HTMLSelectElement).value || null;\n }\n\n /** @deprecated Use {@link OnTargetChange}. */\n public onTargetChange(event: Event): void {\n return this.OnTargetChange(event);\n }\n\n /** Loads active Realtime models + their voices for the dev pickers (best-effort; empty on failure). */\n private async loadRealtimeModels(): Promise<void> {\n try {\n const client = new GraphQLLiveKitClient(this.ProviderToUse as unknown as GraphQLDataProvider);\n this.RealtimeModels = await client.GetRealtimeModelVoices();\n } catch {\n this.RealtimeModels = [];\n }\n this.cdr.markForCheck();\n }\n\n /** Commits the chosen target and switches to the live room. */\n public StartCall(): void {\n if (!this.SelectedTargetId) {\n return;\n }\n this.TargetAgentId = this.SelectedTargetId;\n this.TargetAgentName = this.Agents.find((a) => UUIDsEqual(a.ID, this.SelectedTargetId))?.Name ?? null;\n this.Phase = 'live';\n }\n\n /** @deprecated Use {@link StartCall}. */\n public startCall(): void {\n return this.StartCall();\n }\n\n /** Opens the invite-people dialog for the given room. */\n public OpenInvite(roomName: string): void {\n this.InviteRoomName = roomName || null;\n this.UserSearch = '';\n this.UserResults = [];\n this.SelectedInvitees = [];\n this.Searched = false;\n this.InviteMessage = null;\n this.ShowInvite = true;\n }\n\n /** @deprecated Use {@link OpenInvite}. */\n public openInvite(roomName: string): void {\n return this.OpenInvite(roomName);\n }\n\n /** Searches `MJ: Users` by name/email, excluding the current user + already-selected people. */\n public async SearchUsers(): Promise<void> {\n const term = this.UserSearch.trim();\n if (!term) {\n return;\n }\n this.Searching = true;\n this.cdr.markForCheck();\n try {\n const p = this.ProviderToUse;\n const escaped = term.replace(/'/g, \"''\");\n const excluded = [p.CurrentUser?.ID, ...this.SelectedInvitees.map((u) => u.ID)].filter(Boolean) as string[];\n const excludeFilter = excluded.length ? ` AND ID NOT IN (${excluded.map((id) => `'${id}'`).join(',')})` : '';\n const result = await RunView.FromMetadataProvider(p).RunView<{ ID: string; Name: string; Email: string }>({\n EntityName: 'Users',\n ExtraFilter: `IsActive = 1 AND (Name LIKE '%${escaped}%' OR Email LIKE '%${escaped}%')${excludeFilter}`,\n OrderBy: 'Name',\n Fields: ['ID', 'Name', 'Email'],\n MaxRows: 20,\n ResultType: 'simple',\n });\n this.UserResults = (result.Success ? result.Results : []).map((u) => ({\n ID: u.ID,\n Name: u.Name || u.Email || '(unnamed)',\n Email: u.Email ?? null,\n }));\n } finally {\n this.Searching = false;\n this.Searched = true;\n this.cdr.markForCheck();\n }\n }\n\n /** @deprecated Use {@link SearchUsers}. */\n public async searchUsers(): Promise<void> {\n return this.SearchUsers();\n }\n\n /** Adds a person to the invite list (and out of the results). */\n public AddInvitee(user: InviteeChoice): void {\n if (!this.SelectedInvitees.some((u) => UUIDsEqual(u.ID, user.ID))) {\n this.SelectedInvitees = [...this.SelectedInvitees, user];\n }\n this.UserResults = this.UserResults.filter((u) => !UUIDsEqual(u.ID, user.ID));\n }\n\n /** @deprecated Use {@link AddInvitee}. */\n public addInvitee(user: InviteeChoice): void {\n return this.AddInvitee(user);\n }\n\n /** Removes a person from the invite list. */\n public RemoveInvitee(userId: string): void {\n this.SelectedInvitees = this.SelectedInvitees.filter((u) => !UUIDsEqual(u.ID, userId));\n }\n\n /** @deprecated Use {@link RemoveInvitee}. */\n public removeInvitee(userId: string): void {\n return this.RemoveInvitee(userId);\n }\n\n /** Sends the invites — the server notifies each person (in-app + Comms when configured). */\n public async SendInvites(): Promise<void> {\n if (!this.SelectedInvitees.length || !this.InviteRoomName || this.Inviting) {\n return;\n }\n this.Inviting = true;\n this.InviteMessage = null;\n this.cdr.markForCheck();\n try {\n const client = new GraphQLLiveKitClient(this.ProviderToUse as unknown as GraphQLDataProvider);\n const ok = await client.InviteUsers(this.InviteRoomName, this.SelectedInvitees.map((u) => u.ID));\n if (ok) {\n this.InviteMessage = `Invited ${this.SelectedInvitees.length} ${this.SelectedInvitees.length === 1 ? 'person' : 'people'}.`;\n this.SelectedInvitees = [];\n setTimeout(() => {\n this.ShowInvite = false;\n this.cdr.markForCheck();\n }, 900);\n } else {\n this.InviteMessage = 'Could not send the invites. Please try again.';\n }\n } catch (err) {\n this.InviteMessage = err instanceof Error ? err.message : String(err);\n } finally {\n this.Inviting = false;\n this.cdr.markForCheck();\n }\n }\n\n /** @deprecated Use {@link SendInvites}. */\n public async sendInvites(): Promise<void> {\n return this.SendInvites();\n }\n\n ngAfterViewInit(): void {\n // Clear the shell loading screen even if resolution is slow — the picker/room/message shows its own\n // state, so the loader must not hang on direct URL navigation.\n this.NotifyLoadComplete();\n }\n\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Live Room';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-video';\n }\n}\n"]}
@@ -0,0 +1,42 @@
1
+ import { OnInit } from '@angular/core';
2
+ import { BaseResourceComponent } from '@memberjunction/ng-shared';
3
+ import { ResourceData } from '@memberjunction/core-entities';
4
+ import { type MeetingInfo } from '@memberjunction/graphql-dataprovider';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * Meetings Resource — multi-party scheduled and ad-hoc meeting hub in Explorer (the Meet app's "Meetings").
8
+ *
9
+ * Coordinates:
10
+ * - Meeting list view (`mj-meeting-list`)
11
+ * - Scheduling / editing form (`mj-meeting-schedule-form`)
12
+ * - Pre-join lobby with AV checks & dial-in info (`mj-meeting-lobby`)
13
+ * - Active multi-party call (`mj-livekit-agent-room` in join mode)
14
+ *
15
+ * Registered via `@RegisterClass(BaseResourceComponent, 'MeetingsResource')`.
16
+ */
17
+ export declare class MeetingsResource extends BaseResourceComponent implements OnInit {
18
+ Phase: 'list' | 'schedule' | 'lobby' | 'live';
19
+ ActiveMeeting: MeetingInfo | null;
20
+ EditingMeeting: MeetingInfo | null;
21
+ LiveRoomName: string;
22
+ StartWithMic: boolean;
23
+ StartWithCam: boolean;
24
+ ngOnInit(): void;
25
+ private initialize;
26
+ OnScheduleRequested(): void;
27
+ OnEditMeetingRequested(meeting: MeetingInfo): void;
28
+ OnMeetingSaved(meeting: MeetingInfo): void;
29
+ OnScheduleCancelled(): void;
30
+ OnJoinMeetingFromList(meeting: MeetingInfo): void;
31
+ OnJoinConfirmed(prefs: {
32
+ startWithAudio: boolean;
33
+ startWithVideo: boolean;
34
+ }): void;
35
+ OnLobbyCancelled(): void;
36
+ OnLiveRoomLeft(): void;
37
+ GetResourceDisplayName(_data: ResourceData): Promise<string>;
38
+ GetResourceIconClass(_data: ResourceData): Promise<string>;
39
+ static ɵfac: i0.ɵɵFactoryDeclaration<MeetingsResource, never>;
40
+ static ɵcmp: i0.ɵɵComponentDeclaration<MeetingsResource, "mj-meetings-resource", never, {}, {}, never, never, false, never>;
41
+ }
42
+ //# sourceMappingURL=meetings-resource.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meetings-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/meetings-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,sCAAsC,CAAC;;AAE9C;;;;;;;;;;GAUG;AACH,qBAsGa,gBAAiB,SAAQ,qBAAsB,YAAW,MAAM;IACpE,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,CAAU;IACvD,aAAa,EAAE,WAAW,GAAG,IAAI,CAAQ;IACzC,cAAc,EAAE,WAAW,GAAG,IAAI,CAAQ;IAC1C,YAAY,EAAE,MAAM,CAAM;IAC1B,YAAY,EAAE,OAAO,CAAQ;IAC7B,YAAY,EAAE,OAAO,CAAS;IAE5B,QAAQ,IAAI,IAAI;YAKX,UAAU;IAkBjB,mBAAmB,IAAI,IAAI;IAK3B,sBAAsB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAKlD,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAM1C,mBAAmB,IAAI,IAAI;IAK3B,qBAAqB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAKjD,eAAe,CAAC,KAAK,EAAE;QAAE,cAAc,EAAE,OAAO,CAAC;QAAC,cAAc,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAOlF,gBAAgB,IAAI,IAAI;IAKxB,cAAc,IAAI,IAAI;IAMvB,sBAAsB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI5D,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCA/ErD,gBAAgB;2CAAhB,gBAAgB;CAkF5B"}