@memberjunction/conversations-runtime 0.0.1 → 5.41.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.
- package/README.md +99 -43
- package/dist/ConversationsRuntime.d.ts +193 -0
- package/dist/ConversationsRuntime.d.ts.map +1 -0
- package/dist/ConversationsRuntime.js +268 -0
- package/dist/ConversationsRuntime.js.map +1 -0
- package/dist/adapters/IActiveTaskTracker.d.ts +49 -0
- package/dist/adapters/IActiveTaskTracker.d.ts.map +1 -0
- package/dist/adapters/IActiveTaskTracker.js +26 -0
- package/dist/adapters/IActiveTaskTracker.js.map +1 -0
- package/dist/adapters/INotificationAdapter.d.ts +60 -0
- package/dist/adapters/INotificationAdapter.d.ts.map +1 -0
- package/dist/adapters/INotificationAdapter.js +45 -0
- package/dist/adapters/INotificationAdapter.js.map +1 -0
- package/dist/adapters/ISessionsAdapter.d.ts +124 -0
- package/dist/adapters/ISessionsAdapter.d.ts.map +1 -0
- package/dist/adapters/ISessionsAdapter.js +44 -0
- package/dist/adapters/ISessionsAdapter.js.map +1 -0
- package/dist/agent-runner/ConversationAgentRunner.d.ts +121 -0
- package/dist/agent-runner/ConversationAgentRunner.d.ts.map +1 -0
- package/dist/agent-runner/ConversationAgentRunner.js +191 -0
- package/dist/agent-runner/ConversationAgentRunner.js.map +1 -0
- package/dist/bridge/ConversationBridge.d.ts +93 -0
- package/dist/bridge/ConversationBridge.d.ts.map +1 -0
- package/dist/bridge/ConversationBridge.js +105 -0
- package/dist/bridge/ConversationBridge.js.map +1 -0
- package/dist/context/IConversationsRuntimeContext.d.ts +29 -0
- package/dist/context/IConversationsRuntimeContext.d.ts.map +1 -0
- package/dist/context/IConversationsRuntimeContext.js +21 -0
- package/dist/context/IConversationsRuntimeContext.js.map +1 -0
- package/dist/default-agent/DefaultAgentResolver.d.ts +87 -0
- package/dist/default-agent/DefaultAgentResolver.d.ts.map +1 -0
- package/dist/default-agent/DefaultAgentResolver.js +103 -0
- package/dist/default-agent/DefaultAgentResolver.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/mentions/MentionParser.d.ts +109 -0
- package/dist/mentions/MentionParser.d.ts.map +1 -0
- package/dist/mentions/MentionParser.js +276 -0
- package/dist/mentions/MentionParser.js.map +1 -0
- package/dist/sessions/SessionsObserver.d.ts +87 -0
- package/dist/sessions/SessionsObserver.d.ts.map +1 -0
- package/dist/sessions/SessionsObserver.js +103 -0
- package/dist/sessions/SessionsObserver.js.map +1 -0
- package/dist/streaming/ConversationStreaming.d.ts +169 -0
- package/dist/streaming/ConversationStreaming.d.ts.map +1 -0
- package/dist/streaming/ConversationStreaming.js +355 -0
- package/dist/streaming/ConversationStreaming.js.map +1 -0
- 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
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "5.41.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.41.0",
|
|
20
|
+
"@memberjunction/ai-core-plus": "5.41.0",
|
|
21
|
+
"@memberjunction/ai-engine-base": "5.41.0",
|
|
22
|
+
"@memberjunction/core": "5.41.0",
|
|
23
|
+
"@memberjunction/core-entities": "5.41.0",
|
|
24
|
+
"@memberjunction/global": "5.41.0",
|
|
25
|
+
"@memberjunction/graphql-dataprovider": "5.41.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
|
}
|