@memberjunction/server 5.51.0 → 6.1.0-edge.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/LICENSE +7 -0
  2. package/dist/agentSessions/SessionManager.d.ts +22 -1
  3. package/dist/agentSessions/SessionManager.d.ts.map +1 -1
  4. package/dist/agentSessions/SessionManager.js +13 -3
  5. package/dist/agentSessions/SessionManager.js.map +1 -1
  6. package/dist/auth/actingContextResolver.d.ts +44 -0
  7. package/dist/auth/actingContextResolver.d.ts.map +1 -0
  8. package/dist/auth/actingContextResolver.js +18 -0
  9. package/dist/auth/actingContextResolver.js.map +1 -0
  10. package/dist/auth/index.d.ts +1 -0
  11. package/dist/auth/index.d.ts.map +1 -1
  12. package/dist/auth/index.js +1 -0
  13. package/dist/auth/index.js.map +1 -1
  14. package/dist/auth/sessionUserClone.d.ts +32 -0
  15. package/dist/auth/sessionUserClone.d.ts.map +1 -0
  16. package/dist/auth/sessionUserClone.js +50 -0
  17. package/dist/auth/sessionUserClone.js.map +1 -0
  18. package/dist/context.d.ts +1 -1
  19. package/dist/context.d.ts.map +1 -1
  20. package/dist/context.js +43 -6
  21. package/dist/context.js.map +1 -1
  22. package/dist/generated/generated.d.ts +71 -0
  23. package/dist/generated/generated.d.ts.map +1 -1
  24. package/dist/generated/generated.js +383 -3
  25. package/dist/generated/generated.js.map +1 -1
  26. package/dist/generic/FireAndForgetHeartbeat.d.ts +5 -0
  27. package/dist/generic/FireAndForgetHeartbeat.d.ts.map +1 -1
  28. package/dist/generic/FireAndForgetHeartbeat.js +5 -4
  29. package/dist/generic/FireAndForgetHeartbeat.js.map +1 -1
  30. package/dist/generic/PushStatusResolver.d.ts +58 -0
  31. package/dist/generic/PushStatusResolver.d.ts.map +1 -1
  32. package/dist/generic/PushStatusResolver.js +42 -3
  33. package/dist/generic/PushStatusResolver.js.map +1 -1
  34. package/dist/generic/ResolverBase.d.ts +9 -0
  35. package/dist/generic/ResolverBase.d.ts.map +1 -1
  36. package/dist/generic/ResolverBase.js +31 -13
  37. package/dist/generic/ResolverBase.js.map +1 -1
  38. package/dist/index.d.ts +2 -0
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +4 -2
  41. package/dist/index.js.map +1 -1
  42. package/dist/multiTenancy/index.d.ts +19 -0
  43. package/dist/multiTenancy/index.d.ts.map +1 -1
  44. package/dist/multiTenancy/index.js +82 -5
  45. package/dist/multiTenancy/index.js.map +1 -1
  46. package/dist/resolvers/ActionResolver.d.ts.map +1 -1
  47. package/dist/resolvers/ActionResolver.js +12 -5
  48. package/dist/resolvers/ActionResolver.js.map +1 -1
  49. package/dist/resolvers/MCPResolver.d.ts.map +1 -1
  50. package/dist/resolvers/MCPResolver.js +13 -16
  51. package/dist/resolvers/MCPResolver.js.map +1 -1
  52. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +1 -1
  53. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
  54. package/dist/resolvers/RealtimeClientSessionResolver.js +15 -14
  55. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
  56. package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
  57. package/dist/resolvers/RemoteBrowserActionResolver.js +19 -26
  58. package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
  59. package/dist/resolvers/ReportResolver.d.ts.map +1 -1
  60. package/dist/resolvers/ReportResolver.js +11 -3
  61. package/dist/resolvers/ReportResolver.js.map +1 -1
  62. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  63. package/dist/resolvers/RunAIAgentResolver.js +30 -40
  64. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  65. package/dist/resolvers/RunTestResolver.d.ts.map +1 -1
  66. package/dist/resolvers/RunTestResolver.js +90 -112
  67. package/dist/resolvers/RunTestResolver.js.map +1 -1
  68. package/dist/resolvers/SearchKnowledgeResolver.js +3 -3
  69. package/dist/resolvers/SearchKnowledgeResolver.js.map +1 -1
  70. package/dist/resolvers/SearchKnowledgeStreamResolver.js +2 -2
  71. package/dist/resolvers/SearchKnowledgeStreamResolver.js.map +1 -1
  72. package/dist/resolvers/VersionHistoryResolver.d.ts.map +1 -1
  73. package/dist/resolvers/VersionHistoryResolver.js +8 -12
  74. package/dist/resolvers/VersionHistoryResolver.js.map +1 -1
  75. package/dist/services/TaskOrchestrator.d.ts.map +1 -1
  76. package/dist/services/TaskOrchestrator.js +17 -15
  77. package/dist/services/TaskOrchestrator.js.map +1 -1
  78. package/package.json +100 -100
  79. package/src/__tests__/RealtimeBridgeResolver.test.ts +6 -0
  80. package/src/__tests__/SessionManager.test.ts +44 -0
  81. package/src/__tests__/multiTenancy.security.test.ts +254 -22
  82. package/src/__tests__/multiTenancy.test.ts +22 -0
  83. package/src/__tests__/pushStatusResolver.filter.test.ts +56 -0
  84. package/src/__tests__/resolverBase.rls.test.ts +4 -0
  85. package/src/__tests__/search-knowledge-tags.test.ts +74 -6
  86. package/src/__tests__/sessionUserClone.test.ts +161 -0
  87. package/src/agentSessions/SessionManager.ts +26 -2
  88. package/src/auth/actingContextResolver.ts +56 -0
  89. package/src/auth/index.ts +1 -0
  90. package/src/auth/sessionUserClone.ts +50 -0
  91. package/src/context.ts +48 -6
  92. package/src/generated/generated.ts +276 -3
  93. package/src/generic/FireAndForgetHeartbeat.ts +10 -4
  94. package/src/generic/PushStatusResolver.ts +79 -4
  95. package/src/generic/ResolverBase.ts +33 -13
  96. package/src/index.ts +4 -2
  97. package/src/multiTenancy/index.ts +92 -5
  98. package/src/resolvers/ActionResolver.ts +15 -7
  99. package/src/resolvers/MCPResolver.ts +13 -15
  100. package/src/resolvers/RealtimeClientSessionResolver.ts +15 -13
  101. package/src/resolvers/RemoteBrowserActionResolver.ts +19 -25
  102. package/src/resolvers/ReportResolver.ts +11 -3
  103. package/src/resolvers/RunAIAgentResolver.ts +30 -40
  104. package/src/resolvers/RunTestResolver.ts +90 -112
  105. package/src/resolvers/SearchKnowledgeResolver.ts +3 -3
  106. package/src/resolvers/SearchKnowledgeStreamResolver.ts +2 -2
  107. package/src/resolvers/VersionHistoryResolver.ts +10 -13
  108. package/src/resolvers/__tests__/ReportResolver.test.ts +279 -0
  109. package/src/services/TaskOrchestrator.ts +17 -17
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/server",
3
- "version": "5.51.0",
3
+ "version": "6.1.0-edge.0",
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,99 @@
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": "latest",
20
+ "@graphql-tools/schema": "^10.0.38",
29
21
  "@graphql-tools/utils": "^11.0.0",
30
- "@memberjunction/actions": "5.51.0",
31
- "@memberjunction/actions-apollo": "5.51.0",
32
- "@memberjunction/actions-base": "5.51.0",
33
- "@memberjunction/actions-bizapps-accounting": "5.51.0",
34
- "@memberjunction/actions-bizapps-crm": "5.51.0",
35
- "@memberjunction/actions-bizapps-formbuilders": "5.51.0",
36
- "@memberjunction/actions-bizapps-lms": "5.51.0",
37
- "@memberjunction/actions-bizapps-social": "5.51.0",
38
- "@memberjunction/ai": "5.51.0",
39
- "@memberjunction/ai-agent-manager": "5.51.0",
40
- "@memberjunction/ai-agent-manager-actions": "5.51.0",
41
- "@memberjunction/ai-agents": "5.51.0",
42
- "@memberjunction/ai-bridge-base": "5.51.0",
43
- "@memberjunction/ai-bridge-ringcentral": "5.51.0",
44
- "@memberjunction/ai-bridge-server": "5.51.0",
45
- "@memberjunction/ai-bridge-teams": "5.51.0",
46
- "@memberjunction/ai-bridge-twilio": "5.51.0",
47
- "@memberjunction/ai-bridge-vonage": "5.51.0",
48
- "@memberjunction/ai-core-plus": "5.51.0",
49
- "@memberjunction/ai-engine-base": "5.51.0",
50
- "@memberjunction/ai-mcp-client": "5.51.0",
51
- "@memberjunction/ai-prompts": "5.51.0",
52
- "@memberjunction/ai-provider-bundle": "5.51.0",
53
- "@memberjunction/ai-vector-sync": "5.51.0",
54
- "@memberjunction/ai-vectordb": "5.51.0",
55
- "@memberjunction/ai-vectors-pinecone": "5.51.0",
56
- "@memberjunction/aiengine": "5.51.0",
57
- "@memberjunction/api-keys": "5.51.0",
58
- "@memberjunction/auth-providers": "5.51.0",
59
- "@memberjunction/clustering-engine": "5.51.0",
60
- "@memberjunction/codegen-lib": "5.51.0",
61
- "@memberjunction/communication-engine": "5.51.0",
62
- "@memberjunction/communication-ms-graph": "5.51.0",
63
- "@memberjunction/communication-sendgrid": "5.51.0",
64
- "@memberjunction/communication-types": "5.51.0",
65
- "@memberjunction/component-registry-client-sdk": "5.51.0",
66
- "@memberjunction/computer-use": "5.51.0",
67
- "@memberjunction/computer-use-engine": "5.51.0",
68
- "@memberjunction/config": "5.51.0",
69
- "@memberjunction/core": "5.51.0",
70
- "@memberjunction/core-actions": "5.51.0",
71
- "@memberjunction/core-entities": "5.51.0",
72
- "@memberjunction/core-entities-server": "5.51.0",
73
- "@memberjunction/credentials": "5.51.0",
74
- "@memberjunction/data-context": "5.51.0",
75
- "@memberjunction/data-context-server": "5.51.0",
76
- "@memberjunction/doc-utils": "5.51.0",
77
- "@memberjunction/encryption": "5.51.0",
78
- "@memberjunction/entity-communications-base": "5.51.0",
79
- "@memberjunction/entity-communications-server": "5.51.0",
80
- "@memberjunction/esignature": "5.51.0",
81
- "@memberjunction/external-change-detection": "5.51.0",
82
- "@memberjunction/generic-database-provider": "5.51.0",
83
- "@memberjunction/global": "5.51.0",
84
- "@memberjunction/graphql-dataprovider": "5.51.0",
85
- "@memberjunction/integration-engine": "5.51.0",
86
- "@memberjunction/integration-engine-base": "5.51.0",
87
- "@memberjunction/integration-progress-artifacts": "5.51.0",
88
- "@memberjunction/integration-schema-builder": "5.51.0",
89
- "@memberjunction/interactive-component-types": "5.51.0",
90
- "@memberjunction/lists": "5.51.0",
91
- "@memberjunction/lists-base": "5.51.0",
92
- "@memberjunction/livekit-room-server": "5.51.0",
93
- "@memberjunction/notifications": "5.51.0",
94
- "@memberjunction/postgresql-dataprovider": "5.51.0",
95
- "@memberjunction/queue": "5.51.0",
96
- "@memberjunction/record-comparison": "5.51.0",
97
- "@memberjunction/redis-provider": "5.51.0",
98
- "@memberjunction/remote-browser-base": "5.51.0",
99
- "@memberjunction/remote-browser-cdp": "5.51.0",
100
- "@memberjunction/remote-browser-selfhost": "5.51.0",
101
- "@memberjunction/remote-browser-server": "5.51.0",
102
- "@memberjunction/scheduling-actions": "5.51.0",
103
- "@memberjunction/scheduling-base-types": "5.51.0",
104
- "@memberjunction/scheduling-engine": "5.51.0",
105
- "@memberjunction/scheduling-engine-base": "5.51.0",
106
- "@memberjunction/schema-engine": "5.51.0",
107
- "@memberjunction/search-engine": "5.51.0",
108
- "@memberjunction/server-extensions-core": "5.51.0",
109
- "@memberjunction/sql-dialect": "5.51.0",
110
- "@memberjunction/sqlserver-dataprovider": "5.51.0",
111
- "@memberjunction/storage": "5.51.0",
112
- "@memberjunction/tag-engine": "5.51.0",
113
- "@memberjunction/tag-engine-base": "5.51.0",
114
- "@memberjunction/templates": "5.51.0",
115
- "@memberjunction/testing-engine": "5.51.0",
116
- "@memberjunction/testing-engine-base": "5.51.0",
117
- "@memberjunction/version-history": "5.51.0",
22
+ "@memberjunction/actions": "6.1.0-edge.0",
23
+ "@memberjunction/actions-apollo": "6.1.0-edge.0",
24
+ "@memberjunction/actions-base": "6.1.0-edge.0",
25
+ "@memberjunction/actions-bizapps-accounting": "6.1.0-edge.0",
26
+ "@memberjunction/actions-bizapps-crm": "6.1.0-edge.0",
27
+ "@memberjunction/actions-bizapps-formbuilders": "6.1.0-edge.0",
28
+ "@memberjunction/actions-bizapps-lms": "6.1.0-edge.0",
29
+ "@memberjunction/actions-bizapps-social": "6.1.0-edge.0",
30
+ "@memberjunction/ai": "6.1.0-edge.0",
31
+ "@memberjunction/ai-agent-manager": "6.1.0-edge.0",
32
+ "@memberjunction/ai-agent-manager-actions": "6.1.0-edge.0",
33
+ "@memberjunction/ai-agents": "6.1.0-edge.0",
34
+ "@memberjunction/ai-bridge-base": "6.1.0-edge.0",
35
+ "@memberjunction/ai-bridge-ringcentral": "6.1.0-edge.0",
36
+ "@memberjunction/ai-bridge-server": "6.1.0-edge.0",
37
+ "@memberjunction/ai-bridge-teams": "6.1.0-edge.0",
38
+ "@memberjunction/ai-bridge-twilio": "6.1.0-edge.0",
39
+ "@memberjunction/ai-bridge-vonage": "6.1.0-edge.0",
40
+ "@memberjunction/ai-core-plus": "6.1.0-edge.0",
41
+ "@memberjunction/ai-engine-base": "6.1.0-edge.0",
42
+ "@memberjunction/ai-mcp-client": "6.1.0-edge.0",
43
+ "@memberjunction/ai-prompts": "6.1.0-edge.0",
44
+ "@memberjunction/ai-provider-bundle": "6.1.0-edge.0",
45
+ "@memberjunction/ai-vector-sync": "6.1.0-edge.0",
46
+ "@memberjunction/ai-vectordb": "6.1.0-edge.0",
47
+ "@memberjunction/ai-vectors-pinecone": "6.1.0-edge.0",
48
+ "@memberjunction/aiengine": "6.1.0-edge.0",
49
+ "@memberjunction/api-keys": "6.1.0-edge.0",
50
+ "@memberjunction/auth-providers": "6.1.0-edge.0",
51
+ "@memberjunction/clustering-engine": "6.1.0-edge.0",
52
+ "@memberjunction/codegen-lib": "6.1.0-edge.0",
53
+ "@memberjunction/communication-engine": "6.1.0-edge.0",
54
+ "@memberjunction/communication-ms-graph": "6.1.0-edge.0",
55
+ "@memberjunction/communication-sendgrid": "6.1.0-edge.0",
56
+ "@memberjunction/communication-types": "6.1.0-edge.0",
57
+ "@memberjunction/component-registry-client-sdk": "6.1.0-edge.0",
58
+ "@memberjunction/computer-use": "6.1.0-edge.0",
59
+ "@memberjunction/computer-use-engine": "6.1.0-edge.0",
60
+ "@memberjunction/config": "6.1.0-edge.0",
61
+ "@memberjunction/core": "6.1.0-edge.0",
62
+ "@memberjunction/core-actions": "6.1.0-edge.0",
63
+ "@memberjunction/core-entities": "6.1.0-edge.0",
64
+ "@memberjunction/core-entities-server": "6.1.0-edge.0",
65
+ "@memberjunction/credentials": "6.1.0-edge.0",
66
+ "@memberjunction/data-context": "6.1.0-edge.0",
67
+ "@memberjunction/data-context-server": "6.1.0-edge.0",
68
+ "@memberjunction/doc-utils": "6.1.0-edge.0",
69
+ "@memberjunction/encryption": "6.1.0-edge.0",
70
+ "@memberjunction/entity-communications-base": "6.1.0-edge.0",
71
+ "@memberjunction/entity-communications-server": "6.1.0-edge.0",
72
+ "@memberjunction/esignature": "6.1.0-edge.0",
73
+ "@memberjunction/external-change-detection": "6.1.0-edge.0",
74
+ "@memberjunction/generic-database-provider": "6.1.0-edge.0",
75
+ "@memberjunction/global": "6.1.0-edge.0",
76
+ "@memberjunction/graphql-dataprovider": "6.1.0-edge.0",
77
+ "@memberjunction/integration-engine": "6.1.0-edge.0",
78
+ "@memberjunction/integration-engine-base": "6.1.0-edge.0",
79
+ "@memberjunction/integration-progress-artifacts": "6.1.0-edge.0",
80
+ "@memberjunction/integration-schema-builder": "6.1.0-edge.0",
81
+ "@memberjunction/interactive-component-types": "6.1.0-edge.0",
82
+ "@memberjunction/lists": "6.1.0-edge.0",
83
+ "@memberjunction/lists-base": "6.1.0-edge.0",
84
+ "@memberjunction/livekit-room-server": "6.1.0-edge.0",
85
+ "@memberjunction/notifications": "6.1.0-edge.0",
86
+ "@memberjunction/postgresql-dataprovider": "6.1.0-edge.0",
87
+ "@memberjunction/queue": "6.1.0-edge.0",
88
+ "@memberjunction/record-comparison": "6.1.0-edge.0",
89
+ "@memberjunction/redis-provider": "6.1.0-edge.0",
90
+ "@memberjunction/remote-browser-base": "6.1.0-edge.0",
91
+ "@memberjunction/remote-browser-cdp": "6.1.0-edge.0",
92
+ "@memberjunction/remote-browser-selfhost": "6.1.0-edge.0",
93
+ "@memberjunction/remote-browser-server": "6.1.0-edge.0",
94
+ "@memberjunction/scheduling-actions": "6.1.0-edge.0",
95
+ "@memberjunction/scheduling-base-types": "6.1.0-edge.0",
96
+ "@memberjunction/scheduling-engine": "6.1.0-edge.0",
97
+ "@memberjunction/scheduling-engine-base": "6.1.0-edge.0",
98
+ "@memberjunction/schema-engine": "6.1.0-edge.0",
99
+ "@memberjunction/search-engine": "6.1.0-edge.0",
100
+ "@memberjunction/server-extensions-core": "6.1.0-edge.0",
101
+ "@memberjunction/sql-dialect": "6.1.0-edge.0",
102
+ "@memberjunction/sqlserver-dataprovider": "6.1.0-edge.0",
103
+ "@memberjunction/storage": "6.1.0-edge.0",
104
+ "@memberjunction/tag-engine": "6.1.0-edge.0",
105
+ "@memberjunction/tag-engine-base": "6.1.0-edge.0",
106
+ "@memberjunction/templates": "6.1.0-edge.0",
107
+ "@memberjunction/testing-engine": "6.1.0-edge.0",
108
+ "@memberjunction/testing-engine-base": "6.1.0-edge.0",
109
+ "@memberjunction/version-history": "6.1.0-edge.0",
118
110
  "@octokit/auth-app": "^7.1.5",
119
111
  "@octokit/rest": "^21.1.1",
120
112
  "@types/compression": "^1.8.1",
@@ -154,7 +146,7 @@
154
146
  "zod": "^3.25.0"
155
147
  },
156
148
  "devDependencies": {
157
- "@types/express": "^4.17.25",
149
+ "@types/express": "^5.0.6",
158
150
  "pkgroll": "2.23.0",
159
151
  "typescript": "^5.9.3",
160
152
  "vitest": "^3.1.1"
@@ -162,5 +154,13 @@
162
154
  "repository": {
163
155
  "type": "git",
164
156
  "url": "https://github.com/MemberJunction/MJ"
157
+ },
158
+ "scripts": {
159
+ "build": "tsc && tsc-alias -f",
160
+ "bundle": "tsc -noEmit && pkgroll --sourcemap --minify",
161
+ "watch": "tsc -w",
162
+ "test": "vitest run",
163
+ "test:watch": "vitest",
164
+ "test:coverage": "vitest run --coverage"
165
165
  }
166
- }
166
+ }
@@ -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);