@memberjunction/ng-explorer-core 5.42.0 → 5.43.0
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/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 +5 -2
- package/dist/generated/lazy-feature-config.js.map +1 -1
- package/dist/lib/resource-wrappers/livekit-room-resource.component.d.ts +62 -2
- package/dist/lib/resource-wrappers/livekit-room-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/livekit-room-resource.component.js +604 -105
- package/dist/lib/resource-wrappers/livekit-room-resource.component.js.map +1 -1
- package/package.json +47 -47
|
@@ -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 (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 <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 ('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-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 → pre-join picker → live room (or an error message). */\n public phase: 'loading' | 'picking' | 'live' | 'error' = 'loading';\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 this.phase = 'picking';\n this.NotifyLoadComplete();\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 // ── \"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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-explorer-core",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.43.0",
|
|
4
4
|
"description": "MemberJunction Explorer: Core Angular Components",
|
|
5
5
|
"main": "./dist/public-api.js",
|
|
6
6
|
"typings": "./dist/public-api.d.ts",
|
|
@@ -32,52 +32,52 @@
|
|
|
32
32
|
"@angular/cdk": "21.1.3",
|
|
33
33
|
"@angular/platform-browser": "21.1.3",
|
|
34
34
|
"@auth0/auth0-angular": "^2.6.0",
|
|
35
|
-
"@memberjunction/ai-core-plus": "5.
|
|
36
|
-
"@memberjunction/ai-engine-base": "5.
|
|
37
|
-
"@memberjunction/communication-types": "5.
|
|
38
|
-
"@memberjunction/core": "5.
|
|
39
|
-
"@memberjunction/core-entities": "5.
|
|
40
|
-
"@memberjunction/entity-communications-client": "5.
|
|
41
|
-
"@memberjunction/export-engine": "5.
|
|
42
|
-
"@memberjunction/global": "5.
|
|
43
|
-
"@memberjunction/graphql-dataprovider": "5.
|
|
44
|
-
"@memberjunction/interactive-component-types": "5.
|
|
45
|
-
"@memberjunction/lists-base": "5.
|
|
46
|
-
"@memberjunction/ng-ai-test-harness": "5.
|
|
47
|
-
"@memberjunction/ng-artifacts": "5.
|
|
48
|
-
"@memberjunction/ng-auth-services": "5.
|
|
49
|
-
"@memberjunction/ng-base-application": "5.
|
|
50
|
-
"@memberjunction/ng-base-forms": "5.
|
|
51
|
-
"@memberjunction/ng-base-types": "5.
|
|
52
|
-
"@memberjunction/ng-container-directives": "5.
|
|
53
|
-
"@memberjunction/ng-conversations": "5.
|
|
54
|
-
"@memberjunction/ng-dashboard-viewer": "5.
|
|
55
|
-
"@memberjunction/ng-dashboards": "5.
|
|
56
|
-
"@memberjunction/ng-entity-form-dialog": "5.
|
|
57
|
-
"@memberjunction/ng-entity-permissions": "5.
|
|
58
|
-
"@memberjunction/ng-entity-viewer": "5.
|
|
59
|
-
"@memberjunction/ng-explorer-settings": "5.
|
|
60
|
-
"@memberjunction/ng-export-service": "5.
|
|
61
|
-
"@memberjunction/ng-feedback": "5.
|
|
62
|
-
"@memberjunction/ng-file-storage": "5.
|
|
63
|
-
"@memberjunction/ng-generic-dialog": "5.
|
|
64
|
-
"@memberjunction/ng-list-detail-grid": "5.
|
|
65
|
-
"@memberjunction/ng-list-management": "5.
|
|
66
|
-
"@memberjunction/ng-mj-livekit-room": "5.
|
|
67
|
-
"@memberjunction/ng-notifications": "5.
|
|
68
|
-
"@memberjunction/ng-pagination": "5.
|
|
69
|
-
"@memberjunction/ng-query-viewer": "5.
|
|
70
|
-
"@memberjunction/ng-record-changes": "5.
|
|
71
|
-
"@memberjunction/ng-record-selector": "5.
|
|
72
|
-
"@memberjunction/ng-record-tags": "5.
|
|
73
|
-
"@memberjunction/ng-resource-permissions": "5.
|
|
74
|
-
"@memberjunction/ng-search": "5.
|
|
75
|
-
"@memberjunction/ng-shared": "5.
|
|
76
|
-
"@memberjunction/ng-shared-generic": "5.
|
|
77
|
-
"@memberjunction/ng-ui-components": "5.
|
|
78
|
-
"@memberjunction/ng-user-avatar": "5.
|
|
79
|
-
"@memberjunction/ng-word-cloud": "5.
|
|
80
|
-
"@memberjunction/templates-base-types": "5.
|
|
35
|
+
"@memberjunction/ai-core-plus": "5.43.0",
|
|
36
|
+
"@memberjunction/ai-engine-base": "5.43.0",
|
|
37
|
+
"@memberjunction/communication-types": "5.43.0",
|
|
38
|
+
"@memberjunction/core": "5.43.0",
|
|
39
|
+
"@memberjunction/core-entities": "5.43.0",
|
|
40
|
+
"@memberjunction/entity-communications-client": "5.43.0",
|
|
41
|
+
"@memberjunction/export-engine": "5.43.0",
|
|
42
|
+
"@memberjunction/global": "5.43.0",
|
|
43
|
+
"@memberjunction/graphql-dataprovider": "5.43.0",
|
|
44
|
+
"@memberjunction/interactive-component-types": "5.43.0",
|
|
45
|
+
"@memberjunction/lists-base": "5.43.0",
|
|
46
|
+
"@memberjunction/ng-ai-test-harness": "5.43.0",
|
|
47
|
+
"@memberjunction/ng-artifacts": "5.43.0",
|
|
48
|
+
"@memberjunction/ng-auth-services": "5.43.0",
|
|
49
|
+
"@memberjunction/ng-base-application": "5.43.0",
|
|
50
|
+
"@memberjunction/ng-base-forms": "5.43.0",
|
|
51
|
+
"@memberjunction/ng-base-types": "5.43.0",
|
|
52
|
+
"@memberjunction/ng-container-directives": "5.43.0",
|
|
53
|
+
"@memberjunction/ng-conversations": "5.43.0",
|
|
54
|
+
"@memberjunction/ng-dashboard-viewer": "5.43.0",
|
|
55
|
+
"@memberjunction/ng-dashboards": "5.43.0",
|
|
56
|
+
"@memberjunction/ng-entity-form-dialog": "5.43.0",
|
|
57
|
+
"@memberjunction/ng-entity-permissions": "5.43.0",
|
|
58
|
+
"@memberjunction/ng-entity-viewer": "5.43.0",
|
|
59
|
+
"@memberjunction/ng-explorer-settings": "5.43.0",
|
|
60
|
+
"@memberjunction/ng-export-service": "5.43.0",
|
|
61
|
+
"@memberjunction/ng-feedback": "5.43.0",
|
|
62
|
+
"@memberjunction/ng-file-storage": "5.43.0",
|
|
63
|
+
"@memberjunction/ng-generic-dialog": "5.43.0",
|
|
64
|
+
"@memberjunction/ng-list-detail-grid": "5.43.0",
|
|
65
|
+
"@memberjunction/ng-list-management": "5.43.0",
|
|
66
|
+
"@memberjunction/ng-mj-livekit-room": "5.43.0",
|
|
67
|
+
"@memberjunction/ng-notifications": "5.43.0",
|
|
68
|
+
"@memberjunction/ng-pagination": "5.43.0",
|
|
69
|
+
"@memberjunction/ng-query-viewer": "5.43.0",
|
|
70
|
+
"@memberjunction/ng-record-changes": "5.43.0",
|
|
71
|
+
"@memberjunction/ng-record-selector": "5.43.0",
|
|
72
|
+
"@memberjunction/ng-record-tags": "5.43.0",
|
|
73
|
+
"@memberjunction/ng-resource-permissions": "5.43.0",
|
|
74
|
+
"@memberjunction/ng-search": "5.43.0",
|
|
75
|
+
"@memberjunction/ng-shared": "5.43.0",
|
|
76
|
+
"@memberjunction/ng-shared-generic": "5.43.0",
|
|
77
|
+
"@memberjunction/ng-ui-components": "5.43.0",
|
|
78
|
+
"@memberjunction/ng-user-avatar": "5.43.0",
|
|
79
|
+
"@memberjunction/ng-word-cloud": "5.43.0",
|
|
80
|
+
"@memberjunction/templates-base-types": "5.43.0",
|
|
81
81
|
"golden-layout": "^2.6.0",
|
|
82
82
|
"rxjs": "^7.8.2",
|
|
83
83
|
"tslib": "^2.8.1"
|