@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.
Files changed (220) hide show
  1. package/README.md +30 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/config.d.ts +2189 -71
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +123 -3
  6. package/dist/config.js.map +1 -1
  7. package/dist/context.d.ts.map +1 -1
  8. package/dist/context.js +11 -23
  9. package/dist/context.js.map +1 -1
  10. package/dist/generated/graphql-schemas/__mj.d.ts +2143 -205
  11. package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
  12. package/dist/generated/graphql-schemas/__mj.js +24441 -14433
  13. package/dist/generated/graphql-schemas/__mj.js.map +1 -1
  14. package/dist/generic/FireAndForgetHeartbeat.d.ts +15 -1
  15. package/dist/generic/FireAndForgetHeartbeat.d.ts.map +1 -1
  16. package/dist/generic/FireAndForgetHeartbeat.js +16 -2
  17. package/dist/generic/FireAndForgetHeartbeat.js.map +1 -1
  18. package/dist/generic/OrphanedConversationDetailReconciler.d.ts +31 -0
  19. package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -0
  20. package/dist/generic/OrphanedConversationDetailReconciler.js +215 -0
  21. package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -0
  22. package/dist/generic/PushStatusResolver.d.ts +38 -0
  23. package/dist/generic/PushStatusResolver.d.ts.map +1 -1
  24. package/dist/generic/PushStatusResolver.js +84 -1
  25. package/dist/generic/PushStatusResolver.js.map +1 -1
  26. package/dist/generic/ResolverBase.d.ts +56 -4
  27. package/dist/generic/ResolverBase.d.ts.map +1 -1
  28. package/dist/generic/ResolverBase.js +191 -74
  29. package/dist/generic/ResolverBase.js.map +1 -1
  30. package/dist/generic/RunViewResolver.d.ts +4 -0
  31. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  32. package/dist/generic/RunViewResolver.js +33 -1
  33. package/dist/generic/RunViewResolver.js.map +1 -1
  34. package/dist/index.d.ts +4 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +204 -50
  37. package/dist/index.js.map +1 -1
  38. package/dist/postgresqlCompat.d.ts +8 -0
  39. package/dist/postgresqlCompat.d.ts.map +1 -0
  40. package/dist/postgresqlCompat.js +19 -0
  41. package/dist/postgresqlCompat.js.map +1 -0
  42. package/dist/postgresqlPoolSettings.d.ts +108 -0
  43. package/dist/postgresqlPoolSettings.d.ts.map +1 -0
  44. package/dist/postgresqlPoolSettings.js +134 -0
  45. package/dist/postgresqlPoolSettings.js.map +1 -0
  46. package/dist/resolvers/AdhocQueryResolver.d.ts +23 -18
  47. package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
  48. package/dist/resolvers/AdhocQueryResolver.js +77 -167
  49. package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
  50. package/dist/resolvers/AgentRunStatusPublisher.d.ts +55 -0
  51. package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -0
  52. package/dist/resolvers/AgentRunStatusPublisher.js +141 -0
  53. package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -0
  54. package/dist/resolvers/ConversationRunEventsResolver.d.ts +90 -0
  55. package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -0
  56. package/dist/resolvers/ConversationRunEventsResolver.js +283 -0
  57. package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -0
  58. package/dist/resolvers/DuplicateEntryCheckResolver.d.ts +98 -0
  59. package/dist/resolvers/DuplicateEntryCheckResolver.d.ts.map +1 -0
  60. package/dist/resolvers/DuplicateEntryCheckResolver.js +227 -0
  61. package/dist/resolvers/DuplicateEntryCheckResolver.js.map +1 -0
  62. package/dist/resolvers/EntityRecordNameResolver.d.ts +7 -23
  63. package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
  64. package/dist/resolvers/EntityRecordNameResolver.js +9 -47
  65. package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
  66. package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
  67. package/dist/resolvers/FetchEntityVectorsResolver.js +2 -1
  68. package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
  69. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  70. package/dist/resolvers/GetDataResolver.js +9 -0
  71. package/dist/resolvers/GetDataResolver.js.map +1 -1
  72. package/dist/resolvers/HumanHandoffResolver.d.ts +107 -0
  73. package/dist/resolvers/HumanHandoffResolver.d.ts.map +1 -0
  74. package/dist/resolvers/HumanHandoffResolver.js +324 -0
  75. package/dist/resolvers/HumanHandoffResolver.js.map +1 -0
  76. package/dist/resolvers/MeetingResolver.d.ts +69 -0
  77. package/dist/resolvers/MeetingResolver.d.ts.map +1 -0
  78. package/dist/resolvers/MeetingResolver.js +381 -0
  79. package/dist/resolvers/MeetingResolver.js.map +1 -0
  80. package/dist/resolvers/MergeRecordsResolver.d.ts +7 -0
  81. package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
  82. package/dist/resolvers/MergeRecordsResolver.js +16 -2
  83. package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
  84. package/dist/resolvers/RealtimeBridgeResolver.d.ts +34 -1
  85. package/dist/resolvers/RealtimeBridgeResolver.d.ts.map +1 -1
  86. package/dist/resolvers/RealtimeBridgeResolver.js +202 -7
  87. package/dist/resolvers/RealtimeBridgeResolver.js.map +1 -1
  88. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +45 -89
  89. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
  90. package/dist/resolvers/RealtimeClientSessionResolver.js +94 -240
  91. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
  92. package/dist/resolvers/RunAIAgentResolver.d.ts +0 -16
  93. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  94. package/dist/resolvers/RunAIAgentResolver.js +23 -153
  95. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  96. package/dist/resolvers/RunDecisionResolver.d.ts +149 -0
  97. package/dist/resolvers/RunDecisionResolver.d.ts.map +1 -0
  98. package/dist/resolvers/RunDecisionResolver.js +396 -0
  99. package/dist/resolvers/RunDecisionResolver.js.map +1 -0
  100. package/dist/resolvers/VectorizeEntityResolver.d.ts +1 -1
  101. package/dist/resolvers/VectorizeEntityResolver.d.ts.map +1 -1
  102. package/dist/resolvers/VectorizeEntityResolver.js +14 -10
  103. package/dist/resolvers/VectorizeEntityResolver.js.map +1 -1
  104. package/dist/resolvers/adhocTimeout.d.ts +7 -0
  105. package/dist/resolvers/adhocTimeout.d.ts.map +1 -0
  106. package/dist/resolvers/adhocTimeout.js +12 -0
  107. package/dist/resolvers/adhocTimeout.js.map +1 -0
  108. package/dist/resolvers/meetings/index.d.ts +5 -0
  109. package/dist/resolvers/meetings/index.d.ts.map +1 -0
  110. package/dist/resolvers/meetings/index.js +5 -0
  111. package/dist/resolvers/meetings/index.js.map +1 -0
  112. package/dist/resolvers/meetings/meetingHelpers.d.ts +17 -0
  113. package/dist/resolvers/meetings/meetingHelpers.d.ts.map +1 -0
  114. package/dist/resolvers/meetings/meetingHelpers.js +212 -0
  115. package/dist/resolvers/meetings/meetingHelpers.js.map +1 -0
  116. package/dist/resolvers/meetings/meetingMutations.d.ts +12 -0
  117. package/dist/resolvers/meetings/meetingMutations.d.ts.map +1 -0
  118. package/dist/resolvers/meetings/meetingMutations.js +418 -0
  119. package/dist/resolvers/meetings/meetingMutations.js.map +1 -0
  120. package/dist/resolvers/meetings/meetingQueries.d.ts +7 -0
  121. package/dist/resolvers/meetings/meetingQueries.d.ts.map +1 -0
  122. package/dist/resolvers/meetings/meetingQueries.js +113 -0
  123. package/dist/resolvers/meetings/meetingQueries.js.map +1 -0
  124. package/dist/resolvers/meetings/meetingTypes.d.ts +89 -0
  125. package/dist/resolvers/meetings/meetingTypes.d.ts.map +1 -0
  126. package/dist/resolvers/meetings/meetingTypes.js +345 -0
  127. package/dist/resolvers/meetings/meetingTypes.js.map +1 -0
  128. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  129. package/dist/rest/ViewOperationsHandler.js +8 -5
  130. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  131. package/dist/services/TaskGraphActionRunner.d.ts +8 -0
  132. package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
  133. package/dist/services/TaskGraphActionRunner.js +27 -1
  134. package/dist/services/TaskGraphActionRunner.js.map +1 -1
  135. package/dist/services/WorkQueueHostService.d.ts +36 -0
  136. package/dist/services/WorkQueueHostService.d.ts.map +1 -0
  137. package/dist/services/WorkQueueHostService.js +97 -0
  138. package/dist/services/WorkQueueHostService.js.map +1 -0
  139. package/dist/services/workQueueConfig.d.ts +103 -0
  140. package/dist/services/workQueueConfig.d.ts.map +1 -0
  141. package/dist/services/workQueueConfig.js +48 -0
  142. package/dist/services/workQueueConfig.js.map +1 -0
  143. package/dist/types.d.ts +5 -0
  144. package/dist/types.d.ts.map +1 -1
  145. package/dist/types.js.map +1 -1
  146. package/package.json +95 -92
  147. package/src/__tests__/AdhocQueryResolver.bugs.test.ts +14 -35
  148. package/src/__tests__/AdhocQueryResolver.pagination.test.ts +6 -2
  149. package/src/__tests__/AdhocQueryResolver.scopeGuard.test.ts +3 -3
  150. package/src/__tests__/AgentRunStatusPublisher.test.ts +175 -0
  151. package/src/__tests__/DuplicateEntryCheckResolver.test.ts +300 -0
  152. package/src/__tests__/EntityRecordNameResolver.fieldSecurity.test.ts +27 -72
  153. package/src/__tests__/HumanHandoffResolver.test.ts +233 -0
  154. package/src/__tests__/MeetingResolver.test.ts +374 -0
  155. package/src/__tests__/RealtimeBridgeResolver.test.ts +240 -2
  156. package/src/__tests__/RealtimeClientSessionResolver.test.ts +216 -2
  157. package/src/__tests__/RemoteBrowserActionRecovery.test.ts +7 -1
  158. package/src/__tests__/RemoteBrowserAudioStream.test.ts +7 -1
  159. package/src/__tests__/RemoteBrowserSnapshot.test.ts +7 -1
  160. package/src/__tests__/ResolverBase.adhocReadScope.test.ts +96 -0
  161. package/src/__tests__/ResolverBase.clientOldValues.test.ts +52 -0
  162. package/src/__tests__/ResolverBase.filterEscaping.test.ts +21 -2
  163. package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +291 -0
  164. package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +182 -12
  165. package/src/__tests__/RunAIAgentResolver.streaming.test.ts +18 -27
  166. package/src/__tests__/RunDecisionResolver.test.ts +699 -0
  167. package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +43 -0
  168. package/src/__tests__/VectorizeEntityResolver.test.ts +106 -0
  169. package/src/__tests__/WorkQueueHostService.test.ts +133 -0
  170. package/src/__tests__/adhocTimeoutClamp.test.ts +26 -0
  171. package/src/__tests__/conversationRunEvents.test.ts +399 -0
  172. package/src/__tests__/orphanedConversationDetailReconciler.test.ts +283 -0
  173. package/src/__tests__/postgresqlPoolSettings.test.ts +131 -0
  174. package/src/__tests__/pushStatusFanOut.test.ts +206 -0
  175. package/src/__tests__/translateBracketsToPG.test.ts +20 -0
  176. package/src/auth/__tests__/backward-compatibility.test.ts +1 -0
  177. package/src/config.ts +130 -3
  178. package/src/context.ts +11 -24
  179. package/src/generated/graphql-schemas/__mj.ts +24183 -17182
  180. package/src/generic/FireAndForgetHeartbeat.ts +16 -2
  181. package/src/generic/OrphanedConversationDetailReconciler.ts +267 -0
  182. package/src/generic/PushStatusResolver.ts +97 -1
  183. package/src/generic/ResolverBase.ts +220 -76
  184. package/src/generic/RunViewResolver.ts +33 -2
  185. package/src/index.ts +228 -51
  186. package/src/postgresqlCompat.ts +21 -0
  187. package/src/postgresqlPoolSettings.ts +213 -0
  188. package/src/resolvers/AdhocQueryResolver.ts +88 -188
  189. package/src/resolvers/AgentRunStatusPublisher.ts +175 -0
  190. package/src/resolvers/ConversationRunEventsResolver.ts +308 -0
  191. package/src/resolvers/DuplicateEntryCheckResolver.ts +232 -0
  192. package/src/resolvers/EntityRecordNameResolver.ts +9 -51
  193. package/src/resolvers/FetchEntityVectorsResolver.ts +2 -1
  194. package/src/resolvers/GetDataResolver.ts +10 -0
  195. package/src/resolvers/HumanHandoffResolver.ts +304 -0
  196. package/src/resolvers/MeetingResolver.ts +438 -0
  197. package/src/resolvers/MergeRecordsResolver.ts +14 -2
  198. package/src/resolvers/RealtimeBridgeResolver.ts +227 -13
  199. package/src/resolvers/RealtimeClientSessionResolver.ts +99 -287
  200. package/src/resolvers/RunAIAgentResolver.ts +28 -174
  201. package/src/resolvers/RunDecisionResolver.ts +435 -0
  202. package/src/resolvers/VectorizeEntityResolver.ts +16 -11
  203. package/src/resolvers/__tests__/MergeRecordsResolver.test.ts +93 -0
  204. package/src/resolvers/adhocTimeout.ts +12 -0
  205. package/src/resolvers/meetings/index.ts +4 -0
  206. package/src/resolvers/meetings/meetingHelpers.ts +307 -0
  207. package/src/resolvers/meetings/meetingMutations.ts +535 -0
  208. package/src/resolvers/meetings/meetingQueries.ts +172 -0
  209. package/src/resolvers/meetings/meetingTypes.ts +238 -0
  210. package/src/rest/ViewOperationsHandler.ts +8 -5
  211. package/src/services/TaskGraphActionRunner.ts +29 -1
  212. package/src/services/WorkQueueHostService.ts +129 -0
  213. package/src/services/workQueueConfig.ts +52 -0
  214. package/src/types.ts +5 -0
  215. package/dist/resolvers/adhoc-query-helpers.d.ts +0 -33
  216. package/dist/resolvers/adhoc-query-helpers.d.ts.map +0 -1
  217. package/dist/resolvers/adhoc-query-helpers.js +0 -50
  218. package/dist/resolvers/adhoc-query-helpers.js.map +0 -1
  219. package/src/__tests__/adhoc-query-helpers.test.ts +0 -50
  220. package/src/resolvers/adhoc-query-helpers.ts +0 -67
@@ -0,0 +1,396 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ var RunDecisionResolver_1;
14
+ import { Resolver, Mutation, Arg, Ctx, ObjectType, Field, Int } from 'type-graphql';
15
+ import { LogError, LogStatus } from '@memberjunction/core';
16
+ import { UUIDsEqual } from '@memberjunction/global';
17
+ import { AIDecisionRunner, AIDecisionParams, ParseDecisionQuestions } from '@memberjunction/ai-prompts';
18
+ import { AIEngine } from '@memberjunction/aiengine';
19
+ import { ResolverBase } from '../generic/ResolverBase.js';
20
+ import { IsScopeLimitedPrincipal } from '../auth/scopeLimitedPrincipal.js';
21
+ /**
22
+ * The result of the `RunDecision` mutation. Every failure, an authorization denial included, comes
23
+ * back as `success: false` with an `errorMessage`: the mutation never throws to the client.
24
+ */
25
+ let DecisionRunResult = class DecisionRunResult {
26
+ };
27
+ __decorate([
28
+ Field(),
29
+ __metadata("design:type", Boolean)
30
+ ], DecisionRunResult.prototype, "success", void 0);
31
+ __decorate([
32
+ Field({ nullable: true }),
33
+ __metadata("design:type", String)
34
+ ], DecisionRunResult.prototype, "errorMessage", void 0);
35
+ __decorate([
36
+ Field({ nullable: true }),
37
+ __metadata("design:type", String)
38
+ ], DecisionRunResult.prototype, "answersJSON", void 0);
39
+ __decorate([
40
+ Field({ nullable: true }),
41
+ __metadata("design:type", String)
42
+ ], DecisionRunResult.prototype, "promptRunId", void 0);
43
+ __decorate([
44
+ Field({ nullable: true }),
45
+ __metadata("design:type", String)
46
+ ], DecisionRunResult.prototype, "modelName", void 0);
47
+ __decorate([
48
+ Field({ nullable: true }),
49
+ __metadata("design:type", String)
50
+ ], DecisionRunResult.prototype, "resolvedModel", void 0);
51
+ __decorate([
52
+ Field({ nullable: true }),
53
+ __metadata("design:type", Number)
54
+ ], DecisionRunResult.prototype, "executionTimeMs", void 0);
55
+ DecisionRunResult = __decorate([
56
+ ObjectType()
57
+ ], DecisionRunResult);
58
+ export { DecisionRunResult };
59
+ /**
60
+ * Runs typed decisions (Likelihood, Choice, Score) for clients in one round trip, through
61
+ * `AIDecisionRunner`. It is the direct path for latency-sensitive browser callers: the `Run Decision`
62
+ * action does the same work with action-execution overhead on top.
63
+ *
64
+ * The request path adds no entity load: the prompt comes from `AIEngine`'s cache.
65
+ */
66
+ let RunDecisionResolver = class RunDecisionResolver extends ResolverBase {
67
+ static { RunDecisionResolver_1 = this; }
68
+ /** The prompt used when the caller names none, as for the `Run Decision` action. */
69
+ static { this.DEFAULT_PROMPT_NAME = 'Default Decision'; }
70
+ // Server-side bounds on a request. They are cheap backstops, checked before the model is
71
+ // called. Each decision model's own declared limits are the runner's to check.
72
+ /**
73
+ * The most characters the state may have: about 32,000 tokens at four characters a token, which
74
+ * is Jev's declared input limit. Checked before the state is parsed.
75
+ */
76
+ static { this.MAX_STATE_CHARACTERS = 128_000; }
77
+ /** The most characters the questions' JSON may have. Checked before it is parsed. */
78
+ static { this.MAX_QUESTIONS_CHARACTERS = 128_000; }
79
+ /** The most questions one request may carry. */
80
+ static { this.MAX_QUESTIONS = 32; }
81
+ /**
82
+ * The most options a Choice question, or levels a Score question, may list: Jev's declared
83
+ * `MaxChoiceOptions`.
84
+ */
85
+ static { this.MAX_OPTIONS_PER_QUESTION = 255; }
86
+ /** The model-call timeout used when the caller sends none, or one that is not positive. */
87
+ static { this.DEFAULT_TIMEOUT_MS = 30_000; }
88
+ /** The longest model-call timeout a caller may ask for. A longer one is cut to it. */
89
+ static { this.MAX_TIMEOUT_MS = 120_000; }
90
+ /**
91
+ * Answers typed questions about a state with a Decision-typed prompt.
92
+ *
93
+ * Authorization is `RunAIPrompt`'s: the API-key `prompt:execute` scope check, before any other
94
+ * work (a session without an API key skips it). As `RunAIPrompt` and `RunAIAgent` do, it checks
95
+ * the ID of the prompt that will run, whether the caller named it by ID or by name, so a rule on
96
+ * a prompt's ID holds on both. A denial is returned as `success: false`, not thrown.
97
+ *
98
+ * Scope-limited sessions (magic-link guests and resource-scoped sessions) are refused. The
99
+ * prompt is read from `AIEngine`'s cache, around entity permissions and row-level security, so
100
+ * the confinement those sessions rely on would not apply here. For the same reason, a prompt
101
+ * that cannot run gets one neutral message, whatever the reason, that names nothing the caller
102
+ * did not send.
103
+ *
104
+ * @param state The state the questions are about: text, or the JSON text of an object.
105
+ * @param questions The `DecisionQuestion` map by question key, as JSON: the shape `Run Decision` accepts.
106
+ * @param promptId The decision prompt's ID. Takes precedence over `promptName`.
107
+ * @param promptName The decision prompt's name, matched case-insensitively. Defaults to `Default Decision`.
108
+ * @param timeoutMS Bounds each model call, as the runner's `timeoutMS`. Unset or not positive, it is
109
+ * `DEFAULT_TIMEOUT_MS`; above `MAX_TIMEOUT_MS`, it is cut to it. A call is never unbounded.
110
+ */
111
+ async RunDecision(state, questions, { userPayload }, promptId, promptName, timeoutMS) {
112
+ const startTime = Date.now();
113
+ try {
114
+ const request = { State: state, Questions: questions, PromptID: promptId, PromptName: promptName, TimeoutMS: timeoutMS };
115
+ return await this.runDecision(request, userPayload, startTime);
116
+ }
117
+ catch (error) {
118
+ const message = error instanceof Error ? error.message : String(error);
119
+ LogError(`RunDecision failed: ${message}`, undefined, error);
120
+ return this.failure(message || 'Unknown error occurred', startTime);
121
+ }
122
+ }
123
+ /** Authorizes, validates, resolves the prompt, and runs the decision. Throws only on unexpected errors. */
124
+ async runDecision(request, userPayload, startTime) {
125
+ const reference = this.promptReference(request);
126
+ const authorized = await this.authorizePrompt(reference, userPayload);
127
+ const currentUser = this.GetUserFromPayload(userPayload);
128
+ if (!currentUser) {
129
+ return this.failure('Unable to determine current user', startTime);
130
+ }
131
+ // A scope-limited session is confined only by entity permissions and RLS, and the prompt comes
132
+ // from the cache, around both. There is no narrower read to fall back to, so it is refused.
133
+ if (IsScopeLimitedPrincipal(currentUser)) {
134
+ return this.failure('RunDecision is not permitted for scope-limited sessions', startTime);
135
+ }
136
+ const inputs = this.validateInputs(request);
137
+ if ('Error' in inputs) {
138
+ return this.failure(inputs.Error, startTime);
139
+ }
140
+ const runner = new AIDecisionRunner();
141
+ const prompt = await this.resolvePrompt(authorized, reference, runner, currentUser, userPayload);
142
+ if (typeof prompt === 'string') {
143
+ return this.failure(prompt, startTime);
144
+ }
145
+ const result = await runner.ExecuteDecision(this.buildDecisionParams(prompt, inputs, currentUser));
146
+ return this.mapRunResult(result, prompt, startTime);
147
+ }
148
+ /** The prompt the request names: its ID when given, otherwise its name, otherwise the default. */
149
+ promptReference(request) {
150
+ const id = request.PromptID?.trim();
151
+ if (id) {
152
+ return { By: 'ID', Value: id };
153
+ }
154
+ const name = request.PromptName?.trim();
155
+ return { By: 'Name', Value: name || RunDecisionResolver_1.DEFAULT_PROMPT_NAME };
156
+ }
157
+ /**
158
+ * The API-key `prompt:execute` scope check, made before any other work. The prompt is looked up
159
+ * in `AIEngine`'s cache as it stands, with nothing loaded or logged, and the check is made against
160
+ * its ID. A prompt that is not there is checked against the value the caller sent, so a denied
161
+ * caller learns nothing about which prompts exist: that it was not found is reported only after
162
+ * the check passes.
163
+ *
164
+ * @returns The prompt found, which was authorized by its ID, or undefined when none was found.
165
+ */
166
+ async authorizePrompt(reference, userPayload) {
167
+ const cached = this.findCachedPrompt(reference);
168
+ await this.CheckAPIKeyScopeAuthorization('prompt:execute', cached?.ID ?? reference.Value, userPayload);
169
+ return cached;
170
+ }
171
+ /**
172
+ * Looks the prompt up in the cache without loading it. A cache that cannot be read counts as not
173
+ * found here, so the error surfaces only after authorization, when the lookup is made again.
174
+ */
175
+ findCachedPrompt(reference) {
176
+ try {
177
+ return this.findPrompt(reference);
178
+ }
179
+ catch {
180
+ return undefined;
181
+ }
182
+ }
183
+ /**
184
+ * Validates the state and the questions and bounds their size, or returns the first problem
185
+ * found. Settles the model-call timeout too.
186
+ */
187
+ validateInputs(request) {
188
+ const tooLong = this.checkInputLengths(request);
189
+ if (tooLong) {
190
+ return { Error: tooLong };
191
+ }
192
+ const state = this.parseState(request.State);
193
+ if ('Error' in state) {
194
+ return state;
195
+ }
196
+ const questions = ParseDecisionQuestions(request.Questions);
197
+ if (!questions.Valid) {
198
+ return { Error: questions.Message };
199
+ }
200
+ const tooMany = this.checkQuestionCounts(questions.Questions);
201
+ if (tooMany) {
202
+ return { Error: tooMany };
203
+ }
204
+ return { State: state.State, Questions: questions.Questions, TimeoutMS: this.effectiveTimeoutMS(request.TimeoutMS) };
205
+ }
206
+ /** Refuses a state or questions text over its character limit, before either is parsed. */
207
+ checkInputLengths(request) {
208
+ const stateLength = typeof request.State === 'string' ? request.State.length : 0;
209
+ if (stateLength > RunDecisionResolver_1.MAX_STATE_CHARACTERS) {
210
+ return `State has ${stateLength} characters, over the limit of ${RunDecisionResolver_1.MAX_STATE_CHARACTERS}`;
211
+ }
212
+ const questionsLength = typeof request.Questions === 'string' ? request.Questions.length : 0;
213
+ if (questionsLength > RunDecisionResolver_1.MAX_QUESTIONS_CHARACTERS) {
214
+ return `Questions JSON has ${questionsLength} characters, over the limit of ${RunDecisionResolver_1.MAX_QUESTIONS_CHARACTERS}`;
215
+ }
216
+ return undefined;
217
+ }
218
+ /** Refuses more questions than one request may carry, or more options or levels than one question may list. */
219
+ checkQuestionCounts(questions) {
220
+ const questionCount = Object.keys(questions).length;
221
+ if (questionCount > RunDecisionResolver_1.MAX_QUESTIONS) {
222
+ return `${questionCount} questions exceed the limit of ${RunDecisionResolver_1.MAX_QUESTIONS} per request`;
223
+ }
224
+ const maxOptions = RunDecisionResolver_1.MAX_OPTIONS_PER_QUESTION;
225
+ for (const [key, question] of Object.entries(questions)) {
226
+ if (question.Kind === 'Choice' && question.Options.length > maxOptions) {
227
+ return `Choice '${key}' has ${question.Options.length} options, over the limit of ${maxOptions}`;
228
+ }
229
+ if (question.Kind === 'Score' && question.Levels.length > maxOptions) {
230
+ return `Score '${key}' has ${question.Levels.length} levels, over the limit of ${maxOptions}`;
231
+ }
232
+ }
233
+ return undefined;
234
+ }
235
+ /**
236
+ * The caller's timeout, cut to `MAX_TIMEOUT_MS`, or `DEFAULT_TIMEOUT_MS` when it sent none or one
237
+ * that is not positive.
238
+ */
239
+ effectiveTimeoutMS(requested) {
240
+ if (requested == null || !(requested > 0)) {
241
+ return RunDecisionResolver_1.DEFAULT_TIMEOUT_MS;
242
+ }
243
+ return Math.min(requested, RunDecisionResolver_1.MAX_TIMEOUT_MS);
244
+ }
245
+ /**
246
+ * Reads the state: the object, when the text is the JSON of a non-empty object, otherwise the text
247
+ * itself. Empty text and an empty object are refused, as the `Run Decision` action refuses them.
248
+ */
249
+ parseState(state) {
250
+ const trimmed = typeof state === 'string' ? state.trim() : '';
251
+ if (trimmed.length === 0) {
252
+ return { Error: 'State is required and cannot be empty' };
253
+ }
254
+ const parsed = this.parseJSONObject(trimmed);
255
+ if (!parsed) {
256
+ return { State: trimmed };
257
+ }
258
+ return Object.keys(parsed).length > 0 ? { State: parsed } : { Error: 'State object cannot be empty' };
259
+ }
260
+ /** The text parsed as a JSON object, or undefined when it is not the JSON of an object. */
261
+ parseJSONObject(text) {
262
+ if (!text.startsWith('{')) {
263
+ return undefined;
264
+ }
265
+ try {
266
+ const parsed = JSON.parse(text);
267
+ return this.isPlainObject(parsed) ? parsed : undefined;
268
+ }
269
+ catch {
270
+ return undefined;
271
+ }
272
+ }
273
+ isPlainObject(value) {
274
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
275
+ }
276
+ /**
277
+ * The prompt to run, checked that it can run a decision: that it is Decision-typed and Active.
278
+ * Returns the reason when it cannot.
279
+ *
280
+ * The prompt authorized before is the one used. When there was none, the engine is loaded (a
281
+ * no-op once it is) and the prompt looked up again: one that appears only then is authorized by
282
+ * its ID too, so a request that reaches a cold cache cannot get past a rule on that ID by name.
283
+ */
284
+ async resolvePrompt(authorized, reference, runner, contextUser, userPayload) {
285
+ await AIEngine.Instance.Config(false, contextUser);
286
+ const prompt = authorized ?? (await this.findAndAuthorizeLoadedPrompt(reference, userPayload));
287
+ if (!prompt || !this.canRunDecision(prompt, runner)) {
288
+ return this.unavailablePromptMessage(reference);
289
+ }
290
+ return prompt;
291
+ }
292
+ /**
293
+ * Whether the prompt can run a decision: Decision-typed and Active. When it cannot, the reason,
294
+ * which names the prompt and its status, goes to the server log only.
295
+ */
296
+ canRunDecision(prompt, runner) {
297
+ if (!this.isDecisionPrompt(prompt, runner)) {
298
+ LogStatus(`RunDecision: AI Prompt '${prompt.Name}' (${prompt.ID}) is not a Decision prompt: its AI model type must be '${runner.RequiredModelType}'`);
299
+ return false;
300
+ }
301
+ if (prompt.Status !== 'Active') {
302
+ LogStatus(`RunDecision: AI Prompt '${prompt.Name}' (${prompt.ID}) is not active (Status: ${prompt.Status})`);
303
+ return false;
304
+ }
305
+ return true;
306
+ }
307
+ /**
308
+ * The one message for a prompt that cannot run, whether it is missing, not Decision-typed or not
309
+ * Active. It repeats only what the caller sent: this path reads the cache around entity
310
+ * permissions, so it must not tell a caller the name or status of a prompt it may not read.
311
+ */
312
+ unavailablePromptMessage(reference) {
313
+ const named = reference.By === 'ID' ? `with ID ${reference.Value}` : `'${reference.Value}'`;
314
+ return `AI Prompt ${named} was not found or is not an active Decision prompt`;
315
+ }
316
+ /** Looks the prompt up in the loaded cache, and authorizes it by its ID when it is found. */
317
+ async findAndAuthorizeLoadedPrompt(reference, userPayload) {
318
+ const prompt = this.findPrompt(reference);
319
+ if (prompt) {
320
+ await this.CheckAPIKeyScopeAuthorization('prompt:execute', prompt.ID, userPayload);
321
+ }
322
+ return prompt;
323
+ }
324
+ /** Looks the prompt up by ID, or by name case-insensitively, as the `Run Decision` action does. */
325
+ findPrompt(reference) {
326
+ const prompts = AIEngine.Instance.Prompts;
327
+ if (reference.By === 'ID') {
328
+ return prompts.find(p => UUIDsEqual(p.ID, reference.Value));
329
+ }
330
+ const target = reference.Value.toLowerCase();
331
+ return prompts.find(p => p.Name?.trim().toLowerCase() === target);
332
+ }
333
+ /**
334
+ * Whether the prompt's AI model type is the one `AIDecisionRunner` requires. A prompt with no model
335
+ * type is refused too: the runner would accept it, but nothing marks it as a decision prompt.
336
+ */
337
+ isDecisionPrompt(prompt, runner) {
338
+ if (!prompt.AIModelTypeID) {
339
+ return false;
340
+ }
341
+ const required = runner.RequiredModelType.trim().toLowerCase();
342
+ const decisionType = AIEngine.Instance.ModelTypes.find(mt => mt.Name?.trim().toLowerCase() === required);
343
+ return !!decisionType && UUIDsEqual(prompt.AIModelTypeID, decisionType.ID);
344
+ }
345
+ buildDecisionParams(prompt, inputs, contextUser) {
346
+ const params = new AIDecisionParams();
347
+ params.prompt = prompt;
348
+ params.contextUser = contextUser;
349
+ params.State = inputs.State;
350
+ params.Questions = inputs.Questions;
351
+ params.timeoutMS = inputs.TimeoutMS;
352
+ return params;
353
+ }
354
+ /** Maps the runner's result. The answers are sent only on success, so a caller never acts on partial ones. */
355
+ mapRunResult(result, prompt, startTime) {
356
+ const mapped = {
357
+ success: result.success,
358
+ promptRunId: result.promptRun?.ID,
359
+ modelName: result.modelInfo?.modelName,
360
+ resolvedModel: result.DecisionResult?.ResolvedModel,
361
+ executionTimeMs: Date.now() - startTime,
362
+ };
363
+ if (result.success) {
364
+ mapped.answersJSON = JSON.stringify(result.Answers ?? {});
365
+ }
366
+ else {
367
+ mapped.errorMessage = result.errorMessage || 'Decision execution failed';
368
+ LogError(`RunDecision failed for prompt '${prompt.Name}': ${mapped.errorMessage}`);
369
+ }
370
+ return mapped;
371
+ }
372
+ failure(errorMessage, startTime) {
373
+ return {
374
+ success: false,
375
+ errorMessage,
376
+ executionTimeMs: Date.now() - startTime,
377
+ };
378
+ }
379
+ };
380
+ __decorate([
381
+ Mutation(() => DecisionRunResult),
382
+ __param(0, Arg('state')),
383
+ __param(1, Arg('questions')),
384
+ __param(2, Ctx()),
385
+ __param(3, Arg('promptId', { nullable: true })),
386
+ __param(4, Arg('promptName', { nullable: true })),
387
+ __param(5, Arg('timeoutMS', () => Int, { nullable: true })),
388
+ __metadata("design:type", Function),
389
+ __metadata("design:paramtypes", [String, String, Object, String, String, Number]),
390
+ __metadata("design:returntype", Promise)
391
+ ], RunDecisionResolver.prototype, "RunDecision", null);
392
+ RunDecisionResolver = RunDecisionResolver_1 = __decorate([
393
+ Resolver()
394
+ ], RunDecisionResolver);
395
+ export { RunDecisionResolver };
396
+ //# sourceMappingURL=RunDecisionResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunDecisionResolver.js","sourceRoot":"","sources":["../../src/resolvers/RunDecisionResolver.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ export declare class VectorizeEntityResult {
7
7
  PipelineRunID?: string;
8
8
  }
9
9
  export declare class VectorizeEntityResolver extends ResolverBase {
10
- VectorizeEntity(entityDocumentID: string, entityID: string, batchSize?: number, { userPayload }?: AppContext): Promise<VectorizeEntityResult>;
10
+ VectorizeEntity(entityDocumentID: string, entityID: string, batchSize?: number, { userPayload, providers }?: AppContext): Promise<VectorizeEntityResult>;
11
11
  /**
12
12
  * Runs the vectorization pipeline in the background, publishing progress
13
13
  * updates via PubSub so the client can subscribe via PipelineProgress.
@@ -1 +1 @@
1
- {"version":3,"file":"VectorizeEntityResolver.d.ts","sourceRoot":"","sources":["../../src/resolvers/VectorizeEntityResolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAQ1D,qBACa,qBAAqB;IAE9B,OAAO,EAAE,OAAO,CAAC;IAGjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBACa,uBAAwB,SAAQ,YAAY;IAE/C,eAAe,CACQ,gBAAgB,EAAE,MAAM,EAChC,QAAQ,EAAE,MAAM,EACkB,SAAS,CAAC,EAAE,MAAM,EAC9D,EAAE,WAAW,EAAE,GAAE,UAA6B,GACtD,OAAO,CAAC,qBAAqB,CAAC;IA8BjC;;;OAGG;YACW,uBAAuB;IA8CrC;;OAEG;IACH,OAAO,CAAC,eAAe;CAkB1B"}
1
+ {"version":3,"file":"VectorizeEntityResolver.d.ts","sourceRoot":"","sources":["../../src/resolvers/VectorizeEntityResolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAS1D,qBACa,qBAAqB;IAE9B,OAAO,EAAE,OAAO,CAAC;IAGjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBACa,uBAAwB,SAAQ,YAAY;IAE/C,eAAe,CACsB,gBAAgB,EAAE,MAAM,EAChC,QAAQ,EAAE,MAAM,EACI,SAAS,CAAC,EAAE,MAAM,EAC9D,EAAE,WAAW,EAAE,SAAS,EAAE,GAAE,UAA6B,GACjE,OAAO,CAAC,qBAAqB,CAAC;IAiCjC;;;OAGG;YACW,uBAAuB;IA+CrC;;OAEG;IACH,OAAO,CAAC,eAAe;CAkB1B"}
@@ -16,23 +16,24 @@ import { ResolverBase } from '../generic/ResolverBase.js';
16
16
  import { EntityVectorSyncer } from '@memberjunction/ai-vector-sync';
17
17
  import { PubSubManager } from '../generic/PubSubManager.js';
18
18
  import { v4 as uuidv4 } from 'uuid';
19
+ import { GetReadWriteProvider } from '../util.js';
19
20
  const PIPELINE_PROGRESS_TOPIC = 'PIPELINE_PROGRESS';
20
21
  let VectorizeEntityResult = class VectorizeEntityResult {
21
22
  };
22
23
  __decorate([
23
- Field(),
24
+ Field(() => Boolean),
24
25
  __metadata("design:type", Boolean)
25
26
  ], VectorizeEntityResult.prototype, "Success", void 0);
26
27
  __decorate([
27
- Field({ nullable: true }),
28
+ Field(() => String, { nullable: true }),
28
29
  __metadata("design:type", String)
29
30
  ], VectorizeEntityResult.prototype, "Status", void 0);
30
31
  __decorate([
31
- Field({ nullable: true }),
32
+ Field(() => String, { nullable: true }),
32
33
  __metadata("design:type", String)
33
34
  ], VectorizeEntityResult.prototype, "ErrorMessage", void 0);
34
35
  __decorate([
35
- Field({ nullable: true }),
36
+ Field(() => String, { nullable: true }),
36
37
  __metadata("design:type", String)
37
38
  ], VectorizeEntityResult.prototype, "PipelineRunID", void 0);
38
39
  VectorizeEntityResult = __decorate([
@@ -40,17 +41,20 @@ VectorizeEntityResult = __decorate([
40
41
  ], VectorizeEntityResult);
41
42
  export { VectorizeEntityResult };
42
43
  let VectorizeEntityResolver = class VectorizeEntityResolver extends ResolverBase {
43
- async VectorizeEntity(entityDocumentID, entityID, batchSize, { userPayload } = {}) {
44
+ async VectorizeEntity(entityDocumentID, entityID, batchSize, { userPayload, providers } = {}) {
44
45
  try {
45
46
  const currentUser = this.GetUserFromPayload(userPayload);
46
47
  if (!currentUser) {
47
48
  return { Success: false, Status: 'Error', ErrorMessage: 'Unable to determine current user' };
48
49
  }
50
+ // Capture the request's provider before returning, so the background run writes through the
51
+ // same connection the caller used. It is also the colocated vector host (#4910).
52
+ const provider = GetReadWriteProvider(providers, { allowFallbackToReadOnly: true }) ?? undefined;
49
53
  const pipelineRunID = uuidv4();
50
54
  LogStatus(`VectorizeEntity: starting pipeline ${pipelineRunID} for entity document ${entityDocumentID}`);
51
55
  // Fire-and-forget: start the pipeline in the background and return immediately.
52
56
  // Progress is delivered to the client via the PipelineProgress GraphQL subscription.
53
- this.runPipelineInBackground(pipelineRunID, entityDocumentID, entityID, batchSize, currentUser);
57
+ this.runPipelineInBackground(pipelineRunID, entityDocumentID, entityID, batchSize, currentUser, provider);
54
58
  return {
55
59
  Success: true,
56
60
  Status: 'Started',
@@ -71,9 +75,9 @@ let VectorizeEntityResolver = class VectorizeEntityResolver extends ResolverBase
71
75
  * Runs the vectorization pipeline in the background, publishing progress
72
76
  * updates via PubSub so the client can subscribe via PipelineProgress.
73
77
  */
74
- async runPipelineInBackground(pipelineRunID, entityDocumentID, entityID, batchSize, currentUser) {
78
+ async runPipelineInBackground(pipelineRunID, entityDocumentID, entityID, batchSize, currentUser, provider) {
75
79
  try {
76
- const syncer = new EntityVectorSyncer();
80
+ const syncer = new EntityVectorSyncer(provider);
77
81
  await syncer.Config(true, currentUser);
78
82
  const params = {
79
83
  entityDocumentID,
@@ -132,8 +136,8 @@ let VectorizeEntityResolver = class VectorizeEntityResolver extends ResolverBase
132
136
  };
133
137
  __decorate([
134
138
  Mutation(() => VectorizeEntityResult),
135
- __param(0, Arg('entityDocumentID')),
136
- __param(1, Arg('entityID')),
139
+ __param(0, Arg('entityDocumentID', () => String)),
140
+ __param(1, Arg('entityID', () => String)),
137
141
  __param(2, Arg('batchSize', () => Float, { nullable: true })),
138
142
  __param(3, Ctx()),
139
143
  __metadata("design:type", Function),
@@ -1 +1 @@
1
- {"version":3,"file":"VectorizeEntityResolver.js","sourceRoot":"","sources":["../../src/resolvers/VectorizeEntityResolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"VectorizeEntityResolver.js","sourceRoot":"","sources":["../../src/resolvers/VectorizeEntityResolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * The timeout an ad-hoc query runs with: what the caller asked for (or the default), but never
3
+ * longer than the server's `requestTimeout`, so a caller cannot hold a read-only connection longer
4
+ * than any other request may. `requestTimeoutMs` of 0 or less means the server sets no limit.
5
+ */
6
+ export declare function ClampAdhocTimeoutSeconds(requested: number | undefined, requestTimeoutMs: number): number;
7
+ //# sourceMappingURL=adhocTimeout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adhocTimeout.d.ts","sourceRoot":"","sources":["../../src/resolvers/adhocTimeout.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAGxG"}
@@ -0,0 +1,12 @@
1
+ /** The timeout an ad-hoc query gets when the caller names none. */
2
+ const DEFAULT_TIMEOUT_SECONDS = 30;
3
+ /**
4
+ * The timeout an ad-hoc query runs with: what the caller asked for (or the default), but never
5
+ * longer than the server's `requestTimeout`, so a caller cannot hold a read-only connection longer
6
+ * than any other request may. `requestTimeoutMs` of 0 or less means the server sets no limit.
7
+ */
8
+ export function ClampAdhocTimeoutSeconds(requested, requestTimeoutMs) {
9
+ const seconds = requested != null && requested > 0 ? requested : DEFAULT_TIMEOUT_SECONDS;
10
+ return requestTimeoutMs > 0 ? Math.min(seconds, Math.max(1, Math.floor(requestTimeoutMs / 1000))) : seconds;
11
+ }
12
+ //# sourceMappingURL=adhocTimeout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adhocTimeout.js","sourceRoot":"","sources":["../../src/resolvers/adhocTimeout.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAEnC;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,SAA6B,EAAE,gBAAwB;IAC5F,MAAM,OAAO,GAAG,SAAS,IAAI,IAAI,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,uBAAuB,CAAC;IACzF,OAAO,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAChH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './meetingTypes.js';
2
+ export * from './meetingHelpers.js';
3
+ export * from './meetingQueries.js';
4
+ export * from './meetingMutations.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/resolvers/meetings/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './meetingTypes.js';
2
+ export * from './meetingHelpers.js';
3
+ export * from './meetingQueries.js';
4
+ export * from './meetingMutations.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/resolvers/meetings/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { IMetadataProvider, UserInfo } from '@memberjunction/core';
2
+ import type { MJMeetingEntity, MJMeetingParticipantEntity, MJPhoneNumberEntity, MJInteractionEntity, MJInteractionEventEntity } from '@memberjunction/core-entities';
3
+ import { MeetingParticipantType, MeetingType } from './meetingTypes.js';
4
+ export declare function LoadMeetingEntity(id: string, user: UserInfo, provider: IMetadataProvider): Promise<MJMeetingEntity | null>;
5
+ export declare function LoadParticipants(meetingID: string, user: UserInfo, provider: IMetadataProvider): Promise<MeetingParticipantType[]>;
6
+ export declare function IsUserHostOrCoHost(meeting: MJMeetingEntity, user: UserInfo, provider: IMetadataProvider): Promise<boolean>;
7
+ export declare function ResolveDefaultPhoneNumber(user: UserInfo, provider: IMetadataProvider): Promise<MJPhoneNumberEntity | null>;
8
+ export declare function GenerateUniqueDialInCode(phoneNumberID: string, user: UserInfo, provider: IMetadataProvider): Promise<string | undefined>;
9
+ export declare function EnsureMeetingInteraction(meeting: MJMeetingEntity, user: UserInfo, provider: IMetadataProvider): Promise<MJInteractionEntity | null>;
10
+ export declare function RecordInteractionEvent(interactionID: string, eventType: MJInteractionEventEntity['EventType'], user: UserInfo, provider: IMetadataProvider, details?: Record<string, unknown>): Promise<void>;
11
+ export declare function CloseMeetingInteraction(roomName: string, user: UserInfo, provider: IMetadataProvider): Promise<void>;
12
+ export declare function SendMeetingInviteNotification(meeting: MJMeetingEntity, targetUserID: string, contextUser: UserInfo, provider: IMetadataProvider): Promise<void>;
13
+ export declare function NormalizeParticipantRole(roleInput?: string, defaultRole?: MJMeetingParticipantEntity['Role']): MJMeetingParticipantEntity['Role'];
14
+ export declare function NormalizeRecordingPolicy(policyInput?: string): MJMeetingEntity['RecordingPolicy'];
15
+ export declare function MapMeetingToType(m: MJMeetingEntity, participants?: MeetingParticipantType[]): MeetingType;
16
+ export declare function MapParticipantToType(p: MJMeetingParticipantEntity, userNameFallback?: string | null, userEmailFallback?: string | null): MeetingParticipantType;
17
+ //# sourceMappingURL=meetingHelpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meetingHelpers.d.ts","sourceRoot":"","sources":["../../../src/resolvers/meetings/meetingHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EAGjB,QAAQ,EACT,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EACV,eAAe,EACf,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACzB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAExE,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAejC;AAED,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAenC;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,eAAe,EACxB,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAAC,OAAO,CAAC,CAgBlB;AAED,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAerC;AAED,wBAAsB,wBAAwB,CAC5C,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAE7B;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,eAAe,EACxB,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAqCrC;AAED,wBAAsB,sBAAsB,CAC1C,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,wBAAwB,CAAC,WAAW,CAAC,EAChD,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,IAAI,CAAC,CAcf;AAED,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,eAAe,EACxB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,QAAQ,EACrB,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED,wBAAgB,wBAAwB,CACtC,SAAS,CAAC,EAAE,MAAM,EAClB,WAAW,GAAE,0BAA0B,CAAC,MAAM,CAAc,GAC3D,0BAA0B,CAAC,MAAM,CAAC,CAYpC;AAED,wBAAgB,wBAAwB,CACtC,WAAW,CAAC,EAAE,MAAM,GACnB,eAAe,CAAC,iBAAiB,CAAC,CAUpC;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,eAAe,EAAE,YAAY,CAAC,EAAE,sBAAsB,EAAE,GAAG,WAAW,CAuBzG;AAED,wBAAgB,oBAAoB,CAClC,CAAC,EAAE,0BAA0B,EAC7B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,EAChC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,GAChC,sBAAsB,CAiBxB"}