@memberjunction/ng-explorer-core 6.2.0-edge.0 → 6.2.0-edge.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app-routing.module.d.ts +23 -1
- package/dist/app-routing.module.d.ts.map +1 -1
- package/dist/app-routing.module.js +50 -14
- package/dist/app-routing.module.js.map +1 -1
- package/dist/generated/lazy-feature-config.d.ts +1 -1
- package/dist/generated/lazy-feature-config.d.ts.map +1 -1
- package/dist/generated/lazy-feature-config.js +12 -1
- package/dist/generated/lazy-feature-config.js.map +1 -1
- package/dist/lib/command-palette/command-palette.component.d.ts +7 -1
- package/dist/lib/command-palette/command-palette.component.d.ts.map +1 -1
- package/dist/lib/command-palette/command-palette.component.js +28 -14
- package/dist/lib/command-palette/command-palette.component.js.map +1 -1
- package/dist/lib/conversation-feedback/conversation-feedback.d.ts +103 -13
- package/dist/lib/conversation-feedback/conversation-feedback.d.ts.map +1 -1
- package/dist/lib/conversation-feedback/conversation-feedback.js +219 -67
- package/dist/lib/conversation-feedback/conversation-feedback.js.map +1 -1
- package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.d.ts +64 -10
- package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.d.ts.map +1 -1
- package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js +172 -66
- package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js.map +1 -1
- package/dist/lib/generic/resource-container-component.d.ts +19 -5
- package/dist/lib/generic/resource-container-component.d.ts.map +1 -1
- package/dist/lib/generic/resource-container-component.js +43 -13
- package/dist/lib/generic/resource-container-component.js.map +1 -1
- package/dist/lib/guards/entities.guard.d.ts +4 -0
- package/dist/lib/guards/entities.guard.d.ts.map +1 -1
- package/dist/lib/guards/entities.guard.js +10 -2
- package/dist/lib/guards/entities.guard.js.map +1 -1
- package/dist/lib/identity-claims/claim-redeem.component.d.ts +4 -0
- package/dist/lib/identity-claims/claim-redeem.component.d.ts.map +1 -1
- package/dist/lib/identity-claims/claim-redeem.component.js +10 -2
- package/dist/lib/identity-claims/claim-redeem.component.js.map +1 -1
- package/dist/lib/oauth/oauth-callback.component.d.ts +4 -0
- package/dist/lib/oauth/oauth-callback.component.d.ts.map +1 -1
- package/dist/lib/oauth/oauth-callback.component.js +10 -2
- package/dist/lib/oauth/oauth-callback.component.js.map +1 -1
- package/dist/lib/profile/profile-dialog.component.d.ts.map +1 -1
- package/dist/lib/profile/profile-dialog.component.js +194 -191
- package/dist/lib/profile/profile-dialog.component.js.map +1 -1
- package/dist/lib/resource-wrappers/artifact-resource.component.d.ts +20 -2
- package/dist/lib/resource-wrappers/artifact-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/artifact-resource.component.js +33 -9
- package/dist/lib/resource-wrappers/artifact-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/chat-collections-resource.component.d.ts +80 -10
- package/dist/lib/resource-wrappers/chat-collections-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/chat-collections-resource.component.js +168 -56
- package/dist/lib/resource-wrappers/chat-collections-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts +199 -25
- package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/chat-conversations-resource.component.js +534 -182
- package/dist/lib/resource-wrappers/chat-conversations-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/chat-deeplink-params.d.ts +2 -0
- package/dist/lib/resource-wrappers/chat-deeplink-params.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/chat-deeplink-params.js +5 -1
- package/dist/lib/resource-wrappers/chat-deeplink-params.js.map +1 -1
- package/dist/lib/resource-wrappers/chat-search-routing.d.ts +25 -0
- package/dist/lib/resource-wrappers/chat-search-routing.d.ts.map +1 -0
- package/dist/lib/resource-wrappers/chat-search-routing.js +24 -0
- package/dist/lib/resource-wrappers/chat-search-routing.js.map +1 -0
- package/dist/lib/resource-wrappers/chat-tasks-resource.component.d.ts +14 -2
- package/dist/lib/resource-wrappers/chat-tasks-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/chat-tasks-resource.component.js +32 -8
- package/dist/lib/resource-wrappers/chat-tasks-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/compose-email-fallback.d.ts +46 -0
- package/dist/lib/resource-wrappers/compose-email-fallback.d.ts.map +1 -0
- package/dist/lib/resource-wrappers/compose-email-fallback.js +62 -0
- package/dist/lib/resource-wrappers/compose-email-fallback.js.map +1 -0
- package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts +54 -8
- package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/dashboard-resource.component.js +138 -46
- package/dist/lib/resource-wrappers/dashboard-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/livekit-room-resource.component.d.ts +223 -30
- package/dist/lib/resource-wrappers/livekit-room-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/livekit-room-resource.component.js +438 -118
- package/dist/lib/resource-wrappers/livekit-room-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/search-results-resource.component.d.ts +7 -3
- package/dist/lib/resource-wrappers/search-results-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/search-results-resource.component.js +23 -15
- package/dist/lib/resource-wrappers/search-results-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/view-resource.component.d.ts +74 -11
- package/dist/lib/resource-wrappers/view-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/view-resource.component.js +214 -68
- package/dist/lib/resource-wrappers/view-resource.component.js.map +1 -1
- package/dist/lib/services/server-connectivity.service.d.ts +9 -4
- package/dist/lib/services/server-connectivity.service.d.ts.map +1 -1
- package/dist/lib/services/server-connectivity.service.js +56 -12
- package/dist/lib/services/server-connectivity.service.js.map +1 -1
- package/dist/lib/services/startup-validation.service.d.ts +4 -0
- package/dist/lib/services/startup-validation.service.d.ts.map +1 -1
- package/dist/lib/services/startup-validation.service.js +10 -2
- package/dist/lib/services/startup-validation.service.js.map +1 -1
- package/dist/lib/services/system-validation.service.d.ts +13 -1
- package/dist/lib/services/system-validation.service.d.ts.map +1 -1
- package/dist/lib/services/system-validation.service.js +29 -5
- package/dist/lib/services/system-validation.service.js.map +1 -1
- package/dist/lib/shell/components/dialogs/app-access-dialog.component.d.ts +54 -4
- package/dist/lib/shell/components/dialogs/app-access-dialog.component.d.ts.map +1 -1
- package/dist/lib/shell/components/dialogs/app-access-dialog.component.js +130 -40
- package/dist/lib/shell/components/dialogs/app-access-dialog.component.js.map +1 -1
- package/dist/lib/shell/components/header/app-nav.component.d.ts +29 -1
- package/dist/lib/shell/components/header/app-nav.component.d.ts.map +1 -1
- package/dist/lib/shell/components/header/app-nav.component.js +56 -12
- package/dist/lib/shell/components/header/app-nav.component.js.map +1 -1
- package/dist/lib/shell/components/header/app-switcher.component.d.ts +33 -5
- package/dist/lib/shell/components/header/app-switcher.component.d.ts.map +1 -1
- package/dist/lib/shell/components/header/app-switcher.component.js +85 -29
- package/dist/lib/shell/components/header/app-switcher.component.js.map +1 -1
- package/dist/lib/shell/components/record-open/record-origin-crumb.component.js +1 -1
- package/dist/lib/shell/components/record-open/record-origin-crumb.component.js.map +1 -1
- package/dist/lib/shell/components/tabs/component-cache-manager.d.ts +50 -6
- package/dist/lib/shell/components/tabs/component-cache-manager.d.ts.map +1 -1
- package/dist/lib/shell/components/tabs/component-cache-manager.js +95 -22
- package/dist/lib/shell/components/tabs/component-cache-manager.js.map +1 -1
- package/dist/lib/shell/components/tabs/tab-container.component.d.ts +91 -9
- package/dist/lib/shell/components/tabs/tab-container.component.d.ts.map +1 -1
- package/dist/lib/shell/components/tabs/tab-container.component.js +257 -101
- package/dist/lib/shell/components/tabs/tab-container.component.js.map +1 -1
- package/dist/lib/shell/loading-themes.d.ts +16 -12
- package/dist/lib/shell/loading-themes.d.ts.map +1 -1
- package/dist/lib/shell/loading-themes.js +145 -137
- package/dist/lib/shell/loading-themes.js.map +1 -1
- package/dist/lib/shell/readiness-beacon.d.ts +2 -0
- package/dist/lib/shell/readiness-beacon.d.ts.map +1 -1
- package/dist/lib/shell/readiness-beacon.js +5 -1
- package/dist/lib/shell/readiness-beacon.js.map +1 -1
- package/dist/lib/shell/services/about-dialog.service.d.ts +6 -0
- package/dist/lib/shell/services/about-dialog.service.d.ts.map +1 -1
- package/dist/lib/shell/services/about-dialog.service.js +16 -4
- package/dist/lib/shell/services/about-dialog.service.js.map +1 -1
- package/dist/lib/shell/services/profile-dialog.service.d.ts +6 -0
- package/dist/lib/shell/services/profile-dialog.service.d.ts.map +1 -1
- package/dist/lib/shell/services/profile-dialog.service.js +16 -4
- package/dist/lib/shell/services/profile-dialog.service.js.map +1 -1
- package/dist/lib/shell/services/user-sharing-center-dialog.service.d.ts +6 -0
- package/dist/lib/shell/services/user-sharing-center-dialog.service.d.ts.map +1 -1
- package/dist/lib/shell/services/user-sharing-center-dialog.service.js +15 -3
- package/dist/lib/shell/services/user-sharing-center-dialog.service.js.map +1 -1
- package/dist/lib/shell/shell.component.d.ts +264 -39
- package/dist/lib/shell/shell.component.d.ts.map +1 -1
- package/dist/lib/shell/shell.component.js +697 -294
- package/dist/lib/shell/shell.component.js.map +1 -1
- package/dist/lib/single-dashboard/Components/add-item/add-item.component.d.ts +64 -8
- package/dist/lib/single-dashboard/Components/add-item/add-item.component.d.ts.map +1 -1
- package/dist/lib/single-dashboard/Components/add-item/add-item.component.js +129 -37
- package/dist/lib/single-dashboard/Components/add-item/add-item.component.js.map +1 -1
- package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.d.ts +26 -2
- package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.d.ts.map +1 -1
- package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.js +48 -10
- package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.js.map +1 -1
- package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.d.ts +84 -6
- package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.d.ts.map +1 -1
- package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.js +133 -29
- package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.js.map +1 -1
- package/dist/lib/single-dashboard/single-dashboard.component.d.ts +173 -23
- package/dist/lib/single-dashboard/single-dashboard.component.d.ts.map +1 -1
- package/dist/lib/single-dashboard/single-dashboard.component.js +383 -109
- package/dist/lib/single-dashboard/single-dashboard.component.js.map +1 -1
- package/dist/lib/single-list-detail/single-list-detail.component.d.ts +383 -55
- package/dist/lib/single-list-detail/single-list-detail.component.d.ts.map +1 -1
- package/dist/lib/single-list-detail/single-list-detail.component.js +962 -326
- package/dist/lib/single-list-detail/single-list-detail.component.js.map +1 -1
- package/dist/lib/single-query/single-query.component.d.ts +22 -2
- package/dist/lib/single-query/single-query.component.d.ts.map +1 -1
- package/dist/lib/single-query/single-query.component.js +40 -10
- package/dist/lib/single-query/single-query.component.js.map +1 -1
- package/dist/lib/single-record/single-record.component.d.ts +41 -3
- package/dist/lib/single-record/single-record.component.d.ts.map +1 -1
- package/dist/lib/single-record/single-record.component.js +71 -11
- package/dist/lib/single-record/single-record.component.js.map +1 -1
- package/dist/lib/single-search-result/single-search-result.component.d.ts +23 -3
- package/dist/lib/single-search-result/single-search-result.component.d.ts.map +1 -1
- package/dist/lib/single-search-result/single-search-result.component.js +42 -12
- package/dist/lib/single-search-result/single-search-result.component.js.map +1 -1
- package/dist/lib/system-validation/system-validation-banner.component.d.ts +12 -2
- package/dist/lib/system-validation/system-validation-banner.component.d.ts.map +1 -1
- package/dist/lib/system-validation/system-validation-banner.component.js +25 -5
- package/dist/lib/system-validation/system-validation-banner.component.js.map +1 -1
- package/dist/lib/user-menu/user-menu.types.d.ts +4 -0
- package/dist/lib/user-menu/user-menu.types.d.ts.map +1 -1
- package/dist/lib/user-menu/user-menu.types.js +10 -2
- package/dist/lib/user-menu/user-menu.types.js.map +1 -1
- package/dist/lib/user-notifications/user-notifications.component.d.ts +59 -7
- package/dist/lib/user-notifications/user-notifications.component.d.ts.map +1 -1
- package/dist/lib/user-notifications/user-notifications.component.js +151 -47
- package/dist/lib/user-notifications/user-notifications.component.js.map +1 -1
- package/dist/lib/user-profile/user-profile.component.d.ts +3 -2
- package/dist/lib/user-profile/user-profile.component.d.ts.map +1 -1
- package/dist/lib/user-profile/user-profile.component.js +5 -4
- package/dist/lib/user-profile/user-profile.component.js.map +1 -1
- package/package.json +52 -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 // ── \"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 /** True while loading the active-rooms list. */\n public loadingActive = false;\n /** Free-text room name to join directly (the \"join by name/code\" path). */\n public manualRoomName = '';\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 /** True while loading the history list. */\n public loadingHistory = false;\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 /** The opened room's transcript lines. */\n public historyTranscript: { Kind: 'agent' | 'human' | 'error'; Speaker: string; Message: string }[] = [];\n /** True while loading a room's transcript. */\n public loadingTranscript = false;\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 /** The room to JOIN when opened via an invite link (`?room=…`); null in agent mode. */\n public joinRoomName: string | null = null;\n\n /** The Realtime co-agent (voice front-end) id — the resolved default Realtime-type agent. */\n public agentId: string | null = null;\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 /** The target agent's display name — used as the bot name + addressing word (\"Sage, …\"). */\n public targetAgentName: string | null = null;\n\n /** The agents offered in the pre-join picker (active, excluding the Realtime co-agent itself). */\n public agents: TargetAgentChoice[] = [];\n\n /** The currently-selected target in the picker (defaults to \"Sage\" when present). */\n public selectedTargetId: string | null = null;\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 /** Active Realtime models + their voices (loaded once when the user can override). */\n public realtimeModels: RealtimeModelVoices[] = [];\n /** The MODEL override chosen for the FIRST agent in the pre-join picker (null = default). */\n public selectedModelId: string | null = null;\n /** The VOICE override chosen for the FIRST agent in the pre-join picker (null = default). */\n public selectedVoice: string | null = null;\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 /** 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 /** Records the pre-join VOICE choice. */\n public onVoiceChange(event: Event): void {\n this.selectedVoice = (event.target as HTMLSelectElement).value || null;\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 // ── \"Invite people\" dialog state ─────────────────────────────────────────────────\n /** Whether the invite-people dialog is open. */\n public showInvite = false;\n /** The room the invite targets (the live room name). */\n public inviteRoomName: string | null = null;\n /** Current search text in the people search box. */\n public userSearch = '';\n /** People matching the last search (minus already-selected + the current user). */\n public userResults: InviteeChoice[] = [];\n /** People chosen to invite. */\n public selectedInvitees: InviteeChoice[] = [];\n /** True while a people search is running. */\n public searching = false;\n /** True once a search has run (drives the \"no matches\" empty state). */\n public searched = false;\n /** True while invites are being sent. */\n public inviting = false;\n /** Result/status message under the dialog. */\n public inviteMessage: string | null = null;\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 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 /** Go to the \"start a new room\" picker. */\n public startNewRoom(): void {\n this.phase = 'picking';\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 /** 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 /** Back to the Meet home. */\n public backToLanding(): void {\n this.phase = 'landing';\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 /** 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 /** Back to the history list from a transcript drill-in. */\n public closeTranscript(): void {\n this.openHistoryRoom = null;\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 /** 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 /** 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 /** 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 /** 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 /** 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 /** 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 /** 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 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';\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"]}
|
|
@@ -18,7 +18,11 @@ export declare class SearchResultsResource extends BaseResourceComponent {
|
|
|
18
18
|
MinScorePercent: number;
|
|
19
19
|
/** The MinScore that was sent to the server on the last search. If the user
|
|
20
20
|
* slides below this, we need to re-query the server to get more results. */
|
|
21
|
-
|
|
21
|
+
ServerMinScorePercent: number;
|
|
22
|
+
/** @deprecated Use {@link ServerMinScorePercent}. */
|
|
23
|
+
get serverMinScorePercent(): number;
|
|
24
|
+
/** @deprecated Use {@link ServerMinScorePercent}. */
|
|
25
|
+
set serverMinScorePercent(value: number);
|
|
22
26
|
/** How many results the server returned (before client-side filtering) */
|
|
23
27
|
ServerResultCount: number;
|
|
24
28
|
ShowFilterPanel: boolean;
|
|
@@ -30,7 +34,7 @@ export declare class SearchResultsResource extends BaseResourceComponent {
|
|
|
30
34
|
/** All results from the last search (before client-side filtering) */
|
|
31
35
|
private allResults;
|
|
32
36
|
/** Selected scope IDs from the search bar (empty = unscoped/global). */
|
|
33
|
-
private
|
|
37
|
+
private scopeIDs;
|
|
34
38
|
/**
|
|
35
39
|
* Phase 2C streaming opt-in. Off by default to preserve Phase 1 request-response UX.
|
|
36
40
|
* Enable per-resource via `Data.Configuration.EnableStreaming` or per-tab via the
|
|
@@ -74,7 +78,7 @@ export declare class SearchResultsResource extends BaseResourceComponent {
|
|
|
74
78
|
* - content-item: opens the MJ entity record viewer (content items are entity records)
|
|
75
79
|
*/
|
|
76
80
|
private navigateToResult;
|
|
77
|
-
private
|
|
81
|
+
private executeSearch;
|
|
78
82
|
/**
|
|
79
83
|
* Phase 2C streaming variant. Subscribes to `streamScopedSearch` and progressively
|
|
80
84
|
* populates the result list as each provider reports back. The 'final' event carries
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-results-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/search-results-resource.component.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAqB,MAAM,2BAA2B,CAAC;AAErF,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAG7D,OAAO,EAEH,gBAAgB,EAChB,YAAY,EACZ,uBAAuB,EAGvB,yBAAyB,EACzB,uBAAuB,EAC1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;;AAElF,qBAgXa,qBAAsB,SAAQ,qBAAqB;IAC5D,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,eAAe,CAA2B;IAElD,YAAY,SAAM;IAClB,WAAW,UAAS;IACpB,WAAW,UAAS;IACpB,UAAU,SAAK;IACf,SAAS,SAAK;IACd,OAAO,EAAE,YAAY,EAAE,CAAM;IAC7B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAM;IAC7C,eAAe,EAAE,gBAAgB,EAAE,CAAM;IACzC,eAAe,SAAM;IACrB;iFAC6E;IAC7E,qBAAqB,SAAM;
|
|
1
|
+
{"version":3,"file":"search-results-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/search-results-resource.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -249,7 +249,15 @@ let SearchResultsResource = class SearchResultsResource extends BaseResourceComp
|
|
|
249
249
|
MinScorePercent = 30;
|
|
250
250
|
/** The MinScore that was sent to the server on the last search. If the user
|
|
251
251
|
* slides below this, we need to re-query the server to get more results. */
|
|
252
|
-
|
|
252
|
+
ServerMinScorePercent = 30;
|
|
253
|
+
/** @deprecated Use {@link ServerMinScorePercent}. */
|
|
254
|
+
get serverMinScorePercent() {
|
|
255
|
+
return this.ServerMinScorePercent;
|
|
256
|
+
}
|
|
257
|
+
/** @deprecated Use {@link ServerMinScorePercent}. */
|
|
258
|
+
set serverMinScorePercent(value) {
|
|
259
|
+
this.ServerMinScorePercent = value;
|
|
260
|
+
}
|
|
253
261
|
/** How many results the server returned (before client-side filtering) */
|
|
254
262
|
ServerResultCount = 0;
|
|
255
263
|
ShowFilterPanel = true;
|
|
@@ -261,7 +269,7 @@ let SearchResultsResource = class SearchResultsResource extends BaseResourceComp
|
|
|
261
269
|
/** All results from the last search (before client-side filtering) */
|
|
262
270
|
allResults = [];
|
|
263
271
|
/** Selected scope IDs from the search bar (empty = unscoped/global). */
|
|
264
|
-
|
|
272
|
+
scopeIDs = [];
|
|
265
273
|
/**
|
|
266
274
|
* Phase 2C streaming opt-in. Off by default to preserve Phase 1 request-response UX.
|
|
267
275
|
* Enable per-resource via `Data.Configuration.EnableStreaming` or per-tab via the
|
|
@@ -312,7 +320,7 @@ let SearchResultsResource = class SearchResultsResource extends BaseResourceComp
|
|
|
312
320
|
}
|
|
313
321
|
// Carry scope selection from the search bar through into the initial query.
|
|
314
322
|
if (Array.isArray(config?.ScopeIDs)) {
|
|
315
|
-
this.
|
|
323
|
+
this.scopeIDs = config.ScopeIDs.filter((x) => typeof x === 'string');
|
|
316
324
|
}
|
|
317
325
|
// Streaming opt-in: resource config wins; URL query param `?stream=1` is the
|
|
318
326
|
// engineering-verification override (cleared once the default flips). Read the
|
|
@@ -331,7 +339,7 @@ let SearchResultsResource = class SearchResultsResource extends BaseResourceComp
|
|
|
331
339
|
// Sync min relevance to URL query param
|
|
332
340
|
this.UpdateQueryParams({ minRelevance: String(this.MinScorePercent) });
|
|
333
341
|
if (this.CurrentQuery) {
|
|
334
|
-
await this.
|
|
342
|
+
await this.executeSearch(this.CurrentQuery);
|
|
335
343
|
}
|
|
336
344
|
this.NotifyLoadComplete();
|
|
337
345
|
}
|
|
@@ -352,7 +360,7 @@ let SearchResultsResource = class SearchResultsResource extends BaseResourceComp
|
|
|
352
360
|
if (trimmed && trimmed.length >= 2) {
|
|
353
361
|
this.CurrentQuery = trimmed;
|
|
354
362
|
this.ActiveFilters = {};
|
|
355
|
-
await this.
|
|
363
|
+
await this.executeSearch(trimmed);
|
|
356
364
|
}
|
|
357
365
|
}
|
|
358
366
|
OnFilterChanged(event) {
|
|
@@ -371,9 +379,9 @@ let SearchResultsResource = class SearchResultsResource extends BaseResourceComp
|
|
|
371
379
|
OnMinScoreChanged(percent) {
|
|
372
380
|
this.MinScorePercent = percent;
|
|
373
381
|
this.UpdateQueryParams({ minRelevance: String(percent) });
|
|
374
|
-
if (percent < this.
|
|
382
|
+
if (percent < this.ServerMinScorePercent && this.CurrentQuery) {
|
|
375
383
|
// User lowered below what server filtered — need to re-query with lower threshold
|
|
376
|
-
this.
|
|
384
|
+
this.executeSearch(this.CurrentQuery);
|
|
377
385
|
}
|
|
378
386
|
else {
|
|
379
387
|
// User raised or stayed at/above server threshold — client-side filter is sufficient
|
|
@@ -393,9 +401,9 @@ let SearchResultsResource = class SearchResultsResource extends BaseResourceComp
|
|
|
393
401
|
if (isNaN(mr) || mr < 0 || mr > 100 || mr === this.MinScorePercent)
|
|
394
402
|
return;
|
|
395
403
|
this.MinScorePercent = mr;
|
|
396
|
-
if (mr < this.
|
|
404
|
+
if (mr < this.ServerMinScorePercent && this.CurrentQuery) {
|
|
397
405
|
// Below what the server filtered — re-query with the lower threshold.
|
|
398
|
-
void this.
|
|
406
|
+
void this.executeSearch(this.CurrentQuery);
|
|
399
407
|
}
|
|
400
408
|
else {
|
|
401
409
|
this.applyClientFilters();
|
|
@@ -412,7 +420,7 @@ let SearchResultsResource = class SearchResultsResource extends BaseResourceComp
|
|
|
412
420
|
this.ActiveFilters = {};
|
|
413
421
|
this.MinScorePercent = 30;
|
|
414
422
|
this.ClientFilterText = '';
|
|
415
|
-
await this.
|
|
423
|
+
await this.executeSearch(this.CurrentQuery);
|
|
416
424
|
}
|
|
417
425
|
}
|
|
418
426
|
ToggleFilterPanel() {
|
|
@@ -469,11 +477,11 @@ let SearchResultsResource = class SearchResultsResource extends BaseResourceComp
|
|
|
469
477
|
const pkey = CompositeKey.FromURLSegment(entityInfo, result.RecordID);
|
|
470
478
|
this.navigationService.OpenEntityRecord(result.EntityName, pkey);
|
|
471
479
|
}
|
|
472
|
-
async
|
|
480
|
+
async executeSearch(query) {
|
|
473
481
|
this.IsSearching = true;
|
|
474
482
|
this.HasSearched = false;
|
|
475
483
|
this.cdr.detectChanges();
|
|
476
|
-
this.
|
|
484
|
+
this.ServerMinScorePercent = this.MinScorePercent;
|
|
477
485
|
const request = {
|
|
478
486
|
Query: query,
|
|
479
487
|
MaxResults: 50,
|
|
@@ -481,8 +489,8 @@ let SearchResultsResource = class SearchResultsResource extends BaseResourceComp
|
|
|
481
489
|
IncludeSources: ['vector', 'fulltext', 'entity', 'storage'],
|
|
482
490
|
MinScore: this.MinScorePercent / 100
|
|
483
491
|
};
|
|
484
|
-
if (this.
|
|
485
|
-
request.ScopeIDs = [...this.
|
|
492
|
+
if (this.scopeIDs.length > 0) {
|
|
493
|
+
request.ScopeIDs = [...this.scopeIDs];
|
|
486
494
|
}
|
|
487
495
|
if (this.EnableStreaming) {
|
|
488
496
|
this.executeStreamingSearch(query, request);
|
|
@@ -754,7 +762,7 @@ let SearchResultsResource = class SearchResultsResource extends BaseResourceComp
|
|
|
754
762
|
Handler: async (params) => {
|
|
755
763
|
const query = String(params['query'] ?? '');
|
|
756
764
|
this.CurrentQuery = query;
|
|
757
|
-
await this.
|
|
765
|
+
await this.executeSearch(query);
|
|
758
766
|
return { Success: true, Data: { ResultCount: this.TotalCount, ElapsedMs: this.ElapsedMs } };
|
|
759
767
|
}
|
|
760
768
|
},
|