@memberjunction/ng-conversations 5.41.0 → 5.42.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/__tests__/remote-browser-channel.test.js +163 -1
- package/dist/__tests__/remote-browser-channel.test.js.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.d.ts +105 -2
- package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.js +1378 -489
- package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +4 -0
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +13 -8
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.d.ts +98 -5
- package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.js +1102 -401
- package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
- package/dist/lib/components/message/message-input.component.js +1 -1
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/project/project-form-modal.component.d.ts +5 -1
- package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -1
- package/dist/lib/components/project/project-form-modal.component.js +104 -85
- package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts +22 -0
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts.map +1 -1
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.js +40 -0
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.js.map +1 -1
- package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts +12 -1
- package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-agent-picker.component.js +97 -19
- package/dist/lib/components/realtime/realtime-agent-picker.component.js.map +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts +33 -0
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts.map +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js +164 -7
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js.map +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.d.ts +35 -2
- package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.js +67 -4
- package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.js.map +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-tools.d.ts +1 -0
- package/dist/lib/components/realtime/remote-browser/remote-browser-tools.d.ts.map +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-tools.js +13 -0
- package/dist/lib/components/realtime/remote-browser/remote-browser-tools.js.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts +4 -0
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.js +13 -8
- package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
- package/dist/lib/services/artifact-state.service.d.ts +1 -1
- package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
- package/dist/lib/services/artifact-state.service.js +7 -2
- package/dist/lib/services/artifact-state.service.js.map +1 -1
- package/dist/lib/services/realtime-pairing.d.ts +8 -7
- package/dist/lib/services/realtime-pairing.d.ts.map +1 -1
- package/dist/lib/services/realtime-pairing.js +19 -9
- package/dist/lib/services/realtime-pairing.js.map +1 -1
- package/package.json +26 -26
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-state.service.js","sourceRoot":"","sources":["../../../src/lib/services/artifact-state.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable, combineLatest } from 'rxjs';\nimport { map, shareReplay } from 'rxjs/operators';\nimport { MJArtifactEntity, MJArtifactVersionEntity } from '@memberjunction/core-entities';\nimport { Metadata, RunView, UserInfo, IMetadataProvider } from '@memberjunction/core';\nimport { ArtifactPermissionService } from './artifact-permission.service';\n\n/**\n * State management for artifacts and the artifact panel\n * Handles artifact CRUD operations and caching with permission enforcement\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ArtifactStateService {\n private _activeArtifactId$ = new BehaviorSubject<string | null>(null);\n private _activeVersionNumber$ = new BehaviorSubject<number | null>(null);\n private _artifacts$ = new BehaviorSubject<Map<string, MJArtifactEntity>>(new Map());\n private _isPanelOpen$ = new BehaviorSubject<boolean>(false);\n private _panelMode$ = new BehaviorSubject<'view' | 'edit'>('view');\n\n // Public observable streams\n public readonly activeArtifactId$ = this._activeArtifactId$.asObservable();\n public readonly activeVersionNumber$ = this._activeVersionNumber$.asObservable();\n public readonly isPanelOpen$ = this._isPanelOpen$.asObservable();\n public readonly panelMode$ = this._panelMode$.asObservable();\n\n // Derived observable for active artifact\n public readonly activeArtifact$: Observable<MJArtifactEntity | null> = combineLatest([\n this.activeArtifactId$,\n this._artifacts$\n ]).pipe(\n map(([id, artifacts]) => id ? artifacts.get(id) || null : null),\n shareReplay(1)\n );\n\n private _provider: IMetadataProvider | null = null;\n\n constructor(private artifactPermissionService: ArtifactPermissionService) {}\n\n /**\n * The metadata provider this service uses. When unset, falls back to Metadata.Provider.\n * Setting it propagates to the dependent artifact-permission service.\n */\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n if (value !== null) {\n this.artifactPermissionService.Provider = value;\n }\n }\n\n /**\n * Check if current user can read an artifact\n * @param artifactId The artifact ID\n * @param currentUser The current user context\n * @returns True if user has read permission\n */\n async canReadArtifact(artifactId: string, currentUser: UserInfo): Promise<boolean> {\n return this.artifactPermissionService.checkPermission(artifactId, currentUser.ID, 'read', currentUser);\n }\n\n /**\n * Check if current user can edit an artifact\n * @param artifactId The artifact ID\n * @param currentUser The current user context\n * @returns True if user has edit permission\n */\n async canEditArtifact(artifactId: string, currentUser: UserInfo): Promise<boolean> {\n return this.artifactPermissionService.checkPermission(artifactId, currentUser.ID, 'edit', currentUser);\n }\n\n /**\n * Check if current user can share an artifact\n * @param artifactId The artifact ID\n * @param currentUser The current user context\n * @returns True if user has share permission\n */\n async canShareArtifact(artifactId: string, currentUser: UserInfo): Promise<boolean> {\n return this.artifactPermissionService.checkPermission(artifactId, currentUser.ID, 'share', currentUser);\n }\n\n /**\n * Opens an artifact in the panel\n * @param id The artifact ID\n * @param versionNumber Optional specific version number\n */\n openArtifact(id: string, versionNumber?: number): void {\n this._activeArtifactId$.next(id);\n this._activeVersionNumber$.next(versionNumber || null);\n this._isPanelOpen$.next(true);\n }\n\n /**\n * Opens an artifact by version ID\n * @param versionId The artifact version ID\n */\n async openArtifactByVersionId(versionId: string): Promise<void> {\n try {\n const md = this.Provider;\n const version = await md.GetEntityObject<MJArtifactVersionEntity>('MJ: Artifact Versions');\n const loaded = await version.Load(versionId);\n\n if (loaded) {\n // Open the artifact with the specific version number\n this.openArtifact(version.ArtifactID, version.VersionNumber);\n } else {\n console.error('Failed to load artifact version:', versionId);\n }\n } catch (error) {\n console.error('Error loading artifact version:', error);\n }\n }\n\n /**\n * Closes the artifact panel\n */\n closeArtifact(): void {\n this._activeArtifactId$.next(null);\n this._activeVersionNumber$.next(null);\n this._isPanelOpen$.next(false);\n this._panelMode$.next('view');\n }\n\n /**\n * Toggles the panel open/closed state\n */\n togglePanel(): void {\n this._isPanelOpen$.next(!this._isPanelOpen$.value);\n }\n\n /**\n * Sets the panel mode\n * @param mode The mode ('view' or 'edit')\n */\n setPanelMode(mode: 'view' | 'edit'): void {\n this._panelMode$.next(mode);\n }\n\n /**\n * Caches an artifact in memory\n * @param artifact The artifact to cache\n */\n cacheArtifact(artifact: MJArtifactEntity): void {\n const current = this._artifacts$.value;\n current.set(artifact.ID, artifact);\n this._artifacts$.next(new Map(current));\n }\n\n /**\n * Removes an artifact from cache\n * @param id The artifact ID\n */\n removeCachedArtifact(id: string): void {\n const current = this._artifacts$.value;\n current.delete(id);\n this._artifacts$.next(new Map(current));\n }\n\n /**\n * Clears all cached artifacts\n */\n clearCache(): void {\n this._artifacts$.next(new Map());\n }\n\n /**\n * Loads artifacts for a conversation\n * @param conversationId The conversation ID\n * @param currentUser The current user context\n * @returns Array of artifacts\n */\n async loadArtifactsForConversation(conversationId: string, currentUser: UserInfo): Promise<MJArtifactEntity[]> {\n try {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<MJArtifactEntity>(\n {\n EntityName: 'MJ: Artifacts',\n ExtraFilter: `ConversationID='${conversationId}'`,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 1000,\n ResultType: 'entity_object'\n },\n currentUser\n );\n\n if (result.Success && result.Results) {\n // Cache all artifacts\n result.Results.forEach(artifact => this.cacheArtifact(artifact));\n return result.Results;\n }\n return [];\n } catch (error) {\n console.error('Error loading artifacts:', error);\n return [];\n }\n }\n\n /**\n * Loads artifacts for a collection\n * @param collectionId The collection ID\n * @param currentUser The current user context\n * @returns Array of artifacts\n */\n async loadArtifactsForCollection(collectionId: string, currentUser: UserInfo): Promise<MJArtifactEntity[]> {\n try {\n const rv = RunView.FromMetadataProvider(this.Provider);\n // Load artifacts through the collection join - use subquery to get artifact IDs from versions\n const artifactsResult = await rv.RunView<MJArtifactEntity>(\n {\n EntityName: 'MJ: Artifacts',\n ExtraFilter: `ID IN (\n SELECT DISTINCT av.ArtifactID\n FROM [__mj].[vwArtifactVersions] av\n INNER JOIN [__mj].[vwCollectionArtifacts] ca ON ca.ArtifactVersionID = av.ID\n WHERE ca.CollectionID = '${collectionId}'\n )`,\n OrderBy: '__mj_CreatedAt DESC',\n ResultType: 'entity_object'\n },\n currentUser\n );\n\n if (artifactsResult.Success && artifactsResult.Results) {\n artifactsResult.Results.forEach(artifact => this.cacheArtifact(artifact));\n return artifactsResult.Results;\n }\n return [];\n } catch (error) {\n console.error('Error loading collection artifacts:', error);\n return [];\n }\n }\n\n /**\n * Loads artifact VERSIONS for a collection (all versions, not deduplicated by artifact ID)\n * This method returns each version as a separate item with its parent artifact metadata\n * @param collectionId The collection ID\n * @param currentUser The current user context\n * @returns Array of objects containing version and parent artifact info\n */\n async loadArtifactVersionsForCollection(\n collectionId: string,\n currentUser: UserInfo\n ): Promise<Array<{ version: MJArtifactVersionEntity; artifact: MJArtifactEntity }>> {\n try {\n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Resolve membership from the join entity directly rather than via a subquery\n // embedded in an Artifact Versions filter. The server RunView cache is invalidated\n // per-entity: removing a Collection Artifacts link does NOT invalidate a cached\n // 'MJ: Artifact Versions' query whose subquery happens to reference the link table,\n // so the removed artifact would keep appearing. Querying the join entity directly\n // means this read is invalidated whenever a link is added or removed.\n const linkResult = await rv.RunView<{ ArtifactVersionID: string }>({\n EntityName: 'MJ: Collection Artifacts',\n ExtraFilter: `CollectionID='${collectionId}'`,\n Fields: ['ArtifactVersionID'],\n ResultType: 'simple'\n }, currentUser);\n\n if (!linkResult.Success) {\n return [];\n }\n\n const versionIds = [...new Set(\n (linkResult.Results ?? [])\n .map(r => r.ArtifactVersionID)\n .filter((id): id is string => !!id)\n )];\n\n if (versionIds.length === 0) {\n return [];\n }\n\n // Load the specific versions that are members of this collection.\n const versionResult = await rv.RunView<MJArtifactVersionEntity>({\n EntityName: 'MJ: Artifact Versions',\n ExtraFilter: `ID IN (${versionIds.map(id => `'${id}'`).join(',')})`,\n OrderBy: '__mj_UpdatedAt DESC',\n ResultType: 'entity_object'\n }, currentUser);\n\n if (!versionResult.Success || !versionResult.Results) {\n return [];\n }\n\n // Load parent artifacts for display metadata\n const artifactIds = [...new Set(versionResult.Results.map(v => v.ArtifactID))];\n const artifactMap = new Map<string, MJArtifactEntity>();\n\n if (artifactIds.length > 0) {\n const artifactFilter = artifactIds.map(id => `ID='${id}'`).join(' OR ');\n const artifactResult = await rv.RunView<MJArtifactEntity>({\n EntityName: 'MJ: Artifacts',\n ExtraFilter: artifactFilter,\n ResultType: 'entity_object'\n }, currentUser);\n\n if (artifactResult.Success && artifactResult.Results) {\n artifactResult.Results.forEach(a => {\n artifactMap.set(a.ID, a);\n this.cacheArtifact(a); // Cache parent artifacts\n });\n }\n }\n\n // Combine version + artifact\n return versionResult.Results\n .map(version => ({\n version,\n artifact: artifactMap.get(version.ArtifactID)!\n }))\n .filter(item => item.artifact != null);\n } catch (error) {\n console.error('Error loading collection artifact versions:', error);\n return [];\n }\n }\n\n /**\n * Loads a single artifact by ID\n * @param id The artifact ID\n * @param currentUser The current user context\n * @returns The artifact entity or null\n */\n async loadArtifact(id: string, currentUser: UserInfo): Promise<MJArtifactEntity | null> {\n try {\n const md = this.Provider;\n const artifact = await md.GetEntityObject<MJArtifactEntity>('MJ: Artifacts', currentUser);\n const loaded = await artifact.Load(id);\n\n if (loaded) {\n this.cacheArtifact(artifact);\n return artifact;\n }\n return null;\n } catch (error) {\n console.error('Error loading artifact:', error);\n return null;\n }\n }\n\n /**\n * Creates a new artifact\n * @param data Artifact data\n * @param currentUser The current user context\n * @returns The created artifact\n */\n async createArtifact(data: Partial<MJArtifactEntity>, currentUser: UserInfo): Promise<MJArtifactEntity> {\n const md = this.Provider;\n const artifact = await md.GetEntityObject<MJArtifactEntity>('MJ: Artifacts', currentUser);\n\n Object.assign(artifact, data);\n\n const saved = await artifact.Save();\n if (saved) {\n this.cacheArtifact(artifact);\n return artifact;\n } else {\n throw new Error(artifact.LatestResult?.Message || 'Failed to create artifact');\n }\n }\n\n /**\n * Updates an artifact\n * @param id The artifact ID\n * @param updates The fields to update\n * @param currentUser The current user context\n * @returns True if successful\n */\n async updateArtifact(id: string, updates: Partial<MJArtifactEntity>, currentUser: UserInfo): Promise<boolean> {\n // Check edit permission\n const canEdit = await this.artifactPermissionService.checkPermission(id, currentUser.ID, 'edit', currentUser);\n if (!canEdit) {\n throw new Error('You do not have permission to edit this artifact');\n }\n\n const md = this.Provider;\n const artifact = await md.GetEntityObject<MJArtifactEntity>('MJ: Artifacts', currentUser);\n\n const loaded = await artifact.Load(id);\n if (!loaded) {\n throw new Error('Artifact not found');\n }\n\n Object.assign(artifact, updates);\n\n const saved = await artifact.Save();\n if (saved) {\n this.cacheArtifact(artifact);\n return true;\n } else {\n throw new Error(artifact.LatestResult?.Message || 'Failed to update artifact');\n }\n }\n\n /**\n * Deletes an artifact\n * @param id The artifact ID\n * @param currentUser The current user context\n * @returns True if successful\n */\n async deleteArtifact(id: string, currentUser: UserInfo): Promise<boolean> {\n // Check edit permission (required for deletion)\n const canEdit = await this.artifactPermissionService.checkPermission(id, currentUser.ID, 'edit', currentUser);\n if (!canEdit) {\n throw new Error('You do not have permission to delete this artifact');\n }\n\n const md = this.Provider;\n const artifact = await md.GetEntityObject<MJArtifactEntity>('MJ: Artifacts', currentUser);\n\n const loaded = await artifact.Load(id);\n if (!loaded) {\n throw new Error('Artifact not found');\n }\n\n const deleted = await artifact.Delete();\n if (deleted) {\n this.removeCachedArtifact(id);\n if (this._activeArtifactId$.value === id) {\n this.closeArtifact();\n }\n return true;\n } else {\n throw new Error(artifact.LatestResult?.Message || 'Failed to delete artifact');\n }\n }\n\n /**\n * Adds an artifact version to a collection\n * @param artifactId The artifact ID (for permission checking)\n * @param collectionId The collection ID\n * @param currentUser The current user context\n * @param versionId Optional specific version ID. If not provided, uses latest version\n */\n async addToCollection(artifactId: string, collectionId: string, currentUser: UserInfo, versionId?: string): Promise<void> {\n // Check edit permission (required to modify collection membership)\n const canEdit = await this.artifactPermissionService.checkPermission(artifactId, currentUser.ID, 'edit', currentUser);\n if (!canEdit) {\n throw new Error('You do not have permission to add this artifact to a collection');\n }\n\n // Get version ID if not provided\n let targetVersionId = versionId;\n if (!targetVersionId) {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const versionResult = await rv.RunView<any>(\n {\n EntityName: 'MJ: Artifact Versions',\n ExtraFilter: `ArtifactID='${artifactId}'`,\n OrderBy: 'VersionNumber DESC',\n MaxRows: 1,\n ResultType: 'entity_object'\n },\n currentUser\n );\n\n if (!versionResult.Success || !versionResult.Results || versionResult.Results.length === 0) {\n throw new Error('No versions found for artifact');\n }\n\n targetVersionId = versionResult.Results[0].ID;\n }\n\n const md = this.Provider;\n const collectionArtifact = await md.GetEntityObject('MJ: Collection Artifacts', currentUser);\n\n (collectionArtifact as any).CollectionID = collectionId;\n (collectionArtifact as any).ArtifactVersionID = targetVersionId;\n\n const saved = await collectionArtifact.Save();\n if (!saved) {\n throw new Error('Failed to add artifact to collection');\n }\n }\n\n /**\n * Removes all versions of an artifact from a collection\n * @param artifactId The artifact ID\n * @param collectionId The collection ID\n * @param currentUser The current user context\n */\n async removeFromCollection(artifactId: string, collectionId: string, currentUser: UserInfo): Promise<void> {\n // Check edit permission (required to modify collection membership)\n const canEdit = await this.artifactPermissionService.checkPermission(artifactId, currentUser.ID, 'edit', currentUser);\n if (!canEdit) {\n throw new Error('You do not have permission to remove this artifact from a collection');\n }\n\n const rv = RunView.FromMetadataProvider(this.Provider);\n // Find all versions of this artifact in the collection\n const result = await rv.RunView<any>(\n {\n EntityName: 'MJ: Collection Artifacts',\n ExtraFilter: `CollectionID='${collectionId}' AND ArtifactVersionID IN (\n SELECT ID FROM [__mj].[vwArtifactVersions] WHERE ArtifactID='${artifactId}'\n )`,\n ResultType: 'entity_object'\n },\n currentUser\n );\n\n if (!result.Success) {\n throw new Error(result.ErrorMessage || 'Failed to find collection artifact');\n }\n\n if (!result.Results || result.Results.length === 0) {\n throw new Error('Collection artifact link not found');\n }\n\n // Delete all version associations\n for (const collectionArtifact of result.Results) {\n const deleted = await collectionArtifact.Delete();\n if (!deleted) {\n const errorMsg = collectionArtifact.LatestResult?.Message || 'Failed to remove artifact from collection';\n throw new Error(errorMsg);\n }\n }\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"artifact-state.service.js","sourceRoot":"","sources":["../../../src/lib/services/artifact-state.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable, combineLatest } from 'rxjs';\nimport { map, shareReplay } from 'rxjs/operators';\nimport { MJArtifactEntity, MJArtifactVersionEntity } from '@memberjunction/core-entities';\nimport { Metadata, RunView, UserInfo, IMetadataProvider } from '@memberjunction/core';\nimport { ArtifactPermissionService } from './artifact-permission.service';\n\n/**\n * State management for artifacts and the artifact panel\n * Handles artifact CRUD operations and caching with permission enforcement\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ArtifactStateService {\n private _activeArtifactId$ = new BehaviorSubject<string | null>(null);\n private _activeVersionNumber$ = new BehaviorSubject<number | null>(null);\n private _artifacts$ = new BehaviorSubject<Map<string, MJArtifactEntity>>(new Map());\n private _isPanelOpen$ = new BehaviorSubject<boolean>(false);\n private _panelMode$ = new BehaviorSubject<'view' | 'edit'>('view');\n\n // Public observable streams\n public readonly activeArtifactId$ = this._activeArtifactId$.asObservable();\n public readonly activeVersionNumber$ = this._activeVersionNumber$.asObservable();\n public readonly isPanelOpen$ = this._isPanelOpen$.asObservable();\n public readonly panelMode$ = this._panelMode$.asObservable();\n\n // Derived observable for active artifact\n public readonly activeArtifact$: Observable<MJArtifactEntity | null> = combineLatest([\n this.activeArtifactId$,\n this._artifacts$\n ]).pipe(\n map(([id, artifacts]) => id ? artifacts.get(id) || null : null),\n shareReplay(1)\n );\n\n private _provider: IMetadataProvider | null = null;\n\n constructor(private artifactPermissionService: ArtifactPermissionService) {}\n\n /**\n * The metadata provider this service uses. When unset, falls back to Metadata.Provider.\n * Setting it propagates to the dependent artifact-permission service.\n */\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n if (value !== null) {\n this.artifactPermissionService.Provider = value;\n }\n }\n\n /**\n * Check if current user can read an artifact\n * @param artifactId The artifact ID\n * @param currentUser The current user context\n * @returns True if user has read permission\n */\n async canReadArtifact(artifactId: string, currentUser: UserInfo): Promise<boolean> {\n return this.artifactPermissionService.checkPermission(artifactId, currentUser.ID, 'read', currentUser);\n }\n\n /**\n * Check if current user can edit an artifact\n * @param artifactId The artifact ID\n * @param currentUser The current user context\n * @returns True if user has edit permission\n */\n async canEditArtifact(artifactId: string, currentUser: UserInfo): Promise<boolean> {\n return this.artifactPermissionService.checkPermission(artifactId, currentUser.ID, 'edit', currentUser);\n }\n\n /**\n * Check if current user can share an artifact\n * @param artifactId The artifact ID\n * @param currentUser The current user context\n * @returns True if user has share permission\n */\n async canShareArtifact(artifactId: string, currentUser: UserInfo): Promise<boolean> {\n return this.artifactPermissionService.checkPermission(artifactId, currentUser.ID, 'share', currentUser);\n }\n\n /**\n * Opens an artifact in the panel\n * @param id The artifact ID\n * @param versionNumber Optional specific version number\n */\n openArtifact(id: string, versionNumber?: number): void {\n this._activeArtifactId$.next(id);\n this._activeVersionNumber$.next(versionNumber || null);\n this._isPanelOpen$.next(true);\n }\n\n /**\n * Opens an artifact by version ID\n * @param versionId The artifact version ID\n */\n async openArtifactByVersionId(versionId: string): Promise<void> {\n try {\n const md = this.Provider;\n const version = await md.GetEntityObject<MJArtifactVersionEntity>('MJ: Artifact Versions');\n const loaded = await version.Load(versionId);\n\n if (loaded) {\n // Open the artifact with the specific version number\n this.openArtifact(version.ArtifactID, version.VersionNumber);\n } else {\n console.error('Failed to load artifact version:', versionId);\n }\n } catch (error) {\n console.error('Error loading artifact version:', error);\n }\n }\n\n /**\n * Closes the artifact panel\n */\n closeArtifact(): void {\n this._activeArtifactId$.next(null);\n this._activeVersionNumber$.next(null);\n this._isPanelOpen$.next(false);\n this._panelMode$.next('view');\n }\n\n /**\n * Toggles the panel open/closed state\n */\n togglePanel(): void {\n this._isPanelOpen$.next(!this._isPanelOpen$.value);\n }\n\n /**\n * Sets the panel mode\n * @param mode The mode ('view' or 'edit')\n */\n setPanelMode(mode: 'view' | 'edit'): void {\n this._panelMode$.next(mode);\n }\n\n /**\n * Caches an artifact in memory\n * @param artifact The artifact to cache\n */\n cacheArtifact(artifact: MJArtifactEntity): void {\n const current = this._artifacts$.value;\n current.set(artifact.ID, artifact);\n this._artifacts$.next(new Map(current));\n }\n\n /**\n * Removes an artifact from cache\n * @param id The artifact ID\n */\n removeCachedArtifact(id: string): void {\n const current = this._artifacts$.value;\n current.delete(id);\n this._artifacts$.next(new Map(current));\n }\n\n /**\n * Clears all cached artifacts\n */\n clearCache(): void {\n this._artifacts$.next(new Map());\n }\n\n /**\n * Loads artifacts for a conversation\n * @param conversationId The conversation ID\n * @param currentUser The current user context\n * @returns Array of artifacts\n */\n async loadArtifactsForConversation(conversationId: string, currentUser: UserInfo): Promise<MJArtifactEntity[]> {\n try {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<MJArtifactEntity>(\n {\n EntityName: 'MJ: Artifacts',\n ExtraFilter: `ConversationID='${conversationId}'`,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 1000,\n ResultType: 'entity_object'\n },\n currentUser\n );\n\n if (result.Success && result.Results) {\n // Cache all artifacts\n result.Results.forEach(artifact => this.cacheArtifact(artifact));\n return result.Results;\n }\n return [];\n } catch (error) {\n console.error('Error loading artifacts:', error);\n return [];\n }\n }\n\n /**\n * Loads artifacts for a collection\n * @param collectionId The collection ID\n * @param currentUser The current user context\n * @returns Array of artifacts\n */\n async loadArtifactsForCollection(collectionId: string, currentUser: UserInfo): Promise<MJArtifactEntity[]> {\n try {\n const rv = RunView.FromMetadataProvider(this.Provider);\n // Load artifacts through the collection join - use subquery to get artifact IDs from versions\n const artifactsResult = await rv.RunView<MJArtifactEntity>(\n {\n EntityName: 'MJ: Artifacts',\n ExtraFilter: `ID IN (\n SELECT DISTINCT av.ArtifactID\n FROM [__mj].[vwArtifactVersions] av\n INNER JOIN [__mj].[vwCollectionArtifacts] ca ON ca.ArtifactVersionID = av.ID\n WHERE ca.CollectionID = '${collectionId}'\n )`,\n OrderBy: '__mj_CreatedAt DESC',\n ResultType: 'entity_object'\n },\n currentUser\n );\n\n if (artifactsResult.Success && artifactsResult.Results) {\n artifactsResult.Results.forEach(artifact => this.cacheArtifact(artifact));\n return artifactsResult.Results;\n }\n return [];\n } catch (error) {\n console.error('Error loading collection artifacts:', error);\n return [];\n }\n }\n\n /**\n * Loads artifact VERSIONS for a collection (all versions, not deduplicated by artifact ID)\n * This method returns each version as a separate item with its parent artifact metadata\n * @param collectionId The collection ID\n * @param currentUser The current user context\n * @returns Array of objects containing version and parent artifact info\n */\n async loadArtifactVersionsForCollection(\n collectionId: string,\n currentUser: UserInfo,\n bypassCache: boolean = false\n ): Promise<Array<{ version: MJArtifactVersionEntity; artifact: MJArtifactEntity }>> {\n try {\n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Resolve membership from the join entity directly rather than via a subquery\n // embedded in an Artifact Versions filter. The server RunView cache is invalidated\n // per-entity: removing a Collection Artifacts link does NOT invalidate a cached\n // 'MJ: Artifact Versions' query whose subquery happens to reference the link table,\n // so the removed artifact would keep appearing. Querying the join entity directly\n // means this read is invalidated whenever a link is added or removed.\n //\n // `bypassCache` is passed right after a move: the link delete's cache invalidation\n // is asynchronous relative to Delete() resolving, so an immediate cached read can\n // still return the old membership. Bypassing reads the committed DB state directly.\n const linkResult = await rv.RunView<{ ArtifactVersionID: string }>({\n EntityName: 'MJ: Collection Artifacts',\n ExtraFilter: `CollectionID='${collectionId}'`,\n Fields: ['ArtifactVersionID'],\n ResultType: 'simple',\n BypassCache: bypassCache\n }, currentUser);\n\n if (!linkResult.Success) {\n return [];\n }\n\n const versionIds = [...new Set(\n (linkResult.Results ?? [])\n .map(r => r.ArtifactVersionID)\n .filter((id): id is string => !!id)\n )];\n\n if (versionIds.length === 0) {\n return [];\n }\n\n // Load the specific versions that are members of this collection.\n const versionResult = await rv.RunView<MJArtifactVersionEntity>({\n EntityName: 'MJ: Artifact Versions',\n ExtraFilter: `ID IN (${versionIds.map(id => `'${id}'`).join(',')})`,\n OrderBy: '__mj_UpdatedAt DESC',\n ResultType: 'entity_object'\n }, currentUser);\n\n if (!versionResult.Success || !versionResult.Results) {\n return [];\n }\n\n // Load parent artifacts for display metadata\n const artifactIds = [...new Set(versionResult.Results.map(v => v.ArtifactID))];\n const artifactMap = new Map<string, MJArtifactEntity>();\n\n if (artifactIds.length > 0) {\n const artifactFilter = artifactIds.map(id => `ID='${id}'`).join(' OR ');\n const artifactResult = await rv.RunView<MJArtifactEntity>({\n EntityName: 'MJ: Artifacts',\n ExtraFilter: artifactFilter,\n ResultType: 'entity_object'\n }, currentUser);\n\n if (artifactResult.Success && artifactResult.Results) {\n artifactResult.Results.forEach(a => {\n artifactMap.set(a.ID, a);\n this.cacheArtifact(a); // Cache parent artifacts\n });\n }\n }\n\n // Combine version + artifact\n return versionResult.Results\n .map(version => ({\n version,\n artifact: artifactMap.get(version.ArtifactID)!\n }))\n .filter(item => item.artifact != null);\n } catch (error) {\n console.error('Error loading collection artifact versions:', error);\n return [];\n }\n }\n\n /**\n * Loads a single artifact by ID\n * @param id The artifact ID\n * @param currentUser The current user context\n * @returns The artifact entity or null\n */\n async loadArtifact(id: string, currentUser: UserInfo): Promise<MJArtifactEntity | null> {\n try {\n const md = this.Provider;\n const artifact = await md.GetEntityObject<MJArtifactEntity>('MJ: Artifacts', currentUser);\n const loaded = await artifact.Load(id);\n\n if (loaded) {\n this.cacheArtifact(artifact);\n return artifact;\n }\n return null;\n } catch (error) {\n console.error('Error loading artifact:', error);\n return null;\n }\n }\n\n /**\n * Creates a new artifact\n * @param data Artifact data\n * @param currentUser The current user context\n * @returns The created artifact\n */\n async createArtifact(data: Partial<MJArtifactEntity>, currentUser: UserInfo): Promise<MJArtifactEntity> {\n const md = this.Provider;\n const artifact = await md.GetEntityObject<MJArtifactEntity>('MJ: Artifacts', currentUser);\n\n Object.assign(artifact, data);\n\n const saved = await artifact.Save();\n if (saved) {\n this.cacheArtifact(artifact);\n return artifact;\n } else {\n throw new Error(artifact.LatestResult?.Message || 'Failed to create artifact');\n }\n }\n\n /**\n * Updates an artifact\n * @param id The artifact ID\n * @param updates The fields to update\n * @param currentUser The current user context\n * @returns True if successful\n */\n async updateArtifact(id: string, updates: Partial<MJArtifactEntity>, currentUser: UserInfo): Promise<boolean> {\n // Check edit permission\n const canEdit = await this.artifactPermissionService.checkPermission(id, currentUser.ID, 'edit', currentUser);\n if (!canEdit) {\n throw new Error('You do not have permission to edit this artifact');\n }\n\n const md = this.Provider;\n const artifact = await md.GetEntityObject<MJArtifactEntity>('MJ: Artifacts', currentUser);\n\n const loaded = await artifact.Load(id);\n if (!loaded) {\n throw new Error('Artifact not found');\n }\n\n Object.assign(artifact, updates);\n\n const saved = await artifact.Save();\n if (saved) {\n this.cacheArtifact(artifact);\n return true;\n } else {\n throw new Error(artifact.LatestResult?.Message || 'Failed to update artifact');\n }\n }\n\n /**\n * Deletes an artifact\n * @param id The artifact ID\n * @param currentUser The current user context\n * @returns True if successful\n */\n async deleteArtifact(id: string, currentUser: UserInfo): Promise<boolean> {\n // Check edit permission (required for deletion)\n const canEdit = await this.artifactPermissionService.checkPermission(id, currentUser.ID, 'edit', currentUser);\n if (!canEdit) {\n throw new Error('You do not have permission to delete this artifact');\n }\n\n const md = this.Provider;\n const artifact = await md.GetEntityObject<MJArtifactEntity>('MJ: Artifacts', currentUser);\n\n const loaded = await artifact.Load(id);\n if (!loaded) {\n throw new Error('Artifact not found');\n }\n\n const deleted = await artifact.Delete();\n if (deleted) {\n this.removeCachedArtifact(id);\n if (this._activeArtifactId$.value === id) {\n this.closeArtifact();\n }\n return true;\n } else {\n throw new Error(artifact.LatestResult?.Message || 'Failed to delete artifact');\n }\n }\n\n /**\n * Adds an artifact version to a collection\n * @param artifactId The artifact ID (for permission checking)\n * @param collectionId The collection ID\n * @param currentUser The current user context\n * @param versionId Optional specific version ID. If not provided, uses latest version\n */\n async addToCollection(artifactId: string, collectionId: string, currentUser: UserInfo, versionId?: string): Promise<void> {\n // Check edit permission (required to modify collection membership)\n const canEdit = await this.artifactPermissionService.checkPermission(artifactId, currentUser.ID, 'edit', currentUser);\n if (!canEdit) {\n throw new Error('You do not have permission to add this artifact to a collection');\n }\n\n // Get version ID if not provided\n let targetVersionId = versionId;\n if (!targetVersionId) {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const versionResult = await rv.RunView<any>(\n {\n EntityName: 'MJ: Artifact Versions',\n ExtraFilter: `ArtifactID='${artifactId}'`,\n OrderBy: 'VersionNumber DESC',\n MaxRows: 1,\n ResultType: 'entity_object'\n },\n currentUser\n );\n\n if (!versionResult.Success || !versionResult.Results || versionResult.Results.length === 0) {\n throw new Error('No versions found for artifact');\n }\n\n targetVersionId = versionResult.Results[0].ID;\n }\n\n const md = this.Provider;\n const collectionArtifact = await md.GetEntityObject('MJ: Collection Artifacts', currentUser);\n\n (collectionArtifact as any).CollectionID = collectionId;\n (collectionArtifact as any).ArtifactVersionID = targetVersionId;\n\n const saved = await collectionArtifact.Save();\n if (!saved) {\n throw new Error('Failed to add artifact to collection');\n }\n }\n\n /**\n * Removes all versions of an artifact from a collection\n * @param artifactId The artifact ID\n * @param collectionId The collection ID\n * @param currentUser The current user context\n */\n async removeFromCollection(artifactId: string, collectionId: string, currentUser: UserInfo): Promise<void> {\n // Check edit permission (required to modify collection membership)\n const canEdit = await this.artifactPermissionService.checkPermission(artifactId, currentUser.ID, 'edit', currentUser);\n if (!canEdit) {\n throw new Error('You do not have permission to remove this artifact from a collection');\n }\n\n const rv = RunView.FromMetadataProvider(this.Provider);\n // Find all versions of this artifact in the collection\n const result = await rv.RunView<any>(\n {\n EntityName: 'MJ: Collection Artifacts',\n ExtraFilter: `CollectionID='${collectionId}' AND ArtifactVersionID IN (\n SELECT ID FROM [__mj].[vwArtifactVersions] WHERE ArtifactID='${artifactId}'\n )`,\n ResultType: 'entity_object'\n },\n currentUser\n );\n\n if (!result.Success) {\n throw new Error(result.ErrorMessage || 'Failed to find collection artifact');\n }\n\n if (!result.Results || result.Results.length === 0) {\n throw new Error('Collection artifact link not found');\n }\n\n // Delete all version associations\n for (const collectionArtifact of result.Results) {\n const deleted = await collectionArtifact.Delete();\n if (!deleted) {\n const errorMsg = collectionArtifact.LatestResult?.Message || 'Failed to remove artifact from collection';\n throw new Error(errorMsg);\n }\n }\n }\n}"]}
|
|
@@ -108,13 +108,14 @@ export interface VoiceModelCandidate {
|
|
|
108
108
|
export declare function BuildRealtimeModelOptions(models: ReadonlyArray<VoiceModelCandidate>): RealtimeModelOption[];
|
|
109
109
|
/**
|
|
110
110
|
* Builds the `configOverridesJson` payload for the `StartRealtimeClientSession` mint from
|
|
111
|
-
* what the (authorization-gated) pickers chose
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
*
|
|
111
|
+
* what the (authorization-gated) pickers chose — an explicit realtime model preference and/or a
|
|
112
|
+
* per-provider voice. The envelope (`{"realtime":{"modelPreference":"<id>","voice":{"providers":
|
|
113
|
+
* {"openai":{"voice":"<v>"}}}}}`) is the pinned server contract, merged into the effective config
|
|
114
|
+
* server-side (highest precedence).
|
|
115
115
|
*
|
|
116
|
-
* @
|
|
117
|
-
*
|
|
116
|
+
* @param preferredModelId The explicit `MJ: AI Models` id, or null/empty for none.
|
|
117
|
+
* @param preferredVoice The provider-native voice id (e.g. `echo`), or null/empty for none.
|
|
118
|
+
* @returns The JSON string, or `null` when nothing was overridden (keeps the mint identical to default).
|
|
118
119
|
*/
|
|
119
|
-
export declare function BuildRealtimeConfigOverridesJson(preferredModelId: string | null | undefined): string | null;
|
|
120
|
+
export declare function BuildRealtimeConfigOverridesJson(preferredModelId: string | null | undefined, preferredVoice?: string | null | undefined): string | null;
|
|
120
121
|
//# sourceMappingURL=realtime-pairing.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"realtime-pairing.d.ts","sourceRoot":"","sources":["../../../src/lib/services/realtime-pairing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAIzD;;;;;;;;;GASG;AACH,MAAM,WAAW,sBAAsB;IACrC,0BAA0B;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,aAAa,EAAE,MAAM,CAAC;IACtB,mEAAmE;IACnE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,mFAAmF;IACnF,SAAS,EAAE,OAAO,CAAC;IACnB,iDAAiD;IACjD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,wEAAwE;AACxE,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC,CA2B3H;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,SAAS,sBAAsB,EAAE,GAAG,sBAAsB,EAAE,CASlG;AAED;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,SAAS,iBAAiB,EACpE,MAAM,EAAE,SAAS,CAAC,EAAE,EACpB,QAAQ,EAAE,SAAS,sBAAsB,EAAE,GAC1C,CAAC,EAAE,CAmBL;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,SAAS,sBAAsB,EAAE,GAAG,MAAM,GAAG,IAAI,CAOhG;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,SAAS,sBAAsB,EAAE,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAQlI;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAEnG;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,kCAAkC;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,kCAAkC;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,kDAAkD;IAClD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,aAAa,CAAC,mBAAmB,CAAC,GAAG,mBAAmB,EAAE,CAK3G;AAED
|
|
1
|
+
{"version":3,"file":"realtime-pairing.d.ts","sourceRoot":"","sources":["../../../src/lib/services/realtime-pairing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAIzD;;;;;;;;;GASG;AACH,MAAM,WAAW,sBAAsB;IACrC,0BAA0B;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,aAAa,EAAE,MAAM,CAAC;IACtB,mEAAmE;IACnE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,mFAAmF;IACnF,SAAS,EAAE,OAAO,CAAC;IACnB,iDAAiD;IACjD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,wEAAwE;AACxE,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC,CA2B3H;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,SAAS,sBAAsB,EAAE,GAAG,sBAAsB,EAAE,CASlG;AAED;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,SAAS,iBAAiB,EACpE,MAAM,EAAE,SAAS,CAAC,EAAE,EACpB,QAAQ,EAAE,SAAS,sBAAsB,EAAE,GAC1C,CAAC,EAAE,CAmBL;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,SAAS,sBAAsB,EAAE,GAAG,MAAM,GAAG,IAAI,CAOhG;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,SAAS,sBAAsB,EAAE,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAQlI;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAEnG;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,kCAAkC;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,kCAAkC;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,kDAAkD;IAClD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,aAAa,CAAC,mBAAmB,CAAC,GAAG,mBAAmB,EAAE,CAK3G;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gCAAgC,CAC9C,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC3C,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACzC,MAAM,GAAG,IAAI,CAef"}
|
|
@@ -132,19 +132,29 @@ export function BuildRealtimeModelOptions(models) {
|
|
|
132
132
|
}
|
|
133
133
|
/**
|
|
134
134
|
* Builds the `configOverridesJson` payload for the `StartRealtimeClientSession` mint from
|
|
135
|
-
* what the (authorization-gated) pickers chose
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
135
|
+
* what the (authorization-gated) pickers chose — an explicit realtime model preference and/or a
|
|
136
|
+
* per-provider voice. The envelope (`{"realtime":{"modelPreference":"<id>","voice":{"providers":
|
|
137
|
+
* {"openai":{"voice":"<v>"}}}}}`) is the pinned server contract, merged into the effective config
|
|
138
|
+
* server-side (highest precedence).
|
|
139
139
|
*
|
|
140
|
-
* @
|
|
141
|
-
*
|
|
140
|
+
* @param preferredModelId The explicit `MJ: AI Models` id, or null/empty for none.
|
|
141
|
+
* @param preferredVoice The provider-native voice id (e.g. `echo`), or null/empty for none.
|
|
142
|
+
* @returns The JSON string, or `null` when nothing was overridden (keeps the mint identical to default).
|
|
142
143
|
*/
|
|
143
|
-
export function BuildRealtimeConfigOverridesJson(preferredModelId) {
|
|
144
|
+
export function BuildRealtimeConfigOverridesJson(preferredModelId, preferredVoice) {
|
|
144
145
|
const modelId = preferredModelId?.trim() ?? '';
|
|
145
|
-
|
|
146
|
+
const voice = preferredVoice?.trim() ?? '';
|
|
147
|
+
if (modelId.length === 0 && voice.length === 0) {
|
|
146
148
|
return null;
|
|
147
149
|
}
|
|
148
|
-
|
|
150
|
+
const realtime = {};
|
|
151
|
+
if (modelId.length > 0) {
|
|
152
|
+
realtime.modelPreference = modelId;
|
|
153
|
+
}
|
|
154
|
+
if (voice.length > 0) {
|
|
155
|
+
// Per-provider voice shape matches GetProviderVoiceSettings; `openai` is the realtime provider today.
|
|
156
|
+
realtime.voice = { providers: { openai: { voice } } };
|
|
157
|
+
}
|
|
158
|
+
return JSON.stringify({ realtime });
|
|
149
159
|
}
|
|
150
160
|
//# sourceMappingURL=realtime-pairing.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"realtime-pairing.js","sourceRoot":"","sources":["../../../src/lib/services/realtime-pairing.ts"],"names":[],"mappings":"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","sourcesContent":["import { IMetadataProvider } from '@memberjunction/core';\nimport { NormalizeUUID, UUIDsEqual } from '@memberjunction/global';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\n\n/**\n * The narrow read-only projection of an `MJ: AI Agent Co Agents` row the voice UI consumes\n * (loaded via {@link LoadCoAgentPairings} from {@link AIEngineBase}'s cached `AgentCoAgents`;\n * only **Active** rows of relationship **Type `'CoAgent'`** with a specific agent target —\n * type-level rows express the resolution-chain default, not a target restriction, and\n * reserved relationship types are ignored until their features ship). Pairing semantics: a\n * co-agent with ZERO such rows is **universal** (it can front any target agent — the\n * zero-config default); a co-agent WITH rows may front exactly the listed targets, with the\n * `IsDefault` row as its preselected target.\n */\nexport interface RealtimePairedAgentRow {\n /** The pairing row id. */\n ID: string;\n /** The Realtime-type co-agent the pairing belongs to. */\n CoAgentID: string;\n /** The target agent this co-agent may front. */\n TargetAgentID: string;\n /** Denormalized target-agent display name (from the base view). */\n TargetAgent: string | null;\n /** When true, this target is the co-agent's default (at most one per co-agent). */\n IsDefault: boolean;\n /** Display/list ordering of the pairing rows. */\n Sequence: number | null;\n}\n\n/** Minimal agent shape the pure pairing/co-agent helpers operate on. */\nexport interface RealtimeAgentLike {\n ID: string;\n}\n\n/**\n * Loads the pairing rows for one co-agent from {@link AIEngineBase}'s cached\n * `MJ: AI Agent Co Agents` metadata (provider-scoped engine instance, lazy `Config`),\n * in `Sequence` order. The engine's BaseEntity-event reactivity keeps the cache fresh —\n * no per-call RunView round-trip.\n *\n * Tolerant by design: any failure degrades to an EMPTY list — i.e. \"no pairing\n * constraint\". The client gate is pure disclosure; the server independently validates\n * the co-agent/target pairing at session mint.\n */\nexport async function LoadCoAgentPairings(provider: IMetadataProvider, coAgentId: string): Promise<RealtimePairedAgentRow[]> {\n const id = coAgentId?.trim() ?? '';\n if (id.length === 0) {\n return [];\n }\n try {\n const engine = AIEngineBase.GetProviderInstance<AIEngineBase>(provider, AIEngineBase) as AIEngineBase;\n await engine.Config(false, undefined, provider);\n const rows = (engine.AgentCoAgents ?? [])\n .filter(p =>\n p.Type === 'CoAgent' &&\n p.Status === 'Active' &&\n p.TargetAgentID != null &&\n UUIDsEqual(p.CoAgentID, id))\n .map<RealtimePairedAgentRow>(p => ({\n ID: p.ID,\n CoAgentID: p.CoAgentID,\n TargetAgentID: p.TargetAgentID!,\n TargetAgent: p.TargetAgent ?? null,\n IsDefault: p.IsDefault,\n Sequence: p.Sequence ?? null\n }));\n return SortPairings(rows);\n } catch (error) {\n console.warn('[RealtimePairing] Co-agent pairing lookup unavailable — treating co-agent as universal:', error);\n return [];\n }\n}\n\n/**\n * Returns the pairing rows in canonical display order: `Sequence` ascending (null/missing\n * sequences last), ties broken by target-agent name. Pure; never mutates the input.\n */\nexport function SortPairings(pairings: readonly RealtimePairedAgentRow[]): RealtimePairedAgentRow[] {\n return [...pairings].sort((a, b) => {\n const aSeq = a.Sequence ?? Number.MAX_SAFE_INTEGER;\n const bSeq = b.Sequence ?? Number.MAX_SAFE_INTEGER;\n if (aSeq !== bSeq) {\n return aSeq - bSeq;\n }\n return (a.TargetAgent ?? '').localeCompare(b.TargetAgent ?? '');\n });\n}\n\n/**\n * Applies the pairing constraint to a candidate target-agent list:\n * - ZERO pairing rows → the co-agent is universal; the candidates are returned unchanged\n * (today's flow untouched).\n * - One or more rows → only candidates that appear among the pairing targets are\n * returned, ordered by the pairings' `Sequence`. Paired targets the user can't see /\n * run (absent from `agents`) are silently dropped.\n *\n * Pure and UUID-casing safe (`NormalizeUUID` keys).\n */\nexport function ConstrainTargetsToPairings<T extends RealtimeAgentLike>(\n agents: readonly T[],\n pairings: readonly RealtimePairedAgentRow[]\n): T[] {\n if (!pairings || pairings.length === 0) {\n return [...agents];\n }\n const agentsById = new Map<string, T>();\n for (const agent of agents) {\n agentsById.set(NormalizeUUID(agent.ID), agent);\n }\n const constrained: T[] = [];\n const seen = new Set<string>();\n for (const pairing of SortPairings(pairings)) {\n const key = NormalizeUUID(pairing.TargetAgentID);\n const agent = agentsById.get(key);\n if (agent && !seen.has(key)) {\n seen.add(key);\n constrained.push(agent);\n }\n }\n return constrained;\n}\n\n/**\n * The co-agent's default target from its pairing rows — the first `IsDefault` row in\n * `Sequence` order (server enforces at most one, but the helper stays deterministic\n * regardless). `null` when there are no rows or none is marked default.\n */\nexport function DefaultPairedTargetId(pairings: readonly RealtimePairedAgentRow[]): string | null {\n for (const pairing of SortPairings(pairings ?? [])) {\n if (pairing.IsDefault) {\n return pairing.TargetAgentID;\n }\n }\n return null;\n}\n\n/**\n * Whether the pairing rows permit `targetAgentId` as a target. ZERO rows means the\n * co-agent is universal (always allowed); otherwise the target must appear among the\n * rows. Missing/empty target id is never allowed against a constrained co-agent.\n */\nexport function PairingsAllowTarget(pairings: readonly RealtimePairedAgentRow[], targetAgentId: string | null | undefined): boolean {\n if (!pairings || pairings.length === 0) {\n return true;\n }\n if (!targetAgentId) {\n return false;\n }\n return pairings.some(p => UUIDsEqual(p.TargetAgentID, targetAgentId));\n}\n\n/**\n * Filters an agent list down to ACTIVE Realtime-type **co-agent** candidates. The input\n * is expected to already be the run-permission-filtered active-agent set the host uses\n * for routing/@mentions, so this only applies the agent-TYPE cut (trim +\n * case-insensitive match on the denormalized `Type` name).\n */\nexport function FilterRealtimeCoAgents<T extends { Type: string | null }>(agents: readonly T[]): T[] {\n return agents.filter(a => (a.Type ?? '').trim().toLowerCase() === 'realtime');\n}\n\n/**\n * A selectable realtime model option in the voice picker (narrow read-only projection of\n * `MJ: AI Models` — only the fields the dropdown renders).\n */\nexport interface RealtimeModelOption {\n /** The `MJ: AI Models` row id. */\n ID: string;\n /** The model's display name. */\n Name: string;\n}\n\n/**\n * The minimal `MJ: AI Models` row shape {@link BuildRealtimeModelOptions} consumes —\n * structurally satisfied by `AIEngineBase`'s cached `Models` entities.\n */\nexport interface VoiceModelCandidate {\n /** The `MJ: AI Models` row id. */\n ID: string;\n /** The model's display name. */\n Name: string;\n /** Denormalized model-type name (e.g. 'LLM', 'Realtime'). */\n AIModelType: string | null;\n /** Whether the model is active and selectable. */\n IsActive: boolean;\n}\n\n/**\n * Builds the \"Voice model\" dropdown options from a cached model list: ACTIVE models whose\n * type is `Realtime` (trim + case-insensitive — SQL-collation parity with the previous\n * `IsActive = 1 AND AIModelType = 'Realtime'` filter), projected to {@link RealtimeModelOption}\n * and sorted by Name. Pure; never mutates the input.\n */\nexport function BuildRealtimeModelOptions(models: ReadonlyArray<VoiceModelCandidate>): RealtimeModelOption[] {\n return models\n .filter(m => m.IsActive && (m.AIModelType ?? '').trim().toLowerCase() === 'realtime')\n .map<RealtimeModelOption>(m => ({ ID: m.ID, Name: m.Name }))\n .sort((a, b) => (a.Name ?? '').localeCompare(b.Name ?? ''));\n}\n\n/**\n * Builds the `configOverridesJson` payload for the `StartRealtimeClientSession` mint from\n * what the (authorization-gated) pickers chose. Currently the only override is the\n * explicit realtime model preference; the envelope shape —\n * `{\"realtime\":{\"modelPreference\":\"<id>\"}}` — is the pinned server contract and is\n * structured so future overrides ride alongside without reshaping.\n *\n * @returns The JSON string, or `null` when nothing was overridden (the common case —\n * `null` keeps the mint identical to today's behavior).\n */\nexport function BuildRealtimeConfigOverridesJson(preferredModelId: string | null | undefined): string | null {\n const modelId = preferredModelId?.trim() ?? '';\n if (modelId.length === 0) {\n return null;\n }\n return JSON.stringify({ realtime: { modelPreference: modelId } });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"realtime-pairing.js","sourceRoot":"","sources":["../../../src/lib/services/realtime-pairing.ts"],"names":[],"mappings":"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","sourcesContent":["import { IMetadataProvider } from '@memberjunction/core';\nimport { NormalizeUUID, UUIDsEqual } from '@memberjunction/global';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\n\n/**\n * The narrow read-only projection of an `MJ: AI Agent Co Agents` row the voice UI consumes\n * (loaded via {@link LoadCoAgentPairings} from {@link AIEngineBase}'s cached `AgentCoAgents`;\n * only **Active** rows of relationship **Type `'CoAgent'`** with a specific agent target —\n * type-level rows express the resolution-chain default, not a target restriction, and\n * reserved relationship types are ignored until their features ship). Pairing semantics: a\n * co-agent with ZERO such rows is **universal** (it can front any target agent — the\n * zero-config default); a co-agent WITH rows may front exactly the listed targets, with the\n * `IsDefault` row as its preselected target.\n */\nexport interface RealtimePairedAgentRow {\n /** The pairing row id. */\n ID: string;\n /** The Realtime-type co-agent the pairing belongs to. */\n CoAgentID: string;\n /** The target agent this co-agent may front. */\n TargetAgentID: string;\n /** Denormalized target-agent display name (from the base view). */\n TargetAgent: string | null;\n /** When true, this target is the co-agent's default (at most one per co-agent). */\n IsDefault: boolean;\n /** Display/list ordering of the pairing rows. */\n Sequence: number | null;\n}\n\n/** Minimal agent shape the pure pairing/co-agent helpers operate on. */\nexport interface RealtimeAgentLike {\n ID: string;\n}\n\n/**\n * Loads the pairing rows for one co-agent from {@link AIEngineBase}'s cached\n * `MJ: AI Agent Co Agents` metadata (provider-scoped engine instance, lazy `Config`),\n * in `Sequence` order. The engine's BaseEntity-event reactivity keeps the cache fresh —\n * no per-call RunView round-trip.\n *\n * Tolerant by design: any failure degrades to an EMPTY list — i.e. \"no pairing\n * constraint\". The client gate is pure disclosure; the server independently validates\n * the co-agent/target pairing at session mint.\n */\nexport async function LoadCoAgentPairings(provider: IMetadataProvider, coAgentId: string): Promise<RealtimePairedAgentRow[]> {\n const id = coAgentId?.trim() ?? '';\n if (id.length === 0) {\n return [];\n }\n try {\n const engine = AIEngineBase.GetProviderInstance<AIEngineBase>(provider, AIEngineBase) as AIEngineBase;\n await engine.Config(false, undefined, provider);\n const rows = (engine.AgentCoAgents ?? [])\n .filter(p =>\n p.Type === 'CoAgent' &&\n p.Status === 'Active' &&\n p.TargetAgentID != null &&\n UUIDsEqual(p.CoAgentID, id))\n .map<RealtimePairedAgentRow>(p => ({\n ID: p.ID,\n CoAgentID: p.CoAgentID,\n TargetAgentID: p.TargetAgentID!,\n TargetAgent: p.TargetAgent ?? null,\n IsDefault: p.IsDefault,\n Sequence: p.Sequence ?? null\n }));\n return SortPairings(rows);\n } catch (error) {\n console.warn('[RealtimePairing] Co-agent pairing lookup unavailable — treating co-agent as universal:', error);\n return [];\n }\n}\n\n/**\n * Returns the pairing rows in canonical display order: `Sequence` ascending (null/missing\n * sequences last), ties broken by target-agent name. Pure; never mutates the input.\n */\nexport function SortPairings(pairings: readonly RealtimePairedAgentRow[]): RealtimePairedAgentRow[] {\n return [...pairings].sort((a, b) => {\n const aSeq = a.Sequence ?? Number.MAX_SAFE_INTEGER;\n const bSeq = b.Sequence ?? Number.MAX_SAFE_INTEGER;\n if (aSeq !== bSeq) {\n return aSeq - bSeq;\n }\n return (a.TargetAgent ?? '').localeCompare(b.TargetAgent ?? '');\n });\n}\n\n/**\n * Applies the pairing constraint to a candidate target-agent list:\n * - ZERO pairing rows → the co-agent is universal; the candidates are returned unchanged\n * (today's flow untouched).\n * - One or more rows → only candidates that appear among the pairing targets are\n * returned, ordered by the pairings' `Sequence`. Paired targets the user can't see /\n * run (absent from `agents`) are silently dropped.\n *\n * Pure and UUID-casing safe (`NormalizeUUID` keys).\n */\nexport function ConstrainTargetsToPairings<T extends RealtimeAgentLike>(\n agents: readonly T[],\n pairings: readonly RealtimePairedAgentRow[]\n): T[] {\n if (!pairings || pairings.length === 0) {\n return [...agents];\n }\n const agentsById = new Map<string, T>();\n for (const agent of agents) {\n agentsById.set(NormalizeUUID(agent.ID), agent);\n }\n const constrained: T[] = [];\n const seen = new Set<string>();\n for (const pairing of SortPairings(pairings)) {\n const key = NormalizeUUID(pairing.TargetAgentID);\n const agent = agentsById.get(key);\n if (agent && !seen.has(key)) {\n seen.add(key);\n constrained.push(agent);\n }\n }\n return constrained;\n}\n\n/**\n * The co-agent's default target from its pairing rows — the first `IsDefault` row in\n * `Sequence` order (server enforces at most one, but the helper stays deterministic\n * regardless). `null` when there are no rows or none is marked default.\n */\nexport function DefaultPairedTargetId(pairings: readonly RealtimePairedAgentRow[]): string | null {\n for (const pairing of SortPairings(pairings ?? [])) {\n if (pairing.IsDefault) {\n return pairing.TargetAgentID;\n }\n }\n return null;\n}\n\n/**\n * Whether the pairing rows permit `targetAgentId` as a target. ZERO rows means the\n * co-agent is universal (always allowed); otherwise the target must appear among the\n * rows. Missing/empty target id is never allowed against a constrained co-agent.\n */\nexport function PairingsAllowTarget(pairings: readonly RealtimePairedAgentRow[], targetAgentId: string | null | undefined): boolean {\n if (!pairings || pairings.length === 0) {\n return true;\n }\n if (!targetAgentId) {\n return false;\n }\n return pairings.some(p => UUIDsEqual(p.TargetAgentID, targetAgentId));\n}\n\n/**\n * Filters an agent list down to ACTIVE Realtime-type **co-agent** candidates. The input\n * is expected to already be the run-permission-filtered active-agent set the host uses\n * for routing/@mentions, so this only applies the agent-TYPE cut (trim +\n * case-insensitive match on the denormalized `Type` name).\n */\nexport function FilterRealtimeCoAgents<T extends { Type: string | null }>(agents: readonly T[]): T[] {\n return agents.filter(a => (a.Type ?? '').trim().toLowerCase() === 'realtime');\n}\n\n/**\n * A selectable realtime model option in the voice picker (narrow read-only projection of\n * `MJ: AI Models` — only the fields the dropdown renders).\n */\nexport interface RealtimeModelOption {\n /** The `MJ: AI Models` row id. */\n ID: string;\n /** The model's display name. */\n Name: string;\n}\n\n/**\n * The minimal `MJ: AI Models` row shape {@link BuildRealtimeModelOptions} consumes —\n * structurally satisfied by `AIEngineBase`'s cached `Models` entities.\n */\nexport interface VoiceModelCandidate {\n /** The `MJ: AI Models` row id. */\n ID: string;\n /** The model's display name. */\n Name: string;\n /** Denormalized model-type name (e.g. 'LLM', 'Realtime'). */\n AIModelType: string | null;\n /** Whether the model is active and selectable. */\n IsActive: boolean;\n}\n\n/**\n * Builds the \"Voice model\" dropdown options from a cached model list: ACTIVE models whose\n * type is `Realtime` (trim + case-insensitive — SQL-collation parity with the previous\n * `IsActive = 1 AND AIModelType = 'Realtime'` filter), projected to {@link RealtimeModelOption}\n * and sorted by Name. Pure; never mutates the input.\n */\nexport function BuildRealtimeModelOptions(models: ReadonlyArray<VoiceModelCandidate>): RealtimeModelOption[] {\n return models\n .filter(m => m.IsActive && (m.AIModelType ?? '').trim().toLowerCase() === 'realtime')\n .map<RealtimeModelOption>(m => ({ ID: m.ID, Name: m.Name }))\n .sort((a, b) => (a.Name ?? '').localeCompare(b.Name ?? ''));\n}\n\n/**\n * Builds the `configOverridesJson` payload for the `StartRealtimeClientSession` mint from\n * what the (authorization-gated) pickers chose — an explicit realtime model preference and/or a\n * per-provider voice. The envelope (`{\"realtime\":{\"modelPreference\":\"<id>\",\"voice\":{\"providers\":\n * {\"openai\":{\"voice\":\"<v>\"}}}}}`) is the pinned server contract, merged into the effective config\n * server-side (highest precedence).\n *\n * @param preferredModelId The explicit `MJ: AI Models` id, or null/empty for none.\n * @param preferredVoice The provider-native voice id (e.g. `echo`), or null/empty for none.\n * @returns The JSON string, or `null` when nothing was overridden (keeps the mint identical to default).\n */\nexport function BuildRealtimeConfigOverridesJson(\n preferredModelId: string | null | undefined,\n preferredVoice?: string | null | undefined,\n): string | null {\n const modelId = preferredModelId?.trim() ?? '';\n const voice = preferredVoice?.trim() ?? '';\n if (modelId.length === 0 && voice.length === 0) {\n return null;\n }\n const realtime: { modelPreference?: string; voice?: { providers: Record<string, { voice: string }> } } = {};\n if (modelId.length > 0) {\n realtime.modelPreference = modelId;\n }\n if (voice.length > 0) {\n // Per-provider voice shape matches GetProviderVoiceSettings; `openai` is the realtime provider today.\n realtime.voice = { providers: { openai: { voice } } };\n }\n return JSON.stringify({ realtime });\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-conversations",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.42.0",
|
|
4
4
|
"description": "MemberJunction: Conversation, Collection, and Artifact management components for any Angular application",
|
|
5
5
|
"main": "./dist/public-api.js",
|
|
6
6
|
"typings": "./dist/public-api.d.ts",
|
|
@@ -31,31 +31,31 @@
|
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@angular/animations": "21.1.3",
|
|
33
33
|
"@angular/cdk": "21.1.3",
|
|
34
|
-
"@memberjunction/ai": "5.
|
|
35
|
-
"@memberjunction/ai-agent-client": "5.
|
|
36
|
-
"@memberjunction/ai-core-plus": "5.
|
|
37
|
-
"@memberjunction/ai-engine-base": "5.
|
|
38
|
-
"@memberjunction/ai-realtime-client": "5.
|
|
39
|
-
"@memberjunction/conversations-runtime": "5.
|
|
40
|
-
"@memberjunction/core": "5.
|
|
41
|
-
"@memberjunction/core-entities": "5.
|
|
42
|
-
"@memberjunction/global": "5.
|
|
43
|
-
"@memberjunction/graphql-dataprovider": "5.
|
|
44
|
-
"@memberjunction/interactive-component-types": "5.
|
|
45
|
-
"@memberjunction/ng-agent-client": "5.
|
|
46
|
-
"@memberjunction/ng-artifacts": "5.
|
|
47
|
-
"@memberjunction/ng-base-types": "5.
|
|
48
|
-
"@memberjunction/ng-code-editor": "5.
|
|
49
|
-
"@memberjunction/ng-container-directives": "5.
|
|
50
|
-
"@memberjunction/ng-forms": "5.
|
|
51
|
-
"@memberjunction/ng-markdown": "5.
|
|
52
|
-
"@memberjunction/ng-notifications": "5.
|
|
53
|
-
"@memberjunction/ng-resource-permissions": "5.
|
|
54
|
-
"@memberjunction/ng-shared-generic": "5.
|
|
55
|
-
"@memberjunction/ng-tasks": "5.
|
|
56
|
-
"@memberjunction/ng-testing": "5.
|
|
57
|
-
"@memberjunction/ng-ui-components": "5.
|
|
58
|
-
"@memberjunction/ng-whiteboard": "5.
|
|
34
|
+
"@memberjunction/ai": "5.42.0",
|
|
35
|
+
"@memberjunction/ai-agent-client": "5.42.0",
|
|
36
|
+
"@memberjunction/ai-core-plus": "5.42.0",
|
|
37
|
+
"@memberjunction/ai-engine-base": "5.42.0",
|
|
38
|
+
"@memberjunction/ai-realtime-client": "5.42.0",
|
|
39
|
+
"@memberjunction/conversations-runtime": "5.42.0",
|
|
40
|
+
"@memberjunction/core": "5.42.0",
|
|
41
|
+
"@memberjunction/core-entities": "5.42.0",
|
|
42
|
+
"@memberjunction/global": "5.42.0",
|
|
43
|
+
"@memberjunction/graphql-dataprovider": "5.42.0",
|
|
44
|
+
"@memberjunction/interactive-component-types": "5.42.0",
|
|
45
|
+
"@memberjunction/ng-agent-client": "5.42.0",
|
|
46
|
+
"@memberjunction/ng-artifacts": "5.42.0",
|
|
47
|
+
"@memberjunction/ng-base-types": "5.42.0",
|
|
48
|
+
"@memberjunction/ng-code-editor": "5.42.0",
|
|
49
|
+
"@memberjunction/ng-container-directives": "5.42.0",
|
|
50
|
+
"@memberjunction/ng-forms": "5.42.0",
|
|
51
|
+
"@memberjunction/ng-markdown": "5.42.0",
|
|
52
|
+
"@memberjunction/ng-notifications": "5.42.0",
|
|
53
|
+
"@memberjunction/ng-resource-permissions": "5.42.0",
|
|
54
|
+
"@memberjunction/ng-shared-generic": "5.42.0",
|
|
55
|
+
"@memberjunction/ng-tasks": "5.42.0",
|
|
56
|
+
"@memberjunction/ng-testing": "5.42.0",
|
|
57
|
+
"@memberjunction/ng-ui-components": "5.42.0",
|
|
58
|
+
"@memberjunction/ng-whiteboard": "5.42.0",
|
|
59
59
|
"rxjs": "^7.8.2",
|
|
60
60
|
"tslib": "^2.8.1"
|
|
61
61
|
},
|