@memberjunction/conversations-runtime 6.2.0-edge.1 → 6.2.0-edge.3

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.
@@ -31,6 +31,8 @@ import { ConversationBridge } from './bridge/ConversationBridge.js';
31
31
  import { DefaultAgentResolver } from './default-agent/DefaultAgentResolver.js';
32
32
  import { SessionsObserver } from './sessions/SessionsObserver.js';
33
33
  import { ConversationStreaming } from './streaming/ConversationStreaming.js';
34
+ import { ConversationLiveness } from './streaming/ConversationLiveness.js';
35
+ import { ConversationTail } from './streaming/ConversationTail.js';
34
36
  import { ConversationAgentRunner } from './agent-runner/ConversationAgentRunner.js';
35
37
  import { INotificationAdapter } from './adapters/INotificationAdapter.js';
36
38
  import { IActiveTaskTracker } from './adapters/IActiveTaskTracker.js';
@@ -126,6 +128,8 @@ export declare class ConversationsRuntime extends BaseEngine<ConversationsRuntim
126
128
  private readonly _defaultAgent;
127
129
  private readonly _sessions;
128
130
  private _streaming?;
131
+ private _liveness?;
132
+ private _tail?;
129
133
  private _agentRunner?;
130
134
  /** Mention parser — pure string logic. See {@link MentionParser}. */
131
135
  get Mentions(): MentionParser;
@@ -166,6 +170,29 @@ export declare class ConversationsRuntime extends BaseEngine<ConversationsRuntim
166
170
  * Hosts must call `.initialize()` once after `Config()` to open the subscription.
167
171
  */
168
172
  get Streaming(): ConversationStreaming;
173
+ /**
174
+ * Liveness supervisor — emits when client state may have fallen behind the server and a
175
+ * reconciliation against durable state is needed. See {@link ConversationLiveness}.
176
+ *
177
+ * Wired to {@link Streaming} so a stream re-subscribe counts as a reconciliation trigger
178
+ * alongside the socket-level one. Hosts additionally feed it DOM events (`visibilitychange`,
179
+ * `online`), which this package cannot observe itself because it is documented as
180
+ * Node-consumable.
181
+ *
182
+ * Initialized on every access, not only the first. An access that comes before the data
183
+ * provider exists cannot attach the socket signal, and a later access attaches it. Once
184
+ * attached, `Initialize` returns at once.
185
+ */
186
+ get Liveness(): ConversationLiveness;
187
+ /**
188
+ * Durable tail over agent-run progress, with a read cursor per message. See
189
+ * {@link ConversationTail}.
190
+ *
191
+ * The counterpart to {@link Streaming}: the subscription is the fast path, this is the one that
192
+ * survives a dropped frame. Cursors live on the runtime, not on a component, so switching
193
+ * conversations does not replay a run from the start.
194
+ */
195
+ get Tail(): ConversationTail;
169
196
  /**
170
197
  * Agent-run orchestrator — wraps `AgentClientSession.RunAgentFromConversationDetail`
171
198
  * with default-agent resolution and permission-filtered candidate lists. See
@@ -1 +1 @@
1
- {"version":3,"file":"ConversationsRuntime.d.ts","sourceRoot":"","sources":["../src/ConversationsRuntime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ConversationsRuntime.d.ts","sourceRoot":"","sources":["../src/ConversationsRuntime.ts"],"names":[],"mappings":"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"}
@@ -39,6 +39,8 @@ import { ConversationBridge } from './bridge/ConversationBridge.js';
39
39
  import { DefaultAgentResolver } from './default-agent/DefaultAgentResolver.js';
40
40
  import { SessionsObserver } from './sessions/SessionsObserver.js';
41
41
  import { ConversationStreaming } from './streaming/ConversationStreaming.js';
42
+ import { ConversationLiveness } from './streaming/ConversationLiveness.js';
43
+ import { ConversationTail } from './streaming/ConversationTail.js';
42
44
  import { ConversationAgentRunner } from './agent-runner/ConversationAgentRunner.js';
43
45
  import { ConsoleNotificationAdapter, } from './adapters/INotificationAdapter.js';
44
46
  import { NoOpActiveTaskTracker, } from './adapters/IActiveTaskTracker.js';
@@ -209,6 +211,40 @@ let ConversationsRuntime = class ConversationsRuntime extends BaseEngine {
209
211
  }
210
212
  return this._streaming;
211
213
  }
214
+ /**
215
+ * Liveness supervisor — emits when client state may have fallen behind the server and a
216
+ * reconciliation against durable state is needed. See {@link ConversationLiveness}.
217
+ *
218
+ * Wired to {@link Streaming} so a stream re-subscribe counts as a reconciliation trigger
219
+ * alongside the socket-level one. Hosts additionally feed it DOM events (`visibilitychange`,
220
+ * `online`), which this package cannot observe itself because it is documented as
221
+ * Node-consumable.
222
+ *
223
+ * Initialized on every access, not only the first. An access that comes before the data
224
+ * provider exists cannot attach the socket signal, and a later access attaches it. Once
225
+ * attached, `Initialize` returns at once.
226
+ */
227
+ get Liveness() {
228
+ if (!this._liveness) {
229
+ this._liveness = new ConversationLiveness();
230
+ }
231
+ this._liveness.Initialize(this.Streaming.StreamReconnected$);
232
+ return this._liveness;
233
+ }
234
+ /**
235
+ * Durable tail over agent-run progress, with a read cursor per message. See
236
+ * {@link ConversationTail}.
237
+ *
238
+ * The counterpart to {@link Streaming}: the subscription is the fast path, this is the one that
239
+ * survives a dropped frame. Cursors live on the runtime, not on a component, so switching
240
+ * conversations does not replay a run from the start.
241
+ */
242
+ get Tail() {
243
+ if (!this._tail) {
244
+ this._tail = new ConversationTail();
245
+ }
246
+ return this._tail;
247
+ }
212
248
  /**
213
249
  * Agent-run orchestrator — wraps `AgentClientSession.RunAgentFromConversationDetail`
214
250
  * with default-agent resolution and permission-filtered candidate lists. See
@@ -1 +1 @@
1
- {"version":3,"file":"ConversationsRuntime.js","sourceRoot":"","sources":["../src/ConversationsRuntime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ConversationsRuntime.js","sourceRoot":"","sources":["../src/ConversationsRuntime.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -17,6 +17,8 @@ export { ConversationBridge, type ConversationSwitchEvent, type ConversationDeep
17
17
  export { DefaultAgentResolver, type DefaultAgentResolveOptions, } from './default-agent/DefaultAgentResolver.js';
18
18
  export { SessionsObserver, type SessionLifecycleEvent, type SessionChannelState, type SessionEndReason, } from './sessions/SessionsObserver.js';
19
19
  export { ConversationStreaming, type CompletionEvent, type MessageProgressUpdate, type MessageProgressMetadata, type MessageProgressCallback, type StreamingConnectionStatus, } from './streaming/ConversationStreaming.js';
20
+ export { ConversationLiveness, RECONCILE_THROTTLE_MS, type ReconciliationReason, } from './streaming/ConversationLiveness.js';
21
+ export { ConversationTail, type ConversationTailResult, } from './streaming/ConversationTail.js';
20
22
  export { ConversationAgentRunner, type ProcessMessageInput, } from './agent-runner/ConversationAgentRunner.js';
21
23
  export { type INotificationAdapter, type NotificationLevel, ConsoleNotificationAdapter, } from './adapters/INotificationAdapter.js';
22
24
  export { type IActiveTaskTracker, NoOpActiveTaskTracker, } from './adapters/IActiveTaskTracker.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D,OAAO,EAAE,aAAa,EAAE,KAAK,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtI,OAAO,EACH,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EACtB,4BAA4B,EAC5B,wBAAwB,EACxB,yBAAyB,EACzB,4BAA4B,EAC5B,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,GACpC,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACH,kBAAkB,EAClB,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,GAC5B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACH,oBAAoB,EACpB,KAAK,0BAA0B,GAClC,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACH,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,GACxB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACH,qBAAqB,EACrB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,GACjC,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACH,uBAAuB,EACvB,KAAK,mBAAmB,GAC3B,MAAM,wCAAwC,CAAC;AAGhD,OAAO,EACH,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,0BAA0B,GAC7B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACH,KAAK,kBAAkB,EACvB,qBAAqB,GACxB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACH,KAAK,gBAAgB,EACrB,mBAAmB,GACtB,MAAM,6BAA6B,CAAC;AAIrC,YAAY,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAC;AAM3F,OAAO,EACH,kBAAkB,EAClB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,GACzB,MAAM,iCAAiC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D,OAAO,EAAE,aAAa,EAAE,KAAK,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtI,OAAO,EACH,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EACtB,4BAA4B,EAC5B,wBAAwB,EACxB,yBAAyB,EACzB,4BAA4B,EAC5B,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,GACpC,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACH,kBAAkB,EAClB,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,GAC5B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACH,oBAAoB,EACpB,KAAK,0BAA0B,GAClC,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACH,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,GACxB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACH,qBAAqB,EACrB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,GACjC,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACH,oBAAoB,EACpB,qBAAqB,EACrB,KAAK,oBAAoB,GAC5B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACH,gBAAgB,EAChB,KAAK,sBAAsB,GAC9B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACH,uBAAuB,EACvB,KAAK,mBAAmB,GAC3B,MAAM,wCAAwC,CAAC;AAGhD,OAAO,EACH,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,0BAA0B,GAC7B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACH,KAAK,kBAAkB,EACvB,qBAAqB,GACxB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACH,KAAK,gBAAgB,EACrB,mBAAmB,GACtB,MAAM,6BAA6B,CAAC;AAIrC,YAAY,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAC;AAM3F,OAAO,EACH,kBAAkB,EAClB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,GACzB,MAAM,iCAAiC,CAAC"}
package/dist/index.js CHANGED
@@ -18,6 +18,8 @@ export { ConversationBridge, } from './bridge/ConversationBridge.js';
18
18
  export { DefaultAgentResolver, } from './default-agent/DefaultAgentResolver.js';
19
19
  export { SessionsObserver, } from './sessions/SessionsObserver.js';
20
20
  export { ConversationStreaming, } from './streaming/ConversationStreaming.js';
21
+ export { ConversationLiveness, RECONCILE_THROTTLE_MS, } from './streaming/ConversationLiveness.js';
22
+ export { ConversationTail, } from './streaming/ConversationTail.js';
21
23
  export { ConversationAgentRunner, } from './agent-runner/ConversationAgentRunner.js';
22
24
  // Adapter interfaces + defaults
23
25
  export { ConsoleNotificationAdapter, } from './adapters/INotificationAdapter.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,8BAA8B;AAC9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,wCAAwC;AACxC,OAAO,EAAE,aAAa,EAAyC,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EACH,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EACtB,4BAA4B,EAC5B,wBAAwB,EACxB,yBAAyB,EACzB,4BAA4B,EAC5B,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,GAOnB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACH,kBAAkB,GAGrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACH,oBAAoB,GAEvB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACH,gBAAgB,GAInB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACH,qBAAqB,GAMxB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACH,uBAAuB,GAE1B,MAAM,wCAAwC,CAAC;AAEhD,gCAAgC;AAChC,OAAO,EAGH,0BAA0B,GAC7B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAEH,qBAAqB,GACxB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAEH,mBAAmB,GACtB,MAAM,6BAA6B,CAAC;AAMrC,qFAAqF;AACrF,wFAAwF;AACxF,qFAAqF;AACrF,iEAAiE;AACjE,OAAO,EACH,kBAAkB,GAGrB,MAAM,iCAAiC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,8BAA8B;AAC9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,wCAAwC;AACxC,OAAO,EAAE,aAAa,EAAyC,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EACH,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EACtB,4BAA4B,EAC5B,wBAAwB,EACxB,yBAAyB,EACzB,4BAA4B,EAC5B,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,GAOnB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACH,kBAAkB,GAGrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACH,oBAAoB,GAEvB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACH,gBAAgB,GAInB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACH,qBAAqB,GAMxB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACH,oBAAoB,EACpB,qBAAqB,GAExB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACH,gBAAgB,GAEnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACH,uBAAuB,GAE1B,MAAM,wCAAwC,CAAC;AAEhD,gCAAgC;AAChC,OAAO,EAGH,0BAA0B,GAC7B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAEH,qBAAqB,GACxB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAEH,mBAAmB,GACtB,MAAM,6BAA6B,CAAC;AAMrC,qFAAqF;AACrF,wFAAwF;AACxF,qFAAqF;AACrF,iEAAiE;AACjE,OAAO,EACH,kBAAkB,GAGrB,MAAM,iCAAiC,CAAC"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * @fileoverview Liveness supervisor — decides when client state may have fallen behind the
3
+ * server and a reconciliation against durable state is required (MJ #4222).
4
+ *
5
+ * WHY THIS EXISTS. The conversations stack had five recovery mechanisms — graphql-ws's
6
+ * `retryAttempts`, `GraphQLDataProvider._socketStateSubject`, Explorer's
7
+ * `ServerConnectivityService`, `ConversationStreaming.scheduleReconnection()` and
8
+ * `FireAndForgetHelper.onStreamEnd` — and every one of them is triggered by the WebSocket
9
+ * `closed` event. The failure they all needed to catch is precisely the one where the socket
10
+ * NEVER closes, so they failed together. That is not defence in depth; it is one layer drawn
11
+ * five times.
12
+ *
13
+ * This class is the independent trigger. It aggregates signals that do NOT depend on a clean
14
+ * close — a socket retry, a stream re-subscribe, a tab regaining focus, the browser coming back
15
+ * online — and emits a single coalesced "go re-read the truth" event.
16
+ *
17
+ * WHY L0 (this package) AND NOT THE ANGULAR LAYER. `ServerConnectivityService` already does
18
+ * something similar, but it lives in `@memberjunction/ng-explorer-core`, and
19
+ * `@memberjunction/ng-conversations` declares `"mjUILayer": "widgets"`, which
20
+ * `packages/Standards/src/checks/ui-layers.ts` forbids from importing any `ng-explorer*`
21
+ * package at severity `error`. This package already depends on `@memberjunction/graphql-dataprovider`
22
+ * and has no Angular dependency, so it is the layer-legal home — and it serves headless consumers
23
+ * (Node workers, CLI tools, test harnesses) for free.
24
+ *
25
+ * DOM EVENTS ARE DELIBERATELY NOT HANDLED HERE. This package is documented as Node-consumable,
26
+ * so `document`/`window` are not assumed to exist. The Angular host translates those events into
27
+ * {@link ConversationLiveness.NotifyTabVisible} / {@link ConversationLiveness.NotifyBrowserOnline}.
28
+ */
29
+ import { Observable } from 'rxjs';
30
+ /** What prompted a reconciliation. Carried through for logging and for test assertions. */
31
+ export type ReconciliationReason =
32
+ /** The WebSocket dropped and came back. Anything published while it was down is gone. */
33
+ 'socket-reconnected'
34
+ /** The push-status subscription was torn down and re-established. */
35
+ | 'stream-reconnected'
36
+ /** The tab regained focus after being hidden. */
37
+ | 'tab-visible'
38
+ /** The browser reported the network came back. A hint only — never proof. */
39
+ | 'browser-online'
40
+ /** A message's progress pill has heard nothing about its run for a while. */
41
+ | 'message-liveness';
42
+ /**
43
+ * Coalescing window. Closing a laptop lid and reopening it produces a socket reconnect, a stream
44
+ * re-init, a `visibilitychange` and an `online` within roughly a second of each other. Downstream
45
+ * reconciliation is idempotent but expensive (a `RunView` plus, per repaired message, a window
46
+ * refresh and an artifact rebuild), so collapse the storm into one pass.
47
+ *
48
+ * Leading-edge, NOT trailing: recovery is user-visible and should start immediately rather than
49
+ * waiting out the window. Subsequent triggers inside the window are absorbed.
50
+ */
51
+ export declare const RECONCILE_THROTTLE_MS = 500;
52
+ /**
53
+ * Emits when something suggests the client may have missed server events and should re-read
54
+ * authoritative state.
55
+ *
56
+ * Usually reached via `ConversationsRuntime.Instance.Liveness`. Call {@link Initialize} once after
57
+ * the data provider exists; hosts translate DOM events in via the `Notify*` methods.
58
+ */
59
+ export declare class ConversationLiveness {
60
+ private readonly triggers$;
61
+ private subscriptions;
62
+ private initialized;
63
+ private streamWired;
64
+ /**
65
+ * Fires when client state may be stale. Already coalesced — subscribe and reconcile.
66
+ *
67
+ * Deliberately does NOT replay: a late subscriber must not be handed a reconciliation
68
+ * request for an outage that was already resolved.
69
+ */
70
+ readonly ReconciliationRequired$: Observable<ReconciliationReason>;
71
+ /**
72
+ * Wire up the transport-level signals. Idempotent.
73
+ *
74
+ * @param streamReconnected$ Optional stream-level reconnect signal, supplied by
75
+ * {@link ConversationStreaming}. Passed in rather than imported so this class stays
76
+ * independent of the streaming implementation and is trivially testable.
77
+ */
78
+ Initialize(streamReconnected$?: Observable<void>): void;
79
+ /** The tab became visible again. Called by the host's `visibilitychange` handler. */
80
+ NotifyTabVisible(): void;
81
+ /**
82
+ * The browser reported it is back online. Called by the host's `online` handler.
83
+ *
84
+ * `navigator.onLine` only describes the link layer — it reads true behind a captive portal
85
+ * or a dead VPN — so this is a reason to re-check, never evidence that anything is reachable.
86
+ */
87
+ NotifyBrowserOnline(): void;
88
+ /** Raise a reconciliation request directly. Exposed for hosts with their own signals. */
89
+ Trigger(reason: ReconciliationReason): void;
90
+ /** Tear down transport subscriptions. Safe to call more than once. */
91
+ Dispose(): void;
92
+ }
93
+ //# sourceMappingURL=ConversationLiveness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConversationLiveness.d.ts","sourceRoot":"","sources":["../../src/streaming/ConversationLiveness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,EAAE,UAAU,EAAuC,MAAM,MAAM,CAAC;AAGvE,2FAA2F;AAC3F,MAAM,MAAM,oBAAoB;AAC5B,yFAAyF;AACvF,oBAAoB;AACtB,qEAAqE;GACnE,oBAAoB;AACtB,iDAAiD;GAC/C,aAAa;AACf,6EAA6E;GAC3E,gBAAgB;AAClB,6EAA6E;GAC3E,kBAAkB,CAAC;AAEzB;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC;;;;;;GAMG;AACH,qBAAa,oBAAoB;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuC;IACjE,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;IAE5B;;;;;OAKG;IACH,SAAgB,uBAAuB,EAAE,UAAU,CAAC,oBAAoB,CAAC,CAEvE;IAEF;;;;;;OAMG;IACI,UAAU,CAAC,kBAAkB,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI;IAqC9D,qFAAqF;IAC9E,gBAAgB,IAAI,IAAI;IAI/B;;;;;OAKG;IACI,mBAAmB,IAAI,IAAI;IAIlC,yFAAyF;IAClF,OAAO,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI;IAIlD,sEAAsE;IAC/D,OAAO,IAAI,IAAI;CAMzB"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * @fileoverview Liveness supervisor — decides when client state may have fallen behind the
3
+ * server and a reconciliation against durable state is required (MJ #4222).
4
+ *
5
+ * WHY THIS EXISTS. The conversations stack had five recovery mechanisms — graphql-ws's
6
+ * `retryAttempts`, `GraphQLDataProvider._socketStateSubject`, Explorer's
7
+ * `ServerConnectivityService`, `ConversationStreaming.scheduleReconnection()` and
8
+ * `FireAndForgetHelper.onStreamEnd` — and every one of them is triggered by the WebSocket
9
+ * `closed` event. The failure they all needed to catch is precisely the one where the socket
10
+ * NEVER closes, so they failed together. That is not defence in depth; it is one layer drawn
11
+ * five times.
12
+ *
13
+ * This class is the independent trigger. It aggregates signals that do NOT depend on a clean
14
+ * close — a socket retry, a stream re-subscribe, a tab regaining focus, the browser coming back
15
+ * online — and emits a single coalesced "go re-read the truth" event.
16
+ *
17
+ * WHY L0 (this package) AND NOT THE ANGULAR LAYER. `ServerConnectivityService` already does
18
+ * something similar, but it lives in `@memberjunction/ng-explorer-core`, and
19
+ * `@memberjunction/ng-conversations` declares `"mjUILayer": "widgets"`, which
20
+ * `packages/Standards/src/checks/ui-layers.ts` forbids from importing any `ng-explorer*`
21
+ * package at severity `error`. This package already depends on `@memberjunction/graphql-dataprovider`
22
+ * and has no Angular dependency, so it is the layer-legal home — and it serves headless consumers
23
+ * (Node workers, CLI tools, test harnesses) for free.
24
+ *
25
+ * DOM EVENTS ARE DELIBERATELY NOT HANDLED HERE. This package is documented as Node-consumable,
26
+ * so `document`/`window` are not assumed to exist. The Angular host translates those events into
27
+ * {@link ConversationLiveness.NotifyTabVisible} / {@link ConversationLiveness.NotifyBrowserOnline}.
28
+ */
29
+ import { Subject, Subscription, throttleTime } from 'rxjs';
30
+ import { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';
31
+ /**
32
+ * Coalescing window. Closing a laptop lid and reopening it produces a socket reconnect, a stream
33
+ * re-init, a `visibilitychange` and an `online` within roughly a second of each other. Downstream
34
+ * reconciliation is idempotent but expensive (a `RunView` plus, per repaired message, a window
35
+ * refresh and an artifact rebuild), so collapse the storm into one pass.
36
+ *
37
+ * Leading-edge, NOT trailing: recovery is user-visible and should start immediately rather than
38
+ * waiting out the window. Subsequent triggers inside the window are absorbed.
39
+ */
40
+ export const RECONCILE_THROTTLE_MS = 500;
41
+ /**
42
+ * Emits when something suggests the client may have missed server events and should re-read
43
+ * authoritative state.
44
+ *
45
+ * Usually reached via `ConversationsRuntime.Instance.Liveness`. Call {@link Initialize} once after
46
+ * the data provider exists; hosts translate DOM events in via the `Notify*` methods.
47
+ */
48
+ export class ConversationLiveness {
49
+ constructor() {
50
+ this.triggers$ = new Subject();
51
+ this.subscriptions = new Subscription();
52
+ this.initialized = false;
53
+ this.streamWired = false;
54
+ /**
55
+ * Fires when client state may be stale. Already coalesced — subscribe and reconcile.
56
+ *
57
+ * Deliberately does NOT replay: a late subscriber must not be handed a reconciliation
58
+ * request for an outage that was already resolved.
59
+ */
60
+ this.ReconciliationRequired$ = this.triggers$.pipe(throttleTime(RECONCILE_THROTTLE_MS, undefined, { leading: true, trailing: false }));
61
+ }
62
+ /**
63
+ * Wire up the transport-level signals. Idempotent.
64
+ *
65
+ * @param streamReconnected$ Optional stream-level reconnect signal, supplied by
66
+ * {@link ConversationStreaming}. Passed in rather than imported so this class stays
67
+ * independent of the streaming implementation and is trivially testable.
68
+ */
69
+ Initialize(streamReconnected$) {
70
+ if (this.initialized) {
71
+ return;
72
+ }
73
+ let socketWired = false;
74
+ try {
75
+ // `Instance` returns undefined rather than throwing when the provider is not yet
76
+ // constructed, so a missing provider is a falsy value here, not a caught error.
77
+ const provider = GraphQLDataProvider.Instance;
78
+ if (provider) {
79
+ // `SocketReconnected$` fires on `wasRetry`, which is the only trustworthy
80
+ // reconnect indicator: graphql-ws restores subscriptions transparently, so the
81
+ // RxJS stream may never error and the socket state may never pass through
82
+ // 'disconnected'.
83
+ this.subscriptions.add(provider.SocketReconnected$.subscribe(() => this.Trigger('socket-reconnected')));
84
+ socketWired = true;
85
+ }
86
+ }
87
+ catch (error) {
88
+ // A provider that is not yet constructed is not a failure — the DOM-level and
89
+ // stream-level triggers still work, and the socket signal is retried below.
90
+ console.warn('[ConversationLiveness] Socket signal unavailable:', error);
91
+ }
92
+ // Wired at most once, because the retry path below can bring execution back here.
93
+ if (streamReconnected$ && !this.streamWired) {
94
+ this.subscriptions.add(streamReconnected$.subscribe(() => this.Trigger('stream-reconnected')));
95
+ this.streamWired = true;
96
+ }
97
+ // Complete only once the socket signal is attached. Marking initialized without it would
98
+ // early-return every later call and leave that signal unwired for the life of the page.
99
+ this.initialized = socketWired;
100
+ }
101
+ /** The tab became visible again. Called by the host's `visibilitychange` handler. */
102
+ NotifyTabVisible() {
103
+ this.Trigger('tab-visible');
104
+ }
105
+ /**
106
+ * The browser reported it is back online. Called by the host's `online` handler.
107
+ *
108
+ * `navigator.onLine` only describes the link layer — it reads true behind a captive portal
109
+ * or a dead VPN — so this is a reason to re-check, never evidence that anything is reachable.
110
+ */
111
+ NotifyBrowserOnline() {
112
+ this.Trigger('browser-online');
113
+ }
114
+ /** Raise a reconciliation request directly. Exposed for hosts with their own signals. */
115
+ Trigger(reason) {
116
+ this.triggers$.next(reason);
117
+ }
118
+ /** Tear down transport subscriptions. Safe to call more than once. */
119
+ Dispose() {
120
+ this.subscriptions.unsubscribe();
121
+ this.subscriptions = new Subscription();
122
+ this.initialized = false;
123
+ this.streamWired = false;
124
+ }
125
+ }
126
+ //# sourceMappingURL=ConversationLiveness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConversationLiveness.js","sourceRoot":"","sources":["../../src/streaming/ConversationLiveness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,EAAc,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAe3E;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAEzC;;;;;;GAMG;AACH,MAAM,OAAO,oBAAoB;IAAjC;QACqB,cAAS,GAAG,IAAI,OAAO,EAAwB,CAAC;QACzD,kBAAa,GAAG,IAAI,YAAY,EAAE,CAAC;QACnC,gBAAW,GAAG,KAAK,CAAC;QACpB,gBAAW,GAAG,KAAK,CAAC;QAE5B;;;;;WAKG;QACa,4BAAuB,GAAqC,IAAI,CAAC,SAAS,CAAC,IAAI,CAC3F,YAAY,CAAC,qBAAqB,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CACrF,CAAC;IAyEN,CAAC;IAvEG;;;;;;OAMG;IACI,UAAU,CAAC,kBAAqC;QACnD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO;QACX,CAAC;QAED,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC;YACD,iFAAiF;YACjF,gFAAgF;YAChF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC;YAC9C,IAAI,QAAQ,EAAE,CAAC;gBACX,0EAA0E;gBAC1E,+EAA+E;gBAC/E,0EAA0E;gBAC1E,kBAAkB;gBAClB,IAAI,CAAC,aAAa,CAAC,GAAG,CAClB,QAAQ,CAAC,kBAAkB,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAClF,CAAC;gBACF,WAAW,GAAG,IAAI,CAAC;YACvB,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,8EAA8E;YAC9E,4EAA4E;YAC5E,OAAO,CAAC,IAAI,CAAC,mDAAmD,EAAE,KAAK,CAAC,CAAC;QAC7E,CAAC;QAED,kFAAkF;QAClF,IAAI,kBAAkB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,kBAAkB,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;YAC/F,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC5B,CAAC;QAED,yFAAyF;QACzF,wFAAwF;QACxF,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACnC,CAAC;IAED,qFAAqF;IAC9E,gBAAgB;QACnB,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAChC,CAAC;IAED;;;;;OAKG;IACI,mBAAmB;QACtB,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACnC,CAAC;IAED,yFAAyF;IAClF,OAAO,CAAC,MAA4B;QACvC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,sEAAsE;IAC/D,OAAO;QACV,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;QACjC,IAAI,CAAC,aAAa,GAAG,IAAI,YAAY,EAAE,CAAC;QACxC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC7B,CAAC;CACJ"}
@@ -91,6 +91,8 @@ export type StreamingConnectionStatus = 'connected' | 'disconnected' | 'error' |
91
91
  export declare class ConversationStreaming {
92
92
  private readonly context;
93
93
  private pushStatusSubscription?;
94
+ /** Watches the socket for a server acknowledgement, which clears the backoff. */
95
+ private socketStateSubscription?;
94
96
  private readonly callbackRegistry;
95
97
  /**
96
98
  * Per-message accumulation of streamed final-response deltas, keyed by
@@ -103,9 +105,27 @@ export declare class ConversationStreaming {
103
105
  */
104
106
  private readonly streamingAccumulator;
105
107
  private readonly recentCompletions;
108
+ /** Browser time (ms) of the last frame received for each agent run, keyed by normalized run ID. */
109
+ private readonly lastHeardAtByRunId;
110
+ /** Browser time (ms) of the last frame that named each message, keyed by normalized detail ID. */
111
+ private readonly lastHeardAtByDetailId;
106
112
  private readonly connectionStatus$;
107
113
  private initialized;
108
114
  private reconnectionTimeout?;
115
+ /** Consecutive failed reconnects; drives the backoff. */
116
+ private reconnectionAttempts;
117
+ /** True while recovering from a drop, so a successful re-subscribe can be told from first boot. */
118
+ private reconnecting;
119
+ /**
120
+ * Fires when the push-status subscription is re-established after having dropped — never on
121
+ * the first successful subscribe.
122
+ *
123
+ * Events published while the subscription was down are gone: the server's topic is an
124
+ * in-memory `PubSub` with no replay, and the client's `Subject` is explicitly unbuffered.
125
+ * A listener must therefore reconcile against durable state rather than assume the stream
126
+ * resumed seamlessly. Consumed by `ConversationLiveness` (MJ #4222).
127
+ */
128
+ readonly StreamReconnected$: Subject<void>;
109
129
  /**
110
130
  * Observable for components to subscribe to completion events in real-time.
111
131
  * Emits enriched completion data once per agent finish.
@@ -168,6 +188,25 @@ export declare class ConversationStreaming {
168
188
  getRecentCompletion(conversationDetailId: string): {
169
189
  agentRunId: string;
170
190
  } | undefined;
191
+ /**
192
+ * Browser time (ms since epoch) at which the last push frame for this agent run arrived:
193
+ * progress, streamed content, or the server's liveness pulse.
194
+ *
195
+ * This is the reliable "still running" signal. The run object inside progress frames is the
196
+ * server's in-memory entity, whose timestamps do not move until the run ends.
197
+ *
198
+ * @returns `undefined` when nothing has been heard for the run, or it has completed.
199
+ */
200
+ LastHeardFromRun(agentRunId: string): number | undefined;
201
+ /**
202
+ * Browser time (ms since epoch) at which the last push frame that names this message arrived.
203
+ *
204
+ * Covers a row with no MJ agent run to look up, such as one written by a host's own turn
205
+ * handler that reports progress through the same publisher.
206
+ *
207
+ * @returns `undefined` when nothing has named the message, or it has completed.
208
+ */
209
+ LastHeardForMessage(conversationDetailId: string): number | undefined;
171
210
  /** Clear a recent completion after the late-mounting component has handled it. */
172
211
  ClearRecentCompletion(conversationDetailId: string): void;
173
212
  /** @deprecated Use {@link ClearRecentCompletion}. */
@@ -232,9 +271,30 @@ export declare class ConversationStreaming {
232
271
  private routeStreamingContent;
233
272
  /** Invoke every callback registered for `conversationDetailId`, swallowing per-callback errors. */
234
273
  private dispatchCallbacks;
274
+ /**
275
+ * Record evidence that the transport is genuinely alive: a delivered frame, or the server's
276
+ * connection acknowledgement. Clears the reconnection backoff so the next outage starts from
277
+ * scratch. A bare re-subscribe is not evidence; it succeeds against a dead socket.
278
+ */
279
+ private noteStreamAlive;
280
+ /**
281
+ * Clear the backoff whenever the socket reports `connected`. That state follows the server's
282
+ * connection acknowledgement, a real round trip, so a quiet but healthy stream does not start
283
+ * its next outage at the ceiling. Subscribes once for the life of the service.
284
+ */
285
+ private watchSocketAcknowledgement;
235
286
  /** Schedule a reconnection attempt after a connection error or completion. */
236
287
  private scheduleReconnection;
237
288
  /** Evict completions older than the replay window to bound memory. */
238
289
  private cleanupOldCompletions;
290
+ /**
291
+ * Record that a frame naming an agent run or a message arrived, or forget both when the frame
292
+ * completes them.
293
+ *
294
+ * Progress, streaming and completion frames name the run as `data.agentRunId`; the liveness
295
+ * pulse names it as `data.runId`. The message is `data.conversationDetailId`, or the
296
+ * `ConversationDetailID` of the run a progress frame carries.
297
+ */
298
+ private noteActivity;
239
299
  }
240
300
  //# sourceMappingURL=ConversationStreaming.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConversationStreaming.d.ts","sourceRoot":"","sources":["../../src/streaming/ConversationStreaming.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ConversationStreaming.d.ts","sourceRoot":"","sources":["../../src/streaming/ConversationStreaming.ts"],"names":[],"mappings":"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"}
@@ -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
- /** Reconnection delay after a subscription error or completion. */
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
  *
@@ -53,8 +72,26 @@ export class ConversationStreaming {
53
72
  */
54
73
  this.streamingAccumulator = new Map();
55
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();
56
79
  this.connectionStatus$ = new BehaviorSubject('disconnected');
57
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();
58
95
  /**
59
96
  * Observable for components to subscribe to completion events in real-time.
60
97
  * Emits enriched completion data once per agent finish.
@@ -72,8 +109,14 @@ export class ConversationStreaming {
72
109
  }
73
110
  try {
74
111
  const dataProvider = GraphQLDataProvider.Instance;
112
+ this.watchSocketAcknowledgement(dataProvider);
75
113
  this.pushStatusSubscription = dataProvider.PushStatusUpdates().subscribe({
76
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();
77
120
  void this.handlePushStatusUpdate(status);
78
121
  },
79
122
  error: (error) => {
@@ -88,6 +131,18 @@ export class ConversationStreaming {
88
131
  });
89
132
  this.initialized = true;
90
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
+ }
91
146
  }
92
147
  catch (error) {
93
148
  console.error('[ConversationStreaming] Failed to initialize:', error);
@@ -183,6 +238,29 @@ export class ConversationStreaming {
183
238
  getRecentCompletion(conversationDetailId) {
184
239
  return this.GetRecentCompletion(conversationDetailId);
185
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
+ }
186
264
  /** Clear a recent completion after the late-mounting component has handled it. */
187
265
  ClearRecentCompletion(conversationDetailId) {
188
266
  this.recentCompletions.delete(conversationDetailId);
@@ -221,9 +299,13 @@ export class ConversationStreaming {
221
299
  this.pushStatusSubscription.unsubscribe();
222
300
  this.pushStatusSubscription = undefined;
223
301
  }
302
+ this.socketStateSubscription?.unsubscribe();
303
+ this.socketStateSubscription = undefined;
224
304
  this.callbackRegistry.clear();
225
305
  this.recentCompletions.clear();
226
306
  this.streamingAccumulator.clear();
307
+ this.lastHeardAtByRunId.clear();
308
+ this.lastHeardAtByDetailId.clear();
227
309
  this.CompletionEvents$.complete();
228
310
  this.connectionStatus$.complete();
229
311
  this.initialized = false;
@@ -246,9 +328,15 @@ export class ConversationStreaming {
246
328
  ? JSON.parse(status)
247
329
  : status;
248
330
  if (statusObj.resolver === 'TaskOrchestrator') {
331
+ this.noteActivity(statusObj);
249
332
  await this.routeTaskProgress(statusObj);
250
333
  }
251
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
+ }
252
340
  await this.routeAgentProgress(statusObj);
253
341
  }
254
342
  }
@@ -450,6 +538,31 @@ export class ConversationStreaming {
450
538
  }
451
539
  }
452
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
+ }
453
566
  /** Schedule a reconnection attempt after a connection error or completion. */
454
567
  scheduleReconnection() {
455
568
  if (this.reconnectionTimeout) {
@@ -461,12 +574,19 @@ export class ConversationStreaming {
461
574
  // flow still delivers the correct final message), which also keeps
462
575
  // abandoned entries from lingering for the session.
463
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;
464
584
  this.connectionStatus$.next('reconnecting');
465
585
  this.reconnectionTimeout = setTimeout(() => {
466
- console.log('[ConversationStreaming] Attempting to reconnect...');
586
+ console.log(`[ConversationStreaming] Attempting to reconnect (attempt ${this.reconnectionAttempts})...`);
467
587
  this.initialized = false;
468
588
  this.Initialize();
469
- }, RECONNECTION_DELAY_MS);
589
+ }, delay);
470
590
  }
471
591
  /** Evict completions older than the replay window to bound memory. */
472
592
  cleanupOldCompletions() {
@@ -476,6 +596,46 @@ export class ConversationStreaming {
476
596
  this.recentCompletions.delete(id);
477
597
  }
478
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);
479
639
  }
480
640
  }
481
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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@memberjunction/conversations-runtime",
3
3
  "type": "module",
4
- "version": "6.2.0-edge.1",
4
+ "version": "6.2.0-edge.3",
5
5
  "description": "MemberJunction: Framework-agnostic Conversations Runtime — orchestration, mention parsing, overlay/workspace bridge, default-agent resolution, client-tool registry, sessions observability. Pure TypeScript, zero UX dependencies. Consumable from browser (Angular widget, React, Vue, etc.) or server (Node workers, CLI tools, test harnesses).",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -11,13 +11,13 @@
11
11
  "author": "MemberJunction.com",
12
12
  "license": "BUSL-1.1",
13
13
  "dependencies": {
14
- "@memberjunction/ai-agent-client": "6.2.0-edge.1",
15
- "@memberjunction/ai-core-plus": "6.2.0-edge.1",
16
- "@memberjunction/ai-engine-base": "6.2.0-edge.1",
17
- "@memberjunction/core": "6.2.0-edge.1",
18
- "@memberjunction/core-entities": "6.2.0-edge.1",
19
- "@memberjunction/global": "6.2.0-edge.1",
20
- "@memberjunction/graphql-dataprovider": "6.2.0-edge.1",
14
+ "@memberjunction/ai-agent-client": "6.2.0-edge.3",
15
+ "@memberjunction/ai-core-plus": "6.2.0-edge.3",
16
+ "@memberjunction/ai-engine-base": "6.2.0-edge.3",
17
+ "@memberjunction/core": "6.2.0-edge.3",
18
+ "@memberjunction/core-entities": "6.2.0-edge.3",
19
+ "@memberjunction/global": "6.2.0-edge.3",
20
+ "@memberjunction/graphql-dataprovider": "6.2.0-edge.3",
21
21
  "rxjs": "^7.8.2"
22
22
  },
23
23
  "devDependencies": {