@memberjunction/conversations-runtime 0.0.1 → 5.42.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 (50) hide show
  1. package/README.md +99 -43
  2. package/dist/ConversationsRuntime.d.ts +193 -0
  3. package/dist/ConversationsRuntime.d.ts.map +1 -0
  4. package/dist/ConversationsRuntime.js +268 -0
  5. package/dist/ConversationsRuntime.js.map +1 -0
  6. package/dist/adapters/IActiveTaskTracker.d.ts +49 -0
  7. package/dist/adapters/IActiveTaskTracker.d.ts.map +1 -0
  8. package/dist/adapters/IActiveTaskTracker.js +26 -0
  9. package/dist/adapters/IActiveTaskTracker.js.map +1 -0
  10. package/dist/adapters/INotificationAdapter.d.ts +60 -0
  11. package/dist/adapters/INotificationAdapter.d.ts.map +1 -0
  12. package/dist/adapters/INotificationAdapter.js +45 -0
  13. package/dist/adapters/INotificationAdapter.js.map +1 -0
  14. package/dist/adapters/ISessionsAdapter.d.ts +124 -0
  15. package/dist/adapters/ISessionsAdapter.d.ts.map +1 -0
  16. package/dist/adapters/ISessionsAdapter.js +44 -0
  17. package/dist/adapters/ISessionsAdapter.js.map +1 -0
  18. package/dist/agent-runner/ConversationAgentRunner.d.ts +121 -0
  19. package/dist/agent-runner/ConversationAgentRunner.d.ts.map +1 -0
  20. package/dist/agent-runner/ConversationAgentRunner.js +191 -0
  21. package/dist/agent-runner/ConversationAgentRunner.js.map +1 -0
  22. package/dist/bridge/ConversationBridge.d.ts +93 -0
  23. package/dist/bridge/ConversationBridge.d.ts.map +1 -0
  24. package/dist/bridge/ConversationBridge.js +105 -0
  25. package/dist/bridge/ConversationBridge.js.map +1 -0
  26. package/dist/context/IConversationsRuntimeContext.d.ts +29 -0
  27. package/dist/context/IConversationsRuntimeContext.d.ts.map +1 -0
  28. package/dist/context/IConversationsRuntimeContext.js +21 -0
  29. package/dist/context/IConversationsRuntimeContext.js.map +1 -0
  30. package/dist/default-agent/DefaultAgentResolver.d.ts +87 -0
  31. package/dist/default-agent/DefaultAgentResolver.d.ts.map +1 -0
  32. package/dist/default-agent/DefaultAgentResolver.js +103 -0
  33. package/dist/default-agent/DefaultAgentResolver.js.map +1 -0
  34. package/dist/index.d.ts +22 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +28 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/mentions/MentionParser.d.ts +109 -0
  39. package/dist/mentions/MentionParser.d.ts.map +1 -0
  40. package/dist/mentions/MentionParser.js +276 -0
  41. package/dist/mentions/MentionParser.js.map +1 -0
  42. package/dist/sessions/SessionsObserver.d.ts +87 -0
  43. package/dist/sessions/SessionsObserver.d.ts.map +1 -0
  44. package/dist/sessions/SessionsObserver.js +103 -0
  45. package/dist/sessions/SessionsObserver.js.map +1 -0
  46. package/dist/streaming/ConversationStreaming.d.ts +169 -0
  47. package/dist/streaming/ConversationStreaming.d.ts.map +1 -0
  48. package/dist/streaming/ConversationStreaming.js +355 -0
  49. package/dist/streaming/ConversationStreaming.js.map +1 -0
  50. package/package.json +33 -7
@@ -0,0 +1,355 @@
1
+ /**
2
+ * @fileoverview Pure-TypeScript streaming layer for conversation progress + completion.
3
+ *
4
+ * Ported from `@memberjunction/ng-conversations/src/lib/services/conversation-streaming.service.ts`.
5
+ * The original was largely framework-agnostic — the `@Injectable()` decorator was the only
6
+ * Angular dep, and `OnDestroy` was its only Angular lifecycle hook. We strip both, replace
7
+ * `OnDestroy` with an explicit `Dispose()` method, and route `removeByAgentRunId` calls
8
+ * through the {@link IActiveTaskTracker} adapter instead of Angular DI.
9
+ *
10
+ * Maintains a single PubSub subscription to `GraphQLDataProvider.PushStatusUpdates()` and
11
+ * routes progress + completion events to registered per-message callbacks. Handles late-
12
+ * arrival replay (5-min window) so a component that mounts after an agent run finished can
13
+ * still see the completion.
14
+ *
15
+ * @module @memberjunction/conversations-runtime
16
+ */
17
+ import { BehaviorSubject, Subject } from 'rxjs';
18
+ import { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';
19
+ /** How long late-arrival completion events remain replayable. */
20
+ const RECENT_COMPLETION_TTL_MS = 5 * 60 * 1000;
21
+ /** Reconnection delay after a subscription error or completion. */
22
+ const RECONNECTION_DELAY_MS = 5_000;
23
+ /**
24
+ * Global streaming service that manages PubSub subscriptions for all conversations.
25
+ *
26
+ * Maintains a single GraphQL subscription and routes updates to registered per-message
27
+ * callbacks, regardless of which conversation is currently visible. This ensures
28
+ * messages update correctly even when users navigate away and return.
29
+ *
30
+ * Usually accessed via `ConversationsRuntime.Instance.Streaming`.
31
+ */
32
+ export class ConversationStreaming {
33
+ /**
34
+ * @param context Runtime context providing live access to the registered
35
+ * {@link IActiveTaskTracker}. Read on every event dispatch so adapter swaps
36
+ * after construction are picked up immediately.
37
+ */
38
+ constructor(context) {
39
+ this.context = context;
40
+ this.callbackRegistry = new Map();
41
+ this.recentCompletions = new Map();
42
+ this.connectionStatus$ = new BehaviorSubject('disconnected');
43
+ this.initialized = false;
44
+ /**
45
+ * Observable for components to subscribe to completion events in real-time.
46
+ * Emits enriched completion data once per agent finish.
47
+ */
48
+ this.completionEvents$ = new Subject();
49
+ }
50
+ /**
51
+ * Initialize the global PubSub subscription. Idempotent — safe to call multiple
52
+ * times. Should be called once at app startup (e.g., the Angular widget calls
53
+ * this when the workspace mounts).
54
+ */
55
+ initialize() {
56
+ if (this.initialized) {
57
+ return;
58
+ }
59
+ try {
60
+ const dataProvider = GraphQLDataProvider.Instance;
61
+ this.pushStatusSubscription = dataProvider.PushStatusUpdates().subscribe({
62
+ next: (status) => {
63
+ void this.handlePushStatusUpdate(status);
64
+ },
65
+ error: (error) => {
66
+ console.error('[ConversationStreaming] PubSub connection error:', error);
67
+ this.connectionStatus$.next('error');
68
+ this.scheduleReconnection();
69
+ },
70
+ complete: () => {
71
+ this.connectionStatus$.next('disconnected');
72
+ this.scheduleReconnection();
73
+ },
74
+ });
75
+ this.initialized = true;
76
+ this.connectionStatus$.next('connected');
77
+ }
78
+ catch (error) {
79
+ console.error('[ConversationStreaming] Failed to initialize:', error);
80
+ this.connectionStatus$.next('error');
81
+ this.scheduleReconnection();
82
+ }
83
+ }
84
+ /** Current connection status as an observable. */
85
+ getConnectionStatus$() {
86
+ return this.connectionStatus$.asObservable();
87
+ }
88
+ /** Current connection status value (synchronous). */
89
+ getConnectionStatus() {
90
+ return this.connectionStatus$.value;
91
+ }
92
+ /**
93
+ * Register a callback for a specific conversation detail (message). The callback
94
+ * is invoked whenever progress updates arrive for that message.
95
+ */
96
+ registerMessageCallback(conversationDetailId, callback) {
97
+ const existing = this.callbackRegistry.get(conversationDetailId) ?? [];
98
+ existing.push(callback);
99
+ this.callbackRegistry.set(conversationDetailId, existing);
100
+ }
101
+ /**
102
+ * Unregister a callback for a specific conversation detail. When `callback` is
103
+ * omitted, ALL callbacks for that message are removed.
104
+ */
105
+ unregisterMessageCallback(conversationDetailId, callback) {
106
+ if (callback) {
107
+ const existing = this.callbackRegistry.get(conversationDetailId) ?? [];
108
+ const filtered = existing.filter((cb) => cb !== callback);
109
+ if (filtered.length > 0) {
110
+ this.callbackRegistry.set(conversationDetailId, filtered);
111
+ }
112
+ else {
113
+ this.callbackRegistry.delete(conversationDetailId);
114
+ }
115
+ }
116
+ else {
117
+ this.callbackRegistry.delete(conversationDetailId);
118
+ }
119
+ }
120
+ /** Total number of registered callbacks (diagnostic). */
121
+ getRegisteredCallbackCount() {
122
+ let count = 0;
123
+ for (const callbacks of this.callbackRegistry.values()) {
124
+ count += callbacks.length;
125
+ }
126
+ return count;
127
+ }
128
+ /** Number of distinct messages currently being tracked (diagnostic). */
129
+ getTrackedMessageCount() {
130
+ return this.callbackRegistry.size;
131
+ }
132
+ /**
133
+ * Replay a recently completed event so a late-mounting component can pick it up.
134
+ * Returns `undefined` if no completion is in the 5-minute replay window.
135
+ */
136
+ getRecentCompletion(conversationDetailId) {
137
+ const completion = this.recentCompletions.get(conversationDetailId);
138
+ return completion ? { agentRunId: completion.agentRunId } : undefined;
139
+ }
140
+ /** Clear a recent completion after the late-mounting component has handled it. */
141
+ clearRecentCompletion(conversationDetailId) {
142
+ this.recentCompletions.delete(conversationDetailId);
143
+ }
144
+ /**
145
+ * Diagnostic snapshot for a specific message — used by debugging tools to dump
146
+ * live in-memory state.
147
+ */
148
+ getDiagnosticSnapshot(messageId) {
149
+ const callbacks = this.callbackRegistry.get(messageId);
150
+ return {
151
+ hasCallbacks: !!callbacks && callbacks.length > 0,
152
+ callbackCount: callbacks?.length ?? 0,
153
+ recentCompletion: this.recentCompletions.get(messageId),
154
+ connectionStatus: this.connectionStatus$.getValue(),
155
+ };
156
+ }
157
+ /**
158
+ * Tear down subscriptions and clear state. Call at app shutdown or in tests
159
+ * between cases.
160
+ */
161
+ Dispose() {
162
+ if (this.reconnectionTimeout) {
163
+ clearTimeout(this.reconnectionTimeout);
164
+ this.reconnectionTimeout = undefined;
165
+ }
166
+ if (this.pushStatusSubscription) {
167
+ this.pushStatusSubscription.unsubscribe();
168
+ this.pushStatusSubscription = undefined;
169
+ }
170
+ this.callbackRegistry.clear();
171
+ this.recentCompletions.clear();
172
+ this.completionEvents$.complete();
173
+ this.connectionStatus$.complete();
174
+ this.initialized = false;
175
+ }
176
+ // ────────────────────────────────────────────────────────────────────
177
+ // Internals
178
+ // ────────────────────────────────────────────────────────────────────
179
+ /**
180
+ * Route an incoming PubSub status update to the right handler based on which
181
+ * resolver published it.
182
+ */
183
+ async handlePushStatusUpdate(status) {
184
+ if (status == null) {
185
+ console.warn('[ConversationStreaming] PubSub status is null or undefined');
186
+ return;
187
+ }
188
+ try {
189
+ // GraphQL subscription may emit JSON strings or already-parsed objects.
190
+ const statusObj = typeof status === 'string'
191
+ ? JSON.parse(status)
192
+ : status;
193
+ if (statusObj.resolver === 'TaskOrchestrator') {
194
+ await this.routeTaskProgress(statusObj);
195
+ }
196
+ else if (statusObj.resolver === 'RunAIAgentResolver') {
197
+ await this.routeAgentProgress(statusObj);
198
+ }
199
+ }
200
+ catch (error) {
201
+ console.error('[ConversationStreaming] Error processing push status update:', error);
202
+ }
203
+ }
204
+ /**
205
+ * Route a TaskOrchestrator progress update to the message-scoped callback set,
206
+ * keyed by `conversationDetailId`.
207
+ */
208
+ async routeTaskProgress(statusObj) {
209
+ try {
210
+ const data = statusObj.data ?? {};
211
+ const taskName = data.taskName;
212
+ const message = data.message;
213
+ const percentComplete = data.percentComplete;
214
+ const metadata = data.metadata;
215
+ const conversationDetailId = data.conversationDetailId;
216
+ if (!message) {
217
+ console.warn('[ConversationStreaming] No message content in TaskOrchestrator update');
218
+ return;
219
+ }
220
+ if (!conversationDetailId) {
221
+ console.warn('[ConversationStreaming] TaskOrchestrator update missing conversationDetailId', {
222
+ taskName,
223
+ message,
224
+ });
225
+ return;
226
+ }
227
+ const callbacks = this.callbackRegistry.get(conversationDetailId) ?? [];
228
+ if (callbacks.length === 0) {
229
+ // Expected when progress is handled directly by the GraphQLAIClient
230
+ // fire-and-forget subscription or the message is in a hidden conversation.
231
+ return;
232
+ }
233
+ const progressUpdate = {
234
+ message,
235
+ percentComplete,
236
+ taskName,
237
+ conversationDetailId,
238
+ metadata,
239
+ resolver: 'TaskOrchestrator',
240
+ };
241
+ await this.dispatchCallbacks(callbacks, progressUpdate, conversationDetailId);
242
+ }
243
+ catch (error) {
244
+ console.error('[ConversationStreaming] Error routing TaskOrchestrator progress:', error);
245
+ }
246
+ }
247
+ /**
248
+ * Route a RunAIAgentResolver progress update. Handles both progress messages and
249
+ * completion messages (which include enriched result data and trigger the
250
+ * `completionEvents$` broadcast + active-task cleanup).
251
+ */
252
+ async routeAgentProgress(statusObj) {
253
+ try {
254
+ const data = statusObj.data ?? {};
255
+ const agentRun = data.agentRun;
256
+ const progress = data.progress;
257
+ const type = data.type;
258
+ // Completion message — clear the task, broadcast, and remember for replay.
259
+ if (type === 'complete') {
260
+ const agentRunId = data.agentRunId ?? '';
261
+ const conversationDetailId = data.conversationDetailId;
262
+ const success = data.success;
263
+ const errorMessage = data.errorMessage;
264
+ if (agentRunId) {
265
+ const removed = this.context.Tasks.RemoveByAgentRunId(agentRunId);
266
+ if (removed) {
267
+ console.log(`[ConversationStreaming] Agent run ${agentRunId} completed, removed from active tasks`);
268
+ }
269
+ }
270
+ if (conversationDetailId) {
271
+ this.recentCompletions.set(conversationDetailId, {
272
+ conversationDetailId,
273
+ agentRunId,
274
+ timestamp: new Date(),
275
+ });
276
+ this.completionEvents$.next({
277
+ conversationDetailId,
278
+ agentRunId,
279
+ success,
280
+ errorMessage,
281
+ });
282
+ this.cleanupOldCompletions();
283
+ console.log(`[ConversationStreaming] Completion broadcast for message ${conversationDetailId} (success: ${String(success)})`);
284
+ }
285
+ else {
286
+ console.warn(`[ConversationStreaming] Completion received without conversationDetailId for agentRunId: ${agentRunId}`);
287
+ }
288
+ return;
289
+ }
290
+ // Regular progress message.
291
+ const conversationDetailId = agentRun?.ConversationDetailID;
292
+ const message = progress?.message;
293
+ const percentComplete = progress?.percentage;
294
+ const stepCount = progress?.stepCount;
295
+ if (!message) {
296
+ console.warn('[ConversationStreaming] No message content in agent progress update');
297
+ return;
298
+ }
299
+ if (!conversationDetailId) {
300
+ console.warn('[ConversationStreaming] Agent progress update missing conversationDetailId', { agentName: agentRun?.Agent, message });
301
+ return;
302
+ }
303
+ const callbacks = this.callbackRegistry.get(conversationDetailId) ?? [];
304
+ if (callbacks.length === 0)
305
+ return;
306
+ const progressUpdate = {
307
+ message,
308
+ percentComplete,
309
+ taskName: agentRun?.Agent ?? 'Agent',
310
+ conversationDetailId,
311
+ metadata: { agentRun, progress },
312
+ stepCount,
313
+ resolver: 'RunAIAgentResolver',
314
+ };
315
+ await this.dispatchCallbacks(callbacks, progressUpdate, conversationDetailId);
316
+ }
317
+ catch (error) {
318
+ console.error('[ConversationStreaming] Error routing RunAIAgentResolver progress:', error);
319
+ }
320
+ }
321
+ /** Invoke every callback registered for `conversationDetailId`, swallowing per-callback errors. */
322
+ async dispatchCallbacks(callbacks, progressUpdate, conversationDetailId) {
323
+ for (const callback of callbacks) {
324
+ try {
325
+ await callback(progressUpdate);
326
+ }
327
+ catch (error) {
328
+ console.error(`[ConversationStreaming] Callback error for message ${conversationDetailId}:`, error);
329
+ // Continue with other callbacks — one failure shouldn't block the rest.
330
+ }
331
+ }
332
+ }
333
+ /** Schedule a reconnection attempt after a connection error or completion. */
334
+ scheduleReconnection() {
335
+ if (this.reconnectionTimeout) {
336
+ clearTimeout(this.reconnectionTimeout);
337
+ }
338
+ this.connectionStatus$.next('reconnecting');
339
+ this.reconnectionTimeout = setTimeout(() => {
340
+ console.log('[ConversationStreaming] Attempting to reconnect...');
341
+ this.initialized = false;
342
+ this.initialize();
343
+ }, RECONNECTION_DELAY_MS);
344
+ }
345
+ /** Evict completions older than the replay window to bound memory. */
346
+ cleanupOldCompletions() {
347
+ const cutoff = Date.now() - RECENT_COMPLETION_TTL_MS;
348
+ for (const [id, data] of this.recentCompletions) {
349
+ if (data.timestamp.getTime() < cutoff) {
350
+ this.recentCompletions.delete(id);
351
+ }
352
+ }
353
+ }
354
+ }
355
+ //# sourceMappingURL=ConversationStreaming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConversationStreaming.js","sourceRoot":"","sources":["../../src/streaming/ConversationStreaming.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,36 @@
1
1
  {
2
2
  "name": "@memberjunction/conversations-runtime",
3
- "version": "0.0.1",
4
- "description": "OIDC trusted publishing setup package for @memberjunction/conversations-runtime",
5
- "keywords": [
6
- "oidc",
7
- "trusted-publishing",
8
- "setup"
9
- ]
3
+ "type": "module",
4
+ "version": "5.42.0",
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
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "/dist"
10
+ ],
11
+ "scripts": {
12
+ "build": "tsc && tsc-alias -f",
13
+ "test": "vitest run",
14
+ "test:watch": "vitest"
15
+ },
16
+ "author": "MemberJunction.com",
17
+ "license": "ISC",
18
+ "dependencies": {
19
+ "@memberjunction/ai-agent-client": "5.42.0",
20
+ "@memberjunction/ai-core-plus": "5.42.0",
21
+ "@memberjunction/ai-engine-base": "5.42.0",
22
+ "@memberjunction/core": "5.42.0",
23
+ "@memberjunction/core-entities": "5.42.0",
24
+ "@memberjunction/global": "5.42.0",
25
+ "@memberjunction/graphql-dataprovider": "5.42.0",
26
+ "rxjs": "^7.8.2"
27
+ },
28
+ "devDependencies": {
29
+ "@types/node": "24.10.11",
30
+ "typescript": "^5.9.3"
31
+ },
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "https://github.com/MemberJunction/MJ"
35
+ }
10
36
  }