@memberjunction/server 5.51.0 → 6.1.0-edge.1
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/LICENSE +7 -0
- package/dist/agentSessions/SessionManager.d.ts +22 -1
- package/dist/agentSessions/SessionManager.d.ts.map +1 -1
- package/dist/agentSessions/SessionManager.js +13 -3
- package/dist/agentSessions/SessionManager.js.map +1 -1
- package/dist/auth/actingContextResolver.d.ts +44 -0
- package/dist/auth/actingContextResolver.d.ts.map +1 -0
- package/dist/auth/actingContextResolver.js +18 -0
- package/dist/auth/actingContextResolver.js.map +1 -0
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +1 -0
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/sessionUserClone.d.ts +32 -0
- package/dist/auth/sessionUserClone.d.ts.map +1 -0
- package/dist/auth/sessionUserClone.js +50 -0
- package/dist/auth/sessionUserClone.js.map +1 -0
- package/dist/context.d.ts +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +43 -6
- package/dist/context.js.map +1 -1
- package/dist/generated/generated.d.ts +234 -642
- package/dist/generated/generated.d.ts.map +1 -1
- package/dist/generated/generated.js +1277 -3755
- package/dist/generated/generated.js.map +1 -1
- package/dist/generic/FireAndForgetHeartbeat.d.ts +5 -0
- package/dist/generic/FireAndForgetHeartbeat.d.ts.map +1 -1
- package/dist/generic/FireAndForgetHeartbeat.js +5 -4
- package/dist/generic/FireAndForgetHeartbeat.js.map +1 -1
- package/dist/generic/PushStatusResolver.d.ts +58 -0
- package/dist/generic/PushStatusResolver.d.ts.map +1 -1
- package/dist/generic/PushStatusResolver.js +42 -3
- package/dist/generic/PushStatusResolver.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +9 -0
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +31 -13
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -4
- package/dist/index.js.map +1 -1
- package/dist/multiTenancy/index.d.ts +19 -0
- package/dist/multiTenancy/index.d.ts.map +1 -1
- package/dist/multiTenancy/index.js +82 -5
- package/dist/multiTenancy/index.js.map +1 -1
- package/dist/resolvers/ActionResolver.d.ts.map +1 -1
- package/dist/resolvers/ActionResolver.js +12 -5
- package/dist/resolvers/ActionResolver.js.map +1 -1
- package/dist/resolvers/MCPResolver.d.ts.map +1 -1
- package/dist/resolvers/MCPResolver.js +13 -16
- package/dist/resolvers/MCPResolver.js.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +15 -14
- package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.js +19 -26
- package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +30 -40
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunTestResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTestResolver.js +90 -112
- package/dist/resolvers/RunTestResolver.js.map +1 -1
- package/dist/resolvers/SearchKnowledgeResolver.js +3 -3
- package/dist/resolvers/SearchKnowledgeResolver.js.map +1 -1
- package/dist/resolvers/SearchKnowledgeStreamResolver.js +2 -2
- package/dist/resolvers/SearchKnowledgeStreamResolver.js.map +1 -1
- package/dist/resolvers/TaskGraphFrameResolver.d.ts +85 -0
- package/dist/resolvers/TaskGraphFrameResolver.d.ts.map +1 -0
- package/dist/resolvers/TaskGraphFrameResolver.js +163 -0
- package/dist/resolvers/TaskGraphFrameResolver.js.map +1 -0
- package/dist/resolvers/VersionHistoryResolver.d.ts.map +1 -1
- package/dist/resolvers/VersionHistoryResolver.js +8 -12
- package/dist/resolvers/VersionHistoryResolver.js.map +1 -1
- package/dist/rest/RESTEndpointHandler.d.ts +0 -4
- package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
- package/dist/rest/RESTEndpointHandler.js +1 -15
- package/dist/rest/RESTEndpointHandler.js.map +1 -1
- package/dist/services/StartTaskGraphDispatcher.d.ts +33 -0
- package/dist/services/StartTaskGraphDispatcher.d.ts.map +1 -0
- package/dist/services/StartTaskGraphDispatcher.js +31 -0
- package/dist/services/StartTaskGraphDispatcher.js.map +1 -0
- package/dist/services/TaskGraphAgentRunner.d.ts +15 -0
- package/dist/services/TaskGraphAgentRunner.d.ts.map +1 -0
- package/dist/services/TaskGraphAgentRunner.js +74 -0
- package/dist/services/TaskGraphAgentRunner.js.map +1 -0
- package/dist/services/TaskGraphContinuationDeliverer.d.ts +70 -0
- package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -0
- package/dist/services/TaskGraphContinuationDeliverer.js +162 -0
- package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -0
- package/dist/services/TaskGraphProviderFactory.d.ts +39 -0
- package/dist/services/TaskGraphProviderFactory.d.ts.map +1 -0
- package/dist/services/TaskGraphProviderFactory.js +28 -0
- package/dist/services/TaskGraphProviderFactory.js.map +1 -0
- package/package.json +103 -100
- package/src/__tests__/RealtimeBridgeResolver.test.ts +6 -0
- package/src/__tests__/SessionManager.test.ts +44 -0
- package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +249 -0
- package/src/__tests__/TaskGraphFrameResolver.test.ts +136 -0
- package/src/__tests__/multiTenancy.security.test.ts +254 -22
- package/src/__tests__/multiTenancy.test.ts +22 -0
- package/src/__tests__/pushStatusResolver.filter.test.ts +56 -0
- package/src/__tests__/resolverBase.rls.test.ts +4 -0
- package/src/__tests__/search-knowledge-tags.test.ts +74 -6
- package/src/__tests__/sessionUserClone.test.ts +161 -0
- package/src/agentSessions/SessionManager.ts +26 -2
- package/src/auth/actingContextResolver.ts +56 -0
- package/src/auth/index.ts +1 -0
- package/src/auth/sessionUserClone.ts +50 -0
- package/src/context.ts +48 -6
- package/src/generated/generated.ts +899 -2555
- package/src/generic/FireAndForgetHeartbeat.ts +10 -4
- package/src/generic/PushStatusResolver.ts +79 -4
- package/src/generic/ResolverBase.ts +33 -13
- package/src/index.ts +21 -4
- package/src/multiTenancy/index.ts +92 -5
- package/src/resolvers/ActionResolver.ts +15 -7
- package/src/resolvers/MCPResolver.ts +13 -15
- package/src/resolvers/RealtimeClientSessionResolver.ts +15 -13
- package/src/resolvers/RemoteBrowserActionResolver.ts +19 -25
- package/src/resolvers/RunAIAgentResolver.ts +30 -40
- package/src/resolvers/RunTestResolver.ts +90 -112
- package/src/resolvers/SearchKnowledgeResolver.ts +3 -3
- package/src/resolvers/SearchKnowledgeStreamResolver.ts +2 -2
- package/src/resolvers/TaskGraphFrameResolver.ts +160 -0
- package/src/resolvers/VersionHistoryResolver.ts +10 -13
- package/src/rest/RESTEndpointHandler.ts +1 -15
- package/src/services/StartTaskGraphDispatcher.ts +61 -0
- package/src/services/TaskGraphAgentRunner.ts +81 -0
- package/src/services/TaskGraphContinuationDeliverer.ts +181 -0
- package/src/services/TaskGraphProviderFactory.ts +53 -0
- package/dist/resolvers/ReportResolver.d.ts +0 -24
- package/dist/resolvers/ReportResolver.d.ts.map +0 -1
- package/dist/resolvers/ReportResolver.js +0 -190
- package/dist/resolvers/ReportResolver.js.map +0 -1
- package/dist/resolvers/TaskResolver.d.ts +0 -31
- package/dist/resolvers/TaskResolver.d.ts.map +0 -1
- package/dist/resolvers/TaskResolver.js +0 -157
- package/dist/resolvers/TaskResolver.js.map +0 -1
- package/dist/services/TaskOrchestrator.d.ts +0 -130
- package/dist/services/TaskOrchestrator.d.ts.map +0 -1
- package/dist/services/TaskOrchestrator.js +0 -690
- package/dist/services/TaskOrchestrator.js.map +0 -1
- package/src/resolvers/ReportResolver.ts +0 -157
- package/src/resolvers/TaskResolver.ts +0 -148
- package/src/services/TaskOrchestrator.ts +0 -873
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/server",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.1.0-edge.1",
|
|
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",
|
|
@@ -14,107 +14,100 @@
|
|
|
14
14
|
"exports": {
|
|
15
15
|
".": "./dist/index.js"
|
|
16
16
|
},
|
|
17
|
-
"scripts": {
|
|
18
|
-
"build": "tsc && tsc-alias -f",
|
|
19
|
-
"bundle": "tsc -noEmit && pkgroll --sourcemap --minify",
|
|
20
|
-
"watch": "tsc -w",
|
|
21
|
-
"test": "vitest run",
|
|
22
|
-
"test:watch": "vitest",
|
|
23
|
-
"test:coverage": "vitest run --coverage"
|
|
24
|
-
},
|
|
25
17
|
"dependencies": {
|
|
26
18
|
"@apollo/server": "^5.0.0",
|
|
27
19
|
"@as-integrations/express5": "^1.0.0",
|
|
28
|
-
"@graphql-tools/schema": "
|
|
20
|
+
"@graphql-tools/schema": "^10.0.38",
|
|
29
21
|
"@graphql-tools/utils": "^11.0.0",
|
|
30
|
-
"@memberjunction/actions": "
|
|
31
|
-
"@memberjunction/actions-apollo": "
|
|
32
|
-
"@memberjunction/actions-base": "
|
|
33
|
-
"@memberjunction/actions-bizapps-accounting": "
|
|
34
|
-
"@memberjunction/actions-bizapps-crm": "
|
|
35
|
-
"@memberjunction/actions-bizapps-formbuilders": "
|
|
36
|
-
"@memberjunction/actions-bizapps-lms": "
|
|
37
|
-
"@memberjunction/actions-bizapps-social": "
|
|
38
|
-
"@memberjunction/ai": "
|
|
39
|
-
"@memberjunction/ai-agent-manager": "
|
|
40
|
-
"@memberjunction/ai-agent-manager-actions": "
|
|
41
|
-
"@memberjunction/ai-agents": "
|
|
42
|
-
"@memberjunction/ai-bridge-base": "
|
|
43
|
-
"@memberjunction/ai-bridge-ringcentral": "
|
|
44
|
-
"@memberjunction/ai-bridge-server": "
|
|
45
|
-
"@memberjunction/ai-bridge-teams": "
|
|
46
|
-
"@memberjunction/ai-bridge-twilio": "
|
|
47
|
-
"@memberjunction/ai-bridge-vonage": "
|
|
48
|
-
"@memberjunction/ai-core-plus": "
|
|
49
|
-
"@memberjunction/ai-engine-base": "
|
|
50
|
-
"@memberjunction/ai-mcp-client": "
|
|
51
|
-
"@memberjunction/ai-prompts": "
|
|
52
|
-
"@memberjunction/ai-provider-bundle": "
|
|
53
|
-
"@memberjunction/ai-vector-sync": "
|
|
54
|
-
"@memberjunction/ai-vectordb": "
|
|
55
|
-
"@memberjunction/ai-vectors-pinecone": "
|
|
56
|
-
"@memberjunction/aiengine": "
|
|
57
|
-
"@memberjunction/api-keys": "
|
|
58
|
-
"@memberjunction/auth-providers": "
|
|
59
|
-
"@memberjunction/clustering-engine": "
|
|
60
|
-
"@memberjunction/codegen-lib": "
|
|
61
|
-
"@memberjunction/communication-engine": "
|
|
62
|
-
"@memberjunction/communication-ms-graph": "
|
|
63
|
-
"@memberjunction/communication-sendgrid": "
|
|
64
|
-
"@memberjunction/communication-types": "
|
|
65
|
-
"@memberjunction/component-registry-client-sdk": "
|
|
66
|
-
"@memberjunction/computer-use": "
|
|
67
|
-
"@memberjunction/computer-use-engine": "
|
|
68
|
-
"@memberjunction/config": "
|
|
69
|
-
"@memberjunction/core": "
|
|
70
|
-
"@memberjunction/core-actions": "
|
|
71
|
-
"@memberjunction/core-entities": "
|
|
72
|
-
"@memberjunction/core-entities-server": "
|
|
73
|
-
"@memberjunction/credentials": "
|
|
74
|
-
"@memberjunction/data-context": "
|
|
75
|
-
"@memberjunction/data-context-server": "
|
|
76
|
-
"@memberjunction/doc-utils": "
|
|
77
|
-
"@memberjunction/encryption": "
|
|
78
|
-
"@memberjunction/entity-communications-base": "
|
|
79
|
-
"@memberjunction/entity-communications-server": "
|
|
80
|
-
"@memberjunction/esignature": "
|
|
81
|
-
"@memberjunction/external-change-detection": "
|
|
82
|
-
"@memberjunction/generic-database-provider": "
|
|
83
|
-
"@memberjunction/global": "
|
|
84
|
-
"@memberjunction/graphql-dataprovider": "
|
|
85
|
-
"@memberjunction/integration-engine": "
|
|
86
|
-
"@memberjunction/integration-engine-base": "
|
|
87
|
-
"@memberjunction/integration-progress-artifacts": "
|
|
88
|
-
"@memberjunction/integration-schema-builder": "
|
|
89
|
-
"@memberjunction/interactive-component-types": "
|
|
90
|
-
"@memberjunction/lists": "
|
|
91
|
-
"@memberjunction/lists-base": "
|
|
92
|
-
"@memberjunction/livekit-room-server": "
|
|
93
|
-
"@memberjunction/notifications": "
|
|
94
|
-
"@memberjunction/postgresql-dataprovider": "
|
|
95
|
-
"@memberjunction/queue": "
|
|
96
|
-
"@memberjunction/record-comparison": "
|
|
97
|
-
"@memberjunction/redis-provider": "
|
|
98
|
-
"@memberjunction/remote-browser-base": "
|
|
99
|
-
"@memberjunction/remote-browser-cdp": "
|
|
100
|
-
"@memberjunction/remote-browser-selfhost": "
|
|
101
|
-
"@memberjunction/remote-browser-server": "
|
|
102
|
-
"@memberjunction/scheduling-actions": "
|
|
103
|
-
"@memberjunction/scheduling-base-types": "
|
|
104
|
-
"@memberjunction/scheduling-engine": "
|
|
105
|
-
"@memberjunction/scheduling-engine-base": "
|
|
106
|
-
"@memberjunction/schema-engine": "
|
|
107
|
-
"@memberjunction/search-engine": "
|
|
108
|
-
"@memberjunction/server-extensions-core": "
|
|
109
|
-
"@memberjunction/sql-dialect": "
|
|
110
|
-
"@memberjunction/sqlserver-dataprovider": "
|
|
111
|
-
"@memberjunction/storage": "
|
|
112
|
-
"@memberjunction/tag-engine": "
|
|
113
|
-
"@memberjunction/tag-engine-base": "
|
|
114
|
-
"@memberjunction/
|
|
115
|
-
"@memberjunction/
|
|
116
|
-
"@memberjunction/testing-engine
|
|
117
|
-
"@memberjunction/
|
|
22
|
+
"@memberjunction/actions": "6.1.0-edge.1",
|
|
23
|
+
"@memberjunction/actions-apollo": "6.1.0-edge.1",
|
|
24
|
+
"@memberjunction/actions-base": "6.1.0-edge.1",
|
|
25
|
+
"@memberjunction/actions-bizapps-accounting": "6.1.0-edge.1",
|
|
26
|
+
"@memberjunction/actions-bizapps-crm": "6.1.0-edge.1",
|
|
27
|
+
"@memberjunction/actions-bizapps-formbuilders": "6.1.0-edge.1",
|
|
28
|
+
"@memberjunction/actions-bizapps-lms": "6.1.0-edge.1",
|
|
29
|
+
"@memberjunction/actions-bizapps-social": "6.1.0-edge.1",
|
|
30
|
+
"@memberjunction/ai": "6.1.0-edge.1",
|
|
31
|
+
"@memberjunction/ai-agent-manager": "6.1.0-edge.1",
|
|
32
|
+
"@memberjunction/ai-agent-manager-actions": "6.1.0-edge.1",
|
|
33
|
+
"@memberjunction/ai-agents": "6.1.0-edge.1",
|
|
34
|
+
"@memberjunction/ai-bridge-base": "6.1.0-edge.1",
|
|
35
|
+
"@memberjunction/ai-bridge-ringcentral": "6.1.0-edge.1",
|
|
36
|
+
"@memberjunction/ai-bridge-server": "6.1.0-edge.1",
|
|
37
|
+
"@memberjunction/ai-bridge-teams": "6.1.0-edge.1",
|
|
38
|
+
"@memberjunction/ai-bridge-twilio": "6.1.0-edge.1",
|
|
39
|
+
"@memberjunction/ai-bridge-vonage": "6.1.0-edge.1",
|
|
40
|
+
"@memberjunction/ai-core-plus": "6.1.0-edge.1",
|
|
41
|
+
"@memberjunction/ai-engine-base": "6.1.0-edge.1",
|
|
42
|
+
"@memberjunction/ai-mcp-client": "6.1.0-edge.1",
|
|
43
|
+
"@memberjunction/ai-prompts": "6.1.0-edge.1",
|
|
44
|
+
"@memberjunction/ai-provider-bundle": "6.1.0-edge.1",
|
|
45
|
+
"@memberjunction/ai-vector-sync": "6.1.0-edge.1",
|
|
46
|
+
"@memberjunction/ai-vectordb": "6.1.0-edge.1",
|
|
47
|
+
"@memberjunction/ai-vectors-pinecone": "6.1.0-edge.1",
|
|
48
|
+
"@memberjunction/aiengine": "6.1.0-edge.1",
|
|
49
|
+
"@memberjunction/api-keys": "6.1.0-edge.1",
|
|
50
|
+
"@memberjunction/auth-providers": "6.1.0-edge.1",
|
|
51
|
+
"@memberjunction/clustering-engine": "6.1.0-edge.1",
|
|
52
|
+
"@memberjunction/codegen-lib": "6.1.0-edge.1",
|
|
53
|
+
"@memberjunction/communication-engine": "6.1.0-edge.1",
|
|
54
|
+
"@memberjunction/communication-ms-graph": "6.1.0-edge.1",
|
|
55
|
+
"@memberjunction/communication-sendgrid": "6.1.0-edge.1",
|
|
56
|
+
"@memberjunction/communication-types": "6.1.0-edge.1",
|
|
57
|
+
"@memberjunction/component-registry-client-sdk": "6.1.0-edge.1",
|
|
58
|
+
"@memberjunction/computer-use": "6.1.0-edge.1",
|
|
59
|
+
"@memberjunction/computer-use-engine": "6.1.0-edge.1",
|
|
60
|
+
"@memberjunction/config": "6.1.0-edge.1",
|
|
61
|
+
"@memberjunction/core": "6.1.0-edge.1",
|
|
62
|
+
"@memberjunction/core-actions": "6.1.0-edge.1",
|
|
63
|
+
"@memberjunction/core-entities": "6.1.0-edge.1",
|
|
64
|
+
"@memberjunction/core-entities-server": "6.1.0-edge.1",
|
|
65
|
+
"@memberjunction/credentials": "6.1.0-edge.1",
|
|
66
|
+
"@memberjunction/data-context": "6.1.0-edge.1",
|
|
67
|
+
"@memberjunction/data-context-server": "6.1.0-edge.1",
|
|
68
|
+
"@memberjunction/doc-utils": "6.1.0-edge.1",
|
|
69
|
+
"@memberjunction/encryption": "6.1.0-edge.1",
|
|
70
|
+
"@memberjunction/entity-communications-base": "6.1.0-edge.1",
|
|
71
|
+
"@memberjunction/entity-communications-server": "6.1.0-edge.1",
|
|
72
|
+
"@memberjunction/esignature": "6.1.0-edge.1",
|
|
73
|
+
"@memberjunction/external-change-detection": "6.1.0-edge.1",
|
|
74
|
+
"@memberjunction/generic-database-provider": "6.1.0-edge.1",
|
|
75
|
+
"@memberjunction/global": "6.1.0-edge.1",
|
|
76
|
+
"@memberjunction/graphql-dataprovider": "6.1.0-edge.1",
|
|
77
|
+
"@memberjunction/integration-engine": "6.1.0-edge.1",
|
|
78
|
+
"@memberjunction/integration-engine-base": "6.1.0-edge.1",
|
|
79
|
+
"@memberjunction/integration-progress-artifacts": "6.1.0-edge.1",
|
|
80
|
+
"@memberjunction/integration-schema-builder": "6.1.0-edge.1",
|
|
81
|
+
"@memberjunction/interactive-component-types": "6.1.0-edge.1",
|
|
82
|
+
"@memberjunction/lists": "6.1.0-edge.1",
|
|
83
|
+
"@memberjunction/lists-base": "6.1.0-edge.1",
|
|
84
|
+
"@memberjunction/livekit-room-server": "6.1.0-edge.1",
|
|
85
|
+
"@memberjunction/notifications": "6.1.0-edge.1",
|
|
86
|
+
"@memberjunction/postgresql-dataprovider": "6.1.0-edge.1",
|
|
87
|
+
"@memberjunction/queue": "6.1.0-edge.1",
|
|
88
|
+
"@memberjunction/record-comparison": "6.1.0-edge.1",
|
|
89
|
+
"@memberjunction/redis-provider": "6.1.0-edge.1",
|
|
90
|
+
"@memberjunction/remote-browser-base": "6.1.0-edge.1",
|
|
91
|
+
"@memberjunction/remote-browser-cdp": "6.1.0-edge.1",
|
|
92
|
+
"@memberjunction/remote-browser-selfhost": "6.1.0-edge.1",
|
|
93
|
+
"@memberjunction/remote-browser-server": "6.1.0-edge.1",
|
|
94
|
+
"@memberjunction/scheduling-actions": "6.1.0-edge.1",
|
|
95
|
+
"@memberjunction/scheduling-base-types": "6.1.0-edge.1",
|
|
96
|
+
"@memberjunction/scheduling-engine": "6.1.0-edge.1",
|
|
97
|
+
"@memberjunction/scheduling-engine-base": "6.1.0-edge.1",
|
|
98
|
+
"@memberjunction/schema-engine": "6.1.0-edge.1",
|
|
99
|
+
"@memberjunction/search-engine": "6.1.0-edge.1",
|
|
100
|
+
"@memberjunction/server-extensions-core": "6.1.0-edge.1",
|
|
101
|
+
"@memberjunction/sql-dialect": "6.1.0-edge.1",
|
|
102
|
+
"@memberjunction/sqlserver-dataprovider": "6.1.0-edge.1",
|
|
103
|
+
"@memberjunction/storage": "6.1.0-edge.1",
|
|
104
|
+
"@memberjunction/tag-engine": "6.1.0-edge.1",
|
|
105
|
+
"@memberjunction/tag-engine-base": "6.1.0-edge.1",
|
|
106
|
+
"@memberjunction/task-graph": "6.1.0-edge.1",
|
|
107
|
+
"@memberjunction/templates": "6.1.0-edge.1",
|
|
108
|
+
"@memberjunction/testing-engine": "6.1.0-edge.1",
|
|
109
|
+
"@memberjunction/testing-engine-base": "6.1.0-edge.1",
|
|
110
|
+
"@memberjunction/version-history": "6.1.0-edge.1",
|
|
118
111
|
"@octokit/auth-app": "^7.1.5",
|
|
119
112
|
"@octokit/rest": "^21.1.1",
|
|
120
113
|
"@types/compression": "^1.8.1",
|
|
@@ -154,13 +147,23 @@
|
|
|
154
147
|
"zod": "^3.25.0"
|
|
155
148
|
},
|
|
156
149
|
"devDependencies": {
|
|
157
|
-
"@types/express": "^
|
|
150
|
+
"@types/express": "^5.0.6",
|
|
158
151
|
"pkgroll": "2.23.0",
|
|
152
|
+
"rimraf": "6.1.2",
|
|
159
153
|
"typescript": "^5.9.3",
|
|
160
154
|
"vitest": "^3.1.1"
|
|
161
155
|
},
|
|
162
156
|
"repository": {
|
|
163
157
|
"type": "git",
|
|
164
158
|
"url": "https://github.com/MemberJunction/MJ"
|
|
159
|
+
},
|
|
160
|
+
"scripts": {
|
|
161
|
+
"prebuild": "rimraf dist",
|
|
162
|
+
"build": "tsc && tsc-alias -f",
|
|
163
|
+
"bundle": "tsc -noEmit && pkgroll --sourcemap --minify",
|
|
164
|
+
"watch": "tsc -w",
|
|
165
|
+
"test": "vitest run",
|
|
166
|
+
"test:watch": "vitest",
|
|
167
|
+
"test:coverage": "vitest run --coverage"
|
|
165
168
|
}
|
|
166
|
-
}
|
|
169
|
+
}
|
|
@@ -31,6 +31,12 @@ vi.mock('@memberjunction/ai-agents', () => ({
|
|
|
31
31
|
FinalizeBridgeCoAgentRuns: vi.fn(),
|
|
32
32
|
GetRealtimeModelVoices: vi.fn(),
|
|
33
33
|
CreateBridgeRoomTranscriptSink: vi.fn(),
|
|
34
|
+
// SessionManager's constructor defaults to `new RealtimeClientSessionService()` when this resolver
|
|
35
|
+
// doesn't inject one (it never finalizes client-direct co-agent runs itself) — the mock must still
|
|
36
|
+
// export the class so that default construction doesn't throw.
|
|
37
|
+
RealtimeClientSessionService: class {
|
|
38
|
+
FinalizeCoAgentRun = vi.fn(async () => undefined);
|
|
39
|
+
},
|
|
34
40
|
}));
|
|
35
41
|
|
|
36
42
|
// Mock the meeting-recording registration so the thin resolver is tested in isolation (no MJStorage /
|
|
@@ -321,6 +321,50 @@ describe('SessionManager.CloseSession', () => {
|
|
|
321
321
|
expect(finalizeCoAgentRunMock).not.toHaveBeenCalled();
|
|
322
322
|
});
|
|
323
323
|
|
|
324
|
+
it('finalizes through an INJECTED RealtimeClientSessionService instance, not the default one', async () => {
|
|
325
|
+
// Regression test for the wrong-instance leak: a caller (e.g. RealtimeClientSessionResolver)
|
|
326
|
+
// that created the session's co-agent AIPromptRun through its OWN RealtimeClientSessionService
|
|
327
|
+
// must have CloseSession finalize through that SAME instance — otherwise the service's internal
|
|
328
|
+
// per-run write-chain cleanup (finalizePromptRun -> promptRunWriteChains.Delete) silently no-ops
|
|
329
|
+
// on a throwaway instance while the real accumulated state on the caller's instance never clears.
|
|
330
|
+
const injectedFinalizeMock = vi.fn(async () => undefined);
|
|
331
|
+
const injectedService = { FinalizeCoAgentRun: injectedFinalizeMock } as unknown as ConstructorParameters<
|
|
332
|
+
typeof SessionManager
|
|
333
|
+
>[0];
|
|
334
|
+
const session = makeSessionEntity({
|
|
335
|
+
ID: 'session-injected',
|
|
336
|
+
Status: 'Active',
|
|
337
|
+
Config_: JSON.stringify({ targetAgentID: 't1', coAgentRunID: 'co-run-injected', promptRunID: 'prompt-run-injected' }),
|
|
338
|
+
});
|
|
339
|
+
const { provider } = makeProvider(() => session);
|
|
340
|
+
const mgr = new SessionManager(injectedService);
|
|
341
|
+
const user = makeUser();
|
|
342
|
+
|
|
343
|
+
const ok = await mgr.CloseSession('session-injected', user, provider);
|
|
344
|
+
|
|
345
|
+
expect(ok).toBe(true);
|
|
346
|
+
// The finalize call landed on the INJECTED instance, never the module-default one.
|
|
347
|
+
expect(injectedFinalizeMock).toHaveBeenCalledTimes(1);
|
|
348
|
+
expect(injectedFinalizeMock).toHaveBeenCalledWith('co-run-injected', 'prompt-run-injected', user, provider, true, null);
|
|
349
|
+
expect(finalizeCoAgentRunMock).not.toHaveBeenCalled();
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
it('defaults to its own RealtimeClientSessionService instance when none is injected (back-compat)', async () => {
|
|
353
|
+
const session = makeSessionEntity({
|
|
354
|
+
ID: 'session-default-svc',
|
|
355
|
+
Status: 'Active',
|
|
356
|
+
Config_: JSON.stringify({ targetAgentID: 't1', coAgentRunID: 'co-run-default', promptRunID: 'prompt-run-default' }),
|
|
357
|
+
});
|
|
358
|
+
const { provider } = makeProvider(() => session);
|
|
359
|
+
const mgr = new SessionManager(); // no injection — e.g. SessionJanitor, telephony services
|
|
360
|
+
const user = makeUser();
|
|
361
|
+
|
|
362
|
+
const ok = await mgr.CloseSession('session-default-svc', user, provider);
|
|
363
|
+
|
|
364
|
+
expect(ok).toBe(true);
|
|
365
|
+
expect(finalizeCoAgentRunMock).toHaveBeenCalledWith('co-run-default', 'prompt-run-default', user, provider, true, null);
|
|
366
|
+
});
|
|
367
|
+
|
|
324
368
|
it('stamps CloseReason = Explicit by default (untouched call sites get the right reason)', async () => {
|
|
325
369
|
const session = makeSessionEntity({ ID: 'session-default', Status: 'Active' });
|
|
326
370
|
const { provider } = makeProvider(() => session);
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for `TaskGraphContinuationDeliverer`.
|
|
3
|
+
*
|
|
4
|
+
* The gap this closes: the dispatcher was constructed with no deliverer at all, so a graph that
|
|
5
|
+
* finished logged its outcome, marked itself delivered, and said nothing to the conversation that
|
|
6
|
+
* asked for it — durable execution nobody hears about.
|
|
7
|
+
*
|
|
8
|
+
* The contract that matters most is that it **never throws**. The dispatcher calls this inside the
|
|
9
|
+
* compare-and-swap that marks a completion delivered; an escaping error would either abort that
|
|
10
|
+
* guard or leave the graph looking undelivered and re-notifying on every later sweep.
|
|
11
|
+
*/
|
|
12
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
13
|
+
|
|
14
|
+
vi.mock('@memberjunction/core', () => ({
|
|
15
|
+
LogError: vi.fn(),
|
|
16
|
+
LogStatus: vi.fn(),
|
|
17
|
+
}));
|
|
18
|
+
|
|
19
|
+
vi.mock('@memberjunction/core-entities', () => ({
|
|
20
|
+
MJConversationDetailEntity: class {},
|
|
21
|
+
MJAIAgentRunEntity: class {},
|
|
22
|
+
}));
|
|
23
|
+
|
|
24
|
+
vi.mock('@memberjunction/ai-core-plus', () => ({ MJAIAgentEntityExtended: class {} }));
|
|
25
|
+
vi.mock('@memberjunction/ai', () => ({ ChatMessageRole: { user: 'user' } }));
|
|
26
|
+
|
|
27
|
+
const runAgent = vi.fn().mockResolvedValue({ success: true });
|
|
28
|
+
vi.mock('@memberjunction/ai-agents', () => ({
|
|
29
|
+
AgentRunner: class { RunAgent = runAgent; },
|
|
30
|
+
}));
|
|
31
|
+
|
|
32
|
+
import { TaskGraphContinuationDeliverer } from '../services/TaskGraphContinuationDeliverer';
|
|
33
|
+
import type { TaskContinuationParams } from '@memberjunction/task-graph';
|
|
34
|
+
import type { UserInfo } from '@memberjunction/core';
|
|
35
|
+
|
|
36
|
+
/** A conversation-detail row that can be loaded (the source) and saved (the reply). */
|
|
37
|
+
function detailRow(over: Partial<{ loads: boolean; saves: boolean; conversationID: string }> = {}) {
|
|
38
|
+
const { loads = true, saves = true, conversationID = 'conv-1' } = over;
|
|
39
|
+
return {
|
|
40
|
+
ConversationID: conversationID,
|
|
41
|
+
Role: '', Status: '', HiddenToUser: true, Message: '',
|
|
42
|
+
NewRecord: vi.fn(),
|
|
43
|
+
Load: vi.fn().mockResolvedValue(loads),
|
|
44
|
+
Save: vi.fn().mockResolvedValue(saves),
|
|
45
|
+
LatestResult: { CompleteMessage: 'FK violation' },
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function harness(over: Parameters<typeof detailRow>[0] = {}) {
|
|
50
|
+
const rows: ReturnType<typeof detailRow>[] = [];
|
|
51
|
+
const provider = {
|
|
52
|
+
GetEntityObject: vi.fn().mockImplementation(async () => {
|
|
53
|
+
const row = detailRow(over);
|
|
54
|
+
rows.push(row);
|
|
55
|
+
return row;
|
|
56
|
+
}),
|
|
57
|
+
};
|
|
58
|
+
const providerFactory = { CreateProvider: vi.fn().mockResolvedValue(provider) };
|
|
59
|
+
const deliverer = new TaskGraphContinuationDeliverer(
|
|
60
|
+
providerFactory as never,
|
|
61
|
+
{ ID: 'user-1' } as UserInfo,
|
|
62
|
+
);
|
|
63
|
+
// First row is the source detail (Load), second is the reply (Save).
|
|
64
|
+
return { deliverer, providerFactory, provider, rows, reply: () => rows[1] };
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const params = (over: Partial<TaskContinuationParams> = {}): TaskContinuationParams => ({
|
|
68
|
+
ParentTaskID: 'parent-1',
|
|
69
|
+
WorkflowName: 'Weekly digest',
|
|
70
|
+
ConversationDetailID: 'detail-1',
|
|
71
|
+
SubmittedByAgentRunID: 'run-1',
|
|
72
|
+
ReinvokeDepth: 0,
|
|
73
|
+
Tasks: [
|
|
74
|
+
{ TaskID: 't1', Name: 'Gather', Status: 'Complete', Summary: '412 rows' },
|
|
75
|
+
{ TaskID: 't2', Name: 'Summarize', Status: 'Complete' },
|
|
76
|
+
],
|
|
77
|
+
Summary: '2 of 2 steps completed.',
|
|
78
|
+
...over,
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
beforeEach(() => vi.clearAllMocks());
|
|
82
|
+
|
|
83
|
+
describe('posting the outcome', () => {
|
|
84
|
+
it('writes an AI-role message into the graph\'s conversation', async () => {
|
|
85
|
+
const h = harness();
|
|
86
|
+
await h.deliverer.PostMessage(params());
|
|
87
|
+
|
|
88
|
+
const reply = h.reply();
|
|
89
|
+
expect(reply.Save).toHaveBeenCalled();
|
|
90
|
+
expect(reply.ConversationID).toBe('conv-1');
|
|
91
|
+
expect(reply.Role).toBe('AI');
|
|
92
|
+
expect(reply.Status).toBe('Complete');
|
|
93
|
+
expect(reply.HiddenToUser).toBe(false);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it('names the workflow and carries the roll-up', async () => {
|
|
97
|
+
const h = harness();
|
|
98
|
+
await h.deliverer.PostMessage(params());
|
|
99
|
+
expect(h.reply().Message).toContain('Weekly digest');
|
|
100
|
+
expect(h.reply().Message).toContain('2 of 2 steps completed.');
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it('lists each step, not just an aggregate status', async () => {
|
|
104
|
+
// A graph where nine of ten steps succeeded is a materially different message from one that
|
|
105
|
+
// failed outright, and the roll-up alone cannot say which step went wrong.
|
|
106
|
+
const h = harness();
|
|
107
|
+
await h.deliverer.PostMessage(params({
|
|
108
|
+
Tasks: [
|
|
109
|
+
{ TaskID: 't1', Name: 'Gather', Status: 'Complete', Summary: '412 rows' },
|
|
110
|
+
{ TaskID: 't2', Name: 'Summarize', Status: 'Failed', ErrorMessage: 'model timed out' },
|
|
111
|
+
],
|
|
112
|
+
}));
|
|
113
|
+
const message = h.reply().Message;
|
|
114
|
+
expect(message).toContain('Gather');
|
|
115
|
+
expect(message).toContain('412 rows');
|
|
116
|
+
expect(message).toContain('Summarize');
|
|
117
|
+
expect(message).toContain('model timed out');
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it('truncates a long graph rather than burying the conversation', async () => {
|
|
121
|
+
const h = harness();
|
|
122
|
+
const many = Array.from({ length: 50 }, (_, i) => ({ TaskID: `t${i}`, Name: `Step ${i}`, Status: 'Complete' }));
|
|
123
|
+
await h.deliverer.PostMessage(params({ Tasks: many }));
|
|
124
|
+
|
|
125
|
+
const message = h.reply().Message;
|
|
126
|
+
expect(message).toContain('Step 0');
|
|
127
|
+
expect(message).not.toContain('Step 49');
|
|
128
|
+
// The count is stated rather than silently dropped — the task rows remain the full record.
|
|
129
|
+
expect(message).toContain('30 more');
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it('mints a fresh provider per delivery', async () => {
|
|
133
|
+
// Deliveries run outside any request and concurrently with task execution; a shared provider
|
|
134
|
+
// would share one transaction scope across unrelated work.
|
|
135
|
+
const h = harness();
|
|
136
|
+
await h.deliverer.PostMessage(params());
|
|
137
|
+
expect(h.providerFactory.CreateProvider).toHaveBeenCalledTimes(1);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
describe('it never throws — the dispatcher marks delivery inside a CAS guard', () => {
|
|
142
|
+
it('does nothing for a headless graph, without treating it as an error', async () => {
|
|
143
|
+
// A graph submitted by a schedule, an entity-change trigger or an API call has no
|
|
144
|
+
// conversation to answer. Most workflows are in this shape.
|
|
145
|
+
const h = harness();
|
|
146
|
+
await expect(h.deliverer.PostMessage(params({ ConversationDetailID: null }))).resolves.toBeUndefined();
|
|
147
|
+
expect(h.providerFactory.CreateProvider).not.toHaveBeenCalled();
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it('survives a conversation detail that will not load', async () => {
|
|
151
|
+
const h = harness({ loads: false });
|
|
152
|
+
await expect(h.deliverer.PostMessage(params())).resolves.toBeUndefined();
|
|
153
|
+
expect(h.rows.length).toBe(1); // never got as far as building a reply
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it('survives a failed save', async () => {
|
|
157
|
+
const h = harness({ saves: false });
|
|
158
|
+
await expect(h.deliverer.PostMessage(params())).resolves.toBeUndefined();
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
it('survives a provider that throws outright', async () => {
|
|
162
|
+
const deliverer = new TaskGraphContinuationDeliverer(
|
|
163
|
+
{ CreateProvider: vi.fn().mockRejectedValue(new Error('pool exhausted')) } as never,
|
|
164
|
+
{ ID: 'user-1' } as UserInfo,
|
|
165
|
+
);
|
|
166
|
+
await expect(deliverer.PostMessage(params())).resolves.toBeUndefined();
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
describe('Reinvoke — restarting the submitting agent', () => {
|
|
171
|
+
/** A provider that hands out loadable agent-run and agent rows, then the reply detail. */
|
|
172
|
+
function reinvokeHarness(over: { runLoads?: boolean; agentLoads?: boolean } = {}) {
|
|
173
|
+
const { runLoads = true, agentLoads = true } = over;
|
|
174
|
+
const rows: Array<Record<string, unknown>> = [];
|
|
175
|
+
let call = 0;
|
|
176
|
+
const provider = {
|
|
177
|
+
GetEntityObject: vi.fn().mockImplementation(async () => {
|
|
178
|
+
call++;
|
|
179
|
+
if (call === 1) {
|
|
180
|
+
const run = { AgentID: 'agent-1', Load: vi.fn().mockResolvedValue(runLoads) };
|
|
181
|
+
rows.push(run);
|
|
182
|
+
return run;
|
|
183
|
+
}
|
|
184
|
+
if (call === 2) {
|
|
185
|
+
const agent = { ID: 'agent-1', Load: vi.fn().mockResolvedValue(agentLoads) };
|
|
186
|
+
rows.push(agent);
|
|
187
|
+
return agent;
|
|
188
|
+
}
|
|
189
|
+
const detail = detailRow();
|
|
190
|
+
rows.push(detail as unknown as Record<string, unknown>);
|
|
191
|
+
return detail;
|
|
192
|
+
}),
|
|
193
|
+
};
|
|
194
|
+
const deliverer = new TaskGraphContinuationDeliverer(
|
|
195
|
+
{ CreateProvider: vi.fn().mockResolvedValue(provider) } as never,
|
|
196
|
+
{ ID: 'user-1' } as UserInfo,
|
|
197
|
+
);
|
|
198
|
+
return { deliverer, provider, rows };
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
it('starts the submitting agent a fresh turn carrying the outcome', async () => {
|
|
202
|
+
const h = reinvokeHarness();
|
|
203
|
+
await h.deliverer.Reinvoke(params());
|
|
204
|
+
|
|
205
|
+
expect(runAgent).toHaveBeenCalledTimes(1);
|
|
206
|
+
const call = runAgent.mock.calls[0][0];
|
|
207
|
+
expect(call.agent.ID).toBe('agent-1');
|
|
208
|
+
expect(call.conversationMessages[0].content).toContain('Weekly digest');
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
it('stamps depth + 1 — the value that makes MAX_REINVOKE_DEPTH real', async () => {
|
|
212
|
+
// Without this the next graph the restarted run submits begins the chain at zero again, and
|
|
213
|
+
// the cap can never fire. It is the whole reason ContinuationDepth exists as a column.
|
|
214
|
+
const h = reinvokeHarness();
|
|
215
|
+
await h.deliverer.Reinvoke(params({ ReinvokeDepth: 3 }));
|
|
216
|
+
expect(runAgent.mock.calls[0][0].continuationDepth).toBe(4);
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
it('starts a chain at 1, not 0 — depth 0 is "not a continuation"', async () => {
|
|
220
|
+
const h = reinvokeHarness();
|
|
221
|
+
await h.deliverer.Reinvoke(params({ ReinvokeDepth: 0 }));
|
|
222
|
+
expect(runAgent.mock.calls[0][0].continuationDepth).toBe(1);
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
it('falls back to posting when the graph records no submitting run', async () => {
|
|
226
|
+
// A schedule- or trigger-started graph has no turn to continue.
|
|
227
|
+
const h = reinvokeHarness();
|
|
228
|
+
await h.deliverer.Reinvoke(params({ SubmittedByAgentRunID: null }));
|
|
229
|
+
expect(runAgent).not.toHaveBeenCalled();
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
it('falls back to posting when the submitting run cannot be loaded', async () => {
|
|
233
|
+
const h = reinvokeHarness({ runLoads: false });
|
|
234
|
+
await h.deliverer.Reinvoke(params());
|
|
235
|
+
expect(runAgent).not.toHaveBeenCalled();
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
it('falls back to posting when the agent cannot be loaded', async () => {
|
|
239
|
+
const h = reinvokeHarness({ agentLoads: false });
|
|
240
|
+
await h.deliverer.Reinvoke(params());
|
|
241
|
+
expect(runAgent).not.toHaveBeenCalled();
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
it('never throws — the dispatcher marks delivery inside a CAS guard', async () => {
|
|
245
|
+
runAgent.mockRejectedValueOnce(new Error('agent exploded'));
|
|
246
|
+
const h = reinvokeHarness();
|
|
247
|
+
await expect(h.deliverer.Reinvoke(params())).resolves.toBeUndefined();
|
|
248
|
+
});
|
|
249
|
+
});
|