@memberjunction/ng-dashboards 6.2.0-edge.3 → 6.2.0-edge.4

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 (177) hide show
  1. package/dist/AI/components/analytics/realtime/realtime-transcripts-data.d.ts +4 -3
  2. package/dist/AI/components/analytics/realtime/realtime-transcripts-data.d.ts.map +1 -1
  3. package/dist/AI/components/analytics/realtime/realtime-transcripts-data.js +8 -5
  4. package/dist/AI/components/analytics/realtime/realtime-transcripts-data.js.map +1 -1
  5. package/dist/AI/components/duplicates/compare-value.component.d.ts +67 -0
  6. package/dist/AI/components/duplicates/compare-value.component.d.ts.map +1 -0
  7. package/dist/AI/components/duplicates/compare-value.component.js +168 -0
  8. package/dist/AI/components/duplicates/compare-value.component.js.map +1 -0
  9. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +49 -3
  10. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  11. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +287 -169
  12. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  13. package/dist/AI/components/duplicates/duplicate-detection-run-scope.d.ts +77 -0
  14. package/dist/AI/components/duplicates/duplicate-detection-run-scope.d.ts.map +1 -0
  15. package/dist/AI/components/duplicates/duplicate-detection-run-scope.js +116 -0
  16. package/dist/AI/components/duplicates/duplicate-detection-run-scope.js.map +1 -0
  17. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +1 -0
  18. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
  19. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +16 -4
  20. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
  21. package/dist/AI/components/tags/tags-resource.component.d.ts +2 -0
  22. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  23. package/dist/AI/components/tags/tags-resource.component.js +12 -6
  24. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  25. package/dist/AI/components/vectors/vector-index-auto.d.ts +29 -0
  26. package/dist/AI/components/vectors/vector-index-auto.d.ts.map +1 -0
  27. package/dist/AI/components/vectors/vector-index-auto.js +59 -0
  28. package/dist/AI/components/vectors/vector-index-auto.js.map +1 -0
  29. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +9 -0
  30. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  31. package/dist/AI/components/vectors/vector-management-resource.component.js +65 -20
  32. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  33. package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
  34. package/dist/Actions/components/actions-overview.component.js +7 -3
  35. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  36. package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
  37. package/dist/Actions/components/categories-list-view.component.js +3 -2
  38. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  39. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  40. package/dist/ComponentStudio/component-studio-dashboard.component.js +1 -0
  41. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  42. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +0 -3
  43. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
  44. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +5 -14
  45. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
  46. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
  47. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +1 -0
  48. package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
  49. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
  50. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +1 -0
  51. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  52. package/dist/Credentials/components/credentials-list-resource.component.d.ts +2 -0
  53. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  54. package/dist/Credentials/components/credentials-list-resource.component.js +12 -10
  55. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  56. package/dist/DashboardBrowser/dashboard-browser-agent-context.d.ts +14 -43
  57. package/dist/DashboardBrowser/dashboard-browser-agent-context.d.ts.map +1 -1
  58. package/dist/DashboardBrowser/dashboard-browser-agent-context.js +6 -29
  59. package/dist/DashboardBrowser/dashboard-browser-agent-context.js.map +1 -1
  60. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +174 -321
  61. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
  62. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +522 -1195
  63. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  64. package/dist/DashboardBrowser/dashboard-library-filter.d.ts +116 -0
  65. package/dist/DashboardBrowser/dashboard-library-filter.d.ts.map +1 -0
  66. package/dist/DashboardBrowser/dashboard-library-filter.js +277 -0
  67. package/dist/DashboardBrowser/dashboard-library-filter.js.map +1 -0
  68. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts +1 -1
  69. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  70. package/dist/DashboardBrowser/dashboards-agent-tools.d.ts +26 -0
  71. package/dist/DashboardBrowser/dashboards-agent-tools.d.ts.map +1 -0
  72. package/dist/DashboardBrowser/dashboards-agent-tools.js +32 -0
  73. package/dist/DashboardBrowser/dashboards-agent-tools.js.map +1 -0
  74. package/dist/DashboardBrowser/dashboards-categories-resource.component.d.ts +58 -0
  75. package/dist/DashboardBrowser/dashboards-categories-resource.component.d.ts.map +1 -0
  76. package/dist/DashboardBrowser/dashboards-categories-resource.component.js +391 -0
  77. package/dist/DashboardBrowser/dashboards-categories-resource.component.js.map +1 -0
  78. package/dist/DashboardBrowser/dashboards-categories.helpers.d.ts +37 -0
  79. package/dist/DashboardBrowser/dashboards-categories.helpers.d.ts.map +1 -0
  80. package/dist/DashboardBrowser/dashboards-categories.helpers.js +68 -0
  81. package/dist/DashboardBrowser/dashboards-categories.helpers.js.map +1 -0
  82. package/dist/DashboardEditor/dashboard-editor.component.d.ts +295 -0
  83. package/dist/DashboardEditor/dashboard-editor.component.d.ts.map +1 -0
  84. package/dist/DashboardEditor/dashboard-editor.component.js +1022 -0
  85. package/dist/DashboardEditor/dashboard-editor.component.js.map +1 -0
  86. package/dist/DashboardEditor/dashboard-editor.types.d.ts +23 -0
  87. package/dist/DashboardEditor/dashboard-editor.types.d.ts.map +1 -0
  88. package/dist/DashboardEditor/dashboard-editor.types.js +3 -0
  89. package/dist/DashboardEditor/dashboard-editor.types.js.map +1 -0
  90. package/dist/DashboardEditor/dashboard-viewer-factory.d.ts +11 -0
  91. package/dist/DashboardEditor/dashboard-viewer-factory.d.ts.map +1 -0
  92. package/dist/DashboardEditor/dashboard-viewer-factory.js +17 -0
  93. package/dist/DashboardEditor/dashboard-viewer-factory.js.map +1 -0
  94. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +26 -0
  95. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  96. package/dist/DataExplorer/data-explorer-dashboard.component.js +302 -219
  97. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  98. package/dist/DataExplorer/services/explorer-state.service.d.ts +1 -1
  99. package/dist/DataExplorer/services/explorer-state.service.js +2 -5
  100. package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
  101. package/dist/FormBuilder/form-builder-resource.component.d.ts +0 -14
  102. package/dist/FormBuilder/form-builder-resource.component.d.ts.map +1 -1
  103. package/dist/FormBuilder/form-builder-resource.component.js +7 -29
  104. package/dist/FormBuilder/form-builder-resource.component.js.map +1 -1
  105. package/dist/Home/home-agent-context.d.ts +29 -10
  106. package/dist/Home/home-agent-context.d.ts.map +1 -1
  107. package/dist/Home/home-agent-context.js +50 -24
  108. package/dist/Home/home-agent-context.js.map +1 -1
  109. package/dist/Home/home-dashboard-switcher.component.d.ts +95 -0
  110. package/dist/Home/home-dashboard-switcher.component.d.ts.map +1 -0
  111. package/dist/Home/home-dashboard-switcher.component.js +442 -0
  112. package/dist/Home/home-dashboard-switcher.component.js.map +1 -0
  113. package/dist/Home/home-dashboard.component.d.ts +330 -17
  114. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  115. package/dist/Home/home-dashboard.component.js +1702 -1014
  116. package/dist/Home/home-dashboard.component.js.map +1 -1
  117. package/dist/Home/home-menus.d.ts +38 -0
  118. package/dist/Home/home-menus.d.ts.map +1 -0
  119. package/dist/Home/home-menus.js +53 -0
  120. package/dist/Home/home-menus.js.map +1 -0
  121. package/dist/Home/home-pinned-dashboards.d.ts +33 -0
  122. package/dist/Home/home-pinned-dashboards.d.ts.map +1 -0
  123. package/dist/Home/home-pinned-dashboards.js +76 -0
  124. package/dist/Home/home-pinned-dashboards.js.map +1 -0
  125. package/dist/PredictiveStudio/components/ps-production.component.d.ts +5 -1
  126. package/dist/PredictiveStudio/components/ps-production.component.d.ts.map +1 -1
  127. package/dist/PredictiveStudio/components/ps-production.component.js +64 -41
  128. package/dist/PredictiveStudio/components/ps-production.component.js.map +1 -1
  129. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  130. package/dist/QueryBrowser/query-browser-resource.component.js +3 -2
  131. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  132. package/dist/RealtimeRecordings/realtime-recordings-dashboard.component.js +2 -2
  133. package/dist/RealtimeRecordings/realtime-recordings-dashboard.component.js.map +1 -1
  134. package/dist/TelephonyOperations/telephony-operations-dashboard.component.d.ts +1 -0
  135. package/dist/TelephonyOperations/telephony-operations-dashboard.component.d.ts.map +1 -1
  136. package/dist/TelephonyOperations/telephony-operations-dashboard.component.js +7 -0
  137. package/dist/TelephonyOperations/telephony-operations-dashboard.component.js.map +1 -1
  138. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  139. package/dist/Testing/components/testing-explorer.component.js +7 -7
  140. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  141. package/dist/ai-dashboards.module.d.ts +21 -20
  142. package/dist/ai-dashboards.module.d.ts.map +1 -1
  143. package/dist/ai-dashboards.module.js +4 -1
  144. package/dist/ai-dashboards.module.js.map +1 -1
  145. package/dist/core-dashboards.module.d.ts +69 -62
  146. package/dist/core-dashboards.module.d.ts.map +1 -1
  147. package/dist/core-dashboards.module.js +22 -2
  148. package/dist/core-dashboards.module.js.map +1 -1
  149. package/dist/data-explorer-dashboards.module.d.ts +1 -1
  150. package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
  151. package/dist/data-explorer-dashboards.module.js +3 -1
  152. package/dist/data-explorer-dashboards.module.js.map +1 -1
  153. package/dist/public-api.d.ts +2 -0
  154. package/dist/public-api.d.ts.map +1 -1
  155. package/dist/public-api.js +3 -0
  156. package/dist/public-api.js.map +1 -1
  157. package/dist/shared/dashboard-library-changes.d.ts +23 -0
  158. package/dist/shared/dashboard-library-changes.d.ts.map +1 -0
  159. package/dist/shared/dashboard-library-changes.js +26 -0
  160. package/dist/shared/dashboard-library-changes.js.map +1 -0
  161. package/dist/shared/dashboard-owner-names.d.ts +17 -0
  162. package/dist/shared/dashboard-owner-names.d.ts.map +1 -0
  163. package/dist/shared/dashboard-owner-names.js +65 -0
  164. package/dist/shared/dashboard-owner-names.js.map +1 -0
  165. package/dist/shared/dashboard-recents.d.ts +34 -0
  166. package/dist/shared/dashboard-recents.d.ts.map +1 -0
  167. package/dist/shared/dashboard-recents.js +87 -0
  168. package/dist/shared/dashboard-recents.js.map +1 -0
  169. package/dist/shared/dashboards-app-install.d.ts +59 -0
  170. package/dist/shared/dashboards-app-install.d.ts.map +1 -0
  171. package/dist/shared/dashboards-app-install.js +97 -0
  172. package/dist/shared/dashboards-app-install.js.map +1 -0
  173. package/dist/shared/dashboards-app.helpers.d.ts +42 -0
  174. package/dist/shared/dashboards-app.helpers.d.ts.map +1 -0
  175. package/dist/shared/dashboards-app.helpers.js +143 -0
  176. package/dist/shared/dashboards-app.helpers.js.map +1 -0
  177. package/package.json +69 -68
@@ -35,9 +35,10 @@ export interface TranscriptLine {
35
35
  */
36
36
  export declare function LoadMeetingRooms(provider: IMetadataProvider, maxRows?: number): Promise<MeetingRoomSummary[]>;
37
37
  /**
38
- * Loads + speaker-attributes one room's transcript. Resolves agent lines via `AgentID` (AIEngine cache) and
39
- * heard lines via the diarized `ExternalID` against the room's participant roster (so a `User` line reads as
40
- * the actual person, and another agent heard in the room reads as that agent — not a generic "User").
38
+ * Loads + speaker-attributes one room's transcript: the room conversation's Main rows (a bridge session
39
+ * writes Main), in `Sequence` order. Resolves agent lines via `AgentID` (AIEngine cache) and heard lines via
40
+ * the diarized `ExternalID` against the room's participant roster (so a `User` line reads as the actual
41
+ * person, and another agent heard in the room reads as that agent — not a generic "User").
41
42
  *
42
43
  * @param provider The request-scoped metadata provider.
43
44
  * @param conversationID The room conversation id.
@@ -1 +1 @@
1
- {"version":3,"file":"realtime-transcripts-data.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/realtime/realtime-transcripts-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,iBAAiB,EAAW,MAAM,sBAAsB,CAAC;AASlE,oDAAoD;AACpD,MAAM,WAAW,kBAAkB;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,sGAAsG;IACtG,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY,EAAE,IAAI,CAAC;CACtB;AAED,kEAAkE;AAClE,MAAM,WAAW,cAAc;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,mGAAmG;IACnG,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;IAClC,mGAAmG;IACnG,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,IAAI,CAAC;CACZ;AAID;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,OAAO,SAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAuBhH;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACpC,QAAQ,EAAE,iBAAiB,EAC3B,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,EAAE,CAAC,CAyB3B;AAqDD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CACzB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1B,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,EACjE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,cAAc,CAqBhB;AAED,6CAA6C;AAC7C,wBAAgB,aAAa,CACzB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1B,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,EACjE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,cAAc,CAEhB"}
1
+ {"version":3,"file":"realtime-transcripts-data.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/realtime/realtime-transcripts-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,iBAAiB,EAAW,MAAM,sBAAsB,CAAC;AAUlE,oDAAoD;AACpD,MAAM,WAAW,kBAAkB;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,sGAAsG;IACtG,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY,EAAE,IAAI,CAAC;CACtB;AAED,kEAAkE;AAClE,MAAM,WAAW,cAAc;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,mGAAmG;IACnG,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;IAClC,mGAAmG;IACnG,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,IAAI,CAAC;CACZ;AAID;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,OAAO,SAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAuBhH;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACpC,QAAQ,EAAE,iBAAiB,EAC3B,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,EAAE,CAAC,CA0B3B;AAqDD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CACzB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1B,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,EACjE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,cAAc,CAqBhB;AAED,6CAA6C;AAC7C,wBAAgB,aAAa,CACzB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1B,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,EACjE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,cAAc,CAEhB"}
@@ -10,6 +10,7 @@
10
10
  import { RunView } from '@memberjunction/core';
11
11
  import { EscapeSQLString } from '@memberjunction/global';
12
12
  import { AIEngineBase } from '@memberjunction/ai-engine-base';
13
+ import { ConversationEngine } from '@memberjunction/core-entities';
13
14
  const CONVERSATION_ENTITY = 'MJ: Conversations';
14
15
  const CONVERSATION_DETAIL_ENTITY = 'MJ: Conversation Details';
15
16
  const BRIDGE_ENTITY = 'MJ: AI Agent Session Bridges';
@@ -43,22 +44,24 @@ export async function LoadMeetingRooms(provider, maxRows = 500) {
43
44
  }));
44
45
  }
45
46
  /**
46
- * Loads + speaker-attributes one room's transcript. Resolves agent lines via `AgentID` (AIEngine cache) and
47
- * heard lines via the diarized `ExternalID` against the room's participant roster (so a `User` line reads as
48
- * the actual person, and another agent heard in the room reads as that agent — not a generic "User").
47
+ * Loads + speaker-attributes one room's transcript: the room conversation's Main rows (a bridge session
48
+ * writes Main), in `Sequence` order. Resolves agent lines via `AgentID` (AIEngine cache) and heard lines via
49
+ * the diarized `ExternalID` against the room's participant roster (so a `User` line reads as the actual
50
+ * person, and another agent heard in the room reads as that agent — not a generic "User").
49
51
  *
50
52
  * @param provider The request-scoped metadata provider.
51
53
  * @param conversationID The room conversation id.
52
54
  * @param roomKey The room's external id (to load its bridge participants for attribution).
53
55
  */
54
56
  export async function LoadRoomTranscript(provider, conversationID, roomKey) {
57
+ const pathFilter = ConversationEngine.ScopeFilter(ConversationEngine.TrunkScope(conversationID));
55
58
  const rv = RunView.FromMetadataProvider(provider);
56
59
  const [detailResult, bridgeResult] = await rv.RunViews([
57
60
  {
58
61
  EntityName: CONVERSATION_DETAIL_ENTITY,
59
- ExtraFilter: `ConversationID='${EscapeSQLString(conversationID)}'`,
62
+ ExtraFilter: pathFilter,
60
63
  Fields: ['ID', 'Role', 'Message', 'AgentID', 'ExternalID', 'Error', '__mj_CreatedAt'],
61
- OrderBy: '__mj_CreatedAt ASC',
64
+ OrderBy: 'Sequence ASC',
62
65
  MaxRows: 5000,
63
66
  ResultType: 'simple',
64
67
  },
@@ -1 +1 @@
1
- {"version":3,"file":"realtime-transcripts-data.js","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/realtime/realtime-transcripts-data.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Pure data layer for the Realtime \"Voice Transcripts\" view. Loads the unified per-room\n * meeting transcripts the bridge writes (one `MJ: Conversations` of `Type='Meeting Room'` per room +\n * `MJ: Conversation Details` per utterance), and resolves each line's speaker — agent lines via `AgentID`,\n * heard ('User') lines via the diarized `ExternalID` → the room's `AIAgentSessionBridgeParticipant` roster\n * (DisplayName + IsAgent). No Angular imports — RunView(s) + client-side aggregation only.\n *\n * @module @memberjunction/ng-dashboards\n */\nimport { IMetadataProvider, RunView } from '@memberjunction/core';\nimport { EscapeSQLString } from '@memberjunction/global';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\n\nconst CONVERSATION_ENTITY = 'MJ: Conversations';\nconst CONVERSATION_DETAIL_ENTITY = 'MJ: Conversation Details';\nconst BRIDGE_ENTITY = 'MJ: AI Agent Session Bridges';\nconst PARTICIPANT_ENTITY = 'MJ: AI Agent Session Bridge Participants';\n\n/** One meeting-room transcript in the list view. */\nexport interface MeetingRoomSummary {\n ConversationID: string;\n Name: string;\n /** The room's external connection id (`ExternalID`) — the join key to the bridge/participant rows. */\n RoomKey: string;\n CreatedAt: Date;\n LastActivity: Date;\n}\n\n/** A speaker-attributed transcript line for the drill-in view. */\nexport interface TranscriptLine {\n ID: string;\n /** `'agent'` = an agent spoke; `'human'` = a human/participant spoke; `'error'` = an error row. */\n Kind: 'agent' | 'human' | 'error';\n /** Resolved display name of the speaker (agent name, participant name, or a sensible fallback). */\n Speaker: string;\n Message: string;\n At: Date;\n}\n\nconst toDate = (v: unknown): Date => (v instanceof Date ? v : new Date(String(v ?? '')));\n\n/**\n * Loads the meeting-room transcript LIST (light — no per-room detail load). Newest activity first.\n *\n * @param provider The request-scoped metadata provider.\n * @param maxRows Cap on rooms returned (default 500).\n */\nexport async function LoadMeetingRooms(provider: IMetadataProvider, maxRows = 500): Promise<MeetingRoomSummary[]> {\n const rv = RunView.FromMetadataProvider(provider);\n const result = await rv.RunView<Record<string, unknown>>(\n {\n EntityName: CONVERSATION_ENTITY,\n ExtraFilter: `Type='Meeting Room'`,\n Fields: ['ID', 'Name', 'ExternalID', '__mj_CreatedAt', '__mj_UpdatedAt'],\n OrderBy: '__mj_UpdatedAt DESC',\n MaxRows: maxRows,\n ResultType: 'simple',\n },\n provider.CurrentUser,\n );\n if (!result.Success) {\n return [];\n }\n return result.Results.map((r) => ({\n ConversationID: String(r['ID']),\n Name: String(r['Name'] ?? 'Meeting Room'),\n RoomKey: String(r['ExternalID'] ?? ''),\n CreatedAt: toDate(r['__mj_CreatedAt']),\n LastActivity: toDate(r['__mj_UpdatedAt']),\n }));\n}\n\n/**\n * Loads + speaker-attributes one room's transcript. Resolves agent lines via `AgentID` (AIEngine cache) and\n * heard lines via the diarized `ExternalID` against the room's participant roster (so a `User` line reads as\n * the actual person, and another agent heard in the room reads as that agent — not a generic \"User\").\n *\n * @param provider The request-scoped metadata provider.\n * @param conversationID The room conversation id.\n * @param roomKey The room's external id (to load its bridge participants for attribution).\n */\nexport async function LoadRoomTranscript(\n provider: IMetadataProvider,\n conversationID: string,\n roomKey: string,\n): Promise<TranscriptLine[]> {\n const rv = RunView.FromMetadataProvider(provider);\n const [detailResult, bridgeResult] = await rv.RunViews([\n {\n EntityName: CONVERSATION_DETAIL_ENTITY,\n ExtraFilter: `ConversationID='${EscapeSQLString(conversationID)}'`,\n Fields: ['ID', 'Role', 'Message', 'AgentID', 'ExternalID', 'Error', '__mj_CreatedAt'],\n OrderBy: '__mj_CreatedAt ASC',\n MaxRows: 5000,\n ResultType: 'simple',\n },\n {\n EntityName: BRIDGE_ENTITY,\n ExtraFilter: roomKey ? `ExternalConnectionID='${EscapeSQLString(roomKey)}'` : `1=0`,\n Fields: ['ID'],\n MaxRows: 100,\n ResultType: 'simple',\n },\n ], provider.CurrentUser);\n\n const participantNames = await loadParticipantNames(provider, rv, (bridgeResult?.Results ?? []).map((b) => String(b['ID'])));\n const agentName = buildAgentNameLookup();\n\n const details = detailResult?.Success ? detailResult.Results : [];\n return details.map((d) => AttributeLine(d, participantNames, agentName));\n}\n\n/** roomBridges → a map of `ExternalParticipantID → { name, isAgent }` for diarized-line attribution. */\nasync function loadParticipantNames(\n provider: IMetadataProvider,\n rv: RunView,\n bridgeIds: string[],\n): Promise<Map<string, { name: string; isAgent: boolean }>> {\n const map = new Map<string, { name: string; isAgent: boolean }>();\n if (bridgeIds.length === 0) {\n return map;\n }\n const inClause = bridgeIds.map((id) => `'${EscapeSQLString(id)}'`).join(',');\n const result = await rv.RunView<Record<string, unknown>>(\n {\n EntityName: PARTICIPANT_ENTITY,\n ExtraFilter: `SessionBridgeID IN (${inClause})`,\n Fields: ['ExternalParticipantID', 'DisplayName', 'IsAgent'],\n MaxRows: 1000,\n ResultType: 'simple',\n },\n provider.CurrentUser,\n );\n if (result.Success) {\n for (const p of result.Results) {\n const id = String(p['ExternalParticipantID'] ?? '').toLowerCase();\n if (!id) {\n continue;\n }\n // Each agent appears on multiple bridges' rosters — `IsAgent=1` only on its OWN bridge (where it's\n // the bot), `IsAgent=0` where another agent merely heard it. OR-reduce so it resolves to an agent,\n // and keep the most specific (non-fallback) DisplayName we've seen for the identity.\n const isAgent = p['IsAgent'] === true;\n const name = String(p['DisplayName'] ?? '');\n const prev = map.get(id);\n map.set(id, {\n name: name || prev?.name || 'Participant',\n isAgent: (prev?.isAgent ?? false) || isAgent,\n });\n }\n }\n return map;\n}\n\n/** AgentID → agent name, from the AIEngine cache (agents are always loaded for the analytics shell). */\nfunction buildAgentNameLookup(): Map<string, string> {\n const map = new Map<string, string>();\n for (const a of AIEngineBase.Instance.Agents ?? []) {\n map.set(a.ID.toLowerCase(), a.Name ?? 'Agent');\n }\n return map;\n}\n\n/**\n * Resolves one raw detail row into a display-ready, speaker-attributed line — the diarization-attribution\n * core. Exported for unit testing (the maps are easy to construct directly, no RunView mocking needed).\n *\n * @param d The raw `MJ: Conversation Details` row.\n * @param participantNames `ExternalParticipantID(lower) → { name, isAgent }` from the room roster.\n * @param agentName `AgentID(lower) → agent name`.\n */\nexport function AttributeLine(\n d: Record<string, unknown>,\n participantNames: Map<string, { name: string; isAgent: boolean }>,\n agentName: Map<string, string>,\n): TranscriptLine {\n const role = String(d['Role'] ?? 'User');\n const externalId = String(d['ExternalID'] ?? '').toLowerCase();\n const base = {\n ID: String(d['ID']),\n Message: String(d['Message'] ?? d['Error'] ?? ''),\n At: toDate(d['__mj_CreatedAt']),\n };\n if (role === 'Error') {\n return { ...base, Kind: 'error', Speaker: 'Error' };\n }\n if (role === 'AI') {\n const agentId = String(d['AgentID'] ?? '').toLowerCase();\n return { ...base, Kind: 'agent', Speaker: agentName.get(agentId) ?? 'Agent' };\n }\n // 'User' — diarized to a participant when we have the speaker label; another agent heard reads as agent.\n const participant = externalId ? participantNames.get(externalId) : undefined;\n if (participant) {\n return { ...base, Kind: participant.isAgent ? 'agent' : 'human', Speaker: participant.name };\n }\n return { ...base, Kind: 'human', Speaker: 'Participant' };\n}\n\n/** @deprecated Use {@link AttributeLine}. */\nexport function attributeLine(\n d: Record<string, unknown>,\n participantNames: Map<string, { name: string; isAgent: boolean }>,\n agentName: Map<string, string>,\n): TranscriptLine {\n return AttributeLine(d, participantNames, agentName);\n}\n"]}
1
+ {"version":3,"file":"realtime-transcripts-data.js","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/realtime/realtime-transcripts-data.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Pure data layer for the Realtime \"Voice Transcripts\" view. Loads the unified per-room\n * meeting transcripts the bridge writes (one `MJ: Conversations` of `Type='Meeting Room'` per room +\n * `MJ: Conversation Details` per utterance), and resolves each line's speaker — agent lines via `AgentID`,\n * heard ('User') lines via the diarized `ExternalID` → the room's `AIAgentSessionBridgeParticipant` roster\n * (DisplayName + IsAgent). No Angular imports — RunView(s) + client-side aggregation only.\n *\n * @module @memberjunction/ng-dashboards\n */\nimport { IMetadataProvider, RunView } from '@memberjunction/core';\nimport { EscapeSQLString } from '@memberjunction/global';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { ConversationEngine } from '@memberjunction/core-entities';\n\nconst CONVERSATION_ENTITY = 'MJ: Conversations';\nconst CONVERSATION_DETAIL_ENTITY = 'MJ: Conversation Details';\nconst BRIDGE_ENTITY = 'MJ: AI Agent Session Bridges';\nconst PARTICIPANT_ENTITY = 'MJ: AI Agent Session Bridge Participants';\n\n/** One meeting-room transcript in the list view. */\nexport interface MeetingRoomSummary {\n ConversationID: string;\n Name: string;\n /** The room's external connection id (`ExternalID`) — the join key to the bridge/participant rows. */\n RoomKey: string;\n CreatedAt: Date;\n LastActivity: Date;\n}\n\n/** A speaker-attributed transcript line for the drill-in view. */\nexport interface TranscriptLine {\n ID: string;\n /** `'agent'` = an agent spoke; `'human'` = a human/participant spoke; `'error'` = an error row. */\n Kind: 'agent' | 'human' | 'error';\n /** Resolved display name of the speaker (agent name, participant name, or a sensible fallback). */\n Speaker: string;\n Message: string;\n At: Date;\n}\n\nconst toDate = (v: unknown): Date => (v instanceof Date ? v : new Date(String(v ?? '')));\n\n/**\n * Loads the meeting-room transcript LIST (light — no per-room detail load). Newest activity first.\n *\n * @param provider The request-scoped metadata provider.\n * @param maxRows Cap on rooms returned (default 500).\n */\nexport async function LoadMeetingRooms(provider: IMetadataProvider, maxRows = 500): Promise<MeetingRoomSummary[]> {\n const rv = RunView.FromMetadataProvider(provider);\n const result = await rv.RunView<Record<string, unknown>>(\n {\n EntityName: CONVERSATION_ENTITY,\n ExtraFilter: `Type='Meeting Room'`,\n Fields: ['ID', 'Name', 'ExternalID', '__mj_CreatedAt', '__mj_UpdatedAt'],\n OrderBy: '__mj_UpdatedAt DESC',\n MaxRows: maxRows,\n ResultType: 'simple',\n },\n provider.CurrentUser,\n );\n if (!result.Success) {\n return [];\n }\n return result.Results.map((r) => ({\n ConversationID: String(r['ID']),\n Name: String(r['Name'] ?? 'Meeting Room'),\n RoomKey: String(r['ExternalID'] ?? ''),\n CreatedAt: toDate(r['__mj_CreatedAt']),\n LastActivity: toDate(r['__mj_UpdatedAt']),\n }));\n}\n\n/**\n * Loads + speaker-attributes one room's transcript: the room conversation's Main rows (a bridge session\n * writes Main), in `Sequence` order. Resolves agent lines via `AgentID` (AIEngine cache) and heard lines via\n * the diarized `ExternalID` against the room's participant roster (so a `User` line reads as the actual\n * person, and another agent heard in the room reads as that agent — not a generic \"User\").\n *\n * @param provider The request-scoped metadata provider.\n * @param conversationID The room conversation id.\n * @param roomKey The room's external id (to load its bridge participants for attribution).\n */\nexport async function LoadRoomTranscript(\n provider: IMetadataProvider,\n conversationID: string,\n roomKey: string,\n): Promise<TranscriptLine[]> {\n const pathFilter = ConversationEngine.ScopeFilter(ConversationEngine.TrunkScope(conversationID));\n const rv = RunView.FromMetadataProvider(provider);\n const [detailResult, bridgeResult] = await rv.RunViews([\n {\n EntityName: CONVERSATION_DETAIL_ENTITY,\n ExtraFilter: pathFilter,\n Fields: ['ID', 'Role', 'Message', 'AgentID', 'ExternalID', 'Error', '__mj_CreatedAt'],\n OrderBy: 'Sequence ASC',\n MaxRows: 5000,\n ResultType: 'simple',\n },\n {\n EntityName: BRIDGE_ENTITY,\n ExtraFilter: roomKey ? `ExternalConnectionID='${EscapeSQLString(roomKey)}'` : `1=0`,\n Fields: ['ID'],\n MaxRows: 100,\n ResultType: 'simple',\n },\n ], provider.CurrentUser);\n\n const participantNames = await loadParticipantNames(provider, rv, (bridgeResult?.Results ?? []).map((b) => String(b['ID'])));\n const agentName = buildAgentNameLookup();\n\n const details = detailResult?.Success ? detailResult.Results : [];\n return details.map((d) => AttributeLine(d, participantNames, agentName));\n}\n\n/** roomBridges → a map of `ExternalParticipantID → { name, isAgent }` for diarized-line attribution. */\nasync function loadParticipantNames(\n provider: IMetadataProvider,\n rv: RunView,\n bridgeIds: string[],\n): Promise<Map<string, { name: string; isAgent: boolean }>> {\n const map = new Map<string, { name: string; isAgent: boolean }>();\n if (bridgeIds.length === 0) {\n return map;\n }\n const inClause = bridgeIds.map((id) => `'${EscapeSQLString(id)}'`).join(',');\n const result = await rv.RunView<Record<string, unknown>>(\n {\n EntityName: PARTICIPANT_ENTITY,\n ExtraFilter: `SessionBridgeID IN (${inClause})`,\n Fields: ['ExternalParticipantID', 'DisplayName', 'IsAgent'],\n MaxRows: 1000,\n ResultType: 'simple',\n },\n provider.CurrentUser,\n );\n if (result.Success) {\n for (const p of result.Results) {\n const id = String(p['ExternalParticipantID'] ?? '').toLowerCase();\n if (!id) {\n continue;\n }\n // Each agent appears on multiple bridges' rosters — `IsAgent=1` only on its OWN bridge (where it's\n // the bot), `IsAgent=0` where another agent merely heard it. OR-reduce so it resolves to an agent,\n // and keep the most specific (non-fallback) DisplayName we've seen for the identity.\n const isAgent = p['IsAgent'] === true;\n const name = String(p['DisplayName'] ?? '');\n const prev = map.get(id);\n map.set(id, {\n name: name || prev?.name || 'Participant',\n isAgent: (prev?.isAgent ?? false) || isAgent,\n });\n }\n }\n return map;\n}\n\n/** AgentID → agent name, from the AIEngine cache (agents are always loaded for the analytics shell). */\nfunction buildAgentNameLookup(): Map<string, string> {\n const map = new Map<string, string>();\n for (const a of AIEngineBase.Instance.Agents ?? []) {\n map.set(a.ID.toLowerCase(), a.Name ?? 'Agent');\n }\n return map;\n}\n\n/**\n * Resolves one raw detail row into a display-ready, speaker-attributed line — the diarization-attribution\n * core. Exported for unit testing (the maps are easy to construct directly, no RunView mocking needed).\n *\n * @param d The raw `MJ: Conversation Details` row.\n * @param participantNames `ExternalParticipantID(lower) → { name, isAgent }` from the room roster.\n * @param agentName `AgentID(lower) → agent name`.\n */\nexport function AttributeLine(\n d: Record<string, unknown>,\n participantNames: Map<string, { name: string; isAgent: boolean }>,\n agentName: Map<string, string>,\n): TranscriptLine {\n const role = String(d['Role'] ?? 'User');\n const externalId = String(d['ExternalID'] ?? '').toLowerCase();\n const base = {\n ID: String(d['ID']),\n Message: String(d['Message'] ?? d['Error'] ?? ''),\n At: toDate(d['__mj_CreatedAt']),\n };\n if (role === 'Error') {\n return { ...base, Kind: 'error', Speaker: 'Error' };\n }\n if (role === 'AI') {\n const agentId = String(d['AgentID'] ?? '').toLowerCase();\n return { ...base, Kind: 'agent', Speaker: agentName.get(agentId) ?? 'Agent' };\n }\n // 'User' — diarized to a participant when we have the speaker label; another agent heard reads as agent.\n const participant = externalId ? participantNames.get(externalId) : undefined;\n if (participant) {\n return { ...base, Kind: participant.isAgent ? 'agent' : 'human', Speaker: participant.name };\n }\n return { ...base, Kind: 'human', Speaker: 'Participant' };\n}\n\n/** @deprecated Use {@link AttributeLine}. */\nexport function attributeLine(\n d: Record<string, unknown>,\n participantNames: Map<string, { name: string; isAgent: boolean }>,\n agentName: Map<string, string>,\n): TranscriptLine {\n return AttributeLine(d, participantNames, agentName);\n}\n"]}
@@ -0,0 +1,67 @@
1
+ import { AfterViewInit, EventEmitter, OnDestroy } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * A comparison value longer than this many characters is a candidate for
5
+ * collapsing. It is only a cheap pre-filter: whether the value actually gets a
6
+ * "Show more" toggle depends on whether it overflows two lines at the column's
7
+ * real width (see {@link CompareValueComponent.Overflows}). Anything shorter
8
+ * always fits, so it is never measured.
9
+ */
10
+ export declare const LONG_VALUE_THRESHOLD = 120;
11
+ /** How many lines a collapsed value shows. Keep in sync with `-webkit-line-clamp` in the CSS. */
12
+ export declare const COLLAPSED_LINES = 2;
13
+ /**
14
+ * One field value in the duplicate-record comparison grid.
15
+ *
16
+ * Long values (photo URLs, notes, JSON blobs) start collapsed to two lines,
17
+ * with a "Show more" / "Show less" toggle, so they don't push every other row
18
+ * out of view. The toggle only appears when the text really overflows two lines
19
+ * at the column's current width, re-checked whenever the column resizes. Nothing
20
+ * is hidden: expanding shows the full text, and a truncated value carries the
21
+ * full text in its `title` tooltip. Short values render unchanged with no toggle.
22
+ *
23
+ * The toggle stops click propagation so expanding a value never selects it
24
+ * for the merge; a click anywhere else on the value still bubbles to the
25
+ * containing cell, which owns selection.
26
+ */
27
+ export declare class CompareValueComponent implements AfterViewInit, OnDestroy {
28
+ private readonly cdr;
29
+ private readonly injector;
30
+ private resizeObserver;
31
+ private _value;
32
+ private textRef?;
33
+ /** The value to display. Changing it collapses the view again and re-checks the overflow. */
34
+ set Value(value: string | null | undefined);
35
+ get Value(): string;
36
+ /**
37
+ * Whether a long value is expanded. Bind it two-way (`[(Expanded)]`) to share one state across a row, so
38
+ * expanding one column's value expands the others in that row too.
39
+ */
40
+ Expanded: boolean;
41
+ /** Emitted when the user toggles the value, with the new expanded state. */
42
+ ExpandedChange: EventEmitter<boolean>;
43
+ /**
44
+ * True when the value, clamped to {@link COLLAPSED_LINES} lines, does not fit at the column's current
45
+ * width. Measured from the rendered text after each render that changes the value and on every resize.
46
+ */
47
+ Overflows: boolean;
48
+ /** True when the value exceeds {@link LONG_VALUE_THRESHOLD}, so it renders clamped until expanded. */
49
+ get IsLong(): boolean;
50
+ /** True when the value is long and not expanded. */
51
+ get IsCollapsed(): boolean;
52
+ /** True when the toggle should show: the value is long and really overflows two lines. */
53
+ get ShowToggle(): boolean;
54
+ /** True when part of the value is hidden right now, so the tooltip carries the full text. */
55
+ get IsTruncated(): boolean;
56
+ ngAfterViewInit(): void;
57
+ ngOnDestroy(): void;
58
+ /** Expand or collapse this value without selecting it for the merge. */
59
+ ToggleExpanded(event: MouseEvent): void;
60
+ /** Measure once the new value has rendered (a value change doesn't always resize the clamped box). */
61
+ private scheduleMeasure;
62
+ private measureOverflow;
63
+ private computeOverflows;
64
+ static ɵfac: i0.ɵɵFactoryDeclaration<CompareValueComponent, never>;
65
+ static ɵcmp: i0.ɵɵComponentDeclaration<CompareValueComponent, "mj-compare-value", never, { "Value": { "alias": "Value"; "required": false; }; "Expanded": { "alias": "Expanded"; "required": false; }; }, { "ExpandedChange": "ExpandedChange"; }, never, never, true, never>;
66
+ }
67
+ //# sourceMappingURL=compare-value.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare-value.component.d.ts","sourceRoot":"","sources":["../../../../src/AI/components/duplicates/compare-value.component.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAIb,YAAY,EAGZ,SAAS,EAKV,MAAM,eAAe,CAAC;;AAEvB;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC,iGAAiG;AACjG,eAAO,MAAM,eAAe,IAAI,CAAC;AAEjC;;;;;;;;;;;;;GAaG;AACH,qBAMa,qBAAsB,YAAW,aAAa,EAAE,SAAS;IACpE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAC7C,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,MAAM,CAAM;IAEI,OAAO,CAAC,OAAO,CAAC,CAA0B;IAElE,6FAA6F;IAC7F,IACI,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAOzC;IACD,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;;;OAGG;IACM,QAAQ,UAAS;IAE1B,4EAA4E;IAClE,cAAc,wBAA+B;IAEvD;;;OAGG;IACI,SAAS,UAAS;IAEzB,sGAAsG;IACtG,IAAW,MAAM,IAAI,OAAO,CAE3B;IAED,oDAAoD;IACpD,IAAW,WAAW,IAAI,OAAO,CAEhC;IAED,0FAA0F;IAC1F,IAAW,UAAU,IAAI,OAAO,CAE/B;IAED,6FAA6F;IAC7F,IAAW,WAAW,IAAI,OAAO,CAEhC;IAEM,eAAe,IAAI,IAAI;IASvB,WAAW,IAAI,IAAI;IAK1B,wEAAwE;IACjE,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAM9C,sGAAsG;IACtG,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,gBAAgB;yCA3Fb,qBAAqB;2CAArB,qBAAqB;CA2GjC"}
@@ -0,0 +1,168 @@
1
+ import { ChangeDetectorRef, Component, EventEmitter, Injector, Input, Output, ViewChild, afterNextRender, inject, } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ const _c0 = ["valueText"];
4
+ function CompareValueComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
5
+ const _r1 = i0.ɵɵgetCurrentView();
6
+ i0.ɵɵdomElementStart(0, "button", 3);
7
+ i0.ɵɵdomListener("click", function CompareValueComponent_Conditional_3_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ToggleExpanded($event)); });
8
+ i0.ɵɵdomElement(1, "i", 4);
9
+ i0.ɵɵtext(2);
10
+ i0.ɵɵdomElementEnd();
11
+ } if (rf & 2) {
12
+ const ctx_r1 = i0.ɵɵnextContext();
13
+ i0.ɵɵattribute("aria-expanded", ctx_r1.Expanded);
14
+ i0.ɵɵadvance();
15
+ i0.ɵɵclassProp("fa-chevron-down", !ctx_r1.Expanded)("fa-chevron-up", ctx_r1.Expanded);
16
+ i0.ɵɵadvance();
17
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.Expanded ? "Show less" : "Show more", " ");
18
+ } }
19
+ /**
20
+ * A comparison value longer than this many characters is a candidate for
21
+ * collapsing. It is only a cheap pre-filter: whether the value actually gets a
22
+ * "Show more" toggle depends on whether it overflows two lines at the column's
23
+ * real width (see {@link CompareValueComponent.Overflows}). Anything shorter
24
+ * always fits, so it is never measured.
25
+ */
26
+ export const LONG_VALUE_THRESHOLD = 120;
27
+ /** How many lines a collapsed value shows. Keep in sync with `-webkit-line-clamp` in the CSS. */
28
+ export const COLLAPSED_LINES = 2;
29
+ /**
30
+ * One field value in the duplicate-record comparison grid.
31
+ *
32
+ * Long values (photo URLs, notes, JSON blobs) start collapsed to two lines,
33
+ * with a "Show more" / "Show less" toggle, so they don't push every other row
34
+ * out of view. The toggle only appears when the text really overflows two lines
35
+ * at the column's current width, re-checked whenever the column resizes. Nothing
36
+ * is hidden: expanding shows the full text, and a truncated value carries the
37
+ * full text in its `title` tooltip. Short values render unchanged with no toggle.
38
+ *
39
+ * The toggle stops click propagation so expanding a value never selects it
40
+ * for the merge; a click anywhere else on the value still bubbles to the
41
+ * containing cell, which owns selection.
42
+ */
43
+ export class CompareValueComponent {
44
+ cdr = inject(ChangeDetectorRef);
45
+ injector = inject(Injector);
46
+ resizeObserver = null;
47
+ _value = '';
48
+ textRef;
49
+ /** The value to display. Changing it collapses the view again and re-checks the overflow. */
50
+ set Value(value) {
51
+ const next = value ?? '';
52
+ if (next !== this._value) {
53
+ this._value = next;
54
+ this.Expanded = false;
55
+ this.scheduleMeasure();
56
+ }
57
+ }
58
+ get Value() {
59
+ return this._value;
60
+ }
61
+ /**
62
+ * Whether a long value is expanded. Bind it two-way (`[(Expanded)]`) to share one state across a row, so
63
+ * expanding one column's value expands the others in that row too.
64
+ */
65
+ Expanded = false;
66
+ /** Emitted when the user toggles the value, with the new expanded state. */
67
+ ExpandedChange = new EventEmitter();
68
+ /**
69
+ * True when the value, clamped to {@link COLLAPSED_LINES} lines, does not fit at the column's current
70
+ * width. Measured from the rendered text after each render that changes the value and on every resize.
71
+ */
72
+ Overflows = false;
73
+ /** True when the value exceeds {@link LONG_VALUE_THRESHOLD}, so it renders clamped until expanded. */
74
+ get IsLong() {
75
+ return this._value.length > LONG_VALUE_THRESHOLD;
76
+ }
77
+ /** True when the value is long and not expanded. */
78
+ get IsCollapsed() {
79
+ return this.IsLong && !this.Expanded;
80
+ }
81
+ /** True when the toggle should show: the value is long and really overflows two lines. */
82
+ get ShowToggle() {
83
+ return this.IsLong && this.Overflows;
84
+ }
85
+ /** True when part of the value is hidden right now, so the tooltip carries the full text. */
86
+ get IsTruncated() {
87
+ return this.IsCollapsed && this.Overflows;
88
+ }
89
+ ngAfterViewInit() {
90
+ const text = this.textRef?.nativeElement;
91
+ if (text && typeof ResizeObserver !== 'undefined') {
92
+ // Fires when the column narrows or widens, and when the text expands or collapses
93
+ this.resizeObserver = new ResizeObserver(() => this.measureOverflow());
94
+ this.resizeObserver.observe(text);
95
+ }
96
+ }
97
+ ngOnDestroy() {
98
+ this.resizeObserver?.disconnect();
99
+ this.resizeObserver = null;
100
+ }
101
+ /** Expand or collapse this value without selecting it for the merge. */
102
+ ToggleExpanded(event) {
103
+ event.stopPropagation();
104
+ this.Expanded = !this.Expanded;
105
+ this.ExpandedChange.emit(this.Expanded);
106
+ }
107
+ /** Measure once the new value has rendered (a value change doesn't always resize the clamped box). */
108
+ scheduleMeasure() {
109
+ afterNextRender(() => this.measureOverflow(), { injector: this.injector });
110
+ }
111
+ measureOverflow() {
112
+ const overflows = this.computeOverflows();
113
+ if (overflows !== this.Overflows) {
114
+ this.Overflows = overflows;
115
+ this.cdr.markForCheck();
116
+ }
117
+ }
118
+ computeOverflows() {
119
+ const text = this.textRef?.nativeElement;
120
+ if (!text || !this.IsLong) {
121
+ return false;
122
+ }
123
+ if (this.IsCollapsed) {
124
+ // The clamp hides whatever is taller than the visible box
125
+ return text.scrollHeight > text.clientHeight + 1;
126
+ }
127
+ // Expanded: there is no clamp to compare against, so compare with the height of the collapsed lines
128
+ const lineHeight = parseFloat(getComputedStyle(text).lineHeight);
129
+ if (!Number.isFinite(lineHeight)) {
130
+ return this.Overflows;
131
+ }
132
+ return text.scrollHeight > lineHeight * COLLAPSED_LINES + 1;
133
+ }
134
+ static ɵfac = function CompareValueComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CompareValueComponent)(); };
135
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CompareValueComponent, selectors: [["mj-compare-value"]], viewQuery: function CompareValueComponent_Query(rf, ctx) { if (rf & 1) {
136
+ i0.ɵɵviewQuery(_c0, 5);
137
+ } if (rf & 2) {
138
+ let _t;
139
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.textRef = _t.first);
140
+ } }, inputs: { Value: "Value", Expanded: "Expanded" }, outputs: { ExpandedChange: "ExpandedChange" }, decls: 4, vars: 5, consts: [["valueText", ""], [1, "compare-value-text"], ["type", "button", 1, "compare-value-toggle"], ["type", "button", 1, "compare-value-toggle", 3, "click"], ["aria-hidden", "true", 1, "fa-solid"]], template: function CompareValueComponent_Template(rf, ctx) { if (rf & 1) {
141
+ i0.ɵɵdomElementStart(0, "span", 1, 0);
142
+ i0.ɵɵtext(2);
143
+ i0.ɵɵdomElementEnd();
144
+ i0.ɵɵconditionalCreate(3, CompareValueComponent_Conditional_3_Template, 3, 6, "button", 2);
145
+ } if (rf & 2) {
146
+ i0.ɵɵclassProp("compare-value-collapsed", ctx.IsCollapsed);
147
+ i0.ɵɵattribute("title", ctx.IsTruncated ? ctx.Value : null);
148
+ i0.ɵɵadvance(2);
149
+ i0.ɵɵtextInterpolate(ctx.Value);
150
+ i0.ɵɵadvance();
151
+ i0.ɵɵconditional(ctx.ShowToggle ? 3 : -1);
152
+ } }, styles: ["[_nghost-%COMP%] {\n display: block;\n min-width: 0;\n \n padding-right: 28px;\n}\n\n.compare-value-text[_ngcontent-%COMP%] {\n display: block;\n overflow-wrap: anywhere;\n}\n\n\n.compare-value-collapsed[_ngcontent-%COMP%] {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n line-clamp: 2;\n overflow: hidden;\n}\n\n.compare-value-toggle[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n min-height: 24px;\n padding: 0.25rem 0;\n border: none;\n background: none;\n color: var(--mj-brand-primary);\n font-size: 0.72rem;\n font-weight: 500;\n cursor: pointer;\n}\n\n.compare-value-toggle[_ngcontent-%COMP%]:hover {\n text-decoration: underline;\n}\n\n.compare-value-toggle[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mj-border-focus);\n outline-offset: 2px;\n border-radius: var(--mj-radius-sm);\n}\n\n.compare-value-toggle[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.6rem;\n}"] });
153
+ }
154
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CompareValueComponent, [{
155
+ type: Component,
156
+ args: [{ standalone: true, selector: 'mj-compare-value', template: "<span #valueText class=\"compare-value-text\"\n [class.compare-value-collapsed]=\"IsCollapsed\"\n [attr.title]=\"IsTruncated ? Value : null\">{{ Value }}</span>\n@if (ShowToggle) {\n <button type=\"button\" class=\"compare-value-toggle\"\n [attr.aria-expanded]=\"Expanded\"\n (click)=\"ToggleExpanded($event)\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!Expanded\" [class.fa-chevron-up]=\"Expanded\" aria-hidden=\"true\"></i>\n {{ Expanded ? 'Show less' : 'Show more' }}\n </button>\n}\n", styles: [":host {\n display: block;\n min-width: 0;\n /* Keep text and the ellipsis clear of the cell's absolutely positioned select radio (right: 8px, 16px wide) */\n padding-right: 28px;\n}\n\n.compare-value-text {\n display: block;\n overflow-wrap: anywhere;\n}\n\n/* Long values: clamp to two lines until expanded */\n.compare-value-collapsed {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n line-clamp: 2;\n overflow: hidden;\n}\n\n.compare-value-toggle {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n min-height: 24px;\n padding: 0.25rem 0;\n border: none;\n background: none;\n color: var(--mj-brand-primary);\n font-size: 0.72rem;\n font-weight: 500;\n cursor: pointer;\n}\n\n.compare-value-toggle:hover {\n text-decoration: underline;\n}\n\n.compare-value-toggle:focus-visible {\n outline: 2px solid var(--mj-border-focus);\n outline-offset: 2px;\n border-radius: var(--mj-radius-sm);\n}\n\n.compare-value-toggle i {\n font-size: 0.6rem;\n}\n"] }]
157
+ }], null, { textRef: [{
158
+ type: ViewChild,
159
+ args: ['valueText']
160
+ }], Value: [{
161
+ type: Input
162
+ }], Expanded: [{
163
+ type: Input
164
+ }], ExpandedChange: [{
165
+ type: Output
166
+ }] }); })();
167
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CompareValueComponent, { className: "CompareValueComponent", filePath: "src/AI/components/duplicates/compare-value.component.ts", lineNumber: 48 }); })();
168
+ //# sourceMappingURL=compare-value.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare-value.component.js","sourceRoot":"","sources":["../../../../src/AI/components/duplicates/compare-value.component.ts","../../../../src/AI/components/duplicates/compare-value.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Injector,\n Input,\n OnDestroy,\n Output,\n ViewChild,\n afterNextRender,\n inject,\n} from '@angular/core';\n\n/**\n * A comparison value longer than this many characters is a candidate for\n * collapsing. It is only a cheap pre-filter: whether the value actually gets a\n * \"Show more\" toggle depends on whether it overflows two lines at the column's\n * real width (see {@link CompareValueComponent.Overflows}). Anything shorter\n * always fits, so it is never measured.\n */\nexport const LONG_VALUE_THRESHOLD = 120;\n\n/** How many lines a collapsed value shows. Keep in sync with `-webkit-line-clamp` in the CSS. */\nexport const COLLAPSED_LINES = 2;\n\n/**\n * One field value in the duplicate-record comparison grid.\n *\n * Long values (photo URLs, notes, JSON blobs) start collapsed to two lines,\n * with a \"Show more\" / \"Show less\" toggle, so they don't push every other row\n * out of view. The toggle only appears when the text really overflows two lines\n * at the column's current width, re-checked whenever the column resizes. Nothing\n * is hidden: expanding shows the full text, and a truncated value carries the\n * full text in its `title` tooltip. Short values render unchanged with no toggle.\n *\n * The toggle stops click propagation so expanding a value never selects it\n * for the merge; a click anywhere else on the value still bubbles to the\n * containing cell, which owns selection.\n */\n@Component({\n standalone: true,\n selector: 'mj-compare-value',\n templateUrl: './compare-value.component.html',\n styleUrls: ['./compare-value.component.css'],\n})\nexport class CompareValueComponent implements AfterViewInit, OnDestroy {\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly injector = inject(Injector);\n private resizeObserver: ResizeObserver | null = null;\n private _value = '';\n\n @ViewChild('valueText') private textRef?: ElementRef<HTMLElement>;\n\n /** The value to display. Changing it collapses the view again and re-checks the overflow. */\n @Input()\n set Value(value: string | null | undefined) {\n const next = value ?? '';\n if (next !== this._value) {\n this._value = next;\n this.Expanded = false;\n this.scheduleMeasure();\n }\n }\n get Value(): string {\n return this._value;\n }\n\n /**\n * Whether a long value is expanded. Bind it two-way (`[(Expanded)]`) to share one state across a row, so\n * expanding one column's value expands the others in that row too.\n */\n @Input() Expanded = false;\n\n /** Emitted when the user toggles the value, with the new expanded state. */\n @Output() ExpandedChange = new EventEmitter<boolean>();\n\n /**\n * True when the value, clamped to {@link COLLAPSED_LINES} lines, does not fit at the column's current\n * width. Measured from the rendered text after each render that changes the value and on every resize.\n */\n public Overflows = false;\n\n /** True when the value exceeds {@link LONG_VALUE_THRESHOLD}, so it renders clamped until expanded. */\n public get IsLong(): boolean {\n return this._value.length > LONG_VALUE_THRESHOLD;\n }\n\n /** True when the value is long and not expanded. */\n public get IsCollapsed(): boolean {\n return this.IsLong && !this.Expanded;\n }\n\n /** True when the toggle should show: the value is long and really overflows two lines. */\n public get ShowToggle(): boolean {\n return this.IsLong && this.Overflows;\n }\n\n /** True when part of the value is hidden right now, so the tooltip carries the full text. */\n public get IsTruncated(): boolean {\n return this.IsCollapsed && this.Overflows;\n }\n\n public ngAfterViewInit(): void {\n const text = this.textRef?.nativeElement;\n if (text && typeof ResizeObserver !== 'undefined') {\n // Fires when the column narrows or widens, and when the text expands or collapses\n this.resizeObserver = new ResizeObserver(() => this.measureOverflow());\n this.resizeObserver.observe(text);\n }\n }\n\n public ngOnDestroy(): void {\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n }\n\n /** Expand or collapse this value without selecting it for the merge. */\n public ToggleExpanded(event: MouseEvent): void {\n event.stopPropagation();\n this.Expanded = !this.Expanded;\n this.ExpandedChange.emit(this.Expanded);\n }\n\n /** Measure once the new value has rendered (a value change doesn't always resize the clamped box). */\n private scheduleMeasure(): void {\n afterNextRender(() => this.measureOverflow(), { injector: this.injector });\n }\n\n private measureOverflow(): void {\n const overflows = this.computeOverflows();\n if (overflows !== this.Overflows) {\n this.Overflows = overflows;\n this.cdr.markForCheck();\n }\n }\n\n private computeOverflows(): boolean {\n const text = this.textRef?.nativeElement;\n if (!text || !this.IsLong) {\n return false;\n }\n if (this.IsCollapsed) {\n // The clamp hides whatever is taller than the visible box\n return text.scrollHeight > text.clientHeight + 1;\n }\n // Expanded: there is no clamp to compare against, so compare with the height of the collapsed lines\n const lineHeight = parseFloat(getComputedStyle(text).lineHeight);\n if (!Number.isFinite(lineHeight)) {\n return this.Overflows;\n }\n return text.scrollHeight > lineHeight * COLLAPSED_LINES + 1;\n }\n}\n","<span #valueText class=\"compare-value-text\"\n [class.compare-value-collapsed]=\"IsCollapsed\"\n [attr.title]=\"IsTruncated ? Value : null\">{{ Value }}</span>\n@if (ShowToggle) {\n <button type=\"button\" class=\"compare-value-toggle\"\n [attr.aria-expanded]=\"Expanded\"\n (click)=\"ToggleExpanded($event)\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!Expanded\" [class.fa-chevron-up]=\"Expanded\" aria-hidden=\"true\"></i>\n {{ Expanded ? 'Show less' : 'Show more' }}\n </button>\n}\n"]}
@@ -62,6 +62,8 @@ interface ComparisonFieldRow {
62
62
  HasDifference: boolean;
63
63
  /** Index of the column whose value is selected for merge (0 = source, 1+ = match index) */
64
64
  SelectedColumnIndex: number;
65
+ /** Whether this row's long values are expanded — shared by every column so they open and close together. */
66
+ Expanded?: boolean;
65
67
  }
66
68
  /** LLM reasoning recommendation surfaced alongside a match (null when reasoning never ran) */
67
69
  type LLMRecommendation = 'Merge' | 'NotDuplicate' | 'Uncertain';
@@ -86,6 +88,8 @@ interface EntityDocumentOption {
86
88
  ID: string;
87
89
  Name: string;
88
90
  EntityName: string;
91
+ /** The entity the document describes; duplicate runs are matched to the document through it. */
92
+ EntityID: string;
89
93
  PotentialMatchThreshold: number;
90
94
  AbsoluteMatchThreshold: number;
91
95
  /** Master switch for the LLM reasoning layer (off = vector-only). */
@@ -107,6 +111,25 @@ export declare class DuplicateDetectionResourceComponent extends BaseResourceCom
107
111
  /** Whether the results area (runs/details/matches) is still loading */
108
112
  IsLoadingResults: boolean;
109
113
  IsSaving: boolean;
114
+ /** The run whose review rows are on the board: the selected entity document's current run. */
115
+ CurrentRun: MJDuplicateRunEntity | null;
116
+ /** Set once the first run load completes; a later entity-document change reloads the review rows. */
117
+ private runDataLoaded;
118
+ /**
119
+ * True while the entity-document selection is the board's own default rather than a choice the
120
+ * user or the agent made; a refresh may then re-point it at the document that actually has runs.
121
+ */
122
+ private selectionIsDefault;
123
+ /**
124
+ * Bumped by every review-row load. A load whose generation is no longer current was superseded
125
+ * by a newer selection and must not write its rows (or clear the spinner) over the newer one.
126
+ */
127
+ private reviewLoadGeneration;
128
+ /**
129
+ * How many times the first load will re-fetch because the selected document moved while the
130
+ * rows were in flight, before handing over to a single bounded reload (see loadRunData).
131
+ */
132
+ private static readonly MAX_INITIAL_LOAD_FETCHES;
110
133
  /** The group being compared (null = panel closed) */
111
134
  ComparisonGroup: DuplicateGroup | null;
112
135
  /** Whether the comparison panel is loading entity records */
@@ -183,6 +206,8 @@ export declare class DuplicateDetectionResourceComponent extends BaseResourceCom
183
206
  private _selectedEntityDocumentID;
184
207
  get SelectedEntityDocumentID(): string;
185
208
  set SelectedEntityDocumentID(value: string);
209
+ /** Store the selection and sync the per-document threshold controls; never triggers a reload. */
210
+ private applyEntityDocumentSelection;
186
211
  /**
187
212
  * When true, renders only the body content (no chrome). Set by parent shells
188
213
  * that embed this resource. See plans/explorer-chrome-conventions.md Section 5.
@@ -259,13 +284,34 @@ export declare class DuplicateDetectionResourceComponent extends BaseResourceCom
259
284
  * Loads all duplicate run data and builds the Kanban groups.
260
285
  * Split into two phases so that controls become interactive immediately:
261
286
  * Phase 1 - entity docs from KH engine cache (instant)
262
- * Phase 2 - runs/details/matches via RunViews (heavy)
287
+ * Phase 2 - runs, then the selected document's current-run details/matches via RunViews (heavy)
263
288
  */
264
289
  LoadData(): Promise<void>;
265
290
  /** Phase 1: Load entity documents from KH engine cache (instant). */
266
291
  private loadEntityDocuments;
267
- /** Phase 2: Load runs, details, and matches via RunViews batch. */
292
+ /**
293
+ * Phase 2: Load the runs, then the review rows (details + matches) of the selected document's
294
+ * current run. `generation` is the load this call belongs to (see reviewLoadGeneration).
295
+ */
268
296
  private loadRunData;
297
+ /**
298
+ * Resolve the selected document's current run and fetch that run's details, then the matches for
299
+ * exactly those details. Two round trips on purpose: the match filter is a plain `IN (...)` of the
300
+ * detail IDs, so it runs on any database behind the API (see duplicate-detection-run-scope.ts).
301
+ * Returns the rows without touching component state; the caller decides whether they are still
302
+ * current (see reviewLoadGeneration).
303
+ */
304
+ private fetchReviewRowsForSelectedDocument;
305
+ /** Make a fetched set of review rows the board's current rows. */
306
+ private applyReviewRows;
307
+ /** Rebuild groups, entity names, ranges and columns from the loaded review rows. */
308
+ private rebuildBoard;
309
+ /**
310
+ * The selected entity document changed after the first load: swap the review rows to that
311
+ * document's current run. Runs are already loaded, so only the bounded review queries re-run.
312
+ * A faster later selection supersedes this one: its rows, and the spinner, then belong to it.
313
+ */
314
+ private reloadRunDataForSelection;
269
315
  /**
270
316
  * Check if there's an in-progress detection run and reconnect to its
271
317
  * progress subscription. This handles the case where the user navigated
@@ -355,7 +401,7 @@ export declare class DuplicateDetectionResourceComponent extends BaseResourceCom
355
401
  private subscribeToPipelineProgress;
356
402
  /** Format detection stage names for display */
357
403
  private formatDetectionStage;
358
- /** Extract unique entity names from loaded runs */
404
+ /** Extract the entity names on the board: the displayed run's entity, plus any carried on the groups */
359
405
  private extractEntityNames;
360
406
  /**
361
407
  * Build DuplicateGroup objects by joining details to their matches,
@@ -1 +1 @@
1
- {"version":3,"file":"duplicate-detection-resource.component.d.ts","sourceRoot":"","sources":["../../../../src/AI/components/duplicates/duplicate-detection-resource.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"duplicate-detection-resource.component.d.ts","sourceRoot":"","sources":["../../../../src/AI/components/duplicates/duplicate-detection-resource.component.ts"],"names":[],"mappings":"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"}