@memberjunction/ng-conversations 6.1.4 → 6.2.0-edge.1

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 (424) hide show
  1. package/README.md +36 -3
  2. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts +19 -3
  3. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts.map +1 -1
  4. package/dist/lib/components/active-tasks/active-tasks-panel.component.js +39 -7
  5. package/dist/lib/components/active-tasks/active-tasks-panel.component.js.map +1 -1
  6. package/dist/lib/components/agent/active-agent-indicator.component.d.ts +74 -6
  7. package/dist/lib/components/agent/active-agent-indicator.component.d.ts.map +1 -1
  8. package/dist/lib/components/agent/active-agent-indicator.component.js +111 -21
  9. package/dist/lib/components/agent/active-agent-indicator.component.js.map +1 -1
  10. package/dist/lib/components/agent/agent-process-panel.component.d.ts +31 -5
  11. package/dist/lib/components/agent/agent-process-panel.component.d.ts.map +1 -1
  12. package/dist/lib/components/agent/agent-process-panel.component.js +71 -15
  13. package/dist/lib/components/agent/agent-process-panel.component.js.map +1 -1
  14. package/dist/lib/components/artifact/artifact-share-modal.component.d.ts +65 -9
  15. package/dist/lib/components/artifact/artifact-share-modal.component.d.ts.map +1 -1
  16. package/dist/lib/components/artifact/artifact-share-modal.component.js +169 -57
  17. package/dist/lib/components/artifact/artifact-share-modal.component.js.map +1 -1
  18. package/dist/lib/components/attachment/image-viewer.component.d.ts +77 -11
  19. package/dist/lib/components/attachment/image-viewer.component.d.ts.map +1 -1
  20. package/dist/lib/components/attachment/image-viewer.component.js +181 -47
  21. package/dist/lib/components/attachment/image-viewer.component.js.map +1 -1
  22. package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts +129 -19
  23. package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts.map +1 -1
  24. package/dist/lib/components/collection/artifact-collection-picker-modal.component.js +350 -116
  25. package/dist/lib/components/collection/artifact-collection-picker-modal.component.js.map +1 -1
  26. package/dist/lib/components/collection/artifact-create-modal.component.d.ts +60 -8
  27. package/dist/lib/components/collection/artifact-create-modal.component.d.ts.map +1 -1
  28. package/dist/lib/components/collection/artifact-create-modal.component.js +130 -46
  29. package/dist/lib/components/collection/artifact-create-modal.component.js.map +1 -1
  30. package/dist/lib/components/collection/collection-artifact-card.component.d.ts +63 -3
  31. package/dist/lib/components/collection/collection-artifact-card.component.d.ts.map +1 -1
  32. package/dist/lib/components/collection/collection-artifact-card.component.js +113 -19
  33. package/dist/lib/components/collection/collection-artifact-card.component.js.map +1 -1
  34. package/dist/lib/components/collection/collection-form-modal.component.d.ts +54 -8
  35. package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
  36. package/dist/lib/components/collection/collection-form-modal.component.js +130 -46
  37. package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
  38. package/dist/lib/components/collection/collection-share-modal.component.d.ts +70 -10
  39. package/dist/lib/components/collection/collection-share-modal.component.d.ts.map +1 -1
  40. package/dist/lib/components/collection/collection-share-modal.component.js +175 -53
  41. package/dist/lib/components/collection/collection-share-modal.component.js.map +1 -1
  42. package/dist/lib/components/collection/collection-tree.component.d.ts +89 -9
  43. package/dist/lib/components/collection/collection-tree.component.d.ts.map +1 -1
  44. package/dist/lib/components/collection/collection-tree.component.js +220 -70
  45. package/dist/lib/components/collection/collection-tree.component.js.map +1 -1
  46. package/dist/lib/components/collection/collection-view.component.d.ts +89 -11
  47. package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
  48. package/dist/lib/components/collection/collection-view.component.js +154 -40
  49. package/dist/lib/components/collection/collection-view.component.js.map +1 -1
  50. package/dist/lib/components/collection/collections-full-view.component.d.ts +390 -38
  51. package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
  52. package/dist/lib/components/collection/collections-full-view.component.js +951 -367
  53. package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
  54. package/dist/lib/components/composer/ai-composer.component.d.ts +213 -18
  55. package/dist/lib/components/composer/ai-composer.component.d.ts.map +1 -1
  56. package/dist/lib/components/composer/ai-composer.component.js +388 -44
  57. package/dist/lib/components/composer/ai-composer.component.js.map +1 -1
  58. package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts +12 -1
  59. package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts.map +1 -1
  60. package/dist/lib/components/conversation/conversation-agent-picker.component.js +26 -4
  61. package/dist/lib/components/conversation/conversation-agent-picker.component.js.map +1 -1
  62. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +1090 -123
  63. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  64. package/dist/lib/components/conversation/conversation-chat-area.component.js +2407 -731
  65. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  66. package/dist/lib/components/conversation/conversation-empty-state.component.d.ts +139 -19
  67. package/dist/lib/components/conversation/conversation-empty-state.component.d.ts.map +1 -1
  68. package/dist/lib/components/conversation/conversation-empty-state.component.js +296 -59
  69. package/dist/lib/components/conversation/conversation-empty-state.component.js.map +1 -1
  70. package/dist/lib/components/conversation/conversation-list.component.d.ts +579 -78
  71. package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
  72. package/dist/lib/components/conversation/conversation-list.component.js +2322 -823
  73. package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
  74. package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts +40 -4
  75. package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts.map +1 -1
  76. package/dist/lib/components/conversation/pinned-messages-panel.component.js +72 -14
  77. package/dist/lib/components/conversation/pinned-messages-panel.component.js.map +1 -1
  78. package/dist/lib/components/dialogs/input-dialog.component.d.ts +57 -11
  79. package/dist/lib/components/dialogs/input-dialog.component.d.ts.map +1 -1
  80. package/dist/lib/components/dialogs/input-dialog.component.js +128 -16
  81. package/dist/lib/components/dialogs/input-dialog.component.js.map +1 -1
  82. package/dist/lib/components/dialogs/rating-dialog.component.d.ts +68 -10
  83. package/dist/lib/components/dialogs/rating-dialog.component.d.ts.map +1 -1
  84. package/dist/lib/components/dialogs/rating-dialog.component.js +151 -27
  85. package/dist/lib/components/dialogs/rating-dialog.component.js.map +1 -1
  86. package/dist/lib/components/export/export-modal.component.d.ts +84 -10
  87. package/dist/lib/components/export/export-modal.component.d.ts.map +1 -1
  88. package/dist/lib/components/export/export-modal.component.js +173 -49
  89. package/dist/lib/components/export/export-modal.component.js.map +1 -1
  90. package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts +29 -3
  91. package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts.map +1 -1
  92. package/dist/lib/components/global-tasks/global-tasks-panel.component.js +58 -12
  93. package/dist/lib/components/global-tasks/global-tasks-panel.component.js.map +1 -1
  94. package/dist/lib/components/library/library-full-view.component.d.ts +57 -8
  95. package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -1
  96. package/dist/lib/components/library/library-full-view.component.js +119 -35
  97. package/dist/lib/components/library/library-full-view.component.js.map +1 -1
  98. package/dist/lib/components/members/members-modal.component.d.ts +76 -10
  99. package/dist/lib/components/members/members-modal.component.d.ts.map +1 -1
  100. package/dist/lib/components/members/members-modal.component.js +164 -50
  101. package/dist/lib/components/members/members-modal.component.js.map +1 -1
  102. package/dist/lib/components/message/actionable-commands.component.d.ts +37 -5
  103. package/dist/lib/components/message/actionable-commands.component.d.ts.map +1 -1
  104. package/dist/lib/components/message/actionable-commands.component.js +82 -16
  105. package/dist/lib/components/message/actionable-commands.component.js.map +1 -1
  106. package/dist/lib/components/message/conversation-message-rating.component.d.ts +46 -10
  107. package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -1
  108. package/dist/lib/components/message/conversation-message-rating.component.js +120 -36
  109. package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -1
  110. package/dist/lib/components/message/message-input.component.d.ts +549 -74
  111. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  112. package/dist/lib/components/message/message-input.component.js +1250 -421
  113. package/dist/lib/components/message/message-input.component.js.map +1 -1
  114. package/dist/lib/components/message/message-item.component.d.ts +411 -29
  115. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  116. package/dist/lib/components/message/message-item.component.js +896 -222
  117. package/dist/lib/components/message/message-item.component.js.map +1 -1
  118. package/dist/lib/components/message/message-list.component.d.ts +288 -29
  119. package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
  120. package/dist/lib/components/message/message-list.component.js +561 -123
  121. package/dist/lib/components/message/message-list.component.js.map +1 -1
  122. package/dist/lib/components/navigation/conversation-navigation.component.d.ts +64 -5
  123. package/dist/lib/components/navigation/conversation-navigation.component.d.ts.map +1 -1
  124. package/dist/lib/components/navigation/conversation-navigation.component.js +101 -11
  125. package/dist/lib/components/navigation/conversation-navigation.component.js.map +1 -1
  126. package/dist/lib/components/notification/activity-indicator.component.d.ts +6 -2
  127. package/dist/lib/components/notification/activity-indicator.component.d.ts.map +1 -1
  128. package/dist/lib/components/notification/activity-indicator.component.js +13 -3
  129. package/dist/lib/components/notification/activity-indicator.component.js.map +1 -1
  130. package/dist/lib/components/notification/notification-badge.component.d.ts +15 -3
  131. package/dist/lib/components/notification/notification-badge.component.d.ts.map +1 -1
  132. package/dist/lib/components/notification/notification-badge.component.js +36 -8
  133. package/dist/lib/components/notification/notification-badge.component.js.map +1 -1
  134. package/dist/lib/components/overlay/chat-overlay.component.d.ts +1 -1
  135. package/dist/lib/components/overlay/chat-overlay.component.js +4 -4
  136. package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
  137. package/dist/lib/components/project/project-form-modal.component.d.ts +93 -11
  138. package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -1
  139. package/dist/lib/components/project/project-form-modal.component.js +348 -87
  140. package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
  141. package/dist/lib/components/project/project-selector.component.d.ts +78 -8
  142. package/dist/lib/components/project/project-selector.component.d.ts.map +1 -1
  143. package/dist/lib/components/project/project-selector.component.js +177 -46
  144. package/dist/lib/components/project/project-selector.component.js.map +1 -1
  145. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.d.ts +1 -1
  146. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.d.ts.map +1 -1
  147. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.js.map +1 -1
  148. package/dist/lib/components/realtime/channels/client-context-channel.d.ts +1 -1
  149. package/dist/lib/components/realtime/channels/client-context-channel.d.ts.map +1 -1
  150. package/dist/lib/components/realtime/channels/client-context-channel.js +1 -1
  151. package/dist/lib/components/realtime/channels/client-context-channel.js.map +1 -1
  152. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts +1 -1
  153. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts.map +1 -1
  154. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js +3 -0
  155. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js.map +1 -1
  156. package/dist/lib/components/realtime/media/media-channel.d.ts +2 -1
  157. package/dist/lib/components/realtime/media/media-channel.d.ts.map +1 -1
  158. package/dist/lib/components/realtime/media/media-channel.js +1 -1
  159. package/dist/lib/components/realtime/media/media-channel.js.map +1 -1
  160. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts +2 -2
  161. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts.map +1 -1
  162. package/dist/lib/components/realtime/realtime-activity-rail.component.js +2 -2
  163. package/dist/lib/components/realtime/realtime-activity-rail.component.js.map +1 -1
  164. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +1 -1
  165. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -1
  166. package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -1
  167. package/dist/lib/components/realtime/realtime-composer.component.d.ts +3 -1
  168. package/dist/lib/components/realtime/realtime-composer.component.d.ts.map +1 -1
  169. package/dist/lib/components/realtime/realtime-composer.component.js +26 -8
  170. package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -1
  171. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts +2 -2
  172. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts.map +1 -1
  173. package/dist/lib/components/realtime/realtime-delegation-card.component.js +2 -2
  174. package/dist/lib/components/realtime/realtime-delegation-card.component.js.map +1 -1
  175. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +4 -4
  176. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -1
  177. package/dist/lib/components/realtime/realtime-session-overlay.component.js +19 -19
  178. package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
  179. package/dist/lib/components/realtime/realtime-session-state.d.ts +2 -3
  180. package/dist/lib/components/realtime/realtime-session-state.d.ts.map +1 -1
  181. package/dist/lib/components/realtime/realtime-session-state.js +3 -2
  182. package/dist/lib/components/realtime/realtime-session-state.js.map +1 -1
  183. package/dist/lib/components/realtime/realtime-session-thread.component.d.ts +17 -1
  184. package/dist/lib/components/realtime/realtime-session-thread.component.d.ts.map +1 -1
  185. package/dist/lib/components/realtime/realtime-session-thread.component.js +122 -45
  186. package/dist/lib/components/realtime/realtime-session-thread.component.js.map +1 -1
  187. package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts +47 -31
  188. package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts.map +1 -1
  189. package/dist/lib/components/realtime/realtime-session-timeline-card.component.js +138 -124
  190. package/dist/lib/components/realtime/realtime-session-timeline-card.component.js.map +1 -1
  191. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +4 -4
  192. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts.map +1 -1
  193. package/dist/lib/components/realtime/realtime-surface-tabs.component.js +4 -4
  194. package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -1
  195. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +2 -2
  196. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts.map +1 -1
  197. package/dist/lib/components/realtime/realtime-surface-tabs.model.js +3 -3
  198. package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -1
  199. package/dist/lib/components/realtime/realtime-ui-config.d.ts +13 -11
  200. package/dist/lib/components/realtime/realtime-ui-config.d.ts.map +1 -1
  201. package/dist/lib/components/realtime/realtime-ui-config.js +29 -25
  202. package/dist/lib/components/realtime/realtime-ui-config.js.map +1 -1
  203. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts +1 -1
  204. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts.map +1 -1
  205. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js +1 -1
  206. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js.map +1 -1
  207. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts +4 -2
  208. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -1
  209. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +7 -3
  210. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js.map +1 -1
  211. package/dist/lib/components/search/search-panel.component.d.ts +133 -22
  212. package/dist/lib/components/search/search-panel.component.d.ts.map +1 -1
  213. package/dist/lib/components/search/search-panel.component.js +312 -83
  214. package/dist/lib/components/search/search-panel.component.js.map +1 -1
  215. package/dist/lib/components/share/share-modal.component.d.ts +69 -9
  216. package/dist/lib/components/share/share-modal.component.d.ts.map +1 -1
  217. package/dist/lib/components/share/share-modal.component.js +139 -31
  218. package/dist/lib/components/share/share-modal.component.js.map +1 -1
  219. package/dist/lib/components/shared/user-picker.component.d.ts +48 -8
  220. package/dist/lib/components/shared/user-picker.component.d.ts.map +1 -1
  221. package/dist/lib/components/shared/user-picker.component.js +110 -30
  222. package/dist/lib/components/shared/user-picker.component.js.map +1 -1
  223. package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts +114 -11
  224. package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts.map +1 -1
  225. package/dist/lib/components/sidebar/conversation-sidebar.component.js +199 -21
  226. package/dist/lib/components/sidebar/conversation-sidebar.component.js.map +1 -1
  227. package/dist/lib/components/sidebar/routines-section.component.d.ts +20 -1
  228. package/dist/lib/components/sidebar/routines-section.component.d.ts.map +1 -1
  229. package/dist/lib/components/sidebar/routines-section.component.js +25 -5
  230. package/dist/lib/components/sidebar/routines-section.component.js.map +1 -1
  231. package/dist/lib/components/slots/slot-interfaces.d.ts +19 -0
  232. package/dist/lib/components/slots/slot-interfaces.d.ts.map +1 -1
  233. package/dist/lib/components/slots/slot-interfaces.js.map +1 -1
  234. package/dist/lib/components/task/tasks-full-view.component.d.ts +95 -13
  235. package/dist/lib/components/task/tasks-full-view.component.d.ts.map +1 -1
  236. package/dist/lib/components/task/tasks-full-view.component.js +223 -75
  237. package/dist/lib/components/task/tasks-full-view.component.js.map +1 -1
  238. package/dist/lib/components/tasks/task-widget.component.d.ts +46 -6
  239. package/dist/lib/components/tasks/task-widget.component.d.ts.map +1 -1
  240. package/dist/lib/components/tasks/task-widget.component.js +100 -16
  241. package/dist/lib/components/tasks/task-widget.component.js.map +1 -1
  242. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts +64 -7
  243. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -1
  244. package/dist/lib/components/tasks/tasks-dropdown.component.js +127 -27
  245. package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
  246. package/dist/lib/components/thread/thread-panel.component.d.ts +66 -8
  247. package/dist/lib/components/thread/thread-panel.component.d.ts.map +1 -1
  248. package/dist/lib/components/thread/thread-panel.component.js +146 -36
  249. package/dist/lib/components/thread/thread-panel.component.js.map +1 -1
  250. package/dist/lib/components/toast/toast.component.d.ts +11 -1
  251. package/dist/lib/components/toast/toast.component.d.ts.map +1 -1
  252. package/dist/lib/components/toast/toast.component.js +25 -5
  253. package/dist/lib/components/toast/toast.component.js.map +1 -1
  254. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +385 -42
  255. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  256. package/dist/lib/components/workspace/conversation-workspace.component.js +887 -291
  257. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  258. package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts +8 -0
  259. package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts.map +1 -1
  260. package/dist/lib/composer-plugins/base-conversation-mention.provider.js +8 -1
  261. package/dist/lib/composer-plugins/base-conversation-mention.provider.js.map +1 -1
  262. package/dist/lib/conversations.module.d.ts.map +1 -1
  263. package/dist/lib/conversations.module.js.map +1 -1
  264. package/dist/lib/directives/chat-slot.directive.d.ts +5 -1
  265. package/dist/lib/directives/chat-slot.directive.d.ts.map +1 -1
  266. package/dist/lib/directives/chat-slot.directive.js.map +1 -1
  267. package/dist/lib/directives/search-shortcut.directive.d.ts +9 -1
  268. package/dist/lib/directives/search-shortcut.directive.d.ts.map +1 -1
  269. package/dist/lib/directives/search-shortcut.directive.js +14 -4
  270. package/dist/lib/directives/search-shortcut.directive.js.map +1 -1
  271. package/dist/lib/events/chat-events.d.ts +34 -7
  272. package/dist/lib/events/chat-events.d.ts.map +1 -1
  273. package/dist/lib/events/chat-events.js +37 -7
  274. package/dist/lib/events/chat-events.js.map +1 -1
  275. package/dist/lib/models/agent-turn.model.d.ts +103 -0
  276. package/dist/lib/models/agent-turn.model.d.ts.map +1 -0
  277. package/dist/lib/models/agent-turn.model.js +12 -0
  278. package/dist/lib/models/agent-turn.model.js.map +1 -0
  279. package/dist/lib/models/collection-view.model.js.map +1 -1
  280. package/dist/lib/models/conversation-state.model.d.ts +8 -0
  281. package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
  282. package/dist/lib/models/conversation-state.model.js.map +1 -1
  283. package/dist/lib/models/lazy-artifact-info.d.ts +44 -12
  284. package/dist/lib/models/lazy-artifact-info.d.ts.map +1 -1
  285. package/dist/lib/models/lazy-artifact-info.js +98 -34
  286. package/dist/lib/models/lazy-artifact-info.js.map +1 -1
  287. package/dist/lib/services/active-tasks.service.d.ts +30 -4
  288. package/dist/lib/services/active-tasks.service.d.ts.map +1 -1
  289. package/dist/lib/services/active-tasks.service.js +71 -19
  290. package/dist/lib/services/active-tasks.service.js.map +1 -1
  291. package/dist/lib/services/agent-state.service.d.ts +17 -1
  292. package/dist/lib/services/agent-state.service.d.ts.map +1 -1
  293. package/dist/lib/services/agent-state.service.js +48 -16
  294. package/dist/lib/services/agent-state.service.js.map +1 -1
  295. package/dist/lib/services/artifact-permission.service.d.ts +39 -0
  296. package/dist/lib/services/artifact-permission.service.d.ts.map +1 -1
  297. package/dist/lib/services/artifact-permission.service.js +152 -17
  298. package/dist/lib/services/artifact-permission.service.js.map +1 -1
  299. package/dist/lib/services/artifact-state.service.d.ts +58 -5
  300. package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
  301. package/dist/lib/services/artifact-state.service.js +135 -35
  302. package/dist/lib/services/artifact-state.service.js.map +1 -1
  303. package/dist/lib/services/browser-realtime-media-host.d.ts +24 -0
  304. package/dist/lib/services/browser-realtime-media-host.d.ts.map +1 -0
  305. package/dist/lib/services/browser-realtime-media-host.js +95 -0
  306. package/dist/lib/services/browser-realtime-media-host.js.map +1 -0
  307. package/dist/lib/services/collection-permission.service.d.ts +28 -0
  308. package/dist/lib/services/collection-permission.service.d.ts.map +1 -1
  309. package/dist/lib/services/collection-permission.service.js +88 -32
  310. package/dist/lib/services/collection-permission.service.js.map +1 -1
  311. package/dist/lib/services/collection-state.service.d.ts +11 -1
  312. package/dist/lib/services/collection-state.service.d.ts.map +1 -1
  313. package/dist/lib/services/collection-state.service.js +25 -5
  314. package/dist/lib/services/collection-state.service.js.map +1 -1
  315. package/dist/lib/services/conversation-agent.service.d.ts +26 -4
  316. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  317. package/dist/lib/services/conversation-agent.service.js +57 -18
  318. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  319. package/dist/lib/services/conversation-attachment.service.d.ts +41 -2
  320. package/dist/lib/services/conversation-attachment.service.d.ts.map +1 -1
  321. package/dist/lib/services/conversation-attachment.service.js +80 -13
  322. package/dist/lib/services/conversation-attachment.service.js.map +1 -1
  323. package/dist/lib/services/conversation-streaming.service.d.ts +22 -0
  324. package/dist/lib/services/conversation-streaming.service.d.ts.map +1 -1
  325. package/dist/lib/services/conversation-streaming.service.js +50 -10
  326. package/dist/lib/services/conversation-streaming.service.js.map +1 -1
  327. package/dist/lib/services/data-cache.service.d.ts +31 -0
  328. package/dist/lib/services/data-cache.service.d.ts.map +1 -1
  329. package/dist/lib/services/data-cache.service.js +71 -15
  330. package/dist/lib/services/data-cache.service.js.map +1 -1
  331. package/dist/lib/services/dialog.service.d.ts +13 -0
  332. package/dist/lib/services/dialog.service.d.ts.map +1 -1
  333. package/dist/lib/services/dialog.service.js +25 -5
  334. package/dist/lib/services/dialog.service.js.map +1 -1
  335. package/dist/lib/services/export.service.d.ts +2 -0
  336. package/dist/lib/services/export.service.d.ts.map +1 -1
  337. package/dist/lib/services/export.service.js +5 -1
  338. package/dist/lib/services/export.service.js.map +1 -1
  339. package/dist/lib/services/graphql-attachment-blob-store.d.ts +44 -0
  340. package/dist/lib/services/graphql-attachment-blob-store.d.ts.map +1 -0
  341. package/dist/lib/services/graphql-attachment-blob-store.js +113 -0
  342. package/dist/lib/services/graphql-attachment-blob-store.js.map +1 -0
  343. package/dist/lib/services/mention-autocomplete.service.d.ts +17 -141
  344. package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
  345. package/dist/lib/services/mention-autocomplete.service.js +15 -460
  346. package/dist/lib/services/mention-autocomplete.service.js.map +1 -1
  347. package/dist/lib/services/mention-parser.service.d.ts +10 -0
  348. package/dist/lib/services/mention-parser.service.d.ts.map +1 -1
  349. package/dist/lib/services/mention-parser.service.js +25 -5
  350. package/dist/lib/services/mention-parser.service.js.map +1 -1
  351. package/dist/lib/services/notification.service.d.ts +54 -6
  352. package/dist/lib/services/notification.service.d.ts.map +1 -1
  353. package/dist/lib/services/notification.service.js +123 -27
  354. package/dist/lib/services/notification.service.js.map +1 -1
  355. package/dist/lib/services/realtime-audio-recorder.d.ts +4 -4
  356. package/dist/lib/services/realtime-audio-recorder.js +12 -12
  357. package/dist/lib/services/realtime-audio-recorder.js.map +1 -1
  358. package/dist/lib/services/realtime-pcm-wav.d.ts +4 -0
  359. package/dist/lib/services/realtime-pcm-wav.d.ts.map +1 -1
  360. package/dist/lib/services/realtime-pcm-wav.js +10 -2
  361. package/dist/lib/services/realtime-pcm-wav.js.map +1 -1
  362. package/dist/lib/services/realtime-session-review.service.d.ts +1 -1
  363. package/dist/lib/services/realtime-session-review.service.d.ts.map +1 -1
  364. package/dist/lib/services/realtime-session-review.service.js +1 -1
  365. package/dist/lib/services/realtime-session-review.service.js.map +1 -1
  366. package/dist/lib/services/realtime-session.service.d.ts +16 -1150
  367. package/dist/lib/services/realtime-session.service.d.ts.map +1 -1
  368. package/dist/lib/services/realtime-session.service.js +28 -2430
  369. package/dist/lib/services/realtime-session.service.js.map +1 -1
  370. package/dist/lib/services/search.service.d.ts +42 -9
  371. package/dist/lib/services/search.service.d.ts.map +1 -1
  372. package/dist/lib/services/search.service.js +103 -23
  373. package/dist/lib/services/search.service.js.map +1 -1
  374. package/dist/lib/services/toast.service.d.ts +19 -1
  375. package/dist/lib/services/toast.service.d.ts.map +1 -1
  376. package/dist/lib/services/toast.service.js +45 -9
  377. package/dist/lib/services/toast.service.js.map +1 -1
  378. package/dist/lib/services/ui-command-handler.service.d.ts +16 -2
  379. package/dist/lib/services/ui-command-handler.service.d.ts.map +1 -1
  380. package/dist/lib/services/ui-command-handler.service.js +36 -8
  381. package/dist/lib/services/ui-command-handler.service.js.map +1 -1
  382. package/dist/lib/utils/agent-artifact-summary.d.ts +2 -2
  383. package/dist/lib/utils/agent-artifact-summary.js +3 -3
  384. package/dist/lib/utils/agent-artifact-summary.js.map +1 -1
  385. package/dist/lib/utils/agent-turn-routing.d.ts +69 -0
  386. package/dist/lib/utils/agent-turn-routing.d.ts.map +1 -0
  387. package/dist/lib/utils/agent-turn-routing.js +96 -0
  388. package/dist/lib/utils/agent-turn-routing.js.map +1 -0
  389. package/dist/lib/utils/artifact-panel-action.d.ts +15 -4
  390. package/dist/lib/utils/artifact-panel-action.d.ts.map +1 -1
  391. package/dist/lib/utils/artifact-panel-action.js +10 -2
  392. package/dist/lib/utils/artifact-panel-action.js.map +1 -1
  393. package/dist/lib/utils/distinct-artifacts.d.ts +2 -0
  394. package/dist/lib/utils/distinct-artifacts.d.ts.map +1 -1
  395. package/dist/lib/utils/distinct-artifacts.js +5 -1
  396. package/dist/lib/utils/distinct-artifacts.js.map +1 -1
  397. package/dist/lib/utils/plan-mode-preference.d.ts +2 -2
  398. package/dist/lib/utils/plan-mode-preference.js +6 -6
  399. package/dist/lib/utils/plan-mode-preference.js.map +1 -1
  400. package/dist/lib/utils/realtime-session-timeline.d.ts +8 -79
  401. package/dist/lib/utils/realtime-session-timeline.d.ts.map +1 -1
  402. package/dist/lib/utils/realtime-session-timeline.js +8 -89
  403. package/dist/lib/utils/realtime-session-timeline.js.map +1 -1
  404. package/dist/public-api.d.ts +5 -2
  405. package/dist/public-api.d.ts.map +1 -1
  406. package/dist/public-api.js +9 -2
  407. package/dist/public-api.js.map +1 -1
  408. package/package.json +33 -32
  409. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts +0 -384
  410. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts.map +0 -1
  411. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js +0 -231
  412. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js.map +0 -1
  413. package/dist/lib/services/delegation-result-parser.d.ts +0 -50
  414. package/dist/lib/services/delegation-result-parser.d.ts.map +0 -1
  415. package/dist/lib/services/delegation-result-parser.js +0 -60
  416. package/dist/lib/services/delegation-result-parser.js.map +0 -1
  417. package/dist/lib/services/narration-template.d.ts +0 -42
  418. package/dist/lib/services/narration-template.d.ts.map +0 -1
  419. package/dist/lib/services/narration-template.js +0 -73
  420. package/dist/lib/services/narration-template.js.map +0 -1
  421. package/dist/lib/services/skill-picker-narrowing.d.ts +0 -13
  422. package/dist/lib/services/skill-picker-narrowing.d.ts.map +0 -1
  423. package/dist/lib/services/skill-picker-narrowing.js +0 -13
  424. package/dist/lib/services/skill-picker-narrowing.js.map +0 -1
@@ -36,48 +36,87 @@ export declare class ArtifactPermissionService {
36
36
  /**
37
37
  * Load all explicit permissions for an artifact
38
38
  */
39
+ LoadPermissions(artifactId: string, currentUser: UserInfo): Promise<ArtifactPermission[]>;
40
+ /** @deprecated Use {@link LoadPermissions}. */
39
41
  loadPermissions(artifactId: string, currentUser: UserInfo): Promise<ArtifactPermission[]>;
40
42
  /**
41
43
  * Check if user has specific permission for an artifact (HYBRID CHECK)
42
44
  * Checks in order: Owner > Explicit Permission > Collection Inheritance
43
45
  */
46
+ CheckPermission(artifactId: string, userId: string, permission: 'read' | 'edit' | 'share', currentUser: UserInfo): Promise<boolean>;
47
+ /** @deprecated Use {@link CheckPermission}. */
44
48
  checkPermission(artifactId: string, userId: string, permission: 'read' | 'edit' | 'share', currentUser: UserInfo): Promise<boolean>;
45
49
  /**
46
50
  * Get explicit permission record for a user on an artifact
47
51
  */
52
+ GetExplicitPermission(artifactId: string, userId: string, currentUser: UserInfo): Promise<ArtifactPermission | null>;
53
+ /** @deprecated Use {@link GetExplicitPermission}. */
48
54
  getExplicitPermission(artifactId: string, userId: string, currentUser: UserInfo): Promise<ArtifactPermission | null>;
49
55
  /**
50
56
  * Get all effective permissions for an artifact (owner + explicit + inherited)
51
57
  */
58
+ GetEffectiveUsers(artifactId: string, currentUser: UserInfo): Promise<EffectivePermission[]>;
59
+ /** @deprecated Use {@link GetEffectiveUsers}. */
52
60
  getEffectiveUsers(artifactId: string, currentUser: UserInfo): Promise<EffectivePermission[]>;
53
61
  /**
54
62
  * Grant explicit permission to a user
55
63
  */
64
+ GrantPermission(artifactId: string, userId: string, permissions: ArtifactPermissionSet, sharedByUserId: string, currentUser: UserInfo): Promise<MJArtifactPermissionEntity>;
65
+ /** @deprecated Use {@link GrantPermission}. */
56
66
  grantPermission(artifactId: string, userId: string, permissions: ArtifactPermissionSet, sharedByUserId: string, currentUser: UserInfo): Promise<MJArtifactPermissionEntity>;
57
67
  /**
58
68
  * Update existing permission
59
69
  */
70
+ UpdatePermission(permissionId: string, permissions: ArtifactPermissionSet, currentUser: UserInfo): Promise<boolean>;
71
+ /** @deprecated Use {@link UpdatePermission}. */
60
72
  updatePermission(permissionId: string, permissions: ArtifactPermissionSet, currentUser: UserInfo): Promise<boolean>;
61
73
  /**
62
74
  * Revoke explicit permission
63
75
  */
76
+ RevokePermission(permissionId: string, currentUser: UserInfo): Promise<boolean>;
77
+ /** @deprecated Use {@link RevokePermission}. */
64
78
  revokePermission(permissionId: string, currentUser: UserInfo): Promise<boolean>;
65
79
  /**
66
80
  * Validate that requested permissions don't exceed granter's permissions
67
81
  */
82
+ ValidatePermissions(requested: ArtifactPermissionSet, granter: ArtifactPermissionSet, isOwner: boolean): boolean;
83
+ /** @deprecated Use {@link ValidatePermissions}. */
68
84
  validatePermissions(requested: ArtifactPermissionSet, granter: ArtifactPermissionSet, isOwner: boolean): boolean;
69
85
  /**
70
86
  * Get available permissions for a user to grant based on their own permissions
71
87
  */
88
+ GetAvailablePermissions(userPermissions: ArtifactPermissionSet, isOwner: boolean): string[];
89
+ /** @deprecated Use {@link GetAvailablePermissions}. */
72
90
  getAvailablePermissions(userPermissions: ArtifactPermissionSet, isOwner: boolean): string[];
73
91
  /**
74
92
  * Check if user is owner of artifact
75
93
  */
94
+ IsOwner(artifactId: string, userId: string, currentUser: UserInfo): Promise<boolean>;
95
+ /** @deprecated Use {@link IsOwner}. */
76
96
  isOwner(artifactId: string, userId: string, currentUser: UserInfo): Promise<boolean>;
77
97
  /**
78
98
  * Get all permissions for current user on an artifact (convenience method for UI)
79
99
  */
100
+ GetUserPermissions(artifactId: string, currentUser: UserInfo): Promise<ArtifactPermissionSet>;
101
+ /** @deprecated Use {@link GetUserPermissions}. */
80
102
  getUserPermissions(artifactId: string, currentUser: UserInfo): Promise<ArtifactPermissionSet>;
103
+ /**
104
+ * Returns an `ExtraFilter` for `MJ: Artifacts` that matches the artifacts the user can read,
105
+ * by the same rule as {@link CheckPermission}: the user owns it, else an explicit grant
106
+ * decides, else a read grant on a collection that holds a version of it.
107
+ *
108
+ * Each lookup runs against its own entity, so the filter holds only `UserID` and IDs.
109
+ */
110
+ GetReadableArtifactsFilter(userId: string, currentUser: UserInfo): Promise<string>;
111
+ /**
112
+ * IDs of artifacts that have at least one version in any of the given collections.
113
+ */
114
+ private getArtifactIdsInCollections;
115
+ /**
116
+ * Applies the grant order: an explicit grant decides for its artifact; collection access
117
+ * counts only for artifacts that have no explicit grant.
118
+ */
119
+ private resolveReadableArtifactIds;
81
120
  /**
82
121
  * Helper: Get artifact record
83
122
  */
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-permission.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/artifact-permission.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"artifact-permission.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/artifact-permission.service.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Injectable } from '@angular/core';
2
2
  import { RunView, Metadata } from '@memberjunction/core';
3
- import { UUIDsEqual } from '@memberjunction/global';
3
+ import { NormalizeUUID, UUIDsEqual } from '@memberjunction/global';
4
4
  import * as i0 from "@angular/core";
5
5
  import * as i1 from "./collection-permission.service";
6
6
  export class ArtifactPermissionService {
@@ -25,7 +25,7 @@ export class ArtifactPermissionService {
25
25
  /**
26
26
  * Load all explicit permissions for an artifact
27
27
  */
28
- async loadPermissions(artifactId, currentUser) {
28
+ async LoadPermissions(artifactId, currentUser) {
29
29
  const rv = RunView.FromMetadataProvider(this.Provider);
30
30
  const result = await rv.RunView({
31
31
  EntityName: 'MJ: Artifact Permissions',
@@ -38,18 +38,22 @@ export class ArtifactPermissionService {
38
38
  }
39
39
  return [];
40
40
  }
41
+ /** @deprecated Use {@link LoadPermissions}. */
42
+ async loadPermissions(artifactId, currentUser) {
43
+ return this.LoadPermissions(artifactId, currentUser);
44
+ }
41
45
  /**
42
46
  * Check if user has specific permission for an artifact (HYBRID CHECK)
43
47
  * Checks in order: Owner > Explicit Permission > Collection Inheritance
44
48
  */
45
- async checkPermission(artifactId, userId, permission, currentUser) {
49
+ async CheckPermission(artifactId, userId, permission, currentUser) {
46
50
  // 1. Check ownership - owner has all permissions
47
51
  const artifact = await this.getArtifact(artifactId, currentUser);
48
52
  if (artifact && UUIDsEqual(artifact.UserID, userId)) {
49
53
  return true;
50
54
  }
51
55
  // 2. Check explicit artifact permission
52
- const explicit = await this.getExplicitPermission(artifactId, userId, currentUser);
56
+ const explicit = await this.GetExplicitPermission(artifactId, userId, currentUser);
53
57
  if (explicit) {
54
58
  return this.hasPermission(explicit, permission);
55
59
  }
@@ -64,10 +68,14 @@ export class ArtifactPermissionService {
64
68
  // 4. No access
65
69
  return false;
66
70
  }
71
+ /** @deprecated Use {@link CheckPermission}. */
72
+ async checkPermission(artifactId, userId, permission, currentUser) {
73
+ return this.CheckPermission(artifactId, userId, permission, currentUser);
74
+ }
67
75
  /**
68
76
  * Get explicit permission record for a user on an artifact
69
77
  */
70
- async getExplicitPermission(artifactId, userId, currentUser) {
78
+ async GetExplicitPermission(artifactId, userId, currentUser) {
71
79
  const rv = RunView.FromMetadataProvider(this.Provider);
72
80
  const result = await rv.RunView({
73
81
  EntityName: 'MJ: Artifact Permissions',
@@ -80,10 +88,14 @@ export class ArtifactPermissionService {
80
88
  }
81
89
  return null;
82
90
  }
91
+ /** @deprecated Use {@link GetExplicitPermission}. */
92
+ async getExplicitPermission(artifactId, userId, currentUser) {
93
+ return this.GetExplicitPermission(artifactId, userId, currentUser);
94
+ }
83
95
  /**
84
96
  * Get all effective permissions for an artifact (owner + explicit + inherited)
85
97
  */
86
- async getEffectiveUsers(artifactId, currentUser) {
98
+ async GetEffectiveUsers(artifactId, currentUser) {
87
99
  const effectivePermissions = [];
88
100
  const seenUsers = new Set();
89
101
  // 1. Add owner
@@ -105,7 +117,7 @@ export class ArtifactPermissionService {
105
117
  seenUsers.add(artifact.UserID);
106
118
  }
107
119
  // 2. Add explicit permissions
108
- const explicitPerms = await this.loadPermissions(artifactId, currentUser);
120
+ const explicitPerms = await this.LoadPermissions(artifactId, currentUser);
109
121
  for (const perm of explicitPerms) {
110
122
  if (!seenUsers.has(perm.userId)) {
111
123
  effectivePermissions.push({
@@ -141,10 +153,14 @@ export class ArtifactPermissionService {
141
153
  }
142
154
  return effectivePermissions;
143
155
  }
156
+ /** @deprecated Use {@link GetEffectiveUsers}. */
157
+ async getEffectiveUsers(artifactId, currentUser) {
158
+ return this.GetEffectiveUsers(artifactId, currentUser);
159
+ }
144
160
  /**
145
161
  * Grant explicit permission to a user
146
162
  */
147
- async grantPermission(artifactId, userId, permissions, sharedByUserId, currentUser) {
163
+ async GrantPermission(artifactId, userId, permissions, sharedByUserId, currentUser) {
148
164
  const md = this.Provider;
149
165
  const permission = await md.GetEntityObject('MJ: Artifact Permissions', currentUser);
150
166
  permission.ArtifactID = artifactId;
@@ -159,10 +175,14 @@ export class ArtifactPermissionService {
159
175
  }
160
176
  return permission;
161
177
  }
178
+ /** @deprecated Use {@link GrantPermission}. */
179
+ async grantPermission(artifactId, userId, permissions, sharedByUserId, currentUser) {
180
+ return this.GrantPermission(artifactId, userId, permissions, sharedByUserId, currentUser);
181
+ }
162
182
  /**
163
183
  * Update existing permission
164
184
  */
165
- async updatePermission(permissionId, permissions, currentUser) {
185
+ async UpdatePermission(permissionId, permissions, currentUser) {
166
186
  const md = this.Provider;
167
187
  const permission = await md.GetEntityObject('MJ: Artifact Permissions', currentUser);
168
188
  await permission.Load(permissionId);
@@ -171,19 +191,27 @@ export class ArtifactPermissionService {
171
191
  permission.CanShare = permissions.canShare;
172
192
  return await permission.Save();
173
193
  }
194
+ /** @deprecated Use {@link UpdatePermission}. */
195
+ async updatePermission(permissionId, permissions, currentUser) {
196
+ return this.UpdatePermission(permissionId, permissions, currentUser);
197
+ }
174
198
  /**
175
199
  * Revoke explicit permission
176
200
  */
177
- async revokePermission(permissionId, currentUser) {
201
+ async RevokePermission(permissionId, currentUser) {
178
202
  const md = this.Provider;
179
203
  const permission = await md.GetEntityObject('MJ: Artifact Permissions', currentUser);
180
204
  await permission.Load(permissionId);
181
205
  return await permission.Delete();
182
206
  }
207
+ /** @deprecated Use {@link RevokePermission}. */
208
+ async revokePermission(permissionId, currentUser) {
209
+ return this.RevokePermission(permissionId, currentUser);
210
+ }
183
211
  /**
184
212
  * Validate that requested permissions don't exceed granter's permissions
185
213
  */
186
- validatePermissions(requested, granter, isOwner) {
214
+ ValidatePermissions(requested, granter, isOwner) {
187
215
  if (isOwner)
188
216
  return true; // Owner can grant anything
189
217
  // Can't grant permissions you don't have
@@ -193,10 +221,14 @@ export class ArtifactPermissionService {
193
221
  return false;
194
222
  return true;
195
223
  }
224
+ /** @deprecated Use {@link ValidatePermissions}. */
225
+ validatePermissions(requested, granter, isOwner) {
226
+ return this.ValidatePermissions(requested, granter, isOwner);
227
+ }
196
228
  /**
197
229
  * Get available permissions for a user to grant based on their own permissions
198
230
  */
199
- getAvailablePermissions(userPermissions, isOwner) {
231
+ GetAvailablePermissions(userPermissions, isOwner) {
200
232
  if (isOwner) {
201
233
  return ['Read', 'Edit', 'Share'];
202
234
  }
@@ -207,24 +239,127 @@ export class ArtifactPermissionService {
207
239
  available.push('Share');
208
240
  return available;
209
241
  }
242
+ /** @deprecated Use {@link GetAvailablePermissions}. */
243
+ getAvailablePermissions(userPermissions, isOwner) {
244
+ return this.GetAvailablePermissions(userPermissions, isOwner);
245
+ }
210
246
  /**
211
247
  * Check if user is owner of artifact
212
248
  */
213
- async isOwner(artifactId, userId, currentUser) {
249
+ async IsOwner(artifactId, userId, currentUser) {
214
250
  const artifact = await this.getArtifact(artifactId, currentUser);
215
251
  return artifact ? UUIDsEqual(artifact.UserID, userId) : false;
216
252
  }
253
+ /** @deprecated Use {@link IsOwner}. */
254
+ async isOwner(artifactId, userId, currentUser) {
255
+ return this.IsOwner(artifactId, userId, currentUser);
256
+ }
217
257
  /**
218
258
  * Get all permissions for current user on an artifact (convenience method for UI)
219
259
  */
220
- async getUserPermissions(artifactId, currentUser) {
260
+ async GetUserPermissions(artifactId, currentUser) {
221
261
  const [canRead, canEdit, canShare] = await Promise.all([
222
- this.checkPermission(artifactId, currentUser.ID, 'read', currentUser),
223
- this.checkPermission(artifactId, currentUser.ID, 'edit', currentUser),
224
- this.checkPermission(artifactId, currentUser.ID, 'share', currentUser)
262
+ this.CheckPermission(artifactId, currentUser.ID, 'read', currentUser),
263
+ this.CheckPermission(artifactId, currentUser.ID, 'edit', currentUser),
264
+ this.CheckPermission(artifactId, currentUser.ID, 'share', currentUser)
225
265
  ]);
226
266
  return { canRead, canEdit, canShare };
227
267
  }
268
+ /** @deprecated Use {@link GetUserPermissions}. */
269
+ async getUserPermissions(artifactId, currentUser) {
270
+ return this.GetUserPermissions(artifactId, currentUser);
271
+ }
272
+ /**
273
+ * Returns an `ExtraFilter` for `MJ: Artifacts` that matches the artifacts the user can read,
274
+ * by the same rule as {@link CheckPermission}: the user owns it, else an explicit grant
275
+ * decides, else a read grant on a collection that holds a version of it.
276
+ *
277
+ * Each lookup runs against its own entity, so the filter holds only `UserID` and IDs.
278
+ */
279
+ async GetReadableArtifactsFilter(userId, currentUser) {
280
+ const ownerOnly = `(UserID='${userId}')`;
281
+ const rv = RunView.FromMetadataProvider(this.Provider);
282
+ const [grantResult, collectionResult] = await rv.RunViews([
283
+ {
284
+ EntityName: 'MJ: Artifact Permissions',
285
+ ExtraFilter: `UserID='${userId}'`,
286
+ Fields: ['ArtifactID', 'CanRead'],
287
+ ResultType: 'simple'
288
+ },
289
+ {
290
+ EntityName: 'MJ: Collection Permissions',
291
+ ExtraFilter: `UserID='${userId}' AND CanRead=1`,
292
+ Fields: ['CollectionID'],
293
+ ResultType: 'simple'
294
+ }
295
+ ], currentUser);
296
+ // Without the explicit grants, a grant that withholds read is unknown, so collection
297
+ // access cannot be applied safely.
298
+ if (!grantResult.Success) {
299
+ console.error('Failed to load artifact grants:', grantResult.ErrorMessage);
300
+ return ownerOnly;
301
+ }
302
+ const grants = (grantResult.Results ?? []);
303
+ const collectionIds = collectionResult.Success
304
+ ? (collectionResult.Results ?? []).map(r => r.CollectionID)
305
+ : [];
306
+ const collectionArtifactIds = await this.getArtifactIdsInCollections(collectionIds, currentUser);
307
+ const readableIds = this.resolveReadableArtifactIds(grants, collectionArtifactIds);
308
+ return readableIds.length > 0
309
+ ? `(UserID='${userId}' OR ID IN (${readableIds.map(id => `'${id}'`).join(',')}))`
310
+ : ownerOnly;
311
+ }
312
+ /**
313
+ * IDs of artifacts that have at least one version in any of the given collections.
314
+ */
315
+ async getArtifactIdsInCollections(collectionIds, currentUser) {
316
+ if (collectionIds.length === 0) {
317
+ return [];
318
+ }
319
+ const rv = RunView.FromMetadataProvider(this.Provider);
320
+ const versionResult = await rv.RunView({
321
+ EntityName: 'MJ: Collection Artifacts',
322
+ ExtraFilter: `CollectionID IN (${collectionIds.map(id => `'${id}'`).join(',')})`,
323
+ Fields: ['ArtifactVersionID'],
324
+ ResultType: 'simple'
325
+ }, currentUser);
326
+ const versionIds = versionResult.Success ? (versionResult.Results ?? []).map(r => r.ArtifactVersionID) : [];
327
+ if (versionIds.length === 0) {
328
+ return [];
329
+ }
330
+ const artifactResult = await rv.RunView({
331
+ EntityName: 'MJ: Artifact Versions',
332
+ ExtraFilter: `ID IN (${versionIds.map(id => `'${id}'`).join(',')})`,
333
+ Fields: ['ArtifactID'],
334
+ ResultType: 'simple'
335
+ }, currentUser);
336
+ return artifactResult.Success ? (artifactResult.Results ?? []).map(r => r.ArtifactID) : [];
337
+ }
338
+ /**
339
+ * Applies the grant order: an explicit grant decides for its artifact; collection access
340
+ * counts only for artifacts that have no explicit grant.
341
+ */
342
+ resolveReadableArtifactIds(grants, collectionArtifactIds) {
343
+ const explicitRead = new Map();
344
+ for (const grant of grants) {
345
+ const key = NormalizeUUID(grant.ArtifactID);
346
+ const canRead = (explicitRead.get(key)?.canRead ?? false) || !!grant.CanRead;
347
+ explicitRead.set(key, { id: grant.ArtifactID, canRead });
348
+ }
349
+ const readable = new Map();
350
+ for (const { id, canRead } of explicitRead.values()) {
351
+ if (canRead) {
352
+ readable.set(NormalizeUUID(id), id);
353
+ }
354
+ }
355
+ for (const id of collectionArtifactIds) {
356
+ const key = NormalizeUUID(id);
357
+ if (!explicitRead.has(key) && !readable.has(key)) {
358
+ readable.set(key, id);
359
+ }
360
+ }
361
+ return [...readable.values()];
362
+ }
228
363
  /**
229
364
  * Helper: Get artifact record
230
365
  */
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-permission.service.js","sourceRoot":"","sources":["../../../src/lib/services/artifact-permission.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\nimport { UserInfo, RunView, Metadata, IMetadataProvider } from '@memberjunction/core';\nimport { MJArtifactPermissionEntity, MJArtifactEntity, MJCollectionArtifactEntity } from '@memberjunction/core-entities';\nimport { CollectionPermissionService } from './collection-permission.service';\nimport { UUIDsEqual } from '@memberjunction/global';\n\nexport interface ArtifactPermission {\n id: string;\n artifactId: string;\n userId: string;\n userName: string;\n canRead: boolean;\n canEdit: boolean;\n canShare: boolean;\n sharedByUserId: string | null;\n sharedByUserName: string | null;\n sharedAt: Date;\n}\n\nexport interface EffectivePermission extends ArtifactPermission {\n source: 'owner' | 'explicit' | 'collection';\n collectionName?: string; // If inherited from collection\n}\n\nexport interface ArtifactPermissionSet {\n canRead: boolean;\n canEdit: boolean;\n canShare: boolean;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ArtifactPermissionService {\n private _provider: IMetadataProvider | null = null;\n\n constructor(\n private collectionPermissionService: CollectionPermissionService\n ) {}\n\n /**\n * The metadata provider this service uses. When unset, falls back to Metadata.Provider.\n * Setting it also propagates to the collection-permission service this depends on.\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.collectionPermissionService.Provider = value;\n }\n }\n\n /**\n * Load all explicit permissions for an artifact\n */\n async loadPermissions(artifactId: string, currentUser: UserInfo): Promise<ArtifactPermission[]> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<MJArtifactPermissionEntity>({\n EntityName: 'MJ: Artifact Permissions',\n ExtraFilter: `ArtifactID='${artifactId}'`,\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 specific permission for an artifact (HYBRID CHECK)\n * Checks in order: Owner > Explicit Permission > Collection Inheritance\n */\n async checkPermission(\n artifactId: string,\n userId: string,\n permission: 'read' | 'edit' | 'share',\n currentUser: UserInfo\n ): Promise<boolean> {\n // 1. Check ownership - owner has all permissions\n const artifact = await this.getArtifact(artifactId, currentUser);\n if (artifact && UUIDsEqual(artifact.UserID, userId)) {\n return true;\n }\n\n // 2. Check explicit artifact permission\n const explicit = await this.getExplicitPermission(artifactId, userId, currentUser);\n if (explicit) {\n return this.hasPermission(explicit, permission);\n }\n\n // 3. Check collection permission inheritance\n const collections = await this.getArtifactCollections(artifactId, currentUser);\n for (const collection of collections) {\n const collectionPermission = await this.collectionPermissionService.checkPermission(\n collection.CollectionID,\n userId,\n currentUser\n );\n\n if (collectionPermission && this.hasCollectionPermission(collectionPermission, permission)) {\n return true; // Inherited from collection\n }\n }\n\n // 4. No access\n return false;\n }\n\n /**\n * Get explicit permission record for a user on an artifact\n */\n async getExplicitPermission(\n artifactId: string,\n userId: string,\n currentUser: UserInfo\n ): Promise<ArtifactPermission | null> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<MJArtifactPermissionEntity>({\n EntityName: 'MJ: Artifact Permissions',\n ExtraFilter: `ArtifactID='${artifactId}' 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 * Get all effective permissions for an artifact (owner + explicit + inherited)\n */\n async getEffectiveUsers(artifactId: string, currentUser: UserInfo): Promise<EffectivePermission[]> {\n const effectivePermissions: EffectivePermission[] = [];\n const seenUsers = new Set<string>();\n\n // 1. Add owner\n const artifact = await this.getArtifact(artifactId, currentUser);\n if (artifact && artifact.UserID) {\n effectivePermissions.push({\n id: '', // No permission record for owner\n artifactId: artifactId,\n userId: artifact.UserID,\n userName: artifact.User || 'Owner',\n canRead: true,\n canEdit: true,\n canShare: true,\n sharedByUserId: null,\n sharedByUserName: null,\n sharedAt: artifact.__mj_CreatedAt,\n source: 'owner'\n });\n seenUsers.add(artifact.UserID);\n }\n\n // 2. Add explicit permissions\n const explicitPerms = await this.loadPermissions(artifactId, currentUser);\n for (const perm of explicitPerms) {\n if (!seenUsers.has(perm.userId)) {\n effectivePermissions.push({\n ...perm,\n source: 'explicit'\n });\n seenUsers.add(perm.userId);\n }\n }\n\n // 3. Add collection-inherited permissions\n const collections = await this.getArtifactCollections(artifactId, currentUser);\n for (const collection of collections) {\n const collectionPerms = await this.collectionPermissionService.loadPermissions(\n collection.CollectionID,\n currentUser\n );\n\n for (const collPerm of collectionPerms) {\n if (!seenUsers.has(collPerm.userId)) {\n effectivePermissions.push({\n id: '',\n artifactId: artifactId,\n userId: collPerm.userId,\n userName: collPerm.userName,\n canRead: collPerm.canRead,\n canEdit: collPerm.canEdit,\n canShare: collPerm.canShare,\n sharedByUserId: collPerm.sharedByUserId,\n sharedByUserName: collPerm.sharedByUserName,\n sharedAt: collPerm.sharedAt,\n source: 'collection',\n collectionName: collection.Collection || 'Unknown Collection'\n });\n seenUsers.add(collPerm.userId);\n }\n }\n }\n\n return effectivePermissions;\n }\n\n /**\n * Grant explicit permission to a user\n */\n async grantPermission(\n artifactId: string,\n userId: string,\n permissions: ArtifactPermissionSet,\n sharedByUserId: string,\n currentUser: UserInfo\n ): Promise<MJArtifactPermissionEntity> {\n const md = this.Provider;\n const permission = await md.GetEntityObject<MJArtifactPermissionEntity>(\n 'MJ: Artifact Permissions',\n currentUser\n );\n\n permission.ArtifactID = artifactId;\n permission.UserID = userId;\n permission.CanRead = permissions.canRead;\n permission.CanEdit = permissions.canEdit;\n permission.CanShare = permissions.canShare;\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 * Update existing permission\n */\n async updatePermission(\n permissionId: string,\n permissions: ArtifactPermissionSet,\n currentUser: UserInfo\n ): Promise<boolean> {\n const md = this.Provider;\n const permission = await md.GetEntityObject<MJArtifactPermissionEntity>(\n 'MJ: Artifact Permissions',\n currentUser\n );\n\n await permission.Load(permissionId);\n permission.CanRead = permissions.canRead;\n permission.CanEdit = permissions.canEdit;\n permission.CanShare = permissions.canShare;\n\n return await permission.Save();\n }\n\n /**\n * Revoke explicit permission\n */\n async revokePermission(permissionId: string, currentUser: UserInfo): Promise<boolean> {\n const md = this.Provider;\n const permission = await md.GetEntityObject<MJArtifactPermissionEntity>(\n 'MJ: Artifact Permissions',\n currentUser\n );\n\n await permission.Load(permissionId);\n return await permission.Delete();\n }\n\n /**\n * Validate that requested permissions don't exceed granter's permissions\n */\n validatePermissions(\n requested: ArtifactPermissionSet,\n granter: ArtifactPermissionSet,\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.canEdit && !granter.canEdit) return false;\n if (requested.canShare && !granter.canShare) 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: ArtifactPermissionSet, isOwner: boolean): string[] {\n if (isOwner) {\n return ['Read', 'Edit', 'Share'];\n }\n\n const available = ['Read']; // Always have read\n if (userPermissions.canEdit) available.push('Edit');\n if (userPermissions.canShare) available.push('Share');\n\n return available;\n }\n\n /**\n * Check if user is owner of artifact\n */\n async isOwner(artifactId: string, userId: string, currentUser: UserInfo): Promise<boolean> {\n const artifact = await this.getArtifact(artifactId, currentUser);\n return artifact ? UUIDsEqual(artifact.UserID, userId) : false;\n }\n\n /**\n * Get all permissions for current user on an artifact (convenience method for UI)\n */\n async getUserPermissions(artifactId: string, currentUser: UserInfo): Promise<ArtifactPermissionSet> {\n const [canRead, canEdit, canShare] = await Promise.all([\n this.checkPermission(artifactId, currentUser.ID, 'read', currentUser),\n this.checkPermission(artifactId, currentUser.ID, 'edit', currentUser),\n this.checkPermission(artifactId, currentUser.ID, 'share', currentUser)\n ]);\n\n return { canRead, canEdit, canShare };\n }\n\n /**\n * Helper: Get artifact record\n */\n private async getArtifact(artifactId: string, currentUser: UserInfo): Promise<MJArtifactEntity | null> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<MJArtifactEntity>({\n EntityName: 'MJ: Artifacts',\n ExtraFilter: `ID='${artifactId}'`,\n MaxRows: 1,\n ResultType: 'entity_object'\n }, currentUser);\n\n if (result.Success && result.Results && result.Results.length > 0) {\n return result.Results[0];\n }\n return null;\n }\n\n /**\n * Helper: Get all collections containing this artifact\n */\n private async getArtifactCollections(\n artifactId: string,\n currentUser: UserInfo\n ): Promise<MJCollectionArtifactEntity[]> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<MJCollectionArtifactEntity>({\n EntityName: 'MJ: Collection Artifacts',\n ExtraFilter: `ArtifactVersionID IN (\n SELECT ID FROM [__mj].[vwArtifactVersions] WHERE ArtifactID='${artifactId}'\n )`,\n ResultType: 'entity_object'\n }, currentUser);\n\n return result.Success && result.Results ? result.Results : [];\n }\n\n /**\n * Helper: Check if permission set has specific permission\n */\n private hasPermission(permission: ArtifactPermission, type: 'read' | 'edit' | 'share'): boolean {\n switch (type) {\n case 'read':\n return permission.canRead;\n case 'edit':\n return permission.canEdit;\n case 'share':\n return permission.canShare;\n default:\n return false;\n }\n }\n\n /**\n * Helper: Check if collection permission has specific permission\n */\n private hasCollectionPermission(\n permission: { canRead: boolean; canEdit: boolean; canShare: boolean },\n type: 'read' | 'edit' | 'share'\n ): boolean {\n switch (type) {\n case 'read':\n return permission.canRead;\n case 'edit':\n return permission.canEdit;\n case 'share':\n return permission.canShare;\n default:\n return false;\n }\n }\n\n private mapToPermission(entity: MJArtifactPermissionEntity): ArtifactPermission {\n return {\n id: entity.ID,\n artifactId: entity.ArtifactID,\n userId: entity.UserID,\n userName: entity.User || '',\n canRead: entity.CanRead,\n canEdit: entity.CanEdit,\n canShare: entity.CanShare,\n sharedByUserId: entity.SharedByUserID || null,\n sharedByUserName: entity.SharedByUser || null,\n sharedAt: entity.__mj_CreatedAt\n };\n }\n}\n"]}
1
+ {"version":3,"file":"artifact-permission.service.js","sourceRoot":"","sources":["../../../src/lib/services/artifact-permission.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\nimport { UserInfo, RunView, Metadata, IMetadataProvider } from '@memberjunction/core';\nimport { MJArtifactPermissionEntity, MJArtifactEntity, MJCollectionArtifactEntity } from '@memberjunction/core-entities';\nimport type { MJArtifactVersionEntity, MJCollectionPermissionEntity } from '@memberjunction/core-entities';\nimport { CollectionPermissionService } from './collection-permission.service';\nimport { NormalizeUUID, UUIDsEqual } from '@memberjunction/global';\n\ntype ArtifactGrantRow = Pick<MJArtifactPermissionEntity, 'ArtifactID' | 'CanRead'>;\ntype CollectionGrantRow = Pick<MJCollectionPermissionEntity, 'CollectionID'>;\ntype CollectionArtifactRow = Pick<MJCollectionArtifactEntity, 'ArtifactVersionID'>;\ntype ArtifactVersionRow = Pick<MJArtifactVersionEntity, 'ArtifactID'>;\n\nexport interface ArtifactPermission {\n id: string;\n artifactId: string;\n userId: string;\n userName: string;\n canRead: boolean;\n canEdit: boolean;\n canShare: boolean;\n sharedByUserId: string | null;\n sharedByUserName: string | null;\n sharedAt: Date;\n}\n\nexport interface EffectivePermission extends ArtifactPermission {\n source: 'owner' | 'explicit' | 'collection';\n collectionName?: string; // If inherited from collection\n}\n\nexport interface ArtifactPermissionSet {\n canRead: boolean;\n canEdit: boolean;\n canShare: boolean;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ArtifactPermissionService {\n private _provider: IMetadataProvider | null = null;\n\n constructor(\n private collectionPermissionService: CollectionPermissionService\n ) {}\n\n /**\n * The metadata provider this service uses. When unset, falls back to Metadata.Provider.\n * Setting it also propagates to the collection-permission service this depends on.\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.collectionPermissionService.Provider = value;\n }\n }\n\n /**\n * Load all explicit permissions for an artifact\n */\n async LoadPermissions(artifactId: string, currentUser: UserInfo): Promise<ArtifactPermission[]> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<MJArtifactPermissionEntity>({\n EntityName: 'MJ: Artifact Permissions',\n ExtraFilter: `ArtifactID='${artifactId}'`,\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 /** @deprecated Use {@link LoadPermissions}. */\n async loadPermissions(artifactId: string, currentUser: UserInfo): Promise<ArtifactPermission[]> {\n return this.LoadPermissions(artifactId, currentUser);\n }\n\n /**\n * Check if user has specific permission for an artifact (HYBRID CHECK)\n * Checks in order: Owner > Explicit Permission > Collection Inheritance\n */\n async CheckPermission(\n artifactId: string,\n userId: string,\n permission: 'read' | 'edit' | 'share',\n currentUser: UserInfo\n ): Promise<boolean> {\n // 1. Check ownership - owner has all permissions\n const artifact = await this.getArtifact(artifactId, currentUser);\n if (artifact && UUIDsEqual(artifact.UserID, userId)) {\n return true;\n }\n\n // 2. Check explicit artifact permission\n const explicit = await this.GetExplicitPermission(artifactId, userId, currentUser);\n if (explicit) {\n return this.hasPermission(explicit, permission);\n }\n\n // 3. Check collection permission inheritance\n const collections = await this.getArtifactCollections(artifactId, currentUser);\n for (const collection of collections) {\n const collectionPermission = await this.collectionPermissionService.checkPermission(\n collection.CollectionID,\n userId,\n currentUser\n );\n\n if (collectionPermission && this.hasCollectionPermission(collectionPermission, permission)) {\n return true; // Inherited from collection\n }\n }\n\n // 4. No access\n return false;\n }\n\n /** @deprecated Use {@link CheckPermission}. */\n async checkPermission(\n artifactId: string,\n userId: string,\n permission: 'read' | 'edit' | 'share',\n currentUser: UserInfo\n ): Promise<boolean> {\n return this.CheckPermission(artifactId, userId, permission, currentUser);\n }\n\n /**\n * Get explicit permission record for a user on an artifact\n */\n async GetExplicitPermission(\n artifactId: string,\n userId: string,\n currentUser: UserInfo\n ): Promise<ArtifactPermission | null> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<MJArtifactPermissionEntity>({\n EntityName: 'MJ: Artifact Permissions',\n ExtraFilter: `ArtifactID='${artifactId}' 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 /** @deprecated Use {@link GetExplicitPermission}. */\n async getExplicitPermission(\n artifactId: string,\n userId: string,\n currentUser: UserInfo\n ): Promise<ArtifactPermission | null> {\n return this.GetExplicitPermission(artifactId, userId, currentUser);\n }\n\n /**\n * Get all effective permissions for an artifact (owner + explicit + inherited)\n */\n async GetEffectiveUsers(artifactId: string, currentUser: UserInfo): Promise<EffectivePermission[]> {\n const effectivePermissions: EffectivePermission[] = [];\n const seenUsers = new Set<string>();\n\n // 1. Add owner\n const artifact = await this.getArtifact(artifactId, currentUser);\n if (artifact && artifact.UserID) {\n effectivePermissions.push({\n id: '', // No permission record for owner\n artifactId: artifactId,\n userId: artifact.UserID,\n userName: artifact.User || 'Owner',\n canRead: true,\n canEdit: true,\n canShare: true,\n sharedByUserId: null,\n sharedByUserName: null,\n sharedAt: artifact.__mj_CreatedAt,\n source: 'owner'\n });\n seenUsers.add(artifact.UserID);\n }\n\n // 2. Add explicit permissions\n const explicitPerms = await this.LoadPermissions(artifactId, currentUser);\n for (const perm of explicitPerms) {\n if (!seenUsers.has(perm.userId)) {\n effectivePermissions.push({\n ...perm,\n source: 'explicit'\n });\n seenUsers.add(perm.userId);\n }\n }\n\n // 3. Add collection-inherited permissions\n const collections = await this.getArtifactCollections(artifactId, currentUser);\n for (const collection of collections) {\n const collectionPerms = await this.collectionPermissionService.loadPermissions(\n collection.CollectionID,\n currentUser\n );\n\n for (const collPerm of collectionPerms) {\n if (!seenUsers.has(collPerm.userId)) {\n effectivePermissions.push({\n id: '',\n artifactId: artifactId,\n userId: collPerm.userId,\n userName: collPerm.userName,\n canRead: collPerm.canRead,\n canEdit: collPerm.canEdit,\n canShare: collPerm.canShare,\n sharedByUserId: collPerm.sharedByUserId,\n sharedByUserName: collPerm.sharedByUserName,\n sharedAt: collPerm.sharedAt,\n source: 'collection',\n collectionName: collection.Collection || 'Unknown Collection'\n });\n seenUsers.add(collPerm.userId);\n }\n }\n }\n\n return effectivePermissions;\n }\n\n /** @deprecated Use {@link GetEffectiveUsers}. */\n async getEffectiveUsers(artifactId: string, currentUser: UserInfo): Promise<EffectivePermission[]> {\n return this.GetEffectiveUsers(artifactId, currentUser);\n }\n\n /**\n * Grant explicit permission to a user\n */\n async GrantPermission(\n artifactId: string,\n userId: string,\n permissions: ArtifactPermissionSet,\n sharedByUserId: string,\n currentUser: UserInfo\n ): Promise<MJArtifactPermissionEntity> {\n const md = this.Provider;\n const permission = await md.GetEntityObject<MJArtifactPermissionEntity>(\n 'MJ: Artifact Permissions',\n currentUser\n );\n\n permission.ArtifactID = artifactId;\n permission.UserID = userId;\n permission.CanRead = permissions.canRead;\n permission.CanEdit = permissions.canEdit;\n permission.CanShare = permissions.canShare;\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 /** @deprecated Use {@link GrantPermission}. */\n async grantPermission(\n artifactId: string,\n userId: string,\n permissions: ArtifactPermissionSet,\n sharedByUserId: string,\n currentUser: UserInfo\n ): Promise<MJArtifactPermissionEntity> {\n return this.GrantPermission(artifactId, userId, permissions, sharedByUserId, currentUser);\n }\n\n /**\n * Update existing permission\n */\n async UpdatePermission(\n permissionId: string,\n permissions: ArtifactPermissionSet,\n currentUser: UserInfo\n ): Promise<boolean> {\n const md = this.Provider;\n const permission = await md.GetEntityObject<MJArtifactPermissionEntity>(\n 'MJ: Artifact Permissions',\n currentUser\n );\n\n await permission.Load(permissionId);\n permission.CanRead = permissions.canRead;\n permission.CanEdit = permissions.canEdit;\n permission.CanShare = permissions.canShare;\n\n return await permission.Save();\n }\n\n /** @deprecated Use {@link UpdatePermission}. */\n async updatePermission(\n permissionId: string,\n permissions: ArtifactPermissionSet,\n currentUser: UserInfo\n ): Promise<boolean> {\n return this.UpdatePermission(permissionId, permissions, currentUser);\n }\n\n /**\n * Revoke explicit permission\n */\n async RevokePermission(permissionId: string, currentUser: UserInfo): Promise<boolean> {\n const md = this.Provider;\n const permission = await md.GetEntityObject<MJArtifactPermissionEntity>(\n 'MJ: Artifact Permissions',\n currentUser\n );\n\n await permission.Load(permissionId);\n return await permission.Delete();\n }\n\n /** @deprecated Use {@link RevokePermission}. */\n async revokePermission(permissionId: string, currentUser: UserInfo): Promise<boolean> {\n return this.RevokePermission(permissionId, currentUser);\n }\n\n /**\n * Validate that requested permissions don't exceed granter's permissions\n */\n ValidatePermissions(\n requested: ArtifactPermissionSet,\n granter: ArtifactPermissionSet,\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.canEdit && !granter.canEdit) return false;\n if (requested.canShare && !granter.canShare) return false;\n\n return true;\n }\n\n /** @deprecated Use {@link ValidatePermissions}. */\n validatePermissions(\n requested: ArtifactPermissionSet,\n granter: ArtifactPermissionSet,\n isOwner: boolean\n ): boolean {\n return this.ValidatePermissions(requested, granter, isOwner);\n }\n\n /**\n * Get available permissions for a user to grant based on their own permissions\n */\n GetAvailablePermissions(userPermissions: ArtifactPermissionSet, isOwner: boolean): string[] {\n if (isOwner) {\n return ['Read', 'Edit', 'Share'];\n }\n\n const available = ['Read']; // Always have read\n if (userPermissions.canEdit) available.push('Edit');\n if (userPermissions.canShare) available.push('Share');\n\n return available;\n }\n\n /** @deprecated Use {@link GetAvailablePermissions}. */\n getAvailablePermissions(userPermissions: ArtifactPermissionSet, isOwner: boolean): string[] {\n return this.GetAvailablePermissions(userPermissions, isOwner);\n }\n\n /**\n * Check if user is owner of artifact\n */\n async IsOwner(artifactId: string, userId: string, currentUser: UserInfo): Promise<boolean> {\n const artifact = await this.getArtifact(artifactId, currentUser);\n return artifact ? UUIDsEqual(artifact.UserID, userId) : false;\n }\n\n /** @deprecated Use {@link IsOwner}. */\n async isOwner(artifactId: string, userId: string, currentUser: UserInfo): Promise<boolean> {\n return this.IsOwner(artifactId, userId, currentUser);\n }\n\n /**\n * Get all permissions for current user on an artifact (convenience method for UI)\n */\n async GetUserPermissions(artifactId: string, currentUser: UserInfo): Promise<ArtifactPermissionSet> {\n const [canRead, canEdit, canShare] = await Promise.all([\n this.CheckPermission(artifactId, currentUser.ID, 'read', currentUser),\n this.CheckPermission(artifactId, currentUser.ID, 'edit', currentUser),\n this.CheckPermission(artifactId, currentUser.ID, 'share', currentUser)\n ]);\n\n return { canRead, canEdit, canShare };\n }\n\n /** @deprecated Use {@link GetUserPermissions}. */\n async getUserPermissions(artifactId: string, currentUser: UserInfo): Promise<ArtifactPermissionSet> {\n return this.GetUserPermissions(artifactId, currentUser);\n }\n\n /**\n * Returns an `ExtraFilter` for `MJ: Artifacts` that matches the artifacts the user can read,\n * by the same rule as {@link CheckPermission}: the user owns it, else an explicit grant\n * decides, else a read grant on a collection that holds a version of it.\n *\n * Each lookup runs against its own entity, so the filter holds only `UserID` and IDs.\n */\n async GetReadableArtifactsFilter(userId: string, currentUser: UserInfo): Promise<string> {\n const ownerOnly = `(UserID='${userId}')`;\n const rv = RunView.FromMetadataProvider(this.Provider);\n const [grantResult, collectionResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Artifact Permissions',\n ExtraFilter: `UserID='${userId}'`,\n Fields: ['ArtifactID', 'CanRead'],\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: Collection Permissions',\n ExtraFilter: `UserID='${userId}' AND CanRead=1`,\n Fields: ['CollectionID'],\n ResultType: 'simple'\n }\n ], currentUser);\n\n // Without the explicit grants, a grant that withholds read is unknown, so collection\n // access cannot be applied safely.\n if (!grantResult.Success) {\n console.error('Failed to load artifact grants:', grantResult.ErrorMessage);\n return ownerOnly;\n }\n\n const grants = (grantResult.Results ?? []) as ArtifactGrantRow[];\n const collectionIds = collectionResult.Success\n ? ((collectionResult.Results ?? []) as CollectionGrantRow[]).map(r => r.CollectionID)\n : [];\n const collectionArtifactIds = await this.getArtifactIdsInCollections(collectionIds, currentUser);\n\n const readableIds = this.resolveReadableArtifactIds(grants, collectionArtifactIds);\n return readableIds.length > 0\n ? `(UserID='${userId}' OR ID IN (${readableIds.map(id => `'${id}'`).join(',')}))`\n : ownerOnly;\n }\n\n /**\n * IDs of artifacts that have at least one version in any of the given collections.\n */\n private async getArtifactIdsInCollections(collectionIds: string[], currentUser: UserInfo): Promise<string[]> {\n if (collectionIds.length === 0) {\n return [];\n }\n\n const rv = RunView.FromMetadataProvider(this.Provider);\n const versionResult = await rv.RunView<CollectionArtifactRow>({\n EntityName: 'MJ: Collection Artifacts',\n ExtraFilter: `CollectionID IN (${collectionIds.map(id => `'${id}'`).join(',')})`,\n Fields: ['ArtifactVersionID'],\n ResultType: 'simple'\n }, currentUser);\n const versionIds = versionResult.Success ? (versionResult.Results ?? []).map(r => r.ArtifactVersionID) : [];\n if (versionIds.length === 0) {\n return [];\n }\n\n const artifactResult = await rv.RunView<ArtifactVersionRow>({\n EntityName: 'MJ: Artifact Versions',\n ExtraFilter: `ID IN (${versionIds.map(id => `'${id}'`).join(',')})`,\n Fields: ['ArtifactID'],\n ResultType: 'simple'\n }, currentUser);\n return artifactResult.Success ? (artifactResult.Results ?? []).map(r => r.ArtifactID) : [];\n }\n\n /**\n * Applies the grant order: an explicit grant decides for its artifact; collection access\n * counts only for artifacts that have no explicit grant.\n */\n private resolveReadableArtifactIds(grants: ArtifactGrantRow[], collectionArtifactIds: string[]): string[] {\n const explicitRead = new Map<string, { id: string; canRead: boolean }>();\n for (const grant of grants) {\n const key = NormalizeUUID(grant.ArtifactID);\n const canRead = (explicitRead.get(key)?.canRead ?? false) || !!grant.CanRead;\n explicitRead.set(key, { id: grant.ArtifactID, canRead });\n }\n\n const readable = new Map<string, string>();\n for (const { id, canRead } of explicitRead.values()) {\n if (canRead) {\n readable.set(NormalizeUUID(id), id);\n }\n }\n for (const id of collectionArtifactIds) {\n const key = NormalizeUUID(id);\n if (!explicitRead.has(key) && !readable.has(key)) {\n readable.set(key, id);\n }\n }\n return [...readable.values()];\n }\n\n /**\n * Helper: Get artifact record\n */\n private async getArtifact(artifactId: string, currentUser: UserInfo): Promise<MJArtifactEntity | null> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<MJArtifactEntity>({\n EntityName: 'MJ: Artifacts',\n ExtraFilter: `ID='${artifactId}'`,\n MaxRows: 1,\n ResultType: 'entity_object'\n }, currentUser);\n\n if (result.Success && result.Results && result.Results.length > 0) {\n return result.Results[0];\n }\n return null;\n }\n\n /**\n * Helper: Get all collections containing this artifact\n */\n private async getArtifactCollections(\n artifactId: string,\n currentUser: UserInfo\n ): Promise<MJCollectionArtifactEntity[]> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<MJCollectionArtifactEntity>({\n EntityName: 'MJ: Collection Artifacts',\n ExtraFilter: `ArtifactVersionID IN (\n SELECT ID FROM [__mj].[vwArtifactVersions] WHERE ArtifactID='${artifactId}'\n )`,\n ResultType: 'entity_object'\n }, currentUser);\n\n return result.Success && result.Results ? result.Results : [];\n }\n\n /**\n * Helper: Check if permission set has specific permission\n */\n private hasPermission(permission: ArtifactPermission, type: 'read' | 'edit' | 'share'): boolean {\n switch (type) {\n case 'read':\n return permission.canRead;\n case 'edit':\n return permission.canEdit;\n case 'share':\n return permission.canShare;\n default:\n return false;\n }\n }\n\n /**\n * Helper: Check if collection permission has specific permission\n */\n private hasCollectionPermission(\n permission: { canRead: boolean; canEdit: boolean; canShare: boolean },\n type: 'read' | 'edit' | 'share'\n ): boolean {\n switch (type) {\n case 'read':\n return permission.canRead;\n case 'edit':\n return permission.canEdit;\n case 'share':\n return permission.canShare;\n default:\n return false;\n }\n }\n\n private mapToPermission(entity: MJArtifactPermissionEntity): ArtifactPermission {\n return {\n id: entity.ID,\n artifactId: entity.ArtifactID,\n userId: entity.UserID,\n userName: entity.User || '',\n canRead: entity.CanRead,\n canEdit: entity.CanEdit,\n canShare: entity.CanShare,\n sharedByUserId: entity.SharedByUserID || null,\n sharedByUserName: entity.SharedByUser || null,\n sharedAt: entity.__mj_CreatedAt\n };\n }\n}\n"]}