@memberjunction/ng-conversations 5.20.0 → 5.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/__tests__/conversation-bridge.service.test.d.ts +2 -0
  2. package/dist/__tests__/conversation-bridge.service.test.d.ts.map +1 -0
  3. package/dist/__tests__/conversation-bridge.service.test.js +98 -0
  4. package/dist/__tests__/conversation-bridge.service.test.js.map +1 -0
  5. package/dist/__tests__/conversation-cache.test.d.ts +2 -0
  6. package/dist/__tests__/conversation-cache.test.d.ts.map +1 -0
  7. package/dist/__tests__/conversation-cache.test.js +233 -0
  8. package/dist/__tests__/conversation-cache.test.js.map +1 -0
  9. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +30 -3
  10. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  11. package/dist/lib/components/conversation/conversation-chat-area.component.js +437 -242
  12. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  13. package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
  14. package/dist/lib/components/conversation/conversation-list.component.js +8 -1
  15. package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
  16. package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts +24 -0
  17. package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts.map +1 -0
  18. package/dist/lib/components/conversation/pinned-messages-panel.component.js +153 -0
  19. package/dist/lib/components/conversation/pinned-messages-panel.component.js.map +1 -0
  20. package/dist/lib/components/message/conversation-message-rating.component.d.ts +12 -23
  21. package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -1
  22. package/dist/lib/components/message/conversation-message-rating.component.js +110 -83
  23. package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -1
  24. package/dist/lib/components/message/message-item.component.d.ts +11 -3
  25. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  26. package/dist/lib/components/message/message-item.component.js +182 -113
  27. package/dist/lib/components/message/message-item.component.js.map +1 -1
  28. package/dist/lib/components/message/message-list.component.d.ts +3 -2
  29. package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
  30. package/dist/lib/components/message/message-list.component.js +9 -5
  31. package/dist/lib/components/message/message-list.component.js.map +1 -1
  32. package/dist/lib/conversations.module.d.ts +27 -26
  33. package/dist/lib/conversations.module.d.ts.map +1 -1
  34. package/dist/lib/conversations.module.js +7 -3
  35. package/dist/lib/conversations.module.js.map +1 -1
  36. package/dist/lib/services/conversation-bridge.service.d.ts +73 -0
  37. package/dist/lib/services/conversation-bridge.service.d.ts.map +1 -0
  38. package/dist/lib/services/conversation-bridge.service.js +99 -0
  39. package/dist/lib/services/conversation-bridge.service.js.map +1 -0
  40. package/dist/lib/services/conversation-streaming.service.d.ts +15 -0
  41. package/dist/lib/services/conversation-streaming.service.d.ts.map +1 -1
  42. package/dist/lib/services/conversation-streaming.service.js +14 -0
  43. package/dist/lib/services/conversation-streaming.service.js.map +1 -1
  44. package/dist/public-api.d.ts +1 -0
  45. package/dist/public-api.d.ts.map +1 -1
  46. package/dist/public-api.js +1 -0
  47. package/dist/public-api.js.map +1 -1
  48. package/package.json +18 -18
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=conversation-bridge.service.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-bridge.service.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/conversation-bridge.service.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,98 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { ConversationBridgeService } from '../lib/services/conversation-bridge.service';
3
+ describe('ConversationBridgeService', () => {
4
+ let service;
5
+ beforeEach(() => {
6
+ service = new ConversationBridgeService();
7
+ });
8
+ describe('ActiveConversationID$', () => {
9
+ it('should start with null', () => {
10
+ expect(service.ActiveConversationID$.value).toBeNull();
11
+ });
12
+ it('should update when set from overlay', () => {
13
+ service.SetActiveFromOverlay('conv-123');
14
+ expect(service.ActiveConversationID$.value).toBe('conv-123');
15
+ });
16
+ it('should update when set from workspace', () => {
17
+ service.SetActiveFromWorkspace('conv-456');
18
+ expect(service.ActiveConversationID$.value).toBe('conv-456');
19
+ });
20
+ it('should allow clearing active conversation', () => {
21
+ service.SetActiveFromOverlay('conv-123');
22
+ service.SetActiveFromOverlay(null);
23
+ expect(service.ActiveConversationID$.value).toBeNull();
24
+ });
25
+ });
26
+ describe('SwitchToWorkspace', () => {
27
+ it('should emit switch event with correct source and target', () => {
28
+ const events = [];
29
+ service.SwitchEvent$.subscribe(e => events.push(e));
30
+ service.SwitchToWorkspace('conv-123');
31
+ expect(events).toHaveLength(1);
32
+ expect(events[0].ConversationID).toBe('conv-123');
33
+ expect(events[0].Source).toBe('overlay');
34
+ expect(events[0].Target).toBe('workspace');
35
+ });
36
+ });
37
+ describe('SwitchToOverlay', () => {
38
+ it('should emit switch event with correct source and target', () => {
39
+ const events = [];
40
+ service.SwitchEvent$.subscribe(e => events.push(e));
41
+ service.SwitchToOverlay('conv-456');
42
+ expect(events).toHaveLength(1);
43
+ expect(events[0].Source).toBe('workspace');
44
+ expect(events[0].Target).toBe('overlay');
45
+ });
46
+ });
47
+ describe('NavigateToConversation', () => {
48
+ it('should set active conversation and emit deep link', () => {
49
+ const deepLinks = [];
50
+ service.DeepLinkRequest$.subscribe(dl => deepLinks.push(dl));
51
+ service.NavigateToConversation({
52
+ ConversationID: 'conv-789',
53
+ OpenIn: 'workspace'
54
+ });
55
+ expect(service.ActiveConversationID$.value).toBe('conv-789');
56
+ expect(deepLinks).toHaveLength(1);
57
+ expect(deepLinks[0].OpenIn).toBe('workspace');
58
+ });
59
+ it('should support optional message ID', () => {
60
+ const deepLinks = [];
61
+ service.DeepLinkRequest$.subscribe(dl => deepLinks.push(dl));
62
+ service.NavigateToConversation({
63
+ ConversationID: 'conv-789',
64
+ MessageID: 'msg-42'
65
+ });
66
+ expect(deepLinks[0].MessageID).toBe('msg-42');
67
+ });
68
+ });
69
+ describe('OverlayActive$ and WorkspaceActive$', () => {
70
+ it('should track overlay state', () => {
71
+ service.NotifyOverlayActive(true);
72
+ expect(service.OverlayActive$.value).toBe(true);
73
+ service.NotifyOverlayActive(false);
74
+ expect(service.OverlayActive$.value).toBe(false);
75
+ });
76
+ it('should track workspace state', () => {
77
+ service.NotifyWorkspaceActive(true);
78
+ expect(service.WorkspaceActive$.value).toBe(true);
79
+ });
80
+ });
81
+ describe('ShouldResumeInOverlay', () => {
82
+ it('should return true when workspace is inactive and conversation exists', () => {
83
+ service.NotifyWorkspaceActive(false);
84
+ service.SetActiveFromOverlay('conv-123');
85
+ expect(service.ShouldResumeInOverlay()).toBe(true);
86
+ });
87
+ it('should return false when workspace is active', () => {
88
+ service.NotifyWorkspaceActive(true);
89
+ service.SetActiveFromOverlay('conv-123');
90
+ expect(service.ShouldResumeInOverlay()).toBe(false);
91
+ });
92
+ it('should return false when no active conversation', () => {
93
+ service.NotifyWorkspaceActive(false);
94
+ expect(service.ShouldResumeInOverlay()).toBe(false);
95
+ });
96
+ });
97
+ });
98
+ //# sourceMappingURL=conversation-bridge.service.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-bridge.service.test.js","sourceRoot":"","sources":["../../src/__tests__/conversation-bridge.service.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, it, expect, beforeEach, vi } from 'vitest';\nimport {\n ConversationBridgeService,\n ConversationSwitchEvent,\n ConversationDeepLink\n} from '../lib/services/conversation-bridge.service';\n\ndescribe('ConversationBridgeService', () => {\n let service: ConversationBridgeService;\n\n beforeEach(() => {\n service = new ConversationBridgeService();\n });\n\n describe('ActiveConversationID$', () => {\n it('should start with null', () => {\n expect(service.ActiveConversationID$.value).toBeNull();\n });\n\n it('should update when set from overlay', () => {\n service.SetActiveFromOverlay('conv-123');\n expect(service.ActiveConversationID$.value).toBe('conv-123');\n });\n\n it('should update when set from workspace', () => {\n service.SetActiveFromWorkspace('conv-456');\n expect(service.ActiveConversationID$.value).toBe('conv-456');\n });\n\n it('should allow clearing active conversation', () => {\n service.SetActiveFromOverlay('conv-123');\n service.SetActiveFromOverlay(null);\n expect(service.ActiveConversationID$.value).toBeNull();\n });\n });\n\n describe('SwitchToWorkspace', () => {\n it('should emit switch event with correct source and target', () => {\n const events: ConversationSwitchEvent[] = [];\n service.SwitchEvent$.subscribe(e => events.push(e));\n\n service.SwitchToWorkspace('conv-123');\n\n expect(events).toHaveLength(1);\n expect(events[0].ConversationID).toBe('conv-123');\n expect(events[0].Source).toBe('overlay');\n expect(events[0].Target).toBe('workspace');\n });\n });\n\n describe('SwitchToOverlay', () => {\n it('should emit switch event with correct source and target', () => {\n const events: ConversationSwitchEvent[] = [];\n service.SwitchEvent$.subscribe(e => events.push(e));\n\n service.SwitchToOverlay('conv-456');\n\n expect(events).toHaveLength(1);\n expect(events[0].Source).toBe('workspace');\n expect(events[0].Target).toBe('overlay');\n });\n });\n\n describe('NavigateToConversation', () => {\n it('should set active conversation and emit deep link', () => {\n const deepLinks: ConversationDeepLink[] = [];\n service.DeepLinkRequest$.subscribe(dl => deepLinks.push(dl));\n\n service.NavigateToConversation({\n ConversationID: 'conv-789',\n OpenIn: 'workspace'\n });\n\n expect(service.ActiveConversationID$.value).toBe('conv-789');\n expect(deepLinks).toHaveLength(1);\n expect(deepLinks[0].OpenIn).toBe('workspace');\n });\n\n it('should support optional message ID', () => {\n const deepLinks: ConversationDeepLink[] = [];\n service.DeepLinkRequest$.subscribe(dl => deepLinks.push(dl));\n\n service.NavigateToConversation({\n ConversationID: 'conv-789',\n MessageID: 'msg-42'\n });\n\n expect(deepLinks[0].MessageID).toBe('msg-42');\n });\n });\n\n describe('OverlayActive$ and WorkspaceActive$', () => {\n it('should track overlay state', () => {\n service.NotifyOverlayActive(true);\n expect(service.OverlayActive$.value).toBe(true);\n\n service.NotifyOverlayActive(false);\n expect(service.OverlayActive$.value).toBe(false);\n });\n\n it('should track workspace state', () => {\n service.NotifyWorkspaceActive(true);\n expect(service.WorkspaceActive$.value).toBe(true);\n });\n });\n\n describe('ShouldResumeInOverlay', () => {\n it('should return true when workspace is inactive and conversation exists', () => {\n service.NotifyWorkspaceActive(false);\n service.SetActiveFromOverlay('conv-123');\n expect(service.ShouldResumeInOverlay()).toBe(true);\n });\n\n it('should return false when workspace is active', () => {\n service.NotifyWorkspaceActive(true);\n service.SetActiveFromOverlay('conv-123');\n expect(service.ShouldResumeInOverlay()).toBe(false);\n });\n\n it('should return false when no active conversation', () => {\n service.NotifyWorkspaceActive(false);\n expect(service.ShouldResumeInOverlay()).toBe(false);\n });\n });\n});\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=conversation-cache.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-cache.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/conversation-cache.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,233 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ /**
3
+ * Extracts the cache management logic from ConversationChatAreaComponent
4
+ * for isolated testing without Angular dependencies.
5
+ */
6
+ class TestableConversationCache {
7
+ cache = new Map();
8
+ has(conversationId) {
9
+ return this.cache.has(conversationId);
10
+ }
11
+ get(conversationId) {
12
+ return this.cache.get(conversationId);
13
+ }
14
+ /** Store raw data from server (first visit) */
15
+ setRaw(conversationId, raw) {
16
+ this.cache.set(conversationId, { raw, entities: null });
17
+ }
18
+ /** Store hydrated entities after conversion */
19
+ setEntities(conversationId, entities) {
20
+ const entry = this.cache.get(conversationId);
21
+ if (entry) {
22
+ entry.entities = entities;
23
+ }
24
+ }
25
+ /** Invalidate both raw and entities */
26
+ invalidate(conversationId) {
27
+ this.cache.delete(conversationId);
28
+ }
29
+ /** Patch raw data in-place (e.g., after pin toggle) */
30
+ patchRaw(conversationId, messageId, patch) {
31
+ const entry = this.cache.get(conversationId);
32
+ if (entry) {
33
+ const row = entry.raw.find(r => r.ID === messageId);
34
+ if (row) {
35
+ Object.assign(row, patch);
36
+ }
37
+ }
38
+ }
39
+ /** Update raw data with fresh server data (invalidates entities) */
40
+ refreshRaw(conversationId, raw) {
41
+ this.cache.set(conversationId, { raw, entities: null });
42
+ }
43
+ get size() {
44
+ return this.cache.size;
45
+ }
46
+ }
47
+ /** Simulate the 3-path loadMessages logic */
48
+ function resolveLoadPath(cache, conversationId) {
49
+ const entry = cache.get(conversationId);
50
+ if (entry?.entities)
51
+ return 'cached-entities';
52
+ if (entry)
53
+ return 'cached-raw';
54
+ return 'server-fetch';
55
+ }
56
+ // ─── Test data ───────────────────────────────────────────────────────────
57
+ function createRawRows(conversationId, count) {
58
+ return Array.from({ length: count }, (_, i) => ({
59
+ ID: `detail-${i}`,
60
+ ConversationID: conversationId,
61
+ Message: `Message ${i}`,
62
+ Role: i % 2 === 0 ? 'user' : 'AI',
63
+ Status: 'Completed',
64
+ IsPinned: false,
65
+ }));
66
+ }
67
+ function createEntities(rawRows) {
68
+ return rawRows.map(r => ({
69
+ ID: r.ID,
70
+ Message: r.Message,
71
+ Status: r.Status,
72
+ IsPinned: r.IsPinned,
73
+ }));
74
+ }
75
+ // ─── Tests ───────────────────────────────────────────────────────────────
76
+ describe('Conversation Compound Cache', () => {
77
+ let cache;
78
+ const convA = 'conv-aaa';
79
+ const convB = 'conv-bbb';
80
+ beforeEach(() => {
81
+ cache = new TestableConversationCache();
82
+ });
83
+ describe('Cache structure', () => {
84
+ it('should start empty', () => {
85
+ expect(cache.size).toBe(0);
86
+ expect(cache.has(convA)).toBe(false);
87
+ });
88
+ it('should store raw data with null entities on first visit', () => {
89
+ const raw = createRawRows(convA, 5);
90
+ cache.setRaw(convA, raw);
91
+ const entry = cache.get(convA);
92
+ expect(entry).toBeDefined();
93
+ expect(entry.raw).toBe(raw);
94
+ expect(entry.entities).toBeNull();
95
+ });
96
+ it('should store entities alongside raw data after conversion', () => {
97
+ const raw = createRawRows(convA, 5);
98
+ cache.setRaw(convA, raw);
99
+ const entities = createEntities(raw);
100
+ cache.setEntities(convA, entities);
101
+ const entry = cache.get(convA);
102
+ expect(entry.raw).toBe(raw);
103
+ expect(entry.entities).toBe(entities);
104
+ expect(entry.entities).toHaveLength(5);
105
+ });
106
+ });
107
+ describe('Load path resolution', () => {
108
+ it('should resolve to server-fetch when cache is empty', () => {
109
+ expect(resolveLoadPath(cache, convA)).toBe('server-fetch');
110
+ });
111
+ it('should resolve to cached-raw when only raw data exists', () => {
112
+ cache.setRaw(convA, createRawRows(convA, 3));
113
+ expect(resolveLoadPath(cache, convA)).toBe('cached-raw');
114
+ });
115
+ it('should resolve to cached-entities when entities are populated', () => {
116
+ const raw = createRawRows(convA, 3);
117
+ cache.setRaw(convA, raw);
118
+ cache.setEntities(convA, createEntities(raw));
119
+ expect(resolveLoadPath(cache, convA)).toBe('cached-entities');
120
+ });
121
+ it('should handle multiple conversations independently', () => {
122
+ const rawA = createRawRows(convA, 3);
123
+ cache.setRaw(convA, rawA);
124
+ cache.setEntities(convA, createEntities(rawA));
125
+ cache.setRaw(convB, createRawRows(convB, 2));
126
+ expect(resolveLoadPath(cache, convA)).toBe('cached-entities');
127
+ expect(resolveLoadPath(cache, convB)).toBe('cached-raw');
128
+ });
129
+ });
130
+ describe('Invalidation', () => {
131
+ it('should remove both raw and entities on invalidate', () => {
132
+ const raw = createRawRows(convA, 3);
133
+ cache.setRaw(convA, raw);
134
+ cache.setEntities(convA, createEntities(raw));
135
+ cache.invalidate(convA);
136
+ expect(cache.has(convA)).toBe(false);
137
+ expect(cache.get(convA)).toBeUndefined();
138
+ expect(resolveLoadPath(cache, convA)).toBe('server-fetch');
139
+ });
140
+ it('should not affect other conversations when invalidating one', () => {
141
+ cache.setRaw(convA, createRawRows(convA, 3));
142
+ cache.setRaw(convB, createRawRows(convB, 2));
143
+ cache.invalidate(convA);
144
+ expect(cache.has(convA)).toBe(false);
145
+ expect(cache.has(convB)).toBe(true);
146
+ });
147
+ });
148
+ describe('Raw data refresh', () => {
149
+ it('should replace raw data and clear entities on refresh', () => {
150
+ const raw = createRawRows(convA, 3);
151
+ cache.setRaw(convA, raw);
152
+ cache.setEntities(convA, createEntities(raw));
153
+ const freshRaw = createRawRows(convA, 5);
154
+ cache.refreshRaw(convA, freshRaw);
155
+ const entry = cache.get(convA);
156
+ expect(entry.raw).toBe(freshRaw);
157
+ expect(entry.raw).toHaveLength(5);
158
+ expect(entry.entities).toBeNull(); // entities cleared
159
+ expect(resolveLoadPath(cache, convA)).toBe('cached-raw');
160
+ });
161
+ });
162
+ describe('In-place raw patching', () => {
163
+ it('should patch a specific row in raw data', () => {
164
+ const raw = createRawRows(convA, 3);
165
+ cache.setRaw(convA, raw);
166
+ cache.patchRaw(convA, 'detail-1', { IsPinned: true });
167
+ const entry = cache.get(convA);
168
+ expect(entry.raw[1].IsPinned).toBe(true);
169
+ // Other rows unaffected
170
+ expect(entry.raw[0].IsPinned).toBe(false);
171
+ expect(entry.raw[2].IsPinned).toBe(false);
172
+ });
173
+ it('should not affect entities when patching raw data', () => {
174
+ const raw = createRawRows(convA, 3);
175
+ cache.setRaw(convA, raw);
176
+ const entities = createEntities(raw);
177
+ cache.setEntities(convA, entities);
178
+ cache.patchRaw(convA, 'detail-1', { IsPinned: true });
179
+ // Raw is patched
180
+ expect(cache.get(convA).raw[1].IsPinned).toBe(true);
181
+ // Entity objects are separate — not patched by raw patch
182
+ // (In the real component, the entity is already mutated by .Save())
183
+ expect(cache.get(convA).entities[1].IsPinned).toBe(false);
184
+ });
185
+ it('should be a no-op for non-existent conversation', () => {
186
+ cache.patchRaw('nonexistent', 'detail-0', { IsPinned: true });
187
+ expect(cache.has('nonexistent')).toBe(false);
188
+ });
189
+ it('should be a no-op for non-existent message ID', () => {
190
+ const raw = createRawRows(convA, 2);
191
+ cache.setRaw(convA, raw);
192
+ cache.patchRaw(convA, 'nonexistent-detail', { IsPinned: true });
193
+ // Nothing changed
194
+ expect(raw.every(r => r.IsPinned === false)).toBe(true);
195
+ });
196
+ });
197
+ describe('Conversation switching simulation', () => {
198
+ it('should provide instant switch when entities are cached', () => {
199
+ // Visit conversation A — full load
200
+ const rawA = createRawRows(convA, 10);
201
+ cache.setRaw(convA, rawA);
202
+ cache.setEntities(convA, createEntities(rawA));
203
+ // Visit conversation B — full load
204
+ const rawB = createRawRows(convB, 5);
205
+ cache.setRaw(convB, rawB);
206
+ cache.setEntities(convB, createEntities(rawB));
207
+ // Switch back to A — should be instant (cached-entities path)
208
+ expect(resolveLoadPath(cache, convA)).toBe('cached-entities');
209
+ const entryA = cache.get(convA);
210
+ expect(entryA.entities).toHaveLength(10);
211
+ // Switch to B — also instant
212
+ expect(resolveLoadPath(cache, convB)).toBe('cached-entities');
213
+ const entryB = cache.get(convB);
214
+ expect(entryB.entities).toHaveLength(5);
215
+ });
216
+ it('should fall back to raw conversion after invalidation', () => {
217
+ const raw = createRawRows(convA, 3);
218
+ cache.setRaw(convA, raw);
219
+ cache.setEntities(convA, createEntities(raw));
220
+ // New message arrives — cache invalidated
221
+ cache.invalidate(convA);
222
+ // Re-fetch from server, store new raw
223
+ const freshRaw = createRawRows(convA, 4);
224
+ cache.setRaw(convA, freshRaw);
225
+ // Should need conversion (cached-raw path, not cached-entities)
226
+ expect(resolveLoadPath(cache, convA)).toBe('cached-raw');
227
+ // After conversion
228
+ cache.setEntities(convA, createEntities(freshRaw));
229
+ expect(resolveLoadPath(cache, convA)).toBe('cached-entities');
230
+ });
231
+ });
232
+ });
233
+ //# sourceMappingURL=conversation-cache.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-cache.test.js","sourceRoot":"","sources":["../../src/__tests__/conversation-cache.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, it, expect, beforeEach } from 'vitest';\n\n/**\n * Tests for the compound conversation data cache used by ConversationChatAreaComponent.\n *\n * The cache stores both raw query data and hydrated entity objects in a single Map entry.\n * This test exercises the cache logic in isolation (no Angular, no real entities) to verify:\n * - Compound cache structure (raw + nullable entities)\n * - Cache hit paths: entities present vs only raw present vs miss\n * - Invalidation clears both raw and entities\n * - In-place patching of raw data preserves entity references\n */\n\n/** Minimal stand-in for ConversationDetailComplete (raw query row) */\ninterface MockRawRow {\n ID: string;\n ConversationID: string;\n Message: string;\n Role: string;\n Status: string;\n IsPinned: boolean;\n}\n\n/** Minimal stand-in for a hydrated entity object */\ninterface MockEntity {\n ID: string;\n Message: string;\n Status: string;\n IsPinned: boolean;\n}\n\n/** The compound cache entry shape matching the component's implementation */\ninterface CacheEntry {\n raw: MockRawRow[];\n entities: MockEntity[] | null;\n}\n\n/**\n * Extracts the cache management logic from ConversationChatAreaComponent\n * for isolated testing without Angular dependencies.\n */\nclass TestableConversationCache {\n private cache = new Map<string, CacheEntry>();\n\n has(conversationId: string): boolean {\n return this.cache.has(conversationId);\n }\n\n get(conversationId: string): CacheEntry | undefined {\n return this.cache.get(conversationId);\n }\n\n /** Store raw data from server (first visit) */\n setRaw(conversationId: string, raw: MockRawRow[]): void {\n this.cache.set(conversationId, { raw, entities: null });\n }\n\n /** Store hydrated entities after conversion */\n setEntities(conversationId: string, entities: MockEntity[]): void {\n const entry = this.cache.get(conversationId);\n if (entry) {\n entry.entities = entities;\n }\n }\n\n /** Invalidate both raw and entities */\n invalidate(conversationId: string): void {\n this.cache.delete(conversationId);\n }\n\n /** Patch raw data in-place (e.g., after pin toggle) */\n patchRaw(conversationId: string, messageId: string, patch: Partial<MockRawRow>): void {\n const entry = this.cache.get(conversationId);\n if (entry) {\n const row = entry.raw.find(r => r.ID === messageId);\n if (row) {\n Object.assign(row, patch);\n }\n }\n }\n\n /** Update raw data with fresh server data (invalidates entities) */\n refreshRaw(conversationId: string, raw: MockRawRow[]): void {\n this.cache.set(conversationId, { raw, entities: null });\n }\n\n get size(): number {\n return this.cache.size;\n }\n}\n\n/** Simulate the 3-path loadMessages logic */\nfunction resolveLoadPath(cache: TestableConversationCache, conversationId: string): 'cached-entities' | 'cached-raw' | 'server-fetch' {\n const entry = cache.get(conversationId);\n if (entry?.entities) return 'cached-entities';\n if (entry) return 'cached-raw';\n return 'server-fetch';\n}\n\n// ─── Test data ───────────────────────────────────────────────────────────\n\nfunction createRawRows(conversationId: string, count: number): MockRawRow[] {\n return Array.from({ length: count }, (_, i) => ({\n ID: `detail-${i}`,\n ConversationID: conversationId,\n Message: `Message ${i}`,\n Role: i % 2 === 0 ? 'user' : 'AI',\n Status: 'Completed',\n IsPinned: false,\n }));\n}\n\nfunction createEntities(rawRows: MockRawRow[]): MockEntity[] {\n return rawRows.map(r => ({\n ID: r.ID,\n Message: r.Message,\n Status: r.Status,\n IsPinned: r.IsPinned,\n }));\n}\n\n// ─── Tests ───────────────────────────────────────────────────────────────\n\ndescribe('Conversation Compound Cache', () => {\n let cache: TestableConversationCache;\n const convA = 'conv-aaa';\n const convB = 'conv-bbb';\n\n beforeEach(() => {\n cache = new TestableConversationCache();\n });\n\n describe('Cache structure', () => {\n it('should start empty', () => {\n expect(cache.size).toBe(0);\n expect(cache.has(convA)).toBe(false);\n });\n\n it('should store raw data with null entities on first visit', () => {\n const raw = createRawRows(convA, 5);\n cache.setRaw(convA, raw);\n\n const entry = cache.get(convA);\n expect(entry).toBeDefined();\n expect(entry!.raw).toBe(raw);\n expect(entry!.entities).toBeNull();\n });\n\n it('should store entities alongside raw data after conversion', () => {\n const raw = createRawRows(convA, 5);\n cache.setRaw(convA, raw);\n\n const entities = createEntities(raw);\n cache.setEntities(convA, entities);\n\n const entry = cache.get(convA);\n expect(entry!.raw).toBe(raw);\n expect(entry!.entities).toBe(entities);\n expect(entry!.entities).toHaveLength(5);\n });\n });\n\n describe('Load path resolution', () => {\n it('should resolve to server-fetch when cache is empty', () => {\n expect(resolveLoadPath(cache, convA)).toBe('server-fetch');\n });\n\n it('should resolve to cached-raw when only raw data exists', () => {\n cache.setRaw(convA, createRawRows(convA, 3));\n expect(resolveLoadPath(cache, convA)).toBe('cached-raw');\n });\n\n it('should resolve to cached-entities when entities are populated', () => {\n const raw = createRawRows(convA, 3);\n cache.setRaw(convA, raw);\n cache.setEntities(convA, createEntities(raw));\n expect(resolveLoadPath(cache, convA)).toBe('cached-entities');\n });\n\n it('should handle multiple conversations independently', () => {\n const rawA = createRawRows(convA, 3);\n cache.setRaw(convA, rawA);\n cache.setEntities(convA, createEntities(rawA));\n\n cache.setRaw(convB, createRawRows(convB, 2));\n\n expect(resolveLoadPath(cache, convA)).toBe('cached-entities');\n expect(resolveLoadPath(cache, convB)).toBe('cached-raw');\n });\n });\n\n describe('Invalidation', () => {\n it('should remove both raw and entities on invalidate', () => {\n const raw = createRawRows(convA, 3);\n cache.setRaw(convA, raw);\n cache.setEntities(convA, createEntities(raw));\n\n cache.invalidate(convA);\n\n expect(cache.has(convA)).toBe(false);\n expect(cache.get(convA)).toBeUndefined();\n expect(resolveLoadPath(cache, convA)).toBe('server-fetch');\n });\n\n it('should not affect other conversations when invalidating one', () => {\n cache.setRaw(convA, createRawRows(convA, 3));\n cache.setRaw(convB, createRawRows(convB, 2));\n\n cache.invalidate(convA);\n\n expect(cache.has(convA)).toBe(false);\n expect(cache.has(convB)).toBe(true);\n });\n });\n\n describe('Raw data refresh', () => {\n it('should replace raw data and clear entities on refresh', () => {\n const raw = createRawRows(convA, 3);\n cache.setRaw(convA, raw);\n cache.setEntities(convA, createEntities(raw));\n\n const freshRaw = createRawRows(convA, 5);\n cache.refreshRaw(convA, freshRaw);\n\n const entry = cache.get(convA);\n expect(entry!.raw).toBe(freshRaw);\n expect(entry!.raw).toHaveLength(5);\n expect(entry!.entities).toBeNull(); // entities cleared\n expect(resolveLoadPath(cache, convA)).toBe('cached-raw');\n });\n });\n\n describe('In-place raw patching', () => {\n it('should patch a specific row in raw data', () => {\n const raw = createRawRows(convA, 3);\n cache.setRaw(convA, raw);\n\n cache.patchRaw(convA, 'detail-1', { IsPinned: true });\n\n const entry = cache.get(convA);\n expect(entry!.raw[1].IsPinned).toBe(true);\n // Other rows unaffected\n expect(entry!.raw[0].IsPinned).toBe(false);\n expect(entry!.raw[2].IsPinned).toBe(false);\n });\n\n it('should not affect entities when patching raw data', () => {\n const raw = createRawRows(convA, 3);\n cache.setRaw(convA, raw);\n const entities = createEntities(raw);\n cache.setEntities(convA, entities);\n\n cache.patchRaw(convA, 'detail-1', { IsPinned: true });\n\n // Raw is patched\n expect(cache.get(convA)!.raw[1].IsPinned).toBe(true);\n // Entity objects are separate — not patched by raw patch\n // (In the real component, the entity is already mutated by .Save())\n expect(cache.get(convA)!.entities![1].IsPinned).toBe(false);\n });\n\n it('should be a no-op for non-existent conversation', () => {\n cache.patchRaw('nonexistent', 'detail-0', { IsPinned: true });\n expect(cache.has('nonexistent')).toBe(false);\n });\n\n it('should be a no-op for non-existent message ID', () => {\n const raw = createRawRows(convA, 2);\n cache.setRaw(convA, raw);\n\n cache.patchRaw(convA, 'nonexistent-detail', { IsPinned: true });\n\n // Nothing changed\n expect(raw.every(r => r.IsPinned === false)).toBe(true);\n });\n });\n\n describe('Conversation switching simulation', () => {\n it('should provide instant switch when entities are cached', () => {\n // Visit conversation A — full load\n const rawA = createRawRows(convA, 10);\n cache.setRaw(convA, rawA);\n cache.setEntities(convA, createEntities(rawA));\n\n // Visit conversation B — full load\n const rawB = createRawRows(convB, 5);\n cache.setRaw(convB, rawB);\n cache.setEntities(convB, createEntities(rawB));\n\n // Switch back to A — should be instant (cached-entities path)\n expect(resolveLoadPath(cache, convA)).toBe('cached-entities');\n const entryA = cache.get(convA)!;\n expect(entryA.entities).toHaveLength(10);\n\n // Switch to B — also instant\n expect(resolveLoadPath(cache, convB)).toBe('cached-entities');\n const entryB = cache.get(convB)!;\n expect(entryB.entities).toHaveLength(5);\n });\n\n it('should fall back to raw conversion after invalidation', () => {\n const raw = createRawRows(convA, 3);\n cache.setRaw(convA, raw);\n cache.setEntities(convA, createEntities(raw));\n\n // New message arrives — cache invalidated\n cache.invalidate(convA);\n\n // Re-fetch from server, store new raw\n const freshRaw = createRawRows(convA, 4);\n cache.setRaw(convA, freshRaw);\n\n // Should need conversion (cached-raw path, not cached-entities)\n expect(resolveLoadPath(cache, convA)).toBe('cached-raw');\n\n // After conversion\n cache.setEntities(convA, createEntities(freshRaw));\n expect(resolveLoadPath(cache, convA)).toBe('cached-entities');\n });\n });\n});\n"]}
@@ -14,7 +14,8 @@ import { LazyArtifactInfo } from '../../models/lazy-artifact-info';
14
14
  import { RatingJSON } from '../../models/conversation-complete-query.model';
15
15
  import { PendingAttachment } from '../mention/mention-editor.component';
16
16
  import { NavigationRequest } from '@memberjunction/ng-artifacts';
17
- import { DialogService } from '@progress/kendo-angular-dialog';
17
+ import { TestFeedbackDialogData, TestFeedbackDialogResult } from '@memberjunction/ng-testing';
18
+ import { DialogService as ConversationsDialogService } from '../../services/dialog.service';
18
19
  import { Subject } from 'rxjs';
19
20
  import { ConversationStreamingService } from '../../services/conversation-streaming.service';
20
21
  import * as i0 from "@angular/core";
@@ -26,9 +27,9 @@ export declare class ConversationChatAreaComponent implements OnInit, OnDestroy,
26
27
  private cdr;
27
28
  private mentionAutocompleteService;
28
29
  private artifactPermissionService;
29
- private dialogService;
30
30
  private attachmentService;
31
31
  private streamingService;
32
+ private confirmDialog;
32
33
  environmentId: string;
33
34
  currentUser: UserInfo;
34
35
  private _conversationId;
@@ -152,6 +153,11 @@ export declare class ConversationChatAreaComponent implements OnInit, OnDestroy,
152
153
  private startX;
153
154
  private startWidth;
154
155
  private readonly ARTIFACT_PANE_WIDTH_KEY;
156
+ showPinsPanel: boolean;
157
+ /** All currently pinned messages in the active conversation, newest pin first */
158
+ get pinnedMessages(): MJConversationDetailEntity[];
159
+ showTestFeedbackDialog: boolean;
160
+ testFeedbackDialogData: TestFeedbackDialogData | null;
155
161
  showImageViewer: boolean;
156
162
  selectedImageUrl: string;
157
163
  selectedImageAlt: string;
@@ -163,7 +169,7 @@ export declare class ConversationChatAreaComponent implements OnInit, OnDestroy,
163
169
  maxAttachmentSizeBytes: number;
164
170
  acceptedFileTypes: string;
165
171
  private conversationManagerAgent;
166
- constructor(conversationData: ConversationDataService, agentStateService: AgentStateService, conversationAgentService: ConversationAgentService, activeTasks: ActiveTasksService, cdr: ChangeDetectorRef, mentionAutocompleteService: MentionAutocompleteService, artifactPermissionService: ArtifactPermissionService, dialogService: DialogService, attachmentService: ConversationAttachmentService, streamingService: ConversationStreamingService);
172
+ constructor(conversationData: ConversationDataService, agentStateService: AgentStateService, conversationAgentService: ConversationAgentService, activeTasks: ActiveTasksService, cdr: ChangeDetectorRef, mentionAutocompleteService: MentionAutocompleteService, artifactPermissionService: ArtifactPermissionService, attachmentService: ConversationAttachmentService, streamingService: ConversationStreamingService, confirmDialog: ConversationsDialogService);
167
173
  ngOnInit(): Promise<void>;
168
174
  /**
169
175
  * Initializes attachment support by checking if the conversation manager agent (Sage)
@@ -385,6 +391,16 @@ export declare class ConversationChatAreaComponent implements OnInit, OnDestroy,
385
391
  onToggleAgentPanel(): void;
386
392
  onAgentSelected(agentRun: MJAIAgentRunEntity): void;
387
393
  onMessageEdited(message: MJConversationDetailEntity): void;
394
+ onMessagePinToggled(message: MJConversationDetailEntity): void;
395
+ /**
396
+ * Scrolls the message list to the target message and plays the beacon animation.
397
+ * Called when the user clicks "Jump to message" in the pins panel.
398
+ */
399
+ onJumpToMessage(messageId: string): void;
400
+ /**
401
+ * Unpins a message from the pins panel — saves to DB and patches the cache.
402
+ */
403
+ onUnpinFromPanel(message: MJConversationDetailEntity): Promise<void>;
388
404
  /**
389
405
  * Handle suggested response selection from user
390
406
  * Sends the selected response as a new user message WITHOUT modifying the visible input
@@ -393,6 +409,7 @@ export declare class ConversationChatAreaComponent implements OnInit, OnDestroy,
393
409
  text: string;
394
410
  customInput?: string;
395
411
  }): Promise<void>;
412
+ onDeleteMessage(message: MJConversationDetailEntity): Promise<void>;
396
413
  onRetryMessage(message: MJConversationDetailEntity): void;
397
414
  /**
398
415
  * Handle attachment click - opens the image viewer for images
@@ -481,7 +498,17 @@ export declare class ConversationChatAreaComponent implements OnInit, OnDestroy,
481
498
  }): void;
482
499
  onNavigationRequest(event: NavigationRequest): void;
483
500
  viewTestRun(testRunId: string): void;
501
+ /**
502
+ * Handles Shift+Click on an AI message bubble.
503
+ * Dumps a live snapshot of in-memory streaming and agent-run state to the browser
504
+ * console so engineers can debug stuck/forever-spinning conversations without
505
+ * needing to add any temporary code.
506
+ *
507
+ * Usage: Hold Shift and click any AI message bubble. Open DevTools Console to see the dump.
508
+ */
509
+ onDiagnosticRequested(messageId: string): void;
484
510
  onTestFeedbackMessage(message: MJConversationDetailEntity): void;
511
+ onTestFeedbackDialogClosed(result: TestFeedbackDialogResult): void;
485
512
  onTaskClicked(task: MJTaskEntity): void;
486
513
  onNavigateToConversation(event: {
487
514
  conversationId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-chat-area.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/conversation/conversation-chat-area.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conversation-chat-area.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/conversation/conversation-chat-area.component.ts"],"names":[],"mappings":"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"}