@memberjunction/server 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.
- package/README.md +30 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/config.d.ts +2189 -71
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +123 -3
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +11 -23
- package/dist/context.js.map +1 -1
- package/dist/generated/graphql-schemas/__mj.d.ts +2143 -205
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +24441 -14433
- package/dist/generated/graphql-schemas/__mj.js.map +1 -1
- package/dist/generic/FireAndForgetHeartbeat.d.ts +15 -1
- package/dist/generic/FireAndForgetHeartbeat.d.ts.map +1 -1
- package/dist/generic/FireAndForgetHeartbeat.js +16 -2
- package/dist/generic/FireAndForgetHeartbeat.js.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.d.ts +31 -0
- package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -0
- package/dist/generic/OrphanedConversationDetailReconciler.js +215 -0
- package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -0
- package/dist/generic/PushStatusResolver.d.ts +38 -0
- package/dist/generic/PushStatusResolver.d.ts.map +1 -1
- package/dist/generic/PushStatusResolver.js +84 -1
- package/dist/generic/PushStatusResolver.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +56 -4
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +191 -74
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts +4 -0
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +33 -1
- package/dist/generic/RunViewResolver.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +204 -50
- package/dist/index.js.map +1 -1
- package/dist/postgresqlCompat.d.ts +8 -0
- package/dist/postgresqlCompat.d.ts.map +1 -0
- package/dist/postgresqlCompat.js +19 -0
- package/dist/postgresqlCompat.js.map +1 -0
- package/dist/postgresqlPoolSettings.d.ts +108 -0
- package/dist/postgresqlPoolSettings.d.ts.map +1 -0
- package/dist/postgresqlPoolSettings.js +134 -0
- package/dist/postgresqlPoolSettings.js.map +1 -0
- package/dist/resolvers/AdhocQueryResolver.d.ts +23 -18
- package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
- package/dist/resolvers/AdhocQueryResolver.js +77 -167
- package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
- package/dist/resolvers/AgentRunStatusPublisher.d.ts +55 -0
- package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -0
- package/dist/resolvers/AgentRunStatusPublisher.js +141 -0
- package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -0
- package/dist/resolvers/ConversationRunEventsResolver.d.ts +90 -0
- package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -0
- package/dist/resolvers/ConversationRunEventsResolver.js +283 -0
- package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -0
- package/dist/resolvers/DuplicateEntryCheckResolver.d.ts +98 -0
- package/dist/resolvers/DuplicateEntryCheckResolver.d.ts.map +1 -0
- package/dist/resolvers/DuplicateEntryCheckResolver.js +227 -0
- package/dist/resolvers/DuplicateEntryCheckResolver.js.map +1 -0
- package/dist/resolvers/EntityRecordNameResolver.d.ts +7 -23
- package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.js +9 -47
- package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.js +2 -1
- package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
- package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataResolver.js +9 -0
- package/dist/resolvers/GetDataResolver.js.map +1 -1
- package/dist/resolvers/HumanHandoffResolver.d.ts +107 -0
- package/dist/resolvers/HumanHandoffResolver.d.ts.map +1 -0
- package/dist/resolvers/HumanHandoffResolver.js +324 -0
- package/dist/resolvers/HumanHandoffResolver.js.map +1 -0
- package/dist/resolvers/MeetingResolver.d.ts +69 -0
- package/dist/resolvers/MeetingResolver.d.ts.map +1 -0
- package/dist/resolvers/MeetingResolver.js +381 -0
- package/dist/resolvers/MeetingResolver.js.map +1 -0
- package/dist/resolvers/MergeRecordsResolver.d.ts +7 -0
- package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.js +16 -2
- package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
- package/dist/resolvers/RealtimeBridgeResolver.d.ts +34 -1
- package/dist/resolvers/RealtimeBridgeResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeBridgeResolver.js +202 -7
- package/dist/resolvers/RealtimeBridgeResolver.js.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts +45 -89
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +94 -240
- package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts +0 -16
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +23 -153
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunDecisionResolver.d.ts +149 -0
- package/dist/resolvers/RunDecisionResolver.d.ts.map +1 -0
- package/dist/resolvers/RunDecisionResolver.js +396 -0
- package/dist/resolvers/RunDecisionResolver.js.map +1 -0
- package/dist/resolvers/VectorizeEntityResolver.d.ts +1 -1
- package/dist/resolvers/VectorizeEntityResolver.d.ts.map +1 -1
- package/dist/resolvers/VectorizeEntityResolver.js +14 -10
- package/dist/resolvers/VectorizeEntityResolver.js.map +1 -1
- package/dist/resolvers/adhocTimeout.d.ts +7 -0
- package/dist/resolvers/adhocTimeout.d.ts.map +1 -0
- package/dist/resolvers/adhocTimeout.js +12 -0
- package/dist/resolvers/adhocTimeout.js.map +1 -0
- package/dist/resolvers/meetings/index.d.ts +5 -0
- package/dist/resolvers/meetings/index.d.ts.map +1 -0
- package/dist/resolvers/meetings/index.js +5 -0
- package/dist/resolvers/meetings/index.js.map +1 -0
- package/dist/resolvers/meetings/meetingHelpers.d.ts +17 -0
- package/dist/resolvers/meetings/meetingHelpers.d.ts.map +1 -0
- package/dist/resolvers/meetings/meetingHelpers.js +212 -0
- package/dist/resolvers/meetings/meetingHelpers.js.map +1 -0
- package/dist/resolvers/meetings/meetingMutations.d.ts +12 -0
- package/dist/resolvers/meetings/meetingMutations.d.ts.map +1 -0
- package/dist/resolvers/meetings/meetingMutations.js +418 -0
- package/dist/resolvers/meetings/meetingMutations.js.map +1 -0
- package/dist/resolvers/meetings/meetingQueries.d.ts +7 -0
- package/dist/resolvers/meetings/meetingQueries.d.ts.map +1 -0
- package/dist/resolvers/meetings/meetingQueries.js +113 -0
- package/dist/resolvers/meetings/meetingQueries.js.map +1 -0
- package/dist/resolvers/meetings/meetingTypes.d.ts +89 -0
- package/dist/resolvers/meetings/meetingTypes.d.ts.map +1 -0
- package/dist/resolvers/meetings/meetingTypes.js +345 -0
- package/dist/resolvers/meetings/meetingTypes.js.map +1 -0
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +8 -5
- package/dist/rest/ViewOperationsHandler.js.map +1 -1
- package/dist/services/TaskGraphActionRunner.d.ts +8 -0
- package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphActionRunner.js +27 -1
- package/dist/services/TaskGraphActionRunner.js.map +1 -1
- package/dist/services/WorkQueueHostService.d.ts +36 -0
- package/dist/services/WorkQueueHostService.d.ts.map +1 -0
- package/dist/services/WorkQueueHostService.js +97 -0
- package/dist/services/WorkQueueHostService.js.map +1 -0
- package/dist/services/workQueueConfig.d.ts +103 -0
- package/dist/services/workQueueConfig.d.ts.map +1 -0
- package/dist/services/workQueueConfig.js +48 -0
- package/dist/services/workQueueConfig.js.map +1 -0
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +95 -92
- package/src/__tests__/AdhocQueryResolver.bugs.test.ts +14 -35
- package/src/__tests__/AdhocQueryResolver.pagination.test.ts +6 -2
- package/src/__tests__/AdhocQueryResolver.scopeGuard.test.ts +3 -3
- package/src/__tests__/AgentRunStatusPublisher.test.ts +175 -0
- package/src/__tests__/DuplicateEntryCheckResolver.test.ts +300 -0
- package/src/__tests__/EntityRecordNameResolver.fieldSecurity.test.ts +27 -72
- package/src/__tests__/HumanHandoffResolver.test.ts +233 -0
- package/src/__tests__/MeetingResolver.test.ts +374 -0
- package/src/__tests__/RealtimeBridgeResolver.test.ts +240 -2
- package/src/__tests__/RealtimeClientSessionResolver.test.ts +216 -2
- package/src/__tests__/RemoteBrowserActionRecovery.test.ts +7 -1
- package/src/__tests__/RemoteBrowserAudioStream.test.ts +7 -1
- package/src/__tests__/RemoteBrowserSnapshot.test.ts +7 -1
- package/src/__tests__/ResolverBase.adhocReadScope.test.ts +96 -0
- package/src/__tests__/ResolverBase.clientOldValues.test.ts +52 -0
- package/src/__tests__/ResolverBase.filterEscaping.test.ts +21 -2
- package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +291 -0
- package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +182 -12
- package/src/__tests__/RunAIAgentResolver.streaming.test.ts +18 -27
- package/src/__tests__/RunDecisionResolver.test.ts +699 -0
- package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +43 -0
- package/src/__tests__/VectorizeEntityResolver.test.ts +106 -0
- package/src/__tests__/WorkQueueHostService.test.ts +133 -0
- package/src/__tests__/adhocTimeoutClamp.test.ts +26 -0
- package/src/__tests__/conversationRunEvents.test.ts +399 -0
- package/src/__tests__/orphanedConversationDetailReconciler.test.ts +283 -0
- package/src/__tests__/postgresqlPoolSettings.test.ts +131 -0
- package/src/__tests__/pushStatusFanOut.test.ts +206 -0
- package/src/__tests__/translateBracketsToPG.test.ts +20 -0
- package/src/auth/__tests__/backward-compatibility.test.ts +1 -0
- package/src/config.ts +130 -3
- package/src/context.ts +11 -24
- package/src/generated/graphql-schemas/__mj.ts +24183 -17182
- package/src/generic/FireAndForgetHeartbeat.ts +16 -2
- package/src/generic/OrphanedConversationDetailReconciler.ts +267 -0
- package/src/generic/PushStatusResolver.ts +97 -1
- package/src/generic/ResolverBase.ts +220 -76
- package/src/generic/RunViewResolver.ts +33 -2
- package/src/index.ts +228 -51
- package/src/postgresqlCompat.ts +21 -0
- package/src/postgresqlPoolSettings.ts +213 -0
- package/src/resolvers/AdhocQueryResolver.ts +88 -188
- package/src/resolvers/AgentRunStatusPublisher.ts +175 -0
- package/src/resolvers/ConversationRunEventsResolver.ts +308 -0
- package/src/resolvers/DuplicateEntryCheckResolver.ts +232 -0
- package/src/resolvers/EntityRecordNameResolver.ts +9 -51
- package/src/resolvers/FetchEntityVectorsResolver.ts +2 -1
- package/src/resolvers/GetDataResolver.ts +10 -0
- package/src/resolvers/HumanHandoffResolver.ts +304 -0
- package/src/resolvers/MeetingResolver.ts +438 -0
- package/src/resolvers/MergeRecordsResolver.ts +14 -2
- package/src/resolvers/RealtimeBridgeResolver.ts +227 -13
- package/src/resolvers/RealtimeClientSessionResolver.ts +99 -287
- package/src/resolvers/RunAIAgentResolver.ts +28 -174
- package/src/resolvers/RunDecisionResolver.ts +435 -0
- package/src/resolvers/VectorizeEntityResolver.ts +16 -11
- package/src/resolvers/__tests__/MergeRecordsResolver.test.ts +93 -0
- package/src/resolvers/adhocTimeout.ts +12 -0
- package/src/resolvers/meetings/index.ts +4 -0
- package/src/resolvers/meetings/meetingHelpers.ts +307 -0
- package/src/resolvers/meetings/meetingMutations.ts +535 -0
- package/src/resolvers/meetings/meetingQueries.ts +172 -0
- package/src/resolvers/meetings/meetingTypes.ts +238 -0
- package/src/rest/ViewOperationsHandler.ts +8 -5
- package/src/services/TaskGraphActionRunner.ts +29 -1
- package/src/services/WorkQueueHostService.ts +129 -0
- package/src/services/workQueueConfig.ts +52 -0
- package/src/types.ts +5 -0
- package/dist/resolvers/adhoc-query-helpers.d.ts +0 -33
- package/dist/resolvers/adhoc-query-helpers.d.ts.map +0 -1
- package/dist/resolvers/adhoc-query-helpers.js +0 -50
- package/dist/resolvers/adhoc-query-helpers.js.map +0 -1
- package/src/__tests__/adhoc-query-helpers.test.ts +0 -50
- package/src/resolvers/adhoc-query-helpers.ts +0 -67
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/server",
|
|
3
|
-
"version": "6.2.0-edge.
|
|
3
|
+
"version": "6.2.0-edge.3",
|
|
4
4
|
"description": "MemberJunction: This project provides API access via GraphQL to the common data store.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./src/index.ts",
|
|
@@ -19,97 +19,99 @@
|
|
|
19
19
|
"@as-integrations/express5": "^1.0.0",
|
|
20
20
|
"@graphql-tools/schema": "^10.0.38",
|
|
21
21
|
"@graphql-tools/utils": "^11.0.0",
|
|
22
|
-
"@memberjunction/actions": "6.2.0-edge.
|
|
23
|
-
"@memberjunction/actions-apollo": "6.2.0-edge.
|
|
24
|
-
"@memberjunction/actions-base": "6.2.0-edge.
|
|
25
|
-
"@memberjunction/actions-bizapps-accounting": "6.2.0-edge.
|
|
26
|
-
"@memberjunction/actions-bizapps-crm": "6.2.0-edge.
|
|
27
|
-
"@memberjunction/actions-bizapps-formbuilders": "6.2.0-edge.
|
|
28
|
-
"@memberjunction/actions-bizapps-lms": "6.2.0-edge.
|
|
29
|
-
"@memberjunction/actions-bizapps-social": "6.2.0-edge.
|
|
30
|
-
"@memberjunction/ai": "6.2.0-edge.
|
|
31
|
-
"@memberjunction/ai-agent-manager": "6.2.0-edge.
|
|
32
|
-
"@memberjunction/ai-agent-manager-actions": "6.2.0-edge.
|
|
33
|
-
"@memberjunction/ai-agents": "6.2.0-edge.
|
|
34
|
-
"@memberjunction/ai-bridge-base": "6.2.0-edge.
|
|
35
|
-
"@memberjunction/ai-bridge-ringcentral": "6.2.0-edge.
|
|
36
|
-
"@memberjunction/ai-bridge-server": "6.2.0-edge.
|
|
37
|
-
"@memberjunction/ai-bridge-teams": "6.2.0-edge.
|
|
38
|
-
"@memberjunction/ai-bridge-twilio": "6.2.0-edge.
|
|
39
|
-
"@memberjunction/ai-bridge-vonage": "6.2.0-edge.
|
|
40
|
-
"@memberjunction/ai-core-plus": "6.2.0-edge.
|
|
41
|
-
"@memberjunction/ai-engine-base": "6.2.0-edge.
|
|
42
|
-
"@memberjunction/ai-mcp-client": "6.2.0-edge.
|
|
43
|
-
"@memberjunction/ai-prompts": "6.2.0-edge.
|
|
44
|
-
"@memberjunction/ai-provider-bundle": "6.2.0-edge.
|
|
45
|
-
"@memberjunction/ai-vector-
|
|
46
|
-
"@memberjunction/ai-
|
|
47
|
-
"@memberjunction/ai-
|
|
48
|
-
"@memberjunction/
|
|
49
|
-
"@memberjunction/
|
|
50
|
-
"@memberjunction/
|
|
51
|
-
"@memberjunction/
|
|
52
|
-
"@memberjunction/
|
|
53
|
-
"@memberjunction/
|
|
54
|
-
"@memberjunction/communication-
|
|
55
|
-
"@memberjunction/communication-
|
|
56
|
-
"@memberjunction/communication-
|
|
57
|
-
"@memberjunction/
|
|
58
|
-
"@memberjunction/
|
|
59
|
-
"@memberjunction/computer-use
|
|
60
|
-
"@memberjunction/
|
|
61
|
-
"@memberjunction/
|
|
62
|
-
"@memberjunction/core
|
|
63
|
-
"@memberjunction/core-
|
|
64
|
-
"@memberjunction/core-entities
|
|
65
|
-
"@memberjunction/
|
|
66
|
-
"@memberjunction/
|
|
67
|
-
"@memberjunction/data-context
|
|
68
|
-
"@memberjunction/
|
|
69
|
-
"@memberjunction/
|
|
70
|
-
"@memberjunction/
|
|
71
|
-
"@memberjunction/entity-communications-
|
|
72
|
-
"@memberjunction/
|
|
73
|
-
"@memberjunction/
|
|
74
|
-
"@memberjunction/
|
|
75
|
-
"@memberjunction/
|
|
76
|
-
"@memberjunction/
|
|
77
|
-
"@memberjunction/
|
|
78
|
-
"@memberjunction/integration-engine
|
|
79
|
-
"@memberjunction/integration-
|
|
80
|
-
"@memberjunction/integration-
|
|
81
|
-
"@memberjunction/
|
|
82
|
-
"@memberjunction/
|
|
83
|
-
"@memberjunction/lists
|
|
84
|
-
"@memberjunction/
|
|
85
|
-
"@memberjunction/
|
|
86
|
-
"@memberjunction/
|
|
87
|
-
"@memberjunction/
|
|
88
|
-
"@memberjunction/
|
|
89
|
-
"@memberjunction/
|
|
90
|
-
"@memberjunction/
|
|
91
|
-
"@memberjunction/
|
|
92
|
-
"@memberjunction/remote-browser-
|
|
93
|
-
"@memberjunction/remote-browser-
|
|
94
|
-
"@memberjunction/remote-browser-
|
|
95
|
-
"@memberjunction/
|
|
96
|
-
"@memberjunction/scheduling-
|
|
97
|
-
"@memberjunction/scheduling-
|
|
98
|
-
"@memberjunction/scheduling-engine
|
|
99
|
-
"@memberjunction/
|
|
100
|
-
"@memberjunction/
|
|
101
|
-
"@memberjunction/
|
|
102
|
-
"@memberjunction/
|
|
103
|
-
"@memberjunction/sql-
|
|
104
|
-
"@memberjunction/
|
|
105
|
-
"@memberjunction/
|
|
106
|
-
"@memberjunction/
|
|
107
|
-
"@memberjunction/tag-engine
|
|
108
|
-
"@memberjunction/
|
|
109
|
-
"@memberjunction/
|
|
110
|
-
"@memberjunction/
|
|
111
|
-
"@memberjunction/testing-engine
|
|
112
|
-
"@memberjunction/
|
|
22
|
+
"@memberjunction/actions": "6.2.0-edge.3",
|
|
23
|
+
"@memberjunction/actions-apollo": "6.2.0-edge.3",
|
|
24
|
+
"@memberjunction/actions-base": "6.2.0-edge.3",
|
|
25
|
+
"@memberjunction/actions-bizapps-accounting": "6.2.0-edge.3",
|
|
26
|
+
"@memberjunction/actions-bizapps-crm": "6.2.0-edge.3",
|
|
27
|
+
"@memberjunction/actions-bizapps-formbuilders": "6.2.0-edge.3",
|
|
28
|
+
"@memberjunction/actions-bizapps-lms": "6.2.0-edge.3",
|
|
29
|
+
"@memberjunction/actions-bizapps-social": "6.2.0-edge.3",
|
|
30
|
+
"@memberjunction/ai": "6.2.0-edge.3",
|
|
31
|
+
"@memberjunction/ai-agent-manager": "6.2.0-edge.3",
|
|
32
|
+
"@memberjunction/ai-agent-manager-actions": "6.2.0-edge.3",
|
|
33
|
+
"@memberjunction/ai-agents": "6.2.0-edge.3",
|
|
34
|
+
"@memberjunction/ai-bridge-base": "6.2.0-edge.3",
|
|
35
|
+
"@memberjunction/ai-bridge-ringcentral": "6.2.0-edge.3",
|
|
36
|
+
"@memberjunction/ai-bridge-server": "6.2.0-edge.3",
|
|
37
|
+
"@memberjunction/ai-bridge-teams": "6.2.0-edge.3",
|
|
38
|
+
"@memberjunction/ai-bridge-twilio": "6.2.0-edge.3",
|
|
39
|
+
"@memberjunction/ai-bridge-vonage": "6.2.0-edge.3",
|
|
40
|
+
"@memberjunction/ai-core-plus": "6.2.0-edge.3",
|
|
41
|
+
"@memberjunction/ai-engine-base": "6.2.0-edge.3",
|
|
42
|
+
"@memberjunction/ai-mcp-client": "6.2.0-edge.3",
|
|
43
|
+
"@memberjunction/ai-prompts": "6.2.0-edge.3",
|
|
44
|
+
"@memberjunction/ai-provider-bundle": "6.2.0-edge.3",
|
|
45
|
+
"@memberjunction/ai-vector-dupe": "6.2.0-edge.3",
|
|
46
|
+
"@memberjunction/ai-vector-sync": "6.2.0-edge.3",
|
|
47
|
+
"@memberjunction/ai-vectordb": "6.2.0-edge.3",
|
|
48
|
+
"@memberjunction/ai-vectors-pinecone": "6.2.0-edge.3",
|
|
49
|
+
"@memberjunction/aiengine": "6.2.0-edge.3",
|
|
50
|
+
"@memberjunction/api-keys": "6.2.0-edge.3",
|
|
51
|
+
"@memberjunction/auth-providers": "6.2.0-edge.3",
|
|
52
|
+
"@memberjunction/clustering-engine": "6.2.0-edge.3",
|
|
53
|
+
"@memberjunction/codegen-lib": "6.2.0-edge.3",
|
|
54
|
+
"@memberjunction/communication-engine": "6.2.0-edge.3",
|
|
55
|
+
"@memberjunction/communication-ms-graph": "6.2.0-edge.3",
|
|
56
|
+
"@memberjunction/communication-sendgrid": "6.2.0-edge.3",
|
|
57
|
+
"@memberjunction/communication-types": "6.2.0-edge.3",
|
|
58
|
+
"@memberjunction/component-registry-client-sdk": "6.2.0-edge.3",
|
|
59
|
+
"@memberjunction/computer-use": "6.2.0-edge.3",
|
|
60
|
+
"@memberjunction/computer-use-engine": "6.2.0-edge.3",
|
|
61
|
+
"@memberjunction/config": "6.2.0-edge.3",
|
|
62
|
+
"@memberjunction/core": "6.2.0-edge.3",
|
|
63
|
+
"@memberjunction/core-actions": "6.2.0-edge.3",
|
|
64
|
+
"@memberjunction/core-entities": "6.2.0-edge.3",
|
|
65
|
+
"@memberjunction/core-entities-server": "6.2.0-edge.3",
|
|
66
|
+
"@memberjunction/credentials": "6.2.0-edge.3",
|
|
67
|
+
"@memberjunction/data-context": "6.2.0-edge.3",
|
|
68
|
+
"@memberjunction/data-context-server": "6.2.0-edge.3",
|
|
69
|
+
"@memberjunction/doc-utils": "6.2.0-edge.3",
|
|
70
|
+
"@memberjunction/encryption": "6.2.0-edge.3",
|
|
71
|
+
"@memberjunction/entity-communications-base": "6.2.0-edge.3",
|
|
72
|
+
"@memberjunction/entity-communications-server": "6.2.0-edge.3",
|
|
73
|
+
"@memberjunction/esignature": "6.2.0-edge.3",
|
|
74
|
+
"@memberjunction/external-change-detection": "6.2.0-edge.3",
|
|
75
|
+
"@memberjunction/generic-database-provider": "6.2.0-edge.3",
|
|
76
|
+
"@memberjunction/global": "6.2.0-edge.3",
|
|
77
|
+
"@memberjunction/graphql-dataprovider": "6.2.0-edge.3",
|
|
78
|
+
"@memberjunction/integration-engine": "6.2.0-edge.3",
|
|
79
|
+
"@memberjunction/integration-engine-base": "6.2.0-edge.3",
|
|
80
|
+
"@memberjunction/integration-progress-artifacts": "6.2.0-edge.3",
|
|
81
|
+
"@memberjunction/integration-schema-builder": "6.2.0-edge.3",
|
|
82
|
+
"@memberjunction/interactive-component-types": "6.2.0-edge.3",
|
|
83
|
+
"@memberjunction/lists": "6.2.0-edge.3",
|
|
84
|
+
"@memberjunction/lists-base": "6.2.0-edge.3",
|
|
85
|
+
"@memberjunction/livekit-room-server": "6.2.0-edge.3",
|
|
86
|
+
"@memberjunction/network-utils": "6.2.0-edge.3",
|
|
87
|
+
"@memberjunction/notifications": "6.2.0-edge.3",
|
|
88
|
+
"@memberjunction/postgresql-dataprovider": "6.2.0-edge.3",
|
|
89
|
+
"@memberjunction/queue": "6.2.0-edge.3",
|
|
90
|
+
"@memberjunction/record-comparison": "6.2.0-edge.3",
|
|
91
|
+
"@memberjunction/redis-provider": "6.2.0-edge.3",
|
|
92
|
+
"@memberjunction/remote-browser-base": "6.2.0-edge.3",
|
|
93
|
+
"@memberjunction/remote-browser-cdp": "6.2.0-edge.3",
|
|
94
|
+
"@memberjunction/remote-browser-selfhost": "6.2.0-edge.3",
|
|
95
|
+
"@memberjunction/remote-browser-server": "6.2.0-edge.3",
|
|
96
|
+
"@memberjunction/scheduling-actions": "6.2.0-edge.3",
|
|
97
|
+
"@memberjunction/scheduling-base-types": "6.2.0-edge.3",
|
|
98
|
+
"@memberjunction/scheduling-engine": "6.2.0-edge.3",
|
|
99
|
+
"@memberjunction/scheduling-engine-base": "6.2.0-edge.3",
|
|
100
|
+
"@memberjunction/schema-engine": "6.2.0-edge.3",
|
|
101
|
+
"@memberjunction/search-engine": "6.2.0-edge.3",
|
|
102
|
+
"@memberjunction/server-extensions-core": "6.2.0-edge.3",
|
|
103
|
+
"@memberjunction/sql-dialect": "6.2.0-edge.3",
|
|
104
|
+
"@memberjunction/sql-parser": "6.2.0-edge.3",
|
|
105
|
+
"@memberjunction/sqlserver-dataprovider": "6.2.0-edge.3",
|
|
106
|
+
"@memberjunction/storage": "6.2.0-edge.3",
|
|
107
|
+
"@memberjunction/tag-engine": "6.2.0-edge.3",
|
|
108
|
+
"@memberjunction/tag-engine-base": "6.2.0-edge.3",
|
|
109
|
+
"@memberjunction/task-graph": "6.2.0-edge.3",
|
|
110
|
+
"@memberjunction/templates": "6.2.0-edge.3",
|
|
111
|
+
"@memberjunction/testing-engine": "6.2.0-edge.3",
|
|
112
|
+
"@memberjunction/testing-engine-base": "6.2.0-edge.3",
|
|
113
|
+
"@memberjunction/version-history": "6.2.0-edge.3",
|
|
114
|
+
"@memberjunction/work-queue-engine": "6.2.0-edge.3",
|
|
113
115
|
"@octokit/auth-app": "^7.1.5",
|
|
114
116
|
"@octokit/rest": "^21.1.1",
|
|
115
117
|
"@types/compression": "^1.8.1",
|
|
@@ -148,6 +150,7 @@
|
|
|
148
150
|
"zod": "^3.25.0"
|
|
149
151
|
},
|
|
150
152
|
"devDependencies": {
|
|
153
|
+
"@memberjunction/conversations-runtime": "6.2.0-edge.3",
|
|
151
154
|
"@types/express": "^5.0.6",
|
|
152
155
|
"pkgroll": "2.23.0",
|
|
153
156
|
"rimraf": "6.1.2",
|
|
@@ -60,20 +60,15 @@ function stubMetadata(): void {
|
|
|
60
60
|
|
|
61
61
|
describe('AdhocQueryResolver source-shape contract', () => {
|
|
62
62
|
|
|
63
|
-
it('Bug #2: AdhocQueryResolver must
|
|
63
|
+
it('Bug #2: AdhocQueryResolver must hand the SQL to the provider ad-hoc path, authorizing the rendered SQL first', () => {
|
|
64
64
|
const src = readResolverSource();
|
|
65
|
-
//
|
|
66
|
-
//
|
|
67
|
-
// a partial subset.
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
expect(
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
it('Bug #2: AdhocQueryResolver must call RenderPipeline.Run() somewhere (currently does not)', () => {
|
|
74
|
-
const src = readResolverSource();
|
|
75
|
-
const callsRenderPipelineRun = /\bRenderPipeline\.Run\s*\(/.test(src);
|
|
76
|
-
expect(callsRenderPipelineRun).toBe(true);
|
|
65
|
+
// Composition, comment removal, the single-read rule and the row cap all happen in the
|
|
66
|
+
// provider's ad-hoc path (RenderPipeline), shared with in-process callers. The resolver must
|
|
67
|
+
// delegate there rather than re-implement a partial subset.
|
|
68
|
+
expect(/\.RunQuery\(\{[\s\S]*SQL: input\.SQL/.test(src)).toBe(true);
|
|
69
|
+
// It renders only to authorize what will be read, never to run it.
|
|
70
|
+
expect(/RenderPipeline\.Run\(/.test(src)).toBe(true);
|
|
71
|
+
expect(/assertFullQueryUsesReadableEntityViews\(rendered\.Trace\.AfterTemplates/.test(src)).toBe(true);
|
|
77
72
|
});
|
|
78
73
|
|
|
79
74
|
it('Bug #3: AdhocQueryResolver must NOT contain the manual `SELECT TOP N * FROM (...)` wrap', () => {
|
|
@@ -126,29 +121,13 @@ ORDER BY JoinYear DESC`;
|
|
|
126
121
|
// success/failure, the resolver should never hand a string containing
|
|
127
122
|
// "{{query:" to SQL Server.
|
|
128
123
|
//
|
|
129
|
-
// We encode this as a contract on the resolver source: it must
|
|
130
|
-
//
|
|
131
|
-
//
|
|
132
|
-
// "{{query:" must not reach `request.query(...)`.
|
|
124
|
+
// We encode this as a contract on the resolver source: it must not execute SQL itself.
|
|
125
|
+
// It hands input.SQL to the read-only provider's ad-hoc path, which renders it through
|
|
126
|
+
// RenderPipeline (resolving composition tokens) before anything reaches the database.
|
|
133
127
|
const src = readResolverSource();
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
// call above; here we additionally require that input.SQL flows
|
|
138
|
-
// through RenderPipeline.Run rather than directly to request.query.
|
|
139
|
-
//
|
|
140
|
-
// The current code contains `request.query(executableSql)` where
|
|
141
|
-
// `executableSql` is derived from input.SQL via a string concat —
|
|
142
|
-
// bypassing the pipeline entirely.
|
|
143
|
-
const directlyExecutesInputSQL = /request\.query\s*\(\s*input\.SQL\s*\)/.test(src);
|
|
144
|
-
expect(directlyExecutesInputSQL).toBe(false);
|
|
145
|
-
|
|
146
|
-
// And — the executable string must be derived from a pipeline result,
|
|
147
|
-
// not from an inline template literal that just concatenates input.SQL.
|
|
148
|
-
// Heuristic: the file should reference `FinalSQL` (the pipeline's
|
|
149
|
-
// output field) somewhere — this is what gets sent to the DB.
|
|
150
|
-
const referencesFinalSQL = /\bFinalSQL\b/.test(src);
|
|
151
|
-
expect(referencesFinalSQL).toBe(true);
|
|
128
|
+
const executesSQLItself = /request\.query\s*\(|\.ExecuteSQL\s*\(|new sql\.Request/.test(src);
|
|
129
|
+
expect(executesSQLItself).toBe(false);
|
|
130
|
+
expect(/\.RunQuery\(\{[\s\S]*SQL: input\.SQL/.test(src)).toBe(true);
|
|
152
131
|
});
|
|
153
132
|
});
|
|
154
133
|
|
|
@@ -79,9 +79,13 @@ describe('AdhocQueryResolver pagination source-shape contract', () => {
|
|
|
79
79
|
expect(/TotalRowCount:\s*recordset\.length/.test(src)).toBe(false);
|
|
80
80
|
});
|
|
81
81
|
|
|
82
|
-
it('must
|
|
82
|
+
it('must page through the read-only provider, passing MaxRows, StartRow and the timeout', () => {
|
|
83
83
|
const src = readResolverSource();
|
|
84
|
-
|
|
84
|
+
// The provider's ad-hoc path renders, pages in the database and counts; the resolver
|
|
85
|
+
// must hand it the paging inputs rather than run SQL itself.
|
|
86
|
+
expect(/GetReadOnlyProvider\(/.test(src)).toBe(true);
|
|
87
|
+
expect(/\.RunQuery\(\{[\s\S]*SQL: input\.SQL[\s\S]*MaxRows: input\.MaxRows[\s\S]*StartRow: startRow[\s\S]*TimeoutSeconds/.test(src)).toBe(true);
|
|
88
|
+
expect(/from 'mssql'|new sql\.Request/.test(src)).toBe(false);
|
|
85
89
|
});
|
|
86
90
|
});
|
|
87
91
|
|
|
@@ -71,12 +71,12 @@ describe('AdhocQueryResolver scope guard placement', () => {
|
|
|
71
71
|
expect(/\bIsScopeLimitedPrincipal\s*\(/.test(src)).toBe(true);
|
|
72
72
|
});
|
|
73
73
|
|
|
74
|
-
it('refuses the principal BEFORE acquiring
|
|
74
|
+
it('refuses the principal BEFORE acquiring the read-only provider', () => {
|
|
75
75
|
// Authorization must gate the work, not run alongside it: if the guard landed after
|
|
76
|
-
// the
|
|
76
|
+
// the provider were acquired (or the SQL executed), a scope-limited caller would already
|
|
77
77
|
// have reached the database.
|
|
78
78
|
const guardAt = src.indexOf('IsScopeLimitedPrincipal(');
|
|
79
|
-
const dataSourceAt = src.indexOf('
|
|
79
|
+
const dataSourceAt = src.indexOf('GetReadOnlyProvider(');
|
|
80
80
|
expect(guardAt).toBeGreaterThan(-1);
|
|
81
81
|
expect(dataSourceAt).toBeGreaterThan(-1);
|
|
82
82
|
expect(guardAt).toBeLessThan(dataSourceAt);
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pins the status messages RunAIAgentResolver publishes for one run, and shows a host
|
|
3
|
+
* driving the same publisher into ConversationStreaming.
|
|
4
|
+
*
|
|
5
|
+
* The wire assertions are the contract the resolver already published before this class
|
|
6
|
+
* existed: a significant step and not a noise step, streamed text, the partial result,
|
|
7
|
+
* then the completion.
|
|
8
|
+
*/
|
|
9
|
+
import 'reflect-metadata';
|
|
10
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
11
|
+
import type { PubSubEngine } from 'type-graphql';
|
|
12
|
+
|
|
13
|
+
vi.mock('type-graphql', () => {
|
|
14
|
+
const decoratorFactory = (..._args: unknown[]) => (..._decorated: unknown[]) => undefined;
|
|
15
|
+
const exportNames = [
|
|
16
|
+
'Resolver', 'Query', 'Mutation', 'Subscription', 'Arg', 'Args', 'ArgsType', 'Ctx', 'Root',
|
|
17
|
+
'Info', 'Field', 'FieldResolver', 'ObjectType', 'InputType', 'InterfaceType', 'Authorized',
|
|
18
|
+
'UseMiddleware', 'Extensions', 'Directive', 'ID', 'Int', 'Float', 'GraphQLISODateTime',
|
|
19
|
+
'GraphQLTimestamp', 'registerEnumType', 'createMethodDecorator', 'createParamDecorator',
|
|
20
|
+
'buildSchema', 'buildSchemaSync', 'PubSub',
|
|
21
|
+
];
|
|
22
|
+
return Object.fromEntries(exportNames.map((name) => [name, decoratorFactory]));
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
vi.mock('@memberjunction/graphql-dataprovider', () => ({
|
|
26
|
+
GraphQLDataProvider: { Instance: { PushStatusUpdates: vi.fn() } },
|
|
27
|
+
}));
|
|
28
|
+
|
|
29
|
+
import type { ExecuteAgentResult } from '@memberjunction/ai-core-plus';
|
|
30
|
+
import { ConversationStreaming, type IConversationsRuntimeContext } from '@memberjunction/conversations-runtime';
|
|
31
|
+
import { AgentRunStatusPublisher } from '../resolvers/AgentRunStatusPublisher.js';
|
|
32
|
+
import type { UserPayload } from '../types.js';
|
|
33
|
+
|
|
34
|
+
const run = {
|
|
35
|
+
ID: 'run-1',
|
|
36
|
+
ConversationDetailID: 'detail-1',
|
|
37
|
+
ErrorMessage: undefined as string | undefined,
|
|
38
|
+
Steps: [{ StepName: 'Answer' }],
|
|
39
|
+
GetAll: () => ({ ID: 'run-1', ConversationDetailID: 'detail-1', Agent: 'Betty' }),
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
function publisher() {
|
|
43
|
+
const publish = vi.fn().mockResolvedValue(undefined);
|
|
44
|
+
const pubSub = { publish } as unknown as PubSubEngine;
|
|
45
|
+
const userPayload = { sessionId: 'session-1', userRecord: { ID: 'user-1' } } as UserPayload;
|
|
46
|
+
return { publish, made: new AgentRunStatusPublisher(pubSub, userPayload, 'session-1') };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function envelopes(publish: ReturnType<typeof vi.fn>): Array<Record<string, unknown>> {
|
|
50
|
+
return publish.mock.calls.map((call) => {
|
|
51
|
+
const payload = call[1] as { message: string; sessionId: string; ownerUserId: string };
|
|
52
|
+
expect(payload.sessionId).toBe('session-1');
|
|
53
|
+
expect(payload.ownerUserId).toBe('user-1');
|
|
54
|
+
return JSON.parse(payload.message) as Record<string, unknown>;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
describe('AgentRunStatusPublisher', () => {
|
|
59
|
+
it('publishes the resolver sequence: a significant step, streamed text, the partial result, then the completion', () => {
|
|
60
|
+
const { publish, made } = publisher();
|
|
61
|
+
|
|
62
|
+
made.OnProgress({ step: 'initialization', message: 'noise', metadata: { agentRun: run } });
|
|
63
|
+
made.OnProgress({
|
|
64
|
+
step: 'prompt_execution',
|
|
65
|
+
message: 'Writing',
|
|
66
|
+
percentage: 40,
|
|
67
|
+
metadata: { agentRun: run, agentName: 'Betty' },
|
|
68
|
+
});
|
|
69
|
+
made.OnStreaming({ content: 'Hel', isComplete: false, stepType: 'prompt', kind: 'final-response' });
|
|
70
|
+
made.PublishFinal({ success: true, agentRun: run, payload: { text: 'Hello' } } as ExecuteAgentResult, 'detail-1', '{"text":"Hello"}');
|
|
71
|
+
|
|
72
|
+
const sent = envelopes(publish);
|
|
73
|
+
expect(sent.map((row) => (row.data as { type: string }).type)).toEqual([
|
|
74
|
+
'progress',
|
|
75
|
+
'streaming',
|
|
76
|
+
'partial_result',
|
|
77
|
+
'complete',
|
|
78
|
+
]);
|
|
79
|
+
expect(sent[0].type).toBe('ExecutionProgress');
|
|
80
|
+
expect(sent[0].resolver).toBe('RunAIAgentResolver');
|
|
81
|
+
expect((sent[1].data as { streaming: { content: string } }).streaming.content).toBe('Hel');
|
|
82
|
+
expect((sent[2].data as { partialResult: { currentStep: string } }).partialResult.currentStep).toBe('Answer');
|
|
83
|
+
const completion = sent[3].data as { type: string; conversationDetailId: string; result: string; agentRunId: string };
|
|
84
|
+
expect(completion.conversationDetailId).toBe('detail-1');
|
|
85
|
+
expect(completion.agentRunId).toBe('run-1');
|
|
86
|
+
expect(completion.result).toBe('{"text":"Hello"}');
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('stamps the reply row on the completion when that id differs from the run', () => {
|
|
90
|
+
const { publish, made } = publisher();
|
|
91
|
+
made.PublishFinal(
|
|
92
|
+
{ success: true, agentRun: run, payload: { text: 'Hello' } } as ExecuteAgentResult,
|
|
93
|
+
'reply-9',
|
|
94
|
+
'{"text":"Hello"}',
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
const sent = envelopes(publish);
|
|
98
|
+
const completion = sent[sent.length - 1].data as { type: string; conversationDetailId: string; agentRunId: string };
|
|
99
|
+
expect(completion.type).toBe('complete');
|
|
100
|
+
expect(completion.conversationDetailId).toBe('reply-9');
|
|
101
|
+
expect(completion.agentRunId).toBe('run-1');
|
|
102
|
+
expect(run.ConversationDetailID).toBe('detail-1');
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it('publishes a failure completion when there is no run', () => {
|
|
106
|
+
const { publish, made } = publisher();
|
|
107
|
+
made.PublishFailure('detail-1', 'background blew up');
|
|
108
|
+
|
|
109
|
+
const sent = envelopes(publish);
|
|
110
|
+
expect(sent).toHaveLength(1);
|
|
111
|
+
expect(sent[0].type).toBe('StreamingContent');
|
|
112
|
+
const completion = sent[0].data as {
|
|
113
|
+
type: string;
|
|
114
|
+
agentRunId: string;
|
|
115
|
+
conversationDetailId: string;
|
|
116
|
+
success: boolean;
|
|
117
|
+
errorMessage: string;
|
|
118
|
+
result: string;
|
|
119
|
+
};
|
|
120
|
+
expect(completion.type).toBe('complete');
|
|
121
|
+
expect(completion.agentRunId).toBe('unknown');
|
|
122
|
+
expect(completion.conversationDetailId).toBe('detail-1');
|
|
123
|
+
expect(completion.success).toBe(false);
|
|
124
|
+
expect(completion.errorMessage).toBe('background blew up');
|
|
125
|
+
expect(completion.result).toBe(JSON.stringify({ success: false, errorMessage: 'background blew up' }));
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it('logs when a significant step or a streamed chunk arrives before any run', () => {
|
|
129
|
+
const error = vi.spyOn(console, 'error').mockImplementation(() => undefined);
|
|
130
|
+
const { publish, made } = publisher();
|
|
131
|
+
|
|
132
|
+
made.OnProgress({ step: 'initialization', message: 'noise' });
|
|
133
|
+
made.OnProgress({ step: 'prompt_execution', message: 'Writing' });
|
|
134
|
+
made.OnStreaming({ content: 'Hel', isComplete: false });
|
|
135
|
+
|
|
136
|
+
expect(publish).not.toHaveBeenCalled();
|
|
137
|
+
expect(error).toHaveBeenCalledWith('❌ No agent run available for progress callback');
|
|
138
|
+
expect(error).toHaveBeenCalledWith('❌ No agent run available for streaming callback');
|
|
139
|
+
expect(error).toHaveBeenCalledTimes(2);
|
|
140
|
+
error.mockRestore();
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it('routes a host publisher progress and completion to the reply row', async () => {
|
|
144
|
+
const { publish, made } = publisher();
|
|
145
|
+
made.OnProgress({
|
|
146
|
+
step: 'action_execution',
|
|
147
|
+
message: 'Looking',
|
|
148
|
+
percentage: 10,
|
|
149
|
+
metadata: { agentRun: run },
|
|
150
|
+
});
|
|
151
|
+
made.PublishFinal({ success: true, agentRun: run } as ExecuteAgentResult, 'detail-1', '{"ok":true}');
|
|
152
|
+
|
|
153
|
+
const streaming = new ConversationStreaming({
|
|
154
|
+
Notification: { Notify: vi.fn() },
|
|
155
|
+
Tasks: { RemoveByAgentRunId: vi.fn().mockReturnValue(false) },
|
|
156
|
+
} as IConversationsRuntimeContext);
|
|
157
|
+
const onReply = vi.fn();
|
|
158
|
+
streaming.registerMessageCallback('detail-1', onReply);
|
|
159
|
+
const completions: Array<{ conversationDetailId: string; agentRunId: string }> = [];
|
|
160
|
+
streaming.CompletionEvents$.subscribe((event) => completions.push(event));
|
|
161
|
+
|
|
162
|
+
const deliver = streaming as unknown as {
|
|
163
|
+
handlePushStatusUpdate(status: unknown): Promise<void>;
|
|
164
|
+
};
|
|
165
|
+
for (const message of envelopes(publish)) {
|
|
166
|
+
await deliver.handlePushStatusUpdate(message);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
expect(onReply).toHaveBeenCalledOnce();
|
|
170
|
+
expect(onReply.mock.calls[0][0].conversationDetailId).toBe('detail-1');
|
|
171
|
+
expect(onReply.mock.calls[0][0].message).toBe('Looking');
|
|
172
|
+
expect(completions).toEqual([{ conversationDetailId: 'detail-1', agentRunId: 'run-1', success: true, errorMessage: undefined }]);
|
|
173
|
+
expect(streaming.GetRecentCompletion('detail-1')?.agentRunId).toBe('run-1');
|
|
174
|
+
});
|
|
175
|
+
});
|