@memberjunction/conversations-runtime 6.2.0-edge.0 → 6.2.0-edge.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ConversationsRuntime.d.ts +27 -0
- package/dist/ConversationsRuntime.d.ts.map +1 -1
- package/dist/ConversationsRuntime.js +36 -0
- package/dist/ConversationsRuntime.js.map +1 -1
- package/dist/agent-runner/ConversationAgentRunner.d.ts +27 -1
- package/dist/agent-runner/ConversationAgentRunner.d.ts.map +1 -1
- package/dist/agent-runner/ConversationAgentRunner.js +26 -3
- package/dist/agent-runner/ConversationAgentRunner.js.map +1 -1
- package/dist/default-agent/DefaultAgentResolver.d.ts +2 -0
- package/dist/default-agent/DefaultAgentResolver.d.ts.map +1 -1
- package/dist/default-agent/DefaultAgentResolver.js +5 -1
- package/dist/default-agent/DefaultAgentResolver.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/mentions/MentionAutocomplete.d.ts +29 -2
- package/dist/mentions/MentionAutocomplete.d.ts.map +1 -1
- package/dist/mentions/MentionAutocomplete.js +80 -41
- package/dist/mentions/MentionAutocomplete.js.map +1 -1
- package/dist/mentions/MentionParser.d.ts +10 -0
- package/dist/mentions/MentionParser.d.ts.map +1 -1
- package/dist/mentions/MentionParser.js +25 -5
- package/dist/mentions/MentionParser.js.map +1 -1
- package/dist/mentions/MentionSuggestion.d.ts +26 -0
- package/dist/mentions/MentionSuggestion.d.ts.map +1 -1
- package/dist/streaming/ConversationLiveness.d.ts +93 -0
- package/dist/streaming/ConversationLiveness.d.ts.map +1 -0
- package/dist/streaming/ConversationLiveness.js +126 -0
- package/dist/streaming/ConversationLiveness.js.map +1 -0
- package/dist/streaming/ConversationStreaming.d.ts +94 -1
- package/dist/streaming/ConversationStreaming.d.ts.map +1 -1
- package/dist/streaming/ConversationStreaming.js +221 -17
- package/dist/streaming/ConversationStreaming.js.map +1 -1
- package/dist/streaming/ConversationTail.d.ts +38 -0
- package/dist/streaming/ConversationTail.d.ts.map +1 -0
- package/dist/streaming/ConversationTail.js +93 -0
- package/dist/streaming/ConversationTail.js.map +1 -0
- package/dist/timeline/RealtimeSessionTimeline.d.ts +71 -3
- package/dist/timeline/RealtimeSessionTimeline.d.ts.map +1 -1
- package/dist/timeline/RealtimeSessionTimeline.js +123 -9
- package/dist/timeline/RealtimeSessionTimeline.js.map +1 -1
- package/package.json +8 -8
|
@@ -16,10 +16,29 @@
|
|
|
16
16
|
*/
|
|
17
17
|
import { BehaviorSubject, Subject } from 'rxjs';
|
|
18
18
|
import { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';
|
|
19
|
+
import { NormalizeUUID } from '@memberjunction/global';
|
|
19
20
|
/** How long late-arrival completion events remain replayable. */
|
|
20
21
|
const RECENT_COMPLETION_TTL_MS = 5 * 60 * 1000;
|
|
21
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* How long a run's or message's last-heard time is kept. Cleared on completion; this only bounds
|
|
24
|
+
* entries whose completion never arrived. Longer than any silence the UI still reports on.
|
|
25
|
+
*/
|
|
26
|
+
const RUN_ACTIVITY_TTL_MS = 15 * 60 * 1000;
|
|
27
|
+
/** The `type` the server's liveness pulse carries. It names a run but has no progress text. */
|
|
28
|
+
const HEARTBEAT_MESSAGE_TYPE = 'Heartbeat';
|
|
29
|
+
/** Base reconnection delay after a subscription error or completion. Doubles per attempt. */
|
|
22
30
|
const RECONNECTION_DELAY_MS = 5_000;
|
|
31
|
+
/**
|
|
32
|
+
* Ceiling on the backoff, and the only bound on the retry rate. Retries never stop, so a
|
|
33
|
+
* permanently unreachable server settles at one attempt per minute per tab rather than the
|
|
34
|
+
* every-5s storm an uncapped base delay would produce.
|
|
35
|
+
*/
|
|
36
|
+
const MAX_RECONNECTION_DELAY_MS = 60_000;
|
|
37
|
+
/**
|
|
38
|
+
* Up to this fraction is taken off each reconnection delay at random, so tabs that lost the same
|
|
39
|
+
* server do not all retry at the same moment. Only ever subtracted: the ceiling stays a ceiling.
|
|
40
|
+
*/
|
|
41
|
+
const RECONNECTION_JITTER_RATIO = 0.2;
|
|
23
42
|
/**
|
|
24
43
|
* Global streaming service that manages PubSub subscriptions for all conversations.
|
|
25
44
|
*
|
|
@@ -30,6 +49,10 @@ const RECONNECTION_DELAY_MS = 5_000;
|
|
|
30
49
|
* Usually accessed via `ConversationsRuntime.Instance.Streaming`.
|
|
31
50
|
*/
|
|
32
51
|
export class ConversationStreaming {
|
|
52
|
+
/** @deprecated Use {@link CompletionEvents$}. */
|
|
53
|
+
get completionEvents$() {
|
|
54
|
+
return this.CompletionEvents$;
|
|
55
|
+
}
|
|
33
56
|
/**
|
|
34
57
|
* @param context Runtime context providing live access to the registered
|
|
35
58
|
* {@link IActiveTaskTracker}. Read on every event dispatch so adapter swaps
|
|
@@ -49,27 +72,51 @@ export class ConversationStreaming {
|
|
|
49
72
|
*/
|
|
50
73
|
this.streamingAccumulator = new Map();
|
|
51
74
|
this.recentCompletions = new Map();
|
|
75
|
+
/** Browser time (ms) of the last frame received for each agent run, keyed by normalized run ID. */
|
|
76
|
+
this.lastHeardAtByRunId = new Map();
|
|
77
|
+
/** Browser time (ms) of the last frame that named each message, keyed by normalized detail ID. */
|
|
78
|
+
this.lastHeardAtByDetailId = new Map();
|
|
52
79
|
this.connectionStatus$ = new BehaviorSubject('disconnected');
|
|
53
80
|
this.initialized = false;
|
|
81
|
+
/** Consecutive failed reconnects; drives the backoff. */
|
|
82
|
+
this.reconnectionAttempts = 0;
|
|
83
|
+
/** True while recovering from a drop, so a successful re-subscribe can be told from first boot. */
|
|
84
|
+
this.reconnecting = false;
|
|
85
|
+
/**
|
|
86
|
+
* Fires when the push-status subscription is re-established after having dropped — never on
|
|
87
|
+
* the first successful subscribe.
|
|
88
|
+
*
|
|
89
|
+
* Events published while the subscription was down are gone: the server's topic is an
|
|
90
|
+
* in-memory `PubSub` with no replay, and the client's `Subject` is explicitly unbuffered.
|
|
91
|
+
* A listener must therefore reconcile against durable state rather than assume the stream
|
|
92
|
+
* resumed seamlessly. Consumed by `ConversationLiveness` (MJ #4222).
|
|
93
|
+
*/
|
|
94
|
+
this.StreamReconnected$ = new Subject();
|
|
54
95
|
/**
|
|
55
96
|
* Observable for components to subscribe to completion events in real-time.
|
|
56
97
|
* Emits enriched completion data once per agent finish.
|
|
57
98
|
*/
|
|
58
|
-
this.
|
|
99
|
+
this.CompletionEvents$ = new Subject();
|
|
59
100
|
}
|
|
60
101
|
/**
|
|
61
102
|
* Initialize the global PubSub subscription. Idempotent — safe to call multiple
|
|
62
103
|
* times. Should be called once at app startup (e.g., the Angular widget calls
|
|
63
104
|
* this when the workspace mounts).
|
|
64
105
|
*/
|
|
65
|
-
|
|
106
|
+
Initialize() {
|
|
66
107
|
if (this.initialized) {
|
|
67
108
|
return;
|
|
68
109
|
}
|
|
69
110
|
try {
|
|
70
111
|
const dataProvider = GraphQLDataProvider.Instance;
|
|
112
|
+
this.watchSocketAcknowledgement(dataProvider);
|
|
71
113
|
this.pushStatusSubscription = dataProvider.PushStatusUpdates().subscribe({
|
|
72
114
|
next: (status) => {
|
|
115
|
+
// First frame on a new subscription is the only proof the transport actually
|
|
116
|
+
// works. Subscribing succeeds against a dead socket — graphql-ws accepts the
|
|
117
|
+
// request and returns an iterator that never yields — so this, not
|
|
118
|
+
// Initialize() returning, is what clears the backoff.
|
|
119
|
+
this.noteStreamAlive();
|
|
73
120
|
void this.handlePushStatusUpdate(status);
|
|
74
121
|
},
|
|
75
122
|
error: (error) => {
|
|
@@ -84,6 +131,18 @@ export class ConversationStreaming {
|
|
|
84
131
|
});
|
|
85
132
|
this.initialized = true;
|
|
86
133
|
this.connectionStatus$.next('connected');
|
|
134
|
+
if (this.reconnecting) {
|
|
135
|
+
// Ask for a reconcile: whatever the server published during the gap was dropped,
|
|
136
|
+
// and reconciliation reads durable state over HTTP, so it is worth doing even if
|
|
137
|
+
// this subscription turns out to be dead too.
|
|
138
|
+
//
|
|
139
|
+
// `reconnectionAttempts` is deliberately NOT cleared here. Re-subscribing proves
|
|
140
|
+
// nothing — the call returns normally against a black-holed socket — so clearing it
|
|
141
|
+
// here would reset the counter every cycle and pin the delay at its base value.
|
|
142
|
+
// Only a delivered frame clears it; see noteStreamAlive().
|
|
143
|
+
this.reconnecting = false;
|
|
144
|
+
this.StreamReconnected$.next();
|
|
145
|
+
}
|
|
87
146
|
}
|
|
88
147
|
catch (error) {
|
|
89
148
|
console.error('[ConversationStreaming] Failed to initialize:', error);
|
|
@@ -91,28 +150,44 @@ export class ConversationStreaming {
|
|
|
91
150
|
this.scheduleReconnection();
|
|
92
151
|
}
|
|
93
152
|
}
|
|
153
|
+
/** @deprecated Use {@link Initialize}. */
|
|
154
|
+
initialize() {
|
|
155
|
+
return this.Initialize();
|
|
156
|
+
}
|
|
94
157
|
/** Current connection status as an observable. */
|
|
95
|
-
|
|
158
|
+
GetConnectionStatus$() {
|
|
96
159
|
return this.connectionStatus$.asObservable();
|
|
97
160
|
}
|
|
161
|
+
/** @deprecated Use {@link GetConnectionStatus$}. */
|
|
162
|
+
getConnectionStatus$() {
|
|
163
|
+
return this.GetConnectionStatus$();
|
|
164
|
+
}
|
|
98
165
|
/** Current connection status value (synchronous). */
|
|
99
|
-
|
|
166
|
+
GetConnectionStatus() {
|
|
100
167
|
return this.connectionStatus$.value;
|
|
101
168
|
}
|
|
169
|
+
/** @deprecated Use {@link GetConnectionStatus}. */
|
|
170
|
+
getConnectionStatus() {
|
|
171
|
+
return this.GetConnectionStatus();
|
|
172
|
+
}
|
|
102
173
|
/**
|
|
103
174
|
* Register a callback for a specific conversation detail (message). The callback
|
|
104
175
|
* is invoked whenever progress updates arrive for that message.
|
|
105
176
|
*/
|
|
106
|
-
|
|
177
|
+
RegisterMessageCallback(conversationDetailId, callback) {
|
|
107
178
|
const existing = this.callbackRegistry.get(conversationDetailId) ?? [];
|
|
108
179
|
existing.push(callback);
|
|
109
180
|
this.callbackRegistry.set(conversationDetailId, existing);
|
|
110
181
|
}
|
|
182
|
+
/** @deprecated Use {@link RegisterMessageCallback}. */
|
|
183
|
+
registerMessageCallback(conversationDetailId, callback) {
|
|
184
|
+
return this.RegisterMessageCallback(conversationDetailId, callback);
|
|
185
|
+
}
|
|
111
186
|
/**
|
|
112
187
|
* Unregister a callback for a specific conversation detail. When `callback` is
|
|
113
188
|
* omitted, ALL callbacks for that message are removed.
|
|
114
189
|
*/
|
|
115
|
-
|
|
190
|
+
UnregisterMessageCallback(conversationDetailId, callback) {
|
|
116
191
|
if (callback) {
|
|
117
192
|
const existing = this.callbackRegistry.get(conversationDetailId) ?? [];
|
|
118
193
|
const filtered = existing.filter((cb) => cb !== callback);
|
|
@@ -127,35 +202,78 @@ export class ConversationStreaming {
|
|
|
127
202
|
this.callbackRegistry.delete(conversationDetailId);
|
|
128
203
|
}
|
|
129
204
|
}
|
|
205
|
+
/** @deprecated Use {@link UnregisterMessageCallback}. */
|
|
206
|
+
unregisterMessageCallback(conversationDetailId, callback) {
|
|
207
|
+
return this.UnregisterMessageCallback(conversationDetailId, callback);
|
|
208
|
+
}
|
|
130
209
|
/** Total number of registered callbacks (diagnostic). */
|
|
131
|
-
|
|
210
|
+
GetRegisteredCallbackCount() {
|
|
132
211
|
let count = 0;
|
|
133
212
|
for (const callbacks of this.callbackRegistry.values()) {
|
|
134
213
|
count += callbacks.length;
|
|
135
214
|
}
|
|
136
215
|
return count;
|
|
137
216
|
}
|
|
217
|
+
/** @deprecated Use {@link GetRegisteredCallbackCount}. */
|
|
218
|
+
getRegisteredCallbackCount() {
|
|
219
|
+
return this.GetRegisteredCallbackCount();
|
|
220
|
+
}
|
|
138
221
|
/** Number of distinct messages currently being tracked (diagnostic). */
|
|
139
|
-
|
|
222
|
+
GetTrackedMessageCount() {
|
|
140
223
|
return this.callbackRegistry.size;
|
|
141
224
|
}
|
|
225
|
+
/** @deprecated Use {@link GetTrackedMessageCount}. */
|
|
226
|
+
getTrackedMessageCount() {
|
|
227
|
+
return this.GetTrackedMessageCount();
|
|
228
|
+
}
|
|
142
229
|
/**
|
|
143
230
|
* Replay a recently completed event so a late-mounting component can pick it up.
|
|
144
231
|
* Returns `undefined` if no completion is in the 5-minute replay window.
|
|
145
232
|
*/
|
|
146
|
-
|
|
233
|
+
GetRecentCompletion(conversationDetailId) {
|
|
147
234
|
const completion = this.recentCompletions.get(conversationDetailId);
|
|
148
235
|
return completion ? { agentRunId: completion.agentRunId } : undefined;
|
|
149
236
|
}
|
|
237
|
+
/** @deprecated Use {@link GetRecentCompletion}. */
|
|
238
|
+
getRecentCompletion(conversationDetailId) {
|
|
239
|
+
return this.GetRecentCompletion(conversationDetailId);
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Browser time (ms since epoch) at which the last push frame for this agent run arrived:
|
|
243
|
+
* progress, streamed content, or the server's liveness pulse.
|
|
244
|
+
*
|
|
245
|
+
* This is the reliable "still running" signal. The run object inside progress frames is the
|
|
246
|
+
* server's in-memory entity, whose timestamps do not move until the run ends.
|
|
247
|
+
*
|
|
248
|
+
* @returns `undefined` when nothing has been heard for the run, or it has completed.
|
|
249
|
+
*/
|
|
250
|
+
LastHeardFromRun(agentRunId) {
|
|
251
|
+
return this.lastHeardAtByRunId.get(NormalizeUUID(agentRunId));
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Browser time (ms since epoch) at which the last push frame that names this message arrived.
|
|
255
|
+
*
|
|
256
|
+
* Covers a row with no MJ agent run to look up, such as one written by a host's own turn
|
|
257
|
+
* handler that reports progress through the same publisher.
|
|
258
|
+
*
|
|
259
|
+
* @returns `undefined` when nothing has named the message, or it has completed.
|
|
260
|
+
*/
|
|
261
|
+
LastHeardForMessage(conversationDetailId) {
|
|
262
|
+
return this.lastHeardAtByDetailId.get(NormalizeUUID(conversationDetailId));
|
|
263
|
+
}
|
|
150
264
|
/** Clear a recent completion after the late-mounting component has handled it. */
|
|
151
|
-
|
|
265
|
+
ClearRecentCompletion(conversationDetailId) {
|
|
152
266
|
this.recentCompletions.delete(conversationDetailId);
|
|
153
267
|
}
|
|
268
|
+
/** @deprecated Use {@link ClearRecentCompletion}. */
|
|
269
|
+
clearRecentCompletion(conversationDetailId) {
|
|
270
|
+
return this.ClearRecentCompletion(conversationDetailId);
|
|
271
|
+
}
|
|
154
272
|
/**
|
|
155
273
|
* Diagnostic snapshot for a specific message — used by debugging tools to dump
|
|
156
274
|
* live in-memory state.
|
|
157
275
|
*/
|
|
158
|
-
|
|
276
|
+
GetDiagnosticSnapshot(messageId) {
|
|
159
277
|
const callbacks = this.callbackRegistry.get(messageId);
|
|
160
278
|
return {
|
|
161
279
|
hasCallbacks: !!callbacks && callbacks.length > 0,
|
|
@@ -164,6 +282,10 @@ export class ConversationStreaming {
|
|
|
164
282
|
connectionStatus: this.connectionStatus$.getValue(),
|
|
165
283
|
};
|
|
166
284
|
}
|
|
285
|
+
/** @deprecated Use {@link GetDiagnosticSnapshot}. */
|
|
286
|
+
getDiagnosticSnapshot(messageId) {
|
|
287
|
+
return this.GetDiagnosticSnapshot(messageId);
|
|
288
|
+
}
|
|
167
289
|
/**
|
|
168
290
|
* Tear down subscriptions and clear state. Call at app shutdown or in tests
|
|
169
291
|
* between cases.
|
|
@@ -177,10 +299,14 @@ export class ConversationStreaming {
|
|
|
177
299
|
this.pushStatusSubscription.unsubscribe();
|
|
178
300
|
this.pushStatusSubscription = undefined;
|
|
179
301
|
}
|
|
302
|
+
this.socketStateSubscription?.unsubscribe();
|
|
303
|
+
this.socketStateSubscription = undefined;
|
|
180
304
|
this.callbackRegistry.clear();
|
|
181
305
|
this.recentCompletions.clear();
|
|
182
306
|
this.streamingAccumulator.clear();
|
|
183
|
-
this.
|
|
307
|
+
this.lastHeardAtByRunId.clear();
|
|
308
|
+
this.lastHeardAtByDetailId.clear();
|
|
309
|
+
this.CompletionEvents$.complete();
|
|
184
310
|
this.connectionStatus$.complete();
|
|
185
311
|
this.initialized = false;
|
|
186
312
|
}
|
|
@@ -202,9 +328,15 @@ export class ConversationStreaming {
|
|
|
202
328
|
? JSON.parse(status)
|
|
203
329
|
: status;
|
|
204
330
|
if (statusObj.resolver === 'TaskOrchestrator') {
|
|
331
|
+
this.noteActivity(statusObj);
|
|
205
332
|
await this.routeTaskProgress(statusObj);
|
|
206
333
|
}
|
|
207
334
|
else if (statusObj.resolver === 'RunAIAgentResolver') {
|
|
335
|
+
this.noteActivity(statusObj);
|
|
336
|
+
if (statusObj.type === HEARTBEAT_MESSAGE_TYPE) {
|
|
337
|
+
// A pulse only proves the run is alive; it has nothing to route.
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
208
340
|
await this.routeAgentProgress(statusObj);
|
|
209
341
|
}
|
|
210
342
|
}
|
|
@@ -291,7 +423,7 @@ export class ConversationStreaming {
|
|
|
291
423
|
agentRunId,
|
|
292
424
|
timestamp: new Date(),
|
|
293
425
|
});
|
|
294
|
-
this.
|
|
426
|
+
this.CompletionEvents$.next({
|
|
295
427
|
conversationDetailId,
|
|
296
428
|
agentRunId,
|
|
297
429
|
success,
|
|
@@ -406,6 +538,31 @@ export class ConversationStreaming {
|
|
|
406
538
|
}
|
|
407
539
|
}
|
|
408
540
|
}
|
|
541
|
+
/**
|
|
542
|
+
* Record evidence that the transport is genuinely alive: a delivered frame, or the server's
|
|
543
|
+
* connection acknowledgement. Clears the reconnection backoff so the next outage starts from
|
|
544
|
+
* scratch. A bare re-subscribe is not evidence; it succeeds against a dead socket.
|
|
545
|
+
*/
|
|
546
|
+
noteStreamAlive() {
|
|
547
|
+
if (this.reconnectionAttempts !== 0) {
|
|
548
|
+
this.reconnectionAttempts = 0;
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
/**
|
|
552
|
+
* Clear the backoff whenever the socket reports `connected`. That state follows the server's
|
|
553
|
+
* connection acknowledgement, a real round trip, so a quiet but healthy stream does not start
|
|
554
|
+
* its next outage at the ceiling. Subscribes once for the life of the service.
|
|
555
|
+
*/
|
|
556
|
+
watchSocketAcknowledgement(dataProvider) {
|
|
557
|
+
if (this.socketStateSubscription || !dataProvider.SocketConnectivity$) {
|
|
558
|
+
return;
|
|
559
|
+
}
|
|
560
|
+
this.socketStateSubscription = dataProvider.SocketConnectivity$.subscribe((state) => {
|
|
561
|
+
if (state === 'connected') {
|
|
562
|
+
this.noteStreamAlive();
|
|
563
|
+
}
|
|
564
|
+
});
|
|
565
|
+
}
|
|
409
566
|
/** Schedule a reconnection attempt after a connection error or completion. */
|
|
410
567
|
scheduleReconnection() {
|
|
411
568
|
if (this.reconnectionTimeout) {
|
|
@@ -417,12 +574,19 @@ export class ConversationStreaming {
|
|
|
417
574
|
// flow still delivers the correct final message), which also keeps
|
|
418
575
|
// abandoned entries from lingering for the session.
|
|
419
576
|
this.streamingAccumulator.clear();
|
|
577
|
+
// Exponential backoff with a ceiling, retried for as long as the page lives. Recovery has
|
|
578
|
+
// to be autonomous: no host calls Initialize() outside ngOnInit, so a stream that stopped
|
|
579
|
+
// retrying would stay stopped until a reload.
|
|
580
|
+
const capped = Math.min(RECONNECTION_DELAY_MS * 2 ** this.reconnectionAttempts, MAX_RECONNECTION_DELAY_MS);
|
|
581
|
+
const delay = capped - Math.random() * capped * RECONNECTION_JITTER_RATIO;
|
|
582
|
+
this.reconnectionAttempts++;
|
|
583
|
+
this.reconnecting = true;
|
|
420
584
|
this.connectionStatus$.next('reconnecting');
|
|
421
585
|
this.reconnectionTimeout = setTimeout(() => {
|
|
422
|
-
console.log(
|
|
586
|
+
console.log(`[ConversationStreaming] Attempting to reconnect (attempt ${this.reconnectionAttempts})...`);
|
|
423
587
|
this.initialized = false;
|
|
424
|
-
this.
|
|
425
|
-
},
|
|
588
|
+
this.Initialize();
|
|
589
|
+
}, delay);
|
|
426
590
|
}
|
|
427
591
|
/** Evict completions older than the replay window to bound memory. */
|
|
428
592
|
cleanupOldCompletions() {
|
|
@@ -432,6 +596,46 @@ export class ConversationStreaming {
|
|
|
432
596
|
this.recentCompletions.delete(id);
|
|
433
597
|
}
|
|
434
598
|
}
|
|
599
|
+
const activityCutoff = Date.now() - RUN_ACTIVITY_TTL_MS;
|
|
600
|
+
for (const map of [this.lastHeardAtByRunId, this.lastHeardAtByDetailId]) {
|
|
601
|
+
for (const [id, heardAt] of map) {
|
|
602
|
+
if (heardAt < activityCutoff) {
|
|
603
|
+
map.delete(id);
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
/**
|
|
609
|
+
* Record that a frame naming an agent run or a message arrived, or forget both when the frame
|
|
610
|
+
* completes them.
|
|
611
|
+
*
|
|
612
|
+
* Progress, streaming and completion frames name the run as `data.agentRunId`; the liveness
|
|
613
|
+
* pulse names it as `data.runId`. The message is `data.conversationDetailId`, or the
|
|
614
|
+
* `ConversationDetailID` of the run a progress frame carries.
|
|
615
|
+
*/
|
|
616
|
+
noteActivity(statusObj) {
|
|
617
|
+
const data = statusObj.data;
|
|
618
|
+
if (!data) {
|
|
619
|
+
return;
|
|
620
|
+
}
|
|
621
|
+
const agentRun = data.agentRun;
|
|
622
|
+
const rawRunId = (data.agentRunId ?? data.runId);
|
|
623
|
+
const rawDetailId = (data.conversationDetailId ?? agentRun?.ConversationDetailID);
|
|
624
|
+
const isComplete = data.type === 'complete';
|
|
625
|
+
const record = (map, rawId) => {
|
|
626
|
+
if (!rawId || rawId === 'unknown') {
|
|
627
|
+
return;
|
|
628
|
+
}
|
|
629
|
+
const id = NormalizeUUID(rawId);
|
|
630
|
+
if (isComplete) {
|
|
631
|
+
map.delete(id);
|
|
632
|
+
}
|
|
633
|
+
else {
|
|
634
|
+
map.set(id, Date.now());
|
|
635
|
+
}
|
|
636
|
+
};
|
|
637
|
+
record(this.lastHeardAtByRunId, rawRunId);
|
|
638
|
+
record(this.lastHeardAtByDetailId, rawDetailId);
|
|
435
639
|
}
|
|
436
640
|
}
|
|
437
641
|
//# sourceMappingURL=ConversationStreaming.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationStreaming.js","sourceRoot":"","sources":["../../src/streaming/ConversationStreaming.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ConversationStreaming.js","sourceRoot":"","sources":["../../src/streaming/ConversationStreaming.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ConversationTailResult } from '@memberjunction/graphql-dataprovider';
|
|
2
|
+
export type { ConversationTailResult };
|
|
3
|
+
/**
|
|
4
|
+
* Tracks a read cursor per conversation detail and tails durable run events from it.
|
|
5
|
+
*
|
|
6
|
+
* Usually reached via `ConversationsRuntime.Instance.Tail`.
|
|
7
|
+
*/
|
|
8
|
+
export declare class ConversationTail {
|
|
9
|
+
/** conversationDetailId → highest `Seq` already delivered to this client. */
|
|
10
|
+
private cursors;
|
|
11
|
+
private client?;
|
|
12
|
+
/**
|
|
13
|
+
* Read everything that has landed for a message since the last call.
|
|
14
|
+
*
|
|
15
|
+
* The cursor advances only on a successful read, so a failed call costs a repeat rather than a
|
|
16
|
+
* gap. Never throws — this is the recovery path, and a recovery path that throws takes down the
|
|
17
|
+
* reconciliation that called it.
|
|
18
|
+
*
|
|
19
|
+
* @param conversationDetailId The message to tail.
|
|
20
|
+
*/
|
|
21
|
+
Tail(conversationDetailId: string): Promise<ConversationTailResult>;
|
|
22
|
+
/** Highest sequence delivered for a message so far. 0 when nothing has been read. */
|
|
23
|
+
CursorFor(conversationDetailId: string): number;
|
|
24
|
+
/**
|
|
25
|
+
* Drop a message's cursor. Call when a message reaches a terminal state, so the map does not
|
|
26
|
+
* grow without bound across a long session.
|
|
27
|
+
*/
|
|
28
|
+
Forget(conversationDetailId: string): void;
|
|
29
|
+
/** Drop every cursor. */
|
|
30
|
+
Reset(): void;
|
|
31
|
+
/**
|
|
32
|
+
* Resolved on first use rather than in the constructor: the runtime singleton can be touched
|
|
33
|
+
* before the data provider is configured, and a client bound to a provider that did not exist
|
|
34
|
+
* yet would be permanently useless.
|
|
35
|
+
*/
|
|
36
|
+
private getClient;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=ConversationTail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConversationTail.d.ts","sourceRoot":"","sources":["../../src/streaming/ConversationTail.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAEnF,YAAY,EAAE,sBAAsB,EAAE,CAAC;AAEvC;;;;GAIG;AACH,qBAAa,gBAAgB;IACzB,6EAA6E;IAC7E,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,MAAM,CAAC,CAA4B;IAE3C;;;;;;;;OAQG;IACU,IAAI,CAAC,oBAAoB,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAqBhF,qFAAqF;IAC9E,SAAS,CAAC,oBAAoB,EAAE,MAAM,GAAG,MAAM;IAItD;;;OAGG;IACI,MAAM,CAAC,oBAAoB,EAAE,MAAM,GAAG,IAAI;IAIjD,yBAAyB;IAClB,KAAK,IAAI,IAAI;IAIpB;;;;OAIG;IACH,OAAO,CAAC,SAAS;CAepB"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Durable, resumable read of agent-run progress, with per-message cursors (MJ #4222).
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS. Push is the only delivery path a conversation has, and it has no replay. The
|
|
5
|
+
* server topic is an in-memory `graphql-subscriptions` PubSub and the client subject is explicitly
|
|
6
|
+
* unbuffered, so an event published while the socket was half-open is simply gone. Tier 0 makes the
|
|
7
|
+
* dead socket close and Tier 1 gives recovery its own triggers, but both still leave the client
|
|
8
|
+
* re-reading whole rows to guess what it missed. This class closes the loop: the client keeps the
|
|
9
|
+
* highest sequence it has seen per message and re-reads from exactly there.
|
|
10
|
+
*
|
|
11
|
+
* Runs over plain HTTP, deliberately. The recovery case is "the WebSocket is dead and may stay
|
|
12
|
+
* dead", so the repair path must not need the WebSocket.
|
|
13
|
+
*
|
|
14
|
+
* CURSORS ARE HELD HERE, NOT IN THE COMPONENT. An Angular component is destroyed and rebuilt on
|
|
15
|
+
* every conversation switch; a cursor that died with it would replay the whole run on return.
|
|
16
|
+
*/
|
|
17
|
+
import { GraphQLConversationClient, GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';
|
|
18
|
+
/**
|
|
19
|
+
* Tracks a read cursor per conversation detail and tails durable run events from it.
|
|
20
|
+
*
|
|
21
|
+
* Usually reached via `ConversationsRuntime.Instance.Tail`.
|
|
22
|
+
*/
|
|
23
|
+
export class ConversationTail {
|
|
24
|
+
constructor() {
|
|
25
|
+
/** conversationDetailId → highest `Seq` already delivered to this client. */
|
|
26
|
+
this.cursors = new Map();
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Read everything that has landed for a message since the last call.
|
|
30
|
+
*
|
|
31
|
+
* The cursor advances only on a successful read, so a failed call costs a repeat rather than a
|
|
32
|
+
* gap. Never throws — this is the recovery path, and a recovery path that throws takes down the
|
|
33
|
+
* reconciliation that called it.
|
|
34
|
+
*
|
|
35
|
+
* @param conversationDetailId The message to tail.
|
|
36
|
+
*/
|
|
37
|
+
async Tail(conversationDetailId) {
|
|
38
|
+
const since = this.cursors.get(conversationDetailId) ?? 0;
|
|
39
|
+
const client = this.getClient();
|
|
40
|
+
if (!client) {
|
|
41
|
+
return {
|
|
42
|
+
Success: false,
|
|
43
|
+
Message: 'No data provider available',
|
|
44
|
+
Events: [],
|
|
45
|
+
LatestSeq: since,
|
|
46
|
+
// Unknown is treated as still running — see GraphQLConversationClient.
|
|
47
|
+
IsInFlight: true
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const result = await client.TailConversationEvents(conversationDetailId, since);
|
|
51
|
+
if (result.Success && result.LatestSeq > since) {
|
|
52
|
+
this.cursors.set(conversationDetailId, result.LatestSeq);
|
|
53
|
+
}
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
/** Highest sequence delivered for a message so far. 0 when nothing has been read. */
|
|
57
|
+
CursorFor(conversationDetailId) {
|
|
58
|
+
return this.cursors.get(conversationDetailId) ?? 0;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Drop a message's cursor. Call when a message reaches a terminal state, so the map does not
|
|
62
|
+
* grow without bound across a long session.
|
|
63
|
+
*/
|
|
64
|
+
Forget(conversationDetailId) {
|
|
65
|
+
this.cursors.delete(conversationDetailId);
|
|
66
|
+
}
|
|
67
|
+
/** Drop every cursor. */
|
|
68
|
+
Reset() {
|
|
69
|
+
this.cursors.clear();
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Resolved on first use rather than in the constructor: the runtime singleton can be touched
|
|
73
|
+
* before the data provider is configured, and a client bound to a provider that did not exist
|
|
74
|
+
* yet would be permanently useless.
|
|
75
|
+
*/
|
|
76
|
+
getClient() {
|
|
77
|
+
if (this.client) {
|
|
78
|
+
return this.client;
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
const provider = GraphQLDataProvider.Instance;
|
|
82
|
+
if (!provider) {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
this.client = new GraphQLConversationClient(provider);
|
|
86
|
+
return this.client;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=ConversationTail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConversationTail.js","sourceRoot":"","sources":["../../src/streaming/ConversationTail.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAKtG;;;;GAIG;AACH,MAAM,OAAO,gBAAgB;IAA7B;QACI,6EAA6E;QACrE,YAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAuEhD,CAAC;IApEG;;;;;;;;OAQG;IACI,KAAK,CAAC,IAAI,CAAC,oBAA4B;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,4BAA4B;gBACrC,MAAM,EAAE,EAAE;gBACV,SAAS,EAAE,KAAK;gBAChB,uEAAuE;gBACvE,UAAU,EAAE,IAAI;aACnB,CAAC;QACN,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;QAChF,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,SAAS,GAAG,KAAK,EAAE,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,qFAAqF;IAC9E,SAAS,CAAC,oBAA4B;QACzC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,oBAA4B;QACtC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC9C,CAAC;IAED,yBAAyB;IAClB,KAAK;QACR,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACK,SAAS;QACb,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,OAAO,IAAI,CAAC,MAAM,CAAC;QACvB,CAAC;QACD,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC;YAC9C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACZ,OAAO,SAAS,CAAC;YACrB,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,IAAI,yBAAyB,CAAC,QAAQ,CAAC,CAAC;YACtD,OAAO,IAAI,CAAC,MAAM,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,SAAS,CAAC;QACrB,CAAC;IACL,CAAC;CACJ"}
|