@memberjunction/ng-conversations 5.30.1 → 5.31.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.
Files changed (124) hide show
  1. package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts +2 -1
  2. package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts.map +1 -1
  3. package/dist/lib/components/collection/artifact-collection-picker-modal.component.js +9 -6
  4. package/dist/lib/components/collection/artifact-collection-picker-modal.component.js.map +1 -1
  5. package/dist/lib/components/collection/artifact-create-modal.component.d.ts +2 -1
  6. package/dist/lib/components/collection/artifact-create-modal.component.d.ts.map +1 -1
  7. package/dist/lib/components/collection/artifact-create-modal.component.js +9 -6
  8. package/dist/lib/components/collection/artifact-create-modal.component.js.map +1 -1
  9. package/dist/lib/components/collection/collection-form-modal.component.d.ts +2 -1
  10. package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
  11. package/dist/lib/components/collection/collection-form-modal.component.js +8 -5
  12. package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
  13. package/dist/lib/components/collection/collection-tree.component.d.ts +2 -1
  14. package/dist/lib/components/collection/collection-tree.component.d.ts.map +1 -1
  15. package/dist/lib/components/collection/collection-tree.component.js +9 -6
  16. package/dist/lib/components/collection/collection-tree.component.js.map +1 -1
  17. package/dist/lib/components/collection/collection-view.component.d.ts +2 -1
  18. package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
  19. package/dist/lib/components/collection/collection-view.component.js +12 -10
  20. package/dist/lib/components/collection/collection-view.component.js.map +1 -1
  21. package/dist/lib/components/collection/collections-full-view.component.d.ts +2 -1
  22. package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
  23. package/dist/lib/components/collection/collections-full-view.component.js +18 -12
  24. package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
  25. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +2 -1
  26. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  27. package/dist/lib/components/conversation/conversation-chat-area.component.js +22 -11
  28. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  29. package/dist/lib/components/library/library-full-view.component.d.ts +2 -1
  30. package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -1
  31. package/dist/lib/components/library/library-full-view.component.js +8 -5
  32. package/dist/lib/components/library/library-full-view.component.js.map +1 -1
  33. package/dist/lib/components/message/conversation-message-rating.component.d.ts +2 -1
  34. package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -1
  35. package/dist/lib/components/message/conversation-message-rating.component.js +9 -7
  36. package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -1
  37. package/dist/lib/components/message/message-input.component.d.ts +2 -1
  38. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  39. package/dist/lib/components/message/message-input.component.js +12 -5
  40. package/dist/lib/components/message/message-input.component.js.map +1 -1
  41. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  42. package/dist/lib/components/message/message-item.component.js +6 -1
  43. package/dist/lib/components/message/message-item.component.js.map +1 -1
  44. package/dist/lib/components/overlay/chat-overlay.component.d.ts +2 -1
  45. package/dist/lib/components/overlay/chat-overlay.component.d.ts.map +1 -1
  46. package/dist/lib/components/overlay/chat-overlay.component.js +6 -6
  47. package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
  48. package/dist/lib/components/project/project-form-modal.component.d.ts +2 -1
  49. package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -1
  50. package/dist/lib/components/project/project-form-modal.component.js +6 -5
  51. package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
  52. package/dist/lib/components/project/project-selector.component.d.ts +2 -1
  53. package/dist/lib/components/project/project-selector.component.d.ts.map +1 -1
  54. package/dist/lib/components/project/project-selector.component.js +8 -6
  55. package/dist/lib/components/project/project-selector.component.js.map +1 -1
  56. package/dist/lib/components/share/share-modal.component.d.ts +2 -1
  57. package/dist/lib/components/share/share-modal.component.d.ts.map +1 -1
  58. package/dist/lib/components/share/share-modal.component.js +11 -9
  59. package/dist/lib/components/share/share-modal.component.js.map +1 -1
  60. package/dist/lib/components/shared/user-picker.component.d.ts +2 -1
  61. package/dist/lib/components/shared/user-picker.component.d.ts.map +1 -1
  62. package/dist/lib/components/shared/user-picker.component.js +6 -4
  63. package/dist/lib/components/shared/user-picker.component.js.map +1 -1
  64. package/dist/lib/components/task/tasks-full-view.component.d.ts +2 -1
  65. package/dist/lib/components/task/tasks-full-view.component.d.ts.map +1 -1
  66. package/dist/lib/components/task/tasks-full-view.component.js +9 -8
  67. package/dist/lib/components/task/tasks-full-view.component.js.map +1 -1
  68. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -1
  69. package/dist/lib/components/tasks/tasks-dropdown.component.js +5 -0
  70. package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
  71. package/dist/lib/components/thread/thread-panel.component.d.ts +2 -1
  72. package/dist/lib/components/thread/thread-panel.component.d.ts.map +1 -1
  73. package/dist/lib/components/thread/thread-panel.component.js +7 -4
  74. package/dist/lib/components/thread/thread-panel.component.js.map +1 -1
  75. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  76. package/dist/lib/components/workspace/conversation-workspace.component.js +8 -4
  77. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  78. package/dist/lib/models/lazy-artifact-info.js +1 -1
  79. package/dist/lib/models/lazy-artifact-info.js.map +1 -1
  80. package/dist/lib/services/active-tasks.service.d.ts +7 -1
  81. package/dist/lib/services/active-tasks.service.d.ts.map +1 -1
  82. package/dist/lib/services/active-tasks.service.js +12 -2
  83. package/dist/lib/services/active-tasks.service.js.map +1 -1
  84. package/dist/lib/services/agent-state.service.d.ts +7 -1
  85. package/dist/lib/services/agent-state.service.d.ts.map +1 -1
  86. package/dist/lib/services/agent-state.service.js +12 -2
  87. package/dist/lib/services/agent-state.service.js.map +1 -1
  88. package/dist/lib/services/artifact-permission.service.d.ts +8 -1
  89. package/dist/lib/services/artifact-permission.service.d.ts.map +1 -1
  90. package/dist/lib/services/artifact-permission.service.js +21 -7
  91. package/dist/lib/services/artifact-permission.service.js.map +1 -1
  92. package/dist/lib/services/artifact-state.service.d.ts +8 -1
  93. package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
  94. package/dist/lib/services/artifact-state.service.js +25 -11
  95. package/dist/lib/services/artifact-state.service.js.map +1 -1
  96. package/dist/lib/services/artifact-use-tracking.service.d.ts +7 -1
  97. package/dist/lib/services/artifact-use-tracking.service.d.ts.map +1 -1
  98. package/dist/lib/services/artifact-use-tracking.service.js +12 -2
  99. package/dist/lib/services/artifact-use-tracking.service.js.map +1 -1
  100. package/dist/lib/services/collection-permission.service.d.ts +7 -1
  101. package/dist/lib/services/collection-permission.service.d.ts.map +1 -1
  102. package/dist/lib/services/collection-permission.service.js +19 -9
  103. package/dist/lib/services/collection-permission.service.js.map +1 -1
  104. package/dist/lib/services/conversation-agent.service.d.ts +8 -0
  105. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  106. package/dist/lib/services/conversation-agent.service.js +15 -3
  107. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  108. package/dist/lib/services/conversation-attachment.service.d.ts +7 -1
  109. package/dist/lib/services/conversation-attachment.service.d.ts.map +1 -1
  110. package/dist/lib/services/conversation-attachment.service.js +12 -2
  111. package/dist/lib/services/conversation-attachment.service.js.map +1 -1
  112. package/dist/lib/services/data-cache.service.d.ts +7 -1
  113. package/dist/lib/services/data-cache.service.d.ts.map +1 -1
  114. package/dist/lib/services/data-cache.service.js +16 -7
  115. package/dist/lib/services/data-cache.service.js.map +1 -1
  116. package/dist/lib/services/export.service.d.ts +7 -1
  117. package/dist/lib/services/export.service.d.ts.map +1 -1
  118. package/dist/lib/services/export.service.js +12 -2
  119. package/dist/lib/services/export.service.js.map +1 -1
  120. package/dist/lib/services/search.service.d.ts +7 -1
  121. package/dist/lib/services/search.service.d.ts.map +1 -1
  122. package/dist/lib/services/search.service.js +16 -6
  123. package/dist/lib/services/search.service.js.map +1 -1
  124. package/package.json +22 -22
@@ -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 } 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 constructor(private artifactPermissionService: ArtifactPermissionService) {}\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 = new Metadata();\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 = new RunView();\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 = new RunView();\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 = new RunView();\n\n // Load ALL versions in collection (no DISTINCT - each version is separate)\n const versionResult = await rv.RunView<MJArtifactVersionEntity>({\n EntityName: 'MJ: Artifact Versions',\n ExtraFilter: `ID IN (\n SELECT ca.ArtifactVersionID\n FROM [__mj].[vwCollectionArtifacts] ca\n WHERE ca.CollectionID='${collectionId}'\n )`,\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 = new Metadata();\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 = new Metadata();\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 = new Metadata();\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 = new Metadata();\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 = new RunView();\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 = new Metadata();\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 = new RunView();\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 ): Promise<Array<{ version: MJArtifactVersionEntity; artifact: MJArtifactEntity }>> {\n try {\n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Load ALL versions in collection (no DISTINCT - each version is separate)\n const versionResult = await rv.RunView<MJArtifactVersionEntity>({\n EntityName: 'MJ: Artifact Versions',\n ExtraFilter: `ID IN (\n SELECT ca.ArtifactVersionID\n FROM [__mj].[vwCollectionArtifacts] ca\n WHERE ca.CollectionID='${collectionId}'\n )`,\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,10 +1,16 @@
1
- import { UserInfo } from '@memberjunction/core';
1
+ import { UserInfo, IMetadataProvider } from '@memberjunction/core';
2
2
  import * as i0 from "@angular/core";
3
3
  /**
4
4
  * Service for tracking artifact usage events.
5
5
  * Creates audit trail records for security and analytics.
6
6
  */
7
7
  export declare class ArtifactUseTrackingService {
8
+ private _provider;
9
+ /**
10
+ * Set the metadata provider this service should use. When unset, falls back to Metadata.Provider.
11
+ */
12
+ set Provider(value: IMetadataProvider | null);
13
+ get Provider(): IMetadataProvider;
8
14
  /**
9
15
  * Track that a user viewed an artifact
10
16
  */
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-use-tracking.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/artifact-use-tracking.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,QAAQ,EAAE,MAAM,sBAAsB,CAAC;;AAG1D;;;GAGG;AACH,qBAGa,0BAA0B;IACnC;;OAEG;IACG,WAAW,CAAC,iBAAiB,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjG;;OAEG;IACG,WAAW,CAAC,iBAAiB,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjG;;OAEG;IACG,WAAW,CAAC,iBAAiB,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjG;;OAEG;IACG,UAAU,CAAC,iBAAiB,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhG;;OAEG;IACG,aAAa,CAAC,iBAAiB,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAInG;;OAEG;YACW,UAAU;yCAvCf,0BAA0B;6CAA1B,0BAA0B;CAuEtC"}
1
+ {"version":3,"file":"artifact-use-tracking.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/artifact-use-tracking.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,QAAQ,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;;AAG7E;;;GAGG;AACH,qBAGa,0BAA0B;IACnC,OAAO,CAAC,SAAS,CAAkC;IAEnD;;OAEG;IACH,IAAW,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,EAElD;IAED,IAAW,QAAQ,IAAI,iBAAiB,CAEvC;IAED;;OAEG;IACG,WAAW,CAAC,iBAAiB,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjG;;OAEG;IACG,WAAW,CAAC,iBAAiB,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjG;;OAEG;IACG,WAAW,CAAC,iBAAiB,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjG;;OAEG;IACG,UAAU,CAAC,iBAAiB,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhG;;OAEG;IACG,aAAa,CAAC,iBAAiB,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAInG;;OAEG;YACW,UAAU;yCApDf,0BAA0B;6CAA1B,0BAA0B;CAoFtC"}
@@ -6,6 +6,16 @@ import * as i0 from "@angular/core";
6
6
  * Creates audit trail records for security and analytics.
7
7
  */
8
8
  export class ArtifactUseTrackingService {
9
+ _provider = null;
10
+ /**
11
+ * Set the metadata provider this service should use. When unset, falls back to Metadata.Provider.
12
+ */
13
+ set Provider(value) {
14
+ this._provider = value;
15
+ }
16
+ get Provider() {
17
+ return this._provider ?? Metadata.Provider;
18
+ }
9
19
  /**
10
20
  * Track that a user viewed an artifact
11
21
  */
@@ -45,8 +55,8 @@ export class ArtifactUseTrackingService {
45
55
  console.warn('Cannot track artifact usage: No current user');
46
56
  return;
47
57
  }
48
- const md = new Metadata();
49
- const usage = await md.GetEntityObject('MJ: Artifact Uses');
58
+ const md = this.Provider;
59
+ const usage = await md.GetEntityObject('MJ: Artifact Uses', currentUser);
50
60
  usage.ArtifactVersionID = artifactVersionId;
51
61
  usage.UserID = currentUser.ID;
52
62
  usage.UsageType = usageType;
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-use-tracking.service.js","sourceRoot":"","sources":["../../../src/lib/services/artifact-use-tracking.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAY,MAAM,sBAAsB,CAAC;;AAG1D;;;GAGG;AAIH,MAAM,OAAO,0BAA0B;IACnC;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,iBAAyB,EAAE,WAAqB,EAAE,OAAa;QAC7E,MAAM,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC7E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,iBAAyB,EAAE,WAAqB,EAAE,OAAa;QAC7E,MAAM,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC7E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,iBAAyB,EAAE,WAAqB,EAAE,OAAa;QAC7E,MAAM,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC7E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,iBAAyB,EAAE,WAAqB,EAAE,OAAa;QAC5E,MAAM,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,iBAAyB,EAAE,WAAqB,EAAE,OAAa;QAC/E,MAAM,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAC/E,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,UAAU,CACpB,iBAAyB,EACzB,WAAqB,EACrB,SAAgE,EAChE,OAAa;QAEb,IAAI,CAAC;YACD,IAAI,CAAC,WAAW,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;gBAC7D,OAAO;YACX,CAAC;YAED,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,eAAe,CAAsB,mBAAmB,CAAC,CAAC;YAEjF,KAAK,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;YAC5C,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC;YAC9B,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;YAC5B,KAAK,CAAC,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAE9D,uCAAuC;YACvC,IAAI,CAAC;gBACD,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;YACvB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;YAC5D,CAAC;QAEL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAC7C,yDAAyD;QAC7D,CAAC;IACL,CAAC;oHAtEQ,0BAA0B;gEAA1B,0BAA0B,WAA1B,0BAA0B,mBAFvB,MAAM;;iFAET,0BAA0B;cAHtC,UAAU;eAAC;gBACR,UAAU,EAAE,MAAM;aACrB","sourcesContent":["import { Injectable } from '@angular/core';\nimport { Metadata, UserInfo } from '@memberjunction/core';\nimport { MJArtifactUseEntity } from '@memberjunction/core-entities';\n\n/**\n * Service for tracking artifact usage events.\n * Creates audit trail records for security and analytics.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ArtifactUseTrackingService {\n /**\n * Track that a user viewed an artifact\n */\n async TrackViewed(artifactVersionId: string, currentUser: UserInfo, context?: any): Promise<void> {\n await this.trackUsage(artifactVersionId, currentUser, 'Viewed', context);\n }\n\n /**\n * Track that a user opened an artifact (full interaction)\n */\n async TrackOpened(artifactVersionId: string, currentUser: UserInfo, context?: any): Promise<void> {\n await this.trackUsage(artifactVersionId, currentUser, 'Opened', context);\n }\n\n /**\n * Track that a user shared an artifact\n */\n async TrackShared(artifactVersionId: string, currentUser: UserInfo, context?: any): Promise<void> {\n await this.trackUsage(artifactVersionId, currentUser, 'Shared', context);\n }\n\n /**\n * Track that a user saved/bookmarked an artifact\n */\n async TrackSaved(artifactVersionId: string, currentUser: UserInfo, context?: any): Promise<void> {\n await this.trackUsage(artifactVersionId, currentUser, 'Saved', context);\n }\n\n /**\n * Track that a user exported an artifact\n */\n async TrackExported(artifactVersionId: string, currentUser: UserInfo, context?: any): Promise<void> {\n await this.trackUsage(artifactVersionId, currentUser, 'Exported', context);\n }\n\n /**\n * Internal method to create usage record\n */\n private async trackUsage(\n artifactVersionId: string,\n currentUser: UserInfo,\n usageType: 'Viewed' | 'Opened' | 'Shared' | 'Saved' | 'Exported',\n context?: any\n ): Promise<void> {\n try {\n if (!currentUser) {\n console.warn('Cannot track artifact usage: No current user');\n return;\n }\n\n const md = new Metadata();\n const usage = await md.GetEntityObject<MJArtifactUseEntity>('MJ: Artifact Uses');\n\n usage.ArtifactVersionID = artifactVersionId;\n usage.UserID = currentUser.ID;\n usage.UsageType = usageType;\n usage.UsageContext = context ? JSON.stringify(context) : null;\n\n // Save asynchronously - don't block UI\n try {\n await usage.Save();\n } catch (error) {\n console.error('Failed to track artifact usage:', error);\n }\n\n } catch (error) {\n console.error('Error in trackUsage:', error);\n // Don't throw - usage tracking should never break the UI\n }\n }\n}\n"]}
1
+ {"version":3,"file":"artifact-use-tracking.service.js","sourceRoot":"","sources":["../../../src/lib/services/artifact-use-tracking.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAA+B,MAAM,sBAAsB,CAAC;;AAG7E;;;GAGG;AAIH,MAAM,OAAO,0BAA0B;IAC3B,SAAS,GAA6B,IAAI,CAAC;IAEnD;;OAEG;IACH,IAAW,QAAQ,CAAC,KAA+B;QAC/C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,SAAS,IAAI,QAAQ,CAAC,QAAQ,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,iBAAyB,EAAE,WAAqB,EAAE,OAAa;QAC7E,MAAM,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC7E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,iBAAyB,EAAE,WAAqB,EAAE,OAAa;QAC7E,MAAM,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC7E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,iBAAyB,EAAE,WAAqB,EAAE,OAAa;QAC7E,MAAM,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC7E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,iBAAyB,EAAE,WAAqB,EAAE,OAAa;QAC5E,MAAM,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,iBAAyB,EAAE,WAAqB,EAAE,OAAa;QAC/E,MAAM,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAC/E,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,UAAU,CACpB,iBAAyB,EACzB,WAAqB,EACrB,SAAgE,EAChE,OAAa;QAEb,IAAI,CAAC;YACD,IAAI,CAAC,WAAW,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;gBAC7D,OAAO;YACX,CAAC;YAED,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;YACzB,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,eAAe,CAAsB,mBAAmB,EAAE,WAAW,CAAC,CAAC;YAE9F,KAAK,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;YAC5C,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC;YAC9B,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;YAC5B,KAAK,CAAC,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAE9D,uCAAuC;YACvC,IAAI,CAAC;gBACD,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;YACvB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;YAC5D,CAAC;QAEL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAC7C,yDAAyD;QAC7D,CAAC;IACL,CAAC;oHAnFQ,0BAA0B;gEAA1B,0BAA0B,WAA1B,0BAA0B,mBAFvB,MAAM;;iFAET,0BAA0B;cAHtC,UAAU;eAAC;gBACR,UAAU,EAAE,MAAM;aACrB","sourcesContent":["import { Injectable } from '@angular/core';\nimport { Metadata, UserInfo, IMetadataProvider } from '@memberjunction/core';\nimport { MJArtifactUseEntity } from '@memberjunction/core-entities';\n\n/**\n * Service for tracking artifact usage events.\n * Creates audit trail records for security and analytics.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ArtifactUseTrackingService {\n private _provider: IMetadataProvider | null = null;\n\n /**\n * Set the metadata provider this service should use. When unset, falls back to Metadata.Provider.\n */\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n\n /**\n * Track that a user viewed an artifact\n */\n async TrackViewed(artifactVersionId: string, currentUser: UserInfo, context?: any): Promise<void> {\n await this.trackUsage(artifactVersionId, currentUser, 'Viewed', context);\n }\n\n /**\n * Track that a user opened an artifact (full interaction)\n */\n async TrackOpened(artifactVersionId: string, currentUser: UserInfo, context?: any): Promise<void> {\n await this.trackUsage(artifactVersionId, currentUser, 'Opened', context);\n }\n\n /**\n * Track that a user shared an artifact\n */\n async TrackShared(artifactVersionId: string, currentUser: UserInfo, context?: any): Promise<void> {\n await this.trackUsage(artifactVersionId, currentUser, 'Shared', context);\n }\n\n /**\n * Track that a user saved/bookmarked an artifact\n */\n async TrackSaved(artifactVersionId: string, currentUser: UserInfo, context?: any): Promise<void> {\n await this.trackUsage(artifactVersionId, currentUser, 'Saved', context);\n }\n\n /**\n * Track that a user exported an artifact\n */\n async TrackExported(artifactVersionId: string, currentUser: UserInfo, context?: any): Promise<void> {\n await this.trackUsage(artifactVersionId, currentUser, 'Exported', context);\n }\n\n /**\n * Internal method to create usage record\n */\n private async trackUsage(\n artifactVersionId: string,\n currentUser: UserInfo,\n usageType: 'Viewed' | 'Opened' | 'Shared' | 'Saved' | 'Exported',\n context?: any\n ): Promise<void> {\n try {\n if (!currentUser) {\n console.warn('Cannot track artifact usage: No current user');\n return;\n }\n\n const md = this.Provider;\n const usage = await md.GetEntityObject<MJArtifactUseEntity>('MJ: Artifact Uses', currentUser);\n\n usage.ArtifactVersionID = artifactVersionId;\n usage.UserID = currentUser.ID;\n usage.UsageType = usageType;\n usage.UsageContext = context ? JSON.stringify(context) : null;\n\n // Save asynchronously - don't block UI\n try {\n await usage.Save();\n } catch (error) {\n console.error('Failed to track artifact usage:', error);\n }\n\n } catch (error) {\n console.error('Error in trackUsage:', error);\n // Don't throw - usage tracking should never break the UI\n }\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { UserInfo } from '@memberjunction/core';
1
+ import { UserInfo, IMetadataProvider } from '@memberjunction/core';
2
2
  import { MJCollectionPermissionEntity } from '@memberjunction/core-entities';
3
3
  import * as i0 from "@angular/core";
4
4
  export interface CollectionPermission {
@@ -21,6 +21,12 @@ export interface PermissionSet {
21
21
  canDelete: boolean;
22
22
  }
23
23
  export declare class CollectionPermissionService {
24
+ private _provider;
25
+ /**
26
+ * Set the metadata provider this service should use. When unset, falls back to Metadata.Provider.
27
+ */
28
+ set Provider(value: IMetadataProvider | null);
29
+ get Provider(): IMetadataProvider;
24
30
  /**
25
31
  * Load all permissions for a collection
26
32
  */
@@ -1 +1 @@
1
- {"version":3,"file":"collection-permission.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/collection-permission.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"collection-permission.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/collection-permission.service.ts"],"names":[],"mappings":"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"}
@@ -2,11 +2,21 @@ import { Injectable } from '@angular/core';
2
2
  import { RunView, Metadata } from '@memberjunction/core';
3
3
  import * as i0 from "@angular/core";
4
4
  export class CollectionPermissionService {
5
+ _provider = null;
6
+ /**
7
+ * Set the metadata provider this service should use. When unset, falls back to Metadata.Provider.
8
+ */
9
+ set Provider(value) {
10
+ this._provider = value;
11
+ }
12
+ get Provider() {
13
+ return this._provider ?? Metadata.Provider;
14
+ }
5
15
  /**
6
16
  * Load all permissions for a collection
7
17
  */
8
18
  async loadPermissions(collectionId, currentUser) {
9
- const rv = new RunView();
19
+ const rv = RunView.FromMetadataProvider(this.Provider);
10
20
  const result = await rv.RunView({
11
21
  EntityName: 'MJ: Collection Permissions',
12
22
  ExtraFilter: `CollectionID='${collectionId}'`,
@@ -22,7 +32,7 @@ export class CollectionPermissionService {
22
32
  * Check if user has permission for a collection
23
33
  */
24
34
  async checkPermission(collectionId, userId, currentUser) {
25
- const rv = new RunView();
35
+ const rv = RunView.FromMetadataProvider(this.Provider);
26
36
  const result = await rv.RunView({
27
37
  EntityName: 'MJ: Collection Permissions',
28
38
  ExtraFilter: `CollectionID='${collectionId}' AND UserID='${userId}'`,
@@ -44,7 +54,7 @@ export class CollectionPermissionService {
44
54
  }
45
55
  // Build filter for all collection IDs
46
56
  const collectionFilter = collectionIds.map(id => `CollectionID='${id}'`).join(' OR ');
47
- const rv = new RunView();
57
+ const rv = RunView.FromMetadataProvider(this.Provider);
48
58
  const result = await rv.RunView({
49
59
  EntityName: 'MJ: Collection Permissions',
50
60
  ExtraFilter: `(${collectionFilter}) AND UserID='${userId}'`,
@@ -62,7 +72,7 @@ export class CollectionPermissionService {
62
72
  * Grant permission to a user
63
73
  */
64
74
  async grantPermission(collectionId, userId, permissions, sharedByUserId, currentUser) {
65
- const md = new Metadata();
75
+ const md = this.Provider;
66
76
  const permission = await md.GetEntityObject('MJ: Collection Permissions', currentUser);
67
77
  permission.CollectionID = collectionId;
68
78
  permission.UserID = userId;
@@ -90,7 +100,7 @@ export class CollectionPermissionService {
90
100
  * Recursively grant permissions on all child collections
91
101
  */
92
102
  async grantChildPermissions(parentCollectionId, userId, permissions, sharedByUserId, currentUser) {
93
- const rv = new RunView();
103
+ const rv = RunView.FromMetadataProvider(this.Provider);
94
104
  const childrenResult = await rv.RunView({
95
105
  EntityName: 'MJ: Collections',
96
106
  ExtraFilter: `ParentID='${parentCollectionId}'`,
@@ -117,7 +127,7 @@ export class CollectionPermissionService {
117
127
  * Update existing permission
118
128
  */
119
129
  async updatePermission(permissionId, permissions, currentUser) {
120
- const md = new Metadata();
130
+ const md = this.Provider;
121
131
  const permission = await md.GetEntityObject('MJ: Collection Permissions', currentUser);
122
132
  await permission.Load(permissionId);
123
133
  permission.CanRead = permissions.canRead;
@@ -142,7 +152,7 @@ export class CollectionPermissionService {
142
152
  * Recursively update permissions on all child collections
143
153
  */
144
154
  async updateChildPermissions(parentCollectionId, userId, permissions, currentUser) {
145
- const rv = new RunView();
155
+ const rv = RunView.FromMetadataProvider(this.Provider);
146
156
  const childrenResult = await rv.RunView({
147
157
  EntityName: 'MJ: Collections',
148
158
  ExtraFilter: `ParentID='${parentCollectionId}'`,
@@ -164,7 +174,7 @@ export class CollectionPermissionService {
164
174
  * Revoke permission
165
175
  */
166
176
  async revokePermission(permissionId, currentUser) {
167
- const md = new Metadata();
177
+ const md = this.Provider;
168
178
  const permission = await md.GetEntityObject('MJ: Collection Permissions', currentUser);
169
179
  await permission.Load(permissionId);
170
180
  return await permission.Delete();
@@ -185,7 +195,7 @@ export class CollectionPermissionService {
185
195
  * Recursively revoke permissions on all child collections
186
196
  */
187
197
  async revokeChildPermissions(parentCollectionId, userId, currentUser) {
188
- const rv = new RunView();
198
+ const rv = RunView.FromMetadataProvider(this.Provider);
189
199
  const childrenResult = await rv.RunView({
190
200
  EntityName: 'MJ: Collections',
191
201
  ExtraFilter: `ParentID='${parentCollectionId}'`,
@@ -1 +1 @@
1
- {"version":3,"file":"collection-permission.service.js","sourceRoot":"","sources":["../../../src/lib/services/collection-permission.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\nimport { UserInfo, RunView, Metadata } from '@memberjunction/core';\nimport { MJCollectionPermissionEntity } from '@memberjunction/core-entities';\n\nexport interface CollectionPermission {\n id: string;\n collectionId: string;\n userId: string;\n userName: string;\n canRead: boolean;\n canShare: boolean;\n canEdit: boolean;\n canDelete: boolean;\n sharedByUserId: string | null;\n sharedByUserName: string | null;\n sharedAt: Date;\n}\n\nexport interface PermissionSet {\n canRead: boolean;\n canShare: boolean;\n canEdit: boolean;\n canDelete: boolean;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CollectionPermissionService {\n\n /**\n * Load all permissions for a collection\n */\n async loadPermissions(collectionId: string, currentUser: UserInfo): Promise<CollectionPermission[]> {\n const rv = new RunView();\n const result = await rv.RunView<MJCollectionPermissionEntity>({\n EntityName: 'MJ: Collection Permissions',\n ExtraFilter: `CollectionID='${collectionId}'`,\n OrderBy: '__mj_CreatedAt ASC',\n ResultType: 'entity_object'\n }, currentUser);\n\n if (result.Success && result.Results) {\n return result.Results.map(p => this.mapToPermission(p));\n }\n return [];\n }\n\n /**\n * Check if user has permission for a collection\n */\n async checkPermission(\n collectionId: string,\n userId: string,\n currentUser: UserInfo\n ): Promise<CollectionPermission | null> {\n const rv = new RunView();\n const result = await rv.RunView<MJCollectionPermissionEntity>({\n EntityName: 'MJ: Collection Permissions',\n ExtraFilter: `CollectionID='${collectionId}' AND UserID='${userId}'`,\n MaxRows: 1,\n ResultType: 'entity_object'\n }, currentUser);\n\n if (result.Success && result.Results && result.Results.length > 0) {\n return this.mapToPermission(result.Results[0]);\n }\n return null;\n }\n\n /**\n * Check permissions for multiple collections at once (efficient bulk loading)\n */\n async checkBulkPermissions(\n collectionIds: string[],\n userId: string,\n currentUser: UserInfo\n ): Promise<Map<string, CollectionPermission>> {\n const resultMap = new Map<string, CollectionPermission>();\n\n if (collectionIds.length === 0) {\n return resultMap;\n }\n\n // Build filter for all collection IDs\n const collectionFilter = collectionIds.map(id => `CollectionID='${id}'`).join(' OR ');\n const rv = new RunView();\n const result = await rv.RunView<MJCollectionPermissionEntity>({\n EntityName: 'MJ: Collection Permissions',\n ExtraFilter: `(${collectionFilter}) AND UserID='${userId}'`,\n ResultType: 'entity_object'\n }, currentUser);\n\n if (result.Success && result.Results) {\n for (const entity of result.Results) {\n const permission = this.mapToPermission(entity);\n resultMap.set(entity.CollectionID, permission);\n }\n }\n\n return resultMap;\n }\n\n /**\n * Grant permission to a user\n */\n async grantPermission(\n collectionId: string,\n userId: string,\n permissions: PermissionSet,\n sharedByUserId: string,\n currentUser: UserInfo\n ): Promise<MJCollectionPermissionEntity> {\n const md = new Metadata();\n const permission = await md.GetEntityObject<MJCollectionPermissionEntity>(\n 'MJ: Collection Permissions',\n currentUser\n );\n\n permission.CollectionID = collectionId;\n permission.UserID = userId;\n permission.CanRead = permissions.canRead;\n permission.CanShare = permissions.canShare;\n permission.CanEdit = permissions.canEdit;\n permission.CanDelete = permissions.canDelete;\n permission.SharedByUserID = sharedByUserId;\n\n const saved = await permission.Save();\n if (!saved) {\n throw new Error(permission.LatestResult?.Message || 'Failed to grant permission');\n }\n\n return permission;\n }\n\n /**\n * Grant permission and cascade to all child collections\n */\n async grantPermissionCascade(\n collectionId: string,\n userId: string,\n permissions: PermissionSet,\n sharedByUserId: string,\n currentUser: UserInfo\n ): Promise<void> {\n // Grant permission on current collection\n await this.grantPermission(collectionId, userId, permissions, sharedByUserId, currentUser);\n\n // Grant permissions on all child collections recursively\n await this.grantChildPermissions(collectionId, userId, permissions, sharedByUserId, currentUser);\n }\n\n /**\n * Recursively grant permissions on all child collections\n */\n private async grantChildPermissions(\n parentCollectionId: string,\n userId: string,\n permissions: PermissionSet,\n sharedByUserId: string,\n currentUser: UserInfo\n ): Promise<void> {\n const rv = new RunView();\n const childrenResult = await rv.RunView({\n EntityName: 'MJ: Collections',\n ExtraFilter: `ParentID='${parentCollectionId}'`,\n ResultType: 'entity_object'\n }, currentUser);\n\n if (childrenResult.Success && childrenResult.Results) {\n for (const child of childrenResult.Results) {\n // Check if permission already exists\n const existing = await this.checkPermission(child.ID, userId, currentUser);\n\n if (existing) {\n // Permission exists, update it instead\n await this.updatePermission(existing.id, permissions, currentUser);\n } else {\n // Grant new permission\n await this.grantPermission(child.ID, userId, permissions, sharedByUserId, currentUser);\n }\n\n // Recursively grant to grandchildren\n await this.grantChildPermissions(child.ID, userId, permissions, sharedByUserId, currentUser);\n }\n }\n }\n\n /**\n * Update existing permission\n */\n async updatePermission(\n permissionId: string,\n permissions: PermissionSet,\n currentUser: UserInfo\n ): Promise<boolean> {\n const md = new Metadata();\n const permission = await md.GetEntityObject<MJCollectionPermissionEntity>(\n 'MJ: Collection Permissions',\n currentUser\n );\n\n await permission.Load(permissionId);\n permission.CanRead = permissions.canRead;\n permission.CanShare = permissions.canShare;\n permission.CanEdit = permissions.canEdit;\n permission.CanDelete = permissions.canDelete;\n\n return await permission.Save();\n }\n\n /**\n * Update permission and cascade to all child collections\n */\n async updatePermissionCascade(\n collectionId: string,\n userId: string,\n permissions: PermissionSet,\n currentUser: UserInfo\n ): Promise<void> {\n // Update permission on current collection\n const permission = await this.checkPermission(collectionId, userId, currentUser);\n if (permission) {\n await this.updatePermission(permission.id, permissions, currentUser);\n }\n\n // Get all child collections and update recursively\n await this.updateChildPermissions(collectionId, userId, permissions, currentUser);\n }\n\n /**\n * Recursively update permissions on all child collections\n */\n private async updateChildPermissions(\n parentCollectionId: string,\n userId: string,\n permissions: PermissionSet,\n currentUser: UserInfo\n ): Promise<void> {\n const rv = new RunView();\n const childrenResult = await rv.RunView({\n EntityName: 'MJ: Collections',\n ExtraFilter: `ParentID='${parentCollectionId}'`,\n ResultType: 'entity_object'\n }, currentUser);\n\n if (childrenResult.Success && childrenResult.Results) {\n for (const child of childrenResult.Results) {\n // Update permission if it exists for this user on the child collection\n const childPermission = await this.checkPermission(child.ID, userId, currentUser);\n if (childPermission) {\n await this.updatePermission(childPermission.id, permissions, currentUser);\n }\n\n // Recursively update grandchildren\n await this.updateChildPermissions(child.ID, userId, permissions, currentUser);\n }\n }\n }\n\n /**\n * Revoke permission\n */\n async revokePermission(permissionId: string, currentUser: UserInfo): Promise<boolean> {\n const md = new Metadata();\n const permission = await md.GetEntityObject<MJCollectionPermissionEntity>(\n 'MJ: Collection Permissions',\n currentUser\n );\n\n await permission.Load(permissionId);\n return await permission.Delete();\n }\n\n /**\n * Revoke permission and cascade to all child collections\n */\n async revokePermissionCascade(\n collectionId: string,\n userId: string,\n currentUser: UserInfo\n ): Promise<void> {\n // Revoke permission on current collection\n const permission = await this.checkPermission(collectionId, userId, currentUser);\n if (permission) {\n await this.revokePermission(permission.id, currentUser);\n }\n\n // Revoke permissions on all child collections recursively\n await this.revokeChildPermissions(collectionId, userId, currentUser);\n }\n\n /**\n * Recursively revoke permissions on all child collections\n */\n private async revokeChildPermissions(\n parentCollectionId: string,\n userId: string,\n currentUser: UserInfo\n ): Promise<void> {\n const rv = new RunView();\n const childrenResult = await rv.RunView({\n EntityName: 'MJ: Collections',\n ExtraFilter: `ParentID='${parentCollectionId}'`,\n ResultType: 'entity_object'\n }, currentUser);\n\n if (childrenResult.Success && childrenResult.Results) {\n for (const child of childrenResult.Results) {\n // Revoke permission if it exists for this user on the child collection\n const childPermission = await this.checkPermission(child.ID, userId, currentUser);\n if (childPermission) {\n await this.revokePermission(childPermission.id, currentUser);\n }\n\n // Recursively revoke from grandchildren\n await this.revokeChildPermissions(child.ID, userId, currentUser);\n }\n }\n }\n\n /**\n * Validate that requested permissions don't exceed granter's permissions\n */\n validatePermissions(\n requested: PermissionSet,\n granter: PermissionSet,\n isOwner: boolean\n ): boolean {\n if (isOwner) return true; // Owner can grant anything\n\n // Can't grant permissions you don't have\n if (requested.canShare && !granter.canShare) return false;\n if (requested.canEdit && !granter.canEdit) return false;\n if (requested.canDelete && !granter.canDelete) return false;\n\n return true;\n }\n\n /**\n * Get available permissions for a user to grant based on their own permissions\n */\n getAvailablePermissions(userPermissions: PermissionSet, isOwner: boolean): string[] {\n if (isOwner) {\n return ['Read', 'Share', 'Edit', 'Delete'];\n }\n\n const available = ['Read']; // Always have read\n if (userPermissions.canShare) available.push('Share');\n if (userPermissions.canEdit) available.push('Edit');\n if (userPermissions.canDelete) available.push('Delete');\n\n return available;\n }\n\n /**\n * Copy all permissions from parent collection to child collection\n */\n async copyParentPermissions(\n parentCollectionId: string,\n childCollectionId: string,\n currentUser: UserInfo\n ): Promise<void> {\n const parentPermissions = await this.loadPermissions(parentCollectionId, currentUser);\n\n for (const perm of parentPermissions) {\n // Check if permission already exists for this user on the child collection\n const existing = await this.checkPermission(childCollectionId, perm.userId, currentUser);\n\n if (existing) {\n // Permission already exists (e.g., owner permission), skip to avoid duplicate\n console.log(`Skipping duplicate permission for user ${perm.userId} on collection ${childCollectionId}`);\n continue;\n }\n\n await this.grantPermission(\n childCollectionId,\n perm.userId,\n {\n canRead: perm.canRead,\n canShare: perm.canShare,\n canEdit: perm.canEdit,\n canDelete: perm.canDelete\n },\n perm.sharedByUserId || currentUser.ID,\n currentUser\n );\n }\n }\n\n /**\n * Delete all permissions for a collection\n */\n async deleteAllPermissions(collectionId: string, currentUser: UserInfo): Promise<void> {\n const permissions = await this.loadPermissions(collectionId, currentUser);\n\n for (const perm of permissions) {\n await this.revokePermission(perm.id, currentUser);\n }\n }\n\n /**\n * Create owner permission record (all permissions enabled)\n */\n async createOwnerPermission(\n collectionId: string,\n ownerId: string,\n currentUser: UserInfo\n ): Promise<void> {\n await this.grantPermission(\n collectionId,\n ownerId,\n {\n canRead: true,\n canShare: true,\n canEdit: true,\n canDelete: true\n },\n ownerId, // Owner grants to themselves\n currentUser\n );\n }\n\n private mapToPermission(entity: MJCollectionPermissionEntity): CollectionPermission {\n return {\n id: entity.ID,\n collectionId: entity.CollectionID,\n userId: entity.UserID,\n userName: entity.User || '',\n canRead: entity.CanRead,\n canShare: entity.CanShare,\n canEdit: entity.CanEdit,\n canDelete: entity.CanDelete,\n sharedByUserId: entity.SharedByUserID || null,\n sharedByUserName: entity.SharedByUser || null,\n sharedAt: entity.__mj_CreatedAt\n };\n }\n}\n"]}
1
+ {"version":3,"file":"collection-permission.service.js","sourceRoot":"","sources":["../../../src/lib/services/collection-permission.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\nimport { UserInfo, RunView, Metadata, IMetadataProvider } from '@memberjunction/core';\nimport { MJCollectionPermissionEntity } from '@memberjunction/core-entities';\n\nexport interface CollectionPermission {\n id: string;\n collectionId: string;\n userId: string;\n userName: string;\n canRead: boolean;\n canShare: boolean;\n canEdit: boolean;\n canDelete: boolean;\n sharedByUserId: string | null;\n sharedByUserName: string | null;\n sharedAt: Date;\n}\n\nexport interface PermissionSet {\n canRead: boolean;\n canShare: boolean;\n canEdit: boolean;\n canDelete: boolean;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CollectionPermissionService {\n private _provider: IMetadataProvider | null = null;\n\n /**\n * Set the metadata provider this service should use. When unset, falls back to Metadata.Provider.\n */\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n\n /**\n * Load all permissions for a collection\n */\n async loadPermissions(collectionId: string, currentUser: UserInfo): Promise<CollectionPermission[]> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<MJCollectionPermissionEntity>({\n EntityName: 'MJ: Collection Permissions',\n ExtraFilter: `CollectionID='${collectionId}'`,\n OrderBy: '__mj_CreatedAt ASC',\n ResultType: 'entity_object'\n }, currentUser);\n\n if (result.Success && result.Results) {\n return result.Results.map(p => this.mapToPermission(p));\n }\n return [];\n }\n\n /**\n * Check if user has permission for a collection\n */\n async checkPermission(\n collectionId: string,\n userId: string,\n currentUser: UserInfo\n ): Promise<CollectionPermission | null> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<MJCollectionPermissionEntity>({\n EntityName: 'MJ: Collection Permissions',\n ExtraFilter: `CollectionID='${collectionId}' AND UserID='${userId}'`,\n MaxRows: 1,\n ResultType: 'entity_object'\n }, currentUser);\n\n if (result.Success && result.Results && result.Results.length > 0) {\n return this.mapToPermission(result.Results[0]);\n }\n return null;\n }\n\n /**\n * Check permissions for multiple collections at once (efficient bulk loading)\n */\n async checkBulkPermissions(\n collectionIds: string[],\n userId: string,\n currentUser: UserInfo\n ): Promise<Map<string, CollectionPermission>> {\n const resultMap = new Map<string, CollectionPermission>();\n\n if (collectionIds.length === 0) {\n return resultMap;\n }\n\n // Build filter for all collection IDs\n const collectionFilter = collectionIds.map(id => `CollectionID='${id}'`).join(' OR ');\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<MJCollectionPermissionEntity>({\n EntityName: 'MJ: Collection Permissions',\n ExtraFilter: `(${collectionFilter}) AND UserID='${userId}'`,\n ResultType: 'entity_object'\n }, currentUser);\n\n if (result.Success && result.Results) {\n for (const entity of result.Results) {\n const permission = this.mapToPermission(entity);\n resultMap.set(entity.CollectionID, permission);\n }\n }\n\n return resultMap;\n }\n\n /**\n * Grant permission to a user\n */\n async grantPermission(\n collectionId: string,\n userId: string,\n permissions: PermissionSet,\n sharedByUserId: string,\n currentUser: UserInfo\n ): Promise<MJCollectionPermissionEntity> {\n const md = this.Provider;\n const permission = await md.GetEntityObject<MJCollectionPermissionEntity>(\n 'MJ: Collection Permissions',\n currentUser\n );\n\n permission.CollectionID = collectionId;\n permission.UserID = userId;\n permission.CanRead = permissions.canRead;\n permission.CanShare = permissions.canShare;\n permission.CanEdit = permissions.canEdit;\n permission.CanDelete = permissions.canDelete;\n permission.SharedByUserID = sharedByUserId;\n\n const saved = await permission.Save();\n if (!saved) {\n throw new Error(permission.LatestResult?.Message || 'Failed to grant permission');\n }\n\n return permission;\n }\n\n /**\n * Grant permission and cascade to all child collections\n */\n async grantPermissionCascade(\n collectionId: string,\n userId: string,\n permissions: PermissionSet,\n sharedByUserId: string,\n currentUser: UserInfo\n ): Promise<void> {\n // Grant permission on current collection\n await this.grantPermission(collectionId, userId, permissions, sharedByUserId, currentUser);\n\n // Grant permissions on all child collections recursively\n await this.grantChildPermissions(collectionId, userId, permissions, sharedByUserId, currentUser);\n }\n\n /**\n * Recursively grant permissions on all child collections\n */\n private async grantChildPermissions(\n parentCollectionId: string,\n userId: string,\n permissions: PermissionSet,\n sharedByUserId: string,\n currentUser: UserInfo\n ): Promise<void> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const childrenResult = await rv.RunView({\n EntityName: 'MJ: Collections',\n ExtraFilter: `ParentID='${parentCollectionId}'`,\n ResultType: 'entity_object'\n }, currentUser);\n\n if (childrenResult.Success && childrenResult.Results) {\n for (const child of childrenResult.Results) {\n // Check if permission already exists\n const existing = await this.checkPermission(child.ID, userId, currentUser);\n\n if (existing) {\n // Permission exists, update it instead\n await this.updatePermission(existing.id, permissions, currentUser);\n } else {\n // Grant new permission\n await this.grantPermission(child.ID, userId, permissions, sharedByUserId, currentUser);\n }\n\n // Recursively grant to grandchildren\n await this.grantChildPermissions(child.ID, userId, permissions, sharedByUserId, currentUser);\n }\n }\n }\n\n /**\n * Update existing permission\n */\n async updatePermission(\n permissionId: string,\n permissions: PermissionSet,\n currentUser: UserInfo\n ): Promise<boolean> {\n const md = this.Provider;\n const permission = await md.GetEntityObject<MJCollectionPermissionEntity>(\n 'MJ: Collection Permissions',\n currentUser\n );\n\n await permission.Load(permissionId);\n permission.CanRead = permissions.canRead;\n permission.CanShare = permissions.canShare;\n permission.CanEdit = permissions.canEdit;\n permission.CanDelete = permissions.canDelete;\n\n return await permission.Save();\n }\n\n /**\n * Update permission and cascade to all child collections\n */\n async updatePermissionCascade(\n collectionId: string,\n userId: string,\n permissions: PermissionSet,\n currentUser: UserInfo\n ): Promise<void> {\n // Update permission on current collection\n const permission = await this.checkPermission(collectionId, userId, currentUser);\n if (permission) {\n await this.updatePermission(permission.id, permissions, currentUser);\n }\n\n // Get all child collections and update recursively\n await this.updateChildPermissions(collectionId, userId, permissions, currentUser);\n }\n\n /**\n * Recursively update permissions on all child collections\n */\n private async updateChildPermissions(\n parentCollectionId: string,\n userId: string,\n permissions: PermissionSet,\n currentUser: UserInfo\n ): Promise<void> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const childrenResult = await rv.RunView({\n EntityName: 'MJ: Collections',\n ExtraFilter: `ParentID='${parentCollectionId}'`,\n ResultType: 'entity_object'\n }, currentUser);\n\n if (childrenResult.Success && childrenResult.Results) {\n for (const child of childrenResult.Results) {\n // Update permission if it exists for this user on the child collection\n const childPermission = await this.checkPermission(child.ID, userId, currentUser);\n if (childPermission) {\n await this.updatePermission(childPermission.id, permissions, currentUser);\n }\n\n // Recursively update grandchildren\n await this.updateChildPermissions(child.ID, userId, permissions, currentUser);\n }\n }\n }\n\n /**\n * Revoke permission\n */\n async revokePermission(permissionId: string, currentUser: UserInfo): Promise<boolean> {\n const md = this.Provider;\n const permission = await md.GetEntityObject<MJCollectionPermissionEntity>(\n 'MJ: Collection Permissions',\n currentUser\n );\n\n await permission.Load(permissionId);\n return await permission.Delete();\n }\n\n /**\n * Revoke permission and cascade to all child collections\n */\n async revokePermissionCascade(\n collectionId: string,\n userId: string,\n currentUser: UserInfo\n ): Promise<void> {\n // Revoke permission on current collection\n const permission = await this.checkPermission(collectionId, userId, currentUser);\n if (permission) {\n await this.revokePermission(permission.id, currentUser);\n }\n\n // Revoke permissions on all child collections recursively\n await this.revokeChildPermissions(collectionId, userId, currentUser);\n }\n\n /**\n * Recursively revoke permissions on all child collections\n */\n private async revokeChildPermissions(\n parentCollectionId: string,\n userId: string,\n currentUser: UserInfo\n ): Promise<void> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const childrenResult = await rv.RunView({\n EntityName: 'MJ: Collections',\n ExtraFilter: `ParentID='${parentCollectionId}'`,\n ResultType: 'entity_object'\n }, currentUser);\n\n if (childrenResult.Success && childrenResult.Results) {\n for (const child of childrenResult.Results) {\n // Revoke permission if it exists for this user on the child collection\n const childPermission = await this.checkPermission(child.ID, userId, currentUser);\n if (childPermission) {\n await this.revokePermission(childPermission.id, currentUser);\n }\n\n // Recursively revoke from grandchildren\n await this.revokeChildPermissions(child.ID, userId, currentUser);\n }\n }\n }\n\n /**\n * Validate that requested permissions don't exceed granter's permissions\n */\n validatePermissions(\n requested: PermissionSet,\n granter: PermissionSet,\n isOwner: boolean\n ): boolean {\n if (isOwner) return true; // Owner can grant anything\n\n // Can't grant permissions you don't have\n if (requested.canShare && !granter.canShare) return false;\n if (requested.canEdit && !granter.canEdit) return false;\n if (requested.canDelete && !granter.canDelete) return false;\n\n return true;\n }\n\n /**\n * Get available permissions for a user to grant based on their own permissions\n */\n getAvailablePermissions(userPermissions: PermissionSet, isOwner: boolean): string[] {\n if (isOwner) {\n return ['Read', 'Share', 'Edit', 'Delete'];\n }\n\n const available = ['Read']; // Always have read\n if (userPermissions.canShare) available.push('Share');\n if (userPermissions.canEdit) available.push('Edit');\n if (userPermissions.canDelete) available.push('Delete');\n\n return available;\n }\n\n /**\n * Copy all permissions from parent collection to child collection\n */\n async copyParentPermissions(\n parentCollectionId: string,\n childCollectionId: string,\n currentUser: UserInfo\n ): Promise<void> {\n const parentPermissions = await this.loadPermissions(parentCollectionId, currentUser);\n\n for (const perm of parentPermissions) {\n // Check if permission already exists for this user on the child collection\n const existing = await this.checkPermission(childCollectionId, perm.userId, currentUser);\n\n if (existing) {\n // Permission already exists (e.g., owner permission), skip to avoid duplicate\n console.log(`Skipping duplicate permission for user ${perm.userId} on collection ${childCollectionId}`);\n continue;\n }\n\n await this.grantPermission(\n childCollectionId,\n perm.userId,\n {\n canRead: perm.canRead,\n canShare: perm.canShare,\n canEdit: perm.canEdit,\n canDelete: perm.canDelete\n },\n perm.sharedByUserId || currentUser.ID,\n currentUser\n );\n }\n }\n\n /**\n * Delete all permissions for a collection\n */\n async deleteAllPermissions(collectionId: string, currentUser: UserInfo): Promise<void> {\n const permissions = await this.loadPermissions(collectionId, currentUser);\n\n for (const perm of permissions) {\n await this.revokePermission(perm.id, currentUser);\n }\n }\n\n /**\n * Create owner permission record (all permissions enabled)\n */\n async createOwnerPermission(\n collectionId: string,\n ownerId: string,\n currentUser: UserInfo\n ): Promise<void> {\n await this.grantPermission(\n collectionId,\n ownerId,\n {\n canRead: true,\n canShare: true,\n canEdit: true,\n canDelete: true\n },\n ownerId, // Owner grants to themselves\n currentUser\n );\n }\n\n private mapToPermission(entity: MJCollectionPermissionEntity): CollectionPermission {\n return {\n id: entity.ID,\n collectionId: entity.CollectionID,\n userId: entity.UserID,\n userName: entity.User || '',\n canRead: entity.CanRead,\n canShare: entity.CanShare,\n canEdit: entity.CanEdit,\n canDelete: entity.CanDelete,\n sharedByUserId: entity.SharedByUserID || null,\n sharedByUserName: entity.SharedByUser || null,\n sharedAt: entity.__mj_CreatedAt\n };\n }\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import { Observable } from 'rxjs';
2
+ import { IMetadataProvider } from '@memberjunction/core';
2
3
  import { ExecuteAgentResult, AgentExecutionProgressCallback } from '@memberjunction/ai-core-plus';
3
4
  import { MJConversationDetailEntity } from '@memberjunction/core-entities';
4
5
  import { MJAIAgentEntityExtended, MJAIAgentRunEntityExtended } from "@memberjunction/ai-core-plus";
@@ -39,7 +40,14 @@ export declare class ConversationAgentService {
39
40
  * Observable indicating if the ambient agent is currently processing
40
41
  */
41
42
  readonly isProcessing$: Observable<boolean>;
43
+ private _provider;
42
44
  constructor(mentionParser: MentionParserService, agentClientService: AgentClientService);
45
+ /**
46
+ * The metadata provider this service uses. When unset, falls back to Metadata.Provider.
47
+ * Setting it re-initializes the AI client to bind to the supplied provider.
48
+ */
49
+ get Provider(): IMetadataProvider;
50
+ set Provider(value: IMetadataProvider | null);
43
51
  /**
44
52
  * Initialize the GraphQL AI Client.
45
53
  * Retained for RunAIPrompt calls (intent checking) which the AgentClientService doesn't wrap.
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-agent.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/conversation-agent.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conversation-agent.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/conversation-agent.service.ts"],"names":[],"mappings":"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"}
@@ -25,11 +25,23 @@ export class ConversationAgentService {
25
25
  * Observable indicating if the ambient agent is currently processing
26
26
  */
27
27
  isProcessing$ = this._isProcessing$.asObservable();
28
+ _provider = null;
28
29
  constructor(mentionParser, agentClientService) {
29
30
  this.mentionParser = mentionParser;
30
31
  this.agentClientService = agentClientService;
31
32
  this.initializeAIClient();
32
33
  }
34
+ /**
35
+ * The metadata provider this service uses. When unset, falls back to Metadata.Provider.
36
+ * Setting it re-initializes the AI client to bind to the supplied provider.
37
+ */
38
+ get Provider() {
39
+ return this._provider ?? Metadata.Provider;
40
+ }
41
+ set Provider(value) {
42
+ this._provider = value;
43
+ this.initializeAIClient();
44
+ }
33
45
  /**
34
46
  * Initialize the GraphQL AI Client.
35
47
  * Retained for RunAIPrompt calls (intent checking) which the AgentClientService doesn't wrap.
@@ -37,7 +49,7 @@ export class ConversationAgentService {
37
49
  */
38
50
  initializeAIClient() {
39
51
  try {
40
- const provider = Metadata.Provider;
52
+ const provider = this.Provider;
41
53
  if (provider) {
42
54
  this._aiClient = new GraphQLAIClient(provider);
43
55
  }
@@ -104,7 +116,7 @@ export class ConversationAgentService {
104
116
  // Indicate agent is processing
105
117
  this._isProcessing$.next(true);
106
118
  // Get current user for permission filtering
107
- const currentUser = Metadata.Provider.CurrentUser;
119
+ const currentUser = this.Provider.CurrentUser;
108
120
  if (!currentUser) {
109
121
  console.warn('⚠️ No current user available for permission filtering, using unfiltered agents');
110
122
  }
@@ -228,7 +240,7 @@ export class ConversationAgentService {
228
240
  const artifactsByDetailId = new Map(); // DetailID -> array of artifact JSON strings
229
241
  const attachmentsByDetailId = new Map(); // DetailID -> array of AttachmentData
230
242
  if (messageIds.length > 0) {
231
- const rv = new RunView();
243
+ const rv = RunView.FromMetadataProvider(this.Provider);
232
244
  // Load artifacts and attachments in parallel
233
245
  const [artifactsLoaded, attachmentsLoaded] = await Promise.all([
234
246
  this.loadArtifactsForMessages(rv, messageIds, artifactsByDetailId),